Merge "Fixing fast_scroll_with_fling test to be launched only on devices with rotary" into androidx-main
diff --git a/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/AppSearchImplTest.java b/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/AppSearchImplTest.java
index 3967751..c8ac003 100644
--- a/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/AppSearchImplTest.java
+++ b/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/AppSearchImplTest.java
@@ -53,6 +53,7 @@
import androidx.appsearch.app.SetSchemaResponse;
import androidx.appsearch.app.StorageInfo;
import androidx.appsearch.exceptions.AppSearchException;
+import androidx.appsearch.flags.Flags;
import androidx.appsearch.localstorage.stats.InitializeStats;
import androidx.appsearch.localstorage.stats.OptimizeStats;
import androidx.appsearch.localstorage.util.PrefixUtil;
@@ -64,6 +65,9 @@
import androidx.appsearch.observer.ObserverSpec;
import androidx.appsearch.observer.SchemaChangeInfo;
import androidx.appsearch.testutil.TestObserverCallback;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import androidx.collection.ArrayMap;
import androidx.collection.ArraySet;
import androidx.test.core.app.ApplicationProvider;
@@ -115,6 +119,10 @@
* Always trigger optimize in this class. OptimizeStrategy will be tested in its own test class.
*/
private static final OptimizeStrategy ALWAYS_OPTIMIZE = optimizeInfo -> true;
+
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
@Rule
public TemporaryFolder mTemporaryFolder = new TemporaryFolder();
private File mAppSearchDir;
@@ -2253,6 +2261,7 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
public void testWriteAndReadBlob() throws Exception {
mAppSearchImpl = AppSearchImpl.create(
mAppSearchDir,
@@ -2284,6 +2293,7 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
public void testOpenReadForWrite_notAllowed() throws Exception {
mAppSearchImpl = AppSearchImpl.create(
mAppSearchDir,
@@ -2319,6 +2329,7 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
public void testOpenWriteForRead_allowed() throws Exception {
mAppSearchImpl = AppSearchImpl.create(
mAppSearchDir,
@@ -2341,6 +2352,7 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
public void testOptimizeBlob() throws Exception {
// Create a new AppSearchImpl with lower orphan blob time to live.
mAppSearchImpl.close();
@@ -2384,6 +2396,7 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
public void testOptimizeBlobWithDocument() throws Exception {
// Create a new AppSearchImpl with lower orphan blob time to live.
mAppSearchImpl.close();
@@ -2463,6 +2476,7 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
public void testRevokeFileDescriptor() throws Exception {
mAppSearchImpl = AppSearchImpl.create(
mAppSearchDir,
@@ -2507,6 +2521,8 @@
}
}
+ // Verify the blob handle won't sent request to Icing. So no need to enable
+ // FLAG_ENABLE_BLOB_STORE.
@Test
public void testInvalidBlobHandle() throws Exception {
mAppSearchImpl = AppSearchImpl.create(
diff --git a/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/converter/SchemaToProtoConverterTest.java b/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/converter/SchemaToProtoConverterTest.java
index 59d50a5..41bd101 100644
--- a/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/converter/SchemaToProtoConverterTest.java
+++ b/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/converter/SchemaToProtoConverterTest.java
@@ -554,6 +554,7 @@
.isEqualTo(emailSchema);
}
+ @Test
public void testGetProto_withScorablePropertyEnabled() {
AppSearchSchema emailSchema = new AppSearchSchema.Builder("Email")
.addProperty(new AppSearchSchema.LongPropertyConfig.Builder("viewTimes")
diff --git a/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/converter/SearchResultToProtoConverterTest.java b/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/converter/SearchResultToProtoConverterTest.java
index 2560643..1576821 100644
--- a/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/converter/SearchResultToProtoConverterTest.java
+++ b/appsearch/appsearch-local-storage/src/androidTest/java/androidx/appsearch/localstorage/converter/SearchResultToProtoConverterTest.java
@@ -120,10 +120,18 @@
if (Flags.enableSearchResultParentTypes()) {
assertThat(result.getParentTypeMap()).isEqualTo(
ImmutableMap.of(schemaType, ImmutableList.of(parentSchemaType)));
+// @exportToFramework:startStrip()
+ // TODO(b/371610934): Remove this once GenericDocument#getParentTypes is fully
+ // deprecated.
+ // GenericDocument#getParentTypes is annotated with @hide in platform and will be
+ // removed after deprecation.
assertThat(result.getGenericDocument().getParentTypes()).isNull();
+// @exportToFramework:endStrip()
} else {
assertThat(result.getParentTypeMap()).isEmpty();
+// @exportToFramework:startStrip()
assertThat(result.getGenericDocument().getParentTypes()).contains(parentSchemaType);
+// @exportToFramework:endStrip()
}
}
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchConfigImpl.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchConfigImpl.java
index b8f5e22..40447a1 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchConfigImpl.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchConfigImpl.java
@@ -124,11 +124,6 @@
}
@Override
- public boolean getEnableBlobStore() {
- return mIcingOptionsConfig.getEnableBlobStore();
- }
-
- @Override
public int getMaxDocumentSizeBytes() {
return mLimitConfig.getMaxDocumentSizeBytes();
}
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchImpl.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchImpl.java
index 66018fc..9c58fac 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchImpl.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchImpl.java
@@ -247,7 +247,7 @@
private int mOptimizeIntervalCountLocked = 0;
@Nullable
- private AppSearchRevocableFileDescriptorStore mRevocableFileDescriptorStore;
+ private RevocableFileDescriptorStore mRevocableFileDescriptorStore;
/** Whether this instance has been closed, and therefore unusable. */
@GuardedBy("mReadWriteLock")
@@ -275,7 +275,7 @@
@NonNull AppSearchConfig config,
@Nullable InitializeStats.Builder initStatsBuilder,
@Nullable VisibilityChecker visibilityChecker,
- @Nullable AppSearchRevocableFileDescriptorStore revocableFileDescriptorStore,
+ @Nullable RevocableFileDescriptorStore revocableFileDescriptorStore,
@NonNull OptimizeStrategy optimizeStrategy)
throws AppSearchException {
return new AppSearchImpl(icingDir, config, initStatsBuilder, visibilityChecker,
@@ -290,7 +290,7 @@
@NonNull AppSearchConfig config,
@Nullable InitializeStats.Builder initStatsBuilder,
@Nullable VisibilityChecker visibilityChecker,
- @Nullable AppSearchRevocableFileDescriptorStore revocableFileDescriptorStore,
+ @Nullable RevocableFileDescriptorStore revocableFileDescriptorStore,
@NonNull OptimizeStrategy optimizeStrategy)
throws AppSearchException {
Preconditions.checkNotNull(icingDir);
@@ -323,7 +323,7 @@
.setUseNewQualifiedIdJoinIndex(mConfig.getUseNewQualifiedIdJoinIndex())
.setBuildPropertyExistenceMetadataHits(
mConfig.getBuildPropertyExistenceMetadataHits())
- .setEnableBlobStore(mConfig.getEnableBlobStore())
+ .setEnableBlobStore(Flags.enableBlobStore())
.setOrphanBlobTimeToLiveMs(mConfig.getOrphanBlobTimeToLiveMs())
.setEnableEmbeddingIndex(Flags.enableSchemaEmbeddingPropertyConfig())
.setEnableEmbeddingQuantization(Flags.enableSchemaEmbeddingQuantization())
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/IcingOptionsConfig.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/IcingOptionsConfig.java
index bdc2da2..2f1c5711 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/IcingOptionsConfig.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/IcingOptionsConfig.java
@@ -229,14 +229,6 @@
boolean getBuildPropertyExistenceMetadataHits();
/**
- * Flag for {@link com.google.android.icing.proto.IcingSearchEngineOptions}.
- *
- * <p>Whether to enable the blob store. If set to true, the BlobStore will be created to store
- * and retrieve blobs.
- */
- boolean getEnableBlobStore();
-
- /**
* Config for {@link com.google.android.icing.proto.IcingSearchEngineOptions}.
*
* <p>The maximum time in millisecond for a orphan blob to get recycled and deleted if there is
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/JetpackRevocableFileDescriptorStore.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/JetpackRevocableFileDescriptorStore.java
index 7fccab8..0edee8b 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/JetpackRevocableFileDescriptorStore.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/JetpackRevocableFileDescriptorStore.java
@@ -33,7 +33,7 @@
import java.util.Map;
/**
- * The local storage implementation of {@link AppSearchRevocableFileDescriptorStore}.
+ * The local storage implementation of {@link RevocableFileDescriptorStore}.
*
* <p> The {@link ParcelFileDescriptor} sent to the client side from the local storage won't cross
* the binder, we could revoke the {@link ParcelFileDescriptor} in the client side by directly close
@@ -46,7 +46,7 @@
*/
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public class JetpackRevocableFileDescriptorStore implements
- AppSearchRevocableFileDescriptorStore {
+ RevocableFileDescriptorStore {
private final Object mLock = new Object();
private final AppSearchConfig mConfig;
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorage.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorage.java
index 4263ec1..b5fe923 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorage.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorage.java
@@ -360,7 +360,7 @@
/* storeParentInfoAsSyntheticProperty= */ false,
/* shouldRetrieveParentInfo= */ true
);
- AppSearchRevocableFileDescriptorStore revocableFileDescriptorStore = null;
+ RevocableFileDescriptorStore revocableFileDescriptorStore = null;
if (Flags.enableBlobStore()) {
revocableFileDescriptorStore = new JetpackRevocableFileDescriptorStore(config);
}
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorageIcingOptionsConfig.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorageIcingOptionsConfig.java
index 51e1125..d0837fd 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorageIcingOptionsConfig.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/LocalStorageIcingOptionsConfig.java
@@ -100,11 +100,6 @@
}
@Override
- public boolean getEnableBlobStore() {
- return true;
- }
-
- @Override
public long getOrphanBlobTimeToLiveMs() {
return DEFAULT_ORPHAN_BLOB_TIME_TO_LIVE_MS;
}
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchRevocableFileDescriptorStore.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/RevocableFileDescriptorStore.java
similarity index 98%
rename from appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchRevocableFileDescriptorStore.java
rename to appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/RevocableFileDescriptorStore.java
index 86bcc64..fa8cfc1 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/AppSearchRevocableFileDescriptorStore.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/RevocableFileDescriptorStore.java
@@ -38,7 +38,7 @@
* @exportToFramework:hide
*/
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public interface AppSearchRevocableFileDescriptorStore {
+public interface RevocableFileDescriptorStore {
/**
* Wraps the provided ParcelFileDescriptor into a revocable file descriptor.
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/converter/SearchSpecToProtoConverter.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/converter/SearchSpecToProtoConverter.java
index 4f80e5a..2c81868 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/converter/SearchSpecToProtoConverter.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/converter/SearchSpecToProtoConverter.java
@@ -541,6 +541,8 @@
protoBuilder.addAllAdditionalAdvancedScoringExpressions(
mSearchSpec.getInformationalRankingExpressions());
+ // TODO(b/380924970): create extractEnabledScoringFeatures() for populating scorable
+ // features
if (mSearchSpec.isScorablePropertyRankingEnabled()) {
protoBuilder.addScoringFeatureTypesEnabled(
ScoringFeatureType.SCORABLE_PROPERTY_RANKING);
@@ -1110,8 +1112,17 @@
List<String> extractEnabledSearchFeatures(List<String> allEnabledFeatures) {
List<String> searchFeatures = new ArrayList<>();
- for (String feature : allEnabledFeatures) {
+ for (int i = 0; i < allEnabledFeatures.size(); ++i) {
+ String feature = allEnabledFeatures.get(i);
if (FeatureConstants.SCORABLE_FEATURE_SET.contains(feature)) {
+ // The `allEnabledFeatures` set contains both scorable features and search features.
+ // Here, we extract the search related features and populate them to
+ // `SearchSpecProto`. The scoring related features are later populated to the
+ // `ScoringSpecProto` individually in `toScoringSpecProto()`.
+ // - This is because in Icing, the search expression and scoring expression are
+ // parsed separately, and the enforcement of these enabled features are separate.
+ // Icing needs the two different proto messages to distinguish between
+ // features in the search expression and features in the scoring expression.
continue;
}
searchFeatures.add(feature);
diff --git a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/stats/CallStats.java b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/stats/CallStats.java
index 5f28ea0..e8c3199 100644
--- a/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/stats/CallStats.java
+++ b/appsearch/appsearch-local-storage/src/main/java/androidx/appsearch/localstorage/stats/CallStats.java
@@ -78,7 +78,10 @@
CALL_TYPE_REGISTER_OBSERVER_CALLBACK,
CALL_TYPE_UNREGISTER_OBSERVER_CALLBACK,
CALL_TYPE_GLOBAL_GET_NEXT_PAGE,
- CALL_TYPE_EXECUTE_APP_FUNCTION
+ CALL_TYPE_EXECUTE_APP_FUNCTION,
+ CALL_TYPE_OPEN_WRITE_BLOB,
+ CALL_TYPE_COMMIT_BLOB,
+ CALL_TYPE_OPEN_READ_BLOB
})
@Retention(RetentionPolicy.SOURCE)
public @interface CallType {
@@ -116,6 +119,9 @@
public static final int CALL_TYPE_UNREGISTER_OBSERVER_CALLBACK = 29;
public static final int CALL_TYPE_GLOBAL_GET_NEXT_PAGE = 30;
public static final int CALL_TYPE_EXECUTE_APP_FUNCTION = 31;
+ public static final int CALL_TYPE_OPEN_WRITE_BLOB = 32;
+ public static final int CALL_TYPE_COMMIT_BLOB = 33;
+ public static final int CALL_TYPE_OPEN_READ_BLOB = 34;
// These strings are for the subset of call types that correspond to an AppSearchManager API
private static final String CALL_TYPE_STRING_INITIALIZE = "initialize";
@@ -148,6 +154,9 @@
"globalUnregisterObserverCallback";
private static final String CALL_TYPE_STRING_GLOBAL_GET_NEXT_PAGE = "globalGetNextPage";
private static final String CALL_TYPE_STRING_EXECUTE_APP_FUNCTION = "executeAppFunction";
+ private static final String CALL_TYPE_STRING_OPEN_WRITE_BLOB = "openWriteBlob";
+ private static final String CALL_TYPE_STRING_COMMIT_BLOB = "commitBlob";
+ private static final String CALL_TYPE_STRING_OPEN_READ_BLOB = "openReadBlob";
@Nullable
private final String mPackageName;
@@ -416,6 +425,12 @@
return CALL_TYPE_GLOBAL_GET_NEXT_PAGE;
case CALL_TYPE_STRING_EXECUTE_APP_FUNCTION:
return CALL_TYPE_EXECUTE_APP_FUNCTION;
+ case CALL_TYPE_STRING_OPEN_WRITE_BLOB:
+ return CALL_TYPE_OPEN_WRITE_BLOB;
+ case CALL_TYPE_STRING_COMMIT_BLOB:
+ return CALL_TYPE_COMMIT_BLOB;
+ case CALL_TYPE_STRING_OPEN_READ_BLOB:
+ return CALL_TYPE_OPEN_READ_BLOB;
default:
return CALL_TYPE_UNKNOWN;
}
@@ -452,6 +467,9 @@
CALL_TYPE_REGISTER_OBSERVER_CALLBACK,
CALL_TYPE_UNREGISTER_OBSERVER_CALLBACK,
CALL_TYPE_GLOBAL_GET_NEXT_PAGE,
- CALL_TYPE_EXECUTE_APP_FUNCTION));
+ CALL_TYPE_EXECUTE_APP_FUNCTION,
+ CALL_TYPE_OPEN_WRITE_BLOB,
+ CALL_TYPE_COMMIT_BLOB,
+ CALL_TYPE_OPEN_READ_BLOB));
}
}
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/CheckFlagsRule.java b/appsearch/appsearch-test-util/src/main/java/androidx/appsearch/testutil/flags/CheckFlagsRule.java
similarity index 81%
rename from appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/CheckFlagsRule.java
rename to appsearch/appsearch-test-util/src/main/java/androidx/appsearch/testutil/flags/CheckFlagsRule.java
index 3ec5386..fd57f25 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/CheckFlagsRule.java
+++ b/appsearch/appsearch-test-util/src/main/java/androidx/appsearch/testutil/flags/CheckFlagsRule.java
@@ -14,7 +14,10 @@
* limitations under the License.
*/
// @exportToFramework:skipFile()
-package androidx.appsearch.flags;
+package androidx.appsearch.testutil.flags;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
@@ -27,7 +30,8 @@
*/
public final class CheckFlagsRule implements TestRule {
@Override
- public Statement apply(Statement base, Description description) {
+ @NonNull
+ public Statement apply(@NonNull Statement base, @Nullable Description description) {
return base;
}
}
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/DeviceFlagsValueProvider.java b/appsearch/appsearch-test-util/src/main/java/androidx/appsearch/testutil/flags/DeviceFlagsValueProvider.java
similarity index 91%
rename from appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/DeviceFlagsValueProvider.java
rename to appsearch/appsearch-test-util/src/main/java/androidx/appsearch/testutil/flags/DeviceFlagsValueProvider.java
index 1a2858a..0b3dc81 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/DeviceFlagsValueProvider.java
+++ b/appsearch/appsearch-test-util/src/main/java/androidx/appsearch/testutil/flags/DeviceFlagsValueProvider.java
@@ -14,7 +14,9 @@
* limitations under the License.
*/
// @exportToFramework:skipFile()
-package androidx.appsearch.flags;
+package androidx.appsearch.testutil.flags;
+
+import androidx.annotation.NonNull;
/**
* Shim for real DeviceFlagsValueProvider defined in Framework.
@@ -25,6 +27,7 @@
private DeviceFlagsValueProvider() {}
/** Provides a shim rule that can be used to check the status of flags on device */
+ @NonNull
public static CheckFlagsRule createCheckFlagsRule() {
return new CheckFlagsRule();
}
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/RequiresFlagsEnabled.java b/appsearch/appsearch-test-util/src/main/java/androidx/appsearch/testutil/flags/RequiresFlagsEnabled.java
similarity index 97%
rename from appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/RequiresFlagsEnabled.java
rename to appsearch/appsearch-test-util/src/main/java/androidx/appsearch/testutil/flags/RequiresFlagsEnabled.java
index d4f3bf0..47b3ae1 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/RequiresFlagsEnabled.java
+++ b/appsearch/appsearch-test-util/src/main/java/androidx/appsearch/testutil/flags/RequiresFlagsEnabled.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
// @exportToFramework:skipFile()
-package androidx.appsearch.flags;
+package androidx.appsearch.testutil.flags;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
diff --git a/appsearch/appsearch/api/current.txt b/appsearch/appsearch/api/current.txt
index 918091b8..bc6ded2 100644
--- a/appsearch/appsearch/api/current.txt
+++ b/appsearch/appsearch/api/current.txt
@@ -357,7 +357,7 @@
field public static final String GLOBAL_SEARCH_SESSION_REGISTER_OBSERVER_CALLBACK = "GLOBAL_SEARCH_SESSION_REGISTER_OBSERVER_CALLBACK";
field public static final String JOIN_SPEC_AND_QUALIFIED_ID = "JOIN_SPEC_AND_QUALIFIED_ID";
field public static final String LIST_FILTER_HAS_PROPERTY_FUNCTION = "LIST_FILTER_HAS_PROPERTY_FUNCTION";
- field public static final String LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION = "LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION";
+ field @SuppressCompatibility @androidx.appsearch.app.ExperimentalAppSearchApi public static final String LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION = "LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION";
field public static final String LIST_FILTER_QUERY_LANGUAGE = "LIST_FILTER_QUERY_LANGUAGE";
field public static final String NUMERIC_SEARCH = "NUMERIC_SEARCH";
field public static final String SCHEMA_ADD_INDEXABLE_NESTED_PROPERTIES = "SCHEMA_ADD_INDEXABLE_NESTED_PROPERTIES";
diff --git a/appsearch/appsearch/api/restricted_current.txt b/appsearch/appsearch/api/restricted_current.txt
index 918091b8..bc6ded2 100644
--- a/appsearch/appsearch/api/restricted_current.txt
+++ b/appsearch/appsearch/api/restricted_current.txt
@@ -357,7 +357,7 @@
field public static final String GLOBAL_SEARCH_SESSION_REGISTER_OBSERVER_CALLBACK = "GLOBAL_SEARCH_SESSION_REGISTER_OBSERVER_CALLBACK";
field public static final String JOIN_SPEC_AND_QUALIFIED_ID = "JOIN_SPEC_AND_QUALIFIED_ID";
field public static final String LIST_FILTER_HAS_PROPERTY_FUNCTION = "LIST_FILTER_HAS_PROPERTY_FUNCTION";
- field public static final String LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION = "LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION";
+ field @SuppressCompatibility @androidx.appsearch.app.ExperimentalAppSearchApi public static final String LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION = "LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION";
field public static final String LIST_FILTER_QUERY_LANGUAGE = "LIST_FILTER_QUERY_LANGUAGE";
field public static final String NUMERIC_SEARCH = "NUMERIC_SEARCH";
field public static final String SCHEMA_ADD_INDEXABLE_NESTED_PROPERTIES = "SCHEMA_ADD_INDEXABLE_NESTED_PROPERTIES";
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/SearchSpecInternalTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/SearchSpecInternalTest.java
index 0fce1ed..e983429 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/SearchSpecInternalTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/SearchSpecInternalTest.java
@@ -19,7 +19,7 @@
import static com.google.common.truth.Truth.assertThat;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import com.google.common.collect.ImmutableMap;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/aidl/AppSearchBatchResultGeneralKeyParcelTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/aidl/AppSearchBatchResultParcelV2Test.java
similarity index 90%
rename from appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/aidl/AppSearchBatchResultGeneralKeyParcelTest.java
rename to appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/aidl/AppSearchBatchResultParcelV2Test.java
index d2dd377..1d10dc8 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/aidl/AppSearchBatchResultGeneralKeyParcelTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/app/aidl/AppSearchBatchResultParcelV2Test.java
@@ -33,7 +33,7 @@
import java.io.File;
-public class AppSearchBatchResultGeneralKeyParcelTest {
+public class AppSearchBatchResultParcelV2Test {
@Test
public void testFromBlobHandleToPfd() throws Exception {
@@ -56,8 +56,8 @@
.setResult(blobHandle1, successResult)
.setResult(blobHandle2, failureResult)
.build();
- AppSearchBatchResultGeneralKeyParcel<AppSearchBlobHandle, ParcelFileDescriptor>
- resultParcel = AppSearchBatchResultGeneralKeyParcel.fromBlobHandleToPfd(result);
+ AppSearchBatchResultParcelV2<AppSearchBlobHandle, ParcelFileDescriptor>
+ resultParcel = AppSearchBatchResultParcelV2.fromBlobHandleToPfd(result);
AppSearchBatchResult<AppSearchBlobHandle, ParcelFileDescriptor> outResult =
resultParcel.getResult();
@@ -84,8 +84,8 @@
.setResult(blobHandle1, successResult)
.setResult(blobHandle2, failureResult)
.build();
- AppSearchBatchResultGeneralKeyParcel<AppSearchBlobHandle, Void>
- resultParcel = AppSearchBatchResultGeneralKeyParcel.fromBlobHandleToVoid(result);
+ AppSearchBatchResultParcelV2<AppSearchBlobHandle, Void> resultParcel =
+ AppSearchBatchResultParcelV2.fromBlobHandleToVoid(result);
AppSearchBatchResult<AppSearchBlobHandle, Void> outResult = resultParcel.getResult();
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchBatchResultCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchBatchResultCtsTest.java
index 0852d6f..83b04c8 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchBatchResultCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchBatchResultCtsTest.java
@@ -20,10 +20,10 @@
import androidx.appsearch.app.AppSearchBatchResult;
import androidx.appsearch.app.AppSearchResult;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import org.junit.Rule;
import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchBlobHandleCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchBlobHandleCtsTest.java
index b294eac..9e14154 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchBlobHandleCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchBlobHandleCtsTest.java
@@ -24,10 +24,10 @@
import static org.junit.Assert.assertThrows;
import androidx.appsearch.app.AppSearchBlobHandle;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import org.junit.Rule;
import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSchemaCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSchemaCtsTest.java
index e728048..8401565 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSchemaCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSchemaCtsTest.java
@@ -28,11 +28,11 @@
import androidx.appsearch.app.AppSearchSchema.PropertyConfig;
import androidx.appsearch.app.AppSearchSchema.StringPropertyConfig;
import androidx.appsearch.app.PropertyPath;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
import androidx.appsearch.testutil.AppSearchEmail;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import org.junit.Rule;
import org.junit.Test;
@@ -78,6 +78,14 @@
LongPropertyConfig builder = new LongPropertyConfig.Builder("test").build();
assertThat(builder.getIndexingType()).isEqualTo(LongPropertyConfig.INDEXING_TYPE_NONE);
assertThat(builder.getCardinality()).isEqualTo(PropertyConfig.CARDINALITY_OPTIONAL);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_SCORABLE_PROPERTY)
+ public void testLongPropertyConfigDefaultValuesWithScorableConfig() {
+ LongPropertyConfig builder = new LongPropertyConfig.Builder("test").build();
+ assertThat(builder.getIndexingType()).isEqualTo(LongPropertyConfig.INDEXING_TYPE_NONE);
+ assertThat(builder.getCardinality()).isEqualTo(PropertyConfig.CARDINALITY_OPTIONAL);
assertThat(builder.isScoringEnabled()).isEqualTo(false);
}
@@ -206,6 +214,7 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_SCORABLE_PROPERTY)
public void testEquals_failWithDifferentScorableTypes() {
AppSearchSchema schema1 = new AppSearchSchema.Builder("Email")
.addProperty(new LongPropertyConfig.Builder("id")
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobCtsTestBase.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobCtsTestBase.java
index f271597..91ab2d4 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobCtsTestBase.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobCtsTestBase.java
@@ -45,10 +45,10 @@
import androidx.appsearch.app.OpenBlobForWriteResponse;
import androidx.appsearch.app.PutDocumentsRequest;
import androidx.appsearch.app.SetSchemaRequest;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import androidx.test.core.app.ApplicationProvider;
import com.google.common.collect.ImmutableSet;
@@ -63,7 +63,6 @@
import java.io.InputStream;
import java.io.OutputStream;
-@RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
public abstract class AppSearchSessionBlobCtsTestBase {
static final String DB_NAME_1 = "";
@@ -97,6 +96,7 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
public void testWriteAndReadBlob() throws Exception {
assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.BLOB_STORAGE));
mDb1.setSchemaAsync(new SetSchemaRequest.Builder().setForceOverride(true).build()).get();
@@ -159,6 +159,7 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
public void testWriteAndReadBlob_withoutCommit() throws Exception {
assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.BLOB_STORAGE));
mDb1.setSchemaAsync(new SetSchemaRequest.Builder().setForceOverride(true).build()).get();
@@ -197,6 +198,7 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
public void testRewrite_notAllowed() throws Exception {
assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.BLOB_STORAGE));
mDb1.setSchemaAsync(new SetSchemaRequest.Builder().setForceOverride(true).build()).get();
@@ -249,6 +251,7 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
public void testOpenWriteForRead_allowed() throws Exception {
assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.BLOB_STORAGE));
mDb1.setSchemaAsync(new SetSchemaRequest.Builder().setForceOverride(true).build()).get();
@@ -274,6 +277,7 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
public void testOpenReadForWrite_notAllowed() throws Exception {
assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.BLOB_STORAGE));
mDb1.setSchemaAsync(new SetSchemaRequest.Builder().setForceOverride(true).build()).get();
@@ -316,6 +320,7 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
public void testCommitBlobWithWrongDigest() throws Exception {
assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.BLOB_STORAGE));
mDb1.setSchemaAsync(new SetSchemaRequest.Builder().setForceOverride(true).build()).get();
@@ -353,6 +358,7 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
public void testCloseWriteResponse() throws Exception {
assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.BLOB_STORAGE));
mDb1.setSchemaAsync(new SetSchemaRequest.Builder().setForceOverride(true).build()).get();
@@ -389,6 +395,7 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
public void testCloseReadResponse() throws Exception {
assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.BLOB_STORAGE));
mDb1.setSchemaAsync(new SetSchemaRequest.Builder().setForceOverride(true).build()).get();
@@ -452,6 +459,7 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
public void testSetBlobSchema() throws Exception {
assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.BLOB_STORAGE));
AppSearchSchema schema = new AppSearchSchema.Builder("Type")
@@ -467,6 +475,7 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_BLOB_STORE)
public void testPutDocumentWithBlobProperty() throws Exception {
assumeTrue(mDb1.getFeatures().isFeatureSupported(Features.BLOB_STORAGE));
AppSearchSchema schema = new AppSearchSchema.Builder("Type")
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobGmsCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobGmsCtsTest.java
index 05428ce..672137a 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobGmsCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobGmsCtsTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+// @exportToFramework:skipFile()
package androidx.appsearch.cts.app;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobPlatformCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobPlatformCtsTest.java
index d8a8f0c..4e0a746 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobPlatformCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionBlobPlatformCtsTest.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+// @exportToFramework:skipFile()
package androidx.appsearch.cts.app;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java
index 627af56..edea125 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/AppSearchSessionCtsTestBase.java
@@ -64,11 +64,11 @@
import androidx.appsearch.app.StorageInfo;
import androidx.appsearch.cts.app.customer.EmailDocument;
import androidx.appsearch.exceptions.AppSearchException;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
import androidx.appsearch.testutil.AppSearchEmail;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import androidx.appsearch.usagereporting.ClickAction;
import androidx.appsearch.usagereporting.DismissAction;
import androidx.appsearch.usagereporting.ImpressionAction;
@@ -11544,22 +11544,6 @@
mDb1.setSchemaAsync(new SetSchemaRequest.Builder()
.addSchemas(schemaWithPropertyNotScorable).build()).get();
- // Ranking with the property will return an error, and the scorable cache will also be
- // erased.
- ExecutionException exception = assertThrows(ExecutionException.class,
- () -> {
- SearchSpec invalidSearchSpec = new SearchSpec.Builder()
- .setScorablePropertyRankingEnabled(true)
- .setRankingStrategy(
- "sum(getScorableProperty(\"Gmail\", \"important\"))")
- .build();
- SearchResults invalidSearchResults =
- mDb1.search("", invalidSearchSpec);
- retrieveAllSearchResults(invalidSearchResults);
- });
- assertThat(exception.getMessage()).matches(
- ".*\'important\' is not defined as a scorable property under schema type.*");
-
// Update the schema by updating the property to scorable again.
mDb1.setSchemaAsync(new SetSchemaRequest.Builder()
.addSchemas(schemaWithPropertyScorable).build()).get();
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/CommitBlobResponseTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/CommitBlobResponseTest.java
index fe851aaf..366f189 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/CommitBlobResponseTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/CommitBlobResponseTest.java
@@ -25,10 +25,10 @@
import androidx.appsearch.app.AppSearchBlobHandle;
import androidx.appsearch.app.AppSearchResult;
import androidx.appsearch.app.CommitBlobResponse;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import org.junit.Rule;
import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/EnterpriseGlobalSearchSessionCtsTestBase.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/EnterpriseGlobalSearchSessionCtsTestBase.java
index 2c9bf17..1b2c9be 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/EnterpriseGlobalSearchSessionCtsTestBase.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/EnterpriseGlobalSearchSessionCtsTestBase.java
@@ -25,10 +25,10 @@
import androidx.appsearch.app.EnterpriseGlobalSearchSession;
import androidx.appsearch.app.GenericDocument;
import androidx.appsearch.app.GetByDocumentIdRequest;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import com.google.common.util.concurrent.ListenableFuture;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GenericDocumentCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GenericDocumentCtsTest.java
index 475d33d..6bfea59 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GenericDocumentCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GenericDocumentCtsTest.java
@@ -28,10 +28,10 @@
import androidx.appsearch.app.AppSearchBlobHandle;
import androidx.appsearch.app.EmbeddingVector;
import androidx.appsearch.app.GenericDocument;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import org.junit.Rule;
import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GetSchemaResponseCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GetSchemaResponseCtsTest.java
index c4a7722..98573bb 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GetSchemaResponseCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GetSchemaResponseCtsTest.java
@@ -25,10 +25,10 @@
import androidx.appsearch.app.PackageIdentifier;
import androidx.appsearch.app.SchemaVisibilityConfig;
import androidx.appsearch.app.SetSchemaRequest;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import com.google.common.collect.ImmutableSet;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GlobalSearchSessionCtsTestBase.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GlobalSearchSessionCtsTestBase.java
index 3a35de1..9d5fe3d 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GlobalSearchSessionCtsTestBase.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/GlobalSearchSessionCtsTestBase.java
@@ -49,12 +49,14 @@
import androidx.appsearch.app.SetSchemaRequest;
import androidx.appsearch.exceptions.AppSearchException;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
import androidx.appsearch.observer.DocumentChangeInfo;
import androidx.appsearch.observer.ObserverSpec;
import androidx.appsearch.observer.SchemaChangeInfo;
import androidx.appsearch.testutil.AppSearchEmail;
import androidx.appsearch.testutil.TestObserverCallback;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import androidx.test.core.app.ApplicationProvider;
import com.google.common.collect.ImmutableList;
@@ -64,6 +66,7 @@
import org.junit.After;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import java.util.ArrayList;
@@ -85,6 +88,9 @@
protected GlobalSearchSession mGlobalSearchSession;
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
protected abstract ListenableFuture<AppSearchSession> createSearchSessionAsync(
@NonNull String dbName) throws Exception;
@@ -2028,6 +2034,7 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_SCORABLE_PROPERTY)
public void testRankWithScorableProperty_searchFromMultipleDbs() throws Exception {
assumeTrue(mGlobalSearchSession.getFeatures()
.isFeatureSupported(Features.SCHEMA_SCORABLE_PROPERTY_CONFIG));
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/JoinSpecCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/JoinSpecCtsTest.java
index a307a22..8bb5e1b 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/JoinSpecCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/JoinSpecCtsTest.java
@@ -20,10 +20,10 @@
import androidx.appsearch.app.JoinSpec;
import androidx.appsearch.app.SearchSpec;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import org.junit.Rule;
import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/OpenBlobForReadResponseTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/OpenBlobForReadResponseTest.java
index 1378e7c..24d85cb 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/OpenBlobForReadResponseTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/OpenBlobForReadResponseTest.java
@@ -31,10 +31,10 @@
import androidx.appsearch.app.AppSearchBlobHandle;
import androidx.appsearch.app.AppSearchResult;
import androidx.appsearch.app.OpenBlobForReadResponse;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import org.junit.After;
import org.junit.Before;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/OpenBlobForWriteResponseTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/OpenBlobForWriteResponseTest.java
index a9f4bfc..8481aab 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/OpenBlobForWriteResponseTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/OpenBlobForWriteResponseTest.java
@@ -31,10 +31,10 @@
import androidx.appsearch.app.AppSearchBlobHandle;
import androidx.appsearch.app.AppSearchResult;
import androidx.appsearch.app.OpenBlobForWriteResponse;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import org.junit.After;
import org.junit.Before;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchResultCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchResultCtsTest.java
index 3761d6f..322b898 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchResultCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchResultCtsTest.java
@@ -22,11 +22,11 @@
import androidx.appsearch.app.PropertyPath;
import androidx.appsearch.app.SearchResult;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
import androidx.appsearch.testutil.AppSearchEmail;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import org.junit.Rule;
import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchSpecCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchSpecCtsTest.java
index 9b13d2c..444d67a 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchSpecCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SearchSpecCtsTest.java
@@ -28,10 +28,10 @@
import androidx.appsearch.app.JoinSpec;
import androidx.appsearch.app.PropertyPath;
import androidx.appsearch.app.SearchSpec;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
@@ -88,6 +88,78 @@
.setNumericSearchEnabled(true)
.setVerbatimSearchEnabled(true)
.setListFilterQueryLanguageEnabled(true)
+ .build();
+
+ assertThat(searchSpec.getTermMatch()).isEqualTo(SearchSpec.TERM_MATCH_PREFIX);
+ assertThat(searchSpec.getFilterNamespaces())
+ .containsExactly("namespace1", "namespace2", "namespace3").inOrder();
+ assertThat(searchSpec.getFilterSchemas())
+ .containsExactly("schemaTypes1", "schemaTypes2", "schemaTypes3").inOrder();
+ assertThat(searchSpec.getFilterPackageNames())
+ .containsExactly("package1", "package2", "package3").inOrder();
+ assertThat(searchSpec.getSnippetCount()).isEqualTo(5);
+ assertThat(searchSpec.getSnippetCountPerProperty()).isEqualTo(10);
+ assertThat(searchSpec.getMaxSnippetSize()).isEqualTo(15);
+ assertThat(searchSpec.getResultCountPerPage()).isEqualTo(42);
+ assertThat(searchSpec.getOrder()).isEqualTo(SearchSpec.ORDER_ASCENDING);
+ assertThat(searchSpec.getRankingStrategy())
+ .isEqualTo(SearchSpec.RANKING_STRATEGY_RELEVANCE_SCORE);
+ assertThat(searchSpec.getResultGroupingTypeFlags())
+ .isEqualTo(SearchSpec.GROUPING_TYPE_PER_NAMESPACE
+ | SearchSpec.GROUPING_TYPE_PER_PACKAGE);
+ assertThat(searchSpec.getProjections())
+ .containsExactly("schemaTypes1", expectedPropertyPaths1, "schemaTypes2",
+ expectedPropertyPaths2);
+ assertThat(searchSpec.getResultGroupingLimit()).isEqualTo(37);
+ assertThat(searchSpec.getPropertyWeights().keySet()).containsExactly("schemaTypes1",
+ "schemaTypes2");
+ assertThat(searchSpec.getPropertyWeights().get("schemaTypes1"))
+ .containsExactly("property1", 1.0, "property2", 2.0);
+ assertThat(searchSpec.getPropertyWeights().get("schemaTypes2"))
+ .containsExactly("property1.nested", 1.0);
+ assertThat(searchSpec.getPropertyWeightPaths().get("schemaTypes1"))
+ .containsExactly(new PropertyPath("property1"), 1.0,
+ new PropertyPath("property2"), 2.0);
+ assertThat(searchSpec.getPropertyWeightPaths().get("schemaTypes2"))
+ .containsExactly(new PropertyPath("property1.nested"), 1.0);
+ assertThat(searchSpec.isNumericSearchEnabled()).isTrue();
+ assertThat(searchSpec.isVerbatimSearchEnabled()).isTrue();
+ assertThat(searchSpec.isListFilterQueryLanguageEnabled()).isTrue();
+ }
+
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENABLE_SCORABLE_PROPERTY)
+ public void testBuildSearchSpec_scorablePropertyRanking() {
+ List<String> expectedPropertyPaths1 = ImmutableList.of("path1", "path2");
+ List<String> expectedPropertyPaths2 = ImmutableList.of("path3", "path4");
+ Map<String, Double> expectedPropertyWeights = ImmutableMap.of("property1", 1.0,
+ "property2", 2.0);
+ Map<PropertyPath, Double> expectedPropertyWeightPaths =
+ ImmutableMap.of(new PropertyPath("property1.nested"), 1.0);
+
+ SearchSpec searchSpec = new SearchSpec.Builder()
+ .setTermMatch(SearchSpec.TERM_MATCH_PREFIX)
+ .addFilterNamespaces("namespace1", "namespace2")
+ .addFilterNamespaces(ImmutableList.of("namespace3"))
+ .addFilterSchemas("schemaTypes1", "schemaTypes2")
+ .addFilterSchemas(ImmutableList.of("schemaTypes3"))
+ .addFilterPackageNames("package1", "package2")
+ .addFilterPackageNames(ImmutableList.of("package3"))
+ .setSnippetCount(5)
+ .setSnippetCountPerProperty(10)
+ .setMaxSnippetSize(15)
+ .setResultCountPerPage(42)
+ .setOrder(SearchSpec.ORDER_ASCENDING)
+ .setRankingStrategy(SearchSpec.RANKING_STRATEGY_RELEVANCE_SCORE)
+ .setResultGrouping(SearchSpec.GROUPING_TYPE_PER_NAMESPACE
+ | SearchSpec.GROUPING_TYPE_PER_PACKAGE, /*limit=*/ 37)
+ .addProjection("schemaTypes1", expectedPropertyPaths1)
+ .addProjection("schemaTypes2", expectedPropertyPaths2)
+ .setPropertyWeights("schemaTypes1", expectedPropertyWeights)
+ .setPropertyWeightPaths("schemaTypes2", expectedPropertyWeightPaths)
+ .setNumericSearchEnabled(true)
+ .setVerbatimSearchEnabled(true)
+ .setListFilterQueryLanguageEnabled(true)
.setScorablePropertyRankingEnabled(true)
.build();
@@ -940,6 +1012,74 @@
.setNumericSearchEnabled(true)
.setVerbatimSearchEnabled(true)
.setListFilterQueryLanguageEnabled(true)
+ .build();
+ SearchSpec searchSpecCopy = new SearchSpec.Builder(searchSpec).build();
+ assertThat(searchSpecCopy.getTermMatch()).isEqualTo(searchSpec.getTermMatch());
+ assertThat(searchSpecCopy.getFilterNamespaces()).isEqualTo(
+ searchSpec.getFilterNamespaces());
+ assertThat(searchSpecCopy.getFilterSchemas()).isEqualTo(searchSpec.getFilterSchemas());
+ assertThat(searchSpecCopy.getFilterPackageNames()).isEqualTo(
+ searchSpec.getFilterPackageNames());
+ assertThat(searchSpecCopy.getSnippetCount()).isEqualTo(searchSpec.getSnippetCount());
+ assertThat(searchSpecCopy.getSnippetCountPerProperty()).isEqualTo(
+ searchSpec.getSnippetCountPerProperty());
+ assertThat(searchSpecCopy.getMaxSnippetSize()).isEqualTo(searchSpec.getMaxSnippetSize());
+ assertThat(searchSpecCopy.getResultCountPerPage()).isEqualTo(
+ searchSpec.getResultCountPerPage());
+ assertThat(searchSpecCopy.getOrder()).isEqualTo(searchSpec.getOrder());
+ assertThat(searchSpecCopy.getRankingStrategy()).isEqualTo(searchSpec.getRankingStrategy());
+ assertThat(searchSpecCopy.getResultGroupingTypeFlags()).isEqualTo(
+ searchSpec.getResultGroupingTypeFlags());
+ assertThat(searchSpecCopy.getProjections()).isEqualTo(searchSpec.getProjections());
+ assertThat(searchSpecCopy.getResultGroupingLimit()).isEqualTo(
+ searchSpec.getResultGroupingLimit());
+ assertThat(searchSpecCopy.getPropertyWeights()).isEqualTo(searchSpec.getPropertyWeights());
+ assertThat(searchSpecCopy.getPropertyWeightPaths()).isEqualTo(
+ searchSpec.getPropertyWeightPaths());
+ assertThat(searchSpecCopy.isNumericSearchEnabled()).isEqualTo(
+ searchSpec.isNumericSearchEnabled());
+ assertThat(searchSpecCopy.isVerbatimSearchEnabled()).isEqualTo(
+ searchSpec.isVerbatimSearchEnabled());
+ assertThat(searchSpecCopy.isListFilterQueryLanguageEnabled()).isEqualTo(
+ searchSpec.isListFilterQueryLanguageEnabled());
+ }
+
+ @Test
+ @RequiresFlagsEnabled({
+ Flags.FLAG_ENABLE_ADDITIONAL_BUILDER_COPY_CONSTRUCTORS,
+ Flags.FLAG_ENABLE_SCORABLE_PROPERTY
+ })
+ public void testSearchSpecBuilder_copyConstructorWithScorableProperty() {
+ List<String> expectedPropertyPaths1 = ImmutableList.of("path1", "path2");
+ List<String> expectedPropertyPaths2 = ImmutableList.of("path3", "path4");
+ Map<String, Double> expectedPropertyWeights = ImmutableMap.of("property1", 1.0,
+ "property2", 2.0);
+ Map<PropertyPath, Double> expectedPropertyWeightPaths =
+ ImmutableMap.of(new PropertyPath("property1.nested"), 1.0);
+
+ SearchSpec searchSpec = new SearchSpec.Builder()
+ .setTermMatch(SearchSpec.TERM_MATCH_PREFIX)
+ .addFilterNamespaces("namespace1", "namespace2")
+ .addFilterNamespaces(ImmutableList.of("namespace3"))
+ .addFilterSchemas("schemaTypes1", "schemaTypes2")
+ .addFilterSchemas(ImmutableList.of("schemaTypes3"))
+ .addFilterPackageNames("package1", "package2")
+ .addFilterPackageNames(ImmutableList.of("package3"))
+ .setSnippetCount(5)
+ .setSnippetCountPerProperty(10)
+ .setMaxSnippetSize(15)
+ .setResultCountPerPage(42)
+ .setOrder(SearchSpec.ORDER_ASCENDING)
+ .setRankingStrategy(SearchSpec.RANKING_STRATEGY_RELEVANCE_SCORE)
+ .setResultGrouping(SearchSpec.GROUPING_TYPE_PER_NAMESPACE
+ | SearchSpec.GROUPING_TYPE_PER_PACKAGE, /*limit=*/ 37)
+ .addProjection("schemaTypes1", expectedPropertyPaths1)
+ .addProjection("schemaTypes2", expectedPropertyPaths2)
+ .setPropertyWeights("schemaTypes1", expectedPropertyWeights)
+ .setPropertyWeightPaths("schemaTypes2", expectedPropertyWeightPaths)
+ .setNumericSearchEnabled(true)
+ .setVerbatimSearchEnabled(true)
+ .setListFilterQueryLanguageEnabled(true)
.setScorablePropertyRankingEnabled(true)
.build();
SearchSpec searchSpecCopy = new SearchSpec.Builder(searchSpec).build();
@@ -1121,6 +1261,7 @@
assertThat(searchSpec.getFilterDocumentIds()).isEmpty();
}
+ @Test
@RequiresFlagsEnabled(Flags.FLAG_ENABLE_SCORABLE_PROPERTY)
public void testSetAndGetEnableScorablePropertyRanking() {
SearchSpec defaultSearchSpec = new SearchSpec.Builder().build();
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SetSchemaRequestCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SetSchemaRequestCtsTest.java
index 315b037..2151dd7 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SetSchemaRequestCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/app/SetSchemaRequestCtsTest.java
@@ -33,11 +33,11 @@
import androidx.appsearch.app.SchemaVisibilityConfig;
import androidx.appsearch.app.SetSchemaRequest;
import androidx.appsearch.exceptions.AppSearchException;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
import androidx.appsearch.testutil.AppSearchEmail;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import androidx.collection.ArrayMap;
import com.google.common.collect.ImmutableSet;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/NegationNodeCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/NegationNodeCtsTest.java
index 0ed9372..40c4d19 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/NegationNodeCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/NegationNodeCtsTest.java
@@ -23,10 +23,10 @@
import androidx.appsearch.ast.NegationNode;
import androidx.appsearch.ast.Node;
import androidx.appsearch.ast.TextNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import org.junit.Rule;
import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/TextNodeCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/TextNodeCtsTest.java
index 574a49f..d7335e4 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/TextNodeCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/TextNodeCtsTest.java
@@ -21,10 +21,10 @@
import static org.junit.Assert.assertThrows;
import androidx.appsearch.ast.TextNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import org.junit.Rule;
import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/AndNodeCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/AndNodeCtsTest.java
index c61a6fe..122ecb2 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/AndNodeCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/AndNodeCtsTest.java
@@ -25,10 +25,10 @@
import androidx.appsearch.ast.TextNode;
import androidx.appsearch.ast.operators.AndNode;
import androidx.appsearch.ast.operators.OrNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import org.junit.Rule;
import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/ComparatorNodeCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/ComparatorNodeCtsTest.java
index 5c2d32c..f4a8480 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/ComparatorNodeCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/ComparatorNodeCtsTest.java
@@ -22,10 +22,10 @@
import androidx.appsearch.app.PropertyPath;
import androidx.appsearch.ast.operators.ComparatorNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import org.junit.Rule;
import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/OrNodeCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/OrNodeCtsTest.java
index 574134e..0cfbc0b 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/OrNodeCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/OrNodeCtsTest.java
@@ -25,10 +25,10 @@
import androidx.appsearch.ast.TextNode;
import androidx.appsearch.ast.operators.AndNode;
import androidx.appsearch.ast.operators.OrNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import org.junit.Rule;
import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/PropertyRestrictNodeTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/PropertyRestrictNodeTest.java
index 806e317..1e3fc4e 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/PropertyRestrictNodeTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/operators/PropertyRestrictNodeTest.java
@@ -24,10 +24,10 @@
import androidx.appsearch.ast.Node;
import androidx.appsearch.ast.TextNode;
import androidx.appsearch.ast.operators.PropertyRestrictNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import org.junit.Rule;
import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/GetSearchStringParameterNodeCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/GetSearchStringParameterNodeCtsTest.java
index 3628fe2..b564377 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/GetSearchStringParameterNodeCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/GetSearchStringParameterNodeCtsTest.java
@@ -21,10 +21,10 @@
import static org.junit.Assert.assertThrows;
import androidx.appsearch.ast.query.GetSearchStringParameterNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import org.junit.Rule;
import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/HasPropertyNodeCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/HasPropertyNodeCtsTest.java
index 345081f..4d77b00 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/HasPropertyNodeCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/HasPropertyNodeCtsTest.java
@@ -22,10 +22,10 @@
import androidx.appsearch.app.PropertyPath;
import androidx.appsearch.ast.query.HasPropertyNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import org.junit.Rule;
import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/PropertyDefinedNodeCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/PropertyDefinedNodeCtsTest.java
index a4cd6ba..1b7901f 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/PropertyDefinedNodeCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/PropertyDefinedNodeCtsTest.java
@@ -22,10 +22,10 @@
import androidx.appsearch.app.PropertyPath;
import androidx.appsearch.ast.query.PropertyDefinedNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import org.junit.Rule;
import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/SearchNodeCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/SearchNodeCtsTest.java
index 041af4e..14559e6 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/SearchNodeCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/SearchNodeCtsTest.java
@@ -24,10 +24,10 @@
import androidx.appsearch.ast.Node;
import androidx.appsearch.ast.TextNode;
import androidx.appsearch.ast.query.SearchNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import org.junit.Rule;
import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/SemanticSearchNodeCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/SemanticSearchNodeCtsTest.java
index b76f036..c532d57 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/SemanticSearchNodeCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/query/SemanticSearchNodeCtsTest.java
@@ -22,10 +22,10 @@
import androidx.appsearch.app.SearchSpec;
import androidx.appsearch.ast.query.SemanticSearchNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import org.junit.Rule;
import org.junit.Test;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/searchtest/AbstractSyntaxTreeSearchCtsTestBase.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/searchtest/AbstractSyntaxTreeSearchCtsTestBase.java
index 8fb2cd9..1eead7f 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/searchtest/AbstractSyntaxTreeSearchCtsTestBase.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/searchtest/AbstractSyntaxTreeSearchCtsTestBase.java
@@ -48,11 +48,11 @@
import androidx.appsearch.ast.query.PropertyDefinedNode;
import androidx.appsearch.ast.query.SearchNode;
import androidx.appsearch.ast.query.SemanticSearchNode;
-import androidx.appsearch.flags.CheckFlagsRule;
-import androidx.appsearch.flags.DeviceFlagsValueProvider;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
import androidx.appsearch.testutil.AppSearchEmail;
+import androidx.appsearch.testutil.flags.CheckFlagsRule;
+import androidx.appsearch.testutil.flags.DeviceFlagsValueProvider;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import com.google.common.util.concurrent.ListenableFuture;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/searchtest/AbstractSyntaxTreeSearchLocalCtsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/searchtest/AbstractSyntaxTreeSearchLocalCtsTest.java
index d7620a2..88775a7 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/searchtest/AbstractSyntaxTreeSearchLocalCtsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/cts/ast/searchtest/AbstractSyntaxTreeSearchLocalCtsTest.java
@@ -22,8 +22,8 @@
import androidx.annotation.NonNull;
import androidx.appsearch.app.AppSearchSession;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
import androidx.appsearch.localstorage.LocalStorage;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import androidx.test.core.app.ApplicationProvider;
import com.google.common.util.concurrent.ListenableFuture;
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/FlagsTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/FlagsTest.java
index 6c7023a..bd8d8ac 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/FlagsTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/flags/FlagsTest.java
@@ -35,8 +35,10 @@
@Test
public void testFlagValue_enableListFilterMatchScoreExpressionFunction() {
- assertThat(Flags.FLAG_ENABLE_LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION).isEqualTo(
- "com.android.appsearch.flags.enable_list_filter_match_score_expression_function");
+ assertThat(Flags.FLAG_ENABLE_LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION)
+ .isEqualTo(
+ "com.android.appsearch"
+ + ".flags.enable_list_filter_match_score_expression_function");
}
@Test
diff --git a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/safeparcel/GenericDocumentParcelTest.java b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/safeparcel/GenericDocumentParcelTest.java
index 0a463e9..c6e1304 100644
--- a/appsearch/appsearch/src/androidTest/java/androidx/appsearch/safeparcel/GenericDocumentParcelTest.java
+++ b/appsearch/appsearch/src/androidTest/java/androidx/appsearch/safeparcel/GenericDocumentParcelTest.java
@@ -28,7 +28,7 @@
import androidx.appsearch.app.AppSearchBlobHandle;
import androidx.appsearch.app.EmbeddingVector;
import androidx.appsearch.flags.Flags;
-import androidx.appsearch.flags.RequiresFlagsEnabled;
+import androidx.appsearch.testutil.flags.RequiresFlagsEnabled;
import org.junit.Test;
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSchema.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSchema.java
index 4918ecf..e5860c7 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSchema.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSchema.java
@@ -1588,9 +1588,8 @@
@ExperimentalAppSearchApi
@FlaggedApi(Flags.FLAG_ENABLE_SCORABLE_PROPERTY)
@NonNull
- public BooleanPropertyConfig.Builder setScoringEnabled(
- boolean ScoringEnabled) {
- mScoringEnabled = ScoringEnabled;
+ public BooleanPropertyConfig.Builder setScoringEnabled(boolean scoringEnabled) {
+ mScoringEnabled = scoringEnabled;
return this;
}
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSession.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSession.java
index b9fe4d4..a28a3a5 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSession.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/AppSearchSession.java
@@ -176,6 +176,11 @@
* {@link AppSearchResult} with error code {@link AppSearchResult#RESULT_ALREADY_EXISTS} will be
* associated with the {@link AppSearchBlobHandle}.
*
+ * <p>If the blob content doesn't match the digest in {@link AppSearchBlobHandle}, a failed
+ * {@link AppSearchResult} with error code {@link AppSearchResult#RESULT_INVALID_ARGUMENT} will
+ * be associated with the {@link AppSearchBlobHandle}. The pending Blob file will be removed
+ * from AppSearch.
+ *
* <p> Pending blobs won't be lost or auto-commit if {@link AppSearchSession} closed.
* Pending blobs will store in disk rather than memory. You can re-open {@link AppSearchSession}
* and re-write the pending blobs.
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/CommitBlobResponse.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/CommitBlobResponse.java
index d363476..a95508f 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/CommitBlobResponse.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/CommitBlobResponse.java
@@ -20,7 +20,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
-import androidx.appsearch.app.aidl.AppSearchBatchResultGeneralKeyParcel;
+import androidx.appsearch.app.aidl.AppSearchBatchResultParcelV2;
import androidx.appsearch.flags.FlaggedApi;
import androidx.appsearch.flags.Flags;
import androidx.appsearch.safeparcel.AbstractSafeParcelable;
@@ -46,19 +46,19 @@
new CommitBlobResponseCreator();
@Field(id = 1, getter = "getResponseParcel")
- private final AppSearchBatchResultGeneralKeyParcel<AppSearchBlobHandle, Void> mResultParcel;
+ private final AppSearchBatchResultParcelV2<AppSearchBlobHandle, Void> mResultParcel;
/**
* Creates a {@link CommitBlobResponse} with given {@link AppSearchBatchResult}.
*/
public CommitBlobResponse(
@NonNull AppSearchBatchResult<AppSearchBlobHandle, Void> result) {
- this(AppSearchBatchResultGeneralKeyParcel.fromBlobHandleToVoid(result));
+ this(AppSearchBatchResultParcelV2.fromBlobHandleToVoid(result));
}
@Constructor
CommitBlobResponse(
- @Param(id = 1) @NonNull AppSearchBatchResultGeneralKeyParcel<AppSearchBlobHandle, Void>
+ @Param(id = 1) @NonNull AppSearchBatchResultParcelV2<AppSearchBlobHandle, Void>
resultParcel) {
mResultParcel = Preconditions.checkNotNull(resultParcel);
}
@@ -83,7 +83,7 @@
*/
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@NonNull
- public AppSearchBatchResultGeneralKeyParcel<AppSearchBlobHandle, Void> getResponseParcel() {
+ public AppSearchBatchResultParcelV2<AppSearchBlobHandle, Void> getResponseParcel() {
return mResultParcel;
}
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/Features.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/Features.java
index 08b6ceb..7f6c575 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/Features.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/Features.java
@@ -127,6 +127,7 @@
* <p>For details on the "matchScoreExpression" function in the query language, see
* {@link AppSearchSession#search}.
*/
+ @ExperimentalAppSearchApi
String LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION =
FeatureConstants.LIST_FILTER_MATCH_SCORE_EXPRESSION_FUNCTION;
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/OpenBlobForReadResponse.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/OpenBlobForReadResponse.java
index 95bbdad..3bf2cd9 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/OpenBlobForReadResponse.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/OpenBlobForReadResponse.java
@@ -20,7 +20,7 @@
import android.os.Parcelable;
import androidx.annotation.NonNull;
-import androidx.appsearch.app.aidl.AppSearchBatchResultGeneralKeyParcel;
+import androidx.appsearch.app.aidl.AppSearchBatchResultParcelV2;
import androidx.appsearch.flags.FlaggedApi;
import androidx.appsearch.flags.Flags;
import androidx.appsearch.safeparcel.AbstractSafeParcelable;
@@ -56,7 +56,7 @@
new OpenBlobForReadResponseCreator();
@Field(id = 1)
- final AppSearchBatchResultGeneralKeyParcel<AppSearchBlobHandle, ParcelFileDescriptor>
+ final AppSearchBatchResultParcelV2<AppSearchBlobHandle, ParcelFileDescriptor>
mResultParcel;
/**
@@ -64,13 +64,13 @@
*/
public OpenBlobForReadResponse(
@NonNull AppSearchBatchResult<AppSearchBlobHandle, ParcelFileDescriptor> result) {
- this(AppSearchBatchResultGeneralKeyParcel.fromBlobHandleToPfd(result));
+ this(AppSearchBatchResultParcelV2.fromBlobHandleToPfd(result));
}
@Constructor
OpenBlobForReadResponse(
@AbstractSafeParcelable.Param(id = 1)
- @NonNull AppSearchBatchResultGeneralKeyParcel<AppSearchBlobHandle, ParcelFileDescriptor>
+ @NonNull AppSearchBatchResultParcelV2<AppSearchBlobHandle, ParcelFileDescriptor>
resultParcel) {
mResultParcel = Preconditions.checkNotNull(resultParcel);
}
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/OpenBlobForWriteResponse.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/OpenBlobForWriteResponse.java
index 1ee1b0a..935e473 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/OpenBlobForWriteResponse.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/OpenBlobForWriteResponse.java
@@ -20,7 +20,7 @@
import android.os.Parcelable;
import androidx.annotation.NonNull;
-import androidx.appsearch.app.aidl.AppSearchBatchResultGeneralKeyParcel;
+import androidx.appsearch.app.aidl.AppSearchBatchResultParcelV2;
import androidx.appsearch.flags.FlaggedApi;
import androidx.appsearch.flags.Flags;
import androidx.appsearch.safeparcel.AbstractSafeParcelable;
@@ -56,7 +56,7 @@
new OpenBlobForWriteResponseCreator();
@Field(id = 1)
- final AppSearchBatchResultGeneralKeyParcel<AppSearchBlobHandle, ParcelFileDescriptor>
+ final AppSearchBatchResultParcelV2<AppSearchBlobHandle, ParcelFileDescriptor>
mResultParcel;
/**
@@ -64,13 +64,13 @@
*/
public OpenBlobForWriteResponse(
@NonNull AppSearchBatchResult<AppSearchBlobHandle, ParcelFileDescriptor> result) {
- this(AppSearchBatchResultGeneralKeyParcel.fromBlobHandleToPfd(result));
+ this(AppSearchBatchResultParcelV2.fromBlobHandleToPfd(result));
}
@Constructor
OpenBlobForWriteResponse(
@AbstractSafeParcelable.Param(id = 1)
- @NonNull AppSearchBatchResultGeneralKeyParcel<AppSearchBlobHandle, ParcelFileDescriptor>
+ @NonNull AppSearchBatchResultParcelV2<AppSearchBlobHandle, ParcelFileDescriptor>
resultParcel) {
mResultParcel = Preconditions.checkNotNull(resultParcel);
}
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/SearchResult.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/SearchResult.java
index 736b84e..c2f447f5 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/SearchResult.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/SearchResult.java
@@ -95,8 +95,8 @@
* <p>All schema names in this map are un-prefixed, for both keys and values.
*/
@NonNull
- @Field(id = 8, getter = "getParentTypeMap")
- private final Bundle mParentTypeMap;
+ @Field(id = 8)
+ final Bundle mParentTypeMap;
/** Cache of the {@link GenericDocument}. Comes from mDocument at first use. */
@@ -454,14 +454,18 @@
* <p>The map should include entries for the {@link GenericDocument}'s own type and all
* of the nested documents' types.
*
- * <p>Child types must appear before parent types in each list. Otherwise, the
* <!--@exportToFramework:ifJetpack()-->
- * {@link GenericDocument#toDocumentClass(java.lang.Class, DocumentClassMappingContext)}
- * <!--@exportToFramework:else()
- * GenericDocument's toDocumentClass
- * -->
+ * <p>Child types must appear before parent types in each list. Otherwise, the
+ * {@link GenericDocument#toDocumentClass(java.lang.Class, DocumentClassMappingContext)}
* method may not correctly identify the most concrete type. This could lead to unintended
* deserialization into a more general type instead of a more specific type.
+ * <!--@exportToFramework:else()
+ * <p>Child types must appear before parent types in each list. Otherwise, the
+ * GenericDocument's toDocumentClass method (an AndroidX-only API) may not correctly
+ * identify the most concrete type. This could lead to unintended deserialization into a
+ * more general type instead of a
+ * more specific type.
+ * -->
*
* <p>Parent types should include transitive parents.
*/
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/app/aidl/AppSearchBatchResultGeneralKeyParcel.java b/appsearch/appsearch/src/main/java/androidx/appsearch/app/aidl/AppSearchBatchResultParcelV2.java
similarity index 74%
rename from appsearch/appsearch/src/main/java/androidx/appsearch/app/aidl/AppSearchBatchResultGeneralKeyParcel.java
rename to appsearch/appsearch/src/main/java/androidx/appsearch/app/aidl/AppSearchBatchResultParcelV2.java
index 238f9c7..980aae7 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/app/aidl/AppSearchBatchResultGeneralKeyParcel.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/app/aidl/AppSearchBatchResultParcelV2.java
@@ -26,40 +26,40 @@
import androidx.core.util.Preconditions;
/**
- * A dummy version of AppSearchBatchResultGeneralKeyParcel in jetpack.
+ * A dummy version of AppSearchBatchResultParcelV2 in jetpack.
* @param <KeyType> The type of keys in the batch result, such as {@link AppSearchBlobHandle}.
* @param <ValueType> The type of values in the batch result, such as {@link ParcelFileDescriptor}
*/
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@ExperimentalAppSearchApi
-public final class AppSearchBatchResultGeneralKeyParcel<KeyType, ValueType> {
+public final class AppSearchBatchResultParcelV2<KeyType, ValueType> {
private final AppSearchBatchResult<KeyType, ValueType> mResult;
- private AppSearchBatchResultGeneralKeyParcel(
+ private AppSearchBatchResultParcelV2(
@NonNull AppSearchBatchResult<KeyType, ValueType> result) {
mResult = Preconditions.checkNotNull(result);
}
/**
- * Creates an instance of {@link AppSearchBatchResultGeneralKeyParcel} with key type
+ * Creates an instance of {@link AppSearchBatchResultParcelV2} with key type
* {@link AppSearchBlobHandle} and value type {@link ParcelFileDescriptor}.
*/
@NonNull
- public static AppSearchBatchResultGeneralKeyParcel<AppSearchBlobHandle, ParcelFileDescriptor>
+ public static AppSearchBatchResultParcelV2<AppSearchBlobHandle, ParcelFileDescriptor>
fromBlobHandleToPfd(
@NonNull AppSearchBatchResult<AppSearchBlobHandle, ParcelFileDescriptor> result) {
- return new AppSearchBatchResultGeneralKeyParcel<>(result);
+ return new AppSearchBatchResultParcelV2<>(result);
}
/**
- * Creates an instance of {@link AppSearchBatchResultGeneralKeyParcel} with key type
+ * Creates an instance of {@link AppSearchBatchResultParcelV2} with key type
* {@link AppSearchBlobHandle} and value type {@link Void}.
*/
@NonNull
- public static AppSearchBatchResultGeneralKeyParcel<AppSearchBlobHandle, Void>
+ public static AppSearchBatchResultParcelV2<AppSearchBlobHandle, Void>
fromBlobHandleToVoid(
@NonNull AppSearchBatchResult<AppSearchBlobHandle, Void> result) {
- return new AppSearchBatchResultGeneralKeyParcel<>(result);
+ return new AppSearchBatchResultParcelV2<>(result);
}
/** Returns the wrapped batch result. */
diff --git a/appsearch/appsearch/src/main/java/androidx/appsearch/safeparcel/PropertyConfigParcel.java b/appsearch/appsearch/src/main/java/androidx/appsearch/safeparcel/PropertyConfigParcel.java
index 17bc08c..4ee703f 100644
--- a/appsearch/appsearch/src/main/java/androidx/appsearch/safeparcel/PropertyConfigParcel.java
+++ b/appsearch/appsearch/src/main/java/androidx/appsearch/safeparcel/PropertyConfigParcel.java
@@ -388,7 +388,7 @@
mJoinableConfigParcel, otherProperty.mJoinableConfigParcel)
&& ObjectsCompat.equals(
mEmbeddingIndexingConfigParcel, otherProperty.mEmbeddingIndexingConfigParcel)
- && ObjectsCompat.equals(mScoringEnabled, otherProperty.mScoringEnabled);
+ && mScoringEnabled == otherProperty.mScoringEnabled;
}
@Override
@@ -483,8 +483,7 @@
}
JoinableConfigParcel otherObject = (JoinableConfigParcel) other;
return ObjectsCompat.equals(mJoinableValueType, otherObject.mJoinableValueType)
- && ObjectsCompat.equals(
- mDeletePropagationType, otherObject.mDeletePropagationType);
+ && mDeletePropagationType == otherObject.mDeletePropagationType;
}
@Override
@@ -550,7 +549,7 @@
return false;
}
StringIndexingConfigParcel otherObject = (StringIndexingConfigParcel) other;
- return ObjectsCompat.equals(mIndexingType, otherObject.mIndexingType)
+ return mIndexingType == otherObject.mIndexingType
&& ObjectsCompat.equals(mTokenizerType, otherObject.mTokenizerType);
}
@@ -605,7 +604,7 @@
return false;
}
IntegerIndexingConfigParcel otherObject = (IntegerIndexingConfigParcel) other;
- return ObjectsCompat.equals(mIndexingType, otherObject.mIndexingType);
+ return mIndexingType == otherObject.mIndexingType;
}
@Override
@@ -739,8 +738,8 @@
return false;
}
EmbeddingIndexingConfigParcel otherObject = (EmbeddingIndexingConfigParcel) other;
- return ObjectsCompat.equals(mIndexingType, otherObject.mIndexingType)
- && ObjectsCompat.equals(mQuantizationType, otherObject.mQuantizationType);
+ return mIndexingType == otherObject.mIndexingType
+ && mQuantizationType == otherObject.mQuantizationType;
}
@Override
diff --git a/appsearch/exportToFramework.py b/appsearch/exportToFramework.py
index c23398a..eb6423d 100755
--- a/appsearch/exportToFramework.py
+++ b/appsearch/exportToFramework.py
@@ -209,13 +209,13 @@
def _TransformTestCode(self, contents):
contents = (contents
.replace(
- 'androidx.appsearch.flags.CheckFlagsRule',
+ 'androidx.appsearch.testutil.CheckFlagsRule',
'android.platform.test.flag.junit.CheckFlagsRule')
.replace(
- 'androidx.appsearch.flags.DeviceFlagsValueProvider',
+ 'androidx.appsearch.testutil.DeviceFlagsValueProvider',
'android.platform.test.flag.junit.DeviceFlagsValueProvider')
.replace(
- 'androidx.appsearch.flags.RequiresFlagsEnabled',
+ 'androidx.appsearch.testutil.RequiresFlagsEnabled',
'android.platform.test.annotations.RequiresFlagsEnabled')
.replace('androidx.appsearch.testutil.', 'android.app.appsearch.testutil.')
.replace(
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-af/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-af/strings.xml
index 352c09a..f3ec77f 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-af/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-af/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Net die sekondêre handeling kan gekies word"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Versieringtoets"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekondêre handelinge en versiering"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Ry met sekondêre handelinge en versiering wat ’n baie lang titel het"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Die ry kan ook gekies word"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Sekondêre handeling is gekies"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Primêre handeling vir ry is gekies"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-am/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-am/strings.xml
index c177f54..2e43ab6 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-am/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-am/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"መመረጥ የሚችለው ሁለተኛው እርምጃ ብቻ ነው"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"የማስዋቢያ ሙከራ"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"ሁለተኛ እርምጃዎች እና ማስዋብ"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"ሁለተኛ እርምጃዎች ያሉት ረድፍ እና በጣም ረዥም ርዕስ ያለው ማስዋቢያ"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"እንዲሁም ረድፉ መመረጥ ይችላል"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"ሁለተኛ እርምጃ ተመርጧል"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"የረድፍ አንደኛ እርምጃ ተመርጧል"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ar/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ar/strings.xml
index 5bd36dd..f6fb1cc 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ar/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ar/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"يمكن اختيار الإجراء الثانوي فقط."</string>
<string name="decoration_test_title" msgid="8450127046762442244">"تصميم تجريبي"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"الإجراءات الثانوية والتصميم"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"صف يتضمن \"الإجراءات الثانوية\" و\"التصميم\" وله عنوان طويل جدًا"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"يمكن أيضًا اختيار الصف."</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"تم اختيار إجراء ثانوي للصف."</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"تم اختيار إجراء أساسي للصف."</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-as/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-as/strings.xml
index f4e9b53..548a2ee 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-as/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-as/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"কেৱল গৌণ কাৰ্যটোও বাছনি কৰিব পৰা যায়"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"সজোৱা কাৰ্য"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"গৌণ কাৰ্য আৰু সজোৱা কাৰ্য"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"এটা সঁচাকৈয়ে দীঘল শিৰোনামৰ সৈতে গৌণ কাৰ্য আৰু সজোৱা কাৰ্যসমূহ থকা শাৰী"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"শাৰীটোও বাছনি কৰিব পৰা যায়"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"গৌণ কাৰ্য বাছনি কৰা হৈছে"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"শাৰীৰ প্ৰাথমিক কাৰ্য বাছনি কৰা হৈছে"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-az/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-az/strings.xml
index a165ae5..757edef 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-az/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-az/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Yalnız ikinci dərəcəli əməliyyat seçilə bilər"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Dekorasiya Testi"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"İkinci Dərəcəli Əməliyyatlar və Dekorasiya"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Həqiqətən uzun başlığa sahib İkincil Fəaliyyətlər və Dekorasiya olan sətir"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Sıra da seçilə bilər"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"İkinci Dərəcəli Əməliyyat seçilib"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Sıra üzrə əsas əməliyyat seçilib"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-b+sr+Latn/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-b+sr+Latn/strings.xml
index 072729c..3e1a9ed 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-b+sr+Latn/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-b+sr+Latn/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Može da se izabere samo sekundarna radnja"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Test dekoracije"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekundarne radnje i dekoracija"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Red sa sekundarnim radnjama i dekoracijom sa veoma dugim naslovom"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Može da se izabere i red"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Sekundarna radnja je izabrana"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Primarna radnja reda je izabrana"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-be/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-be/strings.xml
index b070966..9d37bb1 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-be/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-be/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Можна выбраць толькі другаснае дзеянне"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Тэст элементаў аздаблення"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Другасныя дзеянні і аздабленне"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Радок з другаснымі дзеяннямі і аздабленнем з вельмі доўгай назвай"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Таксама можна выбраць радок"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Выбрана другаснае дзеянне"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Выбрана галоўнае дзеянне для радка"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-bg/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-bg/strings.xml
index e4604b0..9d1ac46 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-bg/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-bg/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Само алтернативното действие може да бъде избрано"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Тестване на декоративен елемент"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Алтернативни действия и декоративни елементи"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Ред с алтернативни действия и декоративни елементи с много дълго заглавие"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Редът може също да бъде избран"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Избрано е алтернативното действие"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Избрано е основното действие за реда"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-bn/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-bn/strings.xml
index 0e64f6b..a5a729b 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-bn/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-bn/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"শুধুমাত্র সেকেন্ডারি অ্যাকশন বেছে নেওয়া যেতে পারে"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"ডেকরেশন টেস্ট"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"সেকেন্ডারি অ্যাকশন ও ডেকরেশন"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"সেকেন্ডারি অ্যাকশন ও ডেকরেশনের দীর্ঘ টাইটেল আছে এমন সারি"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"সারিও বেছে নেওয়া যেতে পারে"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"সেকেন্ডারি অ্যাকশন বেছে নেওয়া হয়েছে"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"সারির প্রাইমারি অ্যাকশন বেছে নেওয়া হয়েছে"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-bs/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-bs/strings.xml
index fa47207..d1ac68f 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-bs/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-bs/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Moguće je odabrati samo sekundarnu radnju"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Test dekoracije"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekundarne radnje i dekoracija"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Red sa sekundarnim radnjama i dekoracijom s veoma dugim naslovom"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Moguće je odabrati i red"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Odabrana je sekundarna radnja"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Odabrana je primarna radnja reda"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ca/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ca/strings.xml
index 17ceb5b..e25a8de 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ca/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ca/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Només es pot seleccionar l\'acció secundària"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Prova de decoració"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Accions secundàries i decoració"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Fila amb accions secundàries i decoració amb un títol molt llarg"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"La fila també es pot seleccionar"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"S\'ha seleccionat l\'acció secundària"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"S\'ha seleccionat l\'acció principal de la fila"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-cs/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-cs/strings.xml
index 5657fa0..9618bca 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-cs/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-cs/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Lze vybrat pouze sekundární akci"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Zkouška dekorace"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekundární akce a dekorace"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Řádek se sekundárními akcemi a dekorace s opravdu dlouhým názvem"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Řádek lze také vybrat"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Je vybrána sekundární akce"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Je vybrána primární akce řádku"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-da/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-da/strings.xml
index 0c962df..721a67a 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-da/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-da/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Det er kun den sekundære handling, der kan vælges"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Dekorationstest"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekundære handlinger og dekoration"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Række med sekundære handlinger og dekoration med en meget lang titel"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Rækken kan også vælges"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Sekundær handling er valgt"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Primær handling for rækken er valgt"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-de/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-de/strings.xml
index 68c8836..2cb4991 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-de/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-de/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Nur die sekundäre Aktion kann ausgewählt werden"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Dekorationstest"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekundäre Aktionen und Dekoration"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Zeile mit sekundären Aktionen und Dekoration mit einem sehr langen Titel"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Auch diese Zeile kann ausgewählt werden"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Sekundäre Aktion ist ausgewählt"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Zeile mit der primären Aktion ist ausgewählt"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-el/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-el/strings.xml
index 0461d8d..053faa4 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-el/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-el/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Μόνο η δευτερεύουσα ενέργεια μπορεί να επιλεγεί"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Δοκιμή διακόσμησης"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Δευτερεύουσες ενέργειες και διακόσμηση"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Σειρά με δευτερεύουσες ενέργειες και διακόσμηση με πολύ μεγάλο τίτλο"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Η σειρά μπορεί επίσης να επιλεγεί"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Επιλέχθηκε η δευτερεύουσα ενέργεια σειράς"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Επιλέχθηκε η κύρια ενέργεια σειράς"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-en-rAU/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-en-rAU/strings.xml
index 39f6518..63d6e89 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-en-rAU/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-en-rAU/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Only the secondary action can be selected"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Decoration test"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Secondary actions and decoration"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Row with Secondary Actions and Decoration with a really long title"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"The row can also be selected"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Secondary action is selected"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Row primary action is selected"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-en-rGB/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-en-rGB/strings.xml
index 39f6518..63d6e89 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-en-rGB/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-en-rGB/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Only the secondary action can be selected"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Decoration test"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Secondary actions and decoration"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Row with Secondary Actions and Decoration with a really long title"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"The row can also be selected"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Secondary action is selected"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Row primary action is selected"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-en-rIN/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-en-rIN/strings.xml
index 39f6518..63d6e89 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-en-rIN/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-en-rIN/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Only the secondary action can be selected"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Decoration test"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Secondary actions and decoration"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Row with Secondary Actions and Decoration with a really long title"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"The row can also be selected"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Secondary action is selected"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Row primary action is selected"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-es-rUS/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-es-rUS/strings.xml
index 290e04a..cfeddbac 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-es-rUS/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-es-rUS/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Sólo puede seleccionarse la acción secundaria"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Prueba de decoración"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Acciones secundarias y decoraciones"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Fila con acciones secundarias y decoración con un título muy largo"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"También se puede seleccionar la fila"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Se seleccionó una acción secundaria"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Se seleccionó una acción de fila principal"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-es/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-es/strings.xml
index c21e4c6..2dffac1 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-es/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-es/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Solo se puede seleccionar la acción secundaria"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Prueba de decoración"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Acciones secundarias y decoración"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Fila con acciones secundarias y decoración con un título muy largo"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"También se puede seleccionar la fila"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Se ha seleccionado la acción secundaria"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Se ha seleccionado la acción principal de la fila"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-et/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-et/strings.xml
index fd8b184..8e69ee8 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-et/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-et/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Valida saab ainult teisese toimingu"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Dekoratsiooni test"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Teisesed toimingud ja dekoratsioon"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Rida tõeliselt pika pealkirjaga teiseste toimingute ja dekoratsiooniga"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Rea saab samuti valida"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Valitud on teisene toiming"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Valitud on rea peamine toiming"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-eu/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-eu/strings.xml
index e09a079..07c63dc 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-eu/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-eu/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Bigarren mailako ekintza soilik hauta daiteke"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Apainketaren proba"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Bigarren mailako ekintzak eta apainketa"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Bigarren mailako ekintzak eta apainketak dituen errenkada, oso izen luzearekin"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Errenkada ere hauta daiteke"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Bigarren mailako ekintza hautatuta dago"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Errenkadari dagokion ekintza nagusia hautatuta dago"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-fa/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-fa/strings.xml
index e839771..e15e53f 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-fa/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-fa/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"فقط کنش فرعی را میتوان انتخاب کرد"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"آزمایش آرایهگری"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"کنشهای فرعی و آرایهگری"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"ردیفی با «کنشهای فرعی» و «آرایهگری» با عنوان بسیار طولانی"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"ردیف را هم میتوان انتخاب کرد"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"کنش فرعی انتخاب شده است"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"کنش اصلی ردیف انتخاب شده است"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-fi/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-fi/strings.xml
index 8bde3c0..a2fe340 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-fi/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-fi/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Voit valita vain toissijaisen toiminnon"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Kuviotesti"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Toissijaiset toiminnot ja kuvio"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Rivi, jossa on toissijaiset toiminnot ja kuvio, jolla on todella pitkä nimi"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Voit valita myös rivin"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Toissijainen toiminto on valittu"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Rivin ensisijainen toiminto on valittu"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-fr-rCA/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-fr-rCA/strings.xml
index badf7e0..43192a4 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-fr-rCA/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-fr-rCA/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Seule l\'action secondaire peut être sélectionnée"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Test de décoration"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Actions secondaires et décoration"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Rangée avec Actions secondaires et Décoration avec un titre très long"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Cette ligne peut également être sélectionnée"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"L\'action secondaire est sélectionnée"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"L\'action primaire de la ligne est sélectionnée"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-fr/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-fr/strings.xml
index e4d2a31..f497c3f 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-fr/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-fr/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Seule l\'action secondaire peut être sélectionnée"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Test de la décoration"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Actions secondaires et décoration"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Ligne contenant des actions secondaires et une décoration comportant un titre très long"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"La ligne peut également être sélectionnée"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"L\'action secondaire est sélectionnée"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"L\'action principale de la ligne est sélectionnée"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-gl/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-gl/strings.xml
index f624e35..3b68f403 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-gl/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-gl/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Só se pode seleccionar a acción secundaria"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Proba de decoración"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Accións secundarias e decoración"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Fila con accións secundarias e decoración cun título moi longo"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Tamén se pode seleccionar a fila"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Seleccionouse a acción secundaria"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Seleccionouse a acción principal da fila"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-gu/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-gu/strings.xml
index a8fc6b4..9a42507 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-gu/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-gu/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"માત્ર ગૌણ ઍક્શન પસંદ કરી શકાય છે"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"ડેકોરેશન પરીક્ષણ"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"ગૌણ ઍક્શન અને ડેકોરેશન"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"સેકન્ડરી ઍક્શન અને ડેકોરેશનની ઘણા લાંબા શીર્ષકવાળી પંક્તિ"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"પંક્તિ પણ પસંદ કરી શકાય છે"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"ગૌણ ઍક્શન પસંદ કરી"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"પ્રાથમિક ઍક્શન પંક્તિ પસંદ કરી"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-hi/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-hi/strings.xml
index ebda291..bbee798 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-hi/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-hi/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"सिर्फ़ सेकंडरी ऐक्शन को चुना जा सकता है"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"डेकोरेशन टेस्ट"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"सेकंडरी ऐक्शन और डेकोरेशन"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"सेकंडरी ऐक्शन और डेकोरेशन के लंबे टाइटल वाली लाइन"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"पंक्ति को भी चुना जा सकता है"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"सेकंडरी ऐक्शन चुना गया"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"पंक्ति से जुड़ा प्राइमरी ऐक्शन चुना गया"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-hr/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-hr/strings.xml
index fd52ccae..770e9db 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-hr/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-hr/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Može se odabrati samo sekundarna radnja"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Test dekoracije"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekundarne radnje i dekoracija"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Redak sa sekundarnim radnjama i dekoracijom s vrlo dugim naslovom"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Može se odabrati i redak"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Odabrana je sekundarna radnja"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Odabran je redak primarne radnje"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-hu/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-hu/strings.xml
index 46d3c07..f17a127 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-hu/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-hu/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Csak a másodlagos művelet választható ki"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Dekoráció tesztelése"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Másodlagos műveletek és dekorációk"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Másodlagos műveletekkel és dekorációval rendelkező sor nagyon hosszú címmel"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"A sor is kiválasztható"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Másodlagos művelet kiválasztva"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Sor elsődleges művelete kiválasztva"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-in/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-in/strings.xml
index bb53c17..f38edf5 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-in/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-in/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Hanya tindakan sekunder yang dapat dipilih"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Pengujian Dekorasi"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Tindakan Sekunder dan Dekorasi"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Baris dengan Tindakan Sekunder dan Dekorasi dengan judul yang sangat panjang"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Baris juga dapat dipilih"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Tindakan Sekunder dipilih"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Tindakan utama baris dipilih"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-is/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-is/strings.xml
index f2d4365..b0f3d7f 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-is/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-is/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Aðeins er hægt að velja aukaaðgerð"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Prufuskreyting"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Aukaaðgerðir og skreyting"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Lína með aukaaðgerðum, skreytingum og mjög löngum titli"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Einnig er hægt að velja línuna"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Aukaaðgerð er valin"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Aðalaðgerð línu er valin"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-it/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-it/strings.xml
index 8d06a75..4aa203d 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-it/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-it/strings.xml
@@ -38,7 +38,7 @@
<string name="settings_action_title" msgid="8616900063253887861">"Impostazioni"</string>
<string name="accept_action_title" msgid="4899660585470647578">"Accetta"</string>
<string name="reject_action_title" msgid="6730366705938402668">"Rifiuta"</string>
- <string name="ok_action_title" msgid="7128494973966098611">"OK"</string>
+ <string name="ok_action_title" msgid="7128494973966098611">"Ok"</string>
<string name="throw_action_title" msgid="7163710562670220163">"Genera"</string>
<string name="commute_action_title" msgid="2585755255290185096">"Tragitto giornaliero"</string>
<string name="sign_out_action_title" msgid="1653943000866713010">"Esci"</string>
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Solo l\'azione secondaria può essere selezionata"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Test decorazione"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Azioni secondarie e decorazione"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Riga con Azioni secondarie e decorazione con un titolo molto lungo"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Anche la riga può essere selezionata"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"È stata selezionata l\'azione secondaria"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"È stata selezionata l\'azione principale della riga"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-iw/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-iw/strings.xml
index 9bd0fbd..1a89e7e9 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-iw/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-iw/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"ניתן לבחור רק את הפעולה המשנית"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"בדיקת עיצוב"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"פעולות משניות ועיצוב"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"שורה עם פעולות משניות ועיצוב עם כותרת ארוכה מאוד"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"ניתן לבחור גם את השורה"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"נבחרה פעולה משנית"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"נבחרה פעולה ראשית בשורה"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ka/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ka/strings.xml
index be42714..9ff7c3e 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ka/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ka/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"შესაძლებელია მხოლოდ მეორადი მოქმედების არჩევა"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"დეკორაციის ტესტი"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"მეორადი მოქმედებები და დეკორაცია"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"დამატებითი აქტივობების მწკრივი და გაფორმება ძალიან გრძელი სათაურით"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"ასევე შეიძლება მწკრივის არჩევა"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"არჩეულია მეორადი მოქმედება"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"არჩეულია მწკრივის პირველადი მოქმედება"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-kk/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-kk/strings.xml
index 7be8e7c..95d6393 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-kk/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-kk/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Қосымша әрекет қана таңдалады."</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Безендіруді сынау"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Қосымша әрекеттер және безендіру"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Қосымша әрекеттерден және декорациядан тұратын, ұзын тақырыпты жол"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Жолды да таңдауға болады."</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Қосымша әрекет таңдалды."</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Жол үшін негізгі әрекет таңдалды."</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-km/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-km/strings.xml
index a41d2e7..0eb3cfc 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-km/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-km/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"អាចជ្រើសរើសបានតែសកម្មភាពបន្ទាប់បន្សំប៉ុណ្ណោះ"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"តេស្តនៃការតុបតែង"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"ការតុបតែង និងសកម្មភាពបន្ទាប់បន្សំ"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"ជួរដេកដែលមានសកម្មភាពបន្ទាប់បន្សំ និងការតុបតែងដែលមានចំណងជើងវែងខ្លាំង"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"ជួរដេកក៏អាចត្រូវបានជ្រើសរើសផងដែរ"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"សកម្មភាពបន្ទាប់បន្សំត្រូវបានជ្រើសរើស"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"សកម្មភាពចម្បងជួរដេកត្រូវបានជ្រើសរើស"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ko/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ko/strings.xml
index 1d27f9d..6da438e1 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ko/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ko/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"보조 작업만 선택할 수 있습니다."</string>
<string name="decoration_test_title" msgid="8450127046762442244">"장식 테스트"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"보조 작업 및 장식"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"제목이 매우 긴 보조 작업 및 장식이 있는 행"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"행도 선택할 수 있습니다."</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"보조 작업 선택됨"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"행 기본 작업 선택됨"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ky/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ky/strings.xml
index 3fbeef2..c54ddf8 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ky/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ky/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Кошумча аракетти гана тандоого болот"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Жасалгалоону сыноо"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Кошумча аракеттер жана Жасалгалоо"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Кошумча аракеттер жана Жасалгалоонун аталышы өтө узун болгон сап"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Сапты да тандоого болот"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Кошумча аракет тандалды"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Негизги аракет сабы тандалды"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-lo/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-lo/strings.xml
index cfc8724..76c1de3 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-lo/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-lo/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"ສາມາດເລືອກໄດ້ສະເພາະຄຳສັ່ງສຳຮອງເທົ່ານັ້ນ"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"ການທົດສອບການຕົກແຕ່ງ"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"ຄຳສັ່ງສຳຮອງ ແລະ ການຕົກແຕ່ງ"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"ແຖວທີ່ມີຄຳສັ່ງສຳຮອງ ແລະ ການຕົກແຕ່ງທີ່ມີຊື່ທີ່ຍາວຫຼາຍ"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"ນອກຈາກນັ້ນຍັງເລືອກແຖວໄດ້ນຳ"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"ເລືອກຄຳສັ່ງສຳຮອງຂອງແຖວແລ້ວ"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"ເລືອກຄຳສັ່ງຫຼັກຂອງແຖວແລ້ວ"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-lt/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-lt/strings.xml
index aa6e83c..b50c0f3 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-lt/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-lt/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Galima pasirinkti tik antrinį veiksmą"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Dekoracijų bandymas"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Antriniai veiksmai ir dekoracijos"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Eilutė su antriniais veiksmais ir dekoracijomis su tikrai ilgu pavadinimu"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Taip pat galima pasirinkti eilutę"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Pasirinktas antrinis veiksmas"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Pasirinktas pagrindinis eilutės veiksmas"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-lv/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-lv/strings.xml
index b7c3701..33a267e 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-lv/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-lv/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Atlasīt var tikai sekundāro darbību"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Noformējuma tests"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekundārās darbības un noformējums"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Rindiņa ar sekundārajām darbībām un noformējumu, kam ir ļoti garš nosaukums"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Arī rindu var atlasīt"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Atlasīta sekundārā darbība"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Atlasīta rindas primārā darbība"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-mk/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-mk/strings.xml
index a65e36e..9bbcfbf 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-mk/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-mk/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Само секундарното дејство може да се избере"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Проба за украсување"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Секундарни дејства и украсување"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Ред со секундарни дејства и украсување со навистина долг наслов"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Редот исто така може да се избере"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Избрано е секундарно дејство"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Избрано е примарно дејство на ред"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ml/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ml/strings.xml
index 2f1533f..4faf21d 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ml/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ml/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"സെക്കൻഡറി പ്രവർത്തനം മാത്രമേ തിരഞ്ഞെടുക്കാനാകൂ"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"ഡെക്കറേഷൻ ടെസ്റ്റ്"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"സെക്കൻഡറി പ്രവർത്തനങ്ങളും ഡെക്കറേഷനും"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"സെക്കൻഡറി നടപടികളുള്ള വരി, വളരെ നീളമുള്ള പേരുള്ള ഡെക്കറേഷൻ"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"വരിയും തിരഞ്ഞെടുക്കാവുന്നതാണ്"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"സെക്കൻഡറി പ്രവർത്തനം തിരഞ്ഞെടുത്തു"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"വരിയുടെ പ്രാഥമിക പ്രവർത്തനം തിരഞ്ഞെടുത്തു"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-mn/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-mn/strings.xml
index 8de303c..c5c466e 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-mn/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-mn/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Зөвхөн хоёрдогч үйлдлийг сонгох боломжтой"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Чимэглэлийн туршилт"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Хоёрдогч үйлдлүүд ба чимэглэл"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Хоёрдогч үйлдлүүд, маш урт нэртэй чимэглэлийн мөр"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Мөрийг мөн сонгож болно"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Хоёрдогч үйлдлийг сонгосон"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Мөрийн үндсэн үйлдлийг сонгосон"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ms/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ms/strings.xml
index 61380fa..fd7401d 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ms/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ms/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Hanya tindakan sekunder boleh dipilih"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Ujian Perhiasan"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Tindakan Sekunder dan Perhiasan"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Baris dengan Tindakan Kedua dan Hiasan dengan tajuk yang benar-benar panjang"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Baris ini juga boleh dipilih"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Tindakan Sekunder dipilih"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Tindakan utama baris dipilih"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-my/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-my/strings.xml
index 886009b..40f6d21 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-my/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-my/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"ဒုတိယဦးစားပေးလုပ်ဆောင်ချက်ကိုသာ ရွေးနိုင်သည်"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"တန်ဆာဆင်မှု စမ်းသပ်ခြင်း"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"ဒုတိယဦးစားပေးလုပ်ဆောင်ချက်များနှင့် တန်ဆာဆင်ခြင်း"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"ဒုတိယလုပ်ဆောင်ချက်များပါဝင်သည့် အတန်းနှင့် အမှန်တကယ်ရှည်သောခေါင်းစဉ်ဖြင့် အလှဆင်ခြင်း"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"အတန်းကိုလည်း ရွေးနိုင်သည်"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"ဒုတိယဦးစားပေး လုပ်ဆောင်ချက်ကို ရွေးထားသည်"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"အတန်း၏ ပထမဦးစားပေး လုပ်ဆောင်ချက်ကို ရွေးထားသည်"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-nb/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-nb/strings.xml
index 74d3248..2cc0a0a 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-nb/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-nb/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Bare sekundærhandlingen kan velges"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Dekorasjonstest"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekundærhandling og dekorasjon"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Rad med sekundærhandlinger og dekorasjon med en veldig lang tittel"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Raden kan også velges"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Sekundærhandlingen er valgt"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Hovedhandlingen til raden er valgt"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ne/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ne/strings.xml
index fa6b8bb..9ee2aac 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ne/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ne/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"सेकेन्डरी एक्सन मात्र चयन गर्न सकिन्छ"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"डेकोरेसन टेस्ट"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"सेकेन्डरी एक्सन तथा डेकोरेसन"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"गौण कार्य र सजावटसम्बन्धी वास्तवमै लामो शीर्षक भएको रो"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"रो पनि चयन गर्न सकिन्छ"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"सेकेन्डरी एक्सन चयन गरिएको छ"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"रोको प्राइमरी एक्सन चयन गरिएको छ"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-nl/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-nl/strings.xml
index f50a354..f56e84c 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-nl/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-nl/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Alleen de secundaire actie kan worden geselecteerd"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Test voor decoratie"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Secundaire acties en decoratie"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Rij met secundaire acties en decoratie met een heel lange titel"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"De rij kan ook worden geselecteerd"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Secundaire actie is geselecteerd"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Rij voor primaire actie is geselecteerd"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-or/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-or/strings.xml
index 8f69dde..f0413e9 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-or/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-or/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"କେବଳ ଦ୍ୱିତୀୟ କାର୍ଯ୍ୟକୁ ଚୟନ କରାଯାଇପାରିବ"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"ଡେକୋରେସନ ଟେଷ୍ଟ"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"ଦ୍ୱିତୀୟ କାର୍ଯ୍ୟ ଏବଂ ଡେକୋରେସନ"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"ପ୍ରକୃତରେ ଏକ ବଡ଼ ଟାଇଟେଲ ସହ ସେକେଣ୍ଡାରୀ ଆକ୍ସନ ଏବଂ ଡେକୋରେସନ ଥିବା ଧାଡ଼ି"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"ଏହି ଧାଡ଼ିଟିକୁ ମଧ୍ୟ ଚୟନ କରାଯାଇପାରିବ"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"ଦ୍ୱିତୀୟ କାର୍ଯ୍ୟ ଚୟନ କରାଯାଇଛି"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"ଧାଡ଼ିର ପ୍ରାଥମିକ କାର୍ଯ୍ୟ ଚୟନ କରାଯାଇଛି"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-pl/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-pl/strings.xml
index 9ad149a..2f48974 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-pl/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-pl/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Można wybrać tylko działanie alternatywne"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Test dekoracji"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Działania alternatywne i dekoracja"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Wiersz z działaniami alternatywnymi i dekoracją o bardzo długim tytule"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Można wybrać również wiersz"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Wybrano działanie alternatywne"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Wybrano wiersz z działaniem głównym"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-pt-rBR/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-pt-rBR/strings.xml
index fa55a9a..8f2bcc6 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-pt-rBR/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-pt-rBR/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Apenas a ação secundária pode ser selecionada"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Teste de decoração"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Ações secundárias e decoração"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Linha com ações secundárias e decoração com um título muito longo"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"A linha também pode ser selecionada"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"A ação secundária está selecionada"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"A ação principal da linha está selecionada"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-pt/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-pt/strings.xml
index fa55a9a..8f2bcc6 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-pt/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-pt/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Apenas a ação secundária pode ser selecionada"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Teste de decoração"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Ações secundárias e decoração"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Linha com ações secundárias e decoração com um título muito longo"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"A linha também pode ser selecionada"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"A ação secundária está selecionada"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"A ação principal da linha está selecionada"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ro/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ro/strings.xml
index 7233bfa..72b5c28 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ro/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ro/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Numai acțiunea secundară poate fi selectată"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Test pentru decorație"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Acțiuni secundare și decorație"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Rând cu acțiuni secundare și element decorativ cu un titlu foarte lung"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Și rândul poate fi selectat"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Acțiunea secundară a fost selectată"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Acțiunea principală de pe rând a fost selectată"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ru/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ru/strings.xml
index 157fa2a..9c88c83 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ru/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ru/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Можно выбрать только второстепенное действие"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Тест оформления"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Второстепенные действия и оформление"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Строка со второстепенными действиями и оформлением, у которых очень длинные названия"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Можно также выбрать строку"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Выбрано второстепенное действие."</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Выбрано главное действие для строки."</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-si/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-si/strings.xml
index fc5bbbb..9287572 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-si/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-si/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"ද්විතියික ක්රියාව පමණක් තෝරා ගත හැක"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"සැරසිලි පරීක්ෂණය"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"ද්විතියික ක්රියා සහ සැරසිලි"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"ද්විතීයික ක්රියා සහිත පේළිය සහ ඇත්තෙන්ම දිගු මාතෘකාවක් සහිත සැරසිලි"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"පේළිය ද තෝරා ගත හැක"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"ද්විතියික ක්රියාව තෝරා ඇත"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"පේළියේ මූලික ක්රියාව තෝරා ඇත"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-sk/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-sk/strings.xml
index a2d26f2..7722b84 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-sk/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-sk/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Vybrať sa dá iba sekundárna akcia"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Test dekorácie"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekundárne akcie a dekorácia"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Riadok so sekundárnymi akciami a dekoráciou s veľmi dlhým názvom"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Môžete vybrať aj daný riadok"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Bola vybraná sekundárna akcia"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Bola vybraná primárna akcia riadka"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-sq/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-sq/strings.xml
index 165afd2..3010d7d 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-sq/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-sq/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Mund të zgjidhet vetëm veprimi dytësor"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Testimi i dekorimit"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Veprimet dytësore dhe dekorimi"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Rreshti me veprimet dytësore dhe zbukurime me një titull vërtet të gjatë"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Rreshti mund të zgjidhet gjithashtu"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"U zgjodh veprimi dytësor"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"U zgjodh veprimi kryesor i rreshtit"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-sr/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-sr/strings.xml
index 4ef599d..c7443dd 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-sr/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-sr/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Може да се изабере само секундарна радња"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Тест декорације"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Секундарне радње и декорација"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Ред са секундарним радњама и декорацијом са веома дугим насловом"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Може да се изабере и ред"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Секундарна радња је изабрана"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Примарна радња реда је изабрана"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-sv/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-sv/strings.xml
index 8efbfec..5ca6aee 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-sv/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-sv/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Det går endast att välja den sekundära åtgärden"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Dekorationstest"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Sekundära åtgärder och dekoration"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Rad med sekundära åtgärder och dekoration med en väldigt lång titel"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Det går även att välja raden"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Den sekundära åtgärden har valts"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Radens primära åtgärd har valts"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-sw/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-sw/strings.xml
index 07b6998..d1b91b7 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-sw/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-sw/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Kitendo cha upili tu ndiyo kinaweza kuchaguliwa"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Jaribio la Usanifu"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Matendo ya Upili na Usanifu"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Safu Mlalo yenye Vitendo vya Ziada na Mapambo yenye jina refu zaidi"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Safu mlalo pia inaweza kuchaguliwa"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Kitendo cha Upili kimechaguliwa"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Kitendo cha msingi cha safu mlalo kimechaguliwa"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-th/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-th/strings.xml
index fdaf343..f3e29cd 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-th/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-th/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"เลือกได้เฉพาะการดำเนินการสำรอง"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"การทดสอบการตกแต่ง"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"การดำเนินการสำรองและการตกแต่ง"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"แถวที่มีการดำเนินการสำรองและการตกแต่งซึ่งมีชื่อที่ยาวมาก"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"เลือกแถวได้ด้วย"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"เลือกการดำเนินการสำรองแล้ว"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"เลือกการดำเนินการหลักของแถวแล้ว"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-tr/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-tr/strings.xml
index 06791fad..af20358 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-tr/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-tr/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Yalnızca ikincil işlem seçilebilir"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Süsleme Testi"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"İkincil İşlemler ve Süsleme"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Çok uzun bir başlığa sahip İkincil İşlemler ve Süsleme içeren satır"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Satır da seçilebilir"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"İkincil işlem seçildi"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Satırdaki birincil işlem seçildi"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-uk/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-uk/strings.xml
index 8db2abc..75ab546 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-uk/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-uk/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Можна вибрати лише додаткову дію"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Перевірка оформлення"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Додаткові дії й оформлення"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Рядок із додатковими діями й оформленням із дуже довгою назвою"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Рядок також можна вибрати"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Вибрано додаткову дію"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Вибрано основну дію рядка"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-vi/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-vi/strings.xml
index 9d3c9fa..45397e6 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-vi/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-vi/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Bạn chỉ có thể chọn hành động phụ"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Thử nghiệm phần trang trí"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Phần trang trí và hành động phụ"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Hàng có Phần trang trí và hành động phụ với tiêu đề rất dài"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Bạn cũng có thể chọn hàng"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Đã chọn hành động phụ"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Đã chọn hành động chính cho hàng"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-zh-rCN/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-zh-rCN/strings.xml
index 4e9fa74..4176a6f 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-zh-rCN/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-zh-rCN/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"只能选择次要操作"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"装饰测试"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"次要操作和装饰"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"包含次要操作和装饰以及长标题的行"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"也可以选择行"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"次要操作处于选中状态"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"行主要操作处于选中状态"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-zh-rHK/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-zh-rHK/strings.xml
index 96c5f99..d3bf08c 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-zh-rHK/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-zh-rHK/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"只可選取次要動作"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"裝飾測試"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"次要動作及裝飾"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"含有次要動作及修飾設定的列,且標題非常長"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"亦可選取列"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"已選取次要動作"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"已選取列的主要動作"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-zh-rTW/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-zh-rTW/strings.xml
index d6318e1..c6f9b78 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-zh-rTW/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-zh-rTW/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"只可以選取次要動作"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"裝飾測試"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"次要動作與裝飾"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"含有次要動作與修飾設定的列,且標題非常長"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"也可以選取列"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"已選取次要動作"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"已選取列的主要動作"</string>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-zu/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-zu/strings.xml
index c4b8273..cc8df31 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-zu/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-zu/strings.xml
@@ -321,8 +321,7 @@
<string name="secondary_actions_test_subtitle" msgid="6985282813402073703">"Isenzo sesibili kuphela esingakhethwa"</string>
<string name="decoration_test_title" msgid="8450127046762442244">"Ukuhlolwa Kokuhlobisa"</string>
<string name="secondary_actions_decoration_test_title" msgid="6282873404859209490">"Izenzo Zesibili Nokuhlobisa"</string>
- <!-- no translation found for secondary_actions_decoration_test_title_long (3700606949229899169) -->
- <skip />
+ <string name="secondary_actions_decoration_test_title_long" msgid="3700606949229899169">"Umugqa Unezenzo Zesibili Nokuhlotshiswa ngesihloko eside kakhulu"</string>
<string name="secondary_actions_decoration_test_subtitle" msgid="155884606592724532">"Umugqa ungabuye ukhethwe"</string>
<string name="secondary_action_toast" msgid="5076434693504006565">"Isenzo Sesibili Sikhethiwe"</string>
<string name="row_primary_action_toast" msgid="756516694751965204">"Isenzo esiyinhloko somugqa sikhethiwe"</string>
diff --git a/compose/foundation/foundation/api/current.txt b/compose/foundation/foundation/api/current.txt
index c166a14..6c0ed18 100644
--- a/compose/foundation/foundation/api/current.txt
+++ b/compose/foundation/foundation/api/current.txt
@@ -110,11 +110,9 @@
@SuppressCompatibility @androidx.compose.foundation.ExperimentalFoundationApi public final class ComposeFoundationFlags {
property public final boolean DragGesturePickUpEnabled;
property public final boolean NewNestedFlingPropagationEnabled;
- property public final boolean RemoveBasicTextGraphicsLayerEnabled;
field public static boolean DragGesturePickUpEnabled;
field public static final androidx.compose.foundation.ComposeFoundationFlags INSTANCE;
field public static boolean NewNestedFlingPropagationEnabled;
- field public static boolean RemoveBasicTextGraphicsLayerEnabled;
}
public final class DarkThemeKt {
diff --git a/compose/foundation/foundation/api/restricted_current.txt b/compose/foundation/foundation/api/restricted_current.txt
index 61f6ee4..4aaf099 100644
--- a/compose/foundation/foundation/api/restricted_current.txt
+++ b/compose/foundation/foundation/api/restricted_current.txt
@@ -110,11 +110,9 @@
@SuppressCompatibility @androidx.compose.foundation.ExperimentalFoundationApi public final class ComposeFoundationFlags {
property public final boolean DragGesturePickUpEnabled;
property public final boolean NewNestedFlingPropagationEnabled;
- property public final boolean RemoveBasicTextGraphicsLayerEnabled;
field public static boolean DragGesturePickUpEnabled;
field public static final androidx.compose.foundation.ComposeFoundationFlags INSTANCE;
field public static boolean NewNestedFlingPropagationEnabled;
- field public static boolean RemoveBasicTextGraphicsLayerEnabled;
}
public final class DarkThemeKt {
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveCompositionCountTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveCompositionCountTest.kt
index f714583..1292d4a 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveCompositionCountTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveCompositionCountTest.kt
@@ -74,6 +74,93 @@
}
@Test
+ fun moveFocus_shouldCreateLimitedNumberOfItems() {
+ // Arrange.
+ val (rowSize, itemSize) = with(rule.density) { Pair(50.toDp(), 10.toDp()) }
+ lateinit var focusManager: FocusManager
+ rule.setContent {
+ focusManager = LocalFocusManager.current
+ LazyRow(Modifier.size(rowSize), state) {
+ items(100) { index ->
+ Box(
+ Modifier.size(itemSize)
+ .testTag("$index")
+ .then(if (index == 0 || index > 50) Modifier.focusable() else Modifier)
+ )
+ SideEffect { composedItems.add(index) }
+ }
+ }
+ }
+ rule.onNodeWithTag("0").requestFocus()
+ rule.runOnIdle { composedItems.clear() }
+
+ // Act.
+ rule.runOnIdle { focusManager.moveFocus(FocusDirection.Right) }
+
+ // Assert we composed only up to visible item count * BeyondBoundsViewportFactor
+ // (10 in this case).
+ rule.runOnIdle {
+ assertThat(composedItems).containsExactly(5, 6, 7, 8, 9, 10, 11, 12, 13, 14)
+ }
+ }
+
+ @Test
+ fun moveFocus_shouldCreateLimitedNumberOfItems_largeItems() {
+ // Arrange.
+ val (rowSize, itemSize) = with(rule.density) { Pair(50.toDp(), 50.toDp()) }
+ lateinit var focusManager: FocusManager
+ rule.setContent {
+ focusManager = LocalFocusManager.current
+ LazyRow(Modifier.size(rowSize), state) {
+ items(100) { index ->
+ Box(
+ Modifier.size(itemSize)
+ .testTag("$index")
+ .then(if (index == 0 || index > 50) Modifier.focusable() else Modifier)
+ )
+ SideEffect { composedItems.add(index) }
+ }
+ }
+ }
+ rule.onNodeWithTag("0").requestFocus()
+ rule.runOnIdle { composedItems.clear() }
+
+ // Act.
+ rule.runOnIdle { focusManager.moveFocus(FocusDirection.Right) }
+
+ // Assert we only compose visibleCount * BeyondBoundsViewportFactor items. (2 in this case).
+ rule.runOnIdle { assertThat(composedItems).containsExactly(1, 2) }
+ }
+
+ @Test
+ fun moveFocus_shouldCreateLimitedNumberOfItems_differentSizedItems() {
+ // Arrange.
+ val rowSize = with(rule.density) { 50.toDp() }
+ lateinit var focusManager: FocusManager
+ rule.setContent {
+ focusManager = LocalFocusManager.current
+ LazyRow(Modifier.size(rowSize), state) {
+ items(100) { index ->
+ Box(
+ Modifier.size(with(rule.density) { ((index % 10) * 10 + 10).toDp() })
+ .testTag("$index")
+ .then(if (index == 0 || index > 50) Modifier.focusable() else Modifier)
+ )
+ SideEffect { composedItems.add(index) }
+ }
+ }
+ }
+ rule.onNodeWithTag("0").requestFocus()
+ rule.runOnIdle { composedItems.clear() }
+
+ // Act.
+ rule.runOnIdle { focusManager.moveFocus(FocusDirection.Right) }
+
+ // Assert we only compose visibleCount * BeyondBoundsViewportFactor items. (2 in this case).
+ rule.runOnIdle { assertThat(composedItems).containsExactly(3, 4, 5, 6) }
+ }
+
+ @Test
fun moveFocus_nestedFocusable() {
// Arrange.
val (rowSize, itemSize) = with(rule.density) { Pair(50.toDp(), 10.toDp()) }
diff --git a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveTest.kt b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveTest.kt
index 0302ffa..9daa391 100644
--- a/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveTest.kt
+++ b/compose/foundation/foundation/integration-tests/lazy-tests/src/androidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListFocusMoveTest.kt
@@ -343,74 +343,101 @@
}
@Test
- fun moveFocusToItemThatIsFarBeyondBounds() {
+ fun moveFocusToItemThatIsWithinOneViewport() {
// Arrange.
rule.setTestContent {
- lazyList(30.dp, it, lazyListState) {
- items(5) { FocusableBox(it) }
- items(100) { Box(Modifier.size(10.dp)) }
- item { FocusableBox(105) }
- item { FocusableBox(106, initiallyFocused) }
- item { FocusableBox(107) }
- items(100) { Box(Modifier.size(10.dp)) }
- items(5) { FocusableBox(it + 208) }
+ lazyList(100.dp, it, lazyListState) {
+ item { FocusableBox(0, initiallyFocused) }
+ items(6) { Box(Modifier.size(10.dp)) }
+ item { FocusableBox(7) }
}
}
with(rule) {
forEachParameter(ParamsToRun) { param ->
- runOnIdle {
- // Scroll so that the focused item is in the middle.
- runBlocking { lazyListState.scrollToItem(105) }
- initiallyFocused.requestFocus()
-
- // Move focus to the last visible item.
- when (focusDirection) {
- Left,
- Right,
- Up,
- Down,
- Previous,
- Next -> focusManager.moveFocus(focusDirection)
- Enter,
- Exit -> {
- // Do nothing
- }
- else -> unsupportedDirection()
- }
- }
+ runOnIdle { initiallyFocused.requestFocus() }
// Act.
- val success = runOnIdle { focusManager.moveFocus(focusDirection) }
+ runOnIdle { focusManager.moveFocus(focusDirection) }
// Assert.
runOnIdle {
- assertThat(success).apply {
- if (focusDirection == Enter) isFalse() else isTrue()
- }
when (focusDirection) {
Left ->
when (param.layoutDirection) {
Ltr ->
- assertThat(isFocused[if (param.reverseLayout) 208 else 4])
+ assertThat(isFocused[if (param.reverseLayout) 7 else 0])
.isTrue()
Rtl ->
- assertThat(isFocused[if (param.reverseLayout) 4 else 208])
+ assertThat(isFocused[if (param.reverseLayout) 0 else 7])
.isTrue()
}
Right ->
when (param.layoutDirection) {
Ltr ->
- assertThat(isFocused[if (param.reverseLayout) 4 else 208])
+ assertThat(isFocused[if (param.reverseLayout) 0 else 7])
.isTrue()
Rtl ->
- assertThat(isFocused[if (param.reverseLayout) 208 else 4])
+ assertThat(isFocused[if (param.reverseLayout) 7 else 0])
.isTrue()
}
- Up -> assertThat(isFocused[if (param.reverseLayout) 208 else 4]).isTrue()
- Down -> assertThat(isFocused[if (param.reverseLayout) 4 else 208]).isTrue()
- Previous -> assertThat(isFocused[4]).isTrue()
- Next -> assertThat(isFocused[208]).isTrue()
- Enter -> assertThat(isFocused[106]).isTrue()
+ Up -> assertThat(isFocused[if (param.reverseLayout) 7 else 0]).isTrue()
+ Down -> assertThat(isFocused[if (param.reverseLayout) 0 else 7]).isTrue()
+ Previous -> assertThat(isFocused[0]).isFalse()
+ Next -> assertThat(isFocused[7]).isTrue()
+ Enter -> assertThat(isFocused[0]).isTrue()
+ Exit -> assertThat(isLazyListFocused).isTrue()
+ else -> unsupportedDirection()
+ }
+ }
+ runOnIdle { runBlocking { lazyListState.scrollToItem(0) } }
+ resetTestCase()
+ }
+ }
+ }
+
+ @Test
+ fun moveFocusToItemThatIsBeyondOneViewport() {
+ // Arrange.
+ rule.setTestContent {
+ lazyList(100.dp, it, lazyListState) {
+ item { FocusableBox(0, initiallyFocused) }
+ items(6) { Box(Modifier.size(10.dp)) }
+ item { FocusableBox(7) }
+ }
+ }
+ with(rule) {
+ forEachParameter(ParamsToRun) { param ->
+ runOnIdle { initiallyFocused.requestFocus() }
+
+ // Act.
+ runOnIdle { focusManager.moveFocus(focusDirection) }
+
+ // Assert.
+ runOnIdle {
+ when (focusDirection) {
+ Left ->
+ when (param.layoutDirection) {
+ Ltr ->
+ assertThat(isFocused[if (param.reverseLayout) 7 else 0])
+ .isTrue()
+ Rtl ->
+ assertThat(isFocused[if (param.reverseLayout) 0 else 7])
+ .isTrue()
+ }
+ Right ->
+ when (param.layoutDirection) {
+ Rtl ->
+ assertThat(isFocused[if (param.reverseLayout) 7 else 0])
+ .isTrue()
+ Ltr ->
+ assertThat(isFocused[if (param.reverseLayout) 0 else 7])
+ .isTrue()
+ }
+ Up -> assertThat(isFocused[if (param.reverseLayout) 7 else 0]).isTrue()
+ Down -> assertThat(isFocused[if (param.reverseLayout) 0 else 7]).isTrue()
+ Previous -> assertThat(isFocused[0]).isFalse()
+ Next -> assertThat(isFocused[7]).isTrue()
+ Enter -> assertThat(isFocused[0]).isTrue()
Exit -> assertThat(isLazyListFocused).isTrue()
else -> unsupportedDirection()
}
diff --git a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Magnifier.android.kt b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Magnifier.android.kt
index d8c9e95..45cee2f 100644
--- a/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Magnifier.android.kt
+++ b/compose/foundation/foundation/src/androidMain/kotlin/androidx/compose/foundation/Magnifier.android.kt
@@ -50,6 +50,7 @@
import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.toSize
+import kotlinx.coroutines.CoroutineStart
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.launch
@@ -375,7 +376,8 @@
override fun onAttach() {
onObservedReadsChanged()
drawSignalChannel = Channel()
- coroutineScope.launch {
+ // Launch undispatched, otherwise we could miss the first draw signal
+ coroutineScope.launch(start = CoroutineStart.UNDISPATCHED) {
while (true) {
drawSignalChannel?.receive()
// don't update the magnifier immediately, actual frame draw happens right after
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ComposeFoundationFlags.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ComposeFoundationFlags.kt
index 7cae901..e541fe3 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ComposeFoundationFlags.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/ComposeFoundationFlags.kt
@@ -16,8 +16,6 @@
package androidx.compose.foundation
-import androidx.compose.foundation.text.BasicText
-import androidx.compose.ui.graphics.graphicsLayer
import kotlin.jvm.JvmField
/**
@@ -66,16 +64,6 @@
@Suppress("MutableBareField") @JvmField var NewNestedFlingPropagationEnabled = true
/**
- * We have removed the implicit [graphicsLayer] from [BasicText]. This also affects the `Text`
- * composable in material modules.
- *
- * This change ideally improves the initial rendering performance of [BasicText] but it may have
- * negative effect on recomposition or redraw since [BasicText]s draw operations would not be
- * cached in a separate layer.
- */
- @JvmField @Suppress("MutableBareField") var RemoveBasicTextGraphicsLayerEnabled: Boolean = true
-
- /**
* Selecting flag to enable Drag Gesture "Pick-up" on drag gesture detectors. This also applies
* to Draggables and Scrollables which use gesture detectors as well. Any parent drag detector
* will continue to monitor the event stream until the gesture terminates (all pointers are
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListBeyondBoundsModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListBeyondBoundsModifier.kt
index 11d3c6b..a21b4e3 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListBeyondBoundsModifier.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListBeyondBoundsModifier.kt
@@ -16,6 +16,7 @@
package androidx.compose.foundation.lazy
+import androidx.compose.foundation.gestures.snapping.singleAxisViewportSize
import androidx.compose.foundation.lazy.layout.LazyLayoutBeyondBoundsState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
@@ -48,4 +49,11 @@
itemCount - 1,
state.layoutInfo.visibleItemsInfo.last().index + beyondBoundsItemCount
)
+
+ override fun itemsPerViewport(): Int {
+ if (state.layoutInfo.visibleItemsInfo.isEmpty()) return 0
+ val viewportSize = state.layoutInfo.singleAxisViewportSize
+ val averageItemSize = state.layoutInfo.visibleItemsAverageSize()
+ return (viewportSize / averageItemSize).coerceAtLeast(1)
+ }
}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListLayoutInfo.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListLayoutInfo.kt
index eb2bf7f..fe338be 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListLayoutInfo.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListLayoutInfo.kt
@@ -19,6 +19,7 @@
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.foundation.internal.JvmDefaultWithCompatibility
import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.util.fastSumBy
/**
* Contains useful information about the currently displayed layout state of lazy lists like
@@ -85,3 +86,9 @@
val mainAxisItemSpacing: Int
get() = 0
}
+
+internal fun LazyListLayoutInfo.visibleItemsAverageSize(): Int {
+ val visibleItems = visibleItemsInfo
+ val itemsSum = visibleItems.fastSumBy { it.size }
+ return itemsSum / visibleItems.size + mainAxisItemSpacing
+}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListScrollScope.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListScrollScope.kt
index 812f04a..a945df0 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListScrollScope.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListScrollScope.kt
@@ -19,7 +19,6 @@
import androidx.compose.foundation.gestures.ScrollScope
import androidx.compose.foundation.lazy.layout.LazyLayoutScrollScope
import androidx.compose.ui.util.fastFirstOrNull
-import androidx.compose.ui.util.fastSumBy
/**
* An implementation of [LazyLayoutScrollScope] that can be used with LazyLists. Please refer to the
@@ -54,7 +53,7 @@
val layoutInfo = state.layoutInfo
if (layoutInfo.visibleItemsInfo.isEmpty()) return 0
return if (targetIndex !in firstVisibleItemIndex..lastVisibleItemIndex) {
- val averageSize = calculateVisibleItemsAverageSize(layoutInfo)
+ val averageSize = layoutInfo.visibleItemsAverageSize()
val indexesDiff = targetIndex - firstVisibleItemIndex
(averageSize * indexesDiff) - firstVisibleItemScrollOffset
} else {
@@ -63,11 +62,5 @@
visibleItem?.offset ?: 0
} + targetOffset
}
-
- private fun calculateVisibleItemsAverageSize(layoutInfo: LazyListLayoutInfo): Int {
- val visibleItems = layoutInfo.visibleItemsInfo
- val itemsSum = visibleItems.fastSumBy { it.size }
- return itemsSum / visibleItems.size + layoutInfo.mainAxisItemSpacing
- }
}
}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridBeyondBoundsModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridBeyondBoundsModifier.kt
index da43aa2..593597c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridBeyondBoundsModifier.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridBeyondBoundsModifier.kt
@@ -16,6 +16,7 @@
package androidx.compose.foundation.lazy.grid
+import androidx.compose.foundation.gestures.snapping.singleAxisViewportSize
import androidx.compose.foundation.lazy.layout.LazyLayoutBeyondBoundsState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
@@ -40,4 +41,12 @@
override val lastPlacedIndex: Int
get() = state.layoutInfo.visibleItemsInfo.last().index
+
+ /** In grids this is lines per viewport */
+ override fun itemsPerViewport(): Int {
+ if (state.layoutInfo.visibleItemsInfo.isEmpty()) return 0
+ val viewportSize = state.layoutInfo.singleAxisViewportSize
+ val lineAverageSize = state.layoutInfo.visibleLinesAverageMainAxisSize()
+ return (viewportSize / lineAverageSize).coerceAtLeast(1)
+ }
}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridLayoutInfo.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridLayoutInfo.kt
index d971eab..bdff83b 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridLayoutInfo.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridLayoutInfo.kt
@@ -18,6 +18,7 @@
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.ui.unit.IntSize
+import kotlin.math.max
/**
* Contains useful information about the currently displayed layout state of lazy grids like
@@ -87,3 +88,45 @@
*/
val maxSpan: Int
}
+
+internal fun LazyGridLayoutInfo.visibleLinesAverageMainAxisSize(): Int {
+ val isVertical = orientation == Orientation.Vertical
+ val visibleItems = visibleItemsInfo
+ fun lineOf(index: Int): Int =
+ if (isVertical) visibleItemsInfo[index].row else visibleItemsInfo[index].column
+
+ var totalLinesMainAxisSize = 0
+ var linesCount = 0
+
+ var lineStartIndex = 0
+ while (lineStartIndex < visibleItems.size) {
+ val currentLine = lineOf(lineStartIndex)
+ if (currentLine == -1) {
+ // Filter out exiting items.
+ ++lineStartIndex
+ continue
+ }
+
+ var lineMainAxisSize = 0
+ var lineEndIndex = lineStartIndex
+ while (lineEndIndex < visibleItems.size && lineOf(lineEndIndex) == currentLine) {
+ lineMainAxisSize =
+ max(
+ lineMainAxisSize,
+ if (isVertical) {
+ visibleItems[lineEndIndex].size.height
+ } else {
+ visibleItems[lineEndIndex].size.width
+ }
+ )
+ ++lineEndIndex
+ }
+
+ totalLinesMainAxisSize += lineMainAxisSize
+ ++linesCount
+
+ lineStartIndex = lineEndIndex
+ }
+
+ return totalLinesMainAxisSize / linesCount + mainAxisItemSpacing
+}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridScrollScope.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridScrollScope.kt
index 7174f5c..81b5104 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridScrollScope.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridScrollScope.kt
@@ -20,7 +20,6 @@
import androidx.compose.foundation.gestures.ScrollScope
import androidx.compose.foundation.lazy.layout.LazyLayoutScrollScope
import androidx.compose.ui.util.fastFirstOrNull
-import kotlin.math.max
/**
* An implementation of [LazyLayoutScrollScope] that can be used with LazyGrids.
@@ -55,7 +54,7 @@
if (layoutInfo.visibleItemsInfo.isEmpty()) return 0
return if (targetIndex !in firstVisibleItemIndex..lastVisibleItemIndex) {
val slotsPerLine = state.slotsPerLine
- val averageLineMainAxisSize = calculateLineAverageMainAxisSize(layoutInfo)
+ val averageLineMainAxisSize = layoutInfo.visibleLinesAverageMainAxisSize()
val before = targetIndex < firstVisibleItemIndex
val linesDiff =
(targetIndex - firstVisibleItemIndex +
@@ -71,48 +70,5 @@
} ?: 0
} + targetOffset
}
-
- private fun calculateLineAverageMainAxisSize(layoutInfo: LazyGridLayoutInfo): Int {
- val isVertical = layoutInfo.orientation == Orientation.Vertical
- val visibleItems = layoutInfo.visibleItemsInfo
- val lineOf: (Int) -> Int = {
- if (isVertical) visibleItems[it].row else visibleItems[it].column
- }
-
- var totalLinesMainAxisSize = 0
- var linesCount = 0
-
- var lineStartIndex = 0
- while (lineStartIndex < visibleItems.size) {
- val currentLine = lineOf(lineStartIndex)
- if (currentLine == -1) {
- // Filter out exiting items.
- ++lineStartIndex
- continue
- }
-
- var lineMainAxisSize = 0
- var lineEndIndex = lineStartIndex
- while (lineEndIndex < visibleItems.size && lineOf(lineEndIndex) == currentLine) {
- lineMainAxisSize =
- max(
- lineMainAxisSize,
- if (isVertical) {
- visibleItems[lineEndIndex].size.height
- } else {
- visibleItems[lineEndIndex].size.width
- }
- )
- ++lineEndIndex
- }
-
- totalLinesMainAxisSize += lineMainAxisSize
- ++linesCount
-
- lineStartIndex = lineEndIndex
- }
-
- return totalLinesMainAxisSize / linesCount + layoutInfo.mainAxisItemSpacing
- }
}
}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal.kt
index 93084ad..de6de83 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsModifierLocal.kt
@@ -46,6 +46,9 @@
/**
* This modifier is used to measure and place additional items when the lazy layout receives a
* request to layout items beyond the visible bounds.
+ *
+ * We will layout a limited number of items (currently the number of items in the viewport times a
+ * constant) so the focus search may give up if focusable items are too far apart.
*/
internal fun Modifier.lazyLayoutBeyondBoundsModifier(
state: LazyLayoutBeyondBoundsState,
@@ -146,12 +149,21 @@
}
var interval = beyondBoundsInfo.addInterval(startIndex, startIndex)
var found: T? = null
- while (found == null && interval.hasMoreContent(direction)) {
+ // Layout at most one viewport worth of items (times BeyondBoundsViewportFactor).
+ val maxItemsToLayout =
+ (BeyondBoundsViewportFactor * state.itemsPerViewport()).coerceAtMost(state.itemCount)
+ var itemsCreatedSoFar = 0
+ while (
+ found == null &&
+ interval.hasMoreContent(direction) &&
+ itemsCreatedSoFar < maxItemsToLayout
+ ) {
// Add one extra beyond bounds item.
interval =
addNextInterval(interval, direction).also {
beyondBoundsInfo.removeInterval(interval)
}
+ itemsCreatedSoFar++
remeasureSync()
// When we invoke this block, the beyond bounds items are present.
@@ -235,3 +247,5 @@
private fun unsupportedDirection(): Nothing =
error("Lazy list does not support beyond bounds layout for the specified direction")
+
+private const val BeyondBoundsViewportFactor = 2
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsState.kt
index c0dbc69..1eaeccb 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutBeyondBoundsState.kt
@@ -29,6 +29,8 @@
val firstPlacedIndex: Int
val lastPlacedIndex: Int
+
+ fun itemsPerViewport(): Int
}
@OptIn(ExperimentalFoundationApi::class)
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridBeyondBoundsModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridBeyondBoundsModifier.kt
index c29f54c..36c72d4 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridBeyondBoundsModifier.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridBeyondBoundsModifier.kt
@@ -42,4 +42,11 @@
override val lastPlacedIndex: Int
get() = state.layoutInfo.visibleItemsInfo.last().index
+
+ override fun itemsPerViewport(): Int {
+ if (state.layoutInfo.visibleItemsInfo.isEmpty()) return 0
+ val viewportSize = state.layoutInfo.singleAxisViewportSize
+ val lineAverageSize = state.layoutInfo.visibleItemsAverageSize()
+ return (viewportSize / lineAverageSize).coerceAtLeast(1)
+ }
}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasureResult.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasureResult.kt
index 85ec1fc..c62ec47 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasureResult.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridMeasureResult.kt
@@ -24,6 +24,7 @@
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.util.fastForEach
+import androidx.compose.ui.util.fastSumBy
import kotlin.coroutines.EmptyCoroutineContext
import kotlinx.coroutines.CoroutineScope
@@ -271,3 +272,25 @@
scrollBackAmount = 0f,
coroutineScope = CoroutineScope(EmptyCoroutineContext)
)
+
+internal fun LazyStaggeredGridLayoutInfo.visibleItemsAverageSize(): Int {
+ val visibleItems = visibleItemsInfo
+ if (visibleItems.isEmpty()) return 0
+ val itemSizeSum =
+ visibleItems.fastSumBy {
+ if (orientation == Orientation.Vertical) {
+ it.size.height
+ } else {
+ it.size.width
+ }
+ }
+ return itemSizeSum / visibleItems.size + mainAxisItemSpacing
+}
+
+internal val LazyStaggeredGridLayoutInfo.singleAxisViewportSize: Int
+ get() =
+ if (orientation == Orientation.Vertical) {
+ viewportSize.height
+ } else {
+ viewportSize.width
+ }
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollScope.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollScope.kt
index c0ed4b2..aa6e2e1 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollScope.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridScrollScope.kt
@@ -20,7 +20,6 @@
import androidx.compose.foundation.gestures.ScrollScope
import androidx.compose.foundation.lazy.layout.LazyLayoutScrollScope
import androidx.compose.ui.util.fastFirstOrNull
-import androidx.compose.ui.util.fastSumBy
/**
* An implementation of [LazyLayoutScrollScope] that can be used with LazyStaggeredGrids.
@@ -60,8 +59,7 @@
val visibleItem =
layoutInfo.visibleItemsInfo.fastFirstOrNull { it.index == targetIndex }
return if (visibleItem == null) {
- val averageMainAxisItemSize = calculateVisibleItemsAverageSize(layoutInfo)
-
+ val averageMainAxisItemSize = layoutInfo.visibleItemsAverageSize()
val laneCount = state.laneCount
val lineDiff = targetIndex / laneCount - firstVisibleItemIndex / laneCount
averageMainAxisItemSize * lineDiff - firstVisibleItemScrollOffset
@@ -73,18 +71,5 @@
}
} + targetOffset
}
-
- private fun calculateVisibleItemsAverageSize(layoutInfo: LazyStaggeredGridLayoutInfo): Int {
- val visibleItems = layoutInfo.visibleItemsInfo
- val itemSizeSum =
- visibleItems.fastSumBy {
- if (layoutInfo.orientation == Orientation.Vertical) {
- it.size.height
- } else {
- it.size.width
- }
- }
- return itemSizeSum / visibleItems.size + layoutInfo.mainAxisItemSpacing
- }
}
}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerBeyondBoundsModifier.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerBeyondBoundsModifier.kt
index 0be75d97..7d37386 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerBeyondBoundsModifier.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/pager/PagerBeyondBoundsModifier.kt
@@ -49,4 +49,12 @@
itemCount - 1,
state.layoutInfo.visiblePagesInfo.last().index + beyondViewportPageCount
)
+
+ override fun itemsPerViewport(): Int {
+ val visibleItemCount = state.layoutInfo.visiblePagesInfo.size
+ if (visibleItemCount == 0) return 0
+ val viewportSize = state.layoutInfo.mainAxisViewportSize
+ val averageItemSize = state.layoutInfo.pageSize + state.layoutInfo.pageSpacing
+ return (viewportSize / averageItemSize).coerceAtLeast(1)
+ }
}
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 56e2025..372f73d 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
@@ -16,8 +16,6 @@
package androidx.compose.foundation.text
-import androidx.compose.foundation.ComposeFoundationFlags
-import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.text.modifiers.SelectableTextAnnotatedStringElement
import androidx.compose.foundation.text.modifiers.SelectionController
import androidx.compose.foundation.text.modifiers.TextAnnotatedStringElement
@@ -39,7 +37,6 @@
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.graphics.ColorProducer
-import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.layout.Layout
import androidx.compose.ui.layout.Measurable
import androidx.compose.ui.layout.MeasurePolicy
@@ -119,26 +116,24 @@
}
val finalModifier =
if (selectionController != null || onTextLayout != null) {
- modifier
- .optionalGraphicsLayer()
- .textModifier(
- AnnotatedString(text = text),
- style = style,
- onTextLayout = onTextLayout,
- overflow = overflow,
- softWrap = softWrap,
- maxLines = maxLines,
- minLines = minLines,
- fontFamilyResolver = LocalFontFamilyResolver.current,
- placeholders = null,
- onPlaceholderLayout = null,
- selectionController = selectionController,
- color = color,
- onShowTranslation = null,
- autoSize = requireAutoSizeInternalImplementationOrNull(autoSize)
- )
+ modifier.textModifier(
+ AnnotatedString(text = text),
+ style = style,
+ onTextLayout = onTextLayout,
+ overflow = overflow,
+ softWrap = softWrap,
+ maxLines = maxLines,
+ minLines = minLines,
+ fontFamilyResolver = LocalFontFamilyResolver.current,
+ placeholders = null,
+ onPlaceholderLayout = null,
+ selectionController = selectionController,
+ color = color,
+ onShowTranslation = null,
+ autoSize = requireAutoSizeInternalImplementationOrNull(autoSize)
+ )
} else {
- modifier.optionalGraphicsLayer() then
+ modifier then
TextStringSimpleElement(
text = text,
style = style,
@@ -218,24 +213,22 @@
// this is the same as text: String, use all the early exits
Layout(
modifier =
- modifier
- .optionalGraphicsLayer()
- .textModifier(
- text = text,
- style = style,
- onTextLayout = onTextLayout,
- overflow = overflow,
- softWrap = softWrap,
- maxLines = maxLines,
- minLines = minLines,
- fontFamilyResolver = LocalFontFamilyResolver.current,
- placeholders = null,
- onPlaceholderLayout = null,
- selectionController = selectionController,
- color = color,
- onShowTranslation = null,
- autoSize = requireAutoSizeInternalImplementationOrNull(autoSize)
- ),
+ modifier.textModifier(
+ text = text,
+ style = style,
+ onTextLayout = onTextLayout,
+ overflow = overflow,
+ softWrap = softWrap,
+ maxLines = maxLines,
+ minLines = minLines,
+ fontFamilyResolver = LocalFontFamilyResolver.current,
+ placeholders = null,
+ onPlaceholderLayout = null,
+ selectionController = selectionController,
+ color = color,
+ onShowTranslation = null,
+ autoSize = requireAutoSizeInternalImplementationOrNull(autoSize)
+ ),
EmptyMeasurePolicy
)
} else {
@@ -672,27 +665,25 @@
inlineComposables?.let { InlineChildren(text = text, inlineContents = it) }
},
modifier =
- modifier
- .optionalGraphicsLayer()
- .textModifier(
- text = styledText(),
- style = style,
- onTextLayout = {
- textScope?.textLayoutResult = it
- onTextLayout?.invoke(it)
- },
- overflow = overflow,
- softWrap = softWrap,
- maxLines = maxLines,
- minLines = minLines,
- fontFamilyResolver = fontFamilyResolver,
- placeholders = placeholders,
- onPlaceholderLayout = onPlaceholderLayout,
- selectionController = selectionController,
- color = color,
- onShowTranslation = onShowTranslation,
- autoSize = autoSize
- ),
+ modifier.textModifier(
+ text = styledText(),
+ style = style,
+ onTextLayout = {
+ textScope?.textLayoutResult = it
+ onTextLayout?.invoke(it)
+ },
+ overflow = overflow,
+ softWrap = softWrap,
+ maxLines = maxLines,
+ minLines = minLines,
+ fontFamilyResolver = fontFamilyResolver,
+ placeholders = placeholders,
+ onPlaceholderLayout = onPlaceholderLayout,
+ selectionController = selectionController,
+ color = color,
+ onShowTranslation = onShowTranslation,
+ autoSize = autoSize
+ ),
measurePolicy =
if (!hasInlineContent) {
LinksTextMeasurePolicy(
@@ -708,18 +699,6 @@
}
/**
- * Applies a full [graphicsLayer] modifier only if the associated flag
- * [ComposeFoundationFlags.RemoveBasicTextGraphicsLayerEnabled] is disabled.
- */
-@OptIn(ExperimentalFoundationApi::class)
-private fun Modifier.optionalGraphicsLayer() =
- if (ComposeFoundationFlags.RemoveBasicTextGraphicsLayerEnabled) {
- this
- } else {
- this.graphicsLayer()
- }
-
-/**
* [AutoSize], our public type, is a sealed interface. Our internal representation is not sealed.
* This is an extra validity check to ensure we are receiving the correct type; in practice it
* should never happen.
diff --git a/compose/material3/material3/api/current.txt b/compose/material3/material3/api/current.txt
index 69ea89f..84aafba 100644
--- a/compose/material3/material3/api/current.txt
+++ b/compose/material3/material3/api/current.txt
@@ -702,11 +702,6 @@
field public static final androidx.compose.material3.DefaultNavigationBarComponentOverride INSTANCE;
}
- @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public final class DefaultNavigationBarItemComponentOverride implements androidx.compose.material3.NavigationBarItemComponentOverride {
- method @androidx.compose.runtime.Composable public void NavigationBarItem(androidx.compose.material3.NavigationBarItemComponentOverrideContext);
- field public static final androidx.compose.material3.DefaultNavigationBarItemComponentOverride INSTANCE;
- }
-
@SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public final class DefaultNavigationRailComponentOverride implements androidx.compose.material3.NavigationRailComponentOverride {
method @androidx.compose.runtime.Composable public void NavigationRail(androidx.compose.material3.NavigationRailComponentOverrideContext);
field public static final androidx.compose.material3.DefaultNavigationRailComponentOverride INSTANCE;
@@ -1541,31 +1536,6 @@
property public final long unselectedTextColor;
}
- @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public interface NavigationBarItemComponentOverride {
- method @androidx.compose.runtime.Composable public void NavigationBarItem(androidx.compose.material3.NavigationBarItemComponentOverrideContext);
- }
-
- @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public final class NavigationBarItemComponentOverrideContext implements androidx.compose.foundation.layout.RowScope {
- method public androidx.compose.material3.NavigationBarItemColors getColors();
- method public kotlin.jvm.functions.Function0<kotlin.Unit> getIcon();
- method public androidx.compose.foundation.interaction.MutableInteractionSource? getInteractionSource();
- method public kotlin.jvm.functions.Function0<kotlin.Unit>? getLabel();
- method public androidx.compose.ui.Modifier getModifier();
- method public kotlin.jvm.functions.Function0<kotlin.Unit> getOnClick();
- method public boolean getShouldAlwaysShowLabel();
- method public boolean isEnabled();
- method public boolean isSelected();
- property public final androidx.compose.material3.NavigationBarItemColors colors;
- property public final kotlin.jvm.functions.Function0<kotlin.Unit> icon;
- property public final androidx.compose.foundation.interaction.MutableInteractionSource? interactionSource;
- property public final boolean isEnabled;
- property public final boolean isSelected;
- property public final kotlin.jvm.functions.Function0<kotlin.Unit>? label;
- property public final androidx.compose.ui.Modifier modifier;
- property public final kotlin.jvm.functions.Function0<kotlin.Unit> onClick;
- property public final boolean shouldAlwaysShowLabel;
- }
-
public final class NavigationBarItemDefaults {
method @androidx.compose.runtime.Composable public androidx.compose.material3.NavigationBarItemColors colors();
method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material3.NavigationBarItemColors colors(optional long selectedIconColor, optional long selectedTextColor, optional long indicatorColor, optional long unselectedIconColor, optional long unselectedTextColor);
@@ -1577,9 +1547,7 @@
method @androidx.compose.runtime.Composable public static void NavigationBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.WindowInsets windowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
method @androidx.compose.runtime.Composable public static void NavigationBarItem(androidx.compose.foundation.layout.RowScope, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.material3.NavigationBarItemColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource? interactionSource);
method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.NavigationBarComponentOverride> getLocalNavigationBarComponentOverride();
- method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.NavigationBarItemComponentOverride> getLocalNavigationBarItemComponentOverride();
property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.NavigationBarComponentOverride> LocalNavigationBarComponentOverride;
- property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.NavigationBarItemComponentOverride> LocalNavigationBarItemComponentOverride;
}
@androidx.compose.runtime.Stable public interface NavigationDrawerItemColors {
diff --git a/compose/material3/material3/api/restricted_current.txt b/compose/material3/material3/api/restricted_current.txt
index 69ea89f..84aafba 100644
--- a/compose/material3/material3/api/restricted_current.txt
+++ b/compose/material3/material3/api/restricted_current.txt
@@ -702,11 +702,6 @@
field public static final androidx.compose.material3.DefaultNavigationBarComponentOverride INSTANCE;
}
- @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public final class DefaultNavigationBarItemComponentOverride implements androidx.compose.material3.NavigationBarItemComponentOverride {
- method @androidx.compose.runtime.Composable public void NavigationBarItem(androidx.compose.material3.NavigationBarItemComponentOverrideContext);
- field public static final androidx.compose.material3.DefaultNavigationBarItemComponentOverride INSTANCE;
- }
-
@SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public final class DefaultNavigationRailComponentOverride implements androidx.compose.material3.NavigationRailComponentOverride {
method @androidx.compose.runtime.Composable public void NavigationRail(androidx.compose.material3.NavigationRailComponentOverrideContext);
field public static final androidx.compose.material3.DefaultNavigationRailComponentOverride INSTANCE;
@@ -1541,31 +1536,6 @@
property public final long unselectedTextColor;
}
- @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public interface NavigationBarItemComponentOverride {
- method @androidx.compose.runtime.Composable public void NavigationBarItem(androidx.compose.material3.NavigationBarItemComponentOverrideContext);
- }
-
- @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public final class NavigationBarItemComponentOverrideContext implements androidx.compose.foundation.layout.RowScope {
- method public androidx.compose.material3.NavigationBarItemColors getColors();
- method public kotlin.jvm.functions.Function0<kotlin.Unit> getIcon();
- method public androidx.compose.foundation.interaction.MutableInteractionSource? getInteractionSource();
- method public kotlin.jvm.functions.Function0<kotlin.Unit>? getLabel();
- method public androidx.compose.ui.Modifier getModifier();
- method public kotlin.jvm.functions.Function0<kotlin.Unit> getOnClick();
- method public boolean getShouldAlwaysShowLabel();
- method public boolean isEnabled();
- method public boolean isSelected();
- property public final androidx.compose.material3.NavigationBarItemColors colors;
- property public final kotlin.jvm.functions.Function0<kotlin.Unit> icon;
- property public final androidx.compose.foundation.interaction.MutableInteractionSource? interactionSource;
- property public final boolean isEnabled;
- property public final boolean isSelected;
- property public final kotlin.jvm.functions.Function0<kotlin.Unit>? label;
- property public final androidx.compose.ui.Modifier modifier;
- property public final kotlin.jvm.functions.Function0<kotlin.Unit> onClick;
- property public final boolean shouldAlwaysShowLabel;
- }
-
public final class NavigationBarItemDefaults {
method @androidx.compose.runtime.Composable public androidx.compose.material3.NavigationBarItemColors colors();
method @Deprecated @androidx.compose.runtime.Composable public androidx.compose.material3.NavigationBarItemColors colors(optional long selectedIconColor, optional long selectedTextColor, optional long indicatorColor, optional long unselectedIconColor, optional long unselectedTextColor);
@@ -1577,9 +1547,7 @@
method @androidx.compose.runtime.Composable public static void NavigationBar(optional androidx.compose.ui.Modifier modifier, optional long containerColor, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.layout.WindowInsets windowInsets, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.RowScope,kotlin.Unit> content);
method @androidx.compose.runtime.Composable public static void NavigationBarItem(androidx.compose.foundation.layout.RowScope, boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> icon, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional kotlin.jvm.functions.Function0<kotlin.Unit>? label, optional boolean alwaysShowLabel, optional androidx.compose.material3.NavigationBarItemColors colors, optional androidx.compose.foundation.interaction.MutableInteractionSource? interactionSource);
method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.NavigationBarComponentOverride> getLocalNavigationBarComponentOverride();
- method @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.NavigationBarItemComponentOverride> getLocalNavigationBarItemComponentOverride();
property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.NavigationBarComponentOverride> LocalNavigationBarComponentOverride;
- property @SuppressCompatibility @androidx.compose.material3.ExperimentalMaterial3Api public static final androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material3.NavigationBarItemComponentOverride> LocalNavigationBarItemComponentOverride;
}
@androidx.compose.runtime.Stable public interface NavigationDrawerItemColors {
diff --git a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SplitButtonTest.kt b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SplitButtonTest.kt
index e11e8ad..1029be4 100644
--- a/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SplitButtonTest.kt
+++ b/compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/SplitButtonTest.kt
@@ -20,28 +20,38 @@
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Edit
import androidx.compose.material.icons.outlined.KeyboardArrowDown
+import androidx.compose.material3.SplitButtonDefaults.InnerCornerSize
+import androidx.compose.material3.SplitButtonDefaults.OuterCornerSize
+import androidx.compose.material3.tokens.SplitButtonSmallTokens
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.layout.layout
+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.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.assertIsDisplayed
import androidx.compose.ui.test.assertIsEnabled
+import androidx.compose.ui.test.assertIsEqualTo
import androidx.compose.ui.test.assertIsNotEnabled
import androidx.compose.ui.test.assertIsOff
import androidx.compose.ui.test.assertIsOn
+import androidx.compose.ui.test.getUnclippedBoundsInRoot
import androidx.compose.ui.test.isToggleable
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
+import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.dp
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.MediumTest
@@ -303,4 +313,96 @@
rule.onNodeWithContentDescription("Leading Icon").assertIsDisplayed()
rule.onNodeWithContentDescription("Trailing Icon").assertIsDisplayed()
}
+
+ @Test
+ fun FilledSplitButton_contentPadding() {
+ lateinit var density: Density
+ var trailingButtonSize by mutableStateOf(Size(0f, 0f))
+
+ rule.setMaterialContent(lightColorScheme()) {
+ density = LocalDensity.current
+ SplitButtonLayout(
+ leadingButton = {
+ SplitButtonDefaults.LeadingButton(
+ onClick = { /* Do Nothing */ },
+ modifier = Modifier.testTag("leading button"),
+ enabled = false
+ ) {
+ Text(
+ "My Button",
+ modifier =
+ Modifier.testTag(TextTag).semantics(mergeDescendants = true) {}
+ )
+ }
+ },
+ trailingButton = {
+ SplitButtonDefaults.TrailingButton(
+ onCheckedChange = {},
+ checked = false,
+ modifier =
+ Modifier.layout { measurable, constraints ->
+ val placeable = measurable.measure(constraints)
+ val width = placeable.width
+ val height = placeable.height
+ trailingButtonSize = Size(width.toFloat(), height.toFloat())
+ layout(width, height) { placeable.place(0, 0) }
+ }
+ .testTag("trailing button"),
+ enabled = false,
+ ) {
+ Icon(
+ Icons.Outlined.KeyboardArrowDown,
+ contentDescription = "Trailing Icon",
+ modifier =
+ Modifier.testTag(IconTag).semantics(mergeDescendants = true) {}
+ )
+ }
+ }
+ )
+ }
+
+ val trailingButtonTopStartPx = InnerCornerSize.toPx(trailingButtonSize, density)
+ val trailingButtonTopEndPx = OuterCornerSize.toPx(trailingButtonSize, density) / 2
+
+ val paddingPxCorrection =
+ CenterOpticallyCoefficient * (trailingButtonTopStartPx - trailingButtonTopEndPx)
+
+ val expectedTrailingButtonStartPadding =
+ with(density) {
+ SplitButtonSmallTokens.TrailingButtonLeadingSpace + paddingPxCorrection.toDp()
+ }
+
+ val expectedTrailingButtonEndPadding =
+ with(density) {
+ SplitButtonSmallTokens.TrailingButtonTrailingSpace - paddingPxCorrection.toDp()
+ }
+
+ val leadingButtonBounds = rule.onNodeWithTag("leading button").getUnclippedBoundsInRoot()
+
+ val textBounds = rule.onNodeWithTag(TextTag).getUnclippedBoundsInRoot()
+
+ val trailingButtonBounds = rule.onNodeWithTag("trailing button").getUnclippedBoundsInRoot()
+
+ val iconBounds = rule.onNodeWithTag(IconTag).getUnclippedBoundsInRoot()
+
+ (textBounds.left - leadingButtonBounds.left).assertIsEqualTo(
+ SplitButtonSmallTokens.LeadingButtonLeadingSpace,
+ "start padding for leading button"
+ )
+ (leadingButtonBounds.right - textBounds.right).assertIsEqualTo(
+ SplitButtonSmallTokens.LeadingButtonTrailingSpace,
+ "end padding for leading button"
+ )
+ (iconBounds.left - trailingButtonBounds.left).assertIsEqualTo(
+ expectedTrailingButtonStartPadding,
+ "start padding for trailing button"
+ )
+ (trailingButtonBounds.right - iconBounds.right).assertIsEqualTo(
+ expectedTrailingButtonEndPadding,
+ "end padding for trailing button"
+ )
+ }
}
+
+private const val TextTag = "text tag"
+private const val IconTag = "icon tag"
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt
index 286b0150..de92be1 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt
@@ -2226,18 +2226,19 @@
): Offset {
if (!canScroll()) return Offset.Zero
state.contentOffset += consumed.y
- if (state.heightOffset == 0f || state.heightOffset == state.heightOffsetLimit) {
- if (consumed.y == 0f && available.y > 0f) {
- // Reset the total content offset to zero when scrolling all the way down.
- // This will eliminate some float precision inaccuracies.
- state.contentOffset = 0f
- }
- }
state.heightOffset = state.heightOffset + consumed.y
return Offset.Zero
}
override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
+ if (
+ available.y > 0f &&
+ (state.heightOffset == 0f || state.heightOffset == state.heightOffsetLimit)
+ ) {
+ // Reset the total content offset to zero when scrolling all the way down.
+ // This will eliminate some float precision inaccuracies.
+ state.contentOffset = 0f
+ }
val superConsumed = super.onPostFling(consumed, available)
return superConsumed +
settleAppBarBottom(state, available.y, flingAnimationSpec, snapAnimationSpec)
@@ -2837,14 +2838,17 @@
source: NestedScrollSource
): Offset {
if (!canScroll()) return Offset.Zero
- if (consumed.y == 0f && available.y > 0f) {
+ state.contentOffset += consumed.y
+ return Offset.Zero
+ }
+
+ override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
+ if (available.y > 0f) {
// Reset the total content offset to zero when scrolling all the way down.
// This will eliminate some float precision inaccuracies.
state.contentOffset = 0f
- } else {
- state.contentOffset += consumed.y
}
- return Offset.Zero
+ return super.onPostFling(consumed, available)
}
}
}
@@ -2904,18 +2908,19 @@
): Offset {
if (!canScroll()) return Offset.Zero
state.contentOffset += consumed.y
- if (state.heightOffset == 0f || state.heightOffset == state.heightOffsetLimit) {
- if (consumed.y == 0f && available.y > 0f) {
- // Reset the total content offset to zero when scrolling all the way down.
- // This will eliminate some float precision inaccuracies.
- state.contentOffset = 0f
- }
- }
if (!reverseLayout) state.heightOffset += consumed.y
return Offset.Zero
}
override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
+ if (
+ available.y > 0f &&
+ (state.heightOffset == 0f || state.heightOffset == state.heightOffsetLimit)
+ ) {
+ // Reset the total content offset to zero when scrolling all the way down.
+ // This will eliminate some float precision inaccuracies.
+ state.contentOffset = 0f
+ }
val superConsumed = super.onPostFling(consumed, available)
return superConsumed +
settleAppBar(state, available.y, flingAnimationSpec, snapAnimationSpec)
@@ -2980,12 +2985,6 @@
return Offset(0f, state.heightOffset - oldHeightOffset)
}
- if (consumed.y == 0f && available.y > 0) {
- // Reset the total content offset to zero when scrolling all the way down. This
- // will eliminate some float precision inaccuracies.
- state.contentOffset = 0f
- }
-
if (available.y > 0f) {
// Adjust the height offset in case the consumed delta Y is less than what was
// recorded as available delta Y in the pre-scroll.
@@ -2997,6 +2996,11 @@
}
override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {
+ if (available.y > 0) {
+ // Reset the total content offset to zero when scrolling all the way down. This
+ // will eliminate some float precision inaccuracies.
+ state.contentOffset = 0f
+ }
val superConsumed = super.onPostFling(consumed, available)
return superConsumed +
settleAppBar(state, available.y, flingAnimationSpec, snapAnimationSpec)
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
index 659ea38..8c95113 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
@@ -165,7 +165,6 @@
* preview the item in different states. Note that if `null` is provided, interactions will still
* happen internally.
*/
-@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun RowScope.NavigationBarItem(
selected: Boolean,
@@ -178,20 +177,117 @@
colors: NavigationBarItemColors = NavigationBarItemDefaults.colors(),
interactionSource: MutableInteractionSource? = null
) {
- val context =
- NavigationBarItemComponentOverrideContext(
- isSelected = selected,
- onClick = onClick,
- icon = icon,
- modifier = modifier,
- isEnabled = enabled,
- label = label,
- shouldAlwaysShowLabel = alwaysShowLabel,
- colors = colors,
- interactionSource = interactionSource,
- scope = this
+ @Suppress("NAME_SHADOWING")
+ val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
+ // TODO Load the motionScheme tokens from the component tokens file
+ val colorAnimationSpec = MotionSchemeKeyTokens.DefaultEffects.value<Color>()
+ val styledIcon =
+ @Composable {
+ val iconColor by
+ animateColorAsState(
+ targetValue = colors.iconColor(selected = selected, enabled = enabled),
+ animationSpec = colorAnimationSpec
+ )
+ // If there's a label, don't have a11y services repeat the icon description.
+ val clearSemantics = label != null && (alwaysShowLabel || selected)
+ Box(modifier = if (clearSemantics) Modifier.clearAndSetSemantics {} else Modifier) {
+ CompositionLocalProvider(LocalContentColor provides iconColor, content = icon)
+ }
+ }
+
+ val styledLabel: @Composable (() -> Unit)? =
+ label?.let {
+ @Composable {
+ val style = NavigationBarTokens.LabelTextFont.value
+ val textColor by
+ animateColorAsState(
+ targetValue = colors.textColor(selected = selected, enabled = enabled),
+ animationSpec = colorAnimationSpec
+ )
+ ProvideContentColorTextStyle(
+ contentColor = textColor,
+ textStyle = style,
+ content = label
+ )
+ }
+ }
+
+ var itemWidth by remember { mutableIntStateOf(0) }
+
+ Box(
+ modifier
+ .selectable(
+ selected = selected,
+ onClick = onClick,
+ enabled = enabled,
+ role = Role.Tab,
+ interactionSource = interactionSource,
+ indication = null,
+ )
+ .defaultMinSize(minHeight = NavigationBarHeight)
+ .weight(1f)
+ .onSizeChanged { itemWidth = it.width },
+ contentAlignment = Alignment.Center,
+ propagateMinConstraints = true,
+ ) {
+ val alphaAnimationProgress: State<Float> =
+ animateFloatAsState(
+ targetValue = if (selected) 1f else 0f,
+ // TODO Load the motionScheme tokens from the component tokens file
+ animationSpec = MotionSchemeKeyTokens.DefaultEffects.value()
+ )
+ val sizeAnimationProgress: State<Float> =
+ animateFloatAsState(
+ targetValue = if (selected) 1f else 0f,
+ // TODO Load the motionScheme tokens from the component tokens file
+ animationSpec = MotionSchemeKeyTokens.FastSpatial.value()
+ )
+ // The entire item is selectable, but only the indicator pill shows the ripple. To achieve
+ // this, we re-map the coordinates of the item's InteractionSource into the coordinates of
+ // the indicator.
+ val deltaOffset: Offset
+ with(LocalDensity.current) {
+ val indicatorWidth = NavigationBarVerticalItemTokens.ActiveIndicatorWidth.roundToPx()
+ deltaOffset =
+ Offset((itemWidth - indicatorWidth).toFloat() / 2, IndicatorVerticalOffset.toPx())
+ }
+ val offsetInteractionSource =
+ remember(interactionSource, deltaOffset) {
+ MappedInteractionSource(interactionSource, deltaOffset)
+ }
+
+ // The indicator has a width-expansion animation which interferes with the timing of the
+ // ripple, which is why they are separate composables
+ val indicatorRipple =
+ @Composable {
+ Box(
+ Modifier.layoutId(IndicatorRippleLayoutIdTag)
+ .clip(NavigationBarTokens.ItemActiveIndicatorShape.value)
+ .indication(offsetInteractionSource, ripple())
+ )
+ }
+ val indicator =
+ @Composable {
+ Box(
+ Modifier.layoutId(IndicatorLayoutIdTag)
+ .graphicsLayer { alpha = alphaAnimationProgress.value }
+ .background(
+ color = colors.indicatorColor,
+ shape = NavigationBarTokens.ItemActiveIndicatorShape.value,
+ )
+ )
+ }
+
+ NavigationBarItemLayout(
+ indicatorRipple = indicatorRipple,
+ indicator = indicator,
+ icon = styledIcon,
+ label = styledLabel,
+ alwaysShowLabel = alwaysShowLabel,
+ alphaAnimationProgress = { alphaAnimationProgress.value },
+ sizeAnimationProgress = { sizeAnimationProgress.value }
)
- with(LocalNavigationBarItemComponentOverride.current) { context.NavigationBarItem() }
+ }
}
/** Defaults used in [NavigationBar]. */
@@ -637,187 +733,6 @@
private val IndicatorVerticalOffset: Dp = 12.dp
-/* Interface that allows libraries to override the behavior of the [NavigationBarItem] component. */
-@ExperimentalMaterial3Api
-interface NavigationBarItemComponentOverride {
- /** Behavior function that is called by the [NavigationBarItem] component. */
- @Composable fun NavigationBarItemComponentOverrideContext.NavigationBarItem()
-}
-
-/**
- * Parameters available to [NavigationBarItem].
- *
- * @param isSelected whether this item is selected
- * @param onClick called when this item is clicked
- * @param icon icon for this item, typically an [Icon]
- * @param modifier the [Modifier] to be applied to this item
- * @param isEnabled controls the enabled state of this item. When `false`, this component will not
- * respond to user input, and it will appear visually disabled and disabled to accessibility
- * services.
- * @param label optional text label for this item
- * @param shouldAlwaysShowLabel whether to always show the label for this item. If `false`, the
- * label will only be shown when this item is selected.
- * @param colors [NavigationBarItemColors] that will be used to resolve the colors used for this
- * item in different states. See [NavigationBarItemDefaults.colors].
- * @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
- * emitting [Interaction]s for this item. You can use this to change the item's appearance or
- * preview the item in different states. Note that if `null` is provided, interactions will still
- * happen internally.
- */
-@ExperimentalMaterial3Api
-class NavigationBarItemComponentOverrideContext
-internal constructor(
- val isSelected: Boolean,
- val onClick: () -> Unit,
- val icon: @Composable () -> Unit,
- val modifier: Modifier,
- val isEnabled: Boolean,
- val label: @Composable (() -> Unit)?,
- val shouldAlwaysShowLabel: Boolean,
- val colors: NavigationBarItemColors,
- val interactionSource: MutableInteractionSource?,
- scope: RowScope
-) : RowScope by scope
-
-/** [NavigationBarItemComponentOverride] used when no override is specified. */
-@ExperimentalMaterial3Api
-object DefaultNavigationBarItemComponentOverride : NavigationBarItemComponentOverride {
- @Composable
- override fun NavigationBarItemComponentOverrideContext.NavigationBarItem() {
- @Suppress("NAME_SHADOWING")
- val interactionSource = interactionSource ?: remember { MutableInteractionSource() }
- // TODO Load the motionScheme tokens from the component tokens file
- val colorAnimationSpec = MotionSchemeKeyTokens.DefaultEffects.value<Color>()
- val styledIcon =
- @Composable {
- val iconColor by
- animateColorAsState(
- targetValue = colors.iconColor(selected = isSelected, enabled = isEnabled),
- animationSpec = colorAnimationSpec
- )
- // If there's a label, don't have a11y services repeat the icon description.
- val clearSemantics = label != null && (shouldAlwaysShowLabel || isSelected)
- Box(modifier = if (clearSemantics) Modifier.clearAndSetSemantics {} else Modifier) {
- CompositionLocalProvider(
- LocalContentColor provides iconColor,
- content = [email protected]
- )
- }
- }
-
- val styledLabel: @Composable (() -> Unit)? =
- label?.let {
- @Composable {
- val style = NavigationBarTokens.LabelTextFont.value
- val textColor by
- animateColorAsState(
- targetValue =
- colors.textColor(selected = isSelected, enabled = isEnabled),
- animationSpec = colorAnimationSpec
- )
- ProvideContentColorTextStyle(
- contentColor = textColor,
- textStyle = style,
- content = label
- )
- }
- }
-
- var itemWidth by remember { mutableIntStateOf(0) }
-
- Box(
- modifier
- .selectable(
- selected = isSelected,
- onClick = onClick,
- enabled = isEnabled,
- role = Role.Tab,
- interactionSource = interactionSource,
- indication = null,
- )
- .defaultMinSize(minHeight = NavigationBarHeight)
- .weight(1f)
- .onSizeChanged { itemWidth = it.width },
- contentAlignment = Alignment.Center,
- propagateMinConstraints = true,
- ) {
- val alphaAnimationProgress: State<Float> =
- animateFloatAsState(
- targetValue = if ([email protected]) 1f else 0f,
- // TODO Load the motionScheme tokens from the component tokens file
- animationSpec = MotionSchemeKeyTokens.DefaultEffects.value()
- )
- val sizeAnimationProgress: State<Float> =
- animateFloatAsState(
- targetValue = if ([email protected]) 1f else 0f,
- // TODO Load the motionScheme tokens from the component tokens file
- animationSpec = MotionSchemeKeyTokens.FastSpatial.value()
- )
- // The entire item is selectable, but only the indicator pill shows the ripple. To
- // achieve
- // this, we re-map the coordinates of the item's InteractionSource into the coordinates
- // of
- // the indicator.
- val deltaOffset: Offset
- with(LocalDensity.current) {
- val indicatorWidth =
- NavigationBarVerticalItemTokens.ActiveIndicatorWidth.roundToPx()
- deltaOffset =
- Offset(
- (itemWidth - indicatorWidth).toFloat() / 2,
- IndicatorVerticalOffset.toPx()
- )
- }
- val offsetInteractionSource =
- remember(interactionSource, deltaOffset) {
- MappedInteractionSource(interactionSource, deltaOffset)
- }
-
- // The indicator has a width-expansion animation which interferes with the timing of the
- // ripple, which is why they are separate composables
- val indicatorRipple =
- @Composable {
- Box(
- Modifier.layoutId(IndicatorRippleLayoutIdTag)
- .clip(NavigationBarTokens.ItemActiveIndicatorShape.value)
- .indication(offsetInteractionSource, ripple())
- )
- }
- val indicator =
- @Composable {
- Box(
- Modifier.layoutId(IndicatorLayoutIdTag)
- .graphicsLayer { alpha = alphaAnimationProgress.value }
- .background(
- color = [email protected],
- shape = NavigationBarTokens.ItemActiveIndicatorShape.value,
- )
- )
- }
-
- NavigationBarItemLayout(
- indicatorRipple = indicatorRipple,
- indicator = indicator,
- icon = styledIcon,
- label = styledLabel,
- alwaysShowLabel = [email protected],
- alphaAnimationProgress = { alphaAnimationProgress.value },
- sizeAnimationProgress = { sizeAnimationProgress.value }
- )
- }
- }
-}
-
-/** CompositionLocal containing the currently-selected [NavigationBarItemComponentOverride]. */
-@Suppress("OPT_IN_MARKER_ON_WRONG_TARGET")
-@get:ExperimentalMaterial3Api
-@ExperimentalMaterial3Api
-val LocalNavigationBarItemComponentOverride:
- ProvidableCompositionLocal<NavigationBarItemComponentOverride> =
- compositionLocalOf {
- DefaultNavigationBarItemComponentOverride
- }
-
/** Interface that allows libraries to override the behavior of the [NavigationBar] component. */
@ExperimentalMaterial3Api
interface NavigationBarComponentOverride {
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SplitButton.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SplitButton.kt
index aa113e2..d4c416f 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SplitButton.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SplitButton.kt
@@ -445,10 +445,11 @@
)
}
else -> {
- Modifier.padding(contentPadding)
+ Modifier
}
}
- ),
+ )
+ .padding(contentPadding),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically,
content = content
@@ -570,10 +571,11 @@
)
}
else -> {
- Modifier.padding(contentPadding)
+ Modifier
}
}
- ),
+ )
+ .padding(contentPadding),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically,
content = content
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusViewInteropTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusViewInteropTest.kt
index f2e5f03..68e69ae 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusViewInteropTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/FocusViewInteropTest.kt
@@ -20,7 +20,6 @@
import android.graphics.Rect as AndroidRect
import android.view.View
import android.widget.EditText
-import android.widget.LinearLayout
import androidx.compose.foundation.focusGroup
import androidx.compose.foundation.focusable
import androidx.compose.foundation.layout.Box
@@ -43,17 +42,13 @@
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.platform.LocalDensity
-import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.platform.LocalViewConfiguration
import androidx.compose.ui.platform.testTag
-import androidx.compose.ui.test.assertIsFocused
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.performTouchInput
-import androidx.compose.ui.test.requestFocus
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.IntRect
import androidx.compose.ui.unit.dp
@@ -212,212 +207,6 @@
assertThat(thirdFocused).isTrue()
}
- @Test
- fun moveFocusThroughUnfocusableComposeViewNext() {
- lateinit var topEditText: EditText
- lateinit var composeView: ComposeView
- lateinit var bottomEditText: EditText
- lateinit var focusManager: FocusManager
-
- rule.setContent {
- focusManager = LocalFocusManager.current
- AndroidView(
- modifier = Modifier.fillMaxSize(),
- factory = { context ->
- LinearLayout(context).also { linearLayout ->
- linearLayout.orientation = LinearLayout.VERTICAL
- EditText(context).also {
- linearLayout.addView(it)
- topEditText = it
- }
- ComposeView(context).also {
- it.setContent { Box(Modifier.size(10.dp)) }
- linearLayout.addView(it)
- composeView = it
- }
- EditText(context).also {
- linearLayout.addView(it)
- bottomEditText = it
- }
- }
- }
- )
- }
-
- rule.runOnIdle { topEditText.requestFocus() }
-
- rule.runOnIdle { focusManager.moveFocus(FocusDirection.Next) }
-
- rule.runOnIdle {
- assertThat(topEditText.isFocused).isFalse()
- assertThat(composeView.isFocused).isFalse()
- assertThat(bottomEditText.isFocused).isTrue()
- }
- }
-
- @Test
- fun moveFocusThroughUnfocusableComposeViewDown() {
- lateinit var topEditText: EditText
- lateinit var composeView: ComposeView
- lateinit var bottomEditText: EditText
- lateinit var focusManager: FocusManager
-
- rule.setContent {
- focusManager = LocalFocusManager.current
- AndroidView(
- modifier = Modifier.fillMaxSize(),
- factory = { context ->
- LinearLayout(context).also { linearLayout ->
- linearLayout.orientation = LinearLayout.VERTICAL
- EditText(context).also {
- linearLayout.addView(it)
- topEditText = it
- }
- ComposeView(context).also {
- it.setContent { Box(Modifier.size(10.dp)) }
- linearLayout.addView(it)
- composeView = it
- }
- EditText(context).also {
- linearLayout.addView(it)
- bottomEditText = it
- }
- }
- }
- )
- }
-
- rule.runOnIdle { topEditText.requestFocus() }
-
- rule.runOnIdle { focusManager.moveFocus(FocusDirection.Down) }
-
- rule.runOnIdle {
- assertThat(topEditText.isFocused).isFalse()
- assertThat(composeView.isFocused).isFalse()
- assertThat(bottomEditText.isFocused).isTrue()
- }
- }
-
- @Test
- fun focusBetweenComposeViews_NextPrevious() {
- lateinit var focusManager: FocusManager
-
- rule.setContent {
- focusManager = LocalFocusManager.current
- AndroidView(
- modifier = Modifier.fillMaxSize(),
- factory = { context ->
- LinearLayout(context).also { linearLayout ->
- linearLayout.orientation = LinearLayout.VERTICAL
- ComposeView(context).also {
- it.setContent {
- Box(
- Modifier.size(10.dp)
- .focusProperties { canFocus = true }
- .focusable()
- .testTag("button1")
- )
- }
- linearLayout.addView(it)
- }
- ComposeView(context).also {
- it.setContent {
- Box(
- Modifier.size(10.dp)
- .focusProperties { canFocus = true }
- .focusable()
- .testTag("button2")
- )
- }
- linearLayout.addView(it)
- }
- ComposeView(context).also {
- it.setContent {
- Box(
- Modifier.size(10.dp)
- .focusProperties { canFocus = true }
- .focusable()
- .testTag("button3")
- )
- }
- linearLayout.addView(it)
- }
- }
- }
- )
- }
- rule.onNodeWithTag("button1").requestFocus()
- rule.onNodeWithTag("button1").assertIsFocused()
- rule.runOnIdle { focusManager.moveFocus(FocusDirection.Next) }
- rule.onNodeWithTag("button2").assertIsFocused()
- rule.runOnIdle { focusManager.moveFocus(FocusDirection.Next) }
- rule.onNodeWithTag("button3").assertIsFocused()
- rule.runOnIdle { focusManager.moveFocus(FocusDirection.Previous) }
- rule.onNodeWithTag("button2").assertIsFocused()
- rule.runOnIdle { focusManager.moveFocus(FocusDirection.Previous) }
- rule.onNodeWithTag("button1").assertIsFocused()
- }
-
- @Test
- fun focusBetweenComposeViews_DownUp() {
- lateinit var focusManager: FocusManager
-
- rule.setContent {
- focusManager = LocalFocusManager.current
- AndroidView(
- modifier = Modifier.fillMaxSize(),
- factory = { context ->
- LinearLayout(context).also { linearLayout ->
- linearLayout.orientation = LinearLayout.VERTICAL
- ComposeView(context).also {
- it.setContent {
- Box(
- Modifier.size(10.dp)
- .focusProperties { canFocus = true }
- .focusable()
- .testTag("button1")
- )
- }
- linearLayout.addView(it)
- }
- ComposeView(context).also {
- it.setContent {
- Box(
- Modifier.size(10.dp)
- .focusProperties { canFocus = true }
- .focusable()
- .testTag("button2")
- )
- }
- linearLayout.addView(it)
- }
- ComposeView(context).also {
- it.setContent {
- Box(
- Modifier.size(10.dp)
- .focusProperties { canFocus = true }
- .focusable()
- .testTag("button3")
- )
- }
- linearLayout.addView(it)
- }
- }
- }
- )
- }
- rule.onNodeWithTag("button1").requestFocus()
- rule.onNodeWithTag("button1").assertIsFocused()
- rule.runOnIdle { focusManager.moveFocus(FocusDirection.Down) }
- rule.onNodeWithTag("button2").assertIsFocused()
- rule.runOnIdle { focusManager.moveFocus(FocusDirection.Down) }
- rule.onNodeWithTag("button3").assertIsFocused()
- rule.runOnIdle { focusManager.moveFocus(FocusDirection.Up) }
- rule.onNodeWithTag("button2").assertIsFocused()
- rule.runOnIdle { focusManager.moveFocus(FocusDirection.Up) }
- rule.onNodeWithTag("button1").assertIsFocused()
- }
-
private fun View.getFocusedRect() =
AndroidRect().run {
rule.runOnIdle { getFocusedRect(this) }
diff --git a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/OwnerFocusTest.kt b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/OwnerFocusTest.kt
index 334d095..71f1d7e 100644
--- a/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/OwnerFocusTest.kt
+++ b/compose/ui/ui/src/androidInstrumentedTest/kotlin/androidx/compose/ui/focus/OwnerFocusTest.kt
@@ -248,8 +248,7 @@
// Assert.
rule.runOnIdle {
- // b/369256395 we must return true when we advertise that we're focusable
- assertThat(success).isTrue()
+ assertThat(success).isFalse()
assertThat(ownerView.isFocused).isFalse()
}
}
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 abb6040..84d116a 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
@@ -107,6 +107,7 @@
import androidx.compose.ui.focus.focusRect
import androidx.compose.ui.focus.is1dFocusSearch
import androidx.compose.ui.focus.isBetterCandidate
+import androidx.compose.ui.focus.requestFocus
import androidx.compose.ui.focus.requestInteropFocus
import androidx.compose.ui.focus.toAndroidFocusDirection
import androidx.compose.ui.focus.toFocusDirection
@@ -325,73 +326,28 @@
override val windowInfo: WindowInfo
get() = _windowInfo
- /**
- * Because AndroidComposeView always accepts focus, we have to divert focus to another View if
- * there is nothing focusable within. However, if there are only nonfocusable ComposeViews, then
- * the redirection can recurse infinitely. This makes sure that if that happens, then it can
- * bail when it is detected
- */
- private var isInRequestFocus = false
-
// When move focus is triggered by a key event, and move focus does not cause any focus change,
// we return the key event to the view system if focus search finds a suitable view which is not
// a compose sub-view. However if move focus is triggered programmatically, we have to manually
// implement this behavior because the view system does not have a moveFocus API.
private fun onMoveFocusInChildren(focusDirection: FocusDirection): Boolean {
+
// The view system does not have an API corresponding to Enter/Exit.
if (focusDirection == Enter || focusDirection == Exit) return false
- val androidViewsHandler = _androidViewsHandler ?: return false
-
val direction =
checkNotNull(focusDirection.toAndroidFocusDirection()) { "Invalid focus direction" }
+ val focusedRect = onFetchFocusRect()?.toAndroidRect()
- val root = rootView as ViewGroup
-
- val currentFocus = root.findFocus()
-
- val focusFinder = FocusFinder.getInstance()
- val nextView: View?
- val focusedRect: Rect?
- if (currentFocus == null) {
- focusedRect = null
- nextView = focusFinder.findNextFocus(root, null, direction)
- } else if (focusDirection.is1dFocusSearch() && androidViewsHandler.hasFocus()) {
- focusedRect = null
- if (SDK_INT >= O) {
- // On newer devices, the focus is normal and we can expect forward/next to work
- nextView = focusFinder.findNextFocus(root, currentFocus, direction)
- } else {
- // On older devices, FocusFinder doesn't properly order Views, so we have to use
- // a copy of the focus finder the corrects the order
- nextView = FocusFinderCompat.instance.findNextFocus1d(root, currentFocus, direction)
+ val nextView =
+ FocusFinder.getInstance().let {
+ if (focusedRect == null) {
+ it.findNextFocus(this, findFocus(), direction)
+ } else {
+ it.findNextFocusFromRect(this, focusedRect, direction)
+ }
}
- } else {
- focusedRect = onFetchFocusRect()?.toAndroidRect()
- nextView = focusFinder.findNextFocusFromRect(root, focusedRect, direction)
- nextView?.getLocationInWindow(tmpPositionArray)
- val nextPositionX = tmpPositionArray[0]
- val nextPositionY = tmpPositionArray[1]
- getLocationInWindow(tmpPositionArray)
- focusedRect!!.offset(
- tmpPositionArray[0] - nextPositionX,
- tmpPositionArray[1] - nextPositionY
- )
- }
-
- // is it part of the compose hierarchy?
- if (nextView == null || nextView === currentFocus) {
- return false
- }
-
- var nextParent = nextView.parent
- while (nextParent != null && nextParent !== androidViewsHandler) {
- nextParent = nextParent.parent
- }
- if (nextParent == null) {
- return false // not a part of the compose hierarchy
- }
- return nextView.requestInteropFocus(direction, focusedRect)
+ return nextView?.requestInteropFocus(direction, focusedRect) ?: false
}
// If this root view is focused, we can get the focus rect from focusOwner. But if a sub-view
@@ -434,20 +390,11 @@
// instead be visited when the AndroidView around them gets a moveFocus(Enter)).
val androidDirection =
checkNotNull(focusDirection.toAndroidFocusDirection()) { "Invalid focus direction" }
+ val androidRect = checkNotNull(focusedRect?.toAndroidRect()) { "Invalid rect" }
val nextView = findNextNonChildView(androidDirection).takeIf { it != this }
- if (nextView != null) {
- val androidRect = checkNotNull(focusedRect?.toAndroidRect()) { "Invalid rect" }
- nextView.getLocationInWindow(tmpPositionArray)
- val nextX = tmpPositionArray[0]
- val nextY = tmpPositionArray[1]
- getLocationInWindow(tmpPositionArray)
- val currentX = tmpPositionArray[0]
- val currentY = tmpPositionArray[1]
- androidRect.offset(currentX - nextX, currentY - nextY)
- if (nextView.requestInteropFocus(androidDirection, androidRect)) {
- return@onKeyEvent true
- }
+ if (nextView != null && nextView.requestInteropFocus(androidDirection, androidRect)) {
+ return@onKeyEvent true
}
// Focus finder couldn't find another view. We manually wrap around since focus remained
@@ -471,9 +418,10 @@
private fun findNextNonChildView(direction: Int): View? {
var currentView: View? = this
- val focusFinder = FocusFinder.getInstance()
while (currentView != null) {
- currentView = focusFinder.findNextFocus(rootView as ViewGroup, currentView, direction)
+ currentView =
+ FocusFinder.getInstance()
+ .findNextFocus(rootView as ViewGroup, currentView, direction)
if (currentView != null && !containsDescendant(currentView)) return currentView
}
return null
@@ -986,10 +934,6 @@
// This view is already focused.
if (isFocused) return true
- // There is nothing focusable and we've looped around all Views back to this one, so
- // we just return false to indicate that nothing can be focused.
- if (isInRequestFocus) return false
-
// If the root has focus, it means a sub-view is focused,
// and is trying to move focus within itself.
if (focusOwner.rootState.hasFocus) {
@@ -997,41 +941,12 @@
}
val focusDirection = toFocusDirection(direction) ?: Enter
- var foundFocusable = false
- val focusSearchResult =
- focusOwner.focusSearch(
- focusDirection = focusDirection,
- focusedRect = previouslyFocusedRect?.toComposeRect()
- ) {
- foundFocusable = true
- it.requestFocus(focusDirection)
- }
- if (focusSearchResult == null) {
- return false // The focus search was canceled
- }
- if (focusSearchResult) {
- return true // We found something to focus on
- }
- if (foundFocusable) {
- return false // The requestFocus() from within the focusSearch was canceled
- }
-
- // We advertised ourselves as focusable, but we aren't. Try to just move the focus to the
- // next item.
- val nextFocusedView = findNextNonChildView(direction)
-
- // Can crash if we return false when we've advertised ourselves as focusable and we aren't
- // b/369256395
- if (nextFocusedView == null || nextFocusedView === this) {
- // There is no next View, so just return true so we don't cause a crash
- return true
- }
-
- // Try to focus on the next focusable View
- isInRequestFocus = true
- val requestFocusResult = nextFocusedView.requestFocus(direction)
- isInRequestFocus = false
- return requestFocusResult
+ return focusOwner.focusSearch(
+ focusDirection = focusDirection,
+ focusedRect = previouslyFocusedRect?.toComposeRect()
+ ) {
+ it.requestFocus(focusDirection)
+ } ?: false
}
private fun onRequestFocusForOwner(
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/FocusFinderCompat.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/FocusFinderCompat.android.kt
deleted file mode 100644
index 9a42b02..0000000
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/FocusFinderCompat.android.kt
+++ /dev/null
@@ -1,462 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 android.annotation.SuppressLint
-import android.content.pm.PackageManager
-import android.graphics.Rect
-import android.os.Build
-import android.view.View
-import android.view.View.FOCUS_BACKWARD
-import android.view.View.FOCUS_FORWARD
-import android.view.ViewGroup
-import androidx.collection.MutableObjectList
-import androidx.collection.ObjectList
-import androidx.collection.mutableObjectIntMapOf
-import androidx.collection.mutableScatterMapOf
-import androidx.collection.mutableScatterSetOf
-import androidx.core.view.isVisible
-import java.util.Collections
-
-/**
- * On devices before [Build.VERSION_CODES.O], [FocusFinder] orders Views incorrectly. This
- * implementation uses the current [FocusFinder] behavior, ordering Views correctly for
- * one-dimensional focus searches.
- *
- * This is copied and simplified from FocusFinder's source. There may be some code that doesn't look
- * quite right in Kotlin as it was copy/pasted with auto-translation.
- */
-internal class FocusFinderCompat {
- companion object {
- private val FocusFinderThreadLocal =
- object : ThreadLocal<FocusFinderCompat>() {
- override fun initialValue(): FocusFinderCompat {
- return FocusFinderCompat()
- }
- }
-
- /** Get the focus finder for this thread. */
- val instance: FocusFinderCompat
- get() = FocusFinderThreadLocal.get()!!
- }
-
- private val focusedRect: Rect = Rect()
-
- private val userSpecifiedFocusComparator =
- UserSpecifiedFocusComparator({ r, v ->
- if (isValidId(v.nextFocusForwardId)) v.findUserSetNextFocus(r, FOCUS_FORWARD) else null
- })
-
- private val tmpList = MutableObjectList<View>()
-
- // enforce thread local access
- private fun FocusFinder() {}
-
- /**
- * Find the next view to take focus in root's descendants, starting from the view that currently
- * is focused.
- *
- * @param root Contains focused. Cannot be null.
- * @param focused Has focus now.
- * @param direction Direction to look.
- * @return The next focusable view, or null if none exists.
- */
- fun findNextFocus1d(root: ViewGroup, focused: View, direction: Int): View? {
- val effectiveRoot = getEffectiveRoot(root, focused)
- var next = findNextUserSpecifiedFocus(effectiveRoot, focused, direction)
- if (next != null) {
- return next
- }
- val focusables = tmpList
- try {
- focusables.clear()
- effectiveRoot.addFocusableViews(focusables, direction)
- if (!focusables.isEmpty()) {
- next = findNextFocus(effectiveRoot, focused, direction, focusables)
- }
- } finally {
- focusables.clear()
- }
- return next
- }
-
- /**
- * Returns the "effective" root of a view. The "effective" root is the closest ancestor
- * within-which focus should cycle.
- *
- * For example: normal focus navigation would stay within a ViewGroup marked as
- * touchscreenBlocksFocus and keyboardNavigationCluster until a cluster-jump out.
- *
- * @return the "effective" root of {@param focused}
- */
- private fun getEffectiveRoot(root: ViewGroup, focused: View?): ViewGroup {
- if (focused == null || focused === root) {
- return root
- }
- var effective: ViewGroup? = null
- var nextParent = focused.parent
- while (nextParent is ViewGroup) {
- if (nextParent === root) {
- return effective ?: root
- }
- val vg = nextParent
- if (
- vg.touchscreenBlocksFocus &&
- focused.context.packageManager.hasSystemFeature(
- PackageManager.FEATURE_TOUCHSCREEN
- )
- ) {
- // Don't stop and return here because the cluster could be nested and we only
- // care about the top-most one.
- effective = vg
- }
- nextParent = nextParent.parent
- }
- return root
- }
-
- private fun findNextUserSpecifiedFocus(root: ViewGroup, focused: View, direction: Int): View? {
- // check for user specified next focus
- var userSetNextFocus: View? = focused.findUserSetNextFocus(root, direction)
- var cycleCheck = userSetNextFocus
- var cycleStep = true // we want the first toggle to yield false
- while (userSetNextFocus != null) {
- if (
- userSetNextFocus.isFocusable &&
- userSetNextFocus.visibility == View.VISIBLE &&
- (!userSetNextFocus.isInTouchMode || userSetNextFocus.isFocusableInTouchMode)
- ) {
- return userSetNextFocus
- }
- userSetNextFocus = userSetNextFocus.findUserSetNextFocus(root, direction)
- if ((!cycleStep).also { cycleStep = it }) {
- cycleCheck = cycleCheck?.findUserSetNextFocus(root, direction)
- if (cycleCheck === userSetNextFocus) {
- // found a cycle, user-specified focus forms a loop and none of the views
- // are currently focusable.
- break
- }
- }
- }
- return null
- }
-
- private fun findNextFocus(
- root: ViewGroup,
- focused: View,
- direction: Int,
- focusables: MutableObjectList<View>
- ): View? {
- val focusedRect = focusedRect
- // fill in interesting rect from focused
- focused.getFocusedRect(focusedRect)
- root.offsetDescendantRectToMyCoords(focused, focusedRect)
-
- return findNextFocusInRelativeDirection(focusables, root, focused, direction)
- }
-
- @SuppressLint("AsCollectionCall")
- private fun findNextFocusInRelativeDirection(
- focusables: MutableObjectList<View>,
- root: ViewGroup?,
- focused: View,
- direction: Int
- ): View? {
- try {
- // Note: This sort is stable.
- userSpecifiedFocusComparator.setFocusables(focusables, root!!)
- Collections.sort(focusables.asMutableList(), userSpecifiedFocusComparator)
- } finally {
- userSpecifiedFocusComparator.recycle()
- }
-
- val count = focusables.size
- if (count < 2) {
- return null
- }
- var next: View? = null
- val looped = BooleanArray(1)
- when (direction) {
- FOCUS_FORWARD -> next = getNextFocusable(focused, focusables, count, looped)
- FOCUS_BACKWARD -> next = getPreviousFocusable(focused, focusables, count, looped)
- }
- return next ?: focusables[count - 1]
- }
-
- private fun getNextFocusable(
- focused: View,
- focusables: ObjectList<View>,
- count: Int,
- outLooped: BooleanArray
- ): View? {
- if (count < 2) {
- return null
- }
- val position = focusables.lastIndexOf(focused)
- if (position >= 0 && position + 1 < count) {
- return focusables[position + 1]
- }
- outLooped[0] = true
- return focusables[0]
- }
-
- private fun getPreviousFocusable(
- focused: View?,
- focusables: ObjectList<View>,
- count: Int,
- outLooped: BooleanArray
- ): View? {
- if (count < 2) {
- return null
- }
- if (focused != null) {
- val position = focusables.indexOf(focused)
- if (position > 0) {
- return focusables[position - 1]
- }
- }
- outLooped[0] = true
- return focusables[count - 1]
- }
-
- private fun isValidId(id: Int): Boolean {
- return id != 0 && id != View.NO_ID
- }
-
- /**
- * Sorts views according to any explicitly-specified focus-chains. If there are no explicitly
- * specified focus chains (eg. no nextFocusForward attributes defined), this should be a no-op.
- */
- private class UserSpecifiedFocusComparator(private val mNextFocusGetter: NextFocusGetter) :
- Comparator<View?> {
- private val nextFoci = mutableScatterMapOf<View, View>()
- private val isConnectedTo = mutableScatterSetOf<View>()
- private val headsOfChains = mutableScatterMapOf<View, View>()
- private val originalOrdinal = mutableObjectIntMapOf<View>()
- private var root: View? = null
-
- fun interface NextFocusGetter {
- fun get(root: View, view: View): View?
- }
-
- fun recycle() {
- root = null
- headsOfChains.clear()
- isConnectedTo.clear()
- originalOrdinal.clear()
- nextFoci.clear()
- }
-
- fun setFocusables(focusables: ObjectList<View>, root: View) {
- this.root = root
- focusables.forEachIndexed { index, view -> originalOrdinal[view] = index }
-
- for (i in focusables.indices.reversed()) {
- val view = focusables[i]
- val next = mNextFocusGetter.get(root, view)
- if (next != null && originalOrdinal.containsKey(next)) {
- nextFoci[view] = next
- isConnectedTo.add(next)
- }
- }
-
- for (i in focusables.indices.reversed()) {
- val view = focusables[i]
- val next = nextFoci[view]
- if (next != null && !isConnectedTo.contains(view)) {
- setHeadOfChain(view)
- }
- }
- }
-
- fun setHeadOfChain(head: View) {
- var newHead = head
- var view: View? = newHead
- while (view != null) {
- val otherHead = headsOfChains[view]
- if (otherHead != null) {
- if (otherHead === newHead) {
- return // This view has already had its head set properly
- }
- // A hydra -- multi-headed focus chain (e.g. A->C and B->C)
- // Use the one we've already chosen instead and reset this chain.
- view = newHead
- newHead = otherHead
- }
- headsOfChains[view] = newHead
- view = nextFoci[view]
- }
- }
-
- override fun compare(first: View?, second: View?): Int {
- if (first === second) {
- return 0
- }
- if (first == null) {
- return -1
- }
- if (second == null) {
- return 1
- }
- // Order between views within a chain is immaterial -- next/previous is
- // within a chain is handled elsewhere.
- val firstHead = headsOfChains[first]
- val secondHead = headsOfChains[second]
- if (firstHead === secondHead && firstHead != null) {
- return if (first === firstHead) {
- -1 // first is the head, it should be first
- } else if (second === firstHead) {
- 1 // second is the head, it should be first
- } else if (nextFoci[first] != null) {
- -1 // first is not the end of the chain
- } else {
- 1 // first is end of chain
- }
- }
- val chainedFirst = firstHead ?: first
- val chainedSecond = secondHead ?: second
-
- return if (firstHead != null || secondHead != null) {
- // keep original order between chains
- if (originalOrdinal[chainedFirst] < originalOrdinal[chainedSecond]) -1 else 1
- } else {
- 0
- }
- }
- }
-}
-
-/**
- * If a user manually specified the next view id for a particular direction, use the root to look up
- * the view.
- *
- * @param root The root view of the hierarchy containing this view.
- * @param direction One of FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, FOCUS_RIGHT, FOCUS_FORWARD, or
- * FOCUS_BACKWARD.
- * @return The user specified next view, or null if there is none.
- */
-private fun View.findUserSetNextFocus(root: View, direction: Int): View? {
- when (direction) {
- FOCUS_FORWARD -> {
- val next = nextFocusForwardId
- if (next == View.NO_ID) return null
- return findViewInsideOutShouldExist(root, this, next)
- }
- FOCUS_BACKWARD -> {
- if (id == View.NO_ID) return null
- val startView: View = this
- // Since we have forward links but no backward links, we need to find the view that
- // forward links to this view. We can't just find the view with the specified ID
- // because view IDs need not be unique throughout the tree.
- return root.findViewByPredicateInsideOut(startView) { t ->
- (findViewInsideOutShouldExist(root, t, t.nextFocusForwardId) === startView)
- }
- }
- }
- return null
-}
-
-private fun findViewInsideOutShouldExist(root: View, start: View, id: Int): View? {
- return root.findViewByPredicateInsideOut(start) { it.id == id }
-}
-
-/**
- * Look for a child view that matches the specified predicate, starting with the specified view and
- * its descendants and then recursively searching the ancestors and siblings of that view until this
- * view is reached.
- *
- * This method is useful in cases where the predicate does not match a single unique view (perhaps
- * multiple views use the same id) and we are trying to find the view that is "closest" in scope to
- * the starting view.
- *
- * @param start The view to start from.
- * @param predicate The predicate to evaluate.
- * @return The first view that matches the predicate or null.
- */
-private fun View.findViewByPredicateInsideOut(start: View, predicate: (View) -> Boolean): View? {
- var next = start
- var childToSkip: View? = null
- while (true) {
- val view = next.findViewByPredicateTraversal(predicate, childToSkip)
- if (view != null || next === this) {
- return view
- }
-
- val parent = next.parent
- if (parent == null || parent !is View) {
- return null
- }
-
- childToSkip = next
- next = parent
- }
-}
-
-/**
- * @param predicate The predicate to evaluate.
- * @param childToSkip If not null, ignores this child during the recursive traversal.
- * @return The first view that matches the predicate or null.
- */
-private fun View.findViewByPredicateTraversal(
- predicate: (View) -> Boolean,
- childToSkip: View?
-): View? {
- if (predicate(this)) {
- return this
- }
- if (this is ViewGroup) {
- for (i in 0 until childCount) {
- val child = getChildAt(i)
- if (child !== childToSkip) {
- val v = child.findViewByPredicateTraversal(predicate, childToSkip)
- if (v != null) {
- return v
- }
- }
- }
- }
- return null
-}
-
-private fun View.addFocusableViews(views: MutableObjectList<View>, direction: Int) {
- addFocusableViews(views, direction, isInTouchMode)
-}
-
-/**
- * Older versions of View don't add focusable Views in order. This is a corrected version that adds
- * them in the right order.
- */
-private fun View.addFocusableViews(
- views: MutableObjectList<View>,
- direction: Int,
- inTouchMode: Boolean
-) {
- if (
- isVisible &&
- isFocusable &&
- isEnabled &&
- width > 0 &&
- height > 0 &&
- (!inTouchMode || isFocusableInTouchMode)
- ) {
- views += this
- }
- if (this is ViewGroup) {
- for (i in 0 until childCount) {
- getChildAt(i).addFocusableViews(views, direction, inTouchMode)
- }
- }
-}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwnerImpl.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwnerImpl.kt
index 56e3cba..8741918 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwnerImpl.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/focus/FocusOwnerImpl.kt
@@ -222,12 +222,8 @@
// If focus search and request focus succeeded, move focus succeeded.
if (focusSearchSuccess == true && requestFocusSuccess == true) return true
- // If we couldn't move focus within compose, we attempt to move focus within embedded views.
- val moveFocusInteropResult = onMoveFocusInterop(focusDirection)
-
- // If there is no View to be focused on and it is Next or Previous direction, wrap
- // around.
- if (!moveFocusInteropResult && focusDirection.is1dFocusSearch()) {
+ // To wrap focus around, we clear focus and request initial focus.
+ if (focusDirection.is1dFocusSearch()) {
val clearFocus =
clearFocus(
force = false,
@@ -237,7 +233,11 @@
)
return clearFocus && takeFocus(focusDirection, previouslyFocusedRect = null)
}
- return moveFocusInteropResult
+
+ // If we couldn't move focus within compose, we attempt to move focus within embedded views.
+ // We don't need this for 1D focus search because the wrap-around logic triggers a
+ // focus exit which will perform a focus search among the subviews.
+ return onMoveFocusInterop(focusDirection)
}
override fun focusSearch(
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/TestUtils.kt b/credentials/credentials/src/androidTest/java/androidx/credentials/TestUtils.kt
index 1c6aa3f..402df12 100644
--- a/credentials/credentials/src/androidTest/java/androidx/credentials/TestUtils.kt
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/TestUtils.kt
@@ -494,6 +494,28 @@
equals(getCredentialResponse1.credential, getCredentialResponse2.credential)
}
+@RequiresApi(34)
+fun assertEquals(
+ actual: android.credentials.CreateCredentialResponse,
+ expected: CreatePasswordResponse
+) {
+ assertEquals(actual.data, expected.data)
+}
+
+@RequiresApi(34)
+fun assertEquals(
+ actual: android.credentials.GetCredentialResponse,
+ expected: GetCredentialResponse
+) {
+ equals(actual.credential, expected.credential)
+}
+
+@RequiresApi(34)
+fun equals(actual: android.credentials.Credential, expected: Credential) {
+ assertThat(actual.type).isEqualTo(expected.type)
+ equals(actual.data, expected.data)
+}
+
fun equals(credential1: Credential, credential2: Credential) {
assertThat(credential1.type).isEqualTo(credential2.type)
equals(credential1.data, credential2.data)
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/provider/PendingIntentHandlerApi34JavaTest.java b/credentials/credentials/src/androidTest/java/androidx/credentials/provider/PendingIntentHandlerApi34JavaTest.java
index 031750f..d1d5a32 100644
--- a/credentials/credentials/src/androidTest/java/androidx/credentials/provider/PendingIntentHandlerApi34JavaTest.java
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/provider/PendingIntentHandlerApi34JavaTest.java
@@ -21,6 +21,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
+import android.content.Context;
import android.content.Intent;
import android.content.pm.SigningInfo;
import android.credentials.CredentialOption;
@@ -38,6 +39,7 @@
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
+import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -69,6 +71,8 @@
private static final String BIOMETRIC_AUTHENTICATOR_ERROR_MSG = "error";
+ private final Context mContext = InstrumentationRegistry.getInstrumentation().getContext();
+
@Test
public void test_retrieveProviderCreateCredReqWithSuccessBpAuthJetpack_retrieveJetpackResult() {
for (int jetpackResult :
@@ -292,12 +296,7 @@
@Test
public void test_setGetCreateCredentialException() {
- if (Build.VERSION.SDK_INT >= 34) {
- return;
- }
-
Intent intent = new Intent();
-
CreateCredentialInterruptedException initialException =
new CreateCredentialInterruptedException("message");
@@ -307,26 +306,16 @@
IntentHandlerConverters.getCreateCredentialException(intent);
assertThat(finalException).isNotNull();
assertThat(finalException.getMessage()).isEqualTo(initialException.getMessage());
+ assertThat(finalException.getType()).isEqualTo(initialException.getType());
}
@Test
- public void test_setGetCreateCredentialException_throwsWhenEmptyIntent() {
- if (Build.VERSION.SDK_INT >= 34) {
- return;
- }
-
- assertThat(
- IntentHandlerConverters.getCreateCredentialException(
- BLANK_INTENT))
- .isNull();
+ public void test_setGetCreateCredentialException_nullWhenEmptyIntent() {
+ assertThat(IntentHandlerConverters.getCreateCredentialException(BLANK_INTENT)).isNull();
}
@Test
public void test_credentialException() {
- if (Build.VERSION.SDK_INT >= 34) {
- return;
- }
-
Intent intent = new Intent();
GetCredentialInterruptedException initialException =
new GetCredentialInterruptedException("message");
@@ -336,25 +325,17 @@
android.credentials.GetCredentialException finalException =
IntentHandlerConverters.getGetCredentialException(intent);
assertThat(finalException).isNotNull();
- assertThat(finalException).isEqualTo(initialException);
+ assertThat(finalException.getMessage()).isEqualTo(initialException.getMessage());
+ assertThat(finalException.getType()).isEqualTo(initialException.getType());
}
@Test
- public void test_credentialException_throwsWhenEmptyIntent() {
- if (Build.VERSION.SDK_INT >= 34) {
- return;
- }
-
- assertThat(IntentHandlerConverters.getGetCredentialException(BLANK_INTENT))
- .isNull();
+ public void test_credentialException_nullWhenEmptyIntent() {
+ assertThat(IntentHandlerConverters.getGetCredentialException(BLANK_INTENT)).isNull();
}
@Test
public void test_beginGetResponse() {
- if (Build.VERSION.SDK_INT >= 34) {
- return;
- }
-
Intent intent = new Intent();
BeginGetCredentialResponse initialResponse =
new BeginGetCredentialResponse.Builder().build();
@@ -364,25 +345,17 @@
BeginGetCredentialResponse finalResponse =
IntentHandlerConverters.getBeginGetResponse(intent);
assertThat(finalResponse).isNotNull();
- assertThat(finalResponse).isEqualTo(initialResponse);
+ TestUtilsKt.assertEquals(mContext, finalResponse, initialResponse);
}
@Test
public void test_beginGetResponse_throwsWhenEmptyIntent() {
- if (Build.VERSION.SDK_INT >= 34) {
- return;
- }
-
assertThat(IntentHandlerConverters.getBeginGetResponse(BLANK_INTENT))
.isNull();
}
@Test
public void test_credentialResponse() {
- if (Build.VERSION.SDK_INT >= 34) {
- return;
- }
-
Intent intent = new Intent();
PasswordCredential credential = new PasswordCredential("a", "b");
GetCredentialResponse initialResponse = new GetCredentialResponse(credential);
@@ -392,15 +365,11 @@
android.credentials.GetCredentialResponse finalResponse =
IntentHandlerConverters.getGetCredentialResponse(intent);
assertThat(finalResponse).isNotNull();
- assertThat(finalResponse).isEqualTo(initialResponse);
+ TestUtilsKt.assertEquals(finalResponse, initialResponse);
}
@Test
- public void test_credentialResponse_throwsWhenEmptyIntent() {
- if (Build.VERSION.SDK_INT >= 34) {
- return;
- }
-
+ public void test_credentialResponse_nullWhenEmptyIntent() {
assertThat(IntentHandlerConverters.getGetCredentialResponse(BLANK_INTENT))
.isNull();
}
@@ -519,10 +488,6 @@
@Test
public void test_createCredentialCredentialResponse() {
- if (Build.VERSION.SDK_INT >= 34) {
- return;
- }
-
Intent intent = new Intent();
CreatePasswordResponse initialResponse = new CreatePasswordResponse();
@@ -532,18 +497,12 @@
IntentHandlerConverters.getCreateCredentialCredentialResponse(
intent);
assertThat(finalResponse).isNotNull();
- assertThat(finalResponse).isEqualTo(initialResponse);
+ TestUtilsKt.assertEquals(finalResponse, initialResponse);
}
@Test
- public void test_createCredentialCredentialResponse_throwsWhenEmptyIntent() {
- if (Build.VERSION.SDK_INT >= 34) {
- return;
- }
-
- assertThat(
- IntentHandlerConverters
- .getCreateCredentialCredentialResponse(BLANK_INTENT))
+ public void test_createCredentialCredentialResponse_nullWhenEmptyIntent() {
+ assertThat(IntentHandlerConverters.getCreateCredentialCredentialResponse(BLANK_INTENT))
.isNull();
}
}
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/provider/PendingIntentHandlerApi34Test.kt b/credentials/credentials/src/androidTest/java/androidx/credentials/provider/PendingIntentHandlerApi34Test.kt
index 9d9daee..59acd5d 100644
--- a/credentials/credentials/src/androidTest/java/androidx/credentials/provider/PendingIntentHandlerApi34Test.kt
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/provider/PendingIntentHandlerApi34Test.kt
@@ -18,7 +18,6 @@
import android.content.Intent
import android.content.pm.SigningInfo
import android.credentials.CredentialOption
-import android.os.Build
import android.os.Bundle
import android.service.credentials.CallingAppInfo
import android.service.credentials.CreateCredentialRequest
@@ -27,6 +26,7 @@
import androidx.credentials.CreatePasswordResponse
import androidx.credentials.GetCredentialResponse
import androidx.credentials.PasswordCredential
+import androidx.credentials.assertEquals
import androidx.credentials.equals
import androidx.credentials.exceptions.CreateCredentialInterruptedException
import androidx.credentials.exceptions.GetCredentialInterruptedException
@@ -34,6 +34,7 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SdkSuppress
import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
import com.google.common.truth.Truth.assertThat
import org.junit.Assert
import org.junit.Test
@@ -68,6 +69,8 @@
private const val FRAMEWORK_EXPECTED_CONSTANT_AUTH_RESULT =
"androidx.credentials.provider.BIOMETRIC_AUTH_RESULT"
+
+ private val context = InstrumentationRegistry.getInstrumentation().context
}
@Test
@@ -278,10 +281,6 @@
@Test
fun test_createCredentialException() {
- if (Build.VERSION.SDK_INT >= 34) {
- return
- }
-
val intent = Intent()
val initialException = CreateCredentialInterruptedException("message")
@@ -289,16 +288,14 @@
val finalException = intent.getCreateCredentialException()
assertThat(finalException).isNotNull()
- assertThat(finalException).isEqualTo(initialException)
+ assertThat(finalException!!.type).isEqualTo(initialException.type)
+ assertThat(finalException.message).isEqualTo(initialException.message)
}
@Test
- fun test_createCredentialException_throwsWhenEmptyIntent() {
- if (Build.VERSION.SDK_INT >= 34) {
- return
- }
-
+ fun test_createCredentialException_nullExceptionWhenEmptyIntent() {
val intent = Intent()
+
assertThat(intent.getCreateCredentialException()).isNull()
}
@@ -417,10 +414,6 @@
@Test
fun test_credentialException() {
- if (Build.VERSION.SDK_INT >= 34) {
- return
- }
-
val intent = Intent()
val initialException = GetCredentialInterruptedException("message")
@@ -428,25 +421,19 @@
val finalException = intent.getGetCredentialException()
assertThat(finalException).isNotNull()
- assertThat(finalException).isEqualTo(initialException)
+ assertThat(finalException!!.type).isEqualTo(initialException.type)
+ assertThat(finalException.message).isEqualTo(initialException.message)
}
@Test
- fun test_credentialException_throwsWhenEmptyIntent() {
- if (Build.VERSION.SDK_INT >= 34) {
- return
- }
-
+ fun test_credentialException_nullWhenEmptyIntent() {
val intent = Intent()
+
assertThat(intent.getGetCredentialException()).isNull()
}
@Test
fun test_beginGetResponse() {
- if (Build.VERSION.SDK_INT >= 34) {
- return
- }
-
val intent = Intent()
val initialResponse = BeginGetCredentialResponse.Builder().build()
@@ -454,25 +441,18 @@
val finalResponse = intent.getBeginGetResponse()
assertThat(finalResponse).isNotNull()
- assertThat(finalResponse).isEqualTo(initialResponse)
+ assertEquals(context, finalResponse!!, initialResponse)
}
@Test
- fun test_beginGetResponse_throwsWhenEmptyIntent() {
- if (Build.VERSION.SDK_INT >= 34) {
- return
- }
-
+ fun test_beginGetResponse_nullWhenEmptyIntent() {
val intent = Intent()
+
assertThat(intent.getBeginGetResponse()).isNull()
}
@Test
fun test_credentialResponse() {
- if (Build.VERSION.SDK_INT >= 34) {
- return
- }
-
val intent = Intent()
val credential = PasswordCredential("a", "b")
val initialResponse = GetCredentialResponse(credential)
@@ -481,25 +461,18 @@
val finalResponse = intent.getGetCredentialResponse()
assertThat(finalResponse).isNotNull()
- assertThat(finalResponse).isEqualTo(initialResponse)
+ assertEquals(finalResponse!!, initialResponse)
}
@Test
- fun test_credentialResponse_throwsWhenEmptyIntent() {
- if (Build.VERSION.SDK_INT >= 34) {
- return
- }
-
+ fun test_credentialResponse_nullWhenEmptyIntent() {
val intent = Intent()
+
assertThat(intent.getGetCredentialResponse()).isNull()
}
@Test
fun test_createCredentialCredentialResponse() {
- if (Build.VERSION.SDK_INT >= 34) {
- return
- }
-
val intent = Intent()
val initialResponse = CreatePasswordResponse()
@@ -507,17 +480,13 @@
val finalResponse = intent.getCreateCredentialCredentialResponse()
assertThat(finalResponse).isNotNull()
- assertThat(finalResponse).isEqualTo(initialResponse)
+ assertThat(equals(finalResponse!!.data, initialResponse.data))
}
@Test
- fun test_createCredentialCredentialResponse_throwsWhenEmptyIntent() {
- if (Build.VERSION.SDK_INT >= 34) {
- return
- }
-
+ fun test_createCredentialCredentialResponse_nullWhenEmptyIntent() {
val intent = Intent()
- val r = intent.getCreateCredentialCredentialResponse()
- assertThat(r).isNull()
+
+ assertThat(intent.getCreateCredentialCredentialResponse()).isNull()
}
}
diff --git a/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/MaterialShapes.kt b/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/MaterialShapes.kt
index 96dc524..d4a6aba 100644
--- a/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/MaterialShapes.kt
+++ b/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/MaterialShapes.kt
@@ -641,27 +641,27 @@
* use. Refer to [FeatureSerializer] for proper usage of svg path import.
* *************************************************************************************
*/
- CustomShapeParameters("1") {
+ CustomShapeParameters("Park") {
val svgPathNotSuitableForProductionCodeImport =
- "M -327.65 -440 h -24.31 q -25.95 0 -43.93 -17.98 q -17.98 -17.97 -17.98 -43.93 t 17.98 -43.93 q 17.98 -17.98 43.93 -17.98 h 102.63 q 19.16 0 32.33 13.17 q 13.17 13.17 13.17 32.33 V -260 q 0 25.96 -17.98 43.93 q -17.97 17.98 -43.93 17.98 t -43.93 -17.98 q -17.98 -17.97 -17.98 -43.93 Z"
+ "M 397.93 -231.87 H 190.22 q -27.35 0 -40.79 -23.87 q -13.43 -23.87 2.24 -46.74 l 113.26 -169.39 h -2.28 q -24.48 0 -36.1 -21.74 q -11.62 -21.74 2.62 -41.98 l 213.29 -304.82 q 6.95 -9.44 17.03 -14.42 q 10.08 -4.97 20.51 -4.97 q 10.43 0 20.51 4.97 q 10.08 4.98 17.03 14.42 l 213.29 304.82 q 14.24 20.24 2.62 41.98 q -11.62 21.74 -36.1 21.74 h -2.28 l 113.26 169.39 q 15.67 22.87 2.24 46.74 q -13.44 23.87 -40.79 23.87 H 562.07 v 114.5 q 0 19.15 -13.18 32.33 q -13.17 13.17 -32.32 13.17 h -73.14 q -19.15 0 -32.32 -13.17 q -13.18 -13.18 -13.18 -32.33 v -114.5 Z"
RoundedPolygon(SvgPathParser.parseFeatures(svgPathNotSuitableForProductionCodeImport))
.normalized()
},
- CustomShapeParameters("2") {
+ CustomShapeParameters("Bedtime") {
val svgPathNotSuitableForProductionCodeImport =
- "M 801.2 -192.59 H 511.33 q -12.8 0 -21.86 -9.06 q -9.06 -9.06 -9.06 -21.85 v -47.25 q 0 -3.29 8.24 -22.01 l 192.96 -201.22 q 32.52 -35 45.66 -57.42 q 13.14 -22.43 13.14 -50.51 q 0 -27.45 -20.94 -49.69 q -20.95 -22.25 -62.84 -22.25 q -24.62 0 -42.13 9.9 q -17.52 9.91 -30.04 26.19 q -11.2 15.43 -28.37 21.03 q -17.18 5.6 -34.01 -1.09 q -19.07 -7.79 -27.49 -25.06 q -8.42 -17.27 0.78 -32.95 q 22.43 -37.39 63.25 -64.49 q 40.81 -27.09 99.8 -27.09 q 84.41 0 131.98 48.92 q 47.58 48.92 47.58 115.86 q 0 46.67 -21.72 84.51 t -65.72 84.27 l -139.3 148.42 l 1.52 3.28 H 801.2 q 19.03 0 31.9 12.87 q 12.88 12.88 12.88 31.91 t -12.88 31.91 q -12.87 12.87 -31.9 12.87"
+ "M 484 -75.22 q -84.96 0 -159.29 -32.36 q -74.34 -32.35 -129.56 -87.57 q -55.22 -55.22 -87.57 -129.56 Q 75.22 -399.04 75.22 -484 q 0 -126.8 70.44 -230.57 q 70.45 -103.76 189.06 -148.86 q 26.06 -10.87 49.49 4.54 q 23.42 15.41 23.62 43.43 q -0.61 82.61 28.79 157.7 q 29.4 75.09 87.73 133.41 q 58.32 58.33 133.29 87.61 t 157.34 28.91 q 30.06 0.44 45.31 22.41 q 15.25 21.96 5.34 47.83 q -45.91 119.05 -149.77 190.71 Q 612 -75.22 484 -75.22 Z"
RoundedPolygon(SvgPathParser.parseFeatures(svgPathNotSuitableForProductionCodeImport))
.normalized()
},
- CustomShapeParameters("Thin 3") {
+ CustomShapeParameters("Send") {
val svgPathNotSuitableForProductionCodeImport =
- "M 570.77 -235.38 H 380 q -10.38 0 -17.5 -7.12 q -7.12 -7.12 -7.12 -17.5 q 0 -10.38 7.12 -17.5 q 7.12 -7.12 17.5 -7.12 h 190.77 q 10.77 0 17.69 -6.92 q 6.92 -6.92 6.92 -17.69 v -121.54 q 0 -10.77 -6.92 -17.69 q -6.92 -6.92 -17.69 -6.92 H 420 q -10.38 0 -17.5 -7.12 q -7.12 -7.12 -7.12 -17.5 q 0 -10.38 7.12 -17.5 q 7.12 -7.12 17.5 -7.12 h 150.77 q 10.77 0 17.69 -6.92 q 6.92 -6.92 6.92 -17.69 v -121.54 q 0 -10.77 -6.92 -17.69 q -6.92 -6.92 -17.69 -6.92 H 380 q -10.38 0 -17.5 -7.12 q -7.12 -7.12 -7.12 -17.5 q 0 -10.38 7.12 -17.5 q 7.12 -7.12 17.5 -7.12 h 190.77 q 30.77 0 52.31 21.54 q 21.54 21.54 21.54 52.31 v 122.15 q 0 19.62 -12.2 34.12 q -12.19 14.5 -31.04 14.5 q 18.85 0 31.04 14.5 q 12.2 14.5 12.2 34.12 v 122.15 q 0 30.77 -21.54 52.31 q -21.54 21.54 -52.31 21.54 Z"
+ "M 176.24 -178.7 q -22.87 9.44 -43.26 -3.85 q -20.39 -13.3 -20.39 -38.17 V -393.3 l 331 -86.7 l -331 -86.7 v -172.58 q 0 -24.87 20.39 -38.17 q 20.39 -13.29 43.26 -3.85 l 613.61 259.28 q 28.11 12.43 28.11 42.02 q 0 29.59 -28.11 42.02 L 176.24 -178.7 Z"
RoundedPolygon(SvgPathParser.parseFeatures(svgPathNotSuitableForProductionCodeImport))
.normalized()
},
- CustomShapeParameters("Thick 3") {
+ CustomShapeParameters("Humidity") {
val svgPathNotSuitableForProductionCodeImport =
- "M 558.33 -198.09 H 380 q -25.96 0 -43.82 -17.98 q -17.85 -17.97 -17.85 -43.93 t 17.97 -43.93 q 17.98 -17.98 43.94 -17.98 h 177.85 v -96.18 H 420 q -25.96 0 -43.82 -17.98 q -17.85 -17.97 -17.85 -43.93 t 17.97 -43.93 q 17.98 -17.98 43.94 -17.98 h 137.85 v -96.18 H 380 q -25.96 0 -43.82 -17.98 q -17.85 -17.97 -17.85 -43.93 t 17.97 -43.93 q 17.98 -17.98 43.94 -17.98 h 178.09 q 51.67 0 87.63 36.11 q 35.95 36.12 35.95 87.71 V -564 q 0 33.57 -22.34 57.83 q -22.35 24.26 -55.68 26.17 q 33.33 1.91 55.68 26.17 q 22.34 24.26 22.34 57.83 v 74.09 q 0 51.59 -35.95 87.71 q -35.96 36.11 -87.63 36.11 Z"
+ "M 480 -91.87 q -136.11 0 -232.12 -94.15 q -96.01 -94.15 -96.01 -229.5 q 0 -64.91 25.1 -124.09 q 25.1 -59.17 71.53 -104.37 l 167.85 -164.85 q 13.67 -12.67 30.08 -19.39 q 16.42 -6.71 33.57 -6.71 t 33.57 6.71 q 16.41 6.72 30.08 19.39 L 711.5 -643.98 q 46.43 45.2 71.53 104.37 q 25.1 59.18 25.1 124.09 q 0 135.35 -96.01 229.5 T 480 -91.87 Z"
RoundedPolygon(SvgPathParser.parseFeatures(svgPathNotSuitableForProductionCodeImport))
.normalized()
},
diff --git a/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/ShapeParameters.kt b/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/ShapeParameters.kt
index d989266..74560e3 100644
--- a/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/ShapeParameters.kt
+++ b/graphics/integration-tests/testapp-compose/src/main/java/androidx/graphics/shapes/testcompose/ShapeParameters.kt
@@ -432,7 +432,7 @@
fun serialized(): String =
"""
val features: List<Feature> = FeatureSerializer.parse("${FeatureSerializer.serialize(genShape().features)}")
- val triangle: RoundedPolygon = RoundedPolygon(features, centerX = <recommended to add>, centerY = <recommended to add>)
+ val shape: RoundedPolygon = RoundedPolygon(features, centerX = <recommended to add>, centerY = <recommended to add>)
"""
.trimIndent()
diff --git a/health/connect/connect-testing/api/current.txt b/health/connect/connect-testing/api/current.txt
index df213f9..8a08ff1 100644
--- a/health/connect/connect-testing/api/current.txt
+++ b/health/connect/connect-testing/api/current.txt
@@ -40,36 +40,36 @@
public final class FakeHealthConnectClientOverrides {
ctor public FakeHealthConnectClientOverrides();
- ctor public FakeHealthConnectClientOverrides(optional androidx.health.connect.client.testing.stubs.Stub? getChanges, optional androidx.health.connect.client.testing.stubs.Stub? getChangesToken, optional androidx.health.connect.client.testing.stubs.Stub? readRecords, optional androidx.health.connect.client.testing.stubs.Stub? readRecord, optional androidx.health.connect.client.testing.stubs.Stub? insertRecords, optional androidx.health.connect.client.testing.stubs.Stub? updateRecords, optional androidx.health.connect.client.testing.stubs.Stub? deleteRecords, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateRequest,androidx.health.connect.client.aggregate.AggregationResult>? aggregate, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByDurationRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>? aggregateGroupByDuration, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByPeriodRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>? aggregateGroupByPeriod);
+ ctor public FakeHealthConnectClientOverrides(optional androidx.health.connect.client.testing.stubs.Stub<? super java.lang.String,androidx.health.connect.client.response.ChangesResponse>? getChanges, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.ChangesTokenRequest,java.lang.String>? getChangesToken, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.ReadRecordsRequest<? extends java.lang.Object?>,? extends androidx.health.connect.client.response.ReadRecordsResponse<? extends java.lang.Object?>>? readRecords, optional androidx.health.connect.client.testing.stubs.Stub<? super java.lang.String,? extends androidx.health.connect.client.response.ReadRecordResponse<? extends java.lang.Object?>>? readRecord, optional androidx.health.connect.client.testing.stubs.Stub<? super java.util.List<? extends java.lang.Object?>,androidx.health.connect.client.response.InsertRecordsResponse>? insertRecords, optional androidx.health.connect.client.testing.stubs.Stub? updateRecords, optional androidx.health.connect.client.testing.stubs.Stub? deleteRecords, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateRequest,androidx.health.connect.client.aggregate.AggregationResult>? aggregate, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByDurationRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>? aggregateGroupByDuration, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByPeriodRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>? aggregateGroupByPeriod);
method public androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateRequest,androidx.health.connect.client.aggregate.AggregationResult>? getAggregate();
method public androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateGroupByDurationRequest,java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>? getAggregateGroupByDuration();
method public androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateGroupByPeriodRequest,java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>? getAggregateGroupByPeriod();
method public androidx.health.connect.client.testing.stubs.Stub? getDeleteRecords();
- method public androidx.health.connect.client.testing.stubs.Stub? getGetChanges();
- method public androidx.health.connect.client.testing.stubs.Stub? getGetChangesToken();
- method public androidx.health.connect.client.testing.stubs.Stub? getInsertRecords();
- method public androidx.health.connect.client.testing.stubs.Stub? getReadRecord();
- method public androidx.health.connect.client.testing.stubs.Stub? getReadRecords();
+ method public androidx.health.connect.client.testing.stubs.Stub<java.lang.String,androidx.health.connect.client.response.ChangesResponse>? getGetChanges();
+ method public androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.ChangesTokenRequest,java.lang.String>? getGetChangesToken();
+ method public androidx.health.connect.client.testing.stubs.Stub<java.util.List<? extends java.lang.Object?>,androidx.health.connect.client.response.InsertRecordsResponse>? getInsertRecords();
+ method public androidx.health.connect.client.testing.stubs.Stub<java.lang.String,androidx.health.connect.client.response.ReadRecordResponse<? extends java.lang.Object?>>? getReadRecord();
+ method public androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.ReadRecordsRequest<? extends java.lang.Object?>,androidx.health.connect.client.response.ReadRecordsResponse<? extends java.lang.Object?>>? getReadRecords();
method public androidx.health.connect.client.testing.stubs.Stub? getUpdateRecords();
method public void setAggregate(androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateRequest,androidx.health.connect.client.aggregate.AggregationResult>?);
method public void setAggregateGroupByDuration(androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByDurationRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>?);
method public void setAggregateGroupByPeriod(androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByPeriodRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>?);
method public void setDeleteRecords(androidx.health.connect.client.testing.stubs.Stub?);
- method public void setGetChanges(androidx.health.connect.client.testing.stubs.Stub?);
- method public void setGetChangesToken(androidx.health.connect.client.testing.stubs.Stub?);
- method public void setInsertRecords(androidx.health.connect.client.testing.stubs.Stub?);
- method public void setReadRecord(androidx.health.connect.client.testing.stubs.Stub?);
- method public void setReadRecords(androidx.health.connect.client.testing.stubs.Stub?);
+ method public void setGetChanges(androidx.health.connect.client.testing.stubs.Stub<? super java.lang.String,androidx.health.connect.client.response.ChangesResponse>?);
+ method public void setGetChangesToken(androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.ChangesTokenRequest,java.lang.String>?);
+ method public void setInsertRecords(androidx.health.connect.client.testing.stubs.Stub<? super java.util.List<? extends java.lang.Object?>,androidx.health.connect.client.response.InsertRecordsResponse>?);
+ method public void setReadRecord(androidx.health.connect.client.testing.stubs.Stub<? super java.lang.String,? extends androidx.health.connect.client.response.ReadRecordResponse<? extends java.lang.Object?>>?);
+ method public void setReadRecords(androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.ReadRecordsRequest<? extends java.lang.Object?>,? extends androidx.health.connect.client.response.ReadRecordsResponse<? extends java.lang.Object?>>?);
method public void setUpdateRecords(androidx.health.connect.client.testing.stubs.Stub?);
property public final androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateRequest,androidx.health.connect.client.aggregate.AggregationResult>? aggregate;
property public final androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateGroupByDurationRequest,java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>? aggregateGroupByDuration;
property public final androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateGroupByPeriodRequest,java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>? aggregateGroupByPeriod;
property public final androidx.health.connect.client.testing.stubs.Stub? deleteRecords;
- property public final androidx.health.connect.client.testing.stubs.Stub? getChanges;
- property public final androidx.health.connect.client.testing.stubs.Stub? getChangesToken;
- property public final androidx.health.connect.client.testing.stubs.Stub? insertRecords;
- property public final androidx.health.connect.client.testing.stubs.Stub? readRecord;
- property public final androidx.health.connect.client.testing.stubs.Stub? readRecords;
+ property public final androidx.health.connect.client.testing.stubs.Stub<java.lang.String,androidx.health.connect.client.response.ChangesResponse>? getChanges;
+ property public final androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.ChangesTokenRequest,java.lang.String>? getChangesToken;
+ property public final androidx.health.connect.client.testing.stubs.Stub<java.util.List<? extends java.lang.Object?>,androidx.health.connect.client.response.InsertRecordsResponse>? insertRecords;
+ property public final androidx.health.connect.client.testing.stubs.Stub<java.lang.String,androidx.health.connect.client.response.ReadRecordResponse<? extends java.lang.Object?>>? readRecord;
+ property public final androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.ReadRecordsRequest<? extends java.lang.Object?>,androidx.health.connect.client.response.ReadRecordsResponse<? extends java.lang.Object?>>? readRecords;
property public final androidx.health.connect.client.testing.stubs.Stub? updateRecords;
}
diff --git a/health/connect/connect-testing/api/restricted_current.txt b/health/connect/connect-testing/api/restricted_current.txt
index df213f9..8a08ff1 100644
--- a/health/connect/connect-testing/api/restricted_current.txt
+++ b/health/connect/connect-testing/api/restricted_current.txt
@@ -40,36 +40,36 @@
public final class FakeHealthConnectClientOverrides {
ctor public FakeHealthConnectClientOverrides();
- ctor public FakeHealthConnectClientOverrides(optional androidx.health.connect.client.testing.stubs.Stub? getChanges, optional androidx.health.connect.client.testing.stubs.Stub? getChangesToken, optional androidx.health.connect.client.testing.stubs.Stub? readRecords, optional androidx.health.connect.client.testing.stubs.Stub? readRecord, optional androidx.health.connect.client.testing.stubs.Stub? insertRecords, optional androidx.health.connect.client.testing.stubs.Stub? updateRecords, optional androidx.health.connect.client.testing.stubs.Stub? deleteRecords, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateRequest,androidx.health.connect.client.aggregate.AggregationResult>? aggregate, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByDurationRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>? aggregateGroupByDuration, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByPeriodRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>? aggregateGroupByPeriod);
+ ctor public FakeHealthConnectClientOverrides(optional androidx.health.connect.client.testing.stubs.Stub<? super java.lang.String,androidx.health.connect.client.response.ChangesResponse>? getChanges, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.ChangesTokenRequest,java.lang.String>? getChangesToken, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.ReadRecordsRequest<? extends java.lang.Object?>,? extends androidx.health.connect.client.response.ReadRecordsResponse<? extends java.lang.Object?>>? readRecords, optional androidx.health.connect.client.testing.stubs.Stub<? super java.lang.String,? extends androidx.health.connect.client.response.ReadRecordResponse<? extends java.lang.Object?>>? readRecord, optional androidx.health.connect.client.testing.stubs.Stub<? super java.util.List<? extends java.lang.Object?>,androidx.health.connect.client.response.InsertRecordsResponse>? insertRecords, optional androidx.health.connect.client.testing.stubs.Stub? updateRecords, optional androidx.health.connect.client.testing.stubs.Stub? deleteRecords, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateRequest,androidx.health.connect.client.aggregate.AggregationResult>? aggregate, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByDurationRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>? aggregateGroupByDuration, optional androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByPeriodRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>? aggregateGroupByPeriod);
method public androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateRequest,androidx.health.connect.client.aggregate.AggregationResult>? getAggregate();
method public androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateGroupByDurationRequest,java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>? getAggregateGroupByDuration();
method public androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateGroupByPeriodRequest,java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>? getAggregateGroupByPeriod();
method public androidx.health.connect.client.testing.stubs.Stub? getDeleteRecords();
- method public androidx.health.connect.client.testing.stubs.Stub? getGetChanges();
- method public androidx.health.connect.client.testing.stubs.Stub? getGetChangesToken();
- method public androidx.health.connect.client.testing.stubs.Stub? getInsertRecords();
- method public androidx.health.connect.client.testing.stubs.Stub? getReadRecord();
- method public androidx.health.connect.client.testing.stubs.Stub? getReadRecords();
+ method public androidx.health.connect.client.testing.stubs.Stub<java.lang.String,androidx.health.connect.client.response.ChangesResponse>? getGetChanges();
+ method public androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.ChangesTokenRequest,java.lang.String>? getGetChangesToken();
+ method public androidx.health.connect.client.testing.stubs.Stub<java.util.List<? extends java.lang.Object?>,androidx.health.connect.client.response.InsertRecordsResponse>? getInsertRecords();
+ method public androidx.health.connect.client.testing.stubs.Stub<java.lang.String,androidx.health.connect.client.response.ReadRecordResponse<? extends java.lang.Object?>>? getReadRecord();
+ method public androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.ReadRecordsRequest<? extends java.lang.Object?>,androidx.health.connect.client.response.ReadRecordsResponse<? extends java.lang.Object?>>? getReadRecords();
method public androidx.health.connect.client.testing.stubs.Stub? getUpdateRecords();
method public void setAggregate(androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateRequest,androidx.health.connect.client.aggregate.AggregationResult>?);
method public void setAggregateGroupByDuration(androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByDurationRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>?);
method public void setAggregateGroupByPeriod(androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.AggregateGroupByPeriodRequest,? extends java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>?);
method public void setDeleteRecords(androidx.health.connect.client.testing.stubs.Stub?);
- method public void setGetChanges(androidx.health.connect.client.testing.stubs.Stub?);
- method public void setGetChangesToken(androidx.health.connect.client.testing.stubs.Stub?);
- method public void setInsertRecords(androidx.health.connect.client.testing.stubs.Stub?);
- method public void setReadRecord(androidx.health.connect.client.testing.stubs.Stub?);
- method public void setReadRecords(androidx.health.connect.client.testing.stubs.Stub?);
+ method public void setGetChanges(androidx.health.connect.client.testing.stubs.Stub<? super java.lang.String,androidx.health.connect.client.response.ChangesResponse>?);
+ method public void setGetChangesToken(androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.ChangesTokenRequest,java.lang.String>?);
+ method public void setInsertRecords(androidx.health.connect.client.testing.stubs.Stub<? super java.util.List<? extends java.lang.Object?>,androidx.health.connect.client.response.InsertRecordsResponse>?);
+ method public void setReadRecord(androidx.health.connect.client.testing.stubs.Stub<? super java.lang.String,? extends androidx.health.connect.client.response.ReadRecordResponse<? extends java.lang.Object?>>?);
+ method public void setReadRecords(androidx.health.connect.client.testing.stubs.Stub<? super androidx.health.connect.client.request.ReadRecordsRequest<? extends java.lang.Object?>,? extends androidx.health.connect.client.response.ReadRecordsResponse<? extends java.lang.Object?>>?);
method public void setUpdateRecords(androidx.health.connect.client.testing.stubs.Stub?);
property public final androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateRequest,androidx.health.connect.client.aggregate.AggregationResult>? aggregate;
property public final androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateGroupByDurationRequest,java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration>>? aggregateGroupByDuration;
property public final androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.AggregateGroupByPeriodRequest,java.util.List<androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod>>? aggregateGroupByPeriod;
property public final androidx.health.connect.client.testing.stubs.Stub? deleteRecords;
- property public final androidx.health.connect.client.testing.stubs.Stub? getChanges;
- property public final androidx.health.connect.client.testing.stubs.Stub? getChangesToken;
- property public final androidx.health.connect.client.testing.stubs.Stub? insertRecords;
- property public final androidx.health.connect.client.testing.stubs.Stub? readRecord;
- property public final androidx.health.connect.client.testing.stubs.Stub? readRecords;
+ property public final androidx.health.connect.client.testing.stubs.Stub<java.lang.String,androidx.health.connect.client.response.ChangesResponse>? getChanges;
+ property public final androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.ChangesTokenRequest,java.lang.String>? getChangesToken;
+ property public final androidx.health.connect.client.testing.stubs.Stub<java.util.List<? extends java.lang.Object?>,androidx.health.connect.client.response.InsertRecordsResponse>? insertRecords;
+ property public final androidx.health.connect.client.testing.stubs.Stub<java.lang.String,androidx.health.connect.client.response.ReadRecordResponse<? extends java.lang.Object?>>? readRecord;
+ property public final androidx.health.connect.client.testing.stubs.Stub<androidx.health.connect.client.request.ReadRecordsRequest<? extends java.lang.Object?>,androidx.health.connect.client.response.ReadRecordsResponse<? extends java.lang.Object?>>? readRecords;
property public final androidx.health.connect.client.testing.stubs.Stub? updateRecords;
}
diff --git a/health/connect/connect-testing/src/main/java/androidx/health/connect/client/testing/FakeHealthConnectClient.kt b/health/connect/connect-testing/src/main/java/androidx/health/connect/client/testing/FakeHealthConnectClient.kt
index a3c359d2..c810147 100644
--- a/health/connect/connect-testing/src/main/java/androidx/health/connect/client/testing/FakeHealthConnectClient.kt
+++ b/health/connect/connect-testing/src/main/java/androidx/health/connect/client/testing/FakeHealthConnectClient.kt
@@ -40,7 +40,6 @@
import androidx.health.connect.client.response.InsertRecordsResponse
import androidx.health.connect.client.response.ReadRecordResponse
import androidx.health.connect.client.response.ReadRecordsResponse
-import androidx.health.connect.client.testing.stubs.throwOrContinue
import androidx.health.connect.client.time.TimeRangeFilter
import java.time.Clock
import kotlin.reflect.KClass
@@ -114,8 +113,10 @@
* precedence.
*/
override suspend fun insertRecords(records: List<Record>): InsertRecordsResponse {
- // Stub that only throws
- overrides.insertRecords?.throwOrContinue(null)
+ // Stubs
+ overrides.insertRecords?.next(records)?.let {
+ return it
+ }
// Fake implementation
val recordIdsList = mutableListOf<String>()
@@ -145,8 +146,8 @@
}
override suspend fun updateRecords(records: List<Record>) {
- // Stub that throws if set
- overrides.updateRecords?.throwOrContinue(null)
+ // Stubs
+ overrides.updateRecords?.next(records)
// Check if all records belong to the package
if (records.any { it.packageName != packageName }) {
@@ -171,8 +172,8 @@
recordIdsList: List<String>,
clientRecordIdsList: List<String>
) {
- // Stub that throws if set
- overrides.deleteRecords?.throwOrContinue(null)
+ // Stubs
+ overrides.deleteRecords?.next(Unit)
// Check if all records belong to the package
if (
@@ -213,8 +214,8 @@
recordType: KClass<out Record>,
timeRangeFilter: TimeRangeFilter
) {
- // Stub that throws if set
- overrides.deleteRecords?.throwOrContinue(null)
+ // Stubs
+ overrides.deleteRecords?.next(Unit)
// Fake implementation
val recordIdsToRemove =
@@ -237,7 +238,9 @@
recordId: String
): ReadRecordResponse<T> {
// Stubs
- overrides.readRecord?.throwOrContinue(null)
+ overrides.readRecord?.next(recordId)?.let {
+ return it as ReadRecordResponse<T>
+ }
// Fake implementation
return ReadRecordResponse(idsToRecords[recordId.toRecordId(packageName)] as T)
@@ -258,7 +261,9 @@
TODO("Not yet implemented")
}
// Stubs
- overrides.readRecords?.throwOrContinue(null)
+ overrides.readRecords?.next(request)?.let {
+ return it as ReadRecordsResponse<T>
+ }
// Fake implementation
val startIndex = request.pageToken?.toIntOrNull() ?: 0
@@ -333,7 +338,10 @@
* track changes from the moment this function is called.
*/
override suspend fun getChangesToken(request: ChangesTokenRequest): String {
- overrides.getChangesToken?.throwOrContinue(null)
+ // Stubs
+ overrides.getChangesToken?.next(request)?.let {
+ return it
+ }
if (request.recordTypes.isEmpty()) {
throw IllegalArgumentException("Record types must not be empty")
@@ -373,7 +381,9 @@
override suspend fun getChanges(changesToken: String): ChangesResponse {
// Stubs
- overrides.getChanges?.throwOrContinue(null)
+ overrides.getChanges?.next(changesToken)?.let {
+ return it
+ }
// Fake implementation
diff --git a/health/connect/connect-testing/src/main/java/androidx/health/connect/client/testing/FakeHealthConnectClientOverrides.kt b/health/connect/connect-testing/src/main/java/androidx/health/connect/client/testing/FakeHealthConnectClientOverrides.kt
index f41c46b..814a599 100644
--- a/health/connect/connect-testing/src/main/java/androidx/health/connect/client/testing/FakeHealthConnectClientOverrides.kt
+++ b/health/connect/connect-testing/src/main/java/androidx/health/connect/client/testing/FakeHealthConnectClientOverrides.kt
@@ -22,6 +22,12 @@
import androidx.health.connect.client.request.AggregateGroupByDurationRequest
import androidx.health.connect.client.request.AggregateGroupByPeriodRequest
import androidx.health.connect.client.request.AggregateRequest
+import androidx.health.connect.client.request.ChangesTokenRequest
+import androidx.health.connect.client.request.ReadRecordsRequest
+import androidx.health.connect.client.response.ChangesResponse
+import androidx.health.connect.client.response.InsertRecordsResponse
+import androidx.health.connect.client.response.ReadRecordResponse
+import androidx.health.connect.client.response.ReadRecordsResponse
import androidx.health.connect.client.testing.stubs.Stub
/**
@@ -53,16 +59,29 @@
* [FakeHealthConnectClient.aggregateGroupByPeriod].
*/
public class FakeHealthConnectClientOverrides(
- /* Changes stubs, only used to throw exceptions */
- public var getChanges: Stub<Nothing?, Nothing>? = null,
- public var getChangesToken: Stub<Nothing?, Nothing>? = null,
- /* Records stubs, only used to throw exceptions */
- public var readRecords: Stub<Nothing?, Nothing>? = null,
- public var readRecord: Stub<Nothing?, Nothing>? = null,
- public var insertRecords: Stub<Nothing?, Nothing>? = null,
- public var updateRecords: Stub<Nothing?, Nothing>? = null,
- public var deleteRecords: Stub<Nothing?, Nothing>? = null,
+ /** A [Stub] used to set the next responses used in [getChanges]. */
+ public var getChanges: Stub<String, ChangesResponse>? = null,
+
+ /** A [Stub] used to set the next responses used in [getChangesToken]. */
+ public var getChangesToken: Stub<ChangesTokenRequest, String>? = null,
+
+ /* Records stubs */
+
+ /** A [Stub] used to set the next responses used in [readRecords]. */
+ public var readRecords: Stub<ReadRecordsRequest<*>, ReadRecordsResponse<*>>? = null,
+
+ /** A [Stub] used to set the next responses used in [readRecord]. */
+ public var readRecord: Stub<String, ReadRecordResponse<*>>? = null,
+
+ /** A [Stub] used to set the next responses used in [insertRecords]. */
+ public var insertRecords: Stub<List<*>, InsertRecordsResponse>? = null,
+
+ /** A [Stub] used only to throw exceptions in [updateRecords]. */
+ public var updateRecords: Stub<Any, Nothing>? = null,
+
+ /** A [Stub] used only to throw exceptions in [deleteRecords]. */
+ public var deleteRecords: Stub<Any, Nothing>? = null,
/* Aggregation stubs */
/**
diff --git a/health/connect/connect-testing/src/test/java/androidx/health/connect/client/testing/FakeHealthConnectClientOverridesTest.kt b/health/connect/connect-testing/src/test/java/androidx/health/connect/client/testing/FakeHealthConnectClientOverridesTest.kt
index 48c17d1..cbea9a0 100644
--- a/health/connect/connect-testing/src/test/java/androidx/health/connect/client/testing/FakeHealthConnectClientOverridesTest.kt
+++ b/health/connect/connect-testing/src/test/java/androidx/health/connect/client/testing/FakeHealthConnectClientOverridesTest.kt
@@ -18,9 +18,16 @@
import androidx.health.connect.client.aggregate.AggregationResultGroupedByDuration
import androidx.health.connect.client.aggregate.AggregationResultGroupedByPeriod
+import androidx.health.connect.client.changes.UpsertionChange
import androidx.health.connect.client.records.HeartRateRecord
import androidx.health.connect.client.records.StepsCadenceRecord
+import androidx.health.connect.client.records.StepsRecord
import androidx.health.connect.client.request.ChangesTokenRequest
+import androidx.health.connect.client.response.ChangesResponse
+import androidx.health.connect.client.response.InsertRecordsResponse
+import androidx.health.connect.client.response.ReadRecordResponse
+import androidx.health.connect.client.response.ReadRecordsResponse
+import androidx.health.connect.client.testing.stubs.Stub
import androidx.health.connect.client.testing.stubs.stub
import androidx.health.connect.client.testing.testdata.dummyAggregateGbdRequest
import androidx.health.connect.client.testing.testdata.dummyAggregateGbpRequest
@@ -60,6 +67,32 @@
}
}
+ /* Records stubbed elements */
+
+ @Test
+ fun readRecord_stubbedElement() = runTest {
+ fake.overrides.readRecord = stub(ReadRecordResponse(runRecord1))
+ val response =
+ fake.readRecord(recordType = runRecord1::class, recordId = runRecord1.metadata.id)
+ assertThat(response.record).isEqualTo(runRecord1)
+ }
+
+ @Test
+ fun readRecords_stubbedElement() = runTest {
+ fake.overrides.readRecords =
+ stub(ReadRecordsResponse(records = listOf(runRecord1), pageToken = "test"))
+ val response = fake.readRecords(dummyReadRecordsRequest)
+ assertThat(response.records).hasSize(1)
+ assertThat(response.records.first().title).isEqualTo(runRecord1.title)
+ }
+
+ @Test
+ fun insertRecords_stubbedElement() = runTest {
+ fake.overrides.insertRecords = stub(InsertRecordsResponse(listOf("test")))
+ val response = fake.insertRecords(emptyList())
+ assertThat(response.recordIdsList.first()).isEqualTo("test")
+ }
+
/* Record exceptions */
@Test
@@ -118,6 +151,22 @@
}
}
+ @Test
+ fun deleteRecordsIds_stubbedException_throws() = runTest {
+ val expectedException = Exception()
+ fake.overrides.deleteRecords = stub { throw expectedException }
+
+ assertThrows(expectedException::class.java) {
+ runBlocking {
+ fake.deleteRecords(
+ recordType = runRecord1::class,
+ recordIdsList = emptyList(),
+ clientRecordIdsList = emptyList()
+ )
+ }
+ }
+ }
+
/* Aggregation exceptions */
@Test
@@ -241,4 +290,34 @@
runBlocking { fake.getChangesToken(ChangesTokenRequest(recordTypes = emptySet())) }
}
}
+
+ @Test
+ fun getChangesToken_stubbedElement() = runTest {
+ val changesToken = "test_token"
+ fake.overrides.getChangesToken = stub(changesToken)
+ val response = fake.getChangesToken(ChangesTokenRequest(setOf(StepsRecord::class)))
+
+ assertThat(response).isEqualTo(changesToken)
+ }
+
+ @Test
+ fun getChanges_stubbedElement() = runTest {
+ val changesToken = "test_token"
+ fake.overrides.getChanges = Stub { token ->
+ if (token == changesToken) {
+ ChangesResponse(
+ changes = listOf(UpsertionChange(runRecord1)),
+ hasMore = true,
+ changesTokenExpired = false,
+ nextChangesToken = "next"
+ )
+ } else {
+ throw IllegalStateException()
+ }
+ }
+ val response = fake.getChanges(changesToken)
+
+ assertThat(response.changes).hasSize(1)
+ assertThat(response.nextChangesToken).isEqualTo("next")
+ }
}
diff --git a/lifecycle/lifecycle-viewmodel-testing/bcv/native/current.txt b/lifecycle/lifecycle-viewmodel-testing/bcv/native/current.txt
index 23fa7e1..887b927 100644
--- a/lifecycle/lifecycle-viewmodel-testing/bcv/native/current.txt
+++ b/lifecycle/lifecycle-viewmodel-testing/bcv/native/current.txt
@@ -16,5 +16,6 @@
}
final fun androidx.lifecycle.viewmodel.testing/DefaultCreationExtras(): androidx.lifecycle.viewmodel/CreationExtras // androidx.lifecycle.viewmodel.testing/DefaultCreationExtras|DefaultCreationExtras(){}[0]
+final fun androidx.lifecycle.viewmodel.testing/DefaultCreationExtras(androidx.savedstate/SavedState): androidx.lifecycle.viewmodel/CreationExtras // androidx.lifecycle.viewmodel.testing/DefaultCreationExtras|DefaultCreationExtras(androidx.savedstate.SavedState){}[0]
final inline fun <#A: reified androidx.lifecycle/ViewModel> androidx.lifecycle.viewmodel.testing/viewModelScenario(androidx.lifecycle.viewmodel/CreationExtras = ..., noinline kotlin/Function1<androidx.lifecycle.viewmodel/CreationExtras, #A>): androidx.lifecycle.viewmodel.testing/ViewModelScenario<#A> // androidx.lifecycle.viewmodel.testing/viewModelScenario|viewModelScenario(androidx.lifecycle.viewmodel.CreationExtras;kotlin.Function1<androidx.lifecycle.viewmodel.CreationExtras,0:0>){0§<androidx.lifecycle.ViewModel>}[0]
final inline fun <#A: reified androidx.lifecycle/ViewModel> androidx.lifecycle.viewmodel.testing/viewModelScenario(androidx.lifecycle/ViewModelProvider.Factory, androidx.lifecycle.viewmodel/CreationExtras = ...): androidx.lifecycle.viewmodel.testing/ViewModelScenario<#A> // androidx.lifecycle.viewmodel.testing/viewModelScenario|viewModelScenario(androidx.lifecycle.ViewModelProvider.Factory;androidx.lifecycle.viewmodel.CreationExtras){0§<androidx.lifecycle.ViewModel>}[0]
diff --git a/lifecycle/lifecycle-viewmodel-testing/build.gradle b/lifecycle/lifecycle-viewmodel-testing/build.gradle
index 6c99a18a..7b8469f 100644
--- a/lifecycle/lifecycle-viewmodel-testing/build.gradle
+++ b/lifecycle/lifecycle-viewmodel-testing/build.gradle
@@ -58,6 +58,9 @@
api(project(":lifecycle:lifecycle-viewmodel"))
api(libs.kotlinStdlib)
api(libs.kotlinCoroutinesCore)
+ implementation(project(":lifecycle:lifecycle-runtime"))
+ implementation(project(":lifecycle:lifecycle-runtime-testing"))
+ implementation(project(":lifecycle:lifecycle-viewmodel-savedstate"))
}
}
@@ -71,11 +74,6 @@
androidMain {
dependsOn(commonMain)
- dependencies {
- implementation(project(":lifecycle:lifecycle-runtime"))
- implementation(project(":lifecycle:lifecycle-runtime-testing"))
- implementation(project(":lifecycle:lifecycle-viewmodel-savedstate"))
- }
}
androidInstrumentedTest {
diff --git a/lifecycle/lifecycle-viewmodel-testing/src/androidMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.android.kt b/lifecycle/lifecycle-viewmodel-testing/src/androidMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.android.kt
deleted file mode 100644
index 6e5a48c..0000000
--- a/lifecycle/lifecycle-viewmodel-testing/src/androidMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.android.kt
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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:JvmName("DefaultCreationExtrasKt")
-
-package androidx.lifecycle.viewmodel.testing
-
-import android.os.Bundle
-import androidx.lifecycle.DEFAULT_ARGS_KEY
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.LifecycleOwner
-import androidx.lifecycle.LifecycleRegistry
-import androidx.lifecycle.SAVED_STATE_REGISTRY_OWNER_KEY
-import androidx.lifecycle.SavedStateHandle
-import androidx.lifecycle.VIEW_MODEL_STORE_OWNER_KEY
-import androidx.lifecycle.ViewModelStore
-import androidx.lifecycle.ViewModelStoreOwner
-import androidx.lifecycle.enableSavedStateHandles
-import androidx.lifecycle.testing.TestLifecycleOwner
-import androidx.lifecycle.viewmodel.CreationExtras
-import androidx.lifecycle.viewmodel.MutableCreationExtras
-import androidx.savedstate.SavedStateRegistryController
-import androidx.savedstate.SavedStateRegistryOwner
-
-/**
- * Creates a default instance of [CreationExtras] pre-configured with all keys required to use
- * [SavedStateHandle].
- *
- * This function sets up the instance with:
- * - A fake [SavedStateRegistryOwner] assigned to [SAVED_STATE_REGISTRY_OWNER_KEY], delegating the
- * [LifecycleOwner] to a [TestLifecycleOwner].
- * - A fake [ViewModelStoreOwner] assigned to [VIEW_MODEL_STORE_OWNER_KEY], containing an empty
- * [ViewModelStore].
- */
-@Suppress("FunctionName")
-public actual fun DefaultCreationExtras(): CreationExtras {
- return DefaultCreationExtras(defaultArgs = Bundle())
-}
-
-/**
- * Creates a default instance of [CreationExtras] pre-configured with all keys required to use
- * [SavedStateHandle], with the specified [defaultArgs] as the [DEFAULT_ARGS_KEY].
- *
- * This function sets up the instance with:
- * - A fake [SavedStateRegistryOwner] assigned to [SAVED_STATE_REGISTRY_OWNER_KEY], delegating the
- * [LifecycleOwner] to a [TestLifecycleOwner].
- * - A fake [ViewModelStoreOwner] assigned to [VIEW_MODEL_STORE_OWNER_KEY], containing an empty
- * [ViewModelStore].
- */
-@Suppress("FunctionName")
-public fun DefaultCreationExtras(defaultArgs: Bundle): CreationExtras {
- val owner =
- object : ViewModelStoreOwner, LifecycleOwner, SavedStateRegistryOwner {
- override val viewModelStore = ViewModelStore()
-
- val lifecycleRegistry = LifecycleRegistry.createUnsafe(owner = this)
- override val lifecycle: Lifecycle = lifecycleRegistry
-
- val savedStateRegistryController = SavedStateRegistryController.create(owner = this)
- override val savedStateRegistry = savedStateRegistryController.savedStateRegistry
- }
-
- owner.savedStateRegistryController.performAttach()
- owner.savedStateRegistryController.performRestore(savedState = null)
- owner.enableSavedStateHandles()
-
- owner.lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
-
- return MutableCreationExtras().apply {
- this[SAVED_STATE_REGISTRY_OWNER_KEY] = owner
- this[VIEW_MODEL_STORE_OWNER_KEY] = owner
- this[DEFAULT_ARGS_KEY] = defaultArgs
- }
-}
diff --git a/lifecycle/lifecycle-viewmodel-testing/src/commonMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.kt b/lifecycle/lifecycle-viewmodel-testing/src/commonMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.kt
index 5ca4b56..ca17de5 100644
--- a/lifecycle/lifecycle-viewmodel-testing/src/commonMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.kt
+++ b/lifecycle/lifecycle-viewmodel-testing/src/commonMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.kt
@@ -16,7 +16,71 @@
package androidx.lifecycle.viewmodel.testing
+import androidx.lifecycle.DEFAULT_ARGS_KEY
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.LifecycleRegistry
+import androidx.lifecycle.SAVED_STATE_REGISTRY_OWNER_KEY
+import androidx.lifecycle.SavedStateHandle
+import androidx.lifecycle.VIEW_MODEL_STORE_OWNER_KEY
+import androidx.lifecycle.ViewModelStore
+import androidx.lifecycle.ViewModelStoreOwner
+import androidx.lifecycle.enableSavedStateHandles
+import androidx.lifecycle.testing.TestLifecycleOwner
import androidx.lifecycle.viewmodel.CreationExtras
+import androidx.lifecycle.viewmodel.MutableCreationExtras
+import androidx.savedstate.SavedState
+import androidx.savedstate.SavedStateRegistryController
+import androidx.savedstate.SavedStateRegistryOwner
+import androidx.savedstate.savedState
-/** Creates a default instance of [CreationExtras]. */
-@Suppress("FunctionName") public expect fun DefaultCreationExtras(): CreationExtras
+/**
+ * Creates a default instance of [CreationExtras] pre-configured with all keys required to use
+ * [SavedStateHandle].
+ *
+ * This function sets up the instance with:
+ * - A fake [SavedStateRegistryOwner] assigned to [SAVED_STATE_REGISTRY_OWNER_KEY], delegating the
+ * [LifecycleOwner] to a [TestLifecycleOwner].
+ * - A fake [ViewModelStoreOwner] assigned to [VIEW_MODEL_STORE_OWNER_KEY], containing an empty
+ * [ViewModelStore].
+ */
+@Suppress("FunctionName")
+public fun DefaultCreationExtras(): CreationExtras {
+ return DefaultCreationExtras(defaultArgs = savedState())
+}
+
+/**
+ * Creates a default instance of [CreationExtras] pre-configured with all keys required to use
+ * [SavedStateHandle], with the specified [defaultArgs] as the [DEFAULT_ARGS_KEY].
+ *
+ * This function sets up the instance with:
+ * - A fake [SavedStateRegistryOwner] assigned to [SAVED_STATE_REGISTRY_OWNER_KEY], delegating the
+ * [LifecycleOwner] to a [TestLifecycleOwner].
+ * - A fake [ViewModelStoreOwner] assigned to [VIEW_MODEL_STORE_OWNER_KEY], containing an empty
+ * [ViewModelStore].
+ */
+@Suppress("FunctionName")
+public fun DefaultCreationExtras(defaultArgs: SavedState): CreationExtras {
+ val owner =
+ object : ViewModelStoreOwner, LifecycleOwner, SavedStateRegistryOwner {
+ override val viewModelStore = ViewModelStore()
+
+ val lifecycleRegistry = LifecycleRegistry.createUnsafe(owner = this)
+ override val lifecycle: Lifecycle = lifecycleRegistry
+
+ val savedStateRegistryController = SavedStateRegistryController.create(owner = this)
+ override val savedStateRegistry = savedStateRegistryController.savedStateRegistry
+ }
+
+ owner.savedStateRegistryController.performAttach()
+ owner.savedStateRegistryController.performRestore(savedState = null)
+ owner.enableSavedStateHandles()
+
+ owner.lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
+
+ return MutableCreationExtras().apply {
+ this[SAVED_STATE_REGISTRY_OWNER_KEY] = owner
+ this[VIEW_MODEL_STORE_OWNER_KEY] = owner
+ this[DEFAULT_ARGS_KEY] = defaultArgs
+ }
+}
diff --git a/lifecycle/lifecycle-viewmodel-testing/src/desktopMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.desktop.kt b/lifecycle/lifecycle-viewmodel-testing/src/desktopMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.desktop.kt
deleted file mode 100644
index 43f80b4..0000000
--- a/lifecycle/lifecycle-viewmodel-testing/src/desktopMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.desktop.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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:JvmName("DefaultCreationExtrasKt")
-
-package androidx.lifecycle.viewmodel.testing
-
-import androidx.lifecycle.viewmodel.CreationExtras
-import androidx.lifecycle.viewmodel.CreationExtras.Empty
-
-@Suppress("FunctionName") public actual fun DefaultCreationExtras(): CreationExtras = Empty
diff --git a/lifecycle/lifecycle-viewmodel-testing/src/nonJvmCommonMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.nonJvm.kt b/lifecycle/lifecycle-viewmodel-testing/src/nonJvmCommonMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.nonJvm.kt
deleted file mode 100644
index e220c67..0000000
--- a/lifecycle/lifecycle-viewmodel-testing/src/nonJvmCommonMain/kotlin/androidx/lifecycle/viewmodel/testing/DefaultCreationExtras.nonJvm.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.testing
-
-import androidx.lifecycle.viewmodel.CreationExtras
-import androidx.lifecycle.viewmodel.CreationExtras.Empty
-
-@Suppress("FunctionName") public actual fun DefaultCreationExtras(): CreationExtras = Empty
diff --git a/mediarouter/mediarouter/build.gradle b/mediarouter/mediarouter/build.gradle
index be4e538..cf66748 100644
--- a/mediarouter/mediarouter/build.gradle
+++ b/mediarouter/mediarouter/build.gradle
@@ -29,7 +29,6 @@
}
dependencies {
- api(libs.jspecify)
api("androidx.media:media:1.4.1")
api(libs.guavaListenableFuture)
diff --git a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouteProviderTest.java b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouteProviderTest.java
index b08bbb7..d4655d9 100644
--- a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouteProviderTest.java
+++ b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouteProviderTest.java
@@ -23,14 +23,14 @@
import android.content.Context;
import android.os.Bundle;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.mediarouter.media.MediaRouteProvider.RouteControllerOptions;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -100,7 +100,8 @@
}
@Override
- public @Nullable DynamicGroupRouteController onCreateDynamicGroupRouteController(
+ @Nullable
+ public DynamicGroupRouteController onCreateDynamicGroupRouteController(
@NonNull String initialMemberRouteId,
@NonNull RouteControllerOptions routeControllerOptions) {
return new TestDynamicGroupRouteController(
@@ -115,7 +116,8 @@
}
@Override
- public @Nullable DynamicGroupRouteController onCreateDynamicGroupRouteController(
+ @Nullable
+ public DynamicGroupRouteController onCreateDynamicGroupRouteController(
@NonNull String initialMemberRouteId) {
return new TestDynamicGroupRouteController(
initialMemberRouteId, /* routeControllerOptions= */ null);
@@ -126,20 +128,22 @@
extends MediaRouteProvider.DynamicGroupRouteController {
private final String mInitialMemberRouteId;
- private final MediaRouteProvider.@NonNull RouteControllerOptions mRouteControllerOptions;
+ @NonNull private final MediaRouteProvider.RouteControllerOptions mRouteControllerOptions;
private TestDynamicGroupRouteController(
String initialMemberRouteId,
- MediaRouteProvider.@NonNull RouteControllerOptions routeControllerOptions) {
+ @NonNull MediaRouteProvider.RouteControllerOptions routeControllerOptions) {
mInitialMemberRouteId = initialMemberRouteId;
mRouteControllerOptions = routeControllerOptions;
}
- public @NonNull String getInitialMemberRouteId() {
+ @NonNull
+ public String getInitialMemberRouteId() {
return mInitialMemberRouteId;
}
- public @NonNull RouteControllerOptions getRouteControllerOptions() {
+ @NonNull
+ public RouteControllerOptions getRouteControllerOptions() {
return mRouteControllerOptions;
}
diff --git a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouter2Test.java b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouter2Test.java
index 979dee5..ba339c6 100644
--- a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouter2Test.java
+++ b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouter2Test.java
@@ -33,6 +33,7 @@
import android.support.mediacompat.testlib.util.PollingCheck;
import android.text.TextUtils;
+import androidx.annotation.NonNull;
import androidx.mediarouter.media.MediaRouter.RouteInfo;
import androidx.mediarouter.testing.MediaRouterTestHelper;
import androidx.test.core.app.ApplicationProvider;
@@ -41,7 +42,6 @@
import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
-import org.jspecify.annotations.NonNull;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
diff --git a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouterDynamicProviderTest.java b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouterDynamicProviderTest.java
index 58b9133..f1a83ab 100644
--- a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouterDynamicProviderTest.java
+++ b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/MediaRouterDynamicProviderTest.java
@@ -29,11 +29,11 @@
import android.os.ConditionVariable;
import android.os.Looper;
+import androidx.annotation.NonNull;
import androidx.mediarouter.testing.MediaRouterTestHelper;
import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
-import org.jspecify.annotations.NonNull;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -170,15 +170,15 @@
@Override
public void onRouteSelected(
@NonNull MediaRouter router,
- MediaRouter.@NonNull RouteInfo selectedRoute,
+ @NonNull MediaRouter.RouteInfo selectedRoute,
int reason,
- MediaRouter.@NonNull RouteInfo requestedRoute) {
+ @NonNull MediaRouter.RouteInfo requestedRoute) {
mSelectedRouteChangeConditionVariable.open();
}
@Override
public void onRouteAdded(
- @NonNull MediaRouter router, MediaRouter.@NonNull RouteInfo route) {
+ @NonNull MediaRouter router, @NonNull MediaRouter.RouteInfo route) {
if (getCurrentRoutesAsMap().keySet().containsAll(mRouteIdsPending)) {
mPendingRoutesConditionVariable.open();
}
diff --git a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/StubDynamicMediaRouteProviderService.java b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/StubDynamicMediaRouteProviderService.java
index 93c99ea..fac64ed 100644
--- a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/StubDynamicMediaRouteProviderService.java
+++ b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/StubDynamicMediaRouteProviderService.java
@@ -18,12 +18,11 @@
import android.content.Context;
import android.content.IntentFilter;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.collection.ArrayMap;
import androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
@@ -62,7 +61,7 @@
private final MediaRouteDescriptor mGroupDescriptor;
private final Set<String> mCurrentSelectedRouteIds = new HashSet<>();
private boolean mCurrentlyScanning = false;
- private @Nullable DynamicGroupRouteController mGroupController;
+ @Nullable private DynamicGroupRouteController mGroupController;
Provider(@NonNull Context context) {
super(context);
@@ -101,8 +100,9 @@
return newController;
}
+ @Nullable
@Override
- public @Nullable DynamicGroupRouteController onCreateDynamicGroupRouteController(
+ public DynamicGroupRouteController onCreateDynamicGroupRouteController(
@NonNull String initialMemberRouteId,
@NonNull RouteControllerOptions routeControllerOptions) {
mGroupController = new StubDynamicRouteController();
diff --git a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/StubMediaRouteProviderService.java b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/StubMediaRouteProviderService.java
index 7ca69e7..97a2e83 100644
--- a/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/StubMediaRouteProviderService.java
+++ b/mediarouter/mediarouter/src/androidTest/java/androidx/mediarouter/media/StubMediaRouteProviderService.java
@@ -20,11 +20,10 @@
import android.content.IntentFilter;
import androidx.annotation.GuardedBy;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.collection.ArrayMap;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/DeviceUtils.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/DeviceUtils.java
index 32863ed..8c37529 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/DeviceUtils.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/DeviceUtils.java
@@ -25,20 +25,26 @@
import android.os.Build;
import androidx.annotation.Dimension;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.mediarouter.R;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
/** Utility methods for checking properties of the current device. */
final class DeviceUtils {
- private static @Nullable Boolean sIsPhone;
- private static @Nullable Boolean sIsTablet;
- private static @Nullable Boolean sIsFoldable;
- private static @Nullable Boolean sIsSevenInchTablet;
- private static @Nullable Boolean sIsWearable;
- private static @Nullable Boolean sIsAuto;
- private static @Nullable Boolean sIsTv;
+ @Nullable
+ private static Boolean sIsPhone;
+ @Nullable
+ private static Boolean sIsTablet;
+ @Nullable
+ private static Boolean sIsFoldable;
+ @Nullable
+ private static Boolean sIsSevenInchTablet;
+ @Nullable
+ private static Boolean sIsWearable;
+ @Nullable
+ private static Boolean sIsAuto;
+ @Nullable
+ private static Boolean sIsTv;
/** The feature name for Auto devices. */
private static final String FEATURE_AUTO = "android.hardware.type.automotive";
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteActionProvider.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteActionProvider.java
index 93f7535..ad40b81 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteActionProvider.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteActionProvider.java
@@ -21,6 +21,8 @@
import android.view.View;
import android.view.ViewGroup;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.ActionProvider;
@@ -28,9 +30,6 @@
import androidx.mediarouter.media.MediaRouter;
import androidx.mediarouter.media.MediaRouterParams;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
/**
* The media route action provider displays a {@link MediaRouteButton media route button}
* in the application's {@link ActionBar} to allow the user to select routes and
@@ -158,7 +157,8 @@
*
* @return The selector, never null.
*/
- public @NonNull MediaRouteSelector getRouteSelector() {
+ @NonNull
+ public MediaRouteSelector getRouteSelector() {
return mSelector;
}
@@ -221,7 +221,8 @@
*
* @return The dialog factory, never null.
*/
- public @NonNull MediaRouteDialogFactory getDialogFactory() {
+ @NonNull
+ public MediaRouteDialogFactory getDialogFactory() {
return mDialogFactory;
}
@@ -248,7 +249,8 @@
/**
* Gets the associated media route button, or null if it has not yet been created.
*/
- public @Nullable MediaRouteButton getMediaRouteButton() {
+ @Nullable
+ public MediaRouteButton getMediaRouteButton() {
return mButton;
}
@@ -258,12 +260,14 @@
* Subclasses may override this method to customize the button.
* </p>
*/
- public @NonNull MediaRouteButton onCreateMediaRouteButton() {
+ @NonNull
+ public MediaRouteButton onCreateMediaRouteButton() {
return new MediaRouteButton(getContext());
}
@Override
- public @NonNull View onCreateActionView() {
+ @NonNull
+ public View onCreateActionView() {
if (mButton != null) {
Log.e(TAG, "onCreateActionView: this ActionProvider is already associated " +
"with a menu item. Don't reuse MediaRouteActionProvider instances! " +
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
index 76b367d..fb1942a 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
@@ -31,6 +31,8 @@
import android.view.SoundEffectConstants;
import android.view.View;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.appcompat.widget.TooltipCompat;
import androidx.core.graphics.drawable.DrawableCompat;
@@ -43,9 +45,6 @@
import androidx.mediarouter.media.MediaRouter;
import androidx.mediarouter.media.MediaRouterParams;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
/**
* The media route button allows the user to select routes and to control the currently selected
* route.
@@ -202,7 +201,8 @@
*
* @return The selector, never null.
*/
- public @NonNull MediaRouteSelector getRouteSelector() {
+ @NonNull
+ public MediaRouteSelector getRouteSelector() {
return mSelector;
}
@@ -237,7 +237,8 @@
*
* @return The dialog factory, never null.
*/
- public @NonNull MediaRouteDialogFactory getDialogFactory() {
+ @NonNull
+ public MediaRouteDialogFactory getDialogFactory() {
return mDialogFactory;
}
@@ -407,7 +408,8 @@
}
@Override
- protected int @NonNull [] onCreateDrawableState(int extraSpace) {
+ @NonNull
+ protected int[] onCreateDrawableState(int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
// Technically we should be handling this more completely, but these
@@ -675,49 +677,49 @@
}
@Override
- public void onRouteAdded(@NonNull MediaRouter router, MediaRouter.@NonNull RouteInfo info) {
+ public void onRouteAdded(@NonNull MediaRouter router, @NonNull MediaRouter.RouteInfo info) {
refreshRoute();
}
@Override
public void onRouteRemoved(@NonNull MediaRouter router,
- MediaRouter.@NonNull RouteInfo info) {
+ @NonNull MediaRouter.RouteInfo info) {
refreshRoute();
}
@Override
public void onRouteChanged(@NonNull MediaRouter router,
- MediaRouter.@NonNull RouteInfo info) {
+ @NonNull MediaRouter.RouteInfo info) {
refreshRoute();
}
@Override
public void onRouteSelected(@NonNull MediaRouter router,
- MediaRouter.@NonNull RouteInfo info) {
+ @NonNull MediaRouter.RouteInfo info) {
refreshRoute();
}
@Override
public void onRouteUnselected(@NonNull MediaRouter router,
- MediaRouter.@NonNull RouteInfo info) {
+ @NonNull MediaRouter.RouteInfo info) {
refreshRoute();
}
@Override
public void onProviderAdded(@NonNull MediaRouter router,
- MediaRouter.@NonNull ProviderInfo provider) {
+ @NonNull MediaRouter.ProviderInfo provider) {
refreshRoute();
}
@Override
public void onProviderRemoved(@NonNull MediaRouter router,
- MediaRouter.@NonNull ProviderInfo provider) {
+ @NonNull MediaRouter.ProviderInfo provider) {
refreshRoute();
}
@Override
public void onProviderChanged(@NonNull MediaRouter router,
- MediaRouter.@NonNull ProviderInfo provider) {
+ @NonNull MediaRouter.ProviderInfo provider) {
refreshRoute();
}
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteChooserDialog.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteChooserDialog.java
index 88e7cf8..1ab6667 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteChooserDialog.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteChooserDialog.java
@@ -48,15 +48,14 @@
import android.widget.TextView;
import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatDialog;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.mediarouter.R;
import androidx.mediarouter.media.MediaRouteSelector;
import androidx.mediarouter.media.MediaRouter;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Retention;
@@ -153,7 +152,8 @@
*
* @return The selector, never null.
*/
- public @NonNull MediaRouteSelector getRouteSelector() {
+ @NonNull
+ public MediaRouteSelector getRouteSelector() {
return mSelector;
}
@@ -208,7 +208,7 @@
* @param route The route to consider, never null.
* @return True if the route should be included in the chooser dialog.
*/
- public boolean onFilterRoute(MediaRouter.@NonNull RouteInfo route) {
+ public boolean onFilterRoute(@NonNull MediaRouter.RouteInfo route) {
return !route.isDefaultOrBluetooth() && route.isEnabled()
&& route.matchesSelector(mSelector);
}
@@ -469,8 +469,9 @@
return getItem(position).isEnabled();
}
+ @NonNull
@Override
- public @NonNull View getView(int position, View convertView, @NonNull ViewGroup parent) {
+ public View getView(int position, View convertView, @NonNull ViewGroup parent) {
View view = convertView;
if (view == null) {
view = mInflater.inflate(R.layout.mr_chooser_list_item, parent, false);
@@ -555,25 +556,25 @@
}
@Override
- public void onRouteAdded(@NonNull MediaRouter router, MediaRouter.@NonNull RouteInfo info) {
+ public void onRouteAdded(@NonNull MediaRouter router, @NonNull MediaRouter.RouteInfo info) {
refreshRoutes();
}
@Override
public void onRouteRemoved(@NonNull MediaRouter router,
- MediaRouter.@NonNull RouteInfo info) {
+ @NonNull MediaRouter.RouteInfo info) {
refreshRoutes();
}
@Override
public void onRouteChanged(@NonNull MediaRouter router,
- MediaRouter.@NonNull RouteInfo info) {
+ @NonNull MediaRouter.RouteInfo info) {
refreshRoutes();
}
@Override
public void onRouteSelected(@NonNull MediaRouter router,
- MediaRouter.@NonNull RouteInfo route) {
+ @NonNull MediaRouter.RouteInfo route) {
dismiss();
}
}
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteChooserDialogFragment.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteChooserDialogFragment.java
index d0ca4b1..5bbe5f6 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteChooserDialogFragment.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteChooserDialogFragment.java
@@ -23,13 +23,12 @@
import android.content.res.Configuration;
import android.os.Bundle;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.fragment.app.DialogFragment;
import androidx.mediarouter.media.MediaRouteSelector;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
/**
* Media route chooser dialog fragment.
* <p>
@@ -58,7 +57,8 @@
*
* @return The selector, never null.
*/
- public @NonNull MediaRouteSelector getRouteSelector() {
+ @NonNull
+ public MediaRouteSelector getRouteSelector() {
ensureRouteSelector();
return mSelector;
}
@@ -125,8 +125,8 @@
* Called when the device picker dialog is being created.
*/
@RestrictTo(LIBRARY)
- public @NonNull MediaRouteDynamicChooserDialog onCreateDynamicChooserDialog(
- @NonNull Context context) {
+ @NonNull
+ public MediaRouteDynamicChooserDialog onCreateDynamicChooserDialog(@NonNull Context context) {
return new MediaRouteDynamicChooserDialog(context);
}
@@ -136,13 +136,15 @@
* Subclasses may override this method to customize the dialog.
* </p>
*/
- public @NonNull MediaRouteChooserDialog onCreateChooserDialog(
+ @NonNull
+ public MediaRouteChooserDialog onCreateChooserDialog(
@NonNull Context context, @Nullable Bundle savedInstanceState) {
return new MediaRouteChooserDialog(context);
}
@Override
- public @NonNull Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+ @NonNull
+ public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
if (mUseDynamicGroup) {
mDialog = onCreateDynamicChooserDialog(getContext());
((MediaRouteDynamicChooserDialog) mDialog).setRouteSelector(getRouteSelector());
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteControllerDialog.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteControllerDialog.java
index 3c6d12d..cc391a4 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteControllerDialog.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteControllerDialog.java
@@ -64,6 +64,8 @@
import android.widget.SeekBar;
import android.widget.TextView;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.core.util.ObjectsCompat;
import androidx.core.view.accessibility.AccessibilityEventCompat;
@@ -72,9 +74,6 @@
import androidx.mediarouter.media.MediaRouter;
import androidx.palette.graphics.Palette;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -227,7 +226,8 @@
/**
* Gets the route that this dialog is controlling.
*/
- public MediaRouter.@NonNull RouteInfo getRoute() {
+ @NonNull
+ public MediaRouter.RouteInfo getRoute() {
return mRoute;
}
@@ -242,7 +242,8 @@
* @param savedInstanceState The dialog's saved instance state.
* @return The media control view, or null if none.
*/
- public @Nullable View onCreateMediaControlView(@Nullable Bundle savedInstanceState) {
+ @Nullable
+ public View onCreateMediaControlView(@Nullable Bundle savedInstanceState) {
return null;
}
@@ -251,7 +252,8 @@
*
* @return The media control view, or null if none.
*/
- public @Nullable View getMediaControlView() {
+ @Nullable
+ public View getMediaControlView() {
return mCustomControlView;
}
@@ -311,7 +313,8 @@
*
* @return The token for the session to use or null if none.
*/
- public MediaSessionCompat.@Nullable Token getMediaSession() {
+ @Nullable
+ public MediaSessionCompat.Token getMediaSession() {
return mMediaController == null ? null : mMediaController.getSessionToken();
}
@@ -1134,19 +1137,19 @@
@Override
public void onRouteUnselected(@NonNull MediaRouter router,
- MediaRouter.@NonNull RouteInfo route) {
+ @NonNull MediaRouter.RouteInfo route) {
update(false);
}
@Override
public void onRouteChanged(@NonNull MediaRouter router,
- MediaRouter.@NonNull RouteInfo route) {
+ @NonNull MediaRouter.RouteInfo route) {
update(true);
}
@Override
public void onRouteVolumeChanged(@NonNull MediaRouter router,
- MediaRouter.@NonNull RouteInfo route) {
+ @NonNull MediaRouter.RouteInfo route) {
SeekBar volumeSlider = mVolumeSliderMap.get(route);
int volume = route.getVolume();
if (DEBUG) {
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteControllerDialogFragment.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteControllerDialogFragment.java
index 72c6e05..10d1b28 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteControllerDialogFragment.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteControllerDialogFragment.java
@@ -23,13 +23,12 @@
import android.content.res.Configuration;
import android.os.Bundle;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.fragment.app.DialogFragment;
import androidx.mediarouter.media.MediaRouteSelector;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
/**
* Media route controller dialog fragment.
* <p>
@@ -59,7 +58,8 @@
* @return The selector, never null.
*/
@RestrictTo(LIBRARY)
- public @NonNull MediaRouteSelector getRouteSelector() {
+ @NonNull
+ public MediaRouteSelector getRouteSelector() {
ensureRouteSelector();
return mSelector;
}
@@ -125,7 +125,8 @@
* Called when the cast dialog is being created.
*/
@RestrictTo(LIBRARY)
- public @NonNull MediaRouteDynamicControllerDialog onCreateDynamicControllerDialog(
+ @NonNull
+ public MediaRouteDynamicControllerDialog onCreateDynamicControllerDialog(
@NonNull Context context) {
return new MediaRouteDynamicControllerDialog(context);
}
@@ -136,13 +137,15 @@
* Subclasses may override this method to customize the dialog.
* </p>
*/
- public @NonNull MediaRouteControllerDialog onCreateControllerDialog(
+ @NonNull
+ public MediaRouteControllerDialog onCreateControllerDialog(
@NonNull Context context, @Nullable Bundle savedInstanceState) {
return new MediaRouteControllerDialog(context);
}
@Override
- public @NonNull Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+ @NonNull
+ public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
if (mUseDynamicGroup) {
mDialog = onCreateDynamicControllerDialog(getContext());
((MediaRouteDynamicControllerDialog) mDialog).setRouteSelector(mSelector);
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDialogFactory.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDialogFactory.java
index fff584b..43c06c3 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDialogFactory.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDialogFactory.java
@@ -16,7 +16,7 @@
package androidx.mediarouter.app;
-import org.jspecify.annotations.NonNull;
+import androidx.annotation.NonNull;
/**
* The media route dialog factory is responsible for creating the media route
@@ -41,7 +41,8 @@
*
* @return The default media route dialog factory, never null.
*/
- public static @NonNull MediaRouteDialogFactory getDefault() {
+ @NonNull
+ public static MediaRouteDialogFactory getDefault() {
return sDefault;
}
@@ -53,7 +54,8 @@
*
* @return The media route chooser dialog fragment, must not be null.
*/
- public @NonNull MediaRouteChooserDialogFragment onCreateChooserDialogFragment() {
+ @NonNull
+ public MediaRouteChooserDialogFragment onCreateChooserDialogFragment() {
return new MediaRouteChooserDialogFragment();
}
@@ -65,7 +67,8 @@
*
* @return The media route controller dialog fragment, must not be null.
*/
- public @NonNull MediaRouteControllerDialogFragment onCreateControllerDialogFragment() {
+ @NonNull
+ public MediaRouteControllerDialogFragment onCreateControllerDialogFragment() {
return new MediaRouteControllerDialogFragment();
}
}
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDiscoveryFragment.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDiscoveryFragment.java
index 618d6a3..df0e5f2 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDiscoveryFragment.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDiscoveryFragment.java
@@ -18,13 +18,12 @@
import android.os.Bundle;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.mediarouter.media.MediaRouteSelector;
import androidx.mediarouter.media.MediaRouter;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
/**
* Media route discovery fragment.
* <p>
@@ -58,7 +57,8 @@
/**
* Gets the media router instance.
*/
- public @NonNull MediaRouter getMediaRouter() {
+ @NonNull
+ public MediaRouter getMediaRouter() {
ensureRouter();
return mRouter;
}
@@ -74,7 +74,8 @@
*
* @return The selector, never null.
*/
- public @NonNull MediaRouteSelector getRouteSelector() {
+ @NonNull
+ public MediaRouteSelector getRouteSelector() {
ensureRouteSelector();
return mSelector;
}
@@ -130,7 +131,8 @@
*
* @return The new callback, or null if no callback should be registered.
*/
- public MediaRouter.@Nullable Callback onCreateCallback() {
+ @Nullable
+ public MediaRouter.Callback onCreateCallback() {
return new MediaRouter.Callback() { };
}
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDynamicChooserDialog.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDynamicChooserDialog.java
index db84bc9..c2819e7 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDynamicChooserDialog.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDynamicChooserDialog.java
@@ -35,6 +35,8 @@
import android.widget.TextView;
import androidx.annotation.CallSuper;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.appcompat.app.AppCompatDialog;
import androidx.mediarouter.R;
@@ -43,9 +45,6 @@
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
@@ -116,7 +115,8 @@
*
* @return The selector, never null.
*/
- public @NonNull MediaRouteSelector getRouteSelector() {
+ @NonNull
+ public MediaRouteSelector getRouteSelector() {
return mSelector;
}
@@ -169,7 +169,7 @@
* @param route The route to consider, never null.
* @return {@code true} if the route should be included in the device picker dialog.
*/
- public boolean onFilterRoute(MediaRouter.@NonNull RouteInfo route) {
+ public boolean onFilterRoute(@NonNull MediaRouter.RouteInfo route) {
return !route.isDefaultOrBluetooth() && route.isEnabled()
&& route.matchesSelector(mSelector);
}
@@ -261,25 +261,25 @@
}
@Override
- public void onRouteAdded(@NonNull MediaRouter router, MediaRouter.@NonNull RouteInfo info) {
+ public void onRouteAdded(@NonNull MediaRouter router, @NonNull MediaRouter.RouteInfo info) {
refreshRoutes();
}
@Override
public void onRouteRemoved(@NonNull MediaRouter router,
- MediaRouter.@NonNull RouteInfo info) {
+ @NonNull MediaRouter.RouteInfo info) {
refreshRoutes();
}
@Override
public void onRouteChanged(@NonNull MediaRouter router,
- MediaRouter.@NonNull RouteInfo info) {
+ @NonNull MediaRouter.RouteInfo info) {
refreshRoutes();
}
@Override
public void onRouteSelected(@NonNull MediaRouter router,
- MediaRouter.@NonNull RouteInfo route) {
+ @NonNull MediaRouter.RouteInfo route) {
dismiss();
}
}
@@ -331,8 +331,8 @@
}
@Override
- public RecyclerView.@NonNull ViewHolder onCreateViewHolder(
- @NonNull ViewGroup parent, int viewType) {
+ @NonNull
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view;
switch (viewType) {
@@ -349,7 +349,7 @@
}
@Override
- public void onBindViewHolder(RecyclerView.@NonNull ViewHolder holder, int position) {
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
int viewType = getItemViewType(position);
Item item = getItem(position);
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDynamicControllerDialog.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDynamicControllerDialog.java
index 41c4270..07891df 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDynamicControllerDialog.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteDynamicControllerDialog.java
@@ -59,6 +59,8 @@
import android.widget.TextView;
import androidx.annotation.CallSuper;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.appcompat.app.AppCompatDialog;
import androidx.core.util.ObjectsCompat;
@@ -70,9 +72,6 @@
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -258,7 +257,8 @@
*
* @return The token for the session to use or null if none.
*/
- public MediaSessionCompat.@Nullable Token getMediaSession() {
+ @Nullable
+ public MediaSessionCompat.Token getMediaSession() {
return mMediaController == null ? null : mMediaController.getSessionToken();
}
@@ -267,7 +267,8 @@
*
* @return The selector, never null.
*/
- public @NonNull MediaRouteSelector getRouteSelector() {
+ @NonNull
+ public MediaRouteSelector getRouteSelector() {
return mSelector;
}
@@ -320,7 +321,7 @@
* @param route The route to consider, never null.
* @return True if the route should be included in the chooser dialog.
*/
- public boolean onFilterRoute(MediaRouter.@NonNull RouteInfo route) {
+ public boolean onFilterRoute(@NonNull MediaRouter.RouteInfo route) {
return !route.isDefaultOrBluetooth() && route.isEnabled()
&& route.matchesSelector(mSelector) && !(mSelectedRoute == route);
}
@@ -921,8 +922,8 @@
}
@Override
- public RecyclerView.@NonNull ViewHolder onCreateViewHolder(
- @NonNull ViewGroup parent, int viewType) {
+ @NonNull
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view;
switch (viewType) {
@@ -945,7 +946,7 @@
}
@Override
- public void onBindViewHolder(RecyclerView.@NonNull ViewHolder holder, int position) {
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
int viewType = getItemViewType(position);
Item item = getItem(position);
@@ -980,7 +981,7 @@
}
@Override
- public void onViewRecycled(RecyclerView.@NonNull ViewHolder holder) {
+ public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
super.onViewRecycled(holder);
mVolumeSliderHolderMap.values().remove(holder);
}
@@ -1322,19 +1323,19 @@
}
@Override
- public void onRouteAdded(@NonNull MediaRouter router, MediaRouter.@NonNull RouteInfo info) {
+ public void onRouteAdded(@NonNull MediaRouter router, @NonNull MediaRouter.RouteInfo info) {
updateRoutesView();
}
@Override
public void onRouteRemoved(@NonNull MediaRouter router,
- MediaRouter.@NonNull RouteInfo info) {
+ @NonNull MediaRouter.RouteInfo info) {
updateRoutesView();
}
@Override
public void onRouteSelected(@NonNull MediaRouter router,
- MediaRouter.@NonNull RouteInfo route) {
+ @NonNull MediaRouter.RouteInfo route) {
mSelectedRoute = route;
mIsSelectingRoute = false;
@@ -1346,13 +1347,13 @@
@Override
public void onRouteUnselected(@NonNull MediaRouter router,
- MediaRouter.@NonNull RouteInfo route) {
+ @NonNull MediaRouter.RouteInfo route) {
updateRoutesView();
}
@Override
public void onRouteChanged(@NonNull MediaRouter router,
- MediaRouter.@NonNull RouteInfo route) {
+ @NonNull MediaRouter.RouteInfo route) {
boolean shouldRefreshRoute = false;
if (route == mSelectedRoute && route.getDynamicGroupController() != null) {
for (MediaRouter.RouteInfo memberRoute : route.getProvider().getRoutes()) {
@@ -1381,7 +1382,7 @@
@Override
public void onRouteVolumeChanged(@NonNull MediaRouter router,
- MediaRouter.@NonNull RouteInfo route) {
+ @NonNull MediaRouter.RouteInfo route) {
int volume = route.getVolume();
if (DEBUG) {
Log.d(TAG, "onRouteVolumeChanged(), route.getVolume:" + volume);
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/OverlayListView.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/OverlayListView.java
index fa34fe7..3d6632e 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/OverlayListView.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/OverlayListView.java
@@ -24,8 +24,8 @@
import android.view.animation.Interpolator;
import android.widget.ListView;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.Iterator;
@@ -130,7 +130,8 @@
*
* @return BitmapDrawable that this object has.
*/
- public @Nullable BitmapDrawable getBitmapDrawable() {
+ @Nullable
+ public BitmapDrawable getBitmapDrawable() {
return mBitmap;
}
@@ -151,7 +152,8 @@
* @param endAlpha Ending alpha value for the animation.
* @return This OverlayObject to allow for chaining of calls.
*/
- public @NonNull OverlayObject setAlphaAnimation(float startAlpha, float endAlpha) {
+ @NonNull
+ public OverlayObject setAlphaAnimation(float startAlpha, float endAlpha) {
mStartAlpha = startAlpha;
mEndAlpha = endAlpha;
return this;
@@ -163,7 +165,8 @@
* @param deltaY Distance to move in pixels.
* @return This OverlayObject to allow for chaining of calls.
*/
- public @NonNull OverlayObject setTranslateYAnimation(int deltaY) {
+ @NonNull
+ public OverlayObject setTranslateYAnimation(int deltaY) {
mDeltaY = deltaY;
return this;
}
@@ -174,7 +177,8 @@
* @param duration Duration in milliseconds
* @return This OverlayObject to allow for chaining of calls.
*/
- public @NonNull OverlayObject setDuration(long duration) {
+ @NonNull
+ public OverlayObject setDuration(long duration) {
mDuration = duration;
return this;
}
@@ -185,7 +189,8 @@
* @param interpolator The interpolator which defines the acceleration curve
* @return This OverlayObject to allow for chaining of calls.
*/
- public @NonNull OverlayObject setInterpolator(@Nullable Interpolator interpolator) {
+ @NonNull
+ public OverlayObject setInterpolator(@Nullable Interpolator interpolator) {
mInterpolator = interpolator;
return this;
}
@@ -196,8 +201,8 @@
* @param listener the animation end listener to be notified.
* @return This OverlayObject to allow for chaining of calls.
*/
- public @NonNull OverlayObject setAnimationEndListener(
- @Nullable OnAnimationEndListener listener) {
+ @NonNull
+ public OverlayObject setAnimationEndListener(@Nullable OnAnimationEndListener listener) {
mListener = listener;
return this;
}
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/SystemOutputSwitcherDialogController.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/SystemOutputSwitcherDialogController.java
index 9395dc6..e88cc01 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/SystemOutputSwitcherDialogController.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/SystemOutputSwitcherDialogController.java
@@ -28,10 +28,9 @@
import android.os.Build;
import android.provider.Settings;
+import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
-import org.jspecify.annotations.NonNull;
-
import java.util.List;
/**
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/GlobalMediaRouter.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/GlobalMediaRouter.java
index 03352b8..2cfa782 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/GlobalMediaRouter.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/GlobalMediaRouter.java
@@ -38,6 +38,8 @@
import android.util.Log;
import android.view.Display;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.VisibleForTesting;
import androidx.core.app.ActivityManagerCompat;
@@ -48,9 +50,6 @@
import com.google.common.util.concurrent.ListenableFuture;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collection;
@@ -268,7 +267,8 @@
return mRoutes;
}
- /* package */ @Nullable MediaRouterParams getRouterParams() {
+ @Nullable
+ /* package */ MediaRouterParams getRouterParams() {
return mRouterParams;
}
@@ -319,11 +319,13 @@
}
}
- /* package */ @NonNull List<MediaRouter.ProviderInfo> getProviders() {
+ @NonNull
+ /* package */ List<MediaRouter.ProviderInfo> getProviders() {
return mProviders;
}
- /* package */ MediaRouter.@NonNull RouteInfo getDefaultRoute() {
+ @NonNull
+ /* package */ MediaRouter.RouteInfo getDefaultRoute() {
if (mDefaultRoute == null) {
// This should never happen once the media router has been fully
// initialized but it is good to check for the error in case there
@@ -339,7 +341,8 @@
return mBluetoothRoute;
}
- /* package */ MediaRouter.@NonNull RouteInfo getSelectedRoute() {
+ @NonNull
+ /* package */ MediaRouter.RouteInfo getSelectedRoute() {
if (mSelectedRoute == null) {
// This should never happen once the media router has been fully
// initialized but it is good to check for the error in case there
@@ -351,12 +354,13 @@
return mSelectedRoute;
}
- /* package */ MediaRouter.RouteInfo.@Nullable DynamicGroupState getDynamicGroupState(
+ @Nullable
+ /* package */ MediaRouter.RouteInfo.DynamicGroupState getDynamicGroupState(
MediaRouter.RouteInfo route) {
return mSelectedRoute.getDynamicGroupState(route);
}
- /* package */ void addMemberToDynamicGroup(MediaRouter.@NonNull RouteInfo route) {
+ /* package */ void addMemberToDynamicGroup(@NonNull MediaRouter.RouteInfo route) {
if (!(mSelectedRouteController instanceof MediaRouteProvider.DynamicGroupRouteController)) {
throw new IllegalStateException("There is no currently selected dynamic group route.");
}
@@ -371,7 +375,7 @@
.onAddMemberRoute(route.getDescriptorId());
}
- /* package */ void removeMemberFromDynamicGroup(MediaRouter.@NonNull RouteInfo route) {
+ /* package */ void removeMemberFromDynamicGroup(@NonNull MediaRouter.RouteInfo route) {
if (!(mSelectedRouteController instanceof MediaRouteProvider.DynamicGroupRouteController)) {
throw new IllegalStateException("There is no currently selected dynamic group route.");
}
@@ -390,7 +394,7 @@
.onRemoveMemberRoute(route.getDescriptorId());
}
- /* package */ void transferToRoute(MediaRouter.@NonNull RouteInfo route) {
+ /* package */ void transferToRoute(@NonNull MediaRouter.RouteInfo route) {
if (!(mSelectedRouteController instanceof MediaRouteProvider.DynamicGroupRouteController)) {
throw new IllegalStateException("There is no currently selected dynamic group route.");
}
@@ -424,7 +428,7 @@
* explicit application route selection.
*/
/* package */ void selectRoute(
- MediaRouter.@NonNull RouteInfo route,
+ @NonNull MediaRouter.RouteInfo route,
@MediaRouter.UnselectReason int unselectReason,
boolean syncMediaRoute1Provider) {
if (!mRoutes.contains(route)) {
@@ -673,7 +677,7 @@
@Override
public void releaseProviderController(
@NonNull RegisteredMediaRouteProvider provider,
- MediaRouteProvider.@NonNull RouteController controller) {
+ @NonNull MediaRouteProvider.RouteController controller) {
if (mSelectedRouteController == controller) {
selectRoute(
chooseFallbackRoute(),
@@ -992,7 +996,7 @@
}
/* package */ void selectRouteInternal(
- MediaRouter.@NonNull RouteInfo route,
+ @NonNull MediaRouter.RouteInfo route,
@MediaRouter.UnselectReason int unselectReason,
boolean syncMediaRoute1Provider) {
if (mSelectedRoute == route) {
@@ -1145,11 +1149,12 @@
/* package */ void notifyTransfer(
GlobalMediaRouter router,
MediaRouter.RouteInfo route,
- MediaRouteProvider.@Nullable RouteController routeController,
+ @Nullable MediaRouteProvider.RouteController routeController,
@MediaRouter.UnselectReason int reason,
boolean syncMediaRoute1Provider,
- MediaRouter.@Nullable RouteInfo requestedRoute,
- @Nullable Collection<
+ @Nullable MediaRouter.RouteInfo requestedRoute,
+ @Nullable
+ Collection<
MediaRouteProvider.DynamicGroupRouteController
.DynamicRouteDescriptor>
memberRoutes) {
@@ -1188,9 +1193,10 @@
.OnDynamicRoutesChangedListener() {
@Override
public void onRoutesChanged(
- MediaRouteProvider.@NonNull DynamicGroupRouteController controller,
+ @NonNull MediaRouteProvider.DynamicGroupRouteController controller,
@Nullable MediaRouteDescriptor groupRouteDescriptor,
- @NonNull Collection<
+ @NonNull
+ Collection<
MediaRouteProvider
.DynamicGroupRouteController
.DynamicRouteDescriptor>
@@ -1395,7 +1401,7 @@
}
@Override
- public void onReleaseController(MediaRouteProvider.@NonNull RouteController controller) {
+ public void onReleaseController(@NonNull MediaRouteProvider.RouteController controller) {
if (controller == mSelectedRouteController) {
// Stop casting
selectRouteToFallbackRoute(UNSELECT_REASON_STOPPED);
@@ -1555,8 +1561,8 @@
public static final int MSG_ROUTER_PARAMS_CHANGED = MSG_TYPE_ROUTER | 1;
/* package */ void postRouteSelectedMessage(
- MediaRouter.@Nullable RouteInfo fromRoute,
- MediaRouter.@NonNull RouteInfo targetRoute,
+ @Nullable MediaRouter.RouteInfo fromRoute,
+ @NonNull MediaRouter.RouteInfo targetRoute,
int reason,
boolean syncMediaRoute1Provider) {
RouteSelectedMessageParams params =
@@ -1567,8 +1573,8 @@
}
/* package */ void postAnotherRouteSelectedMessage(
- MediaRouter.@Nullable RouteInfo requestedRoute,
- MediaRouter.@NonNull RouteInfo targetRoute,
+ @Nullable MediaRouter.RouteInfo requestedRoute,
+ @NonNull MediaRouter.RouteInfo targetRoute,
int reason,
boolean syncMediaRoute1Provider) {
RouteSelectedMessageParams params =
@@ -1755,15 +1761,15 @@
* Holds the origin route for {@link CallbackHandler#MSG_ROUTE_SELECTED}, or the originally
* requested route for {@link CallbackHandler#MSG_ROUTE_ANOTHER_SELECTED}.
*/
- public final MediaRouter.@Nullable RouteInfo mFromOrRequestedRoute;
+ @Nullable public final MediaRouter.RouteInfo mFromOrRequestedRoute;
- public final MediaRouter.@NonNull RouteInfo mTargetRoute;
+ @NonNull public final MediaRouter.RouteInfo mTargetRoute;
public final boolean mSyncMediaRoute1Provider;
private RouteSelectedMessageParams(
- MediaRouter.@Nullable RouteInfo fromOrRequestedRoute,
- MediaRouter.@NonNull RouteInfo targetRoute,
+ @Nullable MediaRouter.RouteInfo fromOrRequestedRoute,
+ @NonNull MediaRouter.RouteInfo targetRoute,
boolean syncMediaRoute1Provider) {
mFromOrRequestedRoute = fromOrRequestedRoute;
mTargetRoute = targetRoute;
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaItemStatus.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaItemStatus.java
index b001a78..a01fb65 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaItemStatus.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaItemStatus.java
@@ -20,11 +20,10 @@
import android.os.Bundle;
import android.os.SystemClock;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.core.util.TimeUtils;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
/**
* Describes the playback status of a media item.
* <p>
@@ -251,12 +250,14 @@
* The extras will be ignored by the media router but they may be used
* by applications.
*/
- public @Nullable Bundle getExtras() {
+ @Nullable
+ public Bundle getExtras() {
return mBundle.getBundle(KEY_EXTRAS);
}
+ @NonNull
@Override
- public @NonNull String toString() {
+ public String toString() {
StringBuilder result = new StringBuilder();
result.append("MediaItemStatus{ ");
result.append("timestamp=");
@@ -297,7 +298,8 @@
*
* @return The contents of the object represented as a bundle.
*/
- public @NonNull Bundle asBundle() {
+ @NonNull
+ public Bundle asBundle() {
return mBundle;
}
@@ -307,7 +309,8 @@
* @param bundle The bundle, or null if none.
* @return The new instance, or null if the bundle was null.
*/
- public static @Nullable MediaItemStatus fromBundle(@Nullable Bundle bundle) {
+ @Nullable
+ public static MediaItemStatus fromBundle(@Nullable Bundle bundle) {
return bundle != null ? new MediaItemStatus(bundle) : null;
}
@@ -345,7 +348,8 @@
* Sets the timestamp associated with the status information in
* milliseconds since boot in the {@link SystemClock#elapsedRealtime} time base.
*/
- public @NonNull Builder setTimestamp(long elapsedRealtimeTimestamp) {
+ @NonNull
+ public Builder setTimestamp(long elapsedRealtimeTimestamp) {
mBundle.putLong(KEY_TIMESTAMP, elapsedRealtimeTimestamp);
return this;
}
@@ -353,7 +357,8 @@
/**
* Sets the playback state of the media item.
*/
- public @NonNull Builder setPlaybackState(int playbackState) {
+ @NonNull
+ public Builder setPlaybackState(int playbackState) {
mBundle.putInt(KEY_PLAYBACK_STATE, playbackState);
return this;
}
@@ -362,7 +367,8 @@
* Sets the content playback position as a long integer number of milliseconds
* from the beginning of the content.
*/
- public @NonNull Builder setContentPosition(long positionMilliseconds) {
+ @NonNull
+ public Builder setContentPosition(long positionMilliseconds) {
mBundle.putLong(KEY_CONTENT_POSITION, positionMilliseconds);
return this;
}
@@ -371,7 +377,8 @@
* Sets the total duration of the content to be played as a long integer number
* of milliseconds.
*/
- public @NonNull Builder setContentDuration(long durationMilliseconds) {
+ @NonNull
+ public Builder setContentDuration(long durationMilliseconds) {
mBundle.putLong(KEY_CONTENT_DURATION, durationMilliseconds);
return this;
}
@@ -381,7 +388,8 @@
* The extras will be ignored by the media router but they may be used
* by applications.
*/
- public @NonNull Builder setExtras(@Nullable Bundle extras) {
+ @NonNull
+ public Builder setExtras(@Nullable Bundle extras) {
if (extras == null) {
mBundle.putBundle(KEY_EXTRAS, null);
} else {
@@ -393,7 +401,8 @@
/**
* Builds the {@link MediaItemStatus media item status object}.
*/
- public @NonNull MediaItemStatus build() {
+ @NonNull
+ public MediaItemStatus build() {
return new MediaItemStatus(mBundle);
}
}
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRoute2Provider.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRoute2Provider.java
index d6ffed2..8d3eae2 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRoute2Provider.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRoute2Provider.java
@@ -44,15 +44,14 @@
import android.util.Log;
import android.util.SparseArray;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.annotation.VisibleForTesting;
import androidx.mediarouter.R;
import androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor;
import androidx.mediarouter.media.MediaRouter.ControlRequestCallback;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -116,14 +115,16 @@
}
}
+ @Nullable
@Override
- public @Nullable RouteController onCreateRouteController(@NonNull String routeId) {
+ public RouteController onCreateRouteController(@NonNull String routeId) {
String originalRouteId = mRouteIdToOriginalRouteIdMap.get(routeId);
return new MemberRouteController(originalRouteId, null);
}
+ @Nullable
@Override
- public @Nullable RouteController onCreateRouteController(@NonNull String routeId,
+ public RouteController onCreateRouteController(@NonNull String routeId,
@NonNull String routeGroupId) {
String originalRouteId = mRouteIdToOriginalRouteIdMap.get(routeId);
@@ -137,8 +138,9 @@
return new MemberRouteController(originalRouteId, null);
}
+ @Nullable
@Override
- public @Nullable DynamicGroupRouteController onCreateDynamicGroupRouteController(
+ public DynamicGroupRouteController onCreateDynamicGroupRouteController(
@NonNull String initialMemberRouteId,
@NonNull RouteControllerOptions routeControllerOptions) {
// The parent implementation of onCreateDynamicGroupRouteController(String,
@@ -231,7 +233,8 @@
setDescriptor(descriptor);
}
- @Nullable MediaRoute2Info getRouteById(@Nullable String routeId) {
+ @Nullable
+ MediaRoute2Info getRouteById(@Nullable String routeId) {
if (routeId == null) {
return null;
}
@@ -243,8 +246,9 @@
return null;
}
- static @Nullable Messenger getMessengerFromRoutingController(
- MediaRouter2.@Nullable RoutingController controller) {
+ @Nullable
+ static Messenger getMessengerFromRoutingController(
+ @Nullable MediaRouter2.RoutingController controller) {
if (controller == null) {
return null;
}
@@ -254,7 +258,8 @@
MediaRouter2Utils.KEY_MESSENGER);
}
- static @Nullable String getSessionIdForRouteController(@Nullable RouteController controller) {
+ @Nullable
+ static String getSessionIdForRouteController(@Nullable RouteController controller) {
if (!(controller instanceof GroupRouteController)) {
return null;
}
@@ -431,8 +436,8 @@
private class TransferCallback extends MediaRouter2.TransferCallback {
@Override
- public void onTransfer(MediaRouter2.@NonNull RoutingController oldController,
- MediaRouter2.@NonNull RoutingController newController) {
+ public void onTransfer(@NonNull MediaRouter2.RoutingController oldController,
+ @NonNull MediaRouter2.RoutingController newController) {
mControllerMap.remove(oldController);
if (newController == mMediaRouter2.getSystemController()) {
mCallback.onSelectFallbackRoute(UNSELECT_REASON_ROUTE_CHANGED);
@@ -457,7 +462,7 @@
}
@Override
- public void onStop(MediaRouter2.@NonNull RoutingController routingController) {
+ public void onStop(@NonNull MediaRouter2.RoutingController routingController) {
RouteController routeController = mControllerMap.remove(routingController);
if (routeController != null) {
mCallback.onReleaseController(routeController);
@@ -472,7 +477,7 @@
ControllerCallback() {}
@Override
- public void onControllerUpdated(MediaRouter2.@NonNull RoutingController routingController) {
+ public void onControllerUpdated(@NonNull MediaRouter2.RoutingController routingController) {
setDynamicRouteDescriptors(routingController);
}
}
@@ -512,8 +517,10 @@
final String mInitialMemberRouteId;
final MediaRouter2.RoutingController mRoutingController;
- final @Nullable Messenger mServiceMessenger;
- final @Nullable Messenger mReceiveMessenger;
+ @Nullable
+ final Messenger mServiceMessenger;
+ @Nullable
+ final Messenger mReceiveMessenger;
final SparseArray<ControlRequestCallback> mPendingCallbacks = new SparseArray<>();
final Handler mControllerHandler;
AtomicInteger mNextRequestId = new AtomicInteger(1);
@@ -521,9 +528,10 @@
private final Runnable mClearOptimisticVolumeRunnable = () -> mOptimisticVolume = -1;
// The possible current volume set by the user recently or -1 if not.
int mOptimisticVolume = -1;
- @Nullable MediaRouteDescriptor mGroupRouteDescriptor;
+ @Nullable
+ MediaRouteDescriptor mGroupRouteDescriptor;
- GroupRouteController(MediaRouter2.@NonNull RoutingController routingController,
+ GroupRouteController(@NonNull MediaRouter2.RoutingController routingController,
@NonNull String initialMemberRouteId) {
mRoutingController = routingController;
mInitialMemberRouteId = initialMemberRouteId;
@@ -748,7 +756,7 @@
static void setPlatformRouteListingPreference(
@NonNull MediaRouter2 mediaRouter2,
- android.media.@Nullable RouteListingPreference routeListingPreference) {
+ @Nullable android.media.RouteListingPreference routeListingPreference) {
mediaRouter2.setRouteListingPreference(routeListingPreference);
}
}
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRoute2ProviderServiceAdapter.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRoute2ProviderServiceAdapter.java
index 5bb54ba..97b110b 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRoute2ProviderServiceAdapter.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRoute2ProviderServiceAdapter.java
@@ -46,6 +46,8 @@
import android.util.SparseArray;
import androidx.annotation.GuardedBy;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.collection.ArrayMap;
import androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController;
@@ -55,9 +57,6 @@
import androidx.mediarouter.media.MediaRouteProviderService.MediaRouteProviderServiceImplApi30;
import androidx.mediarouter.media.MediaRouteProviderService.MediaRouteProviderServiceImplApi30.ClientRecord;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collection;
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteDescriptor.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteDescriptor.java
index 169f863..c6c99afc 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteDescriptor.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteDescriptor.java
@@ -25,11 +25,10 @@
import android.os.Bundle;
import android.text.TextUtils;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -89,7 +88,8 @@
* by the provider.
* </p>
*/
- public @NonNull String getId() {
+ @NonNull
+ public String getId() {
return mBundle.getString(KEY_ID);
}
@@ -101,7 +101,8 @@
* </p>
*/
@RestrictTo(LIBRARY)
- public @NonNull List<String> getGroupMemberIds() {
+ @NonNull
+ public List<String> getGroupMemberIds() {
if (!mBundle.containsKey(KEY_GROUP_MEMBER_IDS)) {
return new ArrayList<>();
}
@@ -115,7 +116,8 @@
* It may be a user-supplied name, an alias, or device serial number.
* </p>
*/
- public @NonNull String getName() {
+ @NonNull
+ public String getName() {
return mBundle.getString(KEY_NAME);
}
@@ -126,7 +128,8 @@
* It may be a user-supplied string, a model number or brand of device.
* </p>
*/
- public @Nullable String getDescription() {
+ @Nullable
+ public String getDescription() {
return mBundle.getString(KEY_DESCRIPTION);
}
@@ -136,7 +139,8 @@
* This icon will be used in picker UIs if available.
* </p>
*/
- public @Nullable Uri getIconUri() {
+ @Nullable
+ public Uri getIconUri() {
String iconUri = mBundle.getString(KEY_ICON_URI);
return iconUri == null ? null : Uri.parse(iconUri);
}
@@ -228,14 +232,16 @@
*
* @return An {@link IntentSender} to start a settings activity.
*/
- public @Nullable IntentSender getSettingsActivity() {
+ @Nullable
+ public IntentSender getSettingsActivity() {
return mBundle.getParcelable(KEY_SETTINGS_INTENT);
}
/**
* Gets the route's {@link MediaControlIntent media control intent} filters.
*/
- public @NonNull List<IntentFilter> getControlFilters() {
+ @NonNull
+ public List<IntentFilter> getControlFilters() {
if (!mBundle.containsKey(KEY_CONTROL_FILTERS)) {
return new ArrayList<>();
}
@@ -302,7 +308,8 @@
* <p>Two routes are considered to come from the same receiver device if any of their respective
* deduplication ids match.
*/
- public @NonNull Set<String> getDeduplicationIds() {
+ @NonNull
+ public Set<String> getDeduplicationIds() {
ArrayList<String> deduplicationIds = mBundle.getStringArrayList(KEY_DEDUPLICATION_IDS);
return deduplicationIds != null
? Collections.unmodifiableSet(new HashSet<>(deduplicationIds))
@@ -322,7 +329,8 @@
* The extras will be ignored by the media router but they may be used
* by applications.
*/
- public @Nullable Bundle getExtras() {
+ @Nullable
+ public Bundle getExtras() {
return mBundle.getBundle(KEY_EXTRAS);
}
@@ -355,7 +363,8 @@
* the route provider's package is allowed to see this route. This applies only when
* {@link #isVisibilityPublic} returns {@code false}.
*/
- public @NonNull Set<String> getAllowedPackages() {
+ @NonNull
+ public Set<String> getAllowedPackages() {
if (!mBundle.containsKey(KEY_ALLOWED_PACKAGES)) {
return new HashSet<>();
}
@@ -374,8 +383,9 @@
return true;
}
+ @NonNull
@Override
- public @NonNull String toString() {
+ public String toString() {
return "MediaRouteDescriptor{ "
+ "id=" + getId()
+ ", groupMemberIds=" + getGroupMemberIds()
@@ -407,7 +417,8 @@
*
* @return The contents of the object represented as a bundle.
*/
- public @NonNull Bundle asBundle() {
+ @NonNull
+ public Bundle asBundle() {
return mBundle;
}
@@ -417,7 +428,8 @@
* @param bundle The bundle, or null if none.
* @return The new instance, or null if the bundle was null.
*/
- public static @Nullable MediaRouteDescriptor fromBundle(@Nullable Bundle bundle) {
+ @Nullable
+ public static MediaRouteDescriptor fromBundle(@Nullable Bundle bundle) {
return bundle != null ? new MediaRouteDescriptor(bundle) : null;
}
@@ -467,7 +479,8 @@
* by the provider.
* </p>
*/
- public @NonNull Builder setId(@NonNull String id) {
+ @NonNull
+ public Builder setId(@NonNull String id) {
if (id == null) {
throw new NullPointerException("id must not be null");
}
@@ -479,7 +492,8 @@
* Clears the group member IDs of the route.
*/
@RestrictTo(LIBRARY)
- public @NonNull Builder clearGroupMemberIds() {
+ @NonNull
+ public Builder clearGroupMemberIds() {
mGroupMemberIds.clear();
return this;
}
@@ -492,7 +506,8 @@
* </p>
*/
@RestrictTo(LIBRARY)
- public @NonNull Builder addGroupMemberId(@NonNull String groupMemberId) {
+ @NonNull
+ public Builder addGroupMemberId(@NonNull String groupMemberId) {
if (TextUtils.isEmpty(groupMemberId)) {
throw new IllegalArgumentException("groupMemberId must not be empty");
}
@@ -511,7 +526,8 @@
* </p>
*/
@RestrictTo(LIBRARY)
- public @NonNull Builder addGroupMemberIds(@NonNull Collection<String> groupMemberIds) {
+ @NonNull
+ public Builder addGroupMemberIds(@NonNull Collection<String> groupMemberIds) {
if (groupMemberIds == null) {
throw new IllegalArgumentException("groupMemberIds must not be null");
}
@@ -532,7 +548,8 @@
* </p>
*/
@RestrictTo(LIBRARY)
- public @NonNull Builder removeGroupMemberId(@NonNull String memberRouteId) {
+ @NonNull
+ public Builder removeGroupMemberId(@NonNull String memberRouteId) {
if (TextUtils.isEmpty(memberRouteId)) {
throw new IllegalArgumentException("memberRouteId must not be empty");
}
@@ -547,7 +564,8 @@
* It may be a user-supplied name, an alias, or device serial number.
* </p>
*/
- public @NonNull Builder setName(@NonNull String name) {
+ @NonNull
+ public Builder setName(@NonNull String name) {
if (name == null) {
throw new NullPointerException("name must not be null");
}
@@ -562,7 +580,8 @@
* It may be a user-supplied string, a model number or brand of device.
* </p>
*/
- public @NonNull Builder setDescription(@Nullable String description) {
+ @NonNull
+ public Builder setDescription(@Nullable String description) {
mBundle.putString(KEY_DESCRIPTION, description);
return this;
}
@@ -581,7 +600,8 @@
* </ul>
* </p>
*/
- public @NonNull Builder setIconUri(@NonNull Uri iconUri) {
+ @NonNull
+ public Builder setIconUri(@NonNull Uri iconUri) {
if (iconUri == null) {
throw new IllegalArgumentException("iconUri must not be null");
}
@@ -596,7 +616,8 @@
* Wifi Display receivers, but that are not currently available for use.
* </p>
*/
- public @NonNull Builder setEnabled(boolean enabled) {
+ @NonNull
+ public Builder setEnabled(boolean enabled) {
mBundle.putBoolean(KEY_ENABLED, enabled);
return this;
}
@@ -607,7 +628,8 @@
* @see MediaRouteDescriptor#isSystemRoute()
*/
@RestrictTo(LIBRARY)
- public @NonNull Builder setIsSystemRoute(boolean isSystemRoute) {
+ @NonNull
+ public Builder setIsSystemRoute(boolean isSystemRoute) {
mBundle.putBoolean(KEY_IS_SYSTEM_ROUTE, isSystemRoute);
return this;
}
@@ -616,7 +638,8 @@
* Sets whether the route is a dynamic group route.
* @see #isDynamicGroupRoute()
*/
- public @NonNull Builder setIsDynamicGroupRoute(boolean isDynamicGroupRoute) {
+ @NonNull
+ public Builder setIsDynamicGroupRoute(boolean isDynamicGroupRoute) {
mBundle.putBoolean(IS_DYNAMIC_GROUP_ROUTE, isDynamicGroupRoute);
return this;
}
@@ -627,7 +650,8 @@
* @deprecated Use {@link #setConnectionState} instead.
*/
@Deprecated
- public @NonNull Builder setConnecting(boolean connecting) {
+ @NonNull
+ public Builder setConnecting(boolean connecting) {
mBundle.putBoolean(KEY_CONNECTING, connecting);
return this;
}
@@ -640,7 +664,8 @@
* {@link MediaRouter.RouteInfo#CONNECTION_STATE_CONNECTING}, or
* {@link MediaRouter.RouteInfo#CONNECTION_STATE_CONNECTED}.
*/
- public @NonNull Builder setConnectionState(int connectionState) {
+ @NonNull
+ public Builder setConnectionState(int connectionState) {
mBundle.putInt(KEY_CONNECTION_STATE, connectionState);
return this;
}
@@ -648,7 +673,8 @@
/**
* Sets whether the route can be disconnected without stopping playback.
*/
- public @NonNull Builder setCanDisconnect(boolean canDisconnect) {
+ @NonNull
+ public Builder setCanDisconnect(boolean canDisconnect) {
mBundle.putBoolean(KEY_CAN_DISCONNECT, canDisconnect);
return this;
}
@@ -657,7 +683,8 @@
* Sets an intent sender for launching the settings activity for this
* route.
*/
- public @NonNull Builder setSettingsActivity(@Nullable IntentSender is) {
+ @NonNull
+ public Builder setSettingsActivity(@Nullable IntentSender is) {
mBundle.putParcelable(KEY_SETTINGS_INTENT, is);
return this;
}
@@ -665,7 +692,8 @@
/**
* Clears {@link MediaControlIntent media control intent} filters for the route.
*/
- public @NonNull Builder clearControlFilters() {
+ @NonNull
+ public Builder clearControlFilters() {
mControlFilters.clear();
return this;
}
@@ -673,7 +701,8 @@
/**
* Adds a {@link MediaControlIntent media control intent} filter for the route.
*/
- public @NonNull Builder addControlFilter(@NonNull IntentFilter filter) {
+ @NonNull
+ public Builder addControlFilter(@NonNull IntentFilter filter) {
if (filter == null) {
throw new IllegalArgumentException("filter must not be null");
}
@@ -687,7 +716,8 @@
/**
* Adds a list of {@link MediaControlIntent media control intent} filters for the route.
*/
- public @NonNull Builder addControlFilters(@NonNull Collection<IntentFilter> filters) {
+ @NonNull
+ public Builder addControlFilters(@NonNull Collection<IntentFilter> filters) {
if (filters == null) {
throw new IllegalArgumentException("filters must not be null");
}
@@ -709,7 +739,8 @@
* {@link MediaRouter.RouteInfo#PLAYBACK_TYPE_LOCAL} or
* {@link MediaRouter.RouteInfo#PLAYBACK_TYPE_REMOTE}.
*/
- public @NonNull Builder setPlaybackType(int playbackType) {
+ @NonNull
+ public Builder setPlaybackType(int playbackType) {
mBundle.putInt(KEY_PLAYBACK_TYPE, playbackType);
return this;
}
@@ -717,7 +748,8 @@
/**
* Sets the route's playback stream.
*/
- public @NonNull Builder setPlaybackStream(int playbackStream) {
+ @NonNull
+ public Builder setPlaybackStream(int playbackStream) {
mBundle.putInt(KEY_PLAYBACK_STREAM, playbackStream);
return this;
}
@@ -727,7 +759,8 @@
*
* @param deviceType The type of the receiver device.
*/
- public @NonNull Builder setDeviceType(@MediaRouter.RouteInfo.DeviceType int deviceType) {
+ @NonNull
+ public Builder setDeviceType(@MediaRouter.RouteInfo.DeviceType int deviceType) {
mBundle.putInt(KEY_DEVICE_TYPE, deviceType);
return this;
}
@@ -735,7 +768,8 @@
/**
* Sets the route's current volume, or 0 if unknown.
*/
- public @NonNull Builder setVolume(int volume) {
+ @NonNull
+ public Builder setVolume(int volume) {
mBundle.putInt(KEY_VOLUME, volume);
return this;
}
@@ -743,7 +777,8 @@
/**
* Sets the route's maximum volume, or 0 if unknown.
*/
- public @NonNull Builder setVolumeMax(int volumeMax) {
+ @NonNull
+ public Builder setVolumeMax(int volumeMax) {
mBundle.putInt(KEY_VOLUME_MAX, volumeMax);
return this;
}
@@ -755,7 +790,8 @@
* {@link MediaRouter.RouteInfo#PLAYBACK_VOLUME_FIXED} or
* {@link MediaRouter.RouteInfo#PLAYBACK_VOLUME_VARIABLE}.
*/
- public @NonNull Builder setVolumeHandling(int volumeHandling) {
+ @NonNull
+ public Builder setVolumeHandling(int volumeHandling) {
mBundle.putInt(KEY_VOLUME_HANDLING, volumeHandling);
return this;
}
@@ -769,7 +805,8 @@
* @param deduplicationIds A set of strings that uniquely identify the receiver device that
* backs this route.
*/
- public @NonNull Builder setDeduplicationIds(@NonNull Set<String> deduplicationIds) {
+ @NonNull
+ public Builder setDeduplicationIds(@NonNull Set<String> deduplicationIds) {
mBundle.putStringArrayList(KEY_DEDUPLICATION_IDS, new ArrayList<>(deduplicationIds));
return this;
}
@@ -777,7 +814,8 @@
/**
* Sets the route's presentation display id, or -1 if none.
*/
- public @NonNull Builder setPresentationDisplayId(int presentationDisplayId) {
+ @NonNull
+ public Builder setPresentationDisplayId(int presentationDisplayId) {
mBundle.putInt(KEY_PRESENTATION_DISPLAY_ID, presentationDisplayId);
return this;
}
@@ -787,7 +825,8 @@
* The extras will be ignored by the media router but they may be used
* by applications.
*/
- public @NonNull Builder setExtras(@Nullable Bundle extras) {
+ @NonNull
+ public Builder setExtras(@Nullable Bundle extras) {
if (extras == null) {
mBundle.putBundle(KEY_EXTRAS, null);
} else {
@@ -801,7 +840,8 @@
* A router whose version is lower than this will not be able to connect to this route.
*/
@RestrictTo(LIBRARY)
- public @NonNull Builder setMinClientVersion(int minVersion) {
+ @NonNull
+ public Builder setMinClientVersion(int minVersion) {
mBundle.putInt(KEY_MIN_CLIENT_VERSION, minVersion);
return this;
}
@@ -811,7 +851,8 @@
* A router whose version is higher than this will not be able to connect to this route.
*/
@RestrictTo(LIBRARY)
- public @NonNull Builder setMaxClientVersion(int maxVersion) {
+ @NonNull
+ public Builder setMaxClientVersion(int maxVersion) {
mBundle.putInt(KEY_MAX_CLIENT_VERSION, maxVersion);
return this;
}
@@ -828,8 +869,9 @@
* <p>Calls to this method override previous calls to {@link #setVisibilityPublic} and
* {@link #setVisibilityRestricted}.
*/
+ @NonNull
@SuppressLint({"MissingGetterMatchingBuilder"})
- public @NonNull Builder setVisibilityPublic() {
+ public Builder setVisibilityPublic() {
mBundle.putBoolean(KEY_IS_VISIBILITY_PUBLIC, true);
mAllowedPackages.clear();
return this;
@@ -848,8 +890,9 @@
* @see #setVisibilityPublic
* @param allowedPackages set of package names which are allowed to see this route.
*/
+ @NonNull
@SuppressLint({"MissingGetterMatchingBuilder"})
- public @NonNull Builder setVisibilityRestricted(@NonNull Set<String> allowedPackages) {
+ public Builder setVisibilityRestricted(@NonNull Set<String> allowedPackages) {
mBundle.putBoolean(KEY_IS_VISIBILITY_PUBLIC, false);
mAllowedPackages = new HashSet<>(allowedPackages);
return this;
@@ -858,7 +901,8 @@
/**
* Builds the {@link MediaRouteDescriptor media route descriptor}.
*/
- public @NonNull MediaRouteDescriptor build() {
+ @NonNull
+ public MediaRouteDescriptor build() {
mBundle.putParcelableArrayList(KEY_CONTROL_FILTERS, new ArrayList<>(mControlFilters));
mBundle.putStringArrayList(KEY_GROUP_MEMBER_IDS, new ArrayList<>(mGroupMemberIds));
mBundle.putStringArrayList(KEY_ALLOWED_PACKAGES, new ArrayList<>(mAllowedPackages));
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteDiscoveryRequest.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteDiscoveryRequest.java
index 91a2bb2..c0188ab 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteDiscoveryRequest.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteDiscoveryRequest.java
@@ -17,8 +17,8 @@
import android.os.Bundle;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
/**
* Describes the kinds of routes that the media router would like to discover
@@ -58,7 +58,8 @@
/**
* Gets the route selector that specifies the kinds of routes to discover.
*/
- public @NonNull MediaRouteSelector getSelector() {
+ @NonNull
+ public MediaRouteSelector getSelector() {
ensureSelector();
return mSelector;
}
@@ -104,8 +105,9 @@
return getSelector().hashCode() ^ (isActiveScan() ? 1 : 0);
}
+ @NonNull
@Override
- public @NonNull String toString() {
+ public String toString() {
return "DiscoveryRequest{ selector=" + getSelector()
+ ", activeScan=" + isActiveScan()
+ ", isValid=" + isValid()
@@ -117,7 +119,8 @@
*
* @return The contents of the object represented as a bundle.
*/
- public @NonNull Bundle asBundle() {
+ @NonNull
+ public Bundle asBundle() {
return mBundle;
}
@@ -127,7 +130,8 @@
* @param bundle The bundle, or null if none.
* @return The new instance, or null if the bundle was null.
*/
- public static @Nullable MediaRouteDiscoveryRequest fromBundle(@Nullable Bundle bundle) {
+ @Nullable
+ public static MediaRouteDiscoveryRequest fromBundle(@Nullable Bundle bundle) {
return bundle != null ? new MediaRouteDiscoveryRequest(bundle) : null;
}
}
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProvider.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProvider.java
index a814852..174169b 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProvider.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProvider.java
@@ -27,13 +27,12 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.core.util.ObjectsCompat;
import androidx.mediarouter.media.MediaRouter.ControlRequestCallback;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
@@ -117,21 +116,24 @@
/**
* Gets the context of the media route provider.
*/
- public final @NonNull Context getContext() {
+ @NonNull
+ public final Context getContext() {
return mContext;
}
/**
* Gets the provider's handler which is associated with the main thread.
*/
- public final @NonNull Handler getHandler() {
+ @NonNull
+ public final Handler getHandler() {
return mHandler;
}
/**
* Gets some metadata about the provider's implementation.
*/
- public final @NonNull ProviderMetadata getMetadata() {
+ @NonNull
+ public final ProviderMetadata getMetadata() {
return mMetadata;
}
@@ -153,7 +155,8 @@
*
* @see #onDiscoveryRequestChanged
*/
- public final @Nullable MediaRouteDiscoveryRequest getDiscoveryRequest() {
+ @Nullable
+ public final MediaRouteDiscoveryRequest getDiscoveryRequest() {
return mDiscoveryRequest;
}
@@ -226,7 +229,8 @@
*
* @see Callback#onDescriptorChanged
*/
- public final @Nullable MediaRouteProviderDescriptor getDescriptor() {
+ @Nullable
+ public final MediaRouteProviderDescriptor getDescriptor() {
return mDescriptor;
}
@@ -272,7 +276,8 @@
* @return The route controller. Returns null if there is no such route or if the route
* cannot be controlled using the route controller interface.
*/
- public @Nullable RouteController onCreateRouteController(@NonNull String routeId) {
+ @Nullable
+ public RouteController onCreateRouteController(@NonNull String routeId) {
if (routeId == null) {
throw new IllegalArgumentException("routeId cannot be null");
}
@@ -293,7 +298,8 @@
* cannot be controlled using the route controller interface.
*/
@RestrictTo(LIBRARY)
- public @Nullable RouteController onCreateRouteController(@NonNull String routeId,
+ @Nullable
+ public RouteController onCreateRouteController(@NonNull String routeId,
@NonNull String routeGroupId) {
if (routeId == null) {
throw new IllegalArgumentException("routeId cannot be null");
@@ -315,7 +321,8 @@
* @return {@link DynamicGroupRouteController}. Returns null if there is no such route or if the
* route cannot be controlled using the {@link DynamicGroupRouteController} interface.
*/
- public @Nullable DynamicGroupRouteController onCreateDynamicGroupRouteController(
+ @Nullable
+ public DynamicGroupRouteController onCreateDynamicGroupRouteController(
@NonNull String initialMemberRouteId,
@NonNull RouteControllerOptions routeControllerOptions) {
return onCreateDynamicGroupRouteController(initialMemberRouteId);
@@ -334,7 +341,8 @@
* @return {@link DynamicGroupRouteController}. Returns null if there is no such route or if the
* route cannot be controlled using the {@link DynamicGroupRouteController} interface.
*/
- public @Nullable DynamicGroupRouteController onCreateDynamicGroupRouteController(
+ @Nullable
+ public DynamicGroupRouteController onCreateDynamicGroupRouteController(
@NonNull String initialMemberRouteId) {
if (initialMemberRouteId == null) {
throw new IllegalArgumentException("initialMemberRouteId cannot be null.");
@@ -361,19 +369,22 @@
/**
* Gets the provider's package name.
*/
- public @NonNull String getPackageName() {
+ @NonNull
+ public String getPackageName() {
return mComponentName.getPackageName();
}
/**
* Gets the provider's component name.
*/
- public @NonNull ComponentName getComponentName() {
+ @NonNull
+ public ComponentName getComponentName() {
return mComponentName;
}
+ @NonNull
@Override
- public @NonNull String toString() {
+ public String toString() {
return "ProviderMetadata{ componentName="
+ mComponentName.flattenToShortString() + " }";
}
@@ -497,7 +508,8 @@
* It is provided by {@link MediaRouteProvider}.
* e.g. "Add a device."
*/
- public @Nullable String getGroupableSelectionTitle() {
+ @Nullable
+ public String getGroupableSelectionTitle() {
return null;
}
@@ -507,7 +519,8 @@
* {@link MediaRouteProvider}.
* e.g. "Play on group."
*/
- public @Nullable String getTransferableSectionTitle() {
+ @Nullable
+ public String getTransferableSectionTitle() {
return null;
}
@@ -568,7 +581,7 @@
*/
@Deprecated
public final void notifyDynamicRoutesChanged(
- final @NonNull Collection<DynamicRouteDescriptor> routes) {
+ @NonNull final Collection<DynamicRouteDescriptor> routes) {
if (routes == null) {
throw new NullPointerException("routes must not be null");
}
@@ -733,7 +746,8 @@
/**
* Gets this route's {@link MediaRouteDescriptor}. i.e. which route this info is for.
*/
- public @NonNull MediaRouteDescriptor getRouteDescriptor() {
+ @NonNull
+ public MediaRouteDescriptor getRouteDescriptor() {
return mMediaRouteDescriptor;
}
@@ -843,7 +857,8 @@
/**
* Sets the selection state of this route within the associated dynamic group route.
*/
- public @NonNull Builder setSelectionState(@SelectionState int state) {
+ @NonNull
+ public Builder setSelectionState(@SelectionState int state) {
mSelectionState = state;
return this;
}
@@ -851,7 +866,8 @@
/**
* Sets if this route can be unselected.
*/
- public @NonNull Builder setIsUnselectable(boolean value) {
+ @NonNull
+ public Builder setIsUnselectable(boolean value) {
mIsUnselectable = value;
return this;
}
@@ -860,7 +876,8 @@
* Sets if this route can be a selected as a member of the associated dynamic
* group route.
*/
- public @NonNull Builder setIsGroupable(boolean value) {
+ @NonNull
+ public Builder setIsGroupable(boolean value) {
mIsGroupable = value;
return this;
}
@@ -868,7 +885,8 @@
/**
* Sets if the associated dynamic group route can be transferred to this route.
*/
- public @NonNull Builder setIsTransferable(boolean value) {
+ @NonNull
+ public Builder setIsTransferable(boolean value) {
mIsTransferable = value;
return this;
}
@@ -876,7 +894,8 @@
/**
* Builds the {@link DynamicRouteDescriptor}.
*/
- public @NonNull DynamicRouteDescriptor build() {
+ @NonNull
+ public DynamicRouteDescriptor build() {
return new DynamicRouteDescriptor(
mRouteDescriptor, mSelectionState, mIsUnselectable, mIsGroupable,
mIsTransferable);
@@ -906,7 +925,8 @@
return mBundle;
}
- public @NonNull Bundle getControlHints() {
+ @NonNull
+ public Bundle getControlHints() {
return mControlHints;
}
@@ -915,13 +935,15 @@
private final Bundle mBundle = new Bundle();
/** Sets controlHints passed by the client application. */
- public @NonNull Builder setControlHints(@Nullable Bundle controlHints) {
+ @NonNull
+ public Builder setControlHints(@Nullable Bundle controlHints) {
mBundle.putParcelable(KEY_CONTROL_HINTS, controlHints);
return this;
}
/** Builds the {@link RouteControllerOptions}. */
- public @NonNull RouteControllerOptions build() {
+ @NonNull
+ public RouteControllerOptions build() {
return new RouteControllerOptions(mBundle);
}
}
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProviderDescriptor.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProviderDescriptor.java
index 6c810cd..ee1b64a 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProviderDescriptor.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProviderDescriptor.java
@@ -17,8 +17,8 @@
import android.os.Bundle;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
@@ -58,7 +58,8 @@
* If it doesn't have any routes, it returns an empty list.
* </p>
*/
- public @NonNull List<MediaRouteDescriptor> getRoutes() {
+ @NonNull
+ public List<MediaRouteDescriptor> getRoutes() {
return mRoutes;
}
@@ -90,8 +91,9 @@
return mSupportsDynamicGroupRoute;
}
+ @NonNull
@Override
- public @NonNull String toString() {
+ public String toString() {
return "MediaRouteProviderDescriptor{ "
+ "routes="
+ Arrays.toString(getRoutes().toArray())
@@ -104,7 +106,8 @@
*
* @return The contents of the object represented as a bundle.
*/
- public @NonNull Bundle asBundle() {
+ @NonNull
+ public Bundle asBundle() {
if (mBundle != null) {
return mBundle;
}
@@ -127,7 +130,8 @@
* @param bundle The bundle, or null if none.
* @return The new instance, or null if the bundle was null.
*/
- public static @Nullable MediaRouteProviderDescriptor fromBundle(@Nullable Bundle bundle) {
+ @Nullable
+ public static MediaRouteProviderDescriptor fromBundle(@Nullable Bundle bundle) {
if (bundle == null) {
return null;
}
@@ -171,7 +175,8 @@
/**
* Adds a route.
*/
- public @NonNull Builder addRoute(@NonNull MediaRouteDescriptor route) {
+ @NonNull
+ public Builder addRoute(@NonNull MediaRouteDescriptor route) {
if (route == null) {
throw new IllegalArgumentException("route must not be null");
}
@@ -186,7 +191,8 @@
/**
* Adds a list of routes.
*/
- public @NonNull Builder addRoutes(@NonNull Collection<MediaRouteDescriptor> routes) {
+ @NonNull
+ public Builder addRoutes(@NonNull Collection<MediaRouteDescriptor> routes) {
if (routes == null) {
throw new IllegalArgumentException("routes must not be null");
}
@@ -202,7 +208,8 @@
/**
* Sets the list of routes.
*/
- @NonNull Builder setRoutes(@Nullable Collection<MediaRouteDescriptor> routes) {
+ @NonNull
+ Builder setRoutes(@Nullable Collection<MediaRouteDescriptor> routes) {
mRoutes.clear();
if (routes != null) {
mRoutes.addAll(routes);
@@ -213,7 +220,8 @@
/**
* Sets if this provider supports dynamic group route.
*/
- public @NonNull Builder setSupportsDynamicGroupRoute(boolean value) {
+ @NonNull
+ public Builder setSupportsDynamicGroupRoute(boolean value) {
mSupportsDynamicGroupRoute = value;
return this;
}
@@ -222,7 +230,8 @@
/**
* Builds the {@link MediaRouteProviderDescriptor}.
*/
- public @NonNull MediaRouteProviderDescriptor build() {
+ @NonNull
+ public MediaRouteProviderDescriptor build() {
return new MediaRouteProviderDescriptor(mRoutes, mSupportsDynamicGroupRoute);
}
}
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProviderService.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProviderService.java
index a87d143..eac2b09 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProviderService.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteProviderService.java
@@ -74,6 +74,8 @@
import android.util.Log;
import android.util.SparseArray;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.annotation.VisibleForTesting;
import androidx.collection.ArrayMap;
@@ -86,9 +88,6 @@
import androidx.mediarouter.media.MediaRouteProvider.RouteController;
import androidx.mediarouter.media.MediaRouteProvider.RouteControllerOptions;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collection;
@@ -217,7 +216,7 @@
* @param listener a @code{@link Consumer} that takes a list of {@link ClientInfo}
*/
public void addClientInfoListener(
- /* @CallbackExecutor */ @NonNull Executor listenerExecutor,
+ @NonNull /* @CallbackExecutor */ Executor listenerExecutor,
@NonNull Consumer<List<ClientInfo>> listener) {
mImpl.addClientInfoListener(listenerExecutor, listener);
}
@@ -238,10 +237,12 @@
* @return The media route provider offered by this service, or null if
* this service has decided not to offer a media route provider.
*/
- public abstract @Nullable MediaRouteProvider onCreateMediaRouteProvider();
+ @Nullable
+ public abstract MediaRouteProvider onCreateMediaRouteProvider();
@Override
- public @Nullable IBinder onBind(@NonNull Intent intent) {
+ @Nullable
+ public IBinder onBind(@NonNull Intent intent) {
return mImpl.onBind(intent);
}
@@ -259,7 +260,8 @@
*
* @see #onCreateMediaRouteProvider()
*/
- public @Nullable MediaRouteProvider getMediaRouteProvider() {
+ @Nullable
+ public MediaRouteProvider getMediaRouteProvider() {
return mProvider;
}
@@ -362,7 +364,8 @@
*
* @return The package name of the client
*/
- public @NonNull String getPackageName() {
+ @NonNull
+ public String getPackageName() {
return packageName;
}
@@ -375,7 +378,8 @@
}
/** Builds and returns the {@link ClientInfo} object. */
- public @NonNull ClientInfo build() {
+ @NonNull
+ public ClientInfo build() {
return new ClientInfo(packageName);
}
}
@@ -577,7 +581,8 @@
MediaRouteDiscoveryRequest mCompositeDiscoveryRequest;
MediaRouteDiscoveryRequest mBaseDiscoveryRequest;
long mBaseDiscoveryRequestTimestamp;
- private final @Nullable Map<Consumer<List<ClientInfo>>, Executor> mClientInfoListeners =
+ @Nullable
+ private final Map<Consumer<List<ClientInfo>>, Executor> mClientInfoListeners =
new HashMap<>();
private final Object mClientInfoListenersLock = new Object();
private final MediaRouterActiveScanThrottlingHelper mActiveScanThrottlingHelper =
@@ -1170,8 +1175,9 @@
.obtainMessage(PRIVATE_MSG_CLIENT_DIED, mMessenger).sendToTarget();
}
+ @NonNull
@Override
- public @NonNull String toString() {
+ public String toString() {
return getClientId(mMessenger);
}
@@ -1222,7 +1228,7 @@
@Override
public void addClientInfoListener (
- /* @CallbackExecutor */ @NonNull Executor listenerExecutor,
+ @NonNull /* @CallbackExecutor */ Executor listenerExecutor,
@NonNull Consumer<List<ClientInfo>> listener) {
synchronized (mClientInfoListenersLock) {
mClientInfoListeners.put(listener, listenerExecutor);
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteSelector.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteSelector.java
index 965dd2f..bc78b74 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteSelector.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouteSelector.java
@@ -18,8 +18,8 @@
import android.content.IntentFilter;
import android.os.Bundle;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
@@ -65,7 +65,8 @@
*
* @return The list of categories.
*/
- public @NonNull List<String> getControlCategories() {
+ @NonNull
+ public List<String> getControlCategories() {
ensureControlCategories();
return new ArrayList<>(mControlCategories);
}
@@ -179,8 +180,9 @@
return mControlCategories.hashCode();
}
+ @NonNull
@Override
- public @NonNull String toString() {
+ public String toString() {
return "MediaRouteSelector{ "
+ "controlCategories="
+ Arrays.toString(getControlCategories().toArray())
@@ -192,7 +194,8 @@
*
* @return The contents of the object represented as a bundle.
*/
- public @NonNull Bundle asBundle() {
+ @NonNull
+ public Bundle asBundle() {
return mBundle;
}
@@ -202,7 +205,8 @@
* @param bundle The bundle, or null if none.
* @return The new instance, or null if the bundle was null.
*/
- public static @Nullable MediaRouteSelector fromBundle(@Nullable Bundle bundle) {
+ @Nullable
+ public static MediaRouteSelector fromBundle(@Nullable Bundle bundle) {
return bundle != null ? new MediaRouteSelector(bundle, null) : null;
}
@@ -240,7 +244,8 @@
* {@link MediaControlIntent#CATEGORY_LIVE_AUDIO}.
* @return The builder instance for chaining.
*/
- public @NonNull Builder addControlCategory(@NonNull String category) {
+ @NonNull
+ public Builder addControlCategory(@NonNull String category) {
if (category == null) {
throw new IllegalArgumentException("category must not be null");
}
@@ -261,7 +266,8 @@
* such as {@link MediaControlIntent#CATEGORY_LIVE_AUDIO}.
* @return The builder instance for chaining.
*/
- public @NonNull Builder addControlCategories(@NonNull Collection<String> categories) {
+ @NonNull
+ public Builder addControlCategories(@NonNull Collection<String> categories) {
if (categories == null) {
throw new IllegalArgumentException("categories must not be null");
}
@@ -280,7 +286,8 @@
* @param selector The media route selector whose contents are to be added.
* @return The builder instance for chaining.
*/
- public @NonNull Builder addSelector(@NonNull MediaRouteSelector selector) {
+ @NonNull
+ public Builder addSelector(@NonNull MediaRouteSelector selector) {
if (selector == null) {
throw new IllegalArgumentException("selector must not be null");
}
@@ -292,7 +299,8 @@
/**
* Builds the {@link MediaRouteSelector media route selector}.
*/
- public @NonNull MediaRouteSelector build() {
+ @NonNull
+ public MediaRouteSelector build() {
if (mControlCategories == null) {
return EMPTY;
}
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java
index 09acc6d..f4b39f0 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter.java
@@ -38,6 +38,8 @@
import androidx.annotation.IntDef;
import androidx.annotation.MainThread;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.collection.ArrayMap;
import androidx.core.util.ObjectsCompat;
@@ -49,9 +51,6 @@
import com.google.common.util.concurrent.ListenableFuture;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.ref.WeakReference;
@@ -270,7 +269,8 @@
* a strong reference to this object as long as it is in use.
*/
@MainThread
- public static @NonNull MediaRouter getInstance(@NonNull Context context) {
+ @NonNull
+ public static MediaRouter getInstance(@NonNull Context context) {
if (context == null) {
throw new IllegalArgumentException("context must not be null");
}
@@ -311,7 +311,8 @@
/** Gets the initialized global router. */
@RestrictTo(LIBRARY_GROUP)
- static @NonNull GlobalMediaRouter getGlobalRouter() {
+ @NonNull
+ static GlobalMediaRouter getGlobalRouter() {
if (sGlobal == null) {
throw new IllegalStateException(
"getGlobalRouter cannot be called when sGlobal is " + "null");
@@ -326,7 +327,8 @@
* <p>Must be called on the main thread.
*/
@MainThread
- public @NonNull List<RouteInfo> getRoutes() {
+ @NonNull
+ public List<RouteInfo> getRoutes() {
checkCallingThread();
return getGlobalRouter().getRoutes();
}
@@ -338,7 +340,8 @@
* <p>Must be called on the main thread.
*/
@MainThread
- public @NonNull List<ProviderInfo> getProviders() {
+ @NonNull
+ public List<ProviderInfo> getProviders() {
checkCallingThread();
return getGlobalRouter().getProviders();
}
@@ -354,7 +357,8 @@
* @return The default route, which is guaranteed to never be null.
*/
@MainThread
- public @NonNull RouteInfo getDefaultRoute() {
+ @NonNull
+ public RouteInfo getDefaultRoute() {
checkCallingThread();
return getGlobalRouter().getDefaultRoute();
}
@@ -367,7 +371,8 @@
* @return A bluetooth route, if exist, otherwise null.
*/
@MainThread
- public @Nullable RouteInfo getBluetoothRoute() {
+ @Nullable
+ public RouteInfo getBluetoothRoute() {
checkCallingThread();
return getGlobalRouter().getBluetoothRoute();
}
@@ -419,7 +424,8 @@
* @see RouteInfo#supportsControlRequest
*/
@MainThread
- public @NonNull RouteInfo getSelectedRoute() {
+ @NonNull
+ public RouteInfo getSelectedRoute() {
checkCallingThread();
return getGlobalRouter().getSelectedRoute();
}
@@ -438,7 +444,8 @@
* @see RouteInfo#matchesSelector
*/
@MainThread
- public @NonNull RouteInfo updateSelectedRoute(@NonNull MediaRouteSelector selector) {
+ @NonNull
+ public RouteInfo updateSelectedRoute(@NonNull MediaRouteSelector selector) {
if (selector == null) {
throw new IllegalArgumentException("selector must not be null");
}
@@ -933,7 +940,8 @@
getGlobalRouter().setMediaSessionCompat(mediaSession);
}
- public MediaSessionCompat.@Nullable Token getMediaSessionToken() {
+ @Nullable
+ public MediaSessionCompat.Token getMediaSessionToken() {
return sGlobal == null ? null : sGlobal.getMediaSessionToken();
// Use sGlobal exceptionally due to unchecked thread.
}
@@ -945,7 +953,8 @@
* <p>Must be called on the main thread.
*/
@MainThread
- public @Nullable MediaRouterParams getRouterParams() {
+ @Nullable
+ public MediaRouterParams getRouterParams() {
checkCallingThread();
return getGlobalRouter().getRouterParams();
}
@@ -1424,7 +1433,8 @@
/**
* Gets information about the provider of this media route.
*/
- public @NonNull ProviderInfo getProvider() {
+ @NonNull
+ public ProviderInfo getProvider() {
return mProvider;
}
@@ -1438,7 +1448,8 @@
*
* @return The unique id of the route, never null.
*/
- public @NonNull String getId() {
+ @NonNull
+ public String getId() {
return mUniqueId;
}
@@ -1452,7 +1463,8 @@
* @return The user-visible name of a media route. This is the string presented
* to users who may select this as the active route.
*/
- public @NonNull String getName() {
+ @NonNull
+ public String getName() {
return mName;
}
@@ -1465,7 +1477,8 @@
*
* @return The description of the route, or null if none.
*/
- public @Nullable String getDescription() {
+ @Nullable
+ public String getDescription() {
return mDescription;
}
@@ -1477,7 +1490,8 @@
*
* @return The URI of the icon representing this route, or null if none.
*/
- public @Nullable Uri getIconUri() {
+ @Nullable
+ public Uri getIconUri() {
return mIconUri;
}
@@ -1596,7 +1610,8 @@
* @see #supportsControlCategory
* @see #supportsControlRequest
*/
- public @NonNull List<IntentFilter> getControlFilters() {
+ @NonNull
+ public List<IntentFilter> getControlFilters() {
return mControlFilters;
}
@@ -1916,7 +1931,8 @@
* @see android.app.Presentation
*/
@MainThread
- public @Nullable Display getPresentationDisplay() {
+ @Nullable
+ public Display getPresentationDisplay() {
checkCallingThread();
if (mPresentationDisplayId >= 0 && mPresentationDisplay == null) {
mPresentationDisplay = getGlobalRouter().getDisplay(mPresentationDisplayId);
@@ -1936,7 +1952,8 @@
* Gets a collection of extra properties about this route that were supplied
* by its media route provider, or null if none.
*/
- public @Nullable Bundle getExtras() {
+ @Nullable
+ public Bundle getExtras() {
return mExtras;
}
@@ -1944,7 +1961,8 @@
* Gets an intent sender for launching a settings activity for this
* route.
*/
- public @Nullable IntentSender getSettingsIntent() {
+ @Nullable
+ public IntentSender getSettingsIntent() {
return mSettingsIntent;
}
@@ -1983,7 +2001,8 @@
* Gets the dynamic group state of the given route.
*/
@RestrictTo(LIBRARY)
- public @Nullable DynamicGroupState getDynamicGroupState(@NonNull RouteInfo route) {
+ @Nullable
+ public DynamicGroupState getDynamicGroupState(@NonNull RouteInfo route) {
if (route == null) {
throw new NullPointerException("route must not be null");
}
@@ -2000,7 +2019,8 @@
* @return The list of the routes in this group
*/
@RestrictTo(LIBRARY)
- public @NonNull List<RouteInfo> getMemberRoutes() {
+ @NonNull
+ public List<RouteInfo> getMemberRoutes() {
return Collections.unmodifiableList(mMemberRoutes);
}
@@ -2009,7 +2029,8 @@
*/
@MainThread
@RestrictTo(LIBRARY)
- public @Nullable DynamicGroupRouteController getDynamicGroupController() {
+ @Nullable
+ public DynamicGroupRouteController getDynamicGroupController() {
checkCallingThread();
//TODO: handle multiple controllers case
RouteController controller = getGlobalRouter().mSelectedRouteController;
@@ -2020,7 +2041,8 @@
}
@Override
- public @NonNull String toString() {
+ @NonNull
+ public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("MediaRouter.RouteInfo{ uniqueId=").append(mUniqueId)
@@ -2219,7 +2241,8 @@
}
@RestrictTo(LIBRARY)
- public @NonNull MediaRouteProvider getProviderInstance() {
+ @NonNull
+ public MediaRouteProvider getProviderInstance() {
return mProvider.getProviderInstance();
}
@@ -2321,8 +2344,9 @@
*
* <p>Must be called on the main thread.
*/
+ @NonNull
@MainThread
- public @NonNull MediaRouteProvider getProviderInstance() {
+ public MediaRouteProvider getProviderInstance() {
checkCallingThread();
return mProviderInstance;
}
@@ -2330,14 +2354,16 @@
/**
* Gets the package name of the media route provider.
*/
- public @NonNull String getPackageName() {
+ @NonNull
+ public String getPackageName() {
return mMetadata.getPackageName();
}
/**
* Gets the component name of the media route provider.
*/
- public @NonNull ComponentName getComponentName() {
+ @NonNull
+ public ComponentName getComponentName() {
return mMetadata.getComponentName();
}
@@ -2347,7 +2373,8 @@
* <p>Must be called on the main thread.
*/
@MainThread
- public @NonNull List<RouteInfo> getRoutes() {
+ @NonNull
+ public List<RouteInfo> getRoutes() {
checkCallingThread();
return Collections.unmodifiableList(mRoutes);
}
@@ -2383,8 +2410,9 @@
return mDescriptor != null && mDescriptor.supportsDynamicGroupRoute();
}
+ @NonNull
@Override
- public @NonNull String toString() {
+ public String toString() {
return "MediaRouter.RouteProviderInfo{ packageName=" + getPackageName() + " }";
}
}
@@ -2592,7 +2620,8 @@
* previous route.
*/
@MainThread
- @Nullable ListenableFuture<Void> onPrepareTransfer(
+ @Nullable
+ ListenableFuture<Void> onPrepareTransfer(
@NonNull RouteInfo fromRoute, @NonNull RouteInfo toRoute);
}
@@ -2668,7 +2697,8 @@
private final RouteInfo mFromRoute;
final RouteInfo mToRoute;
private final RouteInfo mRequestedRoute;
- final @Nullable List<DynamicRouteDescriptor> mMemberRoutes;
+ @Nullable
+ final List<DynamicRouteDescriptor> mMemberRoutes;
private final WeakReference<GlobalMediaRouter> mRouter;
private ListenableFuture<Void> mFuture = null;
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter2Utils.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter2Utils.java
index 9d7f60b..40c5b79 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter2Utils.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouter2Utils.java
@@ -73,13 +73,12 @@
import android.text.TextUtils;
import android.util.ArraySet;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.OptIn;
import androidx.annotation.RequiresApi;
import androidx.mediarouter.media.MediaRouter.RouteInfo;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
@@ -119,8 +118,8 @@
private MediaRouter2Utils() {}
@OptIn(markerClass = androidx.core.os.BuildCompat.PrereleaseSdkCheck.class)
- public static @Nullable MediaRoute2Info toFwkMediaRoute2Info(
- @Nullable MediaRouteDescriptor descriptor) {
+ @Nullable
+ public static MediaRoute2Info toFwkMediaRoute2Info(@Nullable MediaRouteDescriptor descriptor) {
if (descriptor == null) {
return null;
} else if (TextUtils.isEmpty(descriptor.getId())
@@ -179,7 +178,8 @@
return builder.build();
}
- public static @Nullable MediaRouteDescriptor toMediaRouteDescriptor(
+ @Nullable
+ public static MediaRouteDescriptor toMediaRouteDescriptor(
@Nullable MediaRoute2Info fwkMediaRoute2Info) {
if (fwkMediaRoute2Info == null) {
return null;
@@ -250,7 +250,8 @@
return features;
}
- static @NonNull List<IntentFilter> toControlFilters(@Nullable Collection<String> features) {
+ @NonNull
+ static List<IntentFilter> toControlFilters(@Nullable Collection<String> features) {
if (features == null) {
return new ArrayList<>();
}
@@ -276,7 +277,8 @@
return controlFilters;
}
- static @NonNull List<String> getRouteIds(@Nullable List<MediaRoute2Info> routes) {
+ @NonNull
+ static List<String> getRouteIds(@Nullable List<MediaRoute2Info> routes) {
if (routes == null) {
return new ArrayList<>();
}
@@ -291,7 +293,8 @@
return routeIds;
}
- static @NonNull MediaRouteDiscoveryRequest toMediaRouteDiscoveryRequest(
+ @NonNull
+ static MediaRouteDiscoveryRequest toMediaRouteDiscoveryRequest(
@NonNull RouteDiscoveryPreference preference) {
List<String> controlCategories = new ArrayList<>();
for (String feature : preference.getPreferredFeatures()) {
@@ -304,7 +307,8 @@
return new MediaRouteDiscoveryRequest(selector, preference.shouldPerformActiveScan());
}
- static @NonNull RouteDiscoveryPreference toDiscoveryPreference(
+ @NonNull
+ static RouteDiscoveryPreference toDiscoveryPreference(
@Nullable MediaRouteDiscoveryRequest discoveryRequest) {
if (discoveryRequest == null || !discoveryRequest.isValid()) {
return new RouteDiscoveryPreference.Builder(new ArrayList<>(), false).build();
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouterParams.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouterParams.java
index 5cf763c..30c78c1 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouterParams.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouterParams.java
@@ -22,11 +22,10 @@
import android.os.Bundle;
import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -143,8 +142,9 @@
/**
*/
+ @NonNull
@RestrictTo(RestrictTo.Scope.LIBRARY)
- public @NonNull Bundle getExtras() {
+ public Bundle getExtras() {
return mExtras;
}
@@ -197,7 +197,8 @@
* @see #DIALOG_TYPE_DEFAULT
* @see #DIALOG_TYPE_DYNAMIC_GROUP
*/
- public @NonNull Builder setDialogType(@DialogType int dialogType) {
+ @NonNull
+ public Builder setDialogType(@DialogType int dialogType) {
mDialogType = dialogType;
return this;
}
@@ -216,7 +217,8 @@
* It could result in getting invalid routes.
* @see MediaTransferReceiver
*/
- public @NonNull Builder setMediaTransferReceiverEnabled(boolean enabled) {
+ @NonNull
+ public Builder setMediaTransferReceiverEnabled(boolean enabled) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
mMediaTransferEnabled = enabled;
}
@@ -235,7 +237,8 @@
* If set to {@code false}, {@link androidx.mediarouter.app.MediaRouteButton
* MediaRouteButton} will show the dialog type which is set by {@link #setDialogType(int)}.
*/
- public @NonNull Builder setOutputSwitcherEnabled(boolean enabled) {
+ @NonNull
+ public Builder setOutputSwitcherEnabled(boolean enabled) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
mOutputSwitcherEnabled = enabled;
}
@@ -256,7 +259,8 @@
* Note: This method will be no-op for Android versions earlier than Android R. It has
* effect only when {@link MediaTransferReceiver media transfer is enabled}.
*/
- public @NonNull Builder setTransferToLocalEnabled(boolean enabled) {
+ @NonNull
+ public Builder setTransferToLocalEnabled(boolean enabled) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
mTransferToLocalEnabled = enabled;
}
@@ -289,13 +293,17 @@
/** Set extras. Default value is {@link Bundle#EMPTY} if not set. */
@RestrictTo(RestrictTo.Scope.LIBRARY)
- public @NonNull Builder setExtras(@Nullable Bundle extras) {
+ @NonNull
+ public Builder setExtras(@Nullable Bundle extras) {
mExtras = (extras == null) ? null : new Bundle(extras);
return this;
}
- /** Builds the {@link MediaRouterParams} instance. */
- public @NonNull MediaRouterParams build() {
+ /**
+ * Builds the {@link MediaRouterParams} instance.
+ */
+ @NonNull
+ public MediaRouterParams build() {
return new MediaRouterParams(this);
}
}
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouterUtils.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouterUtils.java
index eb612a5..095aa65 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouterUtils.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaRouterUtils.java
@@ -16,7 +16,7 @@
package androidx.mediarouter.media;
-import org.jspecify.annotations.NonNull;
+import androidx.annotation.NonNull;
/** Utils for usage with platform {@link android.media.MediaRouter} */
class MediaRouterUtils {
@@ -33,31 +33,31 @@
}
public interface Callback {
- void onRouteSelected(int type, android.media.MediaRouter.@NonNull RouteInfo route);
+ void onRouteSelected(int type, @NonNull android.media.MediaRouter.RouteInfo route);
- void onRouteUnselected(int type, android.media.MediaRouter.@NonNull RouteInfo route);
+ void onRouteUnselected(int type, @NonNull android.media.MediaRouter.RouteInfo route);
- void onRouteAdded(android.media.MediaRouter.@NonNull RouteInfo route);
+ void onRouteAdded(@NonNull android.media.MediaRouter.RouteInfo route);
- void onRouteRemoved(android.media.MediaRouter.@NonNull RouteInfo route);
+ void onRouteRemoved(@NonNull android.media.MediaRouter.RouteInfo route);
- void onRouteChanged(android.media.MediaRouter.@NonNull RouteInfo route);
+ void onRouteChanged(@NonNull android.media.MediaRouter.RouteInfo route);
- void onRouteGrouped(android.media.MediaRouter.@NonNull RouteInfo route,
- android.media.MediaRouter.@NonNull RouteGroup group, int index);
+ void onRouteGrouped(@NonNull android.media.MediaRouter.RouteInfo route,
+ @NonNull android.media.MediaRouter.RouteGroup group, int index);
- void onRouteUngrouped(android.media.MediaRouter.@NonNull RouteInfo route,
- android.media.MediaRouter.@NonNull RouteGroup group);
+ void onRouteUngrouped(@NonNull android.media.MediaRouter.RouteInfo route,
+ @NonNull android.media.MediaRouter.RouteGroup group);
- void onRouteVolumeChanged(android.media.MediaRouter.@NonNull RouteInfo route);
+ void onRouteVolumeChanged(@NonNull android.media.MediaRouter.RouteInfo route);
- void onRoutePresentationDisplayChanged(android.media.MediaRouter.@NonNull RouteInfo route);
+ void onRoutePresentationDisplayChanged(@NonNull android.media.MediaRouter.RouteInfo route);
}
public interface VolumeCallback {
- void onVolumeSetRequest(android.media.MediaRouter.@NonNull RouteInfo route, int volume);
+ void onVolumeSetRequest(@NonNull android.media.MediaRouter.RouteInfo route, int volume);
- void onVolumeUpdateRequest(android.media.MediaRouter.@NonNull RouteInfo route,
+ void onVolumeUpdateRequest(@NonNull android.media.MediaRouter.RouteInfo route,
int direction);
}
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaSessionStatus.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaSessionStatus.java
index 34f198f..820982db 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaSessionStatus.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaSessionStatus.java
@@ -20,11 +20,10 @@
import android.os.Bundle;
import android.os.SystemClock;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.core.util.TimeUtils;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
/**
* Describes the playback status of a media session.
* <p>
@@ -124,12 +123,14 @@
* The extras will be ignored by the media router but they may be used
* by applications.
*/
- public @Nullable Bundle getExtras() {
+ @Nullable
+ public Bundle getExtras() {
return mBundle.getBundle(KEY_EXTRAS);
}
+ @NonNull
@Override
- public @NonNull String toString() {
+ public String toString() {
StringBuilder result = new StringBuilder();
result.append("MediaSessionStatus{ ");
result.append("timestamp=");
@@ -159,7 +160,8 @@
*
* @return The contents of the object represented as a bundle.
*/
- public @NonNull Bundle asBundle() {
+ @NonNull
+ public Bundle asBundle() {
return mBundle;
}
@@ -169,7 +171,8 @@
* @param bundle The bundle, or null if none.
* @return The new instance, or null if the bundle was null.
*/
- public static @Nullable MediaSessionStatus fromBundle(@Nullable Bundle bundle) {
+ @Nullable
+ public static MediaSessionStatus fromBundle(@Nullable Bundle bundle) {
return bundle != null ? new MediaSessionStatus(bundle) : null;
}
@@ -207,7 +210,8 @@
* Sets the timestamp associated with the status information in
* milliseconds since boot in the {@link SystemClock#elapsedRealtime} time base.
*/
- public @NonNull Builder setTimestamp(long elapsedRealtimeTimestamp) {
+ @NonNull
+ public Builder setTimestamp(long elapsedRealtimeTimestamp) {
mBundle.putLong(KEY_TIMESTAMP, elapsedRealtimeTimestamp);
return this;
}
@@ -215,7 +219,8 @@
/**
* Sets the session state.
*/
- public @NonNull Builder setSessionState(int sessionState) {
+ @NonNull
+ public Builder setSessionState(int sessionState) {
mBundle.putInt(KEY_SESSION_STATE, sessionState);
return this;
}
@@ -223,7 +228,8 @@
/**
* Sets whether the queue is paused.
*/
- public @NonNull Builder setQueuePaused(boolean queuePaused) {
+ @NonNull
+ public Builder setQueuePaused(boolean queuePaused) {
mBundle.putBoolean(KEY_QUEUE_PAUSED, queuePaused);
return this;
}
@@ -233,7 +239,8 @@
* The extras will be ignored by the media router but they may be used
* by applications.
*/
- public @NonNull Builder setExtras(@Nullable Bundle extras) {
+ @NonNull
+ public Builder setExtras(@Nullable Bundle extras) {
if (extras == null) {
mBundle.putBundle(KEY_EXTRAS, null);
} else {
@@ -245,7 +252,8 @@
/**
* Builds the {@link MediaSessionStatus media session status object}.
*/
- public @NonNull MediaSessionStatus build() {
+ @NonNull
+ public MediaSessionStatus build() {
return new MediaSessionStatus(mBundle);
}
}
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaTransferReceiver.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaTransferReceiver.java
index d690709..8ed2a5f 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaTransferReceiver.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/MediaTransferReceiver.java
@@ -25,10 +25,9 @@
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
-import org.jspecify.annotations.NonNull;
-
import java.util.List;
/**
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/PlatformMediaRouter1RouteProvider.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/PlatformMediaRouter1RouteProvider.java
index 1c02db3..89d4178 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/PlatformMediaRouter1RouteProvider.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/PlatformMediaRouter1RouteProvider.java
@@ -31,11 +31,10 @@
import android.util.Log;
import android.view.Display;
+import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.mediarouter.R;
-import org.jspecify.annotations.NonNull;
-
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
@@ -206,7 +205,7 @@
}
@Override
- public void onRouteAdded(android.media.MediaRouter.@NonNull RouteInfo route) {
+ public void onRouteAdded(@NonNull android.media.MediaRouter.RouteInfo route) {
if (addSystemRouteNoPublish(route)) {
publishRoutes();
}
@@ -262,7 +261,7 @@
}
@Override
- public void onRouteRemoved(android.media.MediaRouter.@NonNull RouteInfo route) {
+ public void onRouteRemoved(@NonNull android.media.MediaRouter.RouteInfo route) {
if (getUserRouteRecord(route) == null) {
int index = findSystemRouteRecord(route);
if (index >= 0) {
@@ -273,7 +272,7 @@
}
@Override
- public void onRouteChanged(android.media.MediaRouter.@NonNull RouteInfo route) {
+ public void onRouteChanged(@NonNull android.media.MediaRouter.RouteInfo route) {
if (getUserRouteRecord(route) == null) {
int index = findSystemRouteRecord(route);
if (index >= 0) {
@@ -285,7 +284,7 @@
}
@Override
- public void onRouteVolumeChanged(android.media.MediaRouter.@NonNull RouteInfo route) {
+ public void onRouteVolumeChanged(@NonNull android.media.MediaRouter.RouteInfo route) {
if (getUserRouteRecord(route) == null) {
int index = findSystemRouteRecord(route);
if (index >= 0) {
@@ -304,7 +303,7 @@
@Override
public void onRouteSelected(int type,
- android.media.MediaRouter.@NonNull RouteInfo route) {
+ @NonNull android.media.MediaRouter.RouteInfo route) {
if (route != mRouter.getSelectedRoute(ALL_ROUTE_TYPES)) {
// The currently selected route has already changed so this callback
// is stale. Drop it to prevent getting into sync loops.
@@ -327,25 +326,25 @@
@Override
public void onRouteUnselected(int type,
- android.media.MediaRouter.@NonNull RouteInfo route) {
+ @NonNull android.media.MediaRouter.RouteInfo route) {
// Nothing to do when a route is unselected.
// We only need to handle when a route is selected.
}
@Override
- public void onRouteGrouped(android.media.MediaRouter.@NonNull RouteInfo route,
- android.media.MediaRouter.@NonNull RouteGroup group, int index) {
+ public void onRouteGrouped(@NonNull android.media.MediaRouter.RouteInfo route,
+ @NonNull android.media.MediaRouter.RouteGroup group, int index) {
// Route grouping is deprecated and no longer supported.
}
@Override
- public void onRouteUngrouped(android.media.MediaRouter.@NonNull RouteInfo route,
- android.media.MediaRouter.@NonNull RouteGroup group) {
+ public void onRouteUngrouped(@NonNull android.media.MediaRouter.RouteInfo route,
+ @NonNull android.media.MediaRouter.RouteGroup group) {
// Route grouping is deprecated and no longer supported.
}
@Override
- public void onVolumeSetRequest(android.media.MediaRouter.@NonNull RouteInfo route,
+ public void onVolumeSetRequest(@NonNull android.media.MediaRouter.RouteInfo route,
int volume) {
UserRouteRecord record = getUserRouteRecord(route);
if (record != null) {
@@ -354,7 +353,7 @@
}
@Override
- public void onVolumeUpdateRequest(android.media.MediaRouter.@NonNull RouteInfo route,
+ public void onVolumeUpdateRequest(@NonNull android.media.MediaRouter.RouteInfo route,
int direction) {
UserRouteRecord record = getUserRouteRecord(route);
if (record != null) {
@@ -571,7 +570,7 @@
@Override
public void onRoutePresentationDisplayChanged(
- android.media.MediaRouter.@NonNull RouteInfo route) {
+ @NonNull android.media.MediaRouter.RouteInfo route) {
int index = findSystemRouteRecord(route);
if (index >= 0) {
SystemRouteRecord record = mSystemRouteRecords.get(index);
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RegisteredMediaRouteProvider.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RegisteredMediaRouteProvider.java
index a29f4c1..5074a7e 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RegisteredMediaRouteProvider.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RegisteredMediaRouteProvider.java
@@ -71,12 +71,11 @@
import android.util.Log;
import android.util.SparseArray;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.mediarouter.media.MediaRouteProvider.DynamicGroupRouteController.DynamicRouteDescriptor;
import androidx.mediarouter.media.MediaRouter.ControlRequestCallback;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
@@ -181,8 +180,9 @@
disconnect();
}
+ @NonNull
@Override
- public @NonNull String toString() {
+ public String toString() {
return "Service connection " + mComponentName.flattenToShortString();
}
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RegisteredMediaRouteProviderWatcher.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RegisteredMediaRouteProviderWatcher.java
index 78be4fc..82c5ca3 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RegisteredMediaRouteProviderWatcher.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RegisteredMediaRouteProviderWatcher.java
@@ -29,11 +29,10 @@
import android.os.Handler;
import android.text.TextUtils;
+import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.annotation.VisibleForTesting;
-import org.jspecify.annotations.NonNull;
-
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -180,7 +179,8 @@
}
@RequiresApi(Build.VERSION_CODES.R)
- @NonNull List<ServiceInfo> getMediaRoute2ProviderServices() {
+ @NonNull
+ List<ServiceInfo> getMediaRoute2ProviderServices() {
Intent intent = new Intent(MediaRoute2ProviderService.SERVICE_INTERFACE);
List<ServiceInfo> serviceInfoList = new ArrayList<>();
@@ -227,6 +227,6 @@
void removeProvider(@NonNull MediaRouteProvider provider);
void releaseProviderController(@NonNull RegisteredMediaRouteProvider provider,
- MediaRouteProvider.@NonNull RouteController controller);
+ @NonNull MediaRouteProvider.RouteController controller);
}
}
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RemoteControlClientCompat.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RemoteControlClientCompat.java
index 33ec00b..290c9cb 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RemoteControlClientCompat.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RemoteControlClientCompat.java
@@ -19,8 +19,8 @@
import android.content.Context;
import android.media.AudioManager;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import java.lang.ref.WeakReference;
@@ -76,7 +76,8 @@
public int volumeHandling = MediaRouter.RouteInfo.PLAYBACK_VOLUME_FIXED;
public int playbackStream = AudioManager.STREAM_MUSIC;
public int playbackType = MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE;
- public @Nullable String volumeControlId;
+ @Nullable
+ public String volumeControlId;
}
/**
@@ -157,7 +158,7 @@
}
@Override
- public void onVolumeUpdateRequest(android.media.MediaRouter.@NonNull RouteInfo route,
+ public void onVolumeUpdateRequest(@NonNull android.media.MediaRouter.RouteInfo route,
int direction) {
JellybeanImpl impl = mImplWeak.get();
if (impl != null && impl.mVolumeCallback != null) {
@@ -166,7 +167,7 @@
}
@Override
- public void onVolumeSetRequest(android.media.MediaRouter.@NonNull RouteInfo route,
+ public void onVolumeSetRequest(@NonNull android.media.MediaRouter.RouteInfo route,
int volume) {
JellybeanImpl impl = mImplWeak.get();
if (impl != null && impl.mVolumeCallback != null) {
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RemotePlaybackClient.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RemotePlaybackClient.java
index 744679f..937a1de 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RemotePlaybackClient.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RemotePlaybackClient.java
@@ -25,12 +25,11 @@
import android.os.Bundle;
import android.util.Log;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.core.util.ObjectsCompat;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
/**
* A helper class for playing media on remote routes using the remote playback protocol
* defined by {@link MediaControlIntent}.
@@ -65,7 +64,7 @@
* @param context The {@link Context}.
* @param route The media route.
*/
- public RemotePlaybackClient(@NonNull Context context, MediaRouter.@NonNull RouteInfo route) {
+ public RemotePlaybackClient(@NonNull Context context, @NonNull MediaRouter.RouteInfo route) {
if (context == null) {
throw new IllegalArgumentException("context must not be null");
}
@@ -201,7 +200,8 @@
*
* @return The current session id, or null if none.
*/
- public @Nullable String getSessionId() {
+ @Nullable
+ public String getSessionId() {
return mSessionId;
}
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RouteListingPreference.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RouteListingPreference.java
index d5ac610..a6827e4 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RouteListingPreference.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/RouteListingPreference.java
@@ -21,13 +21,12 @@
import android.text.TextUtils;
import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.core.util.Preconditions;
-import org.jspecify.annotations.NonNull;
-import org.jspecify.annotations.Nullable;
-
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
@@ -72,9 +71,9 @@
@SuppressLint("ActionValue") // Field & value copied from android.media.RouteListingPreference.
public static final String EXTRA_ROUTE_ID = android.media.RouteListingPreference.EXTRA_ROUTE_ID;
- private final @NonNull List<RouteListingPreference.Item> mItems;
+ @NonNull private final List<RouteListingPreference.Item> mItems;
private final boolean mIsSystemOrderingEnabled;
- private final @Nullable ComponentName mLinkedItemComponentName;
+ @Nullable private final ComponentName mLinkedItemComponentName;
// Must be package private to avoid a synthetic accessor for the builder.
/* package */ RouteListingPreference(RouteListingPreference.Builder builder) {
@@ -87,7 +86,8 @@
* Returns an unmodifiable list containing the {@link RouteListingPreference.Item items} that
* the app wants to be listed for media routing.
*/
- public @NonNull List<RouteListingPreference.Item> getItems() {
+ @NonNull
+ public List<RouteListingPreference.Item> getItems() {
return mItems;
}
@@ -116,7 +116,8 @@
* returned {@link ComponentName}, using action {@link #ACTION_TRANSFER_MEDIA}, with the extra
* {@link #EXTRA_ROUTE_ID}.
*/
- public @Nullable ComponentName getLinkedItemComponentName() {
+ @Nullable
+ public ComponentName getLinkedItemComponentName() {
return mLinkedItemComponentName;
}
@@ -144,8 +145,8 @@
// Internal methods.
@RequiresApi(api = 34)
-/* package */
- android.media.@NonNull RouteListingPreference toPlatformRouteListingPreference() {
+ @NonNull /* package */
+ android.media.RouteListingPreference toPlatformRouteListingPreference() {
return Api34Impl.toPlatformRouteListingPreference(this);
}
@@ -170,7 +171,8 @@
*
* <p>The default value is an empty list.
*/
- public RouteListingPreference.@NonNull Builder setItems(
+ @NonNull
+ public RouteListingPreference.Builder setItems(
@NonNull List<RouteListingPreference.Item> items) {
mItems = Collections.unmodifiableList(new ArrayList<>(Objects.requireNonNull(items)));
return this;
@@ -181,7 +183,8 @@
*
* <p>The default value is {@code true}.
*/
- public RouteListingPreference.@NonNull Builder setSystemOrderingEnabled(
+ @NonNull
+ public RouteListingPreference.Builder setSystemOrderingEnabled(
boolean systemOrderingEnabled) {
mIsSystemOrderingEnabled = systemOrderingEnabled;
return this;
@@ -192,7 +195,8 @@
*
* <p>The default value is {@code null}.
*/
- public RouteListingPreference.@NonNull Builder setLinkedItemComponentName(
+ @NonNull
+ public RouteListingPreference.Builder setLinkedItemComponentName(
@Nullable ComponentName linkedItemComponentName) {
mLinkedItemComponentName = linkedItemComponentName;
return this;
@@ -202,7 +206,8 @@
* Creates and returns a new {@link RouteListingPreference} instance with the given
* parameters.
*/
- public @NonNull RouteListingPreference build() {
+ @NonNull
+ public RouteListingPreference build() {
return new RouteListingPreference(this);
}
}
@@ -345,15 +350,15 @@
public static final int SUBTEXT_CUSTOM =
android.media.RouteListingPreference.Item.SUBTEXT_CUSTOM;
- private final @NonNull String mRouteId;
+ @NonNull private final String mRouteId;
@SelectionBehavior private final int mSelectionBehavior;
@Flags private final int mFlags;
@SubText private final int mSubText;
- private final @Nullable CharSequence mCustomSubtextMessage;
+ @Nullable private final CharSequence mCustomSubtextMessage;
// Must be package private to avoid a synthetic accessor for the builder.
- /* package */ Item(RouteListingPreference.Item.@NonNull Builder builder) {
+ /* package */ Item(@NonNull RouteListingPreference.Item.Builder builder) {
mRouteId = builder.mRouteId;
mSelectionBehavior = builder.mSelectionBehavior;
mFlags = builder.mFlags;
@@ -367,7 +372,8 @@
*
* @see MediaRouter.RouteInfo#getId()
*/
- public @NonNull String getRouteId() {
+ @NonNull
+ public String getRouteId() {
return mRouteId;
}
@@ -432,7 +438,8 @@
* subtexts listed in {@link #getSubText()} in order to guarantee correct visual
* representation and localization on all form factors.
*/
- public @Nullable CharSequence getCustomSubtextMessage() {
+ @Nullable
+ public CharSequence getCustomSubtextMessage() {
return mCustomSubtextMessage;
}
@@ -497,8 +504,8 @@
*
* <p>The default value is {@link #ACTION_TRANSFER_MEDIA}.
*/
- public RouteListingPreference.Item.@NonNull Builder setSelectionBehavior(
- int selectionBehavior) {
+ @NonNull
+ public RouteListingPreference.Item.Builder setSelectionBehavior(int selectionBehavior) {
mSelectionBehavior = selectionBehavior;
return this;
}
@@ -508,7 +515,8 @@
*
* <p>The default value is zero (no flags).
*/
- public RouteListingPreference.Item.@NonNull Builder setFlags(int flags) {
+ @NonNull
+ public RouteListingPreference.Item.Builder setFlags(int flags) {
mFlags = flags;
return this;
}
@@ -518,7 +526,8 @@
*
* <p>The default value is {@link #SUBTEXT_NONE}.
*/
- public RouteListingPreference.Item.@NonNull Builder setSubText(int subText) {
+ @NonNull
+ public RouteListingPreference.Item.Builder setSubText(int subText) {
mSubText = subText;
return this;
}
@@ -528,7 +537,8 @@
*
* <p>The default value is {@code null}.
*/
- public RouteListingPreference.Item.@NonNull Builder setCustomSubtextMessage(
+ @NonNull
+ public RouteListingPreference.Item.Builder setCustomSubtextMessage(
@Nullable CharSequence customSubtextMessage) {
mCustomSubtextMessage = customSubtextMessage;
return this;
@@ -538,7 +548,8 @@
* Creates and returns a new {@link RouteListingPreference.Item} with the given
* parameters.
*/
- public RouteListingPreference.@NonNull Item build() {
+ @NonNull
+ public RouteListingPreference.Item build() {
return new RouteListingPreference.Item(this);
}
}
@@ -550,8 +561,8 @@
// This class is not instantiable.
}
- public static android.media.@NonNull RouteListingPreference
- toPlatformRouteListingPreference(
+ @NonNull
+ public static android.media.RouteListingPreference toPlatformRouteListingPreference(
RouteListingPreference routeListingPreference) {
ArrayList<android.media.RouteListingPreference.Item> platformRlpItems =
new ArrayList<>();
@@ -566,7 +577,8 @@
.build();
}
- public static android.media.RouteListingPreference.@NonNull Item toPlatformItem(Item item) {
+ @NonNull
+ public static android.media.RouteListingPreference.Item toPlatformItem(Item item) {
return new android.media.RouteListingPreference.Item.Builder(item.getRouteId())
.setFlags(item.getFlags())
.setSubText(item.getSubText())
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/SystemRoutingUsingMediaRouter2Receiver.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/SystemRoutingUsingMediaRouter2Receiver.java
index 892c5ea..ecc6df6 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/SystemRoutingUsingMediaRouter2Receiver.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/media/SystemRoutingUsingMediaRouter2Receiver.java
@@ -24,10 +24,9 @@
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
-import org.jspecify.annotations.NonNull;
-
import java.util.List;
/**
diff --git a/mediarouter/mediarouter/src/main/res/values-ja/strings.xml b/mediarouter/mediarouter/src/main/res/values-ja/strings.xml
index d1589d9..75786f1 100644
--- a/mediarouter/mediarouter/src/main/res/values-ja/strings.xml
+++ b/mediarouter/mediarouter/src/main/res/values-ja/strings.xml
@@ -43,7 +43,7 @@
<string name="mr_dialog_transferable_header" msgid="6068257520605505468">"グループで再生"</string>
<string name="mr_cast_dialog_title_view_placeholder" msgid="2175930138959078155">"情報がありません"</string>
<string name="mr_chooser_zero_routes_found_title" msgid="5213435473397442608">"利用可能なデバイスがありません"</string>
- <string name="mr_chooser_wifi_warning_description_phone" msgid="2555886884770958244">"他のデバイスがこのスマートフォンと同じ Wi-Fi ネットワークに接続していることを確認してください"</string>
+ <string name="mr_chooser_wifi_warning_description_phone" msgid="2555886884770958244">"もう一方のデバイスがこのスマートフォンと同じ Wi-Fi ネットワークに接続していることを確認してください"</string>
<string name="mr_chooser_wifi_warning_description_tablet" msgid="6038748488793588164">"他のデバイスがこのタブレットと同じ Wi-Fi ネットワークに接続していることを確認してください"</string>
<string name="mr_chooser_wifi_warning_description_tv" msgid="5845921667085074878">"他のデバイスがこのテレビと同じ Wi-Fi ネットワークに接続していることを確認してください"</string>
<string name="mr_chooser_wifi_warning_description_watch" msgid="5255021372884233706">"もう一方のデバイスがこのスマートウォッチと同じ Wi-Fi ネットワークに接続していることを確認してください"</string>
diff --git a/mediarouter/mediarouter/src/main/res/values-pl/strings.xml b/mediarouter/mediarouter/src/main/res/values-pl/strings.xml
index ced7b9e..4db44b8 100644
--- a/mediarouter/mediarouter/src/main/res/values-pl/strings.xml
+++ b/mediarouter/mediarouter/src/main/res/values-pl/strings.xml
@@ -43,7 +43,7 @@
<string name="mr_dialog_transferable_header" msgid="6068257520605505468">"Odtwórz w grupie"</string>
<string name="mr_cast_dialog_title_view_placeholder" msgid="2175930138959078155">"Brak informacji"</string>
<string name="mr_chooser_zero_routes_found_title" msgid="5213435473397442608">"Brak dostępnych urządzeń"</string>
- <string name="mr_chooser_wifi_warning_description_phone" msgid="2555886884770958244">"Sprawdź, czy drugie urządzenie jest połączone z tą samą siecią Wi-Fi co telefon"</string>
+ <string name="mr_chooser_wifi_warning_description_phone" msgid="2555886884770958244">"Upewnij się, że drugie urządzenie jest połączone z tą samą siecią Wi-Fi co ten telefon"</string>
<string name="mr_chooser_wifi_warning_description_tablet" msgid="6038748488793588164">"Sprawdź, czy drugie urządzenie jest połączone z tą samą siecią Wi-Fi co tablet"</string>
<string name="mr_chooser_wifi_warning_description_tv" msgid="5845921667085074878">"Sprawdź, czy drugie urządzenie jest połączone z tą samą siecią Wi-Fi co telewizor"</string>
<string name="mr_chooser_wifi_warning_description_watch" msgid="5255021372884233706">"Sprawdź, czy drugie urządzenie jest połączone z tą samą siecią Wi-Fi co zegarek"</string>
diff --git a/mediarouter/mediarouter/src/test/java/androidx/mediarouter/app/SystemOutputSwitcherDialogControllerTest.java b/mediarouter/mediarouter/src/test/java/androidx/mediarouter/app/SystemOutputSwitcherDialogControllerTest.java
index 5ba5b18..66554c9 100644
--- a/mediarouter/mediarouter/src/test/java/androidx/mediarouter/app/SystemOutputSwitcherDialogControllerTest.java
+++ b/mediarouter/mediarouter/src/test/java/androidx/mediarouter/app/SystemOutputSwitcherDialogControllerTest.java
@@ -34,12 +34,12 @@
import android.os.Build;
import android.provider.Settings;
+import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.test.core.app.ApplicationProvider;
import com.google.common.collect.ImmutableList;
-import org.jspecify.annotations.NonNull;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
diff --git a/navigation/navigation-dynamic-features-fragment/src/main/res/values-it/strings.xml b/navigation/navigation-dynamic-features-fragment/src/main/res/values-it/strings.xml
index 62c3d78..b64b779 100644
--- a/navigation/navigation-dynamic-features-fragment/src/main/res/values-it/strings.xml
+++ b/navigation/navigation-dynamic-features-fragment/src/main/res/values-it/strings.xml
@@ -22,5 +22,5 @@
<string name="installing_module" msgid="5968445461040787716">"Modulo di installazione:"</string>
<string name="progress" msgid="8366783942222789124">"Avanzamento:"</string>
<string name="retry" msgid="1065327189183624288">"Riprova"</string>
- <string name="ok" msgid="4702104660890557116">"OK"</string>
+ <string name="ok" msgid="4702104660890557116">"Ok"</string>
</resources>
diff --git a/pdf/integration-tests/testapp/src/main/AndroidManifest.xml b/pdf/integration-tests/testapp/src/main/AndroidManifest.xml
index 04f1cba1..f155b14 100644
--- a/pdf/integration-tests/testapp/src/main/AndroidManifest.xml
+++ b/pdf/integration-tests/testapp/src/main/AndroidManifest.xml
@@ -27,6 +27,7 @@
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
+ android:configChanges="orientation|screenSize"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
diff --git a/pdf/pdf-viewer/src/main/res/values-af/strings.xml b/pdf/pdf-viewer/src/main/res/values-af/strings.xml
index 9c529a2..0b88922 100644
--- a/pdf/pdf-viewer/src/main/res/values-af/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-af/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> van <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Geen passende resultate nie"</string>
<string name="action_edit" msgid="5882082700509010966">"Wysig lêer"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Deursoek lêer"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Rolbalk"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Voer wagwoord in om te ontsluit"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Probeer weer"</string>
<string name="pdf_error" msgid="3287950599604474450">"Kon nie die PDF-dokument verwerk nie!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-am/strings.xml b/pdf/pdf-viewer/src/main/res/values-am/strings.xml
index c7b82bc..596cd36 100644
--- a/pdf/pdf-viewer/src/main/res/values-am/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-am/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> ከ<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"ምንም የሚመሳሰሉ ውጤቶች የሉም"</string>
<string name="action_edit" msgid="5882082700509010966">"ፋይል አርትዕ"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"ፋይል ፈልግ"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"መሸብለያ አሞሌ"</string>
<string name="password_not_entered" msgid="8875370870743585303">"ለመክፈት የይለፍ ቃል ያስገቡ"</string>
<string name="retry_button_text" msgid="3443862378337999137">"እንደገና ሞክር"</string>
<string name="pdf_error" msgid="3287950599604474450">"የPDF ሰነዱን ማሰናዳት አልተሳካም!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ar/strings.xml b/pdf/pdf-viewer/src/main/res/values-ar/strings.xml
index 41bf466..63c38fa 100644
--- a/pdf/pdf-viewer/src/main/res/values-ar/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ar/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> من إجمالي <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"ما مِن نتائج مطابقة"</string>
<string name="action_edit" msgid="5882082700509010966">"تعديل الملف"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"البحث في الملف"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"شريط التمرير"</string>
<string name="password_not_entered" msgid="8875370870743585303">"يجب إدخال كلمة المرور لفتح القفل"</string>
<string name="retry_button_text" msgid="3443862378337999137">"إعادة المحاولة"</string>
<string name="pdf_error" msgid="3287950599604474450">"تعذّرت معالجة مستند PDF."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-as/strings.xml b/pdf/pdf-viewer/src/main/res/values-as/strings.xml
index 641ff3d..12fa623 100644
--- a/pdf/pdf-viewer/src/main/res/values-as/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-as/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g> খনৰ ভিতৰত <xliff:g id="POSITION">%1$d</xliff:g>তম"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"কোনো মিল থকা ফলাফল নাই"</string>
<string name="action_edit" msgid="5882082700509010966">"ফাইল সম্পাদনা কৰক"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"ফাইল সন্ধান কৰক"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"স্ক্ৰ’ল কৰা দণ্ড"</string>
<string name="password_not_entered" msgid="8875370870743585303">"আনলক কৰিবলৈ পাছৱৰ্ড দিয়ক"</string>
<string name="retry_button_text" msgid="3443862378337999137">"পুনৰ চেষ্টা কৰক"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF নথিখন প্ৰক্ৰিয়াকৰণ কৰিব পৰা নগ’ল!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-az/strings.xml b/pdf/pdf-viewer/src/main/res/values-az/strings.xml
index 6898e3f..88851a7 100644
--- a/pdf/pdf-viewer/src/main/res/values-az/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-az/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Uyğun gələn nəticə yoxdur"</string>
<string name="action_edit" msgid="5882082700509010966">"Faylı redaktə edin"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Fayl axtarın"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Sürüşdürmə paneli"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Kiliddən çıxarmaq üçün parol daxil edin"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Yenə cəhd edin"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF sənədi emal edilmədi!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-b+sr+Latn/strings.xml b/pdf/pdf-viewer/src/main/res/values-b+sr+Latn/strings.xml
index a2e554d..c12a6df 100644
--- a/pdf/pdf-viewer/src/main/res/values-b+sr+Latn/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-b+sr+Latn/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> od <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Nema podudarnih rezultata"</string>
<string name="action_edit" msgid="5882082700509010966">"Izmeni fajl"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Pretraži fajl"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Traka za skrolovanje"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Unesite lozinku za otključavanje"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Probaj ponovo"</string>
<string name="pdf_error" msgid="3287950599604474450">"Obrada PDF dokumenta nije uspela."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-be/strings.xml b/pdf/pdf-viewer/src/main/res/values-be/strings.xml
index 67efe42..e2005e4ee 100644
--- a/pdf/pdf-viewer/src/main/res/values-be/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-be/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> з <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Супадзенняў няма"</string>
<string name="action_edit" msgid="5882082700509010966">"Рэдагаваць файл"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Шукаць файл"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Паласа прагорткі"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Увядзіце пароль для разблакіроўкі"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Паўтарыць"</string>
<string name="pdf_error" msgid="3287950599604474450">"Не ўдалося апрацаваць дакумент PDF."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-bg/strings.xml b/pdf/pdf-viewer/src/main/res/values-bg/strings.xml
index 4faa5a4..a796d4ce 100644
--- a/pdf/pdf-viewer/src/main/res/values-bg/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-bg/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> от <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Няма съответстващи резултати"</string>
<string name="action_edit" msgid="5882082700509010966">"Редактиране на файла"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Търсене на файл"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Лента за превъртане"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Въведете паролата, за да отключите"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Нов опит"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF документът не бе обработен."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-bn/strings.xml b/pdf/pdf-viewer/src/main/res/values-bn/strings.xml
index 14179f82..dba4b38 100644
--- a/pdf/pdf-viewer/src/main/res/values-bn/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-bn/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g>-এর মধ্যে <xliff:g id="POSITION">%1$d</xliff:g> নম্বর"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"কোনও ফলাফল মিলছে না"</string>
<string name="action_edit" msgid="5882082700509010966">"ফাইল এডিট করুন"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"ফাইলে খুঁজুন"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"স্ক্রলবার"</string>
<string name="password_not_entered" msgid="8875370870743585303">"আনলক করতে পাসওয়ার্ড লিখুন"</string>
<string name="retry_button_text" msgid="3443862378337999137">"আবার চেষ্টা করুন"</string>
<string name="pdf_error" msgid="3287950599604474450">"পিডিএফ ডকুমেন্ট প্রসেস করা যায়নি!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-bs/strings.xml b/pdf/pdf-viewer/src/main/res/values-bs/strings.xml
index 6806368..b1b25bf 100644
--- a/pdf/pdf-viewer/src/main/res/values-bs/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-bs/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> od <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Nema podudarnih rezultata"</string>
<string name="action_edit" msgid="5882082700509010966">"Uredite fajl"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Pretraživanje fajla"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Traka za pomicanje"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Unesite lozinku da otključate fajl"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Pokušajte ponovo"</string>
<string name="pdf_error" msgid="3287950599604474450">"Obrada PDF dokumenta nije uspjela!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ca/strings.xml b/pdf/pdf-viewer/src/main/res/values-ca/strings.xml
index efd93eb..627423f 100644
--- a/pdf/pdf-viewer/src/main/res/values-ca/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ca/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> de <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"No hi ha cap resultat coincident"</string>
<string name="action_edit" msgid="5882082700509010966">"Edita el fitxer"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Cerca un fitxer"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Barra de desplaçament"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Introdueix la contrasenya per desbloquejar-lo"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Torna-ho a provar"</string>
<string name="pdf_error" msgid="3287950599604474450">"No s\'ha pogut processar el document PDF."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-cs/strings.xml b/pdf/pdf-viewer/src/main/res/values-cs/strings.xml
index 2879722..876efa9 100644
--- a/pdf/pdf-viewer/src/main/res/values-cs/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-cs/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> z <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Žádné výsledky neodpovídají"</string>
<string name="action_edit" msgid="5882082700509010966">"Upravit soubor"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Prohledat soubor"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Posuvník"</string>
<string name="password_not_entered" msgid="8875370870743585303">"K odemknutí zadejte heslo"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Zkusit znovu"</string>
<string name="pdf_error" msgid="3287950599604474450">"Dokument PDF se nepodařilo zpracovat"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-da/strings.xml b/pdf/pdf-viewer/src/main/res/values-da/strings.xml
index c518c091..ea0c1c3 100644
--- a/pdf/pdf-viewer/src/main/res/values-da/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-da/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> af <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Ingen matchende resultater"</string>
<string name="action_edit" msgid="5882082700509010966">"Rediger fil"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Søg i fil"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Rullepanel"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Angiv adgangskode for at låse op"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Prøv igen"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF-dokumentet kunne ikke behandles"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-de/strings.xml b/pdf/pdf-viewer/src/main/res/values-de/strings.xml
index 9b67e36..03afba8 100644
--- a/pdf/pdf-viewer/src/main/res/values-de/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-de/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> von <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Keine passenden Ergebnisse"</string>
<string name="action_edit" msgid="5882082700509010966">"Datei bearbeiten"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Datei suchen"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Bildlaufleiste"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Gib zum Entsperren ein Passwort ein"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Wiederholen"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF-Dokument konnte nicht verarbeitet werden."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-el/strings.xml b/pdf/pdf-viewer/src/main/res/values-el/strings.xml
index 1990732..16c9fcf 100644
--- a/pdf/pdf-viewer/src/main/res/values-el/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-el/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> από <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Δεν υπάρχουν αντίστοιχα αποτελέσματα"</string>
<string name="action_edit" msgid="5882082700509010966">"Επεξεργασία αρχείου"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Αναζήτηση αρχείου"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Γραμμή κύλισης"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Εισαγάγετε τον κωδικό πρόσβασης για ξεκλείδωμα"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Επανάληψη"</string>
<string name="pdf_error" msgid="3287950599604474450">"Δεν ήταν δυνατή η επεξεργασία του εγγράφου PDF!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-en-rAU/strings.xml b/pdf/pdf-viewer/src/main/res/values-en-rAU/strings.xml
index de428f4..535c6f8 100644
--- a/pdf/pdf-viewer/src/main/res/values-en-rAU/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-en-rAU/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> of <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"No matching results"</string>
<string name="action_edit" msgid="5882082700509010966">"Edit file"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Search file"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Scroll bar"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Enter password to unlock"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Retry"</string>
<string name="pdf_error" msgid="3287950599604474450">"Failed to process the PDF document!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-en-rGB/strings.xml b/pdf/pdf-viewer/src/main/res/values-en-rGB/strings.xml
index de428f4..535c6f8 100644
--- a/pdf/pdf-viewer/src/main/res/values-en-rGB/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-en-rGB/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> of <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"No matching results"</string>
<string name="action_edit" msgid="5882082700509010966">"Edit file"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Search file"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Scroll bar"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Enter password to unlock"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Retry"</string>
<string name="pdf_error" msgid="3287950599604474450">"Failed to process the PDF document!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-en-rIN/strings.xml b/pdf/pdf-viewer/src/main/res/values-en-rIN/strings.xml
index de428f4..535c6f8 100644
--- a/pdf/pdf-viewer/src/main/res/values-en-rIN/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-en-rIN/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> of <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"No matching results"</string>
<string name="action_edit" msgid="5882082700509010966">"Edit file"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Search file"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Scroll bar"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Enter password to unlock"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Retry"</string>
<string name="pdf_error" msgid="3287950599604474450">"Failed to process the PDF document!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-es/strings.xml b/pdf/pdf-viewer/src/main/res/values-es/strings.xml
index 420f7af..6d0b1ee 100644
--- a/pdf/pdf-viewer/src/main/res/values-es/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-es/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> de <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"No hay coincidencias"</string>
<string name="action_edit" msgid="5882082700509010966">"Editar archivo"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Buscar archivo"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Barra de desplazamiento"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Introduce la contraseña para desbloquear"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Reintentar"</string>
<string name="pdf_error" msgid="3287950599604474450">"No se ha podido procesar el documento PDF"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-et/strings.xml b/pdf/pdf-viewer/src/main/res/values-et/strings.xml
index ad36fa9..68a9e65 100644
--- a/pdf/pdf-viewer/src/main/res/values-et/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-et/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Päringule vastavaid tulemusi pole"</string>
<string name="action_edit" msgid="5882082700509010966">"Faili muutmine"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Otsige failist"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Kerimisriba"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Avamiseks sisestage parool"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Proovi uuesti"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF-dokumendi töötlemine nurjus!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-eu/strings.xml b/pdf/pdf-viewer/src/main/res/values-eu/strings.xml
index 8224f3f..ca00340 100644
--- a/pdf/pdf-viewer/src/main/res/values-eu/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-eu/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g> bat-etortzetatik <xliff:g id="POSITION">%1$d</xliff:g>.a"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Ez dago bat datorren emaitzarik"</string>
<string name="action_edit" msgid="5882082700509010966">"Editatu fitxategia"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Bilatu fitxategian"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Korritze-barra"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Idatzi pasahitza desblokeatzeko"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Saiatu berriro"</string>
<string name="pdf_error" msgid="3287950599604474450">"Ezin izan da prozesatu PDF dokumentua!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-fa/strings.xml b/pdf/pdf-viewer/src/main/res/values-fa/strings.xml
index 0d718a96..6773303 100644
--- a/pdf/pdf-viewer/src/main/res/values-fa/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-fa/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> از <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"نتیجه منطبقی پیدا نشد"</string>
<string name="action_edit" msgid="5882082700509010966">"ویرایش فایل"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"جستجوی فایل"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"نوار پیمایش"</string>
<string name="password_not_entered" msgid="8875370870743585303">"گذرواژه را برای بازگشایی قفل وارد کنید"</string>
<string name="retry_button_text" msgid="3443862378337999137">"امتحان مجدد"</string>
<string name="pdf_error" msgid="3287950599604474450">"سند PDF پردازش نشد!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-fi/strings.xml b/pdf/pdf-viewer/src/main/res/values-fi/strings.xml
index ebbd3e5..728a103 100644
--- a/pdf/pdf-viewer/src/main/res/values-fi/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-fi/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Ei tuloksia"</string>
<string name="action_edit" msgid="5882082700509010966">"Muokkaa tiedostoa"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Hae tiedostoa"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Vierityspalkki"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Poista lukitus lisäämällä salasana"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Yritä uudelleen"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF-dokumentin käsittely epäonnistui."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-fr-rCA/strings.xml b/pdf/pdf-viewer/src/main/res/values-fr-rCA/strings.xml
index f394aa6..a92cfb5 100644
--- a/pdf/pdf-viewer/src/main/res/values-fr-rCA/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-fr-rCA/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> de <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Aucun résultat correspondant"</string>
<string name="action_edit" msgid="5882082700509010966">"Modifier le fichier"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Rechercher un fichier"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Barre de défilement"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Entrez le mot de passe pour déverrouiller le fichier"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Réessayer"</string>
<string name="pdf_error" msgid="3287950599604474450">"Échec du traitement du document PDF!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-fr/strings.xml b/pdf/pdf-viewer/src/main/res/values-fr/strings.xml
index 0b21387..c5d1e23 100644
--- a/pdf/pdf-viewer/src/main/res/values-fr/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-fr/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> sur <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Aucun résultat"</string>
<string name="action_edit" msgid="5882082700509010966">"Modifier le fichier"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Rechercher un fichier"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Barre de défilement"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Saisissez le mot de passe pour procéder au déverrouillage"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Réessayer"</string>
<string name="pdf_error" msgid="3287950599604474450">"Échec du traitement du document PDF."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-gl/strings.xml b/pdf/pdf-viewer/src/main/res/values-gl/strings.xml
index 69958ec..c817be5 100644
--- a/pdf/pdf-viewer/src/main/res/values-gl/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-gl/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> de <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Non hai ningún resultado que coincida"</string>
<string name="action_edit" msgid="5882082700509010966">"Editar o ficheiro"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Buscar un ficheiro"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Barra de desprazamento"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Introduce o contrasinal para desbloquear o ficheiro"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Tentar de novo"</string>
<string name="pdf_error" msgid="3287950599604474450">"Produciuse un erro ao procesar o documento PDF"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-gu/strings.xml b/pdf/pdf-viewer/src/main/res/values-gu/strings.xml
index b94915b..2d2982b 100644
--- a/pdf/pdf-viewer/src/main/res/values-gu/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-gu/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g>માંથી <xliff:g id="POSITION">%1$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"કોઈ મેળ ખાતું પરિણામ નથી"</string>
<string name="action_edit" msgid="5882082700509010966">"ફાઇલમાં ફેરફાર કરો"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"ફાઇલ શોધો"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"સ્ક્રોલ બાર"</string>
<string name="password_not_entered" msgid="8875370870743585303">"અનલૉક કરવા માટે પાસવર્ડ દાખલ કરો"</string>
<string name="retry_button_text" msgid="3443862378337999137">"ફરી પ્રયાસ કરો"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF દસ્તાવેજ પર પ્રક્રિયા કરવામાં નિષ્ફળ રહ્યાં!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-hi/strings.xml b/pdf/pdf-viewer/src/main/res/values-hi/strings.xml
index eabf6fe..a3d7265 100644
--- a/pdf/pdf-viewer/src/main/res/values-hi/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-hi/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g> में से <xliff:g id="POSITION">%1$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"कोई मिलता-जुलता नतीजा नहीं मिला"</string>
<string name="action_edit" msgid="5882082700509010966">"फ़ाइल में बदलाव करें"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"फ़ाइल खोजें"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"स्क्रोलबार"</string>
<string name="password_not_entered" msgid="8875370870743585303">"अनलॉक करने के लिए पासवर्ड डालें"</string>
<string name="retry_button_text" msgid="3443862378337999137">"फिर कोशिश करें"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF दस्तावेज़ को प्रोसेस नहीं किया जा सका!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-hr/strings.xml b/pdf/pdf-viewer/src/main/res/values-hr/strings.xml
index 390d30b..b76882b 100644
--- a/pdf/pdf-viewer/src/main/res/values-hr/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-hr/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> od <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Nema podudarnih rezultata"</string>
<string name="action_edit" msgid="5882082700509010966">"Uređivanje datoteke"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Pretraži datoteku"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Klizač"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Unesite zaporku za otključavanje"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Pokušaj ponovo"</string>
<string name="pdf_error" msgid="3287950599604474450">"Obrada PDF dokumenta nije uspjela!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-hu/strings.xml b/pdf/pdf-viewer/src/main/res/values-hu/strings.xml
index a6808f9..0bc634e 100644
--- a/pdf/pdf-viewer/src/main/res/values-hu/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-hu/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g>/<xliff:g id="POSITION">%1$d</xliff:g>."</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Nincs találat"</string>
<string name="action_edit" msgid="5882082700509010966">"Fájl szerkesztése"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Fájl keresése"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Görgetősáv"</string>
<string name="password_not_entered" msgid="8875370870743585303">"A feloldáshoz írja be a jelszót"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Újra"</string>
<string name="pdf_error" msgid="3287950599604474450">"Nem sikerült feldolgozni a PDF-dokumentumot!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-hy/strings.xml b/pdf/pdf-viewer/src/main/res/values-hy/strings.xml
index 74d5da8..46c6900 100644
--- a/pdf/pdf-viewer/src/main/res/values-hy/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-hy/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g>՝ <xliff:g id="TOTAL">%2$d</xliff:g>-ից"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Համապատասխանող արդյունքներ չկան"</string>
<string name="action_edit" msgid="5882082700509010966">"Փոփոխել ֆայլը"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Որոնել ֆայլ"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Ոլորագոտի"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Մուտքագրեք գաղտնաբառը՝ ապակողպելու համար"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Նորից փորձել"</string>
<string name="pdf_error" msgid="3287950599604474450">"Չհաջողվեց մշակել PDF փաստաթուղթը"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-in/strings.xml b/pdf/pdf-viewer/src/main/res/values-in/strings.xml
index 3ac1e7e..416db41 100644
--- a/pdf/pdf-viewer/src/main/res/values-in/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-in/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> dari <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Tidak ada hasil yang cocok"</string>
<string name="action_edit" msgid="5882082700509010966">"Edit file"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Telusuri file"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Scroll bar"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Masukkan sandi untuk membuka kunci"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Coba lagi"</string>
<string name="pdf_error" msgid="3287950599604474450">"Gagal memproses dokumen PDF"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-is/strings.xml b/pdf/pdf-viewer/src/main/res/values-is/strings.xml
index ec413bc..c2ec3ad 100644
--- a/pdf/pdf-viewer/src/main/res/values-is/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-is/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> af <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Engar samsvarandi niðurstöður fundust"</string>
<string name="action_edit" msgid="5882082700509010966">"Breyta skrá"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Leita í skrá"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Flettistika"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Sláðu inn aðgangsorð til að opna"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Reyna aftur"</string>
<string name="pdf_error" msgid="3287950599604474450">"Ekki tókst að vinna úr PDF-skjalinu!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-it/strings.xml b/pdf/pdf-viewer/src/main/res/values-it/strings.xml
index a8ecaae..4e15da5 100644
--- a/pdf/pdf-viewer/src/main/res/values-it/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-it/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> di <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Nessun risultato corrispondente"</string>
<string name="action_edit" msgid="5882082700509010966">"Modifica file"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Cerca file"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Barra di scorrimento"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Inserisci la password per sbloccare il file"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Riprova"</string>
<string name="pdf_error" msgid="3287950599604474450">"Impossibile elaborare il documento PDF"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-iw/strings.xml b/pdf/pdf-viewer/src/main/res/values-iw/strings.xml
index 8b52a43c..4fb87c6 100644
--- a/pdf/pdf-viewer/src/main/res/values-iw/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-iw/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> מתוך <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"לא נמצאו תוצאות תואמות"</string>
<string name="action_edit" msgid="5882082700509010966">"עריכת הקובץ"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"חיפוש קובץ"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"סרגל הגלילה"</string>
<string name="password_not_entered" msgid="8875370870743585303">"צריך להזין סיסמה לביטול הנעילה"</string>
<string name="retry_button_text" msgid="3443862378337999137">"ניסיון חוזר"</string>
<string name="pdf_error" msgid="3287950599604474450">"לא ניתן לעבד את מסמך ה-PDF"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ja/strings.xml b/pdf/pdf-viewer/src/main/res/values-ja/strings.xml
index 0ffb53c..f425a9b 100644
--- a/pdf/pdf-viewer/src/main/res/values-ja/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ja/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"一致する結果がありません"</string>
<string name="action_edit" msgid="5882082700509010966">"ファイルを編集"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"ファイルを検索"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"スクロールバー"</string>
<string name="password_not_entered" msgid="8875370870743585303">"ロックを解除するには、パスワードを入力してください"</string>
<string name="retry_button_text" msgid="3443862378337999137">"再試行"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF ドキュメントを処理できませんでした"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ka/strings.xml b/pdf/pdf-viewer/src/main/res/values-ka/strings.xml
index 2e61dea..66633eb 100644
--- a/pdf/pdf-viewer/src/main/res/values-ka/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ka/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g>-დან <xliff:g id="POSITION">%1$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"შედეგებში არ არის დამთხვევა"</string>
<string name="action_edit" msgid="5882082700509010966">"ფაილის რედაქტირება"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"ფაილის ძიება"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"გადაადგილების ზოლი"</string>
<string name="password_not_entered" msgid="8875370870743585303">"პაროლის შეყვანა განბლოკვისთვის"</string>
<string name="retry_button_text" msgid="3443862378337999137">"ხელახლა ცდა"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF დოკუმენტის დამუშავება ვერ მოხერხდა!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-kk/strings.xml b/pdf/pdf-viewer/src/main/res/values-kk/strings.xml
index 4fec50e..2806893 100644
--- a/pdf/pdf-viewer/src/main/res/values-kk/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-kk/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Сәйкес нәтижелер табылмады."</string>
<string name="action_edit" msgid="5882082700509010966">"Файлды өңдеу"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Файлды іздеу"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Жылжыту жолағы"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Құлыпты ашу үшін құпия сөзді енгізіңіз."</string>
<string name="retry_button_text" msgid="3443862378337999137">"Қайталау"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF құжаты өңделмеді."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-km/strings.xml b/pdf/pdf-viewer/src/main/res/values-km/strings.xml
index 2a3fbf4..738de11 100644
--- a/pdf/pdf-viewer/src/main/res/values-km/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-km/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> នៃ <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"គ្មានលទ្ធផលត្រូវគ្នាទេ"</string>
<string name="action_edit" msgid="5882082700509010966">"កែឯកសារ"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"ស្វែងរកឯកសារ"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"របាររមូរ"</string>
<string name="password_not_entered" msgid="8875370870743585303">"បញ្ចូលពាក្យសម្ងាត់ ដើម្បីដោះសោ"</string>
<string name="retry_button_text" msgid="3443862378337999137">"ព្យាយាមម្ដងទៀត"</string>
<string name="pdf_error" msgid="3287950599604474450">"មិនអាចដំណើរការឯកសារ PDF បានទេ!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-kn/strings.xml b/pdf/pdf-viewer/src/main/res/values-kn/strings.xml
index 3ec09eb..d10e9b3e 100644
--- a/pdf/pdf-viewer/src/main/res/values-kn/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-kn/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g> ರಲ್ಲಿ <xliff:g id="POSITION">%1$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"ಯಾವುದೇ ಹೊಂದಾಣಿಕೆಯ ಫಲಿತಾಂಶಗಳಿಲ್ಲ"</string>
<string name="action_edit" msgid="5882082700509010966">"ಫೈಲ್ ಎಡಿಟ್ ಮಾಡಿ"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"ಫೈಲ್ ಅನ್ನು ಹುಡುಕಿ"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"ಸ್ಕ್ರಾಲ್ಬಾರ್"</string>
<string name="password_not_entered" msgid="8875370870743585303">"ಅನ್ಲಾಕ್ ಮಾಡಲು ಪಾಸವರ್ಡ್ ಅನ್ನು ನಮೂದಿಸಿ"</string>
<string name="retry_button_text" msgid="3443862378337999137">"ಪುನಃ ಪ್ರಯತ್ನಿಸಿ"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF ಡಾಕ್ಯುಮೆಂಟ್ ಅನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ವಿಫಲವಾಗಿದೆ!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ko/strings.xml b/pdf/pdf-viewer/src/main/res/values-ko/strings.xml
index a5d7657..2e8e44b 100644
--- a/pdf/pdf-viewer/src/main/res/values-ko/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ko/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"일치하는 결과 없음"</string>
<string name="action_edit" msgid="5882082700509010966">"파일 수정"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"파일 검색"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"스크롤바"</string>
<string name="password_not_entered" msgid="8875370870743585303">"잠금 해제하려면 비밀번호 입력"</string>
<string name="retry_button_text" msgid="3443862378337999137">"재시도"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF 문서를 처리할 수 없습니다."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ky/strings.xml b/pdf/pdf-viewer/src/main/res/values-ky/strings.xml
index 27b2b2e..fe3fcfd 100644
--- a/pdf/pdf-viewer/src/main/res/values-ky/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ky/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g> ичинен <xliff:g id="POSITION">%1$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Эч нерсе табылган жок"</string>
<string name="action_edit" msgid="5882082700509010966">"Файлды түзөтүү"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Файл издөө"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Сыдыруу тилкеси"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Кулпусун ачуу үчүн сырсөздү териңиз"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Кайталоо"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF документи иштетилген жок."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-lo/strings.xml b/pdf/pdf-viewer/src/main/res/values-lo/strings.xml
index 8e87d25..3a3bee3 100644
--- a/pdf/pdf-viewer/src/main/res/values-lo/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-lo/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> ຈາກທັງໝົດ <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"ບໍ່ມີຜົນໄດ້ຮັບທີ່ກົງກັນ"</string>
<string name="action_edit" msgid="5882082700509010966">"ແກ້ໄຂໄຟລ໌"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"ຊອກຫາໄຟລ໌"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"ແຖບເລື່ອນ"</string>
<string name="password_not_entered" msgid="8875370870743585303">"ໃສ່ລະຫັດເພື່ອປົດລັອກ"</string>
<string name="retry_button_text" msgid="3443862378337999137">"ລອງໃໝ່"</string>
<string name="pdf_error" msgid="3287950599604474450">"ປະມວນຜົນເອກະສານ PDF ບໍ່ສຳເລັດ!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-lt/strings.xml b/pdf/pdf-viewer/src/main/res/values-lt/strings.xml
index bef118f..b8d14c1 100644
--- a/pdf/pdf-viewer/src/main/res/values-lt/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-lt/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> iš <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Atitikusių rezultatų nerasta"</string>
<string name="action_edit" msgid="5882082700509010966">"Redaguoti failą"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Ieškoti failo"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Slinkties juosta"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Įveskite slaptažodį, kad atrakintumėte"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Bandyti dar kartą"</string>
<string name="pdf_error" msgid="3287950599604474450">"Nepavyko apdoroti PDF dokumento!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-lv/strings.xml b/pdf/pdf-viewer/src/main/res/values-lv/strings.xml
index a505bb5..78627b9 100644
--- a/pdf/pdf-viewer/src/main/res/values-lv/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-lv/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"numur <xliff:g id="POSITION">%1$d</xliff:g>, kopējais skaits ir <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Nav atbilstošu rezultātu."</string>
<string name="action_edit" msgid="5882082700509010966">"Rediģēt failu"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Meklēt failu"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Ritjosla"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Lai atbloķētu, ievadiet paroli."</string>
<string name="retry_button_text" msgid="3443862378337999137">"Mēģināt vēlreiz"</string>
<string name="pdf_error" msgid="3287950599604474450">"Neizdevās apstrādāt PDF dokumentu."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-mk/strings.xml b/pdf/pdf-viewer/src/main/res/values-mk/strings.xml
index 8beedf2..4dff3bb 100644
--- a/pdf/pdf-viewer/src/main/res/values-mk/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-mk/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> од <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Нема резултати што се совпаѓаат"</string>
<string name="action_edit" msgid="5882082700509010966">"Изменете ја датотеката"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Пребарувај датотеки"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Лента за лизгање"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Внесете лозинка за да отклучите"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Обидете се пoвторно"</string>
<string name="pdf_error" msgid="3287950599604474450">"Не можеше да се обработи PDF-документот!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ml/strings.xml b/pdf/pdf-viewer/src/main/res/values-ml/strings.xml
index e7cedf6..b2236c3 100644
--- a/pdf/pdf-viewer/src/main/res/values-ml/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ml/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g>-ൽ <xliff:g id="POSITION">%1$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"പൊരുത്തപ്പെടുന്ന ഫലങ്ങളൊന്നുമില്ല"</string>
<string name="action_edit" msgid="5882082700509010966">"ഫയൽ എഡിറ്റ് ചെയ്യുക"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"ഫയൽ തിരയുക"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"സ്ക്രോൾബാർ"</string>
<string name="password_not_entered" msgid="8875370870743585303">"അൺലോക്ക് ചെയ്യാൻ പാസ്വേഡ് നൽകുക"</string>
<string name="retry_button_text" msgid="3443862378337999137">"വീണ്ടും ശ്രമിക്കുക"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF ഡോക്യുമെന്റ് പ്രോസസ് ചെയ്യാനായില്ല!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-mn/strings.xml b/pdf/pdf-viewer/src/main/res/values-mn/strings.xml
index efdc55b..384ea73 100644
--- a/pdf/pdf-viewer/src/main/res/values-mn/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-mn/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g>-н <xliff:g id="POSITION">%1$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Ямар ч тохирох илэрц байхгүй"</string>
<string name="action_edit" msgid="5882082700509010966">"Файлыг засах"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Файлаас хайх"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Гүйлгэгч"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Түгжээг тайлахын тулд нууц үг оруулна уу"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Дахин оролдох"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF баримт бичгийг боловсруулж чадсангүй!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-mr/strings.xml b/pdf/pdf-viewer/src/main/res/values-mr/strings.xml
index 80fd8db..27e5a18 100644
--- a/pdf/pdf-viewer/src/main/res/values-mr/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-mr/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g> पैकी <xliff:g id="POSITION">%1$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"कोणतेही जुळणारे परिणाम नाहीत"</string>
<string name="action_edit" msgid="5882082700509010966">"फाइल संपादित करा"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"फाइल शोधा"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"स्क्रोलबार"</string>
<string name="password_not_entered" msgid="8875370870743585303">"अनलॉक करण्यासाठी पासवर्ड एंटर करा"</string>
<string name="retry_button_text" msgid="3443862378337999137">"पुन्हा प्रयत्न करा"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF दस्तऐवजावर प्रक्रिया करता आली नाही!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ms/strings.xml b/pdf/pdf-viewer/src/main/res/values-ms/strings.xml
index 9b02c62..4b9c099 100644
--- a/pdf/pdf-viewer/src/main/res/values-ms/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ms/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> daripada <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Tiada hasil carian yang sepadan"</string>
<string name="action_edit" msgid="5882082700509010966">"Edit fail"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Cari fail"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Bar tatal"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Masukkan kata laluan untuk membuka kunci"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Cuba lagi"</string>
<string name="pdf_error" msgid="3287950599604474450">"Gagal memproses dokumen PDF!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-my/strings.xml b/pdf/pdf-viewer/src/main/res/values-my/strings.xml
index 19f625c..e0f6586 100644
--- a/pdf/pdf-viewer/src/main/res/values-my/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-my/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g> အနက် <xliff:g id="POSITION">%1$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"ကိုက်ညီသောရလဒ် မရှိပါ"</string>
<string name="action_edit" msgid="5882082700509010966">"ဖိုင် တည်းဖြတ်ရန်"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"ဖိုင်ရှာရန်"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"လှိမ့်ဘား"</string>
<string name="password_not_entered" msgid="8875370870743585303">"ဖွင့်ရန် စကားဝှက်ထည့်ပါ"</string>
<string name="retry_button_text" msgid="3443862378337999137">"ထပ်စမ်းရန်"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF မှတ်တမ်း လုပ်ဆောင်၍မရလိုက်ပါ။"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-nb/strings.xml b/pdf/pdf-viewer/src/main/res/values-nb/strings.xml
index 2bac600..fe27e60 100644
--- a/pdf/pdf-viewer/src/main/res/values-nb/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-nb/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> av <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Ingen treff"</string>
<string name="action_edit" msgid="5882082700509010966">"Endre filen"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Søk i filen"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Rullefelt"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Skriv inn passordet for å låse opp"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Prøv på nytt"</string>
<string name="pdf_error" msgid="3287950599604474450">"Kunne ikke behandle PDF-dokumentet"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ne/strings.xml b/pdf/pdf-viewer/src/main/res/values-ne/strings.xml
index 997e9a1..1ee8978 100644
--- a/pdf/pdf-viewer/src/main/res/values-ne/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ne/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g> मध्ये <xliff:g id="POSITION">%1$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"कुनै पनि मिल्दोजुल्दो परिणाम भेटिएन"</string>
<string name="action_edit" msgid="5882082700509010966">"फाइल सम्पादन गर्नुहोस्"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"फाइल खोज्नुहोस्"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"स्क्रोल बार"</string>
<string name="password_not_entered" msgid="8875370870743585303">"अनलक गर्न पासवर्ड हाल्नुहोस्"</string>
<string name="retry_button_text" msgid="3443862378337999137">"फेरि प्रयास गर्नुहोस्"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF डकुमेन्ट प्रोसेस गर्न सकिएन!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-nl/strings.xml b/pdf/pdf-viewer/src/main/res/values-nl/strings.xml
index 841f887..454b2df 100644
--- a/pdf/pdf-viewer/src/main/res/values-nl/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-nl/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> van <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Geen overeenkomende resultaten"</string>
<string name="action_edit" msgid="5882082700509010966">"Bestand bewerken"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Bestand doorzoeken"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Scrollbar"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Voer het wachtwoord in om te ontgrendelen"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Opnieuw proberen"</string>
<string name="pdf_error" msgid="3287950599604474450">"Kan het pdf-document niet verwerken"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-or/strings.xml b/pdf/pdf-viewer/src/main/res/values-or/strings.xml
index 09c03ee..e88085f 100644
--- a/pdf/pdf-viewer/src/main/res/values-or/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-or/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g>ର <xliff:g id="POSITION">%1$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"ମେଳ ହେଉଥିବା କୌଣସି ଫଳାଫଳ ନାହିଁ"</string>
<string name="action_edit" msgid="5882082700509010966">"ଫାଇଲକୁ ଏଡିଟ କରନ୍ତୁ"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"ଫାଇଲ ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"ସ୍କ୍ରୋଲବାର"</string>
<string name="password_not_entered" msgid="8875370870743585303">"ଅନଲକ କରିବା ପାଇଁ ପାସୱାର୍ଡ ଲେଖନ୍ତୁ"</string>
<string name="retry_button_text" msgid="3443862378337999137">"ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF ଡକ୍ୟୁମେଣ୍ଟକୁ ପ୍ରକ୍ୱିୟାନ୍ୱିତ କରିବାରେ ବିଫଳ ହୋଇଛି!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-pa/strings.xml b/pdf/pdf-viewer/src/main/res/values-pa/strings.xml
index 71b4098..6c4be6e 100644
--- a/pdf/pdf-viewer/src/main/res/values-pa/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-pa/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g> ਵਿੱਚੋਂ <xliff:g id="POSITION">%1$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"ਕੋਈ ਮੇਲ ਖਾਂਦਾ ਨਤੀਜਾ ਨਹੀਂ"</string>
<string name="action_edit" msgid="5882082700509010966">"ਫ਼ਾਈਲ ਦਾ ਸੰਪਾਦਨ ਕਰੋ"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"ਫ਼ਾਈਲ ਖੋਜੋ"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"ਸਕ੍ਰੋਲ ਬਾਰ"</string>
<string name="password_not_entered" msgid="8875370870743585303">"ਅਣਲਾਕ ਕਰਨ ਲਈ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ"</string>
<string name="retry_button_text" msgid="3443862378337999137">"ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰੋ"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF ਦਸਤਾਵੇਜ਼ \'ਤੇ ਪ੍ਰਕਿਰਿਆ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-pl/strings.xml b/pdf/pdf-viewer/src/main/res/values-pl/strings.xml
index f9eff9a..4d4937f 100644
--- a/pdf/pdf-viewer/src/main/res/values-pl/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-pl/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> z <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Brak pasujących wyników"</string>
<string name="action_edit" msgid="5882082700509010966">"Edytuj plik"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Wyszukaj plik"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Pasek przewijania"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Podaj hasło, aby odblokować"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Spróbuj jeszcze raz"</string>
<string name="pdf_error" msgid="3287950599604474450">"Nie udało się przetworzyć dokumentu PDF."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-pt-rBR/strings.xml b/pdf/pdf-viewer/src/main/res/values-pt-rBR/strings.xml
index 0e4c04d..4eda3cd 100644
--- a/pdf/pdf-viewer/src/main/res/values-pt-rBR/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-pt-rBR/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> de <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Nenhum resultado encontrado"</string>
<string name="action_edit" msgid="5882082700509010966">"Editar arquivo"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Pesquisar no arquivo"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Barra de rolagem"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Digite a senha para desbloquear"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Tentar de novo"</string>
<string name="pdf_error" msgid="3287950599604474450">"Falha no processamento do documento PDF"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-pt-rPT/strings.xml b/pdf/pdf-viewer/src/main/res/values-pt-rPT/strings.xml
index 18081de..7b5d664 100644
--- a/pdf/pdf-viewer/src/main/res/values-pt-rPT/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-pt-rPT/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> de <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Sem resultados correspondentes"</string>
<string name="action_edit" msgid="5882082700509010966">"Editar ficheiro"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Pesquisar ficheiro"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Barra de deslocamento"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Introduza a palavra-passe para desbloquear"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Tentar novamente"</string>
<string name="pdf_error" msgid="3287950599604474450">"Falha ao processar o documento PDF!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-pt/strings.xml b/pdf/pdf-viewer/src/main/res/values-pt/strings.xml
index 0e4c04d..4eda3cd 100644
--- a/pdf/pdf-viewer/src/main/res/values-pt/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-pt/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> de <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Nenhum resultado encontrado"</string>
<string name="action_edit" msgid="5882082700509010966">"Editar arquivo"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Pesquisar no arquivo"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Barra de rolagem"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Digite a senha para desbloquear"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Tentar de novo"</string>
<string name="pdf_error" msgid="3287950599604474450">"Falha no processamento do documento PDF"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ro/strings.xml b/pdf/pdf-viewer/src/main/res/values-ro/strings.xml
index d3f7a36..7ed5c68 100644
--- a/pdf/pdf-viewer/src/main/res/values-ro/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ro/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> din <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Niciun rezultat"</string>
<string name="action_edit" msgid="5882082700509010966">"Editează fișierul"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Caută fișierul"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Bară de derulare"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Introdu parola pentru a debloca"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Reîncearcă"</string>
<string name="pdf_error" msgid="3287950599604474450">"Nu s-a putut procesa documentul PDF!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ru/strings.xml b/pdf/pdf-viewer/src/main/res/values-ru/strings.xml
index 6734347..0921947 100644
--- a/pdf/pdf-viewer/src/main/res/values-ru/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ru/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> из <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Ничего не найдено."</string>
<string name="action_edit" msgid="5882082700509010966">"Редактировать файл"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Найти файл"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Полоса прокрутки"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Введите пароль для разблокировки."</string>
<string name="retry_button_text" msgid="3443862378337999137">"Повторить попытку"</string>
<string name="pdf_error" msgid="3287950599604474450">"Не удалось обработать документ PDF"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-si/strings.xml b/pdf/pdf-viewer/src/main/res/values-si/strings.xml
index bd4fdc7..d72aa11 100644
--- a/pdf/pdf-viewer/src/main/res/values-si/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-si/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g>න් <xliff:g id="POSITION">%1$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"ගැළපෙන ප්රතිඵල නැත"</string>
<string name="action_edit" msgid="5882082700509010966">"ගොනුව සංස්කරණ කරන්න"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"සෙවීම් ගොනුව"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"අනුචලන තීරුව"</string>
<string name="password_not_entered" msgid="8875370870743585303">"අගුලු හැරීමට මුරපදය ඇතුළත් කරන්න"</string>
<string name="retry_button_text" msgid="3443862378337999137">"යළි උත්සාහ කරන්න"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF ලේඛනය සැකසීමට අසමත් විය!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-sk/strings.xml b/pdf/pdf-viewer/src/main/res/values-sk/strings.xml
index 4458e20..7978936 100644
--- a/pdf/pdf-viewer/src/main/res/values-sk/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-sk/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> z <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Žiadne zodpovedajúce výsledky"</string>
<string name="action_edit" msgid="5882082700509010966">"Upraviť súbor"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Vyhľadať súbor"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Posúvač"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Zadajte heslo na odomknutie"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Skúsiť znova"</string>
<string name="pdf_error" msgid="3287950599604474450">"Dokument vo formáte PDF sa nepodarilo spracovať."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-sl/strings.xml b/pdf/pdf-viewer/src/main/res/values-sl/strings.xml
index d23cae0..3723865 100644
--- a/pdf/pdf-viewer/src/main/res/values-sl/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-sl/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> od <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Ni ustreznih rezultatov"</string>
<string name="action_edit" msgid="5882082700509010966">"Urejanje datoteke"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Iskanje po datoteki"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Drsni trak"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Vnesite geslo za odklepanje"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Poskusi znova"</string>
<string name="pdf_error" msgid="3287950599604474450">"Obdelava dokumenta PDF ni uspela."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-sq/strings.xml b/pdf/pdf-viewer/src/main/res/values-sq/strings.xml
index 5c02c72..ac85bd2 100644
--- a/pdf/pdf-viewer/src/main/res/values-sq/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-sq/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> nga <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Nuk përputhet asnjë rezultat"</string>
<string name="action_edit" msgid="5882082700509010966">"Modifiko skedarin"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Kërko në skedar"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Shiriti i lëvizjes"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Fut fjalëkalimin për ta shkyçur"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Riprovo"</string>
<string name="pdf_error" msgid="3287950599604474450">"Përpunimi i dokumentit PDF dështoi"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-sr/strings.xml b/pdf/pdf-viewer/src/main/res/values-sr/strings.xml
index 6669a2a..2dc9aee5 100644
--- a/pdf/pdf-viewer/src/main/res/values-sr/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-sr/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> од <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Нема подударних резултата"</string>
<string name="action_edit" msgid="5882082700509010966">"Измени фајл"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Претражи фајл"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Трака за скроловање"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Унесите лозинку за откључавање"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Пробај поново"</string>
<string name="pdf_error" msgid="3287950599604474450">"Обрада PDF документа није успела."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-sv/strings.xml b/pdf/pdf-viewer/src/main/res/values-sv/strings.xml
index 6d1b22a..9768715 100644
--- a/pdf/pdf-viewer/src/main/res/values-sv/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-sv/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> av <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Det finns inga matchande resultat"</string>
<string name="action_edit" msgid="5882082700509010966">"Redigera fil"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Sök i fil"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Scrollningslist"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Ange lösenord för att låsa upp"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Försök igen"</string>
<string name="pdf_error" msgid="3287950599604474450">"Det gick inte att bearbeta PDF-dokumentet"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-sw/strings.xml b/pdf/pdf-viewer/src/main/res/values-sw/strings.xml
index a667e4b..e3f5682 100644
--- a/pdf/pdf-viewer/src/main/res/values-sw/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-sw/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> kati ya <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Hakuna matokeo yanayolingana"</string>
<string name="action_edit" msgid="5882082700509010966">"Badilisha faili"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Tafuta faili"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Sehemu ya kusogeza"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Weka nenosiri ili ufungue"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Jaribu tena"</string>
<string name="pdf_error" msgid="3287950599604474450">"Imeshindwa kuchakata hati ya PDF!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ta/strings.xml b/pdf/pdf-viewer/src/main/res/values-ta/strings.xml
index 4d8e030..4352dd7 100644
--- a/pdf/pdf-viewer/src/main/res/values-ta/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ta/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"பொருந்தும் முடிவுகள் எதுவுமில்லை"</string>
<string name="action_edit" msgid="5882082700509010966">"ஃபைலைத் திருத்து"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"ஃபைலைத் தேடும்"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"ஸ்க்ரோல் பார்"</string>
<string name="password_not_entered" msgid="8875370870743585303">"அன்லாக் செய்ய கடவுச்சொல்லை டைப் செய்யவும்"</string>
<string name="retry_button_text" msgid="3443862378337999137">"மீண்டும் முயலுங்கள்"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF ஆவணத்தைச் செயலாக்க முடியவில்லை!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-te/strings.xml b/pdf/pdf-viewer/src/main/res/values-te/strings.xml
index 93a40f2..5e63dad 100644
--- a/pdf/pdf-viewer/src/main/res/values-te/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-te/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="TOTAL">%2$d</xliff:g>లో <xliff:g id="POSITION">%1$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"మ్యాచ్ అయ్యే ఫలితాలు ఏవీ లేవు"</string>
<string name="action_edit" msgid="5882082700509010966">"ఫైల్ను ఎడిట్ చేయండి"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"ఫైల్ను సెర్చ్ చేయండి"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"స్క్రోల్ బార్"</string>
<string name="password_not_entered" msgid="8875370870743585303">"అన్లాక్ చేయడానికి పాస్వర్డ్ను నమోదు చేయండి"</string>
<string name="retry_button_text" msgid="3443862378337999137">"మళ్లీ ట్రై చేయండి"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF డాక్యుమెంట్ను ప్రాసెస్ చేయడం విఫలమైంది!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-th/strings.xml b/pdf/pdf-viewer/src/main/res/values-th/strings.xml
index dc3da5a..521cd13 100644
--- a/pdf/pdf-viewer/src/main/res/values-th/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-th/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> จาก <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"ไม่มีผลลัพธ์ที่ตรงกัน"</string>
<string name="action_edit" msgid="5882082700509010966">"แก้ไขไฟล์"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"ค้นหาไฟล์"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"แถบเลื่อน"</string>
<string name="password_not_entered" msgid="8875370870743585303">"ป้อนรหัสผ่านเพื่อปลดล็อก"</string>
<string name="retry_button_text" msgid="3443862378337999137">"ลองอีกครั้ง"</string>
<string name="pdf_error" msgid="3287950599604474450">"ประมวลผลเอกสาร PDF ไม่สำเร็จ"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-tl/strings.xml b/pdf/pdf-viewer/src/main/res/values-tl/strings.xml
index 1a077e8..f10fa14 100644
--- a/pdf/pdf-viewer/src/main/res/values-tl/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-tl/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> sa <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Walang tumutugmang resulta"</string>
<string name="action_edit" msgid="5882082700509010966">"I-edit ang file"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Maghanap ng file"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Scrollbar"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Ilagay ang password para i-unlock"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Subukan ulit"</string>
<string name="pdf_error" msgid="3287950599604474450">"Hindi naproseso ang PDF na dokumento!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-tr/strings.xml b/pdf/pdf-viewer/src/main/res/values-tr/strings.xml
index 4ef25c3..60fed2c 100644
--- a/pdf/pdf-viewer/src/main/res/values-tr/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-tr/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Eşleşen sonuç yok"</string>
<string name="action_edit" msgid="5882082700509010966">"Dosyayı düzenle"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Dosya ara"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Kaydırma çubuğu"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Kilidi açmak için şifreyi girin"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Tekrar dene"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF dokümanı işlenemedi."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-uk/strings.xml b/pdf/pdf-viewer/src/main/res/values-uk/strings.xml
index 8774d93..d8e7b7f 100644
--- a/pdf/pdf-viewer/src/main/res/values-uk/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-uk/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> з <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Немає результатів"</string>
<string name="action_edit" msgid="5882082700509010966">"Редагувати файл"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Пошук файлу"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Смуга прокручування"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Введіть пароль, щоб розблокувати"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Повторити"</string>
<string name="pdf_error" msgid="3287950599604474450">"Не вдалось обробити документ PDF."</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-ur/strings.xml b/pdf/pdf-viewer/src/main/res/values-ur/strings.xml
index 9e3b4be..fe78124 100644
--- a/pdf/pdf-viewer/src/main/res/values-ur/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-ur/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> از <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"کوئی مماثل نتائج نہیں ہیں"</string>
<string name="action_edit" msgid="5882082700509010966">"فائل میں ترمیم کریں"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"فائل تلاش کریں"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"اسکرول بار"</string>
<string name="password_not_entered" msgid="8875370870743585303">"غیر مقفل کرنے کیلئے پاس ورڈ درج کریں"</string>
<string name="retry_button_text" msgid="3443862378337999137">"پھر کوشش کریں"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF دستاویز پر کارروائی کرنے میں ناکام!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-uz/strings.xml b/pdf/pdf-viewer/src/main/res/values-uz/strings.xml
index 65f2fa9..4820c65 100644
--- a/pdf/pdf-viewer/src/main/res/values-uz/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-uz/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> / <xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Mos keladigani topilmadi"</string>
<string name="action_edit" msgid="5882082700509010966">"Faylni tahrirlash"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Faylni qidirish"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Aylantirish yoʻli"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Ochish uchun parolni kiriting"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Qayta urinish"</string>
<string name="pdf_error" msgid="3287950599604474450">"PDF hujjat qayta ishlanmadi!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-vi/strings.xml b/pdf/pdf-viewer/src/main/res/values-vi/strings.xml
index 03ff8c5..a9f802a 100644
--- a/pdf/pdf-viewer/src/main/res/values-vi/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-vi/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Không có kết quả phù hợp"</string>
<string name="action_edit" msgid="5882082700509010966">"Chỉnh sửa tệp"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Tìm tệp"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Thanh cuộn"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Nhập mật khẩu để mở khoá"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Thử lại"</string>
<string name="pdf_error" msgid="3287950599604474450">"Không xử lý được tài liệu PDF này!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-zh-rCN/strings.xml b/pdf/pdf-viewer/src/main/res/values-zh-rCN/strings.xml
index fdbce8b..17c14af 100644
--- a/pdf/pdf-viewer/src/main/res/values-zh-rCN/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-zh-rCN/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"第 <xliff:g id="POSITION">%1$d</xliff:g> 个(共 <xliff:g id="TOTAL">%2$d</xliff:g> 个)"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"没有符合条件的结果"</string>
<string name="action_edit" msgid="5882082700509010966">"编辑文件"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"搜索文件"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"滚动条"</string>
<string name="password_not_entered" msgid="8875370870743585303">"请输入密码进行解锁"</string>
<string name="retry_button_text" msgid="3443862378337999137">"重试"</string>
<string name="pdf_error" msgid="3287950599604474450">"无法处理 PDF 文档!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-zh-rHK/strings.xml b/pdf/pdf-viewer/src/main/res/values-zh-rHK/strings.xml
index e503236..b3c3658 100644
--- a/pdf/pdf-viewer/src/main/res/values-zh-rHK/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-zh-rHK/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"第 <xliff:g id="POSITION">%1$d</xliff:g> 個,共 <xliff:g id="TOTAL">%2$d</xliff:g> 個"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"找不到相符的結果"</string>
<string name="action_edit" msgid="5882082700509010966">"編輯檔案"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"搵檔案"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"捲軸"</string>
<string name="password_not_entered" msgid="8875370870743585303">"輸入密碼即可解鎖"</string>
<string name="retry_button_text" msgid="3443862378337999137">"重試"</string>
<string name="pdf_error" msgid="3287950599604474450">"無法處理 PDF 文件!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-zh-rTW/strings.xml b/pdf/pdf-viewer/src/main/res/values-zh-rTW/strings.xml
index b6561b8..1e16247 100644
--- a/pdf/pdf-viewer/src/main/res/values-zh-rTW/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-zh-rTW/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"第 <xliff:g id="POSITION">%1$d</xliff:g> 個,共 <xliff:g id="TOTAL">%2$d</xliff:g> 個"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"找不到相符的結果"</string>
<string name="action_edit" msgid="5882082700509010966">"編輯檔案"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"搜尋檔案"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"捲軸"</string>
<string name="password_not_entered" msgid="8875370870743585303">"輸入密碼即可解鎖"</string>
<string name="retry_button_text" msgid="3443862378337999137">"重試"</string>
<string name="pdf_error" msgid="3287950599604474450">"無法處理此 PDF 文件!"</string>
diff --git a/pdf/pdf-viewer/src/main/res/values-zu/strings.xml b/pdf/pdf-viewer/src/main/res/values-zu/strings.xml
index 64c11c5..4492469 100644
--- a/pdf/pdf-viewer/src/main/res/values-zu/strings.xml
+++ b/pdf/pdf-viewer/src/main/res/values-zu/strings.xml
@@ -50,10 +50,8 @@
<string name="match_status_description" msgid="4996847358326345288">"<xliff:g id="POSITION">%1$d</xliff:g> ku-<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="message_no_match_status" msgid="5929387004361286433">"Ayikho imiphumela efanayo"</string>
<string name="action_edit" msgid="5882082700509010966">"Hlela ifayela"</string>
- <!-- no translation found for action_search (1044074359976464346) -->
- <skip />
- <!-- no translation found for scrollbar_description (5720892205323882483) -->
- <skip />
+ <string name="action_search" msgid="1044074359976464346">"Sesha ifayela"</string>
+ <string name="scrollbar_description" msgid="5720892205323882483">"Ibha yokuskrola"</string>
<string name="password_not_entered" msgid="8875370870743585303">"Faka iphasiwedi ukuvula"</string>
<string name="retry_button_text" msgid="3443862378337999137">"Zama futhi"</string>
<string name="pdf_error" msgid="3287950599604474450">"Yehlulekile ukucubungula idokhumenti ye-PDF!"</string>
diff --git a/samples/MediaRoutingDemo/build.gradle b/samples/MediaRoutingDemo/build.gradle
index d2974d8..7a56a07 100644
--- a/samples/MediaRoutingDemo/build.gradle
+++ b/samples/MediaRoutingDemo/build.gradle
@@ -11,6 +11,7 @@
}
dependencies {
+ api(libs.jspecify)
implementation(project(":appcompat:appcompat"))
implementation(project(":mediarouter:mediarouter"))
implementation(project(":preference:preference"))
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/MyMediaRouteControllerDialog.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/MyMediaRouteControllerDialog.java
index 8051d4a7..0185867 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/MyMediaRouteControllerDialog.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/MyMediaRouteControllerDialog.java
@@ -22,9 +22,10 @@
import android.view.View;
import android.widget.TextView;
-import androidx.annotation.NonNull;
import androidx.mediarouter.app.MediaRouteControllerDialog;
+import org.jspecify.annotations.NonNull;
+
/**
* An example MediaRouteControllerDialog for demonstrating
* {@link androidx.mediarouter.app.MediaRouteControllerDialog#onCreateMediaControlView}.
@@ -34,9 +35,8 @@
super(context);
}
- @NonNull
@Override
- public View onCreateMediaControlView(@NonNull Bundle savedInstanceState) {
+ public @NonNull View onCreateMediaControlView(@NonNull Bundle savedInstanceState) {
TextView view = new TextView(getContext());
view.setText(R.string.my_media_control_text);
view.setBackgroundColor(Color.GRAY);
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/OverlayDisplayWindow.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/OverlayDisplayWindow.java
index 44d7985..f005665 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/OverlayDisplayWindow.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/OverlayDisplayWindow.java
@@ -37,8 +37,8 @@
import android.view.WindowManager;
import android.widget.TextView;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
/**
* Manages an overlay display window, used for simulating remote playback.
@@ -57,8 +57,7 @@
protected final int mWidth;
protected final int mHeight;
protected final int mGravity;
- @Nullable
- protected OverlayWindowListener mListener;
+ protected @Nullable OverlayWindowListener mListener;
protected OverlayDisplayWindow(@NonNull Context context, @NonNull String name, int width,
int height, int gravity) {
@@ -74,9 +73,8 @@
*
* @return the created overlay window.
*/
- @NonNull
- public static OverlayDisplayWindow create(@NonNull Context context, @NonNull String name,
- int width, int height, int gravity) {
+ public static @NonNull OverlayDisplayWindow create(@NonNull Context context,
+ @NonNull String name, int width, int height, int gravity) {
return new JellybeanMr1Impl(context, name, width, height, gravity);
}
@@ -84,8 +82,7 @@
mListener = listener;
}
- @NonNull
- public Context getContext() {
+ public @NonNull Context getContext() {
return mContext;
}
@@ -109,8 +106,7 @@
*
* @return a bitmap representing the snapshot of the window.
*/
- @Nullable
- public abstract Bitmap getSnapshot();
+ public abstract @Nullable Bitmap getSnapshot();
/**
* Watches for significant changes in the overlay display window lifecycle.
@@ -214,9 +210,8 @@
relayout();
}
- @NonNull
@Override
- public Bitmap getSnapshot() {
+ public @NonNull Bitmap getSnapshot() {
return mTextureView.getBitmap();
}
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/RoutesManager.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/RoutesManager.java
index fff9c40..0cddd62 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/RoutesManager.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/RoutesManager.java
@@ -27,8 +27,6 @@
import android.content.Context;
import android.content.res.Resources;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.mediarouter.media.MediaRouter;
import androidx.mediarouter.media.MediaRouterParams;
import androidx.mediarouter.media.RouteListingPreference;
@@ -36,6 +34,9 @@
import com.example.androidx.mediarouting.activities.MainActivity;
import com.example.androidx.mediarouting.data.RouteItem;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -72,8 +73,7 @@
}
/** Singleton method. */
- @NonNull
- public static RoutesManager getInstance(@NonNull Context context) {
+ public static @NonNull RoutesManager getInstance(@NonNull Context context) {
synchronized (RoutesManager.class) {
if (sInstance == null) {
sInstance = new RoutesManager(context);
@@ -82,8 +82,7 @@
return sInstance;
}
- @NonNull
- public List<RouteItem> getRouteItems() {
+ public @NonNull List<RouteItem> getRouteItems() {
return new ArrayList<>(mRouteItems.values());
}
@@ -114,8 +113,7 @@
* @param id of the route to search for.
* @return the route with the passed id, or null if it does not exist.
*/
- @Nullable
- public RouteItem getRouteWithId(@Nullable String id) {
+ public @Nullable RouteItem getRouteWithId(@Nullable String id) {
return mRouteItems.get(id);
}
@@ -172,8 +170,7 @@
* The current list of route listing preference items, as set via {@link
* #setRouteListingPreferenceItems}.
*/
- @NonNull
- public List<RouteListingPreferenceItemHolder> getRouteListingPreferenceItems() {
+ public @NonNull List<RouteListingPreferenceItemHolder> getRouteListingPreferenceItems() {
return mRouteListingPreferenceItems;
}
@@ -338,19 +335,18 @@
*/
public static final class RouteListingPreferenceItemHolder {
- @NonNull public final RouteListingPreference.Item mItem;
- @NonNull public final String mRouteName;
+ public final RouteListingPreference.@NonNull Item mItem;
+ public final @NonNull String mRouteName;
public RouteListingPreferenceItemHolder(
- @NonNull RouteListingPreference.Item item, @NonNull String routeName) {
+ RouteListingPreference.@NonNull Item item, @NonNull String routeName) {
mItem = item;
mRouteName = routeName;
}
/** Returns the name of the corresponding route. */
@Override
- @NonNull
- public String toString() {
+ public @NonNull String toString() {
return mRouteName;
}
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/AddEditRouteActivity.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/AddEditRouteActivity.java
index cb1f13b..d01b97d 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/AddEditRouteActivity.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/AddEditRouteActivity.java
@@ -30,8 +30,6 @@
import android.widget.EditText;
import android.widget.Switch;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.util.Consumer;
@@ -40,11 +38,14 @@
import com.example.androidx.mediarouting.data.RouteItem;
import com.example.androidx.mediarouting.services.SampleDynamicGroupMediaRouteProviderService;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
/** Allows the user to add and edit routes. */
public class AddEditRouteActivity extends AppCompatActivity {
private static final String EXTRA_ROUTE_ID_KEY = "routeId";
- @Nullable private SampleDynamicGroupMediaRouteProviderService mService;
+ private @Nullable SampleDynamicGroupMediaRouteProviderService mService;
private ServiceConnection mConnection;
private RoutesManager mRoutesManager;
private RouteItem mRouteItem;
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/MainActivity.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/MainActivity.java
index c4e0ab4..8786631 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/MainActivity.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/MainActivity.java
@@ -47,8 +47,6 @@
import android.widget.TextView;
import android.widget.Toast;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
@@ -85,6 +83,9 @@
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.io.File;
import java.util.List;
@@ -318,9 +319,9 @@
if (mediaRouteActionProvider != null) {
mediaRouteActionProvider.setRouteSelector(mSelector);
mediaRouteActionProvider.setDialogFactory(new MediaRouteDialogFactory() {
- @NonNull
@Override
- public MediaRouteControllerDialogFragment onCreateControllerDialogFragment() {
+ public @NonNull MediaRouteControllerDialogFragment
+ onCreateControllerDialogFragment() {
return new ControllerDialogFragment(MainActivity.this,
mUseDefaultControlCheckBox);
}
@@ -545,8 +546,7 @@
mSeekBar.setEnabled(item != null && item.getDuration() > 0);
}
- @Nullable
- private PlaylistItem getCheckedPlaylistItem() {
+ private @Nullable PlaylistItem getCheckedPlaylistItem() {
int count = mPlayListView.getCount();
int index = mPlayListView.getCheckedItemPosition();
if (count > 0) {
@@ -564,8 +564,7 @@
? 0 : (SystemClock.elapsedRealtime() - item.getTimestamp()));
}
- @NonNull
- private MediaRouterParams getRouterParams() {
+ private @NonNull MediaRouterParams getRouterParams() {
MediaRouterParams.Builder routerParams =
new MediaRouterParams.Builder()
.setDialogType(MediaRouterParams.DIALOG_TYPE_DEFAULT)
@@ -592,13 +591,12 @@
public static final class DiscoveryFragment extends MediaRouteDiscoveryFragment {
private MediaRouter.Callback mCallback;
- public void setCallback(@Nullable MediaRouter.Callback cb) {
+ public void setCallback(MediaRouter.@Nullable Callback cb) {
mCallback = cb;
}
- @Nullable
@Override
- public MediaRouter.Callback onCreateCallback() {
+ public MediaRouter.@Nullable Callback onCreateCallback() {
return mCallback;
}
@@ -761,9 +759,8 @@
mUseDefaultControlCheckBox = customControlViewCheckBox;
}
- @NonNull
@Override
- public MediaRouteControllerDialog onCreateControllerDialog(
+ public @NonNull MediaRouteControllerDialog onCreateControllerDialog(
@NonNull Context context, @Nullable Bundle savedInstanceState) {
mMainActivity.updateStatusFromSessionManager();
mControllerDialog =
@@ -818,9 +815,8 @@
@RequiresApi(30)
private class TransferListener implements MediaRouter.OnPrepareTransferListener {
- @Nullable
@Override
- public ListenableFuture<Void> onPrepareTransfer(@NonNull RouteInfo fromRoute,
+ public @Nullable ListenableFuture<Void> onPrepareTransfer(@NonNull RouteInfo fromRoute,
@NonNull RouteInfo toRoute) {
Log.d(TAG, "onPrepareTransfer: from=" + fromRoute.getId()
+ ", to=" + toRoute.getId());
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/RouteListingPreferenceActivity.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/RouteListingPreferenceActivity.java
index 94ac61d..56efb701 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/RouteListingPreferenceActivity.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/RouteListingPreferenceActivity.java
@@ -35,8 +35,6 @@
import android.widget.TextView;
import android.widget.Toast;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.MenuItemCompat;
@@ -57,6 +55,9 @@
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.common.collect.ImmutableList;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
@@ -280,8 +281,8 @@
mRoutesManager.setRouteListingPreferenceItems(newRouteListingPreference);
}
- @NonNull
- private ImmutableList<MediaRouter.RouteInfo> getRoutesWithNoAssociatedListingPreferenceItem() {
+ private @NonNull ImmutableList<MediaRouter.RouteInfo>
+ getRoutesWithNoAssociatedListingPreferenceItem() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
return ImmutableList.of();
}
@@ -319,8 +320,8 @@
@Override
public boolean onMove(
@NonNull RecyclerView recyclerView,
- @NonNull RecyclerView.ViewHolder origin,
- @NonNull RecyclerView.ViewHolder target) {
+ RecyclerView.@NonNull ViewHolder origin,
+ RecyclerView.@NonNull ViewHolder target) {
int fromPosition = origin.getBindingAdapterPosition();
int toPosition = target.getBindingAdapterPosition();
if (mDraggingFromPosition == INDEX_UNSET) {
@@ -334,7 +335,7 @@
}
@Override
- public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
+ public void onSwiped(RecyclerView.@NonNull ViewHolder viewHolder, int direction) {
ArrayList<RouteListingPreferenceItemHolder> newRouteListingPreference =
new ArrayList<>(mRoutesManager.getRouteListingPreferenceItems());
int itemPosition = viewHolder.getBindingAdapterPosition();
@@ -345,7 +346,7 @@
@Override
public void clearView(
- @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
+ @NonNull RecyclerView recyclerView, RecyclerView.@NonNull ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
if (mDraggingFromPosition != INDEX_UNSET) {
ArrayList<RouteListingPreferenceItemHolder> newRouteListingPreference =
@@ -362,9 +363,8 @@
private class RouteListingPreferenceRecyclerViewAdapter
extends RecyclerView.Adapter<RecyclerViewItemViewHolder> {
- @NonNull
@Override
- public RecyclerViewItemViewHolder onCreateViewHolder(
+ public @NonNull RecyclerViewItemViewHolder onCreateViewHolder(
@NonNull ViewGroup parent, int viewType) {
TextView textView =
(TextView)
@@ -421,9 +421,8 @@
mHumanReadableString = humanReadableString;
}
- @NonNull
@Override
- public String toString() {
+ public @NonNull String toString() {
return mHumanReadableString;
}
@@ -460,16 +459,15 @@
RouteListingPreference.Item.SUBTEXT_CUSTOM, "Custom text (placeholder value)");
public final int mConstant;
- @NonNull public final String mHumanReadableString;
+ public final @NonNull String mHumanReadableString;
RouteListingPreferenceItemSubtext(int constant, @NonNull String humanReadableString) {
mConstant = constant;
mHumanReadableString = humanReadableString;
}
- @NonNull
@Override
- public String toString() {
+ public @NonNull String toString() {
return mHumanReadableString;
}
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/SettingsActivity.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/SettingsActivity.java
index 34621c4..9ac8a2b 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/SettingsActivity.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/SettingsActivity.java
@@ -31,8 +31,6 @@
import android.widget.Spinner;
import android.widget.Switch;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatButton;
import androidx.mediarouter.media.MediaRouter;
@@ -47,6 +45,9 @@
import com.example.androidx.mediarouting.ui.RoutesAdapter;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
/**
* Allows the user to control dialog types, enabling or disabling Dynamic Groups, enabling or
* disabling transfer to local and customize the routes exposed by {@link
@@ -247,7 +248,7 @@
private static class ProviderServiceConnection implements ServiceConnection {
- @Nullable private SampleDynamicGroupMediaRouteProviderService mService;
+ private @Nullable SampleDynamicGroupMediaRouteProviderService mService;
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/SettingsPreferenceFragment.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/SettingsPreferenceFragment.java
index 8f2fbb0..a42933c 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/SettingsPreferenceFragment.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/SettingsPreferenceFragment.java
@@ -20,14 +20,15 @@
import android.content.SharedPreferences;
import android.os.Bundle;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceManager;
import com.example.androidx.mediarouting.R;
import com.example.androidx.mediarouting.util.Utils;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
/** The preference fragment to show the switch settings. */
public class SettingsPreferenceFragment extends PreferenceFragmentCompat
implements SharedPreferences.OnSharedPreferenceChangeListener {
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRouteItem.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRouteItem.java
index 0f331cd..bb7b8b8 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRouteItem.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRouteItem.java
@@ -18,11 +18,11 @@
import android.text.TextUtils;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
import com.example.androidx.mediarouting.activities.systemrouting.source.SystemRoutesSource;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.util.Objects;
/** Holds information about a system route. */
@@ -50,24 +50,24 @@
}
/** The {@link SystemRoutesSource#getSourceId()} of the source that created this item. */
- @NonNull public final String mSourceId;
+ public final @NonNull String mSourceId;
/** An id that uniquely identifies this route item within the source. */
- @NonNull public final String mId;
+ public final @NonNull String mId;
- @NonNull public final String mName;
+ public final @NonNull String mName;
- @Nullable public final String mAddress;
+ public final @Nullable String mAddress;
- @Nullable public final String mDescription;
+ public final @Nullable String mDescription;
- @Nullable public final String mSuitabilityStatus;
+ public final @Nullable String mSuitabilityStatus;
- @Nullable public final Boolean mTransferInitiatedBySelf;
+ public final @Nullable Boolean mTransferInitiatedBySelf;
- @Nullable public final String mTransferReason;
+ public final @Nullable String mTransferReason;
- @NonNull public final SelectionSupportState mSelectionSupportState;
+ public final @NonNull SelectionSupportState mSelectionSupportState;
private SystemRouteItem(@NonNull Builder builder) {
mSourceId = Objects.requireNonNull(builder.mSourceId);
@@ -116,15 +116,15 @@
*/
public static final class Builder {
- @NonNull private String mSourceId;
- @NonNull private final String mId;
- @NonNull private String mName;
- @Nullable private String mAddress;
- @Nullable private String mDescription;
- @Nullable private String mSuitabilityStatus;
- @Nullable private Boolean mTransferInitiatedBySelf;
- @Nullable private String mTransferReason;
- @NonNull public SelectionSupportState mSelectionSupportState;
+ private @NonNull String mSourceId;
+ private final @NonNull String mId;
+ private @NonNull String mName;
+ private @Nullable String mAddress;
+ private @Nullable String mDescription;
+ private @Nullable String mSuitabilityStatus;
+ private @Nullable Boolean mTransferInitiatedBySelf;
+ private @Nullable String mTransferReason;
+ public @NonNull SelectionSupportState mSelectionSupportState;
/**
* Creates a builder with the mandatory properties.
@@ -141,8 +141,7 @@
/**
* Sets a route name.
*/
- @NonNull
- public Builder setName(@NonNull String name) {
+ public @NonNull Builder setName(@NonNull String name) {
mName = name;
return this;
}
@@ -150,8 +149,7 @@
/**
* Sets an address for the route.
*/
- @NonNull
- public Builder setAddress(@NonNull String address) {
+ public @NonNull Builder setAddress(@NonNull String address) {
if (!TextUtils.isEmpty(address)) {
mAddress = address;
}
@@ -161,8 +159,7 @@
/**
* Sets a description for the route.
*/
- @NonNull
- public Builder setDescription(@NonNull String description) {
+ public @NonNull Builder setDescription(@NonNull String description) {
if (!TextUtils.isEmpty(description)) {
mDescription = description;
}
@@ -173,8 +170,7 @@
* Sets a human-readable string describing the transfer suitability of the route, or null if
* not applicable.
*/
- @NonNull
- public Builder setSuitabilityStatus(@Nullable String suitabilityStatus) {
+ public @NonNull Builder setSuitabilityStatus(@Nullable String suitabilityStatus) {
mSuitabilityStatus = suitabilityStatus;
return this;
}
@@ -183,8 +179,8 @@
* Sets whether the corresponding route's selection is the result of an action of this app,
* or null if not applicable.
*/
- @NonNull
- public Builder setTransferInitiatedBySelf(@Nullable Boolean transferInitiatedBySelf) {
+ public @NonNull Builder setTransferInitiatedBySelf(
+ @Nullable Boolean transferInitiatedBySelf) {
mTransferInitiatedBySelf = transferInitiatedBySelf;
return this;
}
@@ -192,15 +188,13 @@
/**
* Sets a human-readable string describing the transfer reason, or null if not applicable.
*/
- @NonNull
- public Builder setTransferReason(@Nullable String transferReason) {
+ public @NonNull Builder setTransferReason(@Nullable String transferReason) {
mTransferReason = transferReason;
return this;
}
/** Sets the {@link SelectionSupportState} for the corresponding route. */
- @NonNull
- public Builder setSelectionSupportState(
+ public @NonNull Builder setSelectionSupportState(
@NonNull SelectionSupportState selectionSupportState) {
mSelectionSupportState = Objects.requireNonNull(selectionSupportState);
return this;
@@ -209,8 +203,7 @@
/**
* Builds {@link SystemRouteItem}.
*/
- @NonNull
- public SystemRouteItem build() {
+ public @NonNull SystemRouteItem build() {
return new SystemRouteItem(this);
}
}
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutesAdapter.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutesAdapter.java
index 764c050..22b6c57 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutesAdapter.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutesAdapter.java
@@ -26,8 +26,6 @@
import android.view.ViewGroup;
import android.widget.TextView;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatButton;
import androidx.appcompat.widget.AppCompatTextView;
import androidx.core.util.Consumer;
@@ -37,6 +35,9 @@
import com.example.androidx.mediarouting.R;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.util.List;
/** {@link RecyclerView.Adapter} for showing system route sources and their corresponding routes. */
@@ -57,14 +58,13 @@
mListDiffer.submitList(newItems);
}
- @NonNull
- public List<SystemRoutesAdapterItem> getItems() {
+ public @NonNull List<SystemRoutesAdapterItem> getItems() {
return mListDiffer.getCurrentList();
}
- @NonNull
@Override
- public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ public RecyclerView.@NonNull ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
+ int viewType) {
Context context = parent.getContext();
if (viewType == VIEW_TYPE_HEADER) {
View view = LayoutInflater.from(context).inflate(R.layout.item_system_route_header,
@@ -78,7 +78,7 @@
}
@Override
- public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+ public void onBindViewHolder(RecyclerView.@NonNull ViewHolder holder, int position) {
SystemRoutesAdapterItem routeItem = getItems().get(position);
if (routeItem instanceof SystemRoutesSourceItem && holder instanceof HeaderViewHolder) {
((HeaderViewHolder) holder).bind((SystemRoutesSourceItem) routeItem);
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutesSourceItem.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutesSourceItem.java
index 9a5129e..9d97e01 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutesSourceItem.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutesSourceItem.java
@@ -18,7 +18,7 @@
import android.text.TextUtils;
-import androidx.annotation.NonNull;
+import org.jspecify.annotations.NonNull;
import java.util.Objects;
@@ -27,14 +27,13 @@
*/
public final class SystemRoutesSourceItem implements SystemRoutesAdapterItem {
- @NonNull private final String mName;
+ private final @NonNull String mName;
public SystemRoutesSourceItem(@NonNull String name) {
mName = name;
}
- @NonNull
- public String getSourceName() {
+ public @NonNull String getSourceName() {
return mName;
}
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutingActivity.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutingActivity.java
index 6f18b57..efde5a5 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutingActivity.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutingActivity.java
@@ -26,8 +26,6 @@
import android.os.Bundle;
import android.widget.Toast;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
@@ -43,6 +41,9 @@
import com.example.androidx.mediarouting.activities.systemrouting.source.MediaRouterSystemRoutesSource;
import com.example.androidx.mediarouting.activities.systemrouting.source.SystemRoutesSource;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -55,12 +56,11 @@
private static final int REQUEST_CODE_BLUETOOTH_CONNECT = 4199;
- @NonNull
- private final SystemRoutesAdapter mSystemRoutesAdapter =
+ private final @NonNull SystemRoutesAdapter mSystemRoutesAdapter =
new SystemRoutesAdapter(this::onRouteItemClicked);
- @NonNull private final Map<String, SystemRoutesSource> mSystemRoutesSources = new HashMap<>();
- @NonNull private SwipeRefreshLayout mSwipeRefreshLayout;
+ private final @NonNull Map<String, SystemRoutesSource> mSystemRoutesSources = new HashMap<>();
+ private @NonNull SwipeRefreshLayout mSwipeRefreshLayout;
/**
* Creates and launches an intent to start current activity.
@@ -101,8 +101,8 @@
}
@Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
- @NonNull int[] grantResults) {
+ public void onRequestPermissionsResult(int requestCode, String @NonNull [] permissions,
+ int @NonNull [] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE_BLUETOOTH_CONNECT
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AndroidXMediaRouterSystemRoutesSource.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AndroidXMediaRouterSystemRoutesSource.java
index d7763d0..ee3896b 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AndroidXMediaRouterSystemRoutesSource.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AndroidXMediaRouterSystemRoutesSource.java
@@ -18,7 +18,6 @@
import android.content.Context;
-import androidx.annotation.NonNull;
import androidx.mediarouter.media.MediaControlIntent;
import androidx.mediarouter.media.MediaRouteSelector;
import androidx.mediarouter.media.MediaRouter;
@@ -26,57 +25,56 @@
import com.example.androidx.mediarouting.activities.systemrouting.SystemRouteItem;
import com.example.androidx.mediarouting.activities.systemrouting.SystemRoutesSourceItem;
+import org.jspecify.annotations.NonNull;
+
import java.util.ArrayList;
import java.util.List;
/** Implements {@link SystemRoutesSource} using {@link MediaRouter}. */
public final class AndroidXMediaRouterSystemRoutesSource extends SystemRoutesSource {
- @NonNull
- private final MediaRouter mMediaRouter;
+ private final @NonNull MediaRouter mMediaRouter;
- @NonNull
- private final MediaRouter.Callback mMediaRouterCallback =
+ private final MediaRouter.@NonNull Callback mMediaRouterCallback =
new MediaRouter.Callback() {
@Override
public void onRouteAdded(
- @NonNull MediaRouter router, @NonNull MediaRouter.RouteInfo route) {
+ @NonNull MediaRouter router, MediaRouter.@NonNull RouteInfo route) {
mOnRoutesChangedListener.run();
}
@Override
public void onRouteRemoved(
- @NonNull MediaRouter router, @NonNull MediaRouter.RouteInfo route) {
+ @NonNull MediaRouter router, MediaRouter.@NonNull RouteInfo route) {
mOnRoutesChangedListener.run();
}
@Override
public void onRouteSelected(
@NonNull MediaRouter router,
- @NonNull MediaRouter.RouteInfo selectedRoute,
+ MediaRouter.@NonNull RouteInfo selectedRoute,
int reason,
- @NonNull MediaRouter.RouteInfo requestedRoute) {
+ MediaRouter.@NonNull RouteInfo requestedRoute) {
mOnRoutesChangedListener.run();
}
@Override
public void onRouteUnselected(
@NonNull MediaRouter router,
- @NonNull MediaRouter.RouteInfo route,
+ MediaRouter.@NonNull RouteInfo route,
int reason) {
mOnRoutesChangedListener.run();
}
@Override
public void onRouteChanged(
- @NonNull MediaRouter router, @NonNull MediaRouter.RouteInfo route) {
+ @NonNull MediaRouter router, MediaRouter.@NonNull RouteInfo route) {
mOnRoutesChangedListener.run();
}
};
/** Returns a new instance. */
- @NonNull
- public static AndroidXMediaRouterSystemRoutesSource create(@NonNull Context context) {
+ public static @NonNull AndroidXMediaRouterSystemRoutesSource create(@NonNull Context context) {
MediaRouter mediaRouter = MediaRouter.getInstance(context);
return new AndroidXMediaRouterSystemRoutesSource(mediaRouter);
}
@@ -100,15 +98,13 @@
mMediaRouter.removeCallback(mMediaRouterCallback);
}
- @NonNull
@Override
- public SystemRoutesSourceItem getSourceItem() {
+ public @NonNull SystemRoutesSourceItem getSourceItem() {
return new SystemRoutesSourceItem(/* name= */ "AndroidX MediaRouter");
}
- @NonNull
@Override
- public List<SystemRouteItem> fetchSourceRouteItems() {
+ public @NonNull List<SystemRouteItem> fetchSourceRouteItems() {
List<SystemRouteItem> out = new ArrayList<>();
for (MediaRouter.RouteInfo routeInfo : mMediaRouter.getRoutes()) {
@@ -133,8 +129,7 @@
return false;
}
- @NonNull
- private SystemRouteItem createRouteItemFor(@NonNull MediaRouter.RouteInfo routeInfo) {
+ private @NonNull SystemRouteItem createRouteItemFor(MediaRouter.@NonNull RouteInfo routeInfo) {
SystemRouteItem.Builder builder =
new SystemRouteItem.Builder(getSourceId(), routeInfo.getId())
.setName(routeInfo.getName());
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AudioManagerSystemRoutesSource.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AudioManagerSystemRoutesSource.java
index 9e7b67a..e3d708a 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AudioManagerSystemRoutesSource.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AudioManagerSystemRoutesSource.java
@@ -22,12 +22,13 @@
import android.media.AudioManager;
import android.os.Build;
-import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import com.example.androidx.mediarouting.activities.systemrouting.SystemRouteItem;
import com.example.androidx.mediarouting.activities.systemrouting.SystemRoutesSourceItem;
+import org.jspecify.annotations.NonNull;
+
import java.util.ArrayList;
import java.util.List;
@@ -35,11 +36,9 @@
@RequiresApi(Build.VERSION_CODES.M)
public final class AudioManagerSystemRoutesSource extends SystemRoutesSource {
- @NonNull
- private final AudioManager mAudioManager;
+ private final @NonNull AudioManager mAudioManager;
- @NonNull
- private final AudioDeviceCallback mAudioDeviceCallback =
+ private final @NonNull AudioDeviceCallback mAudioDeviceCallback =
new AudioDeviceCallback() {
@Override
public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
@@ -53,8 +52,7 @@
};
/** Returns a new instance. */
- @NonNull
- public static AudioManagerSystemRoutesSource create(@NonNull Context context) {
+ public static @NonNull AudioManagerSystemRoutesSource create(@NonNull Context context) {
AudioManager audioManager = context.getSystemService(AudioManager.class);
return new AudioManagerSystemRoutesSource(audioManager);
}
@@ -73,15 +71,13 @@
mAudioManager.unregisterAudioDeviceCallback(mAudioDeviceCallback);
}
- @NonNull
@Override
- public SystemRoutesSourceItem getSourceItem() {
+ public @NonNull SystemRoutesSourceItem getSourceItem() {
return new SystemRoutesSourceItem(/* name= */ "AudioManager");
}
- @NonNull
@Override
- public List<SystemRouteItem> fetchSourceRouteItems() {
+ public @NonNull List<SystemRouteItem> fetchSourceRouteItems() {
List<SystemRouteItem> out = new ArrayList<>();
AudioDeviceInfo[] deviceInfos = mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);
@@ -97,8 +93,7 @@
throw new UnsupportedOperationException();
}
- @NonNull
- private SystemRouteItem createRouteItemFor(@NonNull AudioDeviceInfo audioDeviceInfo) {
+ private @NonNull SystemRouteItem createRouteItemFor(@NonNull AudioDeviceInfo audioDeviceInfo) {
SystemRouteItem.Builder builder =
new SystemRouteItem.Builder(getSourceId(), String.valueOf(audioDeviceInfo.getId()))
.setName(audioDeviceInfo.getProductName().toString());
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/BluetoothManagerSystemRoutesSource.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/BluetoothManagerSystemRoutesSource.java
index 7bc34d7..c024e65 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/BluetoothManagerSystemRoutesSource.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/BluetoothManagerSystemRoutesSource.java
@@ -28,31 +28,27 @@
import android.content.Intent;
import android.content.IntentFilter;
-import androidx.annotation.NonNull;
import androidx.annotation.RequiresPermission;
import com.example.androidx.mediarouting.activities.systemrouting.SystemRouteItem;
import com.example.androidx.mediarouting.activities.systemrouting.SystemRoutesSourceItem;
+import org.jspecify.annotations.NonNull;
+
import java.util.ArrayList;
import java.util.List;
/** Implements {@link SystemRoutesSource} using {@link BluetoothManager}. */
public final class BluetoothManagerSystemRoutesSource extends SystemRoutesSource {
- @NonNull
- private final Context mContext;
- @NonNull
- private final BluetoothManager mBluetoothManager;
- @NonNull
- private final BluetoothAdapter mBluetoothAdapter;
- @NonNull
- private final DeviceStateChangedReceiver mDeviceStateChangedReceiver =
+ private final @NonNull Context mContext;
+ private final @NonNull BluetoothManager mBluetoothManager;
+ private final @NonNull BluetoothAdapter mBluetoothAdapter;
+ private final @NonNull DeviceStateChangedReceiver mDeviceStateChangedReceiver =
new DeviceStateChangedReceiver();
/** Returns a new instance. */
- @NonNull
- public static BluetoothManagerSystemRoutesSource create(@NonNull Context context) {
+ public static @NonNull BluetoothManagerSystemRoutesSource create(@NonNull Context context) {
BluetoothManager bluetoothManager =
(BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
return new BluetoothManagerSystemRoutesSource(context, bluetoothManager);
@@ -83,16 +79,14 @@
mContext.unregisterReceiver(mDeviceStateChangedReceiver);
}
- @NonNull
@Override
- public SystemRoutesSourceItem getSourceItem() {
+ public @NonNull SystemRoutesSourceItem getSourceItem() {
return new SystemRoutesSourceItem(/* name= */ "BluetoothManager");
}
- @NonNull
@RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT)
@Override
- public List<SystemRouteItem> fetchSourceRouteItems() {
+ public @NonNull List<SystemRouteItem> fetchSourceRouteItems() {
List<SystemRouteItem> out = new ArrayList<>();
for (BluetoothDevice device : mBluetoothAdapter.getBondedDevices()) {
@@ -107,9 +101,8 @@
throw new UnsupportedOperationException();
}
- @NonNull
@RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT)
- private SystemRouteItem createRouteItemFor(@NonNull BluetoothDevice device) {
+ private @NonNull SystemRouteItem createRouteItemFor(@NonNull BluetoothDevice device) {
return new SystemRouteItem.Builder(getSourceId(), /* id= */ device.getAddress())
.setName(device.getName())
.setAddress(device.getAddress())
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouter2SystemRoutesSource.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouter2SystemRoutesSource.java
index 1c85f85..828eef4 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouter2SystemRoutesSource.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouter2SystemRoutesSource.java
@@ -25,13 +25,14 @@
import android.os.Build;
import androidx.annotation.DoNotInline;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import com.example.androidx.mediarouting.activities.systemrouting.SystemRouteItem;
import com.example.androidx.mediarouting.activities.systemrouting.SystemRoutesSourceItem;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
@@ -46,15 +47,14 @@
@RequiresApi(Build.VERSION_CODES.R)
public final class MediaRouter2SystemRoutesSource extends SystemRoutesSource {
- @NonNull private final Context mContext;
- @NonNull private final MediaRouter2 mMediaRouter2;
- @Nullable private final Method mSuitabilityStatusMethod;
- @Nullable private final Method mWasTransferInitiatedBySelfMethod;
- @Nullable private final Method mTransferReasonMethod;
- @NonNull private final ArrayList<SystemRouteItem> mRouteItems = new ArrayList<>();
+ private final @NonNull Context mContext;
+ private final @NonNull MediaRouter2 mMediaRouter2;
+ private final @Nullable Method mSuitabilityStatusMethod;
+ private final @Nullable Method mWasTransferInitiatedBySelfMethod;
+ private final @Nullable Method mTransferReasonMethod;
+ private final @NonNull ArrayList<SystemRouteItem> mRouteItems = new ArrayList<>();
- @NonNull
- private final MediaRouter2.RouteCallback mRouteCallback =
+ private final MediaRouter2.@NonNull RouteCallback mRouteCallback =
new MediaRouter2.RouteCallback() {
@Override
public void onRoutesUpdated(@NonNull List<MediaRoute2Info> routes) {
@@ -62,19 +62,17 @@
}
};
- @NonNull
- private final MediaRouter2.ControllerCallback mControllerCallback =
+ private final MediaRouter2.@NonNull ControllerCallback mControllerCallback =
new MediaRouter2.ControllerCallback() {
@Override
public void onControllerUpdated(
- @NonNull MediaRouter2.RoutingController unusedController) {
+ MediaRouter2.@NonNull RoutingController unusedController) {
populateRouteItems(mMediaRouter2.getRoutes());
}
};
/** Returns a new instance. */
- @NonNull
- public static MediaRouter2SystemRoutesSource create(@NonNull Context context) {
+ public static @NonNull MediaRouter2SystemRoutesSource create(@NonNull Context context) {
MediaRouter2 mediaRouter2 = MediaRouter2.getInstance(context);
return new MediaRouter2SystemRoutesSource(context, mediaRouter2);
}
@@ -125,15 +123,13 @@
mMediaRouter2.unregisterRouteCallback(mRouteCallback);
}
- @NonNull
@Override
- public SystemRoutesSourceItem getSourceItem() {
+ public @NonNull SystemRoutesSourceItem getSourceItem() {
return new SystemRoutesSourceItem(/* name= */ "MediaRouter2");
}
- @NonNull
@Override
- public List<SystemRouteItem> fetchSourceRouteItems() {
+ public @NonNull List<SystemRouteItem> fetchSourceRouteItems() {
return mRouteItems;
}
@@ -193,8 +189,7 @@
mOnRoutesChangedListener.run();
}
- @NonNull
- private SystemRouteItem createRouteItemFor(
+ private @NonNull SystemRouteItem createRouteItemFor(
@NonNull MediaRoute2Info routeInfo,
boolean isSelectedRoute,
@Nullable Boolean wasTransferredBySelf,
@@ -224,8 +219,7 @@
return builder.build();
}
- @NonNull
- private String getHumanReadableSuitabilityStatus(@Nullable Integer status) {
+ private @NonNull String getHumanReadableSuitabilityStatus(@Nullable Integer status) {
if (status == null) {
// The route is not selected, or this Android version doesn't support suitability
// status.
@@ -243,8 +237,7 @@
}
}
- @NonNull
- private String getHumanReadableTransferReason(@Nullable Integer transferReason) {
+ private @NonNull String getHumanReadableTransferReason(@Nullable Integer transferReason) {
if (transferReason == null) {
// The route is not selected, or this Android version doesn't support transfer reason.
return null;
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouterSystemRoutesSource.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouterSystemRoutesSource.java
index 21d112f..bbcf097 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouterSystemRoutesSource.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouterSystemRoutesSource.java
@@ -20,22 +20,20 @@
import android.media.MediaRouter;
import android.text.TextUtils;
-import androidx.annotation.NonNull;
-
import com.example.androidx.mediarouting.activities.systemrouting.SystemRouteItem;
import com.example.androidx.mediarouting.activities.systemrouting.SystemRoutesSourceItem;
+import org.jspecify.annotations.NonNull;
+
import java.util.ArrayList;
import java.util.List;
/** Implements {@link SystemRoutesSource} using {@link MediaRouter}. */
public final class MediaRouterSystemRoutesSource extends SystemRoutesSource {
- @NonNull
- private final MediaRouter mMediaRouter;
+ private final @NonNull MediaRouter mMediaRouter;
- @NonNull
- private final MediaRouter.Callback mCallback =
+ private final MediaRouter.@NonNull Callback mCallback =
new MediaRouter.SimpleCallback() {
@Override
public void onRouteAdded(MediaRouter router, MediaRouter.RouteInfo info) {
@@ -66,8 +64,7 @@
};
/** Returns a new instance. */
- @NonNull
- public static MediaRouterSystemRoutesSource create(@NonNull Context context) {
+ public static @NonNull MediaRouterSystemRoutesSource create(@NonNull Context context) {
MediaRouter mediaRouter =
(MediaRouter) context.getSystemService(Context.MEDIA_ROUTER_SERVICE);
return new MediaRouterSystemRoutesSource(mediaRouter);
@@ -87,15 +84,13 @@
mMediaRouter.removeCallback(mCallback);
}
- @NonNull
@Override
- public SystemRoutesSourceItem getSourceItem() {
+ public @NonNull SystemRoutesSourceItem getSourceItem() {
return new SystemRoutesSourceItem(/* name= */ "Legacy MediaRouter");
}
- @NonNull
@Override
- public List<SystemRouteItem> fetchSourceRouteItems() {
+ public @NonNull List<SystemRouteItem> fetchSourceRouteItems() {
int count = mMediaRouter.getRouteCount();
List<SystemRouteItem> out = new ArrayList<>();
@@ -126,9 +121,8 @@
return false;
}
- @NonNull
- private SystemRouteItem createRouteItemFor(
- @NonNull MediaRouter.RouteInfo routeInfo, boolean isSelected) {
+ private @NonNull SystemRouteItem createRouteItemFor(
+ MediaRouter.@NonNull RouteInfo routeInfo, boolean isSelected) {
SystemRouteItem.Builder builder =
new SystemRouteItem.Builder(getSourceId(), /* id= */ routeInfo.getName().toString())
.setName(routeInfo.getName().toString());
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/SystemRoutesSource.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/SystemRoutesSource.java
index bad6317..d6fe390 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/SystemRoutesSource.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/SystemRoutesSource.java
@@ -16,11 +16,11 @@
package com.example.androidx.mediarouting.activities.systemrouting.source;
-import androidx.annotation.NonNull;
-
import com.example.androidx.mediarouting.activities.systemrouting.SystemRouteItem;
import com.example.androidx.mediarouting.activities.systemrouting.SystemRoutesSourceItem;
+import org.jspecify.annotations.NonNull;
+
import java.util.List;
/**
@@ -28,7 +28,7 @@
*/
public abstract class SystemRoutesSource {
- @NonNull protected Runnable mOnRoutesChangedListener = () -> {};
+ protected @NonNull Runnable mOnRoutesChangedListener = () -> {};
/** Sets a {@link Runnable} to invoke whenever routes change. */
public void setOnRoutesChangedListener(@NonNull Runnable onRoutesChangedListener) {
@@ -51,22 +51,19 @@
}
/** Returns a string that uniquely identifies this source. */
- @NonNull
- public final String getSourceId() {
+ public final @NonNull String getSourceId() {
return getClass().getSimpleName();
}
/**
* Gets a source item containing source type.
*/
- @NonNull
- public abstract SystemRoutesSourceItem getSourceItem();
+ public abstract @NonNull SystemRoutesSourceItem getSourceItem();
/**
* Fetches a list of {@link SystemRouteItem} discovered by this source.
*/
- @NonNull
- public abstract List<SystemRouteItem> fetchSourceRouteItems();
+ public abstract @NonNull List<SystemRouteItem> fetchSourceRouteItems();
/**
* Selects the route that corresponds to the given item.
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/MediaItem.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/MediaItem.java
index 40f1172..506c114 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/MediaItem.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/MediaItem.java
@@ -18,7 +18,7 @@
import android.net.Uri;
-import androidx.annotation.NonNull;
+import org.jspecify.annotations.NonNull;
/**
* MediaItem helps keep track of the media items before adding to playlist.
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/PlaylistItem.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/PlaylistItem.java
index c111b2f..a7cb608 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/PlaylistItem.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/PlaylistItem.java
@@ -20,9 +20,10 @@
import android.net.Uri;
import android.os.SystemClock;
-import androidx.annotation.NonNull;
import androidx.mediarouter.media.MediaItemStatus;
+import org.jspecify.annotations.NonNull;
+
/**
* PlaylistItem helps keep track of the current status of an media item.
*/
@@ -87,38 +88,31 @@
mContentDuration = duration;
}
- @NonNull
- public String getSessionId() {
+ public @NonNull String getSessionId() {
return mSessionId;
}
- @NonNull
- public String getItemId() {
+ public @NonNull String getItemId() {
return mItemId;
}
- @NonNull
- public String getRemoteItemId() {
+ public @NonNull String getRemoteItemId() {
return mRemoteItemId;
}
- @NonNull
- public String getTitle() {
+ public @NonNull String getTitle() {
return mTitle;
}
- @NonNull
- public Uri getUri() {
+ public @NonNull Uri getUri() {
return mUri;
}
- @NonNull
- public String getMime() {
+ public @NonNull String getMime() {
return mMime;
}
- @NonNull
- public PendingIntent getUpdateReceiver() {
+ public @NonNull PendingIntent getUpdateReceiver() {
return mUpdateReceiver;
}
@@ -138,8 +132,7 @@
return mTimestamp;
}
- @NonNull
- public MediaItemStatus getStatus() {
+ public @NonNull MediaItemStatus getStatus() {
return new MediaItemStatus.Builder(mPlaybackState)
.setContentPosition(mContentPosition)
.setContentDuration(mContentDuration)
@@ -147,9 +140,8 @@
.build();
}
- @NonNull
@Override
- public String toString() {
+ public @NonNull String toString() {
String[] state = {
"PENDING",
"PLAYING",
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/RouteItem.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/RouteItem.java
index b093db9..6dc9c48 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/RouteItem.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/data/RouteItem.java
@@ -18,9 +18,10 @@
import android.media.AudioManager;
-import androidx.annotation.NonNull;
import androidx.mediarouter.media.MediaRouter;
+import org.jspecify.annotations.NonNull;
+
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@@ -88,8 +89,7 @@
}
/** Returns a deep copy of an existing {@link RouteItem}. */
- @NonNull
- public static RouteItem copyOf(@NonNull RouteItem routeItem) {
+ public static @NonNull RouteItem copyOf(@NonNull RouteItem routeItem) {
return new RouteItem(
routeItem.getId(),
routeItem.getName(),
@@ -173,8 +173,7 @@
}
}
- @NonNull
- public String getId() {
+ public @NonNull String getId() {
return mId;
}
@@ -182,8 +181,7 @@
mId = id;
}
- @NonNull
- public String getName() {
+ public @NonNull String getName() {
return mName;
}
@@ -191,8 +189,7 @@
mName = name;
}
- @NonNull
- public String getDescription() {
+ public @NonNull String getDescription() {
return mDescription;
}
@@ -200,8 +197,7 @@
mDescription = description;
}
- @NonNull
- public ControlFilter getControlFilter() {
+ public @NonNull ControlFilter getControlFilter() {
return mControlFilter;
}
@@ -209,8 +205,7 @@
mControlFilter = controlFilter;
}
- @NonNull
- public PlaybackStream getPlaybackStream() {
+ public @NonNull PlaybackStream getPlaybackStream() {
return mPlaybackStream;
}
@@ -218,8 +213,7 @@
mPlaybackStream = playbackStream;
}
- @NonNull
- public PlaybackType getPlaybackType() {
+ public @NonNull PlaybackType getPlaybackType() {
return mPlaybackType;
}
@@ -235,8 +229,7 @@
mCanDisconnect = canDisconnect;
}
- @NonNull
- public VolumeHandling getVolumeHandling() {
+ public @NonNull VolumeHandling getVolumeHandling() {
return mVolumeHandling;
}
@@ -260,8 +253,7 @@
mVolumeMax = volumeMax;
}
- @NonNull
- public DeviceType getDeviceType() {
+ public @NonNull DeviceType getDeviceType() {
return mDeviceType;
}
@@ -269,8 +261,7 @@
mDeviceType = deviceType;
}
- @NonNull
- public List<String> getGroupMemberIds() {
+ public @NonNull List<String> getGroupMemberIds() {
return mGroupMemberIds;
}
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/LocalPlayer.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/LocalPlayer.java
index 89456df..d65d346 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/LocalPlayer.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/LocalPlayer.java
@@ -36,8 +36,6 @@
import android.view.WindowManager;
import android.widget.FrameLayout;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.mediarouter.media.MediaItemStatus;
import androidx.mediarouter.media.MediaRouter.RouteInfo;
@@ -45,6 +43,9 @@
import com.example.androidx.mediarouting.R;
import com.example.androidx.mediarouting.data.PlaylistItem;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.io.IOException;
/**
@@ -107,7 +108,7 @@
// Player
@Override
- public void play(@NonNull final PlaylistItem item) {
+ public void play(final @NonNull PlaylistItem item) {
if (DEBUG) {
Log.d(TAG, "play: item=" + item);
}
@@ -133,7 +134,7 @@
}
@Override
- public void seek(@NonNull final PlaylistItem item) {
+ public void seek(final @NonNull PlaylistItem item) {
if (DEBUG) {
Log.d(TAG, "seek: item=" + item);
}
@@ -151,7 +152,7 @@
@Override
public void getPlaylistItemStatus(
- @NonNull final PlaylistItem item, final boolean shouldUpdate) {
+ final @NonNull PlaylistItem item, final boolean shouldUpdate) {
if (mState == STATE_PLAYING || mState == STATE_PAUSED) {
item.setDuration(mMediaPlayer.getDuration());
item.setPosition(getCurrentPosition());
@@ -205,13 +206,12 @@
}
@Override
- public void enqueue(@NonNull final PlaylistItem item) {
+ public void enqueue(final @NonNull PlaylistItem item) {
throw new UnsupportedOperationException("LocalPlayer doesn't support enqueue!");
}
- @NonNull
@Override
- public PlaylistItem remove(@NonNull String iid) {
+ public @NonNull PlaylistItem remove(@NonNull String iid) {
throw new UnsupportedOperationException("LocalPlayer doesn't support remove!");
}
@@ -297,13 +297,11 @@
});
}
- @NonNull
- protected Context getContext() {
+ protected @NonNull Context getContext() {
return mContext;
}
- @NonNull
- protected MediaPlayer getMediaPlayer() {
+ protected @NonNull MediaPlayer getMediaPlayer() {
return mMediaPlayer;
}
@@ -657,9 +655,8 @@
setSurface((SurfaceHolder) null);
}
- @Nullable
@Override
- public Bitmap getSnapshot() {
+ public @Nullable Bitmap getSnapshot() {
if (getState() == STATE_PLAYING || getState() == STATE_PAUSED) {
return mOverlay.getSnapshot();
}
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/Player.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/Player.java
index 8701350..033684d 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/Player.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/Player.java
@@ -39,8 +39,6 @@
import android.widget.Toast;
import androidx.annotation.CallSuper;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.core.app.ActivityCompat;
import androidx.core.app.NotificationCompat;
@@ -51,6 +49,9 @@
import com.example.androidx.mediarouting.R;
import com.example.androidx.mediarouting.data.PlaylistItem;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
/**
* Abstraction of common playback operations of media items, such as play,
* seek, etc. Used by PlaybackManager as a backend to handle actual playback
@@ -77,15 +78,11 @@
private static final PlaybackStateCompat INIT_PLAYBACK_STATE = new PlaybackStateCompat.Builder()
.setState(PlaybackStateCompat.STATE_NONE, 0, .0f).build();
- @NonNull
- protected Context mContext;
- @NonNull
- protected Callback mCallback;
- @NonNull
- protected MediaSessionCompat mMediaSession;
+ protected @NonNull Context mContext;
+ protected @NonNull Callback mCallback;
+ protected @NonNull MediaSessionCompat mMediaSession;
- @NonNull
- protected String mNotificationChannelId;
+ protected @NonNull String mNotificationChannelId;
private NotificationCompat.Action mPlayAction;
private NotificationCompat.Action mPauseAction;
@@ -167,8 +164,7 @@
* @param iid
* @return
*/
- @NonNull
- public abstract PlaylistItem remove(@NonNull String iid);
+ public abstract @NonNull PlaylistItem remove(@NonNull String iid);
/**
* Takes player snapshot.
@@ -176,8 +172,7 @@
public void takeSnapshot() {
}
- @Nullable
- public Bitmap getSnapshot() {
+ public @Nullable Bitmap getSnapshot() {
return null;
}
@@ -195,8 +190,7 @@
* Creates a {@link Player} for the given {@code route}, whose UI is hosted by the given {@code
* activity}.
*/
- @NonNull
- public static Player createPlayerForActivity(
+ public static @NonNull Player createPlayerForActivity(
@NonNull Activity activity,
@NonNull RouteInfo route,
@NonNull MediaSessionCompat session) {
@@ -214,8 +208,7 @@
}
/** Creates a {@link Player} for playback on an overlay. */
- @NonNull
- public static Player createPlayerForOverlay(@NonNull Context context) {
+ public static @NonNull Player createPlayerForOverlay(@NonNull Context context) {
Player player = new LocalPlayer.OverlayPlayer(context);
player.setPlayPauseNotificationAction();
return player;
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/RemotePlayer.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/RemotePlayer.java
index 019ad8f..a7988b1 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/RemotePlayer.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/player/RemotePlayer.java
@@ -25,8 +25,6 @@
import android.view.View;
import android.widget.FrameLayout;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.concurrent.futures.CallbackToFutureAdapter;
import androidx.mediarouter.media.MediaItemStatus;
import androidx.mediarouter.media.MediaRouter.ControlRequestCallback;
@@ -44,6 +42,9 @@
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.util.ArrayList;
import java.util.List;
@@ -328,9 +329,8 @@
}
}
- @NonNull
@Override
- public PlaylistItem remove(@NonNull String itemId) {
+ public @NonNull PlaylistItem remove(@NonNull String itemId) {
throwIfNoSession();
throwIfQueuingUnsupported();
@@ -383,9 +383,8 @@
}
}
- @NonNull
@Override
- public Bitmap getSnapshot() {
+ public @NonNull Bitmap getSnapshot() {
return mSnapshot;
}
@@ -393,8 +392,7 @@
* Caches the remote state of the given playlist item and returns an updated copy through a
* {@link ListenableFuture}.
*/
- @NonNull
- public ListenableFuture<PlaylistItem> cacheRemoteState(@NonNull PlaylistItem item) {
+ public @NonNull ListenableFuture<PlaylistItem> cacheRemoteState(@NonNull PlaylistItem item) {
ListenableFuture<MediaItemStatus> remoteStatus = getRemoteItemStatus(item);
return Futures.transform(
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleDynamicGroupMediaRouteProvider.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleDynamicGroupMediaRouteProvider.java
index a597796..758c965 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleDynamicGroupMediaRouteProvider.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleDynamicGroupMediaRouteProvider.java
@@ -24,8 +24,6 @@
import android.media.MediaRouter;
import android.util.Log;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.collection.ArrayMap;
import androidx.mediarouter.media.MediaRouteDescriptor;
import androidx.mediarouter.media.MediaRouteProvider;
@@ -38,6 +36,9 @@
import com.example.androidx.mediarouting.data.RouteItem;
import com.example.androidx.mediarouting.services.SampleDynamicGroupMediaRouteProviderService;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashMap;
@@ -63,9 +64,8 @@
super(context);
}
- @Nullable
@Override
- public RouteController onCreateRouteController(@NonNull String routeId) {
+ public @Nullable RouteController onCreateRouteController(@NonNull String routeId) {
if (!checkDrawOverlay()) return null;
MediaRouteDescriptor routeDescriptor = mRouteDescriptors.get(routeId);
@@ -77,9 +77,8 @@
return new SampleRouteController(routeId);
}
- @Nullable
@Override
- public RouteController onCreateRouteController(@NonNull String routeId,
+ public @Nullable RouteController onCreateRouteController(@NonNull String routeId,
@NonNull String groupId) {
// Handle a static group exceptionally
if (groupId.equals(STATIC_GROUP_ROUTE_ID)) {
@@ -100,9 +99,8 @@
return controller;
}
- @Nullable
@Override
- public DynamicGroupRouteController onCreateDynamicGroupRouteController(
+ public @Nullable DynamicGroupRouteController onCreateDynamicGroupRouteController(
@NonNull String initialMemberRouteId) {
if (!checkDrawOverlay()) return null;
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleMediaRouteProvider.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleMediaRouteProvider.java
index 7721f91..4be09b3 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleMediaRouteProvider.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/SampleMediaRouteProvider.java
@@ -31,8 +31,6 @@
import android.provider.Settings;
import android.util.Log;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.collection.ArrayMap;
import androidx.mediarouter.media.MediaControlIntent;
@@ -50,6 +48,9 @@
import com.example.androidx.mediarouting.services.SampleMediaRouteProviderService;
import com.example.androidx.mediarouting.session.SessionManager;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -160,10 +161,8 @@
}
}
- @NonNull
- protected Map<String, Integer> mVolumes = new ArrayMap<>();
- @NonNull
- protected Map<String, MediaRouteDescriptor> mRouteDescriptors = new HashMap<>();
+ protected @NonNull Map<String, Integer> mVolumes = new ArrayMap<>();
+ protected @NonNull Map<String, MediaRouteDescriptor> mRouteDescriptors = new HashMap<>();
public SampleMediaRouteProvider(@NonNull Context context) {
super(context);
@@ -171,9 +170,8 @@
publishRoutes();
}
- @Nullable
@Override
- public RouteController onCreateRouteController(@NonNull String routeId) {
+ public @Nullable RouteController onCreateRouteController(@NonNull String routeId) {
if (!checkDrawOverlay()) return null;
return new SampleRouteController(routeId);
}
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/WrapperMediaRouteProvider.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/WrapperMediaRouteProvider.java
index cbc870a..f02c38e 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/WrapperMediaRouteProvider.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/providers/WrapperMediaRouteProvider.java
@@ -18,9 +18,10 @@
import android.content.Context;
-import androidx.annotation.NonNull;
import androidx.mediarouter.media.MediaRouteProvider;
+import org.jspecify.annotations.NonNull;
+
public class WrapperMediaRouteProvider extends MediaRouteProvider {
private static final String TAG = "WrapperMrp";
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/SampleDynamicGroupMediaRouteProviderService.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/SampleDynamicGroupMediaRouteProviderService.java
index abbfbf2..62c3852 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/SampleDynamicGroupMediaRouteProviderService.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/SampleDynamicGroupMediaRouteProviderService.java
@@ -20,13 +20,14 @@
import android.os.Binder;
import android.os.IBinder;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.mediarouter.media.MediaRouteProvider;
import androidx.mediarouter.media.MediaRouteProviderService;
import com.example.androidx.mediarouting.providers.SampleDynamicGroupMediaRouteProvider;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
/**
* Demonstrates how to register a custom media route provider service
* using the support library.
@@ -39,16 +40,14 @@
private SampleDynamicGroupMediaRouteProvider mDynamicGroupMediaRouteProvider;
- @NonNull
@Override
- public MediaRouteProvider onCreateMediaRouteProvider() {
+ public @NonNull MediaRouteProvider onCreateMediaRouteProvider() {
mDynamicGroupMediaRouteProvider = new SampleDynamicGroupMediaRouteProvider(this);
return mDynamicGroupMediaRouteProvider;
}
- @Nullable
@Override
- public IBinder onBind(@NonNull Intent intent) {
+ public @Nullable IBinder onBind(@NonNull Intent intent) {
if (intent != null && ACTION_BIND_LOCAL.equals(intent.getAction())) {
return new LocalBinder();
} else {
@@ -75,8 +74,7 @@
* bindings within the same process.
*/
public class LocalBinder extends Binder {
- @NonNull
- public SampleDynamicGroupMediaRouteProviderService getService() {
+ public @NonNull SampleDynamicGroupMediaRouteProviderService getService() {
return SampleDynamicGroupMediaRouteProviderService.this;
}
}
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/SampleMediaRouteProviderService.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/SampleMediaRouteProviderService.java
index 21c3e54..32acee4 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/SampleMediaRouteProviderService.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/SampleMediaRouteProviderService.java
@@ -16,12 +16,13 @@
package com.example.androidx.mediarouting.services;
-import androidx.annotation.NonNull;
import androidx.mediarouter.media.MediaRouteProvider;
import androidx.mediarouter.media.MediaRouteProviderService;
import com.example.androidx.mediarouting.providers.SampleMediaRouteProvider;
+import org.jspecify.annotations.NonNull;
+
/**
* Demonstrates how to register a custom media route provider service
* using the support library.
@@ -29,9 +30,8 @@
* @see SampleMediaRouteProvider
*/
public class SampleMediaRouteProviderService extends MediaRouteProviderService {
- @NonNull
@Override
- public MediaRouteProvider onCreateMediaRouteProvider() {
+ public @NonNull MediaRouteProvider onCreateMediaRouteProvider() {
return new SampleMediaRouteProvider(this);
}
}
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/WrapperMediaRouteProviderService.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/WrapperMediaRouteProviderService.java
index 2895772..7da91bc 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/WrapperMediaRouteProviderService.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/services/WrapperMediaRouteProviderService.java
@@ -16,19 +16,19 @@
package com.example.androidx.mediarouting.services;
-import androidx.annotation.NonNull;
import androidx.mediarouter.media.MediaRouteProvider;
import androidx.mediarouter.media.MediaRouteProviderService;
import com.example.androidx.mediarouting.providers.WrapperMediaRouteProvider;
+import org.jspecify.annotations.NonNull;
+
public class WrapperMediaRouteProviderService extends MediaRouteProviderService {
private WrapperMediaRouteProvider mWrapperMediaRouteProvider;
- @NonNull
@Override
- public MediaRouteProvider onCreateMediaRouteProvider() {
+ public @NonNull MediaRouteProvider onCreateMediaRouteProvider() {
if (mWrapperMediaRouteProvider == null) {
mWrapperMediaRouteProvider = new WrapperMediaRouteProvider(/* context= */ this);
}
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/session/SessionManager.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/session/SessionManager.java
index 4b68110..bca2bb36 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/session/SessionManager.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/session/SessionManager.java
@@ -20,14 +20,15 @@
import android.net.Uri;
import android.util.Log;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.mediarouter.media.MediaItemStatus;
import androidx.mediarouter.media.MediaSessionStatus;
import com.example.androidx.mediarouting.data.PlaylistItem;
import com.example.androidx.mediarouting.player.Player;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.util.ArrayList;
import java.util.List;
@@ -67,19 +68,16 @@
return mSessionValid;
}
- @Nullable
- public String getSessionId() {
+ public @Nullable String getSessionId() {
return mSessionValid ? Integer.toString(mSessionId) : null;
}
- @Nullable
- public PlaylistItem getCurrentItem() {
+ public @Nullable PlaylistItem getCurrentItem() {
return mPlaylist.isEmpty() ? null : mPlaylist.get(0);
}
// Returns the cached playlist (note this is not responsible for updating it)
- @Nullable
- public List<PlaylistItem> getPlaylist() {
+ public @Nullable List<PlaylistItem> getPlaylist() {
return mPlaylist;
}
@@ -118,16 +116,15 @@
/**
* Adds an item to the playlist.
*/
- @NonNull
- public PlaylistItem add(@NonNull String title, @NonNull Uri uri, @NonNull String mime) {
+ public @NonNull PlaylistItem add(@NonNull String title, @NonNull Uri uri,
+ @NonNull String mime) {
return add(title, uri, mime, 0, null);
}
/**
* Adds an item to the playlist.
*/
- @NonNull
- public PlaylistItem add(@NonNull String title, @NonNull Uri uri, @NonNull String mime,
+ public @NonNull PlaylistItem add(@NonNull String title, @NonNull Uri uri, @NonNull String mime,
long startPosition, @Nullable PendingIntent receiver) {
if (DEBUG) {
log("add: title=" + title + ", uri=" + uri + ", receiver=" + receiver);
@@ -154,8 +151,7 @@
/**
* Removes an item from the playlist.
*/
- @NonNull
- public PlaylistItem remove(@NonNull String iid) {
+ public @NonNull PlaylistItem remove(@NonNull String iid) {
if (DEBUG) {
log("remove: iid=" + iid);
}
@@ -166,8 +162,7 @@
/**
* Seeks a specific position for the current item.
*/
- @NonNull
- public PlaylistItem seek(@NonNull String iid, long pos) {
+ public @NonNull PlaylistItem seek(@NonNull String iid, long pos) {
if (DEBUG) {
log("seek: iid=" + iid + ", pos=" + pos);
}
@@ -189,8 +184,7 @@
/**
* Returns the status for the current item.
*/
- @NonNull
- public PlaylistItem getStatus(@NonNull String iid) {
+ public @NonNull PlaylistItem getStatus(@NonNull String iid) {
checkPlayerAndSession();
// This should only be called for local player. Remote player is
@@ -261,8 +255,7 @@
/**
* Starts the current session.
*/
- @Nullable
- public String startSession() {
+ public @Nullable String startSession() {
if (!mSessionValid) {
mSessionId++;
mItemId = 0;
@@ -307,8 +300,7 @@
/**
* Returns the current session status.
*/
- @NonNull
- public MediaSessionStatus getSessionStatus(@NonNull String sid) {
+ public @NonNull MediaSessionStatus getSessionStatus(@NonNull String sid) {
int sessionState = (sid != null && sid.equals(Integer.toString(mSessionId)))
? MediaSessionStatus.SESSION_STATE_ACTIVE
: MediaSessionStatus.SESSION_STATE_INVALIDATED;
@@ -493,9 +485,8 @@
mCallback = callback;
}
- @NonNull
@Override
- public String toString() {
+ public @NonNull String toString() {
String result = "Media Queue: ";
if (!mPlaylist.isEmpty()) {
for (PlaylistItem item : mPlaylist) {
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/LibraryAdapter.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/LibraryAdapter.java
index 33481f5..6be0261 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/LibraryAdapter.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/LibraryAdapter.java
@@ -24,13 +24,13 @@
import android.widget.ListView;
import android.widget.TextView;
-import androidx.annotation.NonNull;
-
import com.example.androidx.mediarouting.R;
import com.example.androidx.mediarouting.activities.MainActivity;
import com.example.androidx.mediarouting.data.MediaItem;
import com.example.androidx.mediarouting.session.SessionManager;
+import org.jspecify.annotations.NonNull;
+
/**
* {@link ListView} {@link Adapter} for showing items before adding to the playlist.
*/
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/PlaylistAdapter.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/PlaylistAdapter.java
index b017bac..1ace89c 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/PlaylistAdapter.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/PlaylistAdapter.java
@@ -24,13 +24,13 @@
import android.widget.ListView;
import android.widget.TextView;
-import androidx.annotation.NonNull;
-
import com.example.androidx.mediarouting.R;
import com.example.androidx.mediarouting.activities.MainActivity;
import com.example.androidx.mediarouting.data.PlaylistItem;
import com.example.androidx.mediarouting.session.SessionManager;
+import org.jspecify.annotations.NonNull;
+
/**
* {@link ListView} {@link Adapter} for showing items in the playlist listview.
*/
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/RoutesAdapter.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/RoutesAdapter.java
index bec91d6..9bf137f 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/RoutesAdapter.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/RoutesAdapter.java
@@ -22,12 +22,13 @@
import android.widget.ImageButton;
import android.widget.TextView;
-import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.androidx.mediarouting.R;
import com.example.androidx.mediarouting.data.RouteItem;
+import org.jspecify.annotations.NonNull;
+
import java.util.List;
/** {@link RecyclerView.Adapter} for showing routes in the settings screen */
@@ -42,9 +43,8 @@
this.mRouteItemListener = routeItemListener;
}
- @NonNull
@Override
- public RouteViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ public @NonNull RouteViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.route_item, parent, false);
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/UiUtils.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/UiUtils.java
index 7d3ff97..dc293fb 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/UiUtils.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/ui/UiUtils.java
@@ -21,9 +21,10 @@
import android.widget.ArrayAdapter;
import android.widget.Spinner;
-import androidx.annotation.NonNull;
import androidx.core.util.Consumer;
+import org.jspecify.annotations.NonNull;
+
/** Contains utility methods related to UI management. */
public final class UiUtils {
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/util/Utils.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/util/Utils.java
index 03c9f8b..ee258f9 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/util/Utils.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/util/Utils.java
@@ -21,11 +21,11 @@
import android.content.pm.PackageManager;
import android.util.Log;
-import androidx.annotation.NonNull;
-
import com.example.androidx.mediarouting.services.SampleMediaRouteProviderService;
import com.example.androidx.mediarouting.services.WrapperMediaRouteProviderService;
+import org.jspecify.annotations.NonNull;
+
public class Utils {
private static final String TAG = "Utils";
diff --git a/versionedparcelable/versionedparcelable/build.gradle b/versionedparcelable/versionedparcelable/build.gradle
index abf8f79..a639726 100644
--- a/versionedparcelable/versionedparcelable/build.gradle
+++ b/versionedparcelable/versionedparcelable/build.gradle
@@ -30,6 +30,7 @@
}
dependencies {
+ api(libs.jspecify)
api("androidx.annotation:annotation:1.8.1")
implementation("androidx.collection:collection:1.4.2")
diff --git a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelField.java b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelField.java
index 0732df3..00510ad 100644
--- a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelField.java
+++ b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelField.java
@@ -16,9 +16,10 @@
package androidx.versionedparcelable;
-import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
+import org.jspecify.annotations.NonNull;
+
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -36,6 +37,5 @@
/**
* Specifies the default value of this field.
*/
- @NonNull
- String defaultValue() default "";
+ @NonNull String defaultValue() default "";
}
diff --git a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelImpl.java b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelImpl.java
index 7bec846..28eb96f 100644
--- a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelImpl.java
+++ b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelImpl.java
@@ -20,18 +20,18 @@
import android.os.Parcel;
import android.os.Parcelable;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
/**
*/
@RestrictTo(RestrictTo.Scope.LIBRARY)
@SuppressLint("BanParcelableUsage")
public class ParcelImpl implements Parcelable {
- @Nullable
- private final VersionedParcelable mParcel;
+ private final @Nullable VersionedParcelable mParcel;
public ParcelImpl(@Nullable VersionedParcelable parcel) {
mParcel = parcel;
@@ -44,8 +44,7 @@
/**
*/
@SuppressWarnings({"TypeParameterUnusedInFormals", "unchecked"})
- @Nullable
- public <T extends VersionedParcelable> T getVersionedParcel() {
+ public <T extends VersionedParcelable> @Nullable T getVersionedParcel() {
return (T) mParcel;
}
@@ -62,14 +61,12 @@
public static final Creator<ParcelImpl> CREATOR = new Creator<ParcelImpl>() {
@Override
- @NonNull
- public ParcelImpl createFromParcel(@NonNull Parcel in) {
+ public @NonNull ParcelImpl createFromParcel(@NonNull Parcel in) {
return new ParcelImpl(in);
}
@Override
- @NonNull
- public ParcelImpl[] newArray(int size) {
+ public ParcelImpl @NonNull [] newArray(int size) {
return new ParcelImpl[size];
}
};
diff --git a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelUtils.java b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelUtils.java
index 59acea2..e5b1640 100644
--- a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelUtils.java
+++ b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/ParcelUtils.java
@@ -21,10 +21,11 @@
import android.os.Bundle;
import android.os.Parcelable;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
@@ -35,8 +36,7 @@
*/
public class ParcelUtils {
- @NonNull
- private static final String INNER_BUNDLE_KEY = "a";
+ private static final @NonNull String INNER_BUNDLE_KEY = "a";
private ParcelUtils() { }
@@ -44,8 +44,7 @@
* Turn a VersionedParcelable into a Parcelable
*/
@RestrictTo(LIBRARY_GROUP_PREFIX)
- @NonNull
- public static Parcelable toParcelable(@Nullable VersionedParcelable obj) {
+ public static @NonNull Parcelable toParcelable(@Nullable VersionedParcelable obj) {
return new ParcelImpl(obj);
}
@@ -54,8 +53,7 @@
*/
@RestrictTo(LIBRARY_GROUP_PREFIX)
@SuppressWarnings("TypeParameterUnusedInFormals")
- @Nullable
- public static <T extends VersionedParcelable> T fromParcelable(
+ public static <T extends VersionedParcelable> @Nullable T fromParcelable(
@NonNull Parcelable p
) {
if (!(p instanceof ParcelImpl)) {
@@ -82,8 +80,8 @@
*/
@SuppressWarnings("TypeParameterUnusedInFormals")
@RestrictTo(LIBRARY_GROUP_PREFIX)
- @Nullable
- public static <T extends VersionedParcelable> T fromInputStream(@NonNull InputStream input) {
+ public static <T extends VersionedParcelable> @Nullable T fromInputStream(
+ @NonNull InputStream input) {
VersionedParcelStream stream = new VersionedParcelStream(input, null);
return stream.readVersionedParcelable();
}
@@ -107,9 +105,8 @@
*
* Returns null if the bundle isn't present or ClassLoader issues occur.
*/
- @Nullable
@SuppressWarnings({"TypeParameterUnusedInFormals", "deprecation"})
- public static <T extends VersionedParcelable> T getVersionedParcelable(
+ public static <T extends VersionedParcelable> @Nullable T getVersionedParcelable(
@NonNull Bundle bundle, @NonNull String key) {
try {
Bundle innerBundle = bundle.getParcelable(key);
@@ -144,8 +141,7 @@
* Returns an empty list if the bundle isn't present or ClassLoader issues occur.
*/
@SuppressWarnings({"TypeParameterUnusedInFormals", "unchecked", "deprecation"})
- @NonNull
- public static <T extends VersionedParcelable> List<T> getVersionedParcelableList(
+ public static <T extends VersionedParcelable> @NonNull List<T> getVersionedParcelableList(
@NonNull Bundle bundle,
@Nullable String key
) {
diff --git a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcel.java b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcel.java
index b796da3..809c0ab 100644
--- a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcel.java
+++ b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcel.java
@@ -29,14 +29,15 @@
import android.util.SizeF;
import android.util.SparseBooleanArray;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.collection.ArrayMap;
import androidx.collection.ArraySet;
import androidx.collection.SimpleArrayMap;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -57,8 +58,7 @@
@RestrictTo(LIBRARY_GROUP_PREFIX)
public abstract class VersionedParcel {
- @NonNull
- private static final String TAG = "VersionedParcel";
+ private static final @NonNull String TAG = "VersionedParcel";
// These constants cannot change once shipped.
private static final int EX_SECURITY = -1;
@@ -78,12 +78,9 @@
private static final int TYPE_INTEGER = 7;
private static final int TYPE_FLOAT = 8;
- @NonNull
- final SimpleArrayMap<String, Method> mReadCache;
- @NonNull
- final SimpleArrayMap<String, Method> mWriteCache;
- @NonNull
- final SimpleArrayMap<String, Class<?>> mParcelizerCache;
+ final @NonNull SimpleArrayMap<String, Method> mReadCache;
+ final @NonNull SimpleArrayMap<String, Method> mWriteCache;
+ final @NonNull SimpleArrayMap<String, Class<?>> mParcelizerCache;
VersionedParcel(
@NonNull SimpleArrayMap<String, Method> readCache,
@@ -110,15 +107,14 @@
/**
* Create a sub-parcel to be used for a child VersionedParcelable
*/
- @NonNull
- protected abstract VersionedParcel createSubParcel();
+ protected abstract @NonNull VersionedParcel createSubParcel();
/**
* Write a byte array into the parcel.
*
* @param b Bytes to place into the parcel.
*/
- protected abstract void writeByteArray(@Nullable byte[] b);
+ protected abstract void writeByteArray(byte @Nullable [] b);
/**
* Write a byte array into the parcel.
@@ -127,7 +123,7 @@
* @param offset Index of first byte to be written.
* @param len Number of bytes to write.
*/
- protected abstract void writeByteArray(@Nullable byte[] b, int offset, int len);
+ protected abstract void writeByteArray(byte @Nullable [] b, int offset, int len);
/**
* Write a CharSequence into the parcel.
@@ -222,40 +218,34 @@
/**
* Read a string value from the parcel at the current dataPosition().
*/
- @Nullable
- protected abstract String readString();
+ protected abstract @Nullable String readString();
/**
* Read an object from the parcel at the current dataPosition().
*/
- @Nullable
- protected abstract IBinder readStrongBinder();
+ protected abstract @Nullable IBinder readStrongBinder();
/**
* Read a byte[] object from the parcel.
*/
- @Nullable
- protected abstract byte[] readByteArray();
+ protected abstract byte @Nullable [] readByteArray();
/**
* Read a CharSequence from the parcel
*/
- @Nullable
- protected abstract CharSequence readCharSequence();
+ protected abstract @Nullable CharSequence readCharSequence();
/**
*/
@SuppressWarnings({"unchecked", "TypeParameterUnusedInFormals"})
- @Nullable
- protected abstract <T extends Parcelable> T readParcelable();
+ protected abstract <T extends Parcelable> @Nullable T readParcelable();
/**
* Read and return a new Bundle object from the parcel at the current
* dataPosition(). Returns null if the previously written Bundle object was
* null.
*/
- @Nullable
- protected abstract Bundle readBundle();
+ protected abstract @Nullable Bundle readBundle();
/**
* Read a boolean value from the parcel at the current dataPosition().
@@ -313,7 +303,7 @@
*
* @param b Bytes to place into the parcel.
*/
- public void writeByteArray(@Nullable byte[] b, int fieldId) {
+ public void writeByteArray(byte @Nullable [] b, int fieldId) {
setOutputField(fieldId);
writeByteArray(b);
}
@@ -325,7 +315,7 @@
* @param offset Index of first byte to be written.
* @param len Number of bytes to write.
*/
- public void writeByteArray(@Nullable byte[] b, int offset, int len, int fieldId) {
+ public void writeByteArray(byte @Nullable [] b, int offset, int len, int fieldId) {
setOutputField(fieldId);
writeByteArray(b, offset, len);
}
@@ -460,8 +450,7 @@
/**
* Read a string value from the parcel at the current dataPosition().
*/
- @Nullable
- public String readString(@Nullable String def, int fieldId) {
+ public @Nullable String readString(@Nullable String def, int fieldId) {
if (!readField(fieldId)) {
return def;
}
@@ -471,8 +460,7 @@
/**
* Read an object from the parcel at the current dataPosition().
*/
- @Nullable
- public IBinder readStrongBinder(@Nullable IBinder def, int fieldId) {
+ public @Nullable IBinder readStrongBinder(@Nullable IBinder def, int fieldId) {
if (!readField(fieldId)) {
return def;
}
@@ -483,8 +471,7 @@
* Read a byte[] object from the parcel and copy it into the
* given byte array.
*/
- @Nullable
- public byte[] readByteArray(@Nullable byte[] def, int fieldId) {
+ public byte @Nullable [] readByteArray(byte @Nullable [] def, int fieldId) {
if (!readField(fieldId)) {
return def;
}
@@ -493,8 +480,7 @@
/**
*/
- @Nullable
- public <T extends Parcelable> T readParcelable(@Nullable T def, int fieldId) {
+ public <T extends Parcelable> @Nullable T readParcelable(@Nullable T def, int fieldId) {
if (!readField(fieldId)) {
return def;
}
@@ -506,8 +492,7 @@
* dataPosition(). Returns null if the previously written Bundle object was
* null.
*/
- @Nullable
- public Bundle readBundle(@Nullable Bundle def, int fieldId) {
+ public @Nullable Bundle readBundle(@Nullable Bundle def, int fieldId) {
if (!readField(fieldId)) {
return def;
}
@@ -563,14 +548,14 @@
/**
*/
- public void writeBooleanArray(@Nullable boolean[] val, int fieldId) {
+ public void writeBooleanArray(boolean @Nullable [] val, int fieldId) {
setOutputField(fieldId);
writeBooleanArray(val);
}
/**
*/
- protected void writeBooleanArray(@Nullable boolean[] val) {
+ protected void writeBooleanArray(boolean @Nullable [] val) {
if (val != null) {
int n = val.length;
writeInt(n);
@@ -584,8 +569,7 @@
/**
*/
- @Nullable
- public boolean[] readBooleanArray(@Nullable boolean[] def, int fieldId) {
+ public boolean @Nullable [] readBooleanArray(boolean @Nullable [] def, int fieldId) {
if (!readField(fieldId)) {
return def;
}
@@ -594,8 +578,7 @@
/**
*/
- @Nullable
- protected boolean[] readBooleanArray() {
+ protected boolean @Nullable [] readBooleanArray() {
int n = readInt();
if (n < 0) {
return null;
@@ -609,7 +592,7 @@
/**
*/
- public void writeCharArray(@Nullable char[] val, int fieldId) {
+ public void writeCharArray(char @Nullable [] val, int fieldId) {
setOutputField(fieldId);
if (val != null) {
int n = val.length;
@@ -624,8 +607,7 @@
/**
*/
- @Nullable
- public CharSequence readCharSequence(@Nullable CharSequence def, int fieldId) {
+ public @Nullable CharSequence readCharSequence(@Nullable CharSequence def, int fieldId) {
if (!readField(fieldId)) {
return def;
}
@@ -634,8 +616,7 @@
/**
*/
- @Nullable
- public char[] readCharArray(@Nullable char[] def, int fieldId) {
+ public char @Nullable [] readCharArray(char @Nullable [] def, int fieldId) {
if (!readField(fieldId)) {
return def;
}
@@ -652,14 +633,14 @@
/**
*/
- public void writeIntArray(@Nullable int[] val, int fieldId) {
+ public void writeIntArray(int @Nullable [] val, int fieldId) {
setOutputField(fieldId);
writeIntArray(val);
}
/**
*/
- protected void writeIntArray(@Nullable int[] val) {
+ protected void writeIntArray(int @Nullable [] val) {
if (val != null) {
int n = val.length;
writeInt(n);
@@ -673,8 +654,7 @@
/**
*/
- @Nullable
- public int[] readIntArray(@Nullable int[] def, int fieldId) {
+ public int @Nullable [] readIntArray(int @Nullable [] def, int fieldId) {
if (!readField(fieldId)) {
return def;
}
@@ -683,8 +663,7 @@
/**
*/
- @Nullable
- protected int[] readIntArray() {
+ protected int @Nullable [] readIntArray() {
int n = readInt();
if (n < 0) {
return null;
@@ -698,14 +677,14 @@
/**
*/
- public void writeLongArray(@Nullable long[] val, int fieldId) {
+ public void writeLongArray(long @Nullable [] val, int fieldId) {
setOutputField(fieldId);
writeLongArray(val);
}
/**
*/
- protected void writeLongArray(@Nullable long[] val) {
+ protected void writeLongArray(long @Nullable [] val) {
if (val != null) {
int n = val.length;
writeInt(n);
@@ -719,8 +698,7 @@
/**
*/
- @Nullable
- public long[] readLongArray(@Nullable long[] def, int fieldId) {
+ public long @Nullable [] readLongArray(long @Nullable [] def, int fieldId) {
if (!readField(fieldId)) {
return def;
}
@@ -729,8 +707,7 @@
/**
*/
- @Nullable
- protected long[] readLongArray() {
+ protected long @Nullable [] readLongArray() {
int n = readInt();
if (n < 0) {
return null;
@@ -744,14 +721,14 @@
/**
*/
- public void writeFloatArray(@Nullable float[] val, int fieldId) {
+ public void writeFloatArray(float @Nullable [] val, int fieldId) {
setOutputField(fieldId);
writeFloatArray(val);
}
/**
*/
- protected void writeFloatArray(@Nullable float[] val) {
+ protected void writeFloatArray(float @Nullable [] val) {
if (val != null) {
int n = val.length;
writeInt(n);
@@ -765,8 +742,7 @@
/**
*/
- @Nullable
- public float[] readFloatArray(@Nullable float[] def, int fieldId) {
+ public float @Nullable [] readFloatArray(float @Nullable [] def, int fieldId) {
if (!readField(fieldId)) {
return def;
}
@@ -775,8 +751,7 @@
/**
*/
- @Nullable
- protected float[] readFloatArray() {
+ protected float @Nullable [] readFloatArray() {
int n = readInt();
if (n < 0) {
return null;
@@ -790,14 +765,14 @@
/**
*/
- public void writeDoubleArray(@Nullable double[] val, int fieldId) {
+ public void writeDoubleArray(double @Nullable [] val, int fieldId) {
setOutputField(fieldId);
writeDoubleArray(val);
}
/**
*/
- protected void writeDoubleArray(@Nullable double[] val) {
+ protected void writeDoubleArray(double @Nullable [] val) {
if (val != null) {
int n = val.length;
writeInt(n);
@@ -811,8 +786,7 @@
/**
*/
- @Nullable
- public double[] readDoubleArray(@Nullable double[] def, int fieldId) {
+ public double @Nullable [] readDoubleArray(double @Nullable [] def, int fieldId) {
if (!readField(fieldId)) {
return def;
}
@@ -821,8 +795,7 @@
/**
*/
- @Nullable
- protected double[] readDoubleArray() {
+ protected double @Nullable [] readDoubleArray() {
int n = readInt();
if (n < 0) {
return null;
@@ -959,14 +932,14 @@
* @see #readList
* @see VersionedParcelable
*/
- public <T> void writeArray(@Nullable T[] val, int fieldId) {
+ public <T> void writeArray(T @Nullable [] val, int fieldId) {
setOutputField(fieldId);
writeArray(val);
}
/**
*/
- protected <T> void writeArray(@Nullable T[] val) {
+ protected <T> void writeArray(T @Nullable [] val) {
if (val == null) {
writeInt(-1);
return;
@@ -1188,8 +1161,7 @@
* @see #writeException
* @see #writeNoException
*/
- @Nullable
- public Exception readException(@Nullable Exception def, int fieldId) {
+ public @Nullable Exception readException(@Nullable Exception def, int fieldId) {
if (!readField(fieldId)) {
return def;
}
@@ -1220,8 +1192,7 @@
/**
* Gets the root {@link Throwable#getCause() cause} of {@code t}
*/
- @NonNull
- protected static Throwable getRootCause(@NonNull Throwable t) {
+ protected static @NonNull Throwable getRootCause(@NonNull Throwable t) {
while (t.getCause() != null) t = t.getCause();
return t;
}
@@ -1232,8 +1203,7 @@
* @param code Used to determine which exception class to throw.
* @param msg The exception message.
*/
- @NonNull
- private Exception createException(int code, String msg) {
+ private @NonNull Exception createException(int code, String msg) {
switch (code) {
case EX_PARCELABLE:
return (Exception) readParcelable();
@@ -1270,8 +1240,7 @@
* Read a Size from the parcel at the current dataPosition().
*/
@RequiresApi(21)
- @Nullable
- public Size readSize(@Nullable Size def, int fieldId) {
+ public @Nullable Size readSize(@Nullable Size def, int fieldId) {
if (!readField(fieldId)) {
return def;
}
@@ -1282,8 +1251,7 @@
* Read a SizeF from the parcel at the current dataPosition().
*/
@RequiresApi(21)
- @Nullable
- public SizeF readSizeF(@Nullable SizeF def, int fieldId) {
+ public @Nullable SizeF readSizeF(@Nullable SizeF def, int fieldId) {
if (!readField(fieldId)) {
return def;
}
@@ -1295,8 +1263,7 @@
* dataPosition(). Returns null if the previously written list object was
* null.
*/
- @Nullable
- public SparseBooleanArray readSparseBooleanArray(
+ public @Nullable SparseBooleanArray readSparseBooleanArray(
@Nullable SparseBooleanArray def,
int fieldId
) {
@@ -1328,8 +1295,7 @@
* as those that were previously written.
* @see #writeSet
*/
- @Nullable
- public <T> Set<T> readSet(@Nullable Set<T> def, int fieldId) {
+ public <T> @Nullable Set<T> readSet(@Nullable Set<T> def, int fieldId) {
if (!readField(fieldId)) {
return def;
}
@@ -1348,8 +1314,7 @@
* as those that were previously written.
* @see #writeList
*/
- @Nullable
- public <T> List<T> readList(@Nullable List<T> def, int fieldId) {
+ public <T> @Nullable List<T> readList(@Nullable List<T> def, int fieldId) {
if (!readField(fieldId)) {
return def;
}
@@ -1357,8 +1322,7 @@
}
@SuppressWarnings("unchecked")
- @Nullable
- private <T, S extends Collection<T>> S readCollection(@NonNull S list) {
+ private <T, S extends Collection<T>> @Nullable S readCollection(@NonNull S list) {
int n = readInt();
if (n < 0) {
return null;
@@ -1415,8 +1379,7 @@
* as those that were previously written.
* @see #writeMap
*/
- @Nullable
- public <K, V> Map<K, V> readMap(@Nullable Map<K, V> def, int fieldId) {
+ public <K, V> @Nullable Map<K, V> readMap(@Nullable Map<K, V> def, int fieldId) {
if (!readField(fieldId)) {
return def;
}
@@ -1450,8 +1413,7 @@
* as those that were previously written.
* @see #writeArray
*/
- @Nullable
- public <T> T[] readArray(@Nullable T[] def, int fieldId) {
+ public <T> T @Nullable [] readArray(T @Nullable [] def, int fieldId) {
if (!readField(fieldId)) {
return def;
}
@@ -1461,8 +1423,7 @@
/**
*/
@SuppressWarnings("unchecked")
- @Nullable
- protected <T> T[] readArray(@Nullable T[] def) {
+ protected <T> T @Nullable [] readArray(T @Nullable [] def) {
int n = readInt();
if (n < 0) {
return null;
@@ -1511,8 +1472,7 @@
/**
*/
- @Nullable
- public <T extends VersionedParcelable> T readVersionedParcelable(
+ public <T extends VersionedParcelable> @Nullable T readVersionedParcelable(
@Nullable T def,
int fieldId
) {
@@ -1531,8 +1491,7 @@
* was an error trying to instantiate the VersionedParcelable.
*/
@SuppressWarnings("TypeParameterUnusedInFormals")
- @Nullable
- protected <T extends VersionedParcelable> T readVersionedParcelable() {
+ protected <T extends VersionedParcelable> @Nullable T readVersionedParcelable() {
String name = readString();
if (name == null) {
return null;
@@ -1546,8 +1505,7 @@
* @return the Serializable object, or null if the Serializable name
* wasn't found in the parcel.
*/
- @Nullable
- protected Serializable readSerializable() {
+ protected @Nullable Serializable readSerializable() {
String name = readString();
if (name == null) {
// For some reason we were unable to read the name of the Serializable (either there
@@ -1585,8 +1543,7 @@
/**
*/
@SuppressWarnings({"unchecked", "TypeParameterUnusedInFormals"})
- @NonNull
- protected <T extends VersionedParcelable> T readFromParcel(
+ protected <T extends VersionedParcelable> @NonNull T readFromParcel(
@NonNull String parcelCls,
@NonNull VersionedParcel versionedParcel
) {
@@ -1638,8 +1595,7 @@
}
}
- @NonNull
- private Method getReadMethod(@NonNull String parcelCls) throws IllegalAccessException,
+ private @NonNull Method getReadMethod(@NonNull String parcelCls) throws IllegalAccessException,
NoSuchMethodException, ClassNotFoundException {
Method m = mReadCache.get(parcelCls);
if (m == null) {
@@ -1650,8 +1606,7 @@
return m;
}
- @NonNull
- private Method getWriteMethod(@NonNull Class<?> baseCls) throws IllegalAccessException,
+ private @NonNull Method getWriteMethod(@NonNull Class<?> baseCls) throws IllegalAccessException,
NoSuchMethodException, ClassNotFoundException {
Method m = mWriteCache.get(baseCls.getName());
if (m == null) {
@@ -1662,8 +1617,7 @@
return m;
}
- @NonNull
- private Class<?> findParcelClass(@NonNull Class<?> cls)
+ private @NonNull Class<?> findParcelClass(@NonNull Class<?> cls)
throws ClassNotFoundException {
Class<?> ret = mParcelizerCache.get(cls.getName());
if (ret == null) {
@@ -1701,8 +1655,7 @@
}
}
- @Nullable
- static Size readSize(@NonNull VersionedParcel self) {
+ static @Nullable Size readSize(@NonNull VersionedParcel self) {
if (self.readBoolean()) {
int width = self.readInt();
int height = self.readInt();
@@ -1711,8 +1664,7 @@
return null;
}
- @Nullable
- static SizeF readSizeF(@NonNull VersionedParcel self) {
+ static @Nullable SizeF readSizeF(@NonNull VersionedParcel self) {
if (self.readBoolean()) {
float width = self.readFloat();
float height = self.readFloat();
diff --git a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelParcel.java b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelParcel.java
index 5b40c60..a7f9b13 100644
--- a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelParcel.java
+++ b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelParcel.java
@@ -25,11 +25,12 @@
import android.util.Log;
import android.util.SparseIntArray;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.collection.SimpleArrayMap;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.lang.reflect.Method;
/**
@@ -37,17 +38,13 @@
@RestrictTo(RestrictTo.Scope.LIBRARY)
class VersionedParcelParcel extends VersionedParcel {
private static final boolean DEBUG = false;
- @NonNull
- private static final String TAG = "VersionedParcelParcel";
+ private static final @NonNull String TAG = "VersionedParcelParcel";
- @NonNull
- private final SparseIntArray mPositionLookup = new SparseIntArray();
- @NonNull
- private final Parcel mParcel;
+ private final @NonNull SparseIntArray mPositionLookup = new SparseIntArray();
+ private final @NonNull Parcel mParcel;
private final int mOffset;
private final int mEnd;
- @NonNull
- private final String mPrefix;
+ private final @NonNull String mPrefix;
private int mCurrentField = -1;
private int mNextRead = 0;
private int mFieldId = -1;
@@ -206,8 +203,7 @@
}
@Override
- @Nullable
- protected CharSequence readCharSequence() {
+ protected @Nullable CharSequence readCharSequence() {
return TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(mParcel);
}
@@ -232,20 +228,17 @@
}
@Override
- @Nullable
- public String readString() {
+ public @Nullable String readString() {
return mParcel.readString();
}
@Override
- @Nullable
- public IBinder readStrongBinder() {
+ public @Nullable IBinder readStrongBinder() {
return mParcel.readStrongBinder();
}
@Override
- @Nullable
- public byte[] readByteArray() {
+ public byte @Nullable [] readByteArray() {
int len = mParcel.readInt();
if (len < 0) {
return null;
@@ -257,14 +250,12 @@
@Override
@SuppressWarnings({"TypeParameterUnusedInFormals", "deprecation"})
- @Nullable
- public <T extends Parcelable> T readParcelable() {
+ public <T extends Parcelable> @Nullable T readParcelable() {
return mParcel.readParcelable(getClass().getClassLoader());
}
@Override
- @Nullable
- public Bundle readBundle() {
+ public @Nullable Bundle readBundle() {
return mParcel.readBundle(getClass().getClassLoader());
}
diff --git a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelStream.java b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelStream.java
index 4b0a20c..5c1edaf 100644
--- a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelStream.java
+++ b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelStream.java
@@ -21,11 +21,12 @@
import android.os.IInterface;
import android.os.Parcelable;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.collection.SimpleArrayMap;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
@@ -42,8 +43,7 @@
@RestrictTo(RestrictTo.Scope.LIBRARY)
class VersionedParcelStream extends VersionedParcel {
- @NonNull
- private static final Charset UTF_16 = Charset.forName("UTF-16");
+ private static final @NonNull Charset UTF_16 = Charset.forName("UTF-16");
// Supported types held inside a bundle. These cannot be added to or changed once shipped.
private static final int TYPE_NULL = 0;
@@ -62,17 +62,12 @@
private static final int TYPE_FLOAT = 13;
private static final int TYPE_FLOAT_ARRAY = 14;
- @Nullable
- private final DataInputStream mMasterInput;
- @Nullable
- private final DataOutputStream mMasterOutput;
+ private final @Nullable DataInputStream mMasterInput;
+ private final @Nullable DataOutputStream mMasterOutput;
- @Nullable
- private DataInputStream mCurrentInput;
- @Nullable
- private DataOutputStream mCurrentOutput;
- @Nullable
- private FieldBuffer mFieldBuffer;
+ private @Nullable DataInputStream mCurrentInput;
+ private @Nullable DataOutputStream mCurrentOutput;
+ private @Nullable FieldBuffer mFieldBuffer;
private boolean mIgnoreParcelables;
int mCount = 0;
@@ -204,7 +199,7 @@
}
@Override
- public void writeByteArray(@Nullable byte[] b) {
+ public void writeByteArray(byte @Nullable [] b) {
try {
if (b != null) {
mCurrentOutput.writeInt(b.length);
@@ -218,7 +213,7 @@
}
@Override
- public void writeByteArray(@Nullable byte[] b, int offset, int len) {
+ public void writeByteArray(byte @Nullable [] b, int offset, int len) {
try {
if (b != null) {
mCurrentOutput.writeInt(len);
@@ -323,15 +318,13 @@
}
@Override
- @Nullable
- public IBinder readStrongBinder() {
+ public @Nullable IBinder readStrongBinder() {
return null;
}
@Override
@SuppressWarnings("TypeParameterUnusedInFormals")
- @Nullable
- public <T extends Parcelable> T readParcelable() {
+ public <T extends Parcelable> @Nullable T readParcelable() {
return null;
}
@@ -372,8 +365,7 @@
}
@Override
- @Nullable
- public String readString() {
+ public @Nullable String readString() {
try {
int len = mCurrentInput.readInt();
if (len > 0) {
@@ -389,8 +381,7 @@
}
@Override
- @Nullable
- public byte[] readByteArray() {
+ public byte @Nullable [] readByteArray() {
try {
int len = mCurrentInput.readInt();
if (len > 0) {
@@ -406,8 +397,7 @@
}
@Override
- @Nullable
- protected CharSequence readCharSequence() {
+ protected @Nullable CharSequence readCharSequence() {
return null;
}
@@ -441,8 +431,7 @@
}
@Override
- @Nullable
- public Bundle readBundle() {
+ public @Nullable Bundle readBundle() {
int size = readInt();
if (size < 0) {
return null;
@@ -558,13 +547,10 @@
// TODO: Use less buffers
private static class FieldBuffer {
- @NonNull
- final ByteArrayOutputStream mOutput = new ByteArrayOutputStream();
- @NonNull
- final DataOutputStream mDataStream = new DataOutputStream(mOutput);
+ final @NonNull ByteArrayOutputStream mOutput = new ByteArrayOutputStream();
+ final @NonNull DataOutputStream mDataStream = new DataOutputStream(mOutput);
private final int mFieldId;
- @NonNull
- private final DataOutputStream mTarget;
+ private final @NonNull DataOutputStream mTarget;
FieldBuffer(int fieldId, @NonNull DataOutputStream target) {
mFieldId = fieldId;
diff --git a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelize.java b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelize.java
index c0edf43..e0427ce 100644
--- a/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelize.java
+++ b/versionedparcelable/versionedparcelable/src/main/java/androidx/versionedparcelable/VersionedParcelize.java
@@ -22,9 +22,10 @@
import android.os.IInterface;
import android.os.Parcelable;
-import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
+import org.jspecify.annotations.NonNull;
+
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.annotation.ElementType;
@@ -74,21 +75,18 @@
* This can be filled with any ids that used to be contained within this VersionedParcelable,
* but are no longer present. Ids listed here cannot be used by any fields within this class.
*/
- @NonNull
- int[] deprecatedIds() default {};
+ int @NonNull [] deprecatedIds() default {};
/**
* An alternate classname to also generate serialization for to support jetifier androidx
* migration.
*/
- @NonNull
- String jetifyAs() default "";
+ @NonNull String jetifyAs() default "";
/**
* Specifies a class to use to get objects for instantiation rather than creating them
* directly. The class must have an accessible empty constructor, and a get() method that
* returns an instance of the class this annotation is on.
*/
- @NonNull
- Class<?> factory() default void.class;
+ @NonNull Class<?> factory() default void.class;
}
diff --git a/wear/compose/compose-foundation/api/current.txt b/wear/compose/compose-foundation/api/current.txt
index 77936fe..c9f66cc 100644
--- a/wear/compose/compose-foundation/api/current.txt
+++ b/wear/compose/compose-foundation/api/current.txt
@@ -548,9 +548,13 @@
}
public sealed interface TransformingLazyColumnLayoutInfo {
+ method public int getAfterContentPadding();
+ method public int getBeforeContentPadding();
method public int getTotalItemsCount();
method public long getViewportSize();
method public java.util.List<androidx.wear.compose.foundation.lazy.TransformingLazyColumnVisibleItemInfo> getVisibleItems();
+ property public abstract int afterContentPadding;
+ property public abstract int beforeContentPadding;
property public abstract int totalItemsCount;
property public abstract long viewportSize;
property public abstract java.util.List<androidx.wear.compose.foundation.lazy.TransformingLazyColumnVisibleItemInfo> visibleItems;
diff --git a/wear/compose/compose-foundation/api/restricted_current.txt b/wear/compose/compose-foundation/api/restricted_current.txt
index 77936fe..c9f66cc 100644
--- a/wear/compose/compose-foundation/api/restricted_current.txt
+++ b/wear/compose/compose-foundation/api/restricted_current.txt
@@ -548,9 +548,13 @@
}
public sealed interface TransformingLazyColumnLayoutInfo {
+ method public int getAfterContentPadding();
+ method public int getBeforeContentPadding();
method public int getTotalItemsCount();
method public long getViewportSize();
method public java.util.List<androidx.wear.compose.foundation.lazy.TransformingLazyColumnVisibleItemInfo> getVisibleItems();
+ property public abstract int afterContentPadding;
+ property public abstract int beforeContentPadding;
property public abstract int totalItemsCount;
property public abstract long viewportSize;
property public abstract java.util.List<androidx.wear.compose.foundation.lazy.TransformingLazyColumnVisibleItemInfo> visibleItems;
diff --git a/wear/compose/compose-foundation/src/androidTest/kotlin/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategyTest.kt b/wear/compose/compose-foundation/src/androidTest/kotlin/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategyTest.kt
index e8679b9..ab26871 100644
--- a/wear/compose/compose-foundation/src/androidTest/kotlin/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategyTest.kt
+++ b/wear/compose/compose-foundation/src/androidTest/kotlin/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategyTest.kt
@@ -155,6 +155,25 @@
assertThat(result.visibleItems.map { it.offset })
.isEqualTo(listOf(0 + topPaddingPx, screenHeight / 2 + topPaddingPx))
+ assertThat(result.beforeContentPadding).isEqualTo(topPaddingPx)
+ }
+
+ @Test
+ fun twoItemsWithLastOneAlignedWithPadding_measuredWithCorrectOffsets() {
+ val bottomPadding = 5.dp
+ val bottomPaddingPx = with(measureScope) { bottomPadding.roundToPx() }
+ val strategy =
+ TransformingLazyColumnContentPaddingMeasurementStrategy(
+ PaddingValues(bottom = bottomPadding),
+ measureScope
+ )
+
+ val result = strategy.measure(listOf(screenHeight / 2, screenHeight / 2))
+
+ assertThat(result.visibleItems.size).isEqualTo(2)
+
+ assertThat(result.visibleItems.map { it.offset }).isEqualTo(listOf(0, screenHeight / 2))
+ assertThat(result.afterContentPadding).isEqualTo(bottomPaddingPx)
}
@Test
diff --git a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategy.kt b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategy.kt
index 7077c64..2843c16 100644
--- a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategy.kt
+++ b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategy.kt
@@ -175,8 +175,8 @@
coroutineScope = coroutineScope,
density = density,
itemSpacing = itemSpacing,
- beforeContentPadding = 0,
- afterContentPadding = 0,
+ beforeContentPadding = beforeContentPadding,
+ afterContentPadding = afterContentPadding,
measureResult =
layout(containerConstraints.maxWidth, containerConstraints.maxHeight) {
visibleItems.fastForEach { it.place(this) }
diff --git a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnLayoutInfo.kt b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnLayoutInfo.kt
index 2d9c878..a1838833 100644
--- a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnLayoutInfo.kt
+++ b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnLayoutInfo.kt
@@ -127,4 +127,12 @@
/** The size of the viewport in pixels. */
val viewportSize: IntSize
+
+ /**
+ * The content padding in pixels applied before the first item in the direction of scrolling.
+ */
+ val beforeContentPadding: Int
+
+ /** The content padding in pixels applied after the last item in the direction of scrolling. */
+ val afterContentPadding: Int
}
diff --git a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnMeasureResult.kt b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnMeasureResult.kt
index 3a79e8d..6dd296b 100644
--- a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnMeasureResult.kt
+++ b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnMeasureResult.kt
@@ -41,8 +41,8 @@
val itemSpacing: Int,
/** Density of the last measure. */
val density: Density,
- val beforeContentPadding: Int,
- val afterContentPadding: Int,
+ override val beforeContentPadding: Int,
+ override val afterContentPadding: Int,
/** True if there is some space available to continue scrolling in the forward direction. */
var canScrollForward: Boolean,
/** True if there is some space available to continue scrolling in the backward direction. */
diff --git a/wear/tiles/tiles-material/build.gradle b/wear/tiles/tiles-material/build.gradle
index 5a1fa54..f1afc74 100644
--- a/wear/tiles/tiles-material/build.gradle
+++ b/wear/tiles/tiles-material/build.gradle
@@ -32,6 +32,7 @@
}
dependencies {
+ api(libs.jspecify)
api("androidx.annotation:annotation:1.8.1")
api(project(":wear:tiles:tiles"))
implementation(project(":wear:tiles:tiles-proto"))
diff --git a/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/RunnerUtils.java b/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/RunnerUtils.java
index f630834..a8cb5ea 100644
--- a/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/RunnerUtils.java
+++ b/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/RunnerUtils.java
@@ -22,13 +22,14 @@
import android.graphics.Bitmap;
import android.util.Log;
-import androidx.annotation.NonNull;
import androidx.test.core.app.ActivityScenario;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.screenshot.AndroidXScreenshotTestRule;
import androidx.test.screenshot.matchers.MSSIMMatcher;
import androidx.wear.tiles.material.testapp.GoldenTestActivity;
+import org.jspecify.annotations.NonNull;
+
@SuppressWarnings("deprecation")
public class RunnerUtils {
// This isn't totally ideal right now. The screenshot tests run on a phone, so emulate some
@@ -40,7 +41,7 @@
public static void runSingleScreenshotTest(
@NonNull AndroidXScreenshotTestRule rule,
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement layoutElement,
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement layoutElement,
@NonNull String expected) {
byte[] layoutElementPayload = layoutElement.toLayoutElementProto().toByteArray();
diff --git a/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/TestCasesGenerator.java b/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/TestCasesGenerator.java
index 50d9fb8..531d07f 100644
--- a/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/TestCasesGenerator.java
+++ b/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/TestCasesGenerator.java
@@ -19,7 +19,7 @@
import android.content.Context;
import android.graphics.Color;
-import androidx.annotation.NonNull;
+import org.jspecify.annotations.NonNull;
import java.util.HashMap;
import java.util.Map;
@@ -38,11 +38,12 @@
* different for different user font sizes. Note that some of the golden will have the same name
* as it should point on the same size independent image.
*/
- @NonNull
- static Map<String, androidx.wear.tiles.LayoutElementBuilders.LayoutElement> generateTestCases(
- @NonNull Context context,
- @NonNull androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters deviceParameters,
- @NonNull String goldenSuffix) {
+ static @NonNull Map<String, androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
+ generateTestCases(
+ @NonNull Context context,
+ androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
+ deviceParameters,
+ @NonNull String goldenSuffix) {
androidx.wear.tiles.ModifiersBuilders.Clickable clickable =
new androidx.wear.tiles.ModifiersBuilders.Clickable.Builder()
.setOnClick(
diff --git a/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/layouts/TestCasesGenerator.java b/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/layouts/TestCasesGenerator.java
index 5984524..342d482 100644
--- a/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/layouts/TestCasesGenerator.java
+++ b/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/layouts/TestCasesGenerator.java
@@ -20,7 +20,8 @@
import android.graphics.Color;
import androidx.annotation.Dimension;
-import androidx.annotation.NonNull;
+
+import org.jspecify.annotations.NonNull;
import java.util.HashMap;
import java.util.Map;
@@ -37,11 +38,12 @@
* different for different user font sizes. Note that some of the golden will have the same name
* as it should point on the same size independent image.
*/
- @NonNull
- static Map<String, androidx.wear.tiles.LayoutElementBuilders.LayoutElement> generateTestCases(
- @NonNull Context context,
- @NonNull androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters deviceParameters,
- @NonNull String goldenSuffix) {
+ static @NonNull Map<String, androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
+ generateTestCases(
+ @NonNull Context context,
+ androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
+ deviceParameters,
+ @NonNull String goldenSuffix) {
androidx.wear.tiles.ModifiersBuilders.Clickable clickable =
new androidx.wear.tiles.ModifiersBuilders.Clickable.Builder()
.setOnClick(
@@ -635,13 +637,11 @@
return testCases;
}
- @NonNull
- private static androidx.wear.tiles.ColorBuilders.ColorProp color(int yellow) {
+ private static androidx.wear.tiles.ColorBuilders.@NonNull ColorProp color(int yellow) {
return androidx.wear.tiles.ColorBuilders.argb(yellow);
}
- @NonNull
- private static androidx.wear.tiles.material.Text buildTextLabel(
+ private static androidx.wear.tiles.material.@NonNull Text buildTextLabel(
@NonNull Context context, @NonNull String text) {
return new androidx.wear.tiles.material.Text.Builder(context, text)
.setTypography(androidx.wear.tiles.material.Typography.TYPOGRAPHY_CAPTION1)
@@ -649,8 +649,8 @@
.build();
}
- @NonNull
- private static androidx.wear.tiles.LayoutElementBuilders.Box buildColoredBoxMSL(int color) {
+ private static androidx.wear.tiles.LayoutElementBuilders.@NonNull Box buildColoredBoxMSL(
+ int color) {
return new androidx.wear.tiles.LayoutElementBuilders.Box.Builder()
.setWidth(androidx.wear.tiles.DimensionBuilders.dp(60))
.setHeight(androidx.wear.tiles.DimensionBuilders.dp(60))
@@ -665,8 +665,8 @@
.build();
}
- @NonNull
- private static androidx.wear.tiles.LayoutElementBuilders.Box buildColoredBoxPLL(int color) {
+ private static androidx.wear.tiles.LayoutElementBuilders.@NonNull Box buildColoredBoxPLL(
+ int color) {
return new androidx.wear.tiles.LayoutElementBuilders.Box.Builder()
.setWidth(androidx.wear.tiles.DimensionBuilders.expand())
.setHeight(androidx.wear.tiles.DimensionBuilders.dp(60))
diff --git a/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/testapp/GoldenTestActivity.java b/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/testapp/GoldenTestActivity.java
index 8374563..6e4ea0c 100644
--- a/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/testapp/GoldenTestActivity.java
+++ b/wear/tiles/tiles-material/src/androidTest/java/androidx/wear/tiles/material/testapp/GoldenTestActivity.java
@@ -31,7 +31,6 @@
import android.widget.FrameLayout;
import android.widget.FrameLayout.LayoutParams;
-import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.wear.protolayout.LayoutElementBuilders;
import androidx.wear.protolayout.LayoutElementBuilders.Layout;
@@ -42,6 +41,8 @@
import androidx.wear.tiles.material.R;
import androidx.wear.tiles.renderer.TileRenderer;
+import org.jspecify.annotations.Nullable;
+
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Button.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Button.java
index b469d86..2689359 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Button.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Button.java
@@ -22,13 +22,14 @@
import androidx.annotation.Dimension;
import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.wear.protolayout.expression.Fingerprint;
import androidx.wear.protolayout.proto.LayoutElementProto;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.HashMap;
@@ -92,9 +93,9 @@
*/
static final String METADATA_TAG_CUSTOM_CONTENT = "CSTBTN";
- @NonNull private final androidx.wear.tiles.LayoutElementBuilders.Box mElement;
+ private final androidx.wear.tiles.LayoutElementBuilders.@NonNull Box mElement;
- Button(@NonNull androidx.wear.tiles.LayoutElementBuilders.Box element) {
+ Button(androidx.wear.tiles.LayoutElementBuilders.@NonNull Box element) {
mElement = element;
}
@@ -107,27 +108,27 @@
private static final int IMAGE = 2;
private static final int CUSTOM_CONTENT = 3;
- @NonNull static final Map<Integer, String> TYPE_TO_TAG = new HashMap<>();
+ static final @NonNull Map<Integer, String> TYPE_TO_TAG = new HashMap<>();
@RestrictTo(RestrictTo.Scope.LIBRARY)
@Retention(RetentionPolicy.SOURCE)
@IntDef({NOT_SET, ICON, TEXT, IMAGE, CUSTOM_CONTENT})
@interface ButtonType {}
- @NonNull private final Context mContext;
- @Nullable private androidx.wear.tiles.LayoutElementBuilders.LayoutElement mCustomContent;
- @NonNull private final androidx.wear.tiles.ModifiersBuilders.Clickable mClickable;
- @NonNull private CharSequence mContentDescription = "";
+ private final @NonNull Context mContext;
+ private androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement mCustomContent;
+ private final androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable mClickable;
+ private @NonNull CharSequence mContentDescription = "";
- @NonNull
- private androidx.wear.tiles.DimensionBuilders.DpProp mSize = ButtonDefaults.DEFAULT_SIZE;
+ private androidx.wear.tiles.DimensionBuilders.@NonNull DpProp mSize =
+ ButtonDefaults.DEFAULT_SIZE;
- @Nullable private String mText = null;
- @Nullable private Integer mTypographyName = null;
- @Nullable private String mIcon = null;
- @Nullable private androidx.wear.tiles.DimensionBuilders.DpProp mIconSize = null;
- @Nullable private String mImage = null;
- @NonNull private ButtonColors mButtonColors = ButtonDefaults.PRIMARY_COLORS;
+ private @Nullable String mText = null;
+ private @Nullable Integer mTypographyName = null;
+ private @Nullable String mIcon = null;
+ private androidx.wear.tiles.DimensionBuilders.@Nullable DpProp mIconSize = null;
+ private @Nullable String mImage = null;
+ private @NonNull ButtonColors mButtonColors = ButtonDefaults.PRIMARY_COLORS;
@ButtonType private int mType = NOT_SET;
static {
@@ -148,7 +149,7 @@
*/
public Builder(
@NonNull Context context,
- @NonNull androidx.wear.tiles.ModifiersBuilders.Clickable clickable) {
+ androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable clickable) {
mClickable = clickable;
mContext = context;
}
@@ -157,8 +158,7 @@
* Sets the content description for the {@link Button}. It is highly recommended to provide
* this for button containing icon or image.
*/
- @NonNull
- public Builder setContentDescription(@NonNull CharSequence contentDescription) {
+ public @NonNull Builder setContentDescription(@NonNull CharSequence contentDescription) {
this.mContentDescription = contentDescription;
return this;
}
@@ -169,8 +169,8 @@
* ButtonDefaults#EXTRA_LARGE_SIZE}. If not set, {@link ButtonDefaults#DEFAULT_SIZE} will be
* used.
*/
- @NonNull
- public Builder setSize(@NonNull androidx.wear.tiles.DimensionBuilders.DpProp size) {
+ public @NonNull Builder setSize(
+ androidx.wear.tiles.DimensionBuilders.@NonNull DpProp size) {
mSize = size;
return this;
}
@@ -181,8 +181,7 @@
* ButtonDefaults#EXTRA_LARGE_SIZE}. If not set, {@link ButtonDefaults#DEFAULT_SIZE} will be
* used.
*/
- @NonNull
- public Builder setSize(@Dimension(unit = DP) float size) {
+ public @NonNull Builder setSize(@Dimension(unit = DP) float size) {
mSize = androidx.wear.tiles.DimensionBuilders.dp(size);
return this;
}
@@ -191,8 +190,7 @@
* Sets the colors for the {@link Button}. If not set, {@link ButtonDefaults#PRIMARY_COLORS}
* will be used.
*/
- @NonNull
- public Builder setButtonColors(@NonNull ButtonColors buttonColors) {
+ public @NonNull Builder setButtonColors(@NonNull ButtonColors buttonColors) {
mButtonColors = buttonColors;
return this;
}
@@ -200,9 +198,8 @@
/**
* Sets the custom content for this Button. Any previously added content will be overridden.
*/
- @NonNull
- public Builder setCustomContent(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement content) {
+ public @NonNull Builder setCustomContent(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement content) {
resetContent();
this.mCustomContent = content;
this.mType = CUSTOM_CONTENT;
@@ -215,10 +212,9 @@
* from {@link ButtonColors} and with the given size. This icon should be image with chosen
* alpha channel and not an actual image.
*/
- @NonNull
- public Builder setIconContent(
+ public @NonNull Builder setIconContent(
@NonNull String imageResourceId,
- @NonNull androidx.wear.tiles.DimensionBuilders.DpProp size) {
+ androidx.wear.tiles.DimensionBuilders.@NonNull DpProp size) {
resetContent();
this.mIcon = imageResourceId;
this.mType = ICON;
@@ -232,8 +228,7 @@
* icon will be tinted to the given content color from {@link ButtonColors}. This icon
* should be image with chosen alpha channel and not an actual image.
*/
- @NonNull
- public Builder setIconContent(@NonNull String imageResourceId) {
+ public @NonNull Builder setIconContent(@NonNull String imageResourceId) {
resetContent();
this.mIcon = imageResourceId;
this.mType = ICON;
@@ -248,8 +243,7 @@
* Any previously added content will be overridden. Text should contain no more than 3
* characters, otherwise it will overflow from the edges.
*/
- @NonNull
- public Builder setTextContent(@NonNull String text) {
+ public @NonNull Builder setTextContent(@NonNull String text) {
resetContent();
this.mText = text;
this.mType = TEXT;
@@ -262,8 +256,7 @@
* Text} component. Any previously added content will be overridden. Text should contain no
* more than 3 characters, otherwise it will overflow from the edges.
*/
- @NonNull
- public Builder setTextContent(
+ public @NonNull Builder setTextContent(
@NonNull String text, @Typography.TypographyName int typographyName) {
resetContent();
this.mText = text;
@@ -276,8 +269,7 @@
* Sets the content of this Button to be the given image, i.e. contacts photo. Any
* previously added content will be overridden.
*/
- @NonNull
- public Builder setImageContent(@NonNull String imageResourceId) {
+ public @NonNull Builder setImageContent(@NonNull String imageResourceId) {
resetContent();
this.mImage = imageResourceId;
this.mType = IMAGE;
@@ -294,9 +286,8 @@
}
/** Constructs and returns {@link Button} with the provided field and look. */
- @NonNull
@Override
- public Button build() {
+ public @NonNull Button build() {
androidx.wear.tiles.ModifiersBuilders.Modifiers.Builder modifiers =
new androidx.wear.tiles.ModifiersBuilders.Modifiers.Builder()
.setClickable(mClickable)
@@ -335,8 +326,8 @@
return new Button(element.build());
}
- @NonNull
- private androidx.wear.tiles.LayoutElementBuilders.LayoutElement getCorrectContent() {
+ private androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement
+ getCorrectContent() {
androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder content;
switch (mType) {
case ICON:
@@ -399,7 +390,7 @@
}
private static @Typography.TypographyName int getDefaultTypographyForSize(
- @NonNull androidx.wear.tiles.DimensionBuilders.DpProp size) {
+ androidx.wear.tiles.DimensionBuilders.@NonNull DpProp size) {
if (size.getValue() == ButtonDefaults.LARGE_SIZE.getValue()) {
return Typography.TYPOGRAPHY_TITLE1;
} else if (size.getValue() == ButtonDefaults.EXTRA_LARGE_SIZE.getValue()) {
@@ -413,8 +404,7 @@
/**
* Returns the custom content of this Button if it has been added. Otherwise, it returns null.
*/
- @Nullable
- public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getCustomContent() {
+ public androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement getCustomContent() {
if (!getMetadataTag().equals(METADATA_TAG_CUSTOM_CONTENT)) {
return null;
}
@@ -422,8 +412,7 @@
}
/** Returns the icon content of this Button if it has been added. Otherwise, it returns null. */
- @Nullable
- public String getIconContent() {
+ public @Nullable String getIconContent() {
androidx.wear.tiles.LayoutElementBuilders.Image icon = getIconContentObject();
return icon != null ? Helper.checkNotNull(icon.getResourceId()).getValue() : null;
}
@@ -431,42 +420,36 @@
/**
* Returns the image content of this Button if it has been added. Otherwise, it returns null.
*/
- @Nullable
- public String getImageContent() {
+ public @Nullable String getImageContent() {
androidx.wear.tiles.LayoutElementBuilders.Image image = getImageContentObject();
return image != null ? Helper.checkNotNull(image.getResourceId()).getValue() : null;
}
/** Returns the text content of this Button if it has been added. Otherwise, it returns null. */
- @Nullable
- public String getTextContent() {
+ public @Nullable String getTextContent() {
Text text = getTextContentObject();
return text != null ? text.getText() : null;
}
- @NonNull
- private androidx.wear.tiles.LayoutElementBuilders.LayoutElement getAnyContent() {
+ private androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement getAnyContent() {
return Helper.checkNotNull(mElement.getContents().get(0));
}
- @Nullable
- private androidx.wear.tiles.LayoutElementBuilders.Image getIconContentObject() {
+ private androidx.wear.tiles.LayoutElementBuilders.@Nullable Image getIconContentObject() {
if (!getMetadataTag().equals(METADATA_TAG_ICON)) {
return null;
}
return (androidx.wear.tiles.LayoutElementBuilders.Image) getAnyContent();
}
- @Nullable
- private Text getTextContentObject() {
+ private @Nullable Text getTextContentObject() {
if (!getMetadataTag().equals(METADATA_TAG_TEXT)) {
return null;
}
return Text.fromLayoutElement(getAnyContent());
}
- @Nullable
- private androidx.wear.tiles.LayoutElementBuilders.Image getImageContentObject() {
+ private androidx.wear.tiles.LayoutElementBuilders.@Nullable Image getImageContentObject() {
if (!getMetadataTag().equals(METADATA_TAG_IMAGE)) {
return null;
}
@@ -474,14 +457,12 @@
}
/** Returns click event action associated with this Button. */
- @NonNull
- public androidx.wear.tiles.ModifiersBuilders.Clickable getClickable() {
+ public androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable getClickable() {
return Helper.checkNotNull(Helper.checkNotNull(mElement.getModifiers()).getClickable());
}
/** Returns content description for this Button. */
- @Nullable
- public CharSequence getContentDescription() {
+ public @Nullable CharSequence getContentDescription() {
androidx.wear.tiles.ModifiersBuilders.Semantics semantics =
Helper.checkNotNull(mElement.getModifiers()).getSemantics();
if (semantics == null) {
@@ -491,8 +472,7 @@
}
/** Returns size for this Button. */
- @NonNull
- public androidx.wear.tiles.DimensionBuilders.ContainerDimension getSize() {
+ public androidx.wear.tiles.DimensionBuilders.@NonNull ContainerDimension getSize() {
return Helper.checkNotNull(mElement.getWidth());
}
@@ -503,8 +483,7 @@
}
/** Returns button color of this Button. */
- @NonNull
- public ButtonColors getButtonColors() {
+ public @NonNull ButtonColors getButtonColors() {
androidx.wear.tiles.ColorBuilders.ColorProp backgroundColor = getBackgroundColor();
androidx.wear.tiles.ColorBuilders.ColorProp contentColor = null;
@@ -538,8 +517,7 @@
}
/** Returns metadata tag set to this Button. */
- @NonNull
- String getMetadataTag() {
+ @NonNull String getMetadataTag() {
return Helper.getMetadataTagName(
Helper.checkNotNull(Helper.checkNotNull(mElement.getModifiers()).getMetadata()));
}
@@ -550,9 +528,8 @@
* container.getContents().get(index)}) if that element can be converted to Button. Otherwise,
* it will return null.
*/
- @Nullable
- public static Button fromLayoutElement(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement element) {
+ public static @Nullable Button fromLayoutElement(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement element) {
if (element instanceof Button) {
return (Button) element;
}
@@ -568,17 +545,15 @@
return new Button(boxElement);
}
- @NonNull
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- public LayoutElementProto.LayoutElement toLayoutElementProto() {
+ public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
return Helper.checkNotNull(mElement.toLayoutElementProto());
}
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
@Override
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mElement.getFingerprint();
}
}
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ButtonColors.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ButtonColors.java
index 23face2..e48335b6 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ButtonColors.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ButtonColors.java
@@ -17,7 +17,8 @@
package androidx.wear.tiles.material;
import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
+
+import org.jspecify.annotations.NonNull;
/**
* Represents the background and content colors used in a button Tiles component.
@@ -32,8 +33,8 @@
@Deprecated
@SuppressWarnings("deprecation")
public class ButtonColors {
- @NonNull private final androidx.wear.tiles.ColorBuilders.ColorProp mBackgroundColor;
- @NonNull private final androidx.wear.tiles.ColorBuilders.ColorProp mContentColor;
+ private final androidx.wear.tiles.ColorBuilders.@NonNull ColorProp mBackgroundColor;
+ private final androidx.wear.tiles.ColorBuilders.@NonNull ColorProp mContentColor;
/**
* Constructor for {@link ButtonColors} object.
@@ -55,8 +56,8 @@
* @param contentColor The content color or tint color to be used for a button.
*/
public ButtonColors(
- @NonNull androidx.wear.tiles.ColorBuilders.ColorProp backgroundColor,
- @NonNull androidx.wear.tiles.ColorBuilders.ColorProp contentColor) {
+ androidx.wear.tiles.ColorBuilders.@NonNull ColorProp backgroundColor,
+ androidx.wear.tiles.ColorBuilders.@NonNull ColorProp contentColor) {
mBackgroundColor = backgroundColor;
mContentColor = contentColor;
}
@@ -65,8 +66,7 @@
* Returns a {@link ButtonColors} object, using the current Primary colors from the given {@link
* Colors}.
*/
- @NonNull
- public static ButtonColors primaryButtonColors(@NonNull Colors colors) {
+ public static @NonNull ButtonColors primaryButtonColors(@NonNull Colors colors) {
return new ButtonColors(colors.getPrimary(), colors.getOnPrimary());
}
@@ -74,20 +74,17 @@
* Returns a {@link ButtonColors} object, using the current Surface colors from the given {@link
* Colors}.
*/
- @NonNull
- public static ButtonColors secondaryButtonColors(@NonNull Colors colors) {
+ public static @NonNull ButtonColors secondaryButtonColors(@NonNull Colors colors) {
return new ButtonColors(colors.getSurface(), colors.getOnSurface());
}
/** The background color to be used on a button Tiles components. */
- @NonNull
- public androidx.wear.tiles.ColorBuilders.ColorProp getBackgroundColor() {
+ public androidx.wear.tiles.ColorBuilders.@NonNull ColorProp getBackgroundColor() {
return mBackgroundColor;
}
/** The content or tint color to be used on a button Tiles components. */
- @NonNull
- public androidx.wear.tiles.ColorBuilders.ColorProp getContentColor() {
+ public androidx.wear.tiles.ColorBuilders.@NonNull ColorProp getContentColor() {
return mContentColor;
}
}
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ButtonDefaults.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ButtonDefaults.java
index 3fa5303..6a38829 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ButtonDefaults.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ButtonDefaults.java
@@ -19,7 +19,8 @@
import static androidx.annotation.Dimension.DP;
import androidx.annotation.Dimension;
-import androidx.annotation.NonNull;
+
+import org.jspecify.annotations.NonNull;
/**
* Contains the default values used by button Tiles components.
@@ -33,41 +34,34 @@
private ButtonDefaults() {}
/** The default size for standard {@link Button}. */
- @NonNull
- public static final androidx.wear.tiles.DimensionBuilders.DpProp DEFAULT_SIZE =
+ public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp DEFAULT_SIZE =
androidx.wear.tiles.DimensionBuilders.dp(52);
/** The recommended size for large {@link Button}. */
- @NonNull
- public static final androidx.wear.tiles.DimensionBuilders.DpProp LARGE_SIZE =
+ public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp LARGE_SIZE =
androidx.wear.tiles.DimensionBuilders.dp(60);
/** The recommended size for extra large {@link Button}. */
- @NonNull
- public static final androidx.wear.tiles.DimensionBuilders.DpProp EXTRA_LARGE_SIZE =
+ public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp EXTRA_LARGE_SIZE =
androidx.wear.tiles.DimensionBuilders.dp(88);
/** Returns the recommended icon size for the given size of a {@link Button}. */
- @NonNull
- public static androidx.wear.tiles.DimensionBuilders.DpProp recommendedIconSize(
- @NonNull androidx.wear.tiles.DimensionBuilders.DpProp buttonSize) {
+ public static androidx.wear.tiles.DimensionBuilders.@NonNull DpProp recommendedIconSize(
+ androidx.wear.tiles.DimensionBuilders.@NonNull DpProp buttonSize) {
return recommendedIconSize(buttonSize.getValue());
}
/** Returns the recommended icon size for the given size of a {@link Button}. */
- @NonNull
- public static androidx.wear.tiles.DimensionBuilders.DpProp recommendedIconSize(
+ public static androidx.wear.tiles.DimensionBuilders.@NonNull DpProp recommendedIconSize(
@Dimension(unit = DP) float buttonSize) {
return androidx.wear.tiles.DimensionBuilders.dp(buttonSize / 2);
}
/** The recommended colors for a primary {@link Button}. */
- @NonNull
- public static final ButtonColors PRIMARY_COLORS =
+ public static final @NonNull ButtonColors PRIMARY_COLORS =
ButtonColors.primaryButtonColors(Colors.DEFAULT);
/** The recommended colors for a secondary {@link Button}. */
- @NonNull
- public static final ButtonColors SECONDARY_COLORS =
+ public static final @NonNull ButtonColors SECONDARY_COLORS =
ButtonColors.secondaryButtonColors(Colors.DEFAULT);
}
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Chip.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Chip.java
index 741a1a2..bef10f1 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Chip.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Chip.java
@@ -22,13 +22,14 @@
import androidx.annotation.Dimension;
import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.wear.protolayout.expression.Fingerprint;
import androidx.wear.protolayout.proto.LayoutElementProto;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.HashMap;
@@ -91,9 +92,9 @@
*/
static final String METADATA_TAG_CUSTOM_CONTENT = "CSTCHP";
- @NonNull private final androidx.wear.tiles.LayoutElementBuilders.Box mElement;
+ private final androidx.wear.tiles.LayoutElementBuilders.@NonNull Box mElement;
- Chip(@NonNull androidx.wear.tiles.LayoutElementBuilders.Box element) {
+ Chip(androidx.wear.tiles.LayoutElementBuilders.@NonNull Box element) {
mElement = element;
}
@@ -110,19 +111,19 @@
@IntDef({NOT_SET, TEXT, ICON, CUSTOM_CONTENT})
@interface ChipType {}
- @NonNull private final Context mContext;
- @Nullable private androidx.wear.tiles.LayoutElementBuilders.LayoutElement mCustomContent;
- @Nullable private String mImageResourceId = null;
- @Nullable private String mPrimaryLabel = null;
- @Nullable private String mSecondaryLabel = null;
- @NonNull private final androidx.wear.tiles.ModifiersBuilders.Clickable mClickable;
- @NonNull private CharSequence mContentDescription = "";
- @NonNull private androidx.wear.tiles.DimensionBuilders.ContainerDimension mWidth;
+ private final @NonNull Context mContext;
+ private androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement mCustomContent;
+ private @Nullable String mImageResourceId = null;
+ private @Nullable String mPrimaryLabel = null;
+ private @Nullable String mSecondaryLabel = null;
+ private final androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable mClickable;
+ private @NonNull CharSequence mContentDescription = "";
+ private androidx.wear.tiles.DimensionBuilders.@NonNull ContainerDimension mWidth;
- @NonNull
- private androidx.wear.tiles.DimensionBuilders.DpProp mHeight = ChipDefaults.DEFAULT_HEIGHT;
+ private androidx.wear.tiles.DimensionBuilders.@NonNull DpProp mHeight =
+ ChipDefaults.DEFAULT_HEIGHT;
- @NonNull private ChipColors mChipColors = ChipDefaults.PRIMARY_COLORS;
+ private @NonNull ChipColors mChipColors = ChipDefaults.PRIMARY_COLORS;
@androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignment
private int mHorizontalAlign =
@@ -130,15 +131,14 @@
@Typography.TypographyName private int mPrimaryLabelTypography;
- @NonNull
- private androidx.wear.tiles.DimensionBuilders.DpProp mHorizontalPadding =
+ private androidx.wear.tiles.DimensionBuilders.@NonNull DpProp mHorizontalPadding =
ChipDefaults.HORIZONTAL_PADDING;
private boolean mIsScalable = true;
private int mMaxLines = 0; // 0 indicates that is not set.
- @NonNull private String mMetadataTag = "";
+ private @NonNull String mMetadataTag = "";
- @NonNull static final Map<Integer, String> TYPE_TO_TAG = new HashMap<>();
+ static final @NonNull Map<Integer, String> TYPE_TO_TAG = new HashMap<>();
static {
TYPE_TO_TAG.put(ICON, METADATA_TAG_ICON);
@@ -157,10 +157,9 @@
*/
public Builder(
@NonNull Context context,
- @NonNull androidx.wear.tiles.ModifiersBuilders.Clickable clickable,
- @NonNull
- androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
- deviceParameters) {
+ androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable clickable,
+ androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
+ deviceParameters) {
mContext = context;
mClickable = clickable;
mWidth =
@@ -174,9 +173,8 @@
/**
* Sets the width of {@link Chip}. If not set, default value will be set to fill the screen.
*/
- @NonNull
- public Builder setWidth(
- @NonNull androidx.wear.tiles.DimensionBuilders.ContainerDimension width) {
+ public @NonNull Builder setWidth(
+ androidx.wear.tiles.DimensionBuilders.@NonNull ContainerDimension width) {
mWidth = width;
return this;
}
@@ -185,8 +183,7 @@
* Sets the width of {@link TitleChip}. If not set, default value will be set to fill the
* screen.
*/
- @NonNull
- public Builder setWidth(@Dimension(unit = DP) float width) {
+ public @NonNull Builder setWidth(@Dimension(unit = DP) float width) {
mWidth = androidx.wear.tiles.DimensionBuilders.dp(width);
return this;
}
@@ -195,9 +192,8 @@
* Sets the custom content for the {@link Chip}. Any previously added content will be
* overridden.
*/
- @NonNull
- public Builder setCustomContent(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement content) {
+ public @NonNull Builder setCustomContent(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement content) {
this.mCustomContent = content;
this.mPrimaryLabel = "";
this.mSecondaryLabel = "";
@@ -209,8 +205,7 @@
* Sets the content description for the {@link Chip}. It is highly recommended to provide
* this for chip containing icon.
*/
- @NonNull
- public Builder setContentDescription(@NonNull CharSequence contentDescription) {
+ public @NonNull Builder setContentDescription(@NonNull CharSequence contentDescription) {
this.mContentDescription = contentDescription;
return this;
}
@@ -220,8 +215,7 @@
* overridden. Primary label can be on 1 or 2 lines, depending on the length and existence
* of secondary label.
*/
- @NonNull
- public Builder setPrimaryLabelContent(@NonNull String primaryLabel) {
+ public @NonNull Builder setPrimaryLabelContent(@NonNull String primaryLabel) {
this.mPrimaryLabel = primaryLabel;
this.mCustomContent = null;
return this;
@@ -232,8 +226,7 @@
*
* <p>Sets the font for the primary label and should only be used internally.
*/
- @NonNull
- Builder setPrimaryLabelTypography(@Typography.TypographyName int typography) {
+ @NonNull Builder setPrimaryLabelTypography(@Typography.TypographyName int typography) {
this.mPrimaryLabelTypography = typography;
return this;
}
@@ -243,8 +236,7 @@
*
* <p>Sets whether the font for the primary label is scalable.
*/
- @NonNull
- Builder setIsPrimaryLabelScalable(boolean isScalable) {
+ @NonNull Builder setIsPrimaryLabelScalable(boolean isScalable) {
this.mIsScalable = isScalable;
return this;
}
@@ -254,8 +246,7 @@
* be overridden. If secondary label is set, primary label must be set too with {@link
* #setPrimaryLabelContent}.
*/
- @NonNull
- public Builder setSecondaryLabelContent(@NonNull String secondaryLabel) {
+ public @NonNull Builder setSecondaryLabelContent(@NonNull String secondaryLabel) {
this.mSecondaryLabel = secondaryLabel;
this.mCustomContent = null;
return this;
@@ -267,8 +258,7 @@
* ChipColors}. This icon should be image with chosen alpha channel and not an actual image.
* If icon is set, primary label must be set too with {@link #setPrimaryLabelContent}.
*/
- @NonNull
- public Builder setIconContent(@NonNull String imageResourceId) {
+ public @NonNull Builder setIconContent(@NonNull String imageResourceId) {
this.mImageResourceId = imageResourceId;
this.mCustomContent = null;
return this;
@@ -281,8 +271,7 @@
* ChipColors#getIconColor()} will be used as color for the icon itself. If not set, {@link
* ChipDefaults#PRIMARY_COLORS} will be used.
*/
- @NonNull
- public Builder setChipColors(@NonNull ChipColors chipColors) {
+ public @NonNull Builder setChipColors(@NonNull ChipColors chipColors) {
mChipColors = chipColors;
return this;
}
@@ -295,8 +284,7 @@
* androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignment#HORIZONTAL_ALIGN_START}
* will be used.
*/
- @NonNull
- public Builder setHorizontalAlignment(
+ public @NonNull Builder setHorizontalAlignment(
@androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignment
int horizontalAlignment) {
mHorizontalAlign = horizontalAlignment;
@@ -304,38 +292,33 @@
}
/** Used for creating CompactChip and TitleChip. */
- @NonNull
- Builder setHorizontalPadding(
- @NonNull androidx.wear.tiles.DimensionBuilders.DpProp horizontalPadding) {
+ @NonNull Builder setHorizontalPadding(
+ androidx.wear.tiles.DimensionBuilders.@NonNull DpProp horizontalPadding) {
this.mHorizontalPadding = horizontalPadding;
return this;
}
/** Used for creating CompactChip and TitleChip. */
- @NonNull
- Builder setHeight(@NonNull androidx.wear.tiles.DimensionBuilders.DpProp height) {
+ @NonNull Builder setHeight(androidx.wear.tiles.DimensionBuilders.@NonNull DpProp height) {
this.mHeight = height;
return this;
}
/** Used for creating CompactChip and TitleChip. */
- @NonNull
- Builder setMaxLines(int maxLines) {
+ @NonNull Builder setMaxLines(int maxLines) {
this.mMaxLines = maxLines;
return this;
}
/** Used for setting the correct tag in CompactChip and TitleChip. */
- @NonNull
- Builder setMetadataTag(@NonNull String metadataTag) {
+ @NonNull Builder setMetadataTag(@NonNull String metadataTag) {
this.mMetadataTag = metadataTag;
return this;
}
/** Constructs and returns {@link Chip} with the provided content and look. */
- @NonNull
@Override
- public Chip build() {
+ public @NonNull Chip build() {
androidx.wear.tiles.ModifiersBuilders.Modifiers.Builder modifiers =
new androidx.wear.tiles.ModifiersBuilders.Modifiers.Builder()
.setClickable(mClickable)
@@ -374,8 +357,7 @@
return new Chip(element.build());
}
- @NonNull
- private String getCorrectContentDescription() {
+ private @NonNull String getCorrectContentDescription() {
if (mContentDescription.length() == 0) {
mContentDescription = "";
if (mPrimaryLabel != null) {
@@ -414,8 +396,8 @@
return METADATA_TAG_TEXT;
}
- @NonNull
- private androidx.wear.tiles.LayoutElementBuilders.LayoutElement getCorrectContent() {
+ private androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement
+ getCorrectContent() {
if (mCustomContent != null) {
return mCustomContent;
}
@@ -493,41 +475,36 @@
}
private androidx.wear.tiles.LayoutElementBuilders.Box.Builder putLayoutInBox(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement element) {
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement element) {
// Wrapped and centered content are default.
return new androidx.wear.tiles.LayoutElementBuilders.Box.Builder().addContent(element);
}
}
/** Returns height of this Chip. */
- @NonNull
- public androidx.wear.tiles.DimensionBuilders.ContainerDimension getHeight() {
+ public androidx.wear.tiles.DimensionBuilders.@NonNull ContainerDimension getHeight() {
return Helper.checkNotNull(mElement.getHeight());
}
/** Returns width of this Chip. */
- @NonNull
- public androidx.wear.tiles.DimensionBuilders.ContainerDimension getWidth() {
+ public androidx.wear.tiles.DimensionBuilders.@NonNull ContainerDimension getWidth() {
return Helper.checkNotNull(mElement.getWidth());
}
/** Returns click event action associated with this Chip. */
- @NonNull
- public androidx.wear.tiles.ModifiersBuilders.Clickable getClickable() {
+ public androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable getClickable() {
return Helper.checkNotNull(Helper.checkNotNull(mElement.getModifiers()).getClickable());
}
/** Returns background color of this Chip. */
- @NonNull
- private androidx.wear.tiles.ColorBuilders.ColorProp getBackgroundColor() {
+ private androidx.wear.tiles.ColorBuilders.@NonNull ColorProp getBackgroundColor() {
return Helper.checkNotNull(
Helper.checkNotNull(Helper.checkNotNull(mElement.getModifiers()).getBackground())
.getColor());
}
/** Returns chip colors of this Chip. */
- @NonNull
- public ChipColors getChipColors() {
+ public @NonNull ChipColors getChipColors() {
androidx.wear.tiles.ColorBuilders.ColorProp backgroundColor = getBackgroundColor();
androidx.wear.tiles.ColorBuilders.ColorProp contentColor = null;
androidx.wear.tiles.ColorBuilders.ColorProp secondaryContentColor = null;
@@ -563,8 +540,7 @@
}
/** Returns content description of this Chip. */
- @Nullable
- public CharSequence getContentDescription() {
+ public @Nullable CharSequence getContentDescription() {
androidx.wear.tiles.ModifiersBuilders.Semantics semantics =
Helper.checkNotNull(mElement.getModifiers()).getSemantics();
if (semantics == null) {
@@ -574,8 +550,7 @@
}
/** Returns custom content from this Chip if it has been added. Otherwise, it returns null. */
- @Nullable
- public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getCustomContent() {
+ public androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement getCustomContent() {
if (getMetadataTag().equals(METADATA_TAG_CUSTOM_CONTENT)) {
return Helper.checkNotNull(Helper.checkNotNull(mElement.getContents()).get(0));
}
@@ -583,38 +558,32 @@
}
/** Returns primary label from this Chip if it has been added. Otherwise, it returns null. */
- @Nullable
- public String getPrimaryLabelContent() {
+ public @Nullable String getPrimaryLabelContent() {
Text primaryLabel = getPrimaryLabelContentObject();
return primaryLabel != null ? primaryLabel.getText() : null;
}
/** Returns secondary label from this Chip if it has been added. Otherwise, it returns null. */
- @Nullable
- public String getSecondaryLabelContent() {
+ public @Nullable String getSecondaryLabelContent() {
Text label = getSecondaryLabelContentObject();
return label != null ? label.getText() : null;
}
/** Returns icon id from this Chip if it has been added. Otherwise, it returns null. */
- @Nullable
- public String getIconContent() {
+ public @Nullable String getIconContent() {
androidx.wear.tiles.LayoutElementBuilders.Image icon = getIconContentObject();
return icon != null ? Helper.checkNotNull(icon.getResourceId()).getValue() : null;
}
- @Nullable
- private Text getPrimaryLabelContentObject() {
+ private @Nullable Text getPrimaryLabelContentObject() {
return getPrimaryOrSecondaryLabelContent(0);
}
- @Nullable
- private Text getSecondaryLabelContentObject() {
+ private @Nullable Text getSecondaryLabelContentObject() {
return getPrimaryOrSecondaryLabelContent(1);
}
- @Nullable
- private androidx.wear.tiles.LayoutElementBuilders.Image getIconContentObject() {
+ private androidx.wear.tiles.LayoutElementBuilders.@Nullable Image getIconContentObject() {
if (!getMetadataTag().equals(METADATA_TAG_ICON)) {
return null;
}
@@ -624,8 +593,7 @@
.get(0));
}
- @Nullable
- private Text getPrimaryOrSecondaryLabelContent(int index) {
+ private @Nullable Text getPrimaryOrSecondaryLabelContent(int index) {
String metadataTag = getMetadataTag();
if (metadataTag.equals(METADATA_TAG_CUSTOM_CONTENT)) {
return null;
@@ -669,8 +637,7 @@
}
/** Returns metadata tag set to this Chip. */
- @NonNull
- String getMetadataTag() {
+ @NonNull String getMetadataTag() {
return Helper.getMetadataTagName(
Helper.checkNotNull(Helper.checkNotNull(mElement.getModifiers()).getMetadata()));
}
@@ -681,9 +648,8 @@
* container.getContents().get(index)}) if that element can be converted to Chip. Otherwise, it
* will return null.
*/
- @Nullable
- public static Chip fromLayoutElement(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement element) {
+ public static @Nullable Chip fromLayoutElement(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement element) {
if (element instanceof Chip) {
return (Chip) element;
}
@@ -699,17 +665,15 @@
return new Chip(boxElement);
}
- @NonNull
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- public LayoutElementProto.LayoutElement toLayoutElementProto() {
+ public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
return mElement.toLayoutElementProto();
}
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
@Override
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mElement.getFingerprint();
}
}
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ChipColors.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ChipColors.java
index 18ae16e..8eb19b4 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ChipColors.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ChipColors.java
@@ -17,7 +17,8 @@
package androidx.wear.tiles.material;
import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
+
+import org.jspecify.annotations.NonNull;
/**
* Represents the background and content colors used in a chip Tiles component.
@@ -32,10 +33,10 @@
@Deprecated
@SuppressWarnings("deprecation")
public class ChipColors {
- @NonNull private final androidx.wear.tiles.ColorBuilders.ColorProp mBackgroundColor;
- @NonNull private final androidx.wear.tiles.ColorBuilders.ColorProp mIconColor;
- @NonNull private final androidx.wear.tiles.ColorBuilders.ColorProp mContentColor;
- @NonNull private final androidx.wear.tiles.ColorBuilders.ColorProp mSecondaryContentColor;
+ private final androidx.wear.tiles.ColorBuilders.@NonNull ColorProp mBackgroundColor;
+ private final androidx.wear.tiles.ColorBuilders.@NonNull ColorProp mIconColor;
+ private final androidx.wear.tiles.ColorBuilders.@NonNull ColorProp mContentColor;
+ private final androidx.wear.tiles.ColorBuilders.@NonNull ColorProp mSecondaryContentColor;
/**
* Constructor for the {@link ChipColors} object.
@@ -85,10 +86,10 @@
* component.
*/
public ChipColors(
- @NonNull androidx.wear.tiles.ColorBuilders.ColorProp backgroundColor,
- @NonNull androidx.wear.tiles.ColorBuilders.ColorProp iconColor,
- @NonNull androidx.wear.tiles.ColorBuilders.ColorProp contentColor,
- @NonNull androidx.wear.tiles.ColorBuilders.ColorProp secondaryContentColor) {
+ androidx.wear.tiles.ColorBuilders.@NonNull ColorProp backgroundColor,
+ androidx.wear.tiles.ColorBuilders.@NonNull ColorProp iconColor,
+ androidx.wear.tiles.ColorBuilders.@NonNull ColorProp contentColor,
+ androidx.wear.tiles.ColorBuilders.@NonNull ColorProp secondaryContentColor) {
mBackgroundColor = backgroundColor;
mIconColor = iconColor;
mContentColor = contentColor;
@@ -102,8 +103,8 @@
* @param contentColor The content color to be used for all items inside a chip Tiles component.
*/
public ChipColors(
- @NonNull androidx.wear.tiles.ColorBuilders.ColorProp backgroundColor,
- @NonNull androidx.wear.tiles.ColorBuilders.ColorProp contentColor) {
+ androidx.wear.tiles.ColorBuilders.@NonNull ColorProp backgroundColor,
+ androidx.wear.tiles.ColorBuilders.@NonNull ColorProp contentColor) {
mBackgroundColor = backgroundColor;
mIconColor = contentColor;
mContentColor = contentColor;
@@ -114,8 +115,7 @@
* Returns a {@link ChipColors} object, using the current Primary colors from the given {@link
* Colors}.
*/
- @NonNull
- public static ChipColors primaryChipColors(@NonNull Colors colors) {
+ public static @NonNull ChipColors primaryChipColors(@NonNull Colors colors) {
return new ChipColors(colors.getPrimary(), colors.getOnPrimary());
}
@@ -123,32 +123,27 @@
* Returns a {@link ChipColors} object, using the current Surface colors from the given {@link
* Colors}.
*/
- @NonNull
- public static ChipColors secondaryChipColors(@NonNull Colors colors) {
+ public static @NonNull ChipColors secondaryChipColors(@NonNull Colors colors) {
return new ChipColors(colors.getSurface(), colors.getOnSurface());
}
/** The background color to be used on a chip Tiles components. */
- @NonNull
- public androidx.wear.tiles.ColorBuilders.ColorProp getBackgroundColor() {
+ public androidx.wear.tiles.ColorBuilders.@NonNull ColorProp getBackgroundColor() {
return mBackgroundColor;
}
/** The icon color to be used on a chip Tiles components. */
- @NonNull
- public androidx.wear.tiles.ColorBuilders.ColorProp getIconColor() {
+ public androidx.wear.tiles.ColorBuilders.@NonNull ColorProp getIconColor() {
return mIconColor;
}
/** The main text color to be used on a chip Tiles components. */
- @NonNull
- public androidx.wear.tiles.ColorBuilders.ColorProp getContentColor() {
+ public androidx.wear.tiles.ColorBuilders.@NonNull ColorProp getContentColor() {
return mContentColor;
}
/** The label text color to be used on a chip Tiles components. */
- @NonNull
- public androidx.wear.tiles.ColorBuilders.ColorProp getSecondaryContentColor() {
+ public androidx.wear.tiles.ColorBuilders.@NonNull ColorProp getSecondaryContentColor() {
return mSecondaryContentColor;
}
}
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ChipDefaults.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ChipDefaults.java
index ccdc94d..f848a1e 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ChipDefaults.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ChipDefaults.java
@@ -16,10 +16,11 @@
package androidx.wear.tiles.material;
-import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
+import org.jspecify.annotations.NonNull;
+
/**
* Contains the default values used by chip Tiles components.
*
@@ -33,26 +34,22 @@
/** The default height for standard {@link Chip} */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static final androidx.wear.tiles.DimensionBuilders.DpProp DEFAULT_HEIGHT =
+ public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp DEFAULT_HEIGHT =
androidx.wear.tiles.DimensionBuilders.dp(52);
/** The default height for standard {@link CompactChip} */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static final androidx.wear.tiles.DimensionBuilders.DpProp COMPACT_HEIGHT =
+ public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp COMPACT_HEIGHT =
androidx.wear.tiles.DimensionBuilders.dp(32);
/** The default height of tappable area for standard {@link CompactChip} */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static final androidx.wear.tiles.DimensionBuilders.DpProp COMPACT_HEIGHT_TAPPABLE =
- androidx.wear.tiles.DimensionBuilders.dp(48);
+ public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp
+ COMPACT_HEIGHT_TAPPABLE = androidx.wear.tiles.DimensionBuilders.dp(48);
/** The default height for standard {@link TitleChip} */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static final androidx.wear.tiles.DimensionBuilders.DpProp TITLE_HEIGHT =
+ public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp TITLE_HEIGHT =
androidx.wear.tiles.DimensionBuilders.dp(60);
/** The recommended horizontal margin used for width for standard {@link Chip} */
@@ -61,60 +58,50 @@
/** The recommended horizontal padding for standard {@link Chip} */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static final androidx.wear.tiles.DimensionBuilders.DpProp HORIZONTAL_PADDING =
+ public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp HORIZONTAL_PADDING =
androidx.wear.tiles.DimensionBuilders.dp(14);
/** The recommended horizontal padding for standard {@link CompactChip} */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static final androidx.wear.tiles.DimensionBuilders.DpProp COMPACT_HORIZONTAL_PADDING =
- androidx.wear.tiles.DimensionBuilders.dp(12);
+ public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp
+ COMPACT_HORIZONTAL_PADDING = androidx.wear.tiles.DimensionBuilders.dp(12);
/** The recommended horizontal padding for standard {@link TitleChip} */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static final androidx.wear.tiles.DimensionBuilders.DpProp TITLE_HORIZONTAL_PADDING =
- androidx.wear.tiles.DimensionBuilders.dp(16);
+ public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp
+ TITLE_HORIZONTAL_PADDING = androidx.wear.tiles.DimensionBuilders.dp(16);
/** The recommended vertical space between icon and text in standard {@link Chip} */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static final androidx.wear.tiles.DimensionBuilders.DpProp ICON_SPACER_WIDTH =
+ public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp ICON_SPACER_WIDTH =
androidx.wear.tiles.DimensionBuilders.dp(6);
/** The icon size used in standard {@link Chip} */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static final androidx.wear.tiles.DimensionBuilders.DpProp ICON_SIZE =
+ public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp ICON_SIZE =
androidx.wear.tiles.DimensionBuilders.dp(24);
/** The recommended colors for a primary {@link Chip}. */
- @NonNull
- public static final ChipColors PRIMARY_COLORS = ChipColors.primaryChipColors(Colors.DEFAULT);
+ public static final @NonNull ChipColors PRIMARY_COLORS =
+ ChipColors.primaryChipColors(Colors.DEFAULT);
/** The recommended colors for a secondary {@link Chip}. */
- @NonNull
- public static final ChipColors SECONDARY_COLORS =
+ public static final @NonNull ChipColors SECONDARY_COLORS =
ChipColors.secondaryChipColors(Colors.DEFAULT);
/** The recommended colors for a primary {@link CompactChip}. */
- @NonNull
- public static final ChipColors COMPACT_PRIMARY_COLORS =
+ public static final @NonNull ChipColors COMPACT_PRIMARY_COLORS =
ChipColors.primaryChipColors(Colors.DEFAULT);
/** The recommended colors for a secondary {@link CompactChip}. */
- @NonNull
- public static final ChipColors COMPACT_SECONDARY_COLORS =
+ public static final @NonNull ChipColors COMPACT_SECONDARY_COLORS =
ChipColors.secondaryChipColors(Colors.DEFAULT);
/** The recommended colors for a primary {@link TitleChip}. */
- @NonNull
- public static final ChipColors TITLE_PRIMARY_COLORS =
+ public static final @NonNull ChipColors TITLE_PRIMARY_COLORS =
ChipColors.primaryChipColors(Colors.DEFAULT);
/** The recommended colors for a secondary {@link TitleChip}. */
- @NonNull
- public static final ChipColors TITLE_SECONDARY_COLORS =
+ public static final @NonNull ChipColors TITLE_SECONDARY_COLORS =
ChipColors.secondaryChipColors(Colors.DEFAULT);
}
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/CircularProgressIndicator.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/CircularProgressIndicator.java
index 4e83a9a..a417faf 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/CircularProgressIndicator.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/CircularProgressIndicator.java
@@ -20,13 +20,14 @@
import androidx.annotation.Dimension;
import androidx.annotation.FloatRange;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.wear.protolayout.expression.Fingerprint;
import androidx.wear.protolayout.proto.LayoutElementProto;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
/**
* Tiles component {@link CircularProgressIndicator} that represents circular progress indicator
* which supports a gap in the circular track between startAngle and endAngle. [Progress Indicator
@@ -76,11 +77,11 @@
*/
static final String METADATA_TAG = "CPI";
- @NonNull private final androidx.wear.tiles.LayoutElementBuilders.Arc mElement;
- @NonNull private final androidx.wear.tiles.LayoutElementBuilders.ArcLine mProgress;
- @NonNull private final androidx.wear.tiles.LayoutElementBuilders.ArcLine mBackground;
+ private final androidx.wear.tiles.LayoutElementBuilders.@NonNull Arc mElement;
+ private final androidx.wear.tiles.LayoutElementBuilders.@NonNull ArcLine mProgress;
+ private final androidx.wear.tiles.LayoutElementBuilders.@NonNull ArcLine mBackground;
- CircularProgressIndicator(@NonNull androidx.wear.tiles.LayoutElementBuilders.Arc element) {
+ CircularProgressIndicator(androidx.wear.tiles.LayoutElementBuilders.@NonNull Arc element) {
this.mElement = element;
this.mBackground =
(androidx.wear.tiles.LayoutElementBuilders.ArcLine) element.getContents().get(0);
@@ -91,23 +92,19 @@
/** Builder class for {@link CircularProgressIndicator} */
public static final class Builder
implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
- @NonNull
- private ProgressIndicatorColors mCircularProgressIndicatorColors =
+ private @NonNull ProgressIndicatorColors mCircularProgressIndicatorColors =
ProgressIndicatorDefaults.DEFAULT_COLORS;
- @NonNull
- private androidx.wear.tiles.DimensionBuilders.DpProp mStrokeWidth =
+ private androidx.wear.tiles.DimensionBuilders.@NonNull DpProp mStrokeWidth =
ProgressIndicatorDefaults.DEFAULT_STROKE_WIDTH;
- @NonNull private CharSequence mContentDescription = "";
+ private @NonNull CharSequence mContentDescription = "";
- @NonNull
- private androidx.wear.tiles.DimensionBuilders.DegreesProp mStartAngle =
+ private androidx.wear.tiles.DimensionBuilders.@NonNull DegreesProp mStartAngle =
androidx.wear.tiles.DimensionBuilders.degrees(
ProgressIndicatorDefaults.DEFAULT_START_ANGLE);
- @NonNull
- private androidx.wear.tiles.DimensionBuilders.DegreesProp mEndAngle =
+ private androidx.wear.tiles.DimensionBuilders.@NonNull DegreesProp mEndAngle =
androidx.wear.tiles.DimensionBuilders.degrees(
ProgressIndicatorDefaults.DEFAULT_END_ANGLE);
@@ -122,8 +119,8 @@
* from 0 to 1. Progress will be colored in {@link ProgressIndicatorColors#getTrackColor}.
* If not set, 0 will be used.
*/
- @NonNull
- public Builder setProgress(@FloatRange(from = 0, to = 1) float progressPercentage) {
+ public @NonNull Builder setProgress(
+ @FloatRange(from = 0, to = 1) float progressPercentage) {
this.mProgress = progressPercentage;
return this;
}
@@ -134,8 +131,7 @@
* start arc from the 9 o'clock. If not set 0 will be used and the indicator will have full
* length.
*/
- @NonNull
- public Builder setStartAngle(float startAngle) {
+ public @NonNull Builder setStartAngle(float startAngle) {
this.mStartAngle = androidx.wear.tiles.DimensionBuilders.degrees(startAngle);
return this;
}
@@ -145,8 +141,7 @@
* 0 is 12 o'clock. End angle doesn't need to be within 0-360 range, but it must be larger
* than start angle. If not set 360 will be used and the indicator will have full length.
*/
- @NonNull
- public Builder setEndAngle(float endAngle) {
+ public @NonNull Builder setEndAngle(float endAngle) {
this.mEndAngle = androidx.wear.tiles.DimensionBuilders.degrees(endAngle);
return this;
}
@@ -155,8 +150,7 @@
* Sets the content description of the {@link CircularProgressIndicator} to be used for
* accessibility support.
*/
- @NonNull
- public Builder setContentDescription(@NonNull CharSequence contentDescription) {
+ public @NonNull Builder setContentDescription(@NonNull CharSequence contentDescription) {
this.mContentDescription = contentDescription;
return this;
}
@@ -167,8 +161,7 @@
* made, while {@link ProgressIndicatorColors#getTrackColor()} will be used for a background
* full size arc. If not set, {@link ProgressIndicatorDefaults#DEFAULT_COLORS} will be used.
*/
- @NonNull
- public Builder setCircularProgressIndicatorColors(
+ public @NonNull Builder setCircularProgressIndicatorColors(
@NonNull ProgressIndicatorColors circularProgressIndicatorColors) {
this.mCircularProgressIndicatorColors = circularProgressIndicatorColors;
return this;
@@ -178,9 +171,8 @@
* Sets the stroke width of the {@link CircularProgressIndicator}. Strongly recommended
* value is {@link ProgressIndicatorDefaults#DEFAULT_STROKE_WIDTH}.
*/
- @NonNull
- public Builder setStrokeWidth(
- @NonNull androidx.wear.tiles.DimensionBuilders.DpProp strokeWidth) {
+ public @NonNull Builder setStrokeWidth(
+ androidx.wear.tiles.DimensionBuilders.@NonNull DpProp strokeWidth) {
this.mStrokeWidth = strokeWidth;
return this;
}
@@ -189,8 +181,7 @@
* Sets the stroke width of the {@link CircularProgressIndicator}. Strongly recommended
* value is {@link ProgressIndicatorDefaults#DEFAULT_STROKE_WIDTH}.
*/
- @NonNull
- public Builder setStrokeWidth(@Dimension(unit = DP) float strokeWidth) {
+ public @NonNull Builder setStrokeWidth(@Dimension(unit = DP) float strokeWidth) {
this.mStrokeWidth = androidx.wear.tiles.DimensionBuilders.dp(strokeWidth);
return this;
}
@@ -199,9 +190,8 @@
* Constructs and returns {@link CircularProgressIndicator} with the provided field and
* look.
*/
- @NonNull
@Override
- public CircularProgressIndicator build() {
+ public @NonNull CircularProgressIndicator build() {
checkAngles();
androidx.wear.tiles.DimensionBuilders.DegreesProp length = getLength();
@@ -268,8 +258,7 @@
}
}
- @NonNull
- private androidx.wear.tiles.DimensionBuilders.DegreesProp getLength() {
+ private androidx.wear.tiles.DimensionBuilders.@NonNull DegreesProp getLength() {
float startAngle = mStartAngle.getValue();
float endAngle = mEndAngle.getValue();
if (endAngle <= startAngle) {
@@ -280,26 +269,22 @@
}
/** Returns angle representing progressed part of this CircularProgressIndicator. */
- @NonNull
- public androidx.wear.tiles.DimensionBuilders.DegreesProp getProgress() {
+ public androidx.wear.tiles.DimensionBuilders.@NonNull DegreesProp getProgress() {
return androidx.wear.tiles.material.Helper.checkNotNull(mProgress.getLength());
}
/** Returns stroke width of this CircularProgressIndicator. */
- @NonNull
- public androidx.wear.tiles.DimensionBuilders.DpProp getStrokeWidth() {
+ public androidx.wear.tiles.DimensionBuilders.@NonNull DpProp getStrokeWidth() {
return androidx.wear.tiles.material.Helper.checkNotNull(mProgress.getThickness());
}
/** Returns start angle of this CircularProgressIndicator. */
- @NonNull
- public androidx.wear.tiles.DimensionBuilders.DegreesProp getStartAngle() {
+ public androidx.wear.tiles.DimensionBuilders.@NonNull DegreesProp getStartAngle() {
return androidx.wear.tiles.material.Helper.checkNotNull(mElement.getAnchorAngle());
}
/** Returns start angle of this CircularProgressIndicator. */
- @NonNull
- public androidx.wear.tiles.DimensionBuilders.DegreesProp getEndAngle() {
+ public androidx.wear.tiles.DimensionBuilders.@NonNull DegreesProp getEndAngle() {
float backArcLength =
androidx.wear.tiles.material.Helper.checkNotNull(mBackground.getLength())
.getValue();
@@ -308,16 +293,14 @@
}
/** Returns main arc color of this CircularProgressIndicator. */
- @NonNull
- public ProgressIndicatorColors getCircularProgressIndicatorColors() {
+ public @NonNull ProgressIndicatorColors getCircularProgressIndicatorColors() {
return new ProgressIndicatorColors(
androidx.wear.tiles.material.Helper.checkNotNull(mProgress.getColor()),
androidx.wear.tiles.material.Helper.checkNotNull(mBackground.getColor()));
}
/** Returns content description of this CircularProgressIndicator. */
- @Nullable
- public CharSequence getContentDescription() {
+ public @Nullable CharSequence getContentDescription() {
androidx.wear.tiles.ModifiersBuilders.Semantics semantics =
androidx.wear.tiles.material.Helper.checkNotNull(mElement.getModifiers())
.getSemantics();
@@ -331,8 +314,7 @@
* Returns metadata tag set to this CircularProgressIndicator, which should be {@link
* #METADATA_TAG}.
*/
- @NonNull
- String getMetadataTag() {
+ @NonNull String getMetadataTag() {
return androidx.wear.tiles.material.Helper.getMetadataTagName(
androidx.wear.tiles.material.Helper.checkNotNull(
androidx.wear.tiles.material.Helper.checkNotNull(mElement.getModifiers())
@@ -345,9 +327,8 @@
* container's content with {@code container.getContents().get(index)}) if that element can be
* converted to CircularProgressIndicator. Otherwise, it will return null.
*/
- @Nullable
- public static CircularProgressIndicator fromLayoutElement(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement element) {
+ public static @Nullable CircularProgressIndicator fromLayoutElement(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement element) {
if (element instanceof CircularProgressIndicator) {
return (CircularProgressIndicator) element;
}
@@ -364,17 +345,15 @@
return new CircularProgressIndicator(arcElement);
}
- @NonNull
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- public LayoutElementProto.LayoutElement toLayoutElementProto() {
+ public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
return mElement.toLayoutElementProto();
}
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
@Override
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mElement.getFingerprint();
}
}
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Colors.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Colors.java
index f638b1f..63af19d 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Colors.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Colors.java
@@ -17,10 +17,11 @@
package androidx.wear.tiles.material;
import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
+import org.jspecify.annotations.NonNull;
+
/**
* Represent the container for default color scheme in your Tile, that can be used to create color
* objects for all Material components.
@@ -55,8 +56,8 @@
public static final int ON_SURFACE = 0xFFFFFFFF;
/** The default color scheme to be used in Tiles Material components. */
- @NonNull
- public static final Colors DEFAULT = new Colors(PRIMARY, ON_PRIMARY, SURFACE, ON_SURFACE);
+ public static final @NonNull Colors DEFAULT =
+ new Colors(PRIMARY, ON_PRIMARY, SURFACE, ON_SURFACE);
private @ColorInt final int mPrimary;
private @ColorInt final int mOnPrimary;
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/CompactChip.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/CompactChip.java
index ef9e6ba..bde902d 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/CompactChip.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/CompactChip.java
@@ -18,13 +18,14 @@
import android.content.Context;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.wear.protolayout.expression.Fingerprint;
import androidx.wear.protolayout.proto.LayoutElementProto;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
/**
* Tiles component {@link CompactChip} that represents clickable object with the text.
*
@@ -67,10 +68,10 @@
*/
static final String METADATA_TAG = "CMPCHP";
- @NonNull private final androidx.wear.tiles.LayoutElementBuilders.Box mImpl;
- @NonNull private final Chip mElement;
+ private final androidx.wear.tiles.LayoutElementBuilders.@NonNull Box mImpl;
+ private final @NonNull Chip mElement;
- CompactChip(@NonNull androidx.wear.tiles.LayoutElementBuilders.Box element) {
+ CompactChip(androidx.wear.tiles.LayoutElementBuilders.@NonNull Box element) {
this.mImpl = element;
// We know for sure that content of the androidx.wear.tiles.LayoutElementBuilders.Box is
// Chip.
@@ -83,15 +84,14 @@
/** Builder class for {@link androidx.wear.tiles.material.CompactChip}. */
public static final class Builder
implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
- @NonNull private final Context mContext;
- @NonNull private final String mText;
- @NonNull private final androidx.wear.tiles.ModifiersBuilders.Clickable mClickable;
+ private final @NonNull Context mContext;
+ private final @NonNull String mText;
+ private final androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable mClickable;
- @NonNull
- private final androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
+ private final androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
mDeviceParameters;
- @NonNull private ChipColors mChipColors = ChipDefaults.COMPACT_PRIMARY_COLORS;
+ private @NonNull ChipColors mChipColors = ChipDefaults.COMPACT_PRIMARY_COLORS;
/**
* Creates a builder for the {@link CompactChip} with associated action and the given text
@@ -105,9 +105,8 @@
public Builder(
@NonNull Context context,
@NonNull String text,
- @NonNull androidx.wear.tiles.ModifiersBuilders.Clickable clickable,
- @NonNull
- androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
+ androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable clickable,
+ androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
deviceParameters) {
this.mContext = context;
this.mText = text;
@@ -121,16 +120,14 @@
* ChipColors#getContentColor()} for the text. If not set, {@link
* ChipDefaults#COMPACT_PRIMARY_COLORS} will be used.
*/
- @NonNull
- public Builder setChipColors(@NonNull ChipColors chipColors) {
+ public @NonNull Builder setChipColors(@NonNull ChipColors chipColors) {
mChipColors = chipColors;
return this;
}
/** Constructs and returns {@link CompactChip} with the provided content and look. */
- @NonNull
@Override
- public CompactChip build() {
+ public @NonNull CompactChip build() {
Chip.Builder chipBuilder =
new Chip.Builder(mContext, mClickable, mDeviceParameters)
.setMetadataTag(METADATA_TAG)
@@ -173,26 +170,22 @@
}
/** Returns click event action associated with this Chip. */
- @NonNull
- public androidx.wear.tiles.ModifiersBuilders.Clickable getClickable() {
+ public androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable getClickable() {
return mElement.getClickable();
}
/** Returns chip color of this Chip. */
- @NonNull
- public ChipColors getChipColors() {
+ public @NonNull ChipColors getChipColors() {
return mElement.getChipColors();
}
/** Returns text content of this Chip. */
- @NonNull
- public String getText() {
+ public @NonNull String getText() {
return androidx.wear.tiles.material.Helper.checkNotNull(mElement.getPrimaryLabelContent());
}
/** Returns metadata tag set to this CompactChip, which should be {@link #METADATA_TAG}. */
- @NonNull
- String getMetadataTag() {
+ @NonNull String getMetadataTag() {
return mElement.getMetadataTag();
}
@@ -202,9 +195,8 @@
* container's content with {@code container.getContents().get(index)}) if that element can be
* converted to CompactChip. Otherwise, it will return null.
*/
- @Nullable
- public static CompactChip fromLayoutElement(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement element) {
+ public static @Nullable CompactChip fromLayoutElement(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement element) {
if (element instanceof CompactChip) {
return (CompactChip) element;
}
@@ -236,16 +228,14 @@
}
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
@Override
- public LayoutElementProto.LayoutElement toLayoutElementProto() {
+ public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
return mImpl.toLayoutElementProto();
}
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
@Override
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mImpl.getFingerprint();
}
}
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Helper.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Helper.java
index d81e33f..8253cba 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Helper.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Helper.java
@@ -16,11 +16,12 @@
package androidx.wear.tiles.material;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Collection;
@@ -39,8 +40,7 @@
/** Returns given value if not null or throws {@code NullPointerException} otherwise. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static <T> T checkNotNull(@Nullable T value) {
+ public static <T> @NonNull T checkNotNull(@Nullable T value) {
if (value == null) {
throw new NullPointerException();
}
@@ -50,8 +50,7 @@
/**
* Returns radius in {@link androidx.wear.tiles.DimensionBuilders.DpProp} of the given diameter.
*/
- @NonNull
- static androidx.wear.tiles.DimensionBuilders.DpProp radiusOf(
+ static androidx.wear.tiles.DimensionBuilders.@NonNull DpProp radiusOf(
androidx.wear.tiles.DimensionBuilders.DpProp diameter) {
return androidx.wear.tiles.DimensionBuilders.dp(diameter.getValue() / 2);
}
@@ -62,8 +61,7 @@
*/
@RestrictTo(Scope.LIBRARY_GROUP)
public static boolean isRoundDevice(
- @NonNull
- androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
+ androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
deviceParameters) {
return deviceParameters.getScreenShape()
== androidx.wear.tiles.DeviceParametersBuilders.SCREEN_SHAPE_ROUND;
@@ -71,15 +69,13 @@
/** Returns String representation of tag from byte array. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static String getTagName(@NonNull byte[] tagData) {
+ public static @NonNull String getTagName(byte @NonNull [] tagData) {
return new String(tagData, StandardCharsets.UTF_8);
}
/** Returns byte array representation of tag from String. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static byte[] getTagBytes(@NonNull String tagName) {
+ public static byte @NonNull [] getTagBytes(@NonNull String tagName) {
return tagName.getBytes(StandardCharsets.UTF_8);
}
@@ -87,9 +83,8 @@
* Returns the String representation of metadata tag from the given
* androidx.wear.tiles.ModifiersBuilders.ElementMetadata.
*/
- @NonNull
- public static String getMetadataTagName(
- @NonNull androidx.wear.tiles.ModifiersBuilders.ElementMetadata metadata) {
+ public static @NonNull String getMetadataTagName(
+ androidx.wear.tiles.ModifiersBuilders.@NonNull ElementMetadata metadata) {
return getTagName(getMetadataTagBytes(metadata));
}
@@ -97,9 +92,8 @@
* Returns the metadata tag from the given
* androidx.wear.tiles.ModifiersBuilders.ElementMetadata.
*/
- @NonNull
- public static byte[] getMetadataTagBytes(
- @NonNull androidx.wear.tiles.ModifiersBuilders.ElementMetadata metadata) {
+ public static byte @NonNull [] getMetadataTagBytes(
+ androidx.wear.tiles.ModifiersBuilders.@NonNull ElementMetadata metadata) {
return checkNotNull(metadata).getTagData();
}
@@ -108,7 +102,7 @@
* set to the given String value.
*/
public static boolean checkTag(
- @Nullable androidx.wear.tiles.ModifiersBuilders.Modifiers modifiers,
+ androidx.wear.tiles.ModifiersBuilders.@Nullable Modifiers modifiers,
@NonNull String validTag) {
return modifiers != null
&& modifiers.getMetadata() != null
@@ -120,7 +114,7 @@
* set to any of the value in the given String collection.
*/
public static boolean checkTag(
- @Nullable androidx.wear.tiles.ModifiersBuilders.Modifiers modifiers,
+ androidx.wear.tiles.ModifiersBuilders.@Nullable Modifiers modifiers,
@NonNull Collection<String> validTags) {
return modifiers != null
&& modifiers.getMetadata() != null
@@ -132,9 +126,9 @@
* set with prefix that is equal to the given String and its length is of the given base array.
*/
public static boolean checkTag(
- @Nullable androidx.wear.tiles.ModifiersBuilders.Modifiers modifiers,
+ androidx.wear.tiles.ModifiersBuilders.@Nullable Modifiers modifiers,
@NonNull String validPrefix,
- @NonNull byte[] validBase) {
+ byte @NonNull [] validBase) {
if (modifiers == null || modifiers.getMetadata() == null) {
return false;
}
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ProgressIndicatorColors.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ProgressIndicatorColors.java
index 079f675f..04af668 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ProgressIndicatorColors.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ProgressIndicatorColors.java
@@ -17,7 +17,8 @@
package androidx.wear.tiles.material;
import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
+
+import org.jspecify.annotations.NonNull;
/**
* Represents the indicator and track colors used in a progress indicator Tiles component.
@@ -31,8 +32,8 @@
@Deprecated
@SuppressWarnings("deprecation")
public class ProgressIndicatorColors {
- @NonNull private final androidx.wear.tiles.ColorBuilders.ColorProp mIndicatorColor;
- @NonNull private final androidx.wear.tiles.ColorBuilders.ColorProp mTrackColor;
+ private final androidx.wear.tiles.ColorBuilders.@NonNull ColorProp mIndicatorColor;
+ private final androidx.wear.tiles.ColorBuilders.@NonNull ColorProp mTrackColor;
/**
* Constructor for {@link ProgressIndicatorColors} object.
@@ -43,8 +44,8 @@
* component.
*/
public ProgressIndicatorColors(
- @NonNull androidx.wear.tiles.ColorBuilders.ColorProp indicatorColor,
- @NonNull androidx.wear.tiles.ColorBuilders.ColorProp trackColor) {
+ androidx.wear.tiles.ColorBuilders.@NonNull ColorProp indicatorColor,
+ androidx.wear.tiles.ColorBuilders.@NonNull ColorProp trackColor) {
this.mIndicatorColor = indicatorColor;
this.mTrackColor = trackColor;
}
@@ -67,20 +68,17 @@
* indicator color and the current Surface color for the track color from the given {@link
* Colors}.
*/
- @NonNull
- public static ProgressIndicatorColors progressIndicatorColors(@NonNull Colors colors) {
+ public static @NonNull ProgressIndicatorColors progressIndicatorColors(@NonNull Colors colors) {
return new ProgressIndicatorColors(colors.getPrimary(), colors.getSurface());
}
/** The indicator color to be used for a progress indicator Tiles component. */
- @NonNull
- public androidx.wear.tiles.ColorBuilders.ColorProp getIndicatorColor() {
+ public androidx.wear.tiles.ColorBuilders.@NonNull ColorProp getIndicatorColor() {
return mIndicatorColor;
}
/** The background track color to be used for a progress indicator Tiles component. */
- @NonNull
- public androidx.wear.tiles.ColorBuilders.ColorProp getTrackColor() {
+ public androidx.wear.tiles.ColorBuilders.@NonNull ColorProp getTrackColor() {
return mTrackColor;
}
}
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ProgressIndicatorDefaults.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ProgressIndicatorDefaults.java
index ef92913..54c2c5b 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ProgressIndicatorDefaults.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/ProgressIndicatorDefaults.java
@@ -16,10 +16,11 @@
package androidx.wear.tiles.material;
-import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
+import org.jspecify.annotations.NonNull;
+
/**
* Contains the default values used by {@link CircularProgressIndicator} Tiles components.
*
@@ -33,19 +34,16 @@
private ProgressIndicatorDefaults() {}
/** The default stroke width for {@link CircularProgressIndicator} */
- @NonNull
- public static final androidx.wear.tiles.DimensionBuilders.DpProp DEFAULT_STROKE_WIDTH =
+ public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp DEFAULT_STROKE_WIDTH =
androidx.wear.tiles.DimensionBuilders.dp(8);
/** The default padding for {@link CircularProgressIndicator} */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static final androidx.wear.tiles.DimensionBuilders.DpProp DEFAULT_PADDING =
+ public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp DEFAULT_PADDING =
androidx.wear.tiles.DimensionBuilders.dp(6);
/** The recommended colors for {@link CircularProgressIndicator}. */
- @NonNull
- public static final ProgressIndicatorColors DEFAULT_COLORS =
+ public static final @NonNull ProgressIndicatorColors DEFAULT_COLORS =
ProgressIndicatorColors.progressIndicatorColors(Colors.DEFAULT);
static final float DEFAULT_GAP_LENGTH = 47.8f;
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Text.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Text.java
index 2819794..ed5b641 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Text.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Text.java
@@ -19,14 +19,15 @@
import android.content.Context;
import androidx.annotation.IntRange;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.wear.protolayout.expression.Fingerprint;
import androidx.wear.protolayout.proto.LayoutElementProto;
import androidx.wear.protolayout.proto.ModifiersProto;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
/**
* Tiles component {@link Text} that represents text object holding any information.
*
@@ -64,20 +65,19 @@
*/
static final String METADATA_TAG = "TXT";
- @NonNull private final androidx.wear.tiles.LayoutElementBuilders.Text mText;
+ private final androidx.wear.tiles.LayoutElementBuilders.@NonNull Text mText;
- Text(@NonNull androidx.wear.tiles.LayoutElementBuilders.Text mText) {
+ Text(androidx.wear.tiles.LayoutElementBuilders.@NonNull Text mText) {
this.mText = mText;
}
/** Builder class for {@link Text}. */
public static final class Builder
implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
- @NonNull private final Context mContext;
- @NonNull private String mTextContent = "";
+ private final @NonNull Context mContext;
+ private @NonNull String mTextContent = "";
- @NonNull
- private androidx.wear.tiles.ColorBuilders.ColorProp mColor =
+ private androidx.wear.tiles.ColorBuilders.@NonNull ColorProp mColor =
androidx.wear.tiles.ColorBuilders.argb(Colors.DEFAULT.getOnPrimary());
private @Typography.TypographyName int mTypographyName = Typography.TYPOGRAPHY_DISPLAY1;
@@ -89,14 +89,13 @@
private int mMultilineAlignment =
androidx.wear.tiles.LayoutElementBuilders.TEXT_ALIGN_CENTER;
- @NonNull
- private androidx.wear.tiles.ModifiersBuilders.Modifiers mModifiers =
+ private androidx.wear.tiles.ModifiersBuilders.@NonNull Modifiers mModifiers =
new androidx.wear.tiles.ModifiersBuilders.Modifiers.Builder().build();
private @androidx.wear.tiles.LayoutElementBuilders.TextOverflow int mOverflow =
androidx.wear.tiles.LayoutElementBuilders.TEXT_OVERFLOW_ELLIPSIZE_END;
private boolean mIsScalable = true;
- @Nullable private Integer mCustomWeight = null;
+ private @Nullable Integer mCustomWeight = null;
/**
* Creates a builder for {@link Text}.
@@ -113,12 +112,11 @@
* Sets the typography for the {@link Text}. If not set, {@link
* Typography#TYPOGRAPHY_DISPLAY1} will be used.
*/
- @NonNull
@SuppressWarnings("MissingGetterMatchingBuilder")
// There is getFontStyle matching getter for this setter as the serialized format of the
// Tiles do not allow for a direct reconstruction of the all arguments, but it has
// androidx.wear.tiles.LayoutElementBuilders.FontStyle object of that text.
- public Builder setTypography(@Typography.TypographyName int typography) {
+ public @NonNull Builder setTypography(@Typography.TypographyName int typography) {
this.mTypographyName = typography;
return this;
}
@@ -136,29 +134,26 @@
* Sets the color for the {@link Text}. If not set, onPrimary color from the {@link
* Colors#DEFAULT} will be used.
*/
- @NonNull
- public Builder setColor(@NonNull androidx.wear.tiles.ColorBuilders.ColorProp color) {
+ public @NonNull Builder setColor(
+ androidx.wear.tiles.ColorBuilders.@NonNull ColorProp color) {
this.mColor = color;
return this;
}
/** Sets the text to be italic. If not set, false will be used. */
- @NonNull
- public Builder setItalic(boolean italic) {
+ public @NonNull Builder setItalic(boolean italic) {
this.mItalic = italic;
return this;
}
/** Sets the text to be underlined. If not set, false will be used. */
- @NonNull
- public Builder setUnderline(boolean underline) {
+ public @NonNull Builder setUnderline(boolean underline) {
this.mUnderline = underline;
return this;
}
/** Sets the maximum lines of text. If not set, 1 will be used. */
- @NonNull
- public Builder setMaxLines(@IntRange(from = 1) int maxLines) {
+ public @NonNull Builder setMaxLines(@IntRange(from = 1) int maxLines) {
this.mMaxLines = maxLines;
return this;
}
@@ -169,17 +164,15 @@
* container should be used. If not set, {@link
* androidx.wear.tiles.LayoutElementBuilders.TextAlignment#TEXT_ALIGN_CENTER} will be used.
*/
- @NonNull
- public Builder setMultilineAlignment(
+ public @NonNull Builder setMultilineAlignment(
@androidx.wear.tiles.LayoutElementBuilders.TextAlignment int multilineAlignment) {
this.mMultilineAlignment = multilineAlignment;
return this;
}
/** Sets the modifiers of text. */
- @NonNull
- public Builder setModifiers(
- @NonNull androidx.wear.tiles.ModifiersBuilders.Modifiers modifiers) {
+ public @NonNull Builder setModifiers(
+ androidx.wear.tiles.ModifiersBuilders.@NonNull Modifiers modifiers) {
this.mModifiers = modifiers;
return this;
}
@@ -189,8 +182,7 @@
* androidx.wear.tiles.LayoutElementBuilders.TextAlignment#TEXT_OVERFLOW_ELLIPSIZE_END} will
* be used.
*/
- @NonNull
- public Builder setOverflow(
+ public @NonNull Builder setOverflow(
@androidx.wear.tiles.LayoutElementBuilders.TextOverflow int overflow) {
this.mOverflow = overflow;
return this;
@@ -200,16 +192,15 @@
* Sets the weight of the font. If not set, default weight for the chosen Typography will be
* used.
*/
- @NonNull
- public Builder setWeight(@androidx.wear.tiles.LayoutElementBuilders.FontWeight int weight) {
+ public @NonNull Builder setWeight(
+ @androidx.wear.tiles.LayoutElementBuilders.FontWeight int weight) {
this.mCustomWeight = weight;
return this;
}
/** Constructs and returns {@link Text} with the provided content and look. */
- @NonNull
@Override
- public Text build() {
+ public @NonNull Text build() {
androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder fontStyleBuilder =
Typography.getFontStyleBuilder(mTypographyName, mContext, mIsScalable)
.setColor(mColor)
@@ -231,8 +222,7 @@
return new Text(text.build());
}
- @NonNull
- static androidx.wear.tiles.ModifiersBuilders.Modifiers addTagToModifiers(
+ static androidx.wear.tiles.ModifiersBuilders.@NonNull Modifiers addTagToModifiers(
androidx.wear.tiles.ModifiersBuilders.Modifiers modifiers) {
return androidx.wear.tiles.ModifiersBuilders.Modifiers.fromProto(
ModifiersProto.Modifiers.newBuilder(modifiers.toProto())
@@ -250,22 +240,19 @@
}
/** Returns the text of this Text element. */
- @NonNull
- public String getText() {
+ public @NonNull String getText() {
return androidx.wear.tiles.material.Helper.checkNotNull(
androidx.wear.tiles.material.Helper.checkNotNull(mText.getText()).getValue());
}
/** Returns the color of this Text element. */
- @NonNull
- public androidx.wear.tiles.ColorBuilders.ColorProp getColor() {
+ public androidx.wear.tiles.ColorBuilders.@NonNull ColorProp getColor() {
return androidx.wear.tiles.material.Helper.checkNotNull(
androidx.wear.tiles.material.Helper.checkNotNull(mText.getFontStyle()).getColor());
}
/** Returns the font style of this Text element. */
- @NonNull
- public androidx.wear.tiles.LayoutElementBuilders.FontStyle getFontStyle() {
+ public androidx.wear.tiles.LayoutElementBuilders.@NonNull FontStyle getFontStyle() {
return androidx.wear.tiles.material.Helper.checkNotNull(mText.getFontStyle());
}
@@ -287,8 +274,7 @@
}
/** Returns the modifiers of this Text element. */
- @NonNull
- public androidx.wear.tiles.ModifiersBuilders.Modifiers getModifiers() {
+ public androidx.wear.tiles.ModifiersBuilders.@NonNull Modifiers getModifiers() {
return androidx.wear.tiles.material.Helper.checkNotNull(mText.getModifiers());
}
@@ -324,8 +310,7 @@
}
/** Returns metadata tag set to this Text, which should be {@link #METADATA_TAG}. */
- @NonNull
- String getMetadataTag() {
+ @NonNull String getMetadataTag() {
return androidx.wear.tiles.material.Helper.getMetadataTagName(
androidx.wear.tiles.material.Helper.checkNotNull(
androidx.wear.tiles.material.Helper.checkNotNull(getModifiers())
@@ -338,9 +323,8 @@
* container's content with {@code container.getContents().get(index)}) if that element can be
* converted to Material Text. Otherwise, it will return null.
*/
- @Nullable
- public static Text fromLayoutElement(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement element) {
+ public static @Nullable Text fromLayoutElement(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement element) {
if (element instanceof Text) {
return (Text) element;
}
@@ -357,17 +341,15 @@
return new Text(textElement);
}
- @NonNull
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- public LayoutElementProto.LayoutElement toLayoutElementProto() {
+ public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
return mText.toLayoutElementProto();
}
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
@Override
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mText.getFingerprint();
}
}
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/TitleChip.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/TitleChip.java
index 18cd2a1..3622bb2 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/TitleChip.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/TitleChip.java
@@ -21,13 +21,14 @@
import android.content.Context;
import androidx.annotation.Dimension;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.wear.protolayout.expression.Fingerprint;
import androidx.wear.protolayout.proto.LayoutElementProto;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
/**
* Tiles component {@link TitleChip} that represents clickable object with the text.
*
@@ -71,7 +72,7 @@
*/
static final String METADATA_TAG = "TTLCHP";
- @NonNull private final Chip mElement;
+ private final @NonNull Chip mElement;
TitleChip(@NonNull Chip element) {
this.mElement = element;
@@ -80,15 +81,14 @@
/** Builder class for {@link TitleChip}. */
public static final class Builder
implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
- @NonNull private final Context mContext;
- @NonNull private final String mText;
- @NonNull private final androidx.wear.tiles.ModifiersBuilders.Clickable mClickable;
+ private final @NonNull Context mContext;
+ private final @NonNull String mText;
+ private final androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable mClickable;
- @NonNull
- private final androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
+ private final androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
mDeviceParameters;
- @NonNull private ChipColors mChipColors = ChipDefaults.TITLE_PRIMARY_COLORS;
+ private @NonNull ChipColors mChipColors = ChipDefaults.TITLE_PRIMARY_COLORS;
@androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignment
private int mHorizontalAlign =
@@ -96,7 +96,7 @@
// Indicates that the width isn't set, so it will be automatically set by Chip.Builder
// constructor.
- @Nullable private androidx.wear.tiles.DimensionBuilders.ContainerDimension mWidth = null;
+ private androidx.wear.tiles.DimensionBuilders.@Nullable ContainerDimension mWidth = null;
/**
* Creates a builder for the {@link TitleChip} with associated action and the given text
@@ -111,9 +111,8 @@
public Builder(
@NonNull Context context,
@NonNull String text,
- @NonNull androidx.wear.tiles.ModifiersBuilders.Clickable clickable,
- @NonNull
- androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
+ androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable clickable,
+ androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
deviceParameters) {
this.mContext = context;
this.mText = text;
@@ -127,15 +126,13 @@
* ChipColors#getContentColor()} for the text. If not set, {@link
* ChipDefaults#TITLE_PRIMARY_COLORS} will be used.
*/
- @NonNull
- public Builder setChipColors(@NonNull ChipColors chipColors) {
+ public @NonNull Builder setChipColors(@NonNull ChipColors chipColors) {
mChipColors = chipColors;
return this;
}
/** Sets the horizontal alignment in the chip. If not set, content will be centered. */
- @NonNull
- public Builder setHorizontalAlignment(
+ public @NonNull Builder setHorizontalAlignment(
@androidx.wear.tiles.LayoutElementBuilders.HorizontalAlignment
int horizontalAlignment) {
mHorizontalAlign = horizontalAlignment;
@@ -146,9 +143,8 @@
* Sets the width of {@link TitleChip}. If not set, default value will be set to fill the
* screen.
*/
- @NonNull
- public Builder setWidth(
- @NonNull androidx.wear.tiles.DimensionBuilders.ContainerDimension width) {
+ public @NonNull Builder setWidth(
+ androidx.wear.tiles.DimensionBuilders.@NonNull ContainerDimension width) {
mWidth = width;
return this;
}
@@ -157,16 +153,14 @@
* Sets the width of {@link TitleChip}. If not set, default value will be set to fill the
* screen.
*/
- @NonNull
- public Builder setWidth(@Dimension(unit = DP) float width) {
+ public @NonNull Builder setWidth(@Dimension(unit = DP) float width) {
mWidth = androidx.wear.tiles.DimensionBuilders.dp(width);
return this;
}
/** Constructs and returns {@link TitleChip} with the provided content and look. */
- @NonNull
@Override
- public TitleChip build() {
+ public @NonNull TitleChip build() {
Chip.Builder chipBuilder =
new Chip.Builder(mContext, mClickable, mDeviceParameters)
.setMetadataTag(METADATA_TAG)
@@ -189,26 +183,22 @@
}
/** Returns width of this Chip. */
- @NonNull
- public androidx.wear.tiles.DimensionBuilders.ContainerDimension getWidth() {
+ public androidx.wear.tiles.DimensionBuilders.@NonNull ContainerDimension getWidth() {
return mElement.getWidth();
}
/** Returns click event action associated with this Chip. */
- @NonNull
- public androidx.wear.tiles.ModifiersBuilders.Clickable getClickable() {
+ public androidx.wear.tiles.ModifiersBuilders.@NonNull Clickable getClickable() {
return mElement.getClickable();
}
/** Returns chip color of this Chip. */
- @NonNull
- public ChipColors getChipColors() {
+ public @NonNull ChipColors getChipColors() {
return mElement.getChipColors();
}
/** Returns text content of this Chip. */
- @NonNull
- public String getText() {
+ public @NonNull String getText() {
return androidx.wear.tiles.material.Helper.checkNotNull(mElement.getPrimaryLabelContent());
}
@@ -219,8 +209,7 @@
}
/** Returns metadata tag set to this TitleChip, which should be {@link #METADATA_TAG}. */
- @NonNull
- String getMetadataTag() {
+ @NonNull String getMetadataTag() {
return mElement.getMetadataTag();
}
@@ -230,9 +219,8 @@
* container's content with {@code container.getContents().get(index)}) if that element can be
* converted to TitleChip. Otherwise, it will return null.
*/
- @Nullable
- public static TitleChip fromLayoutElement(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement element) {
+ public static @Nullable TitleChip fromLayoutElement(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement element) {
if (element instanceof TitleChip) {
return (TitleChip) element;
}
@@ -250,16 +238,14 @@
}
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
@Override
- public LayoutElementProto.LayoutElement toLayoutElementProto() {
+ public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
return mElement.toLayoutElementProto();
}
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
@Override
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mElement.getFingerprint();
}
}
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Typography.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Typography.java
index dd937c9..623b894 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Typography.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/Typography.java
@@ -25,9 +25,10 @@
import androidx.annotation.Dimension;
import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
+import org.jspecify.annotations.NonNull;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.HashMap;
@@ -97,8 +98,8 @@
@interface TypographyName {}
/** Mapping for line height for different typography. */
- @NonNull
- private static final Map<Integer, Float> TYPOGRAPHY_TO_LINE_HEIGHT_SP = new HashMap<>();
+ private static final @NonNull Map<Integer, Float> TYPOGRAPHY_TO_LINE_HEIGHT_SP =
+ new HashMap<>();
static {
TYPOGRAPHY_TO_LINE_HEIGHT_SP.put(TYPOGRAPHY_DISPLAY1, 46f);
@@ -120,8 +121,7 @@
* androidx.wear.tiles.LayoutElementBuilders.FontStyle code with the recommended size, weight
* and letter spacing. Font will be scalable.
*/
- @NonNull
- static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder getFontStyleBuilder(
+ static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder getFontStyleBuilder(
@TypographyName int fontStyleCode, @NonNull Context context) {
return getFontStyleBuilder(fontStyleCode, context, true);
}
@@ -133,8 +133,7 @@
* Typography code with the recommended size, weight and letter spacing, with the option to make
* this font not scalable.
*/
- @NonNull
- static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder getFontStyleBuilder(
+ static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder getFontStyleBuilder(
@TypographyName int typographyCode, @NonNull Context context, boolean isScalable) {
switch (typographyCode) {
case TYPOGRAPHY_BODY1:
@@ -172,8 +171,7 @@
* Returns the recommended line height for the given Typography to be added to the Text
* component.
*/
- @NonNull
- static androidx.wear.tiles.DimensionBuilders.SpProp getLineHeightForTypography(
+ static androidx.wear.tiles.DimensionBuilders.@NonNull SpProp getLineHeightForTypography(
@TypographyName int typography) {
if (!TYPOGRAPHY_TO_LINE_HEIGHT_SP.containsKey(typography)) {
throw new IllegalArgumentException("Typography " + typography + " doesn't exist.");
@@ -184,7 +182,6 @@
.intValue());
}
- @NonNull
@SuppressLint("ResourceType")
// This is a helper function to make the font not scalable. It should interpret in value as DP
// and convert it to SP which is needed to be passed in as a font size. However, we will pass an
@@ -192,7 +189,7 @@
// size on device in 1, so the DP is equal to SP.
// TODO(b/267744228): Remove the warning suppression.
@SuppressWarnings("deprecation")
- private static androidx.wear.tiles.DimensionBuilders.SpProp dpToSp(
+ private static androidx.wear.tiles.DimensionBuilders.@NonNull SpProp dpToSp(
@NonNull Context context, @Dimension(unit = DP) float valueDp) {
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
float scaledSp = (valueDp / metrics.scaledDensity) * metrics.density;
@@ -222,8 +219,7 @@
}
/** Font style for large display text. */
- @NonNull
- private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder display1(
+ private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder display1(
boolean isScalable, @NonNull Context context) {
return createFontStyleBuilder(
40,
@@ -235,8 +231,7 @@
}
/** Font style for medium display text. */
- @NonNull
- private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder display2(
+ private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder display2(
boolean isScalable, @NonNull Context context) {
return createFontStyleBuilder(
34,
@@ -248,8 +243,7 @@
}
/** Font style for small display text. */
- @NonNull
- private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder display3(
+ private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder display3(
boolean isScalable, @NonNull Context context) {
return createFontStyleBuilder(
30,
@@ -261,8 +255,7 @@
}
/** Font style for large title text. */
- @NonNull
- private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder title1(
+ private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder title1(
boolean isScalable, @NonNull Context context) {
return createFontStyleBuilder(
24,
@@ -274,8 +267,7 @@
}
/** Font style for medium title text. */
- @NonNull
- private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder title2(
+ private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder title2(
boolean isScalable, @NonNull Context context) {
return createFontStyleBuilder(
20,
@@ -287,8 +279,7 @@
}
/** Font style for small title text. */
- @NonNull
- private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder title3(
+ private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder title3(
boolean isScalable, @NonNull Context context) {
return createFontStyleBuilder(
16,
@@ -300,8 +291,7 @@
}
/** Font style for normal body text. */
- @NonNull
- private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder body1(
+ private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder body1(
boolean isScalable, @NonNull Context context) {
return createFontStyleBuilder(
16,
@@ -313,8 +303,7 @@
}
/** Font style for small body text. */
- @NonNull
- private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder body2(
+ private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder body2(
boolean isScalable, @NonNull Context context) {
return createFontStyleBuilder(
14,
@@ -326,8 +315,7 @@
}
/** Font style for bold button text. */
- @NonNull
- private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder button(
+ private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder button(
boolean isScalable, @NonNull Context context) {
return createFontStyleBuilder(
15,
@@ -339,8 +327,7 @@
}
/** Font style for large caption text. */
- @NonNull
- private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder caption1(
+ private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder caption1(
boolean isScalable, @NonNull Context context) {
return createFontStyleBuilder(
14,
@@ -352,8 +339,7 @@
}
/** Font style for medium caption text. */
- @NonNull
- private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder caption2(
+ private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder caption2(
boolean isScalable, @NonNull Context context) {
return createFontStyleBuilder(
12,
@@ -365,8 +351,7 @@
}
/** Font style for small caption text. */
- @NonNull
- private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.Builder caption3(
+ private static androidx.wear.tiles.LayoutElementBuilders.FontStyle.@NonNull Builder caption3(
boolean isScalable, @NonNull Context context) {
return createFontStyleBuilder(
10,
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/EdgeContentLayout.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/EdgeContentLayout.java
index 2f0c55c..c257513 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/EdgeContentLayout.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/EdgeContentLayout.java
@@ -17,13 +17,14 @@
package androidx.wear.tiles.material.layouts;
import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.wear.protolayout.expression.Fingerprint;
import androidx.wear.protolayout.proto.LayoutElementProto;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Arrays;
@@ -123,16 +124,16 @@
})
@interface ContentBits {}
- @NonNull private final androidx.wear.tiles.LayoutElementBuilders.Box mImpl;
+ private final androidx.wear.tiles.LayoutElementBuilders.@NonNull Box mImpl;
// This contains inner columns and edge content.
- @NonNull private final List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement> mContents;
+ private final @NonNull List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement> mContents;
// This contains optional labels, spacers and main content.
- @NonNull
- private final List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement> mInnerColumn;
+ private final @NonNull List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
+ mInnerColumn;
- EdgeContentLayout(@NonNull androidx.wear.tiles.LayoutElementBuilders.Box layoutElement) {
+ EdgeContentLayout(androidx.wear.tiles.LayoutElementBuilders.@NonNull Box layoutElement) {
this.mImpl = layoutElement;
this.mContents = mImpl.getContents();
this.mInnerColumn =
@@ -146,20 +147,19 @@
/** Builder class for {@link EdgeContentLayout}. */
public static final class Builder
implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
- @NonNull
- private final androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
+ private final androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
mDeviceParameters;
- @Nullable
- private androidx.wear.tiles.LayoutElementBuilders.LayoutElement mEdgeContent = null;
+ private androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement mEdgeContent =
+ null;
- @Nullable
- private androidx.wear.tiles.LayoutElementBuilders.LayoutElement mPrimaryLabelText = null;
+ private androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+ mPrimaryLabelText = null;
- @Nullable
- private androidx.wear.tiles.LayoutElementBuilders.LayoutElement mSecondaryLabelText = null;
+ private androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+ mSecondaryLabelText = null;
- @Nullable private androidx.wear.tiles.LayoutElementBuilders.LayoutElement mContent = null;
+ private androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement mContent = null;
private byte mMetadataContentByte = 0;
/**
@@ -167,8 +167,7 @@
* later be set with ({@link #setContent}.
*/
public Builder(
- @NonNull
- androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
+ androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
deviceParameters) {
this.mDeviceParameters = deviceParameters;
}
@@ -176,18 +175,16 @@
/**
* Sets the content to be around the edges. This can be {@link CircularProgressIndicator}.
*/
- @NonNull
- public Builder setEdgeContent(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement edgeContent) {
+ public @NonNull Builder setEdgeContent(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement edgeContent) {
this.mEdgeContent = edgeContent;
mMetadataContentByte = (byte) (mMetadataContentByte | EDGE_CONTENT_PRESENT);
return this;
}
/** Sets the content in the primary label slot which will be above the main content. */
- @NonNull
- public Builder setPrimaryLabelTextContent(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement primaryLabelText) {
+ public @NonNull Builder setPrimaryLabelTextContent(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement primaryLabelText) {
this.mPrimaryLabelText = primaryLabelText;
mMetadataContentByte = (byte) (mMetadataContentByte | PRIMARY_LABEL_PRESENT);
return this;
@@ -197,10 +194,8 @@
* Sets the content in the secondary label slot which will be below the main content. It is
* highly recommended to have primary label set when having secondary label.
*/
- @NonNull
- public Builder setSecondaryLabelTextContent(
- @NonNull
- androidx.wear.tiles.LayoutElementBuilders.LayoutElement
+ public @NonNull Builder setSecondaryLabelTextContent(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement
secondaryLabelText) {
this.mSecondaryLabelText = secondaryLabelText;
mMetadataContentByte = (byte) (mMetadataContentByte | SECONDARY_LABEL_PRESENT);
@@ -208,18 +203,16 @@
}
/** Sets the additional content to this layout, inside of the screen. */
- @NonNull
- public Builder setContent(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement content) {
+ public @NonNull Builder setContent(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement content) {
this.mContent = content;
mMetadataContentByte = (byte) (mMetadataContentByte | CONTENT_PRESENT);
return this;
}
/** Constructs and returns {@link EdgeContentLayout} with the provided content and look. */
- @NonNull
@Override
- public EdgeContentLayout build() {
+ public @NonNull EdgeContentLayout build() {
float thicknessDp =
mEdgeContent instanceof androidx.wear.tiles.material.CircularProgressIndicator
? ((androidx.wear.tiles.material.CircularProgressIndicator)
@@ -345,8 +338,7 @@
}
/** Returns metadata tag set to this EdgeContentLayout. */
- @NonNull
- byte[] getMetadataTag() {
+ byte @NonNull [] getMetadataTag() {
return androidx.wear.tiles.material.Helper.getMetadataTagBytes(
androidx.wear.tiles.material.Helper.checkNotNull(
androidx.wear.tiles.material.Helper.checkNotNull(mImpl.getModifiers())
@@ -354,8 +346,7 @@
}
/** Returns the inner content from this layout. */
- @Nullable
- public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getContent() {
+ public androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement getContent() {
if (!areElementsPresent(CONTENT_PRESENT)) {
return null;
}
@@ -368,8 +359,8 @@
}
/** Get the primary label content from this layout. */
- @Nullable
- public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getPrimaryLabelTextContent() {
+ public androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+ getPrimaryLabelTextContent() {
if (!areElementsPresent(PRIMARY_LABEL_PRESENT)) {
return null;
}
@@ -378,8 +369,8 @@
}
/** Get the secondary label content from this layout. */
- @Nullable
- public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getSecondaryLabelTextContent() {
+ public androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+ getSecondaryLabelTextContent() {
if (!areElementsPresent(SECONDARY_LABEL_PRESENT)) {
return null;
}
@@ -388,8 +379,7 @@
}
/** Returns the edge content from this layout. */
- @Nullable
- public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getEdgeContent() {
+ public androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement getEdgeContent() {
if (areElementsPresent(EDGE_CONTENT_PRESENT)) {
return mContents.get(1);
}
@@ -402,9 +392,8 @@
* container's content with {@code container.getContents().get(index)}) if that element can be
* converted to EdgeContentLayout. Otherwise, it will return null.
*/
- @Nullable
- public static EdgeContentLayout fromLayoutElement(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement element) {
+ public static @Nullable EdgeContentLayout fromLayoutElement(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement element) {
if (element instanceof EdgeContentLayout) {
return (EdgeContentLayout) element;
}
@@ -421,17 +410,15 @@
return new EdgeContentLayout(boxElement);
}
- @NonNull
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- public LayoutElementProto.LayoutElement toLayoutElementProto() {
+ public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
return mImpl.toLayoutElementProto();
}
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
@Override
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mImpl.getFingerprint();
}
}
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/LayoutDefaults.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/LayoutDefaults.java
index 40b9cb8..883114d 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/LayoutDefaults.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/LayoutDefaults.java
@@ -16,7 +16,7 @@
package androidx.wear.tiles.material.layouts;
-import androidx.annotation.NonNull;
+import org.jspecify.annotations.NonNull;
/**
* Contains the default values used by layout templates for Tiles.
@@ -110,13 +110,11 @@
public static final float EDGE_CONTENT_LAYOUT_PADDING_BELOW_MAIN_CONTENT_DP = 8;
/** The default spacer width for slots in a {@link MultiSlotLayout}. */
- @NonNull
- public static final androidx.wear.tiles.DimensionBuilders.DpProp
+ public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp
MULTI_SLOT_LAYOUT_HORIZONTAL_SPACER_WIDTH = androidx.wear.tiles.DimensionBuilders.dp(8);
/** The recommended space between the main content and additional labels in layouts. */
- @NonNull
- public static final androidx.wear.tiles.DimensionBuilders.DpProp
+ public static final androidx.wear.tiles.DimensionBuilders.@NonNull DpProp
DEFAULT_VERTICAL_SPACER_HEIGHT = androidx.wear.tiles.DimensionBuilders.dp(8);
/** The maximum number of button that can be added to the {@link MultiButtonLayout}. */
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/MultiButtonLayout.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/MultiButtonLayout.java
index 4f521ce..f476080 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/MultiButtonLayout.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/MultiButtonLayout.java
@@ -17,13 +17,14 @@
package androidx.wear.tiles.material.layouts;
import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.wear.protolayout.expression.Fingerprint;
import androidx.wear.protolayout.proto.LayoutElementProto;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
@@ -81,17 +82,16 @@
@IntDef({FIVE_BUTTON_DISTRIBUTION_TOP_HEAVY, FIVE_BUTTON_DISTRIBUTION_BOTTOM_HEAVY})
public @interface ButtonDistribution {}
- @NonNull private final androidx.wear.tiles.LayoutElementBuilders.Box mElement;
+ private final androidx.wear.tiles.LayoutElementBuilders.@NonNull Box mElement;
- MultiButtonLayout(@NonNull androidx.wear.tiles.LayoutElementBuilders.Box mElement) {
+ MultiButtonLayout(androidx.wear.tiles.LayoutElementBuilders.@NonNull Box mElement) {
this.mElement = mElement;
}
/** Builder class for {@link MultiButtonLayout}. */
public static final class Builder
implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
- @NonNull
- private final List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
+ private final @NonNull List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
mButtonsContent = new ArrayList<>();
private @ButtonDistribution int mFiveButtonDistribution =
@@ -109,12 +109,11 @@
* to add a {@link Button} as the layout is optimized for it. Any button added after {@link
* LayoutDefaults#MULTI_BUTTON_MAX_NUMBER} is reached will be discarded.
*/
- @NonNull
@SuppressWarnings("MissingGetterMatchingBuilder")
// There is no direct matching getter for this setter, but there is a getter that gets all
// added buttons.
- public Builder addButtonContent(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement buttonContent) {
+ public @NonNull Builder addButtonContent(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement buttonContent) {
mButtonsContent.add(buttonContent);
return this;
}
@@ -124,16 +123,15 @@
* there is 5 buttons in the layout to determine whether the 3 buttons row is at the top or
* bottom.
*/
- @NonNull
- public Builder setFiveButtonDistribution(@ButtonDistribution int fiveButtonDistribution) {
+ public @NonNull Builder setFiveButtonDistribution(
+ @ButtonDistribution int fiveButtonDistribution) {
this.mFiveButtonDistribution = fiveButtonDistribution;
return this;
}
/** Constructs and returns {@link MultiButtonLayout} with the provided content and look. */
- @NonNull
@Override
- public MultiButtonLayout build() {
+ public @NonNull MultiButtonLayout build() {
int buttonNum = mButtonsContent.size();
if (buttonNum > LayoutDefaults.MULTI_BUTTON_MAX_NUMBER) {
throw new IllegalArgumentException(
@@ -162,8 +160,7 @@
return new MultiButtonLayout(elementBuilder.build());
}
- @NonNull
- private androidx.wear.tiles.LayoutElementBuilders.LayoutElement buildButtons(
+ private androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement buildButtons(
int buttonNum) {
switch (buttonNum) {
case 1:
@@ -255,11 +252,10 @@
return new androidx.wear.tiles.LayoutElementBuilders.Box.Builder().build();
}
- @NonNull
- private androidx.wear.tiles.LayoutElementBuilders.Row build3ButtonRow(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement button1,
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement button2,
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement button3) {
+ private androidx.wear.tiles.LayoutElementBuilders.@NonNull Row build3ButtonRow(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement button1,
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement button2,
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement button3) {
return new androidx.wear.tiles.LayoutElementBuilders.Row.Builder()
.setWidth(androidx.wear.tiles.DimensionBuilders.wrap())
.setHeight(androidx.wear.tiles.DimensionBuilders.wrap())
@@ -271,11 +267,10 @@
.build();
}
- @NonNull
- private androidx.wear.tiles.LayoutElementBuilders.Row build2ButtonRow(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement button1,
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement button2,
- @NonNull androidx.wear.tiles.DimensionBuilders.DpProp size) {
+ private androidx.wear.tiles.LayoutElementBuilders.@NonNull Row build2ButtonRow(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement button1,
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement button2,
+ androidx.wear.tiles.DimensionBuilders.@NonNull DpProp size) {
return new androidx.wear.tiles.LayoutElementBuilders.Row.Builder()
.setWidth(androidx.wear.tiles.DimensionBuilders.wrap())
.setHeight(androidx.wear.tiles.DimensionBuilders.wrap())
@@ -285,24 +280,21 @@
.build();
}
- @NonNull
- private androidx.wear.tiles.LayoutElementBuilders.Spacer buildHorizontalSpacer() {
+ private androidx.wear.tiles.LayoutElementBuilders.@NonNull Spacer buildHorizontalSpacer() {
return new androidx.wear.tiles.LayoutElementBuilders.Spacer.Builder()
.setWidth(LayoutDefaults.MULTI_BUTTON_SPACER_WIDTH)
.build();
}
- @NonNull
- private androidx.wear.tiles.LayoutElementBuilders.Spacer buildVerticalSpacer() {
+ private androidx.wear.tiles.LayoutElementBuilders.@NonNull Spacer buildVerticalSpacer() {
return new androidx.wear.tiles.LayoutElementBuilders.Spacer.Builder()
.setHeight(LayoutDefaults.MULTI_BUTTON_SPACER_HEIGHT)
.build();
}
- @NonNull
- private androidx.wear.tiles.LayoutElementBuilders.Box wrapButton(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement button,
- @NonNull androidx.wear.tiles.DimensionBuilders.DpProp size) {
+ private androidx.wear.tiles.LayoutElementBuilders.@NonNull Box wrapButton(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement button,
+ androidx.wear.tiles.DimensionBuilders.@NonNull DpProp size) {
return new androidx.wear.tiles.LayoutElementBuilders.Box.Builder()
.setWidth(size)
.setHeight(size)
@@ -312,8 +304,8 @@
}
/** Gets the content from this layout, containing all buttons that were added. */
- @NonNull
- public List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement> getButtonContents() {
+ public @NonNull List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
+ getButtonContents() {
List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement> buttons = new ArrayList<>();
List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement> contents =
mElement.getContents();
@@ -343,8 +335,7 @@
}
/** Returns metadata tag set to this MultiButtonLayouts. */
- @NonNull
- String getMetadataTag() {
+ @NonNull String getMetadataTag() {
return androidx.wear.tiles.material.Helper.getMetadataTagName(
androidx.wear.tiles.material.Helper.checkNotNull(
androidx.wear.tiles.material.Helper.checkNotNull(mElement.getModifiers())
@@ -405,9 +396,8 @@
* container's content with {@code container.getContents().get(index)}) if that element can be
* converted to MultiButtonLayout. Otherwise, it will return null.
*/
- @Nullable
- public static MultiButtonLayout fromLayoutElement(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement element) {
+ public static @Nullable MultiButtonLayout fromLayoutElement(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement element) {
if (element instanceof MultiButtonLayout) {
return (MultiButtonLayout) element;
}
@@ -424,17 +414,15 @@
return new MultiButtonLayout(boxElement);
}
- @NonNull
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- public LayoutElementProto.LayoutElement toLayoutElementProto() {
+ public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
return mElement.toLayoutElementProto();
}
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
@Override
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mElement.getFingerprint();
}
}
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/MultiSlotLayout.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/MultiSlotLayout.java
index 104e75e..7e8fe36d 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/MultiSlotLayout.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/MultiSlotLayout.java
@@ -21,13 +21,14 @@
import android.annotation.SuppressLint;
import androidx.annotation.Dimension;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.wear.protolayout.expression.Fingerprint;
import androidx.wear.protolayout.proto.LayoutElementProto;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.util.ArrayList;
import java.util.List;
@@ -73,9 +74,9 @@
*/
static final String METADATA_TAG = "MSL";
- @NonNull private final androidx.wear.tiles.LayoutElementBuilders.Row mElement;
+ private final androidx.wear.tiles.LayoutElementBuilders.@NonNull Row mElement;
- MultiSlotLayout(@NonNull androidx.wear.tiles.LayoutElementBuilders.Row mElement) {
+ MultiSlotLayout(androidx.wear.tiles.LayoutElementBuilders.@NonNull Row mElement) {
this.mElement = mElement;
}
@@ -83,12 +84,10 @@
public static final class Builder
implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
- @NonNull
- private final List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement> mSlotsContent =
- new ArrayList<>();
+ private final @NonNull List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
+ mSlotsContent = new ArrayList<>();
- @NonNull
- private androidx.wear.tiles.DimensionBuilders.DpProp mHorizontalSpacerWidth =
+ private androidx.wear.tiles.DimensionBuilders.@NonNull DpProp mHorizontalSpacerWidth =
LayoutDefaults.MULTI_SLOT_LAYOUT_HORIZONTAL_SPACER_WIDTH;
/**
@@ -98,12 +97,11 @@
public Builder() {}
/** Add one new slot to the layout with the given content inside. */
- @NonNull
@SuppressWarnings("MissingGetterMatchingBuilder")
// There is no direct matching getter for this setter, but there is a getter that gets all
// added slots.
- public Builder addSlotContent(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement slotContent) {
+ public @NonNull Builder addSlotContent(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement slotContent) {
mSlotsContent.add(slotContent);
return this;
}
@@ -113,20 +111,18 @@
* than one slot. If not set, {@link
* LayoutDefaults#MULTI_SLOT_LAYOUT_HORIZONTAL_SPACER_WIDTH} will be used.
*/
- @NonNull
- public Builder setHorizontalSpacerWidth(@Dimension(unit = DP) float width) {
+ public @NonNull Builder setHorizontalSpacerWidth(@Dimension(unit = DP) float width) {
this.mHorizontalSpacerWidth = androidx.wear.tiles.DimensionBuilders.dp(width);
return this;
}
/** Constructs and returns {@link MultiSlotLayout} with the provided content and look. */
- @NonNull
@Override
// The @Dimension(unit = DP) on mVerticalSpacerHeight.getValue() is seemingly being ignored,
// so lint complains that we're passing PX to something expecting DP. Just suppress the
// warning for now.
@SuppressLint("ResourceType")
- public MultiSlotLayout build() {
+ public @NonNull MultiSlotLayout build() {
androidx.wear.tiles.LayoutElementBuilders.Row.Builder rowBuilder =
new androidx.wear.tiles.LayoutElementBuilders.Row.Builder()
.setHeight(androidx.wear.tiles.DimensionBuilders.wrap())
@@ -170,8 +166,8 @@
}
/** Gets the content from this layout, containing all slots that were added. */
- @NonNull
- public List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement> getSlotContents() {
+ public @NonNull List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
+ getSlotContents() {
List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement> slots = new ArrayList<>();
for (androidx.wear.tiles.LayoutElementBuilders.LayoutElement slot :
mElement.getContents()) {
@@ -206,8 +202,7 @@
}
/** Returns metadata tag set to this MultiSlotLayout. */
- @NonNull
- String getMetadataTag() {
+ @NonNull String getMetadataTag() {
return androidx.wear.tiles.material.Helper.getMetadataTagName(
androidx.wear.tiles.material.Helper.checkNotNull(
androidx.wear.tiles.material.Helper.checkNotNull(mElement.getModifiers())
@@ -220,9 +215,8 @@
* container's content with {@code container.getContents().get(index)}) if that element can be
* converted to MultiSlotLayout. Otherwise, it will return null.
*/
- @Nullable
- public static MultiSlotLayout fromLayoutElement(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement element) {
+ public static @Nullable MultiSlotLayout fromLayoutElement(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement element) {
if (element instanceof MultiSlotLayout) {
return (MultiSlotLayout) element;
}
@@ -239,17 +233,15 @@
return new MultiSlotLayout(rowElement);
}
- @NonNull
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- public LayoutElementProto.LayoutElement toLayoutElementProto() {
+ public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
return mElement.toLayoutElementProto();
}
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
@Override
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mElement.getFingerprint();
}
}
diff --git a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/PrimaryLayout.java b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/PrimaryLayout.java
index 037ba46..f3f0e86 100644
--- a/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/PrimaryLayout.java
+++ b/wear/tiles/tiles-material/src/main/java/androidx/wear/tiles/material/layouts/PrimaryLayout.java
@@ -22,13 +22,14 @@
import androidx.annotation.Dimension;
import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.wear.protolayout.expression.Fingerprint;
import androidx.wear.protolayout.proto.LayoutElementProto;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Arrays;
@@ -131,22 +132,21 @@
value = {CHIP_PRESENT, PRIMARY_LABEL_PRESENT, SECONDARY_LABEL_PRESENT, CONTENT_PRESENT})
@interface ContentBits {}
- @NonNull private final androidx.wear.tiles.LayoutElementBuilders.Box mImpl;
+ private final androidx.wear.tiles.LayoutElementBuilders.@NonNull Box mImpl;
// This contains inner columns and primary chip.
- @NonNull
- private final List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement> mAllContent;
+ private final @NonNull List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
+ mAllContent;
// This contains optional labels, spacers and main content.
- @NonNull
- private final List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement> mPrimaryLabel;
+ private final @NonNull List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
+ mPrimaryLabel;
// This contains optional labels, spacers and main content.
- @NonNull
- private final List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
+ private final @NonNull List<androidx.wear.tiles.LayoutElementBuilders.LayoutElement>
mContentAndSecondaryLabel;
- PrimaryLayout(@NonNull androidx.wear.tiles.LayoutElementBuilders.Box layoutElement) {
+ PrimaryLayout(androidx.wear.tiles.LayoutElementBuilders.@NonNull Box layoutElement) {
this.mImpl = layoutElement;
this.mAllContent =
((androidx.wear.tiles.LayoutElementBuilders.Column)
@@ -170,25 +170,22 @@
/** Builder class for {@link PrimaryLayout}. */
public static final class Builder
implements androidx.wear.tiles.LayoutElementBuilders.LayoutElement.Builder {
- @NonNull
- private final androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
+ private final androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
mDeviceParameters;
- @Nullable
- private androidx.wear.tiles.LayoutElementBuilders.LayoutElement mPrimaryChip = null;
+ private androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement mPrimaryChip =
+ null;
- @Nullable
- private androidx.wear.tiles.LayoutElementBuilders.LayoutElement mPrimaryLabelText = null;
+ private androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+ mPrimaryLabelText = null;
- @Nullable
- private androidx.wear.tiles.LayoutElementBuilders.LayoutElement mSecondaryLabelText = null;
+ private androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+ mSecondaryLabelText = null;
- @NonNull
- private androidx.wear.tiles.LayoutElementBuilders.LayoutElement mContent =
+ private androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement mContent =
new androidx.wear.tiles.LayoutElementBuilders.Box.Builder().build();
- @NonNull
- private androidx.wear.tiles.DimensionBuilders.DpProp mVerticalSpacerHeight =
+ private androidx.wear.tiles.DimensionBuilders.@NonNull DpProp mVerticalSpacerHeight =
LayoutDefaults.DEFAULT_VERTICAL_SPACER_HEIGHT;
private byte mMetadataContentByte = 0;
@@ -199,8 +196,7 @@
* #setPrimaryLabelTextContent} and {@link #setSecondaryLabelTextContent}.
*/
public Builder(
- @NonNull
- androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
+ androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
deviceParameters) {
this.mDeviceParameters = deviceParameters;
}
@@ -211,18 +207,16 @@
* but it is strongly recommended to add a {@link CompactChip} as the layout is optimized
* for it.
*/
- @NonNull
- public Builder setPrimaryChipContent(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement compactChip) {
+ public @NonNull Builder setPrimaryChipContent(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement compactChip) {
this.mPrimaryChip = compactChip;
mMetadataContentByte = (byte) (mMetadataContentByte | CHIP_PRESENT);
return this;
}
/** Sets the content in the primary label slot which will be above the main content. */
- @NonNull
- public Builder setPrimaryLabelTextContent(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement primaryLabelText) {
+ public @NonNull Builder setPrimaryLabelTextContent(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement primaryLabelText) {
this.mPrimaryLabelText = primaryLabelText;
mMetadataContentByte = (byte) (mMetadataContentByte | PRIMARY_LABEL_PRESENT);
return this;
@@ -232,10 +226,8 @@
* Sets the content in the primary label slot which will be below the main content. It is
* highly recommended to have primary label set when having secondary label.
*/
- @NonNull
- public Builder setSecondaryLabelTextContent(
- @NonNull
- androidx.wear.tiles.LayoutElementBuilders.LayoutElement
+ public @NonNull Builder setSecondaryLabelTextContent(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement
secondaryLabelText) {
this.mSecondaryLabelText = secondaryLabelText;
mMetadataContentByte = (byte) (mMetadataContentByte | SECONDARY_LABEL_PRESENT);
@@ -252,9 +244,8 @@
* set to {@code expand} to use all the available space, rather than an explicit width which
* may lead to clipping.
*/
- @NonNull
- public Builder setContent(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement content) {
+ public @NonNull Builder setContent(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement content) {
this.mContent = content;
mMetadataContentByte = (byte) (mMetadataContentByte | CONTENT_PRESENT);
return this;
@@ -265,11 +256,10 @@
* secondary label if there is any. If not set, {@link
* LayoutDefaults#DEFAULT_VERTICAL_SPACER_HEIGHT} will be used.
*/
- @NonNull
// The @Dimension(unit = DP) on dp() is seemingly being ignored, so lint complains that
// we're passing PX to something expecting DP. Just suppress the warning for now.
@SuppressLint("ResourceType")
- public Builder setVerticalSpacerHeight(@Dimension(unit = DP) float height) {
+ public @NonNull Builder setVerticalSpacerHeight(@Dimension(unit = DP) float height) {
this.mVerticalSpacerHeight = androidx.wear.tiles.DimensionBuilders.dp(height);
return this;
}
@@ -278,9 +268,8 @@
// The @Dimension(unit = DP) on dp() is seemingly being ignored, so lint complains that
// we're passing DP to something expecting PX. Just suppress the warning for now.
@SuppressLint("ResourceType")
- @NonNull
@Override
- public PrimaryLayout build() {
+ public @NonNull PrimaryLayout build() {
float topPadding = getTopPadding();
float bottomPadding = getBottomPadding();
float horizontalPadding = getHorizontalPadding();
@@ -497,8 +486,8 @@
}
/** Returns the spacer height to be placed above primary label to accommodate Tile icon. */
- @NonNull
- private androidx.wear.tiles.DimensionBuilders.DpProp getPrimaryLabelTopSpacerHeight() {
+ private androidx.wear.tiles.DimensionBuilders.@NonNull DpProp
+ getPrimaryLabelTopSpacerHeight() {
return androidx.wear.tiles.material.Helper.isRoundDevice(mDeviceParameters)
? LayoutDefaults.PRIMARY_LAYOUT_PRIMARY_LABEL_SPACER_HEIGHT_ROUND_DP
: LayoutDefaults.PRIMARY_LAYOUT_PRIMARY_LABEL_SPACER_HEIGHT_SQUARE_DP;
@@ -506,8 +495,8 @@
}
/** Get the primary label content from this layout. */
- @Nullable
- public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getPrimaryLabelTextContent() {
+ public androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+ getPrimaryLabelTextContent() {
if (!areElementsPresent(PRIMARY_LABEL_PRESENT)) {
return null;
}
@@ -515,8 +504,8 @@
}
/** Get the secondary label content from this layout. */
- @Nullable
- public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getSecondaryLabelTextContent() {
+ public androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+ getSecondaryLabelTextContent() {
if (!areElementsPresent(SECONDARY_LABEL_PRESENT)) {
return null;
}
@@ -525,8 +514,7 @@
}
/** Get the inner content from this layout. */
- @Nullable
- public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getContent() {
+ public androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement getContent() {
if (!areElementsPresent(CONTENT_PRESENT)) {
return null;
}
@@ -537,8 +525,8 @@
}
/** Get the primary chip content from this layout. */
- @Nullable
- public androidx.wear.tiles.LayoutElementBuilders.LayoutElement getPrimaryChipContent() {
+ public androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+ getPrimaryChipContent() {
if (areElementsPresent(CHIP_PRESENT)) {
return ((androidx.wear.tiles.LayoutElementBuilders.Box)
mAllContent.get(PRIMARY_CHIP_POSITION))
@@ -573,8 +561,7 @@
}
/** Returns metadata tag set to this PrimaryLayout. */
- @NonNull
- byte[] getMetadataTag() {
+ byte @NonNull [] getMetadataTag() {
return androidx.wear.tiles.material.Helper.getMetadataTagBytes(
androidx.wear.tiles.material.Helper.checkNotNull(
androidx.wear.tiles.material.Helper.checkNotNull(mImpl.getModifiers())
@@ -587,9 +574,8 @@
* container's content with {@code container.getContents().get(index)}) if that element can be
* converted to PrimaryLayout. Otherwise, it will return null.
*/
- @Nullable
- public static PrimaryLayout fromLayoutElement(
- @NonNull androidx.wear.tiles.LayoutElementBuilders.LayoutElement element) {
+ public static @Nullable PrimaryLayout fromLayoutElement(
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull LayoutElement element) {
if (element instanceof PrimaryLayout) {
return (PrimaryLayout) element;
}
@@ -606,17 +592,15 @@
return new PrimaryLayout(boxElement);
}
- @NonNull
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- public LayoutElementProto.LayoutElement toLayoutElementProto() {
+ public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
return mImpl.toLayoutElementProto();
}
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
@Override
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mImpl.getFingerprint();
}
}
diff --git a/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/ButtonTest.java b/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/ButtonTest.java
index 81ac645..7bc6c6a 100644
--- a/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/ButtonTest.java
+++ b/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/ButtonTest.java
@@ -22,11 +22,11 @@
import android.content.Context;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.internal.DoNotInstrument;
@@ -232,15 +232,15 @@
private void assertButton(
@NonNull Button actualButton,
- @NonNull androidx.wear.tiles.DimensionBuilders.DpProp expectedSize,
+ androidx.wear.tiles.DimensionBuilders.@NonNull DpProp expectedSize,
@NonNull ButtonColors expectedButtonColors,
@Nullable String expectedContentDescription,
@NonNull String expectedMetadataTag,
@Nullable String expectedTextContent,
@Nullable String expectedIconContent,
@Nullable String expectedImageContent,
- @Nullable
- androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedCustomContent) {
+ androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+ expectedCustomContent) {
assertButtonIsEqual(
actualButton,
expectedSize,
@@ -268,15 +268,15 @@
private void assertButtonIsEqual(
@NonNull Button actualButton,
- @NonNull androidx.wear.tiles.DimensionBuilders.DpProp expectedSize,
+ androidx.wear.tiles.DimensionBuilders.@NonNull DpProp expectedSize,
@NonNull ButtonColors expectedButtonColors,
@Nullable String expectedContentDescription,
@NonNull String expectedMetadataTag,
@Nullable String expectedTextContent,
@Nullable String expectedIconContent,
@Nullable String expectedImageContent,
- @Nullable
- androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedCustomContent) {
+ androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+ expectedCustomContent) {
// Mandatory
assertThat(actualButton.getMetadataTag()).isEqualTo(expectedMetadataTag);
assertThat(actualButton.getClickable().toProto()).isEqualTo(CLICKABLE.toProto());
@@ -323,15 +323,15 @@
private void assertFromLayoutElementButtonIsEqual(
@NonNull Button button,
- @NonNull androidx.wear.tiles.DimensionBuilders.DpProp expectedSize,
+ androidx.wear.tiles.DimensionBuilders.@NonNull DpProp expectedSize,
@NonNull ButtonColors expectedButtonColors,
@Nullable String expectedContentDescription,
@NonNull String expectedMetadataTag,
@Nullable String expectedTextContent,
@Nullable String expectedIconContent,
@Nullable String expectedImageContent,
- @Nullable
- androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedCustomContent) {
+ androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+ expectedCustomContent) {
androidx.wear.tiles.LayoutElementBuilders.Box box =
new androidx.wear.tiles.LayoutElementBuilders.Box.Builder()
.addContent(button)
diff --git a/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/ChipTest.java b/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/ChipTest.java
index 3e96246..808ba0b 100644
--- a/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/ChipTest.java
+++ b/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/ChipTest.java
@@ -23,11 +23,11 @@
import android.content.Context;
import android.graphics.Color;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.internal.DoNotInstrument;
@@ -176,8 +176,8 @@
@Nullable String expectedPrimaryText,
@Nullable String expectedLabel,
@Nullable String expectedIcon,
- @Nullable
- androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedCustomContent) {
+ androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+ expectedCustomContent) {
assertChipIsEqual(
actualChip,
hAlign,
@@ -245,8 +245,8 @@
@Nullable String expectedPrimaryText,
@Nullable String expectedLabel,
@Nullable String expectedIcon,
- @Nullable
- androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedCustomContent) {
+ androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+ expectedCustomContent) {
androidx.wear.tiles.LayoutElementBuilders.Box box =
new androidx.wear.tiles.LayoutElementBuilders.Box.Builder()
.addContent(chip)
@@ -276,8 +276,8 @@
@Nullable String expectedPrimaryText,
@Nullable String expectedLabel,
@Nullable String expectedIcon,
- @Nullable
- androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedCustomContent) {
+ androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
+ expectedCustomContent) {
assertThat(actualChip.getMetadataTag()).isEqualTo(expectedMetadata);
assertThat(actualChip.getClickable().toProto()).isEqualTo(CLICKABLE.toProto());
assertThat(actualChip.getWidth().toContainerDimensionProto())
diff --git a/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/CircularProgressIndicatorTest.java b/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/CircularProgressIndicatorTest.java
index f6b33f8..738ccf4e 100644
--- a/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/CircularProgressIndicatorTest.java
+++ b/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/CircularProgressIndicatorTest.java
@@ -22,10 +22,10 @@
import android.graphics.Color;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.internal.DoNotInstrument;
diff --git a/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/layouts/EdgeContentLayoutTest.java b/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/layouts/EdgeContentLayoutTest.java
index f1b5e00..61f0949 100644
--- a/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/layouts/EdgeContentLayoutTest.java
+++ b/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/layouts/EdgeContentLayoutTest.java
@@ -22,11 +22,11 @@
import android.content.Context;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.internal.DoNotInstrument;
@@ -148,13 +148,11 @@
private void assertLayout(
@NonNull EdgeContentLayout actualLayout,
- @Nullable
- androidx.wear.tiles.LayoutElementBuilders.LayoutElement
+ androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
expectedProgressIndicator,
- @Nullable androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedContent,
- @Nullable androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedPrimaryLabel,
- @Nullable
- androidx.wear.tiles.LayoutElementBuilders.LayoutElement
+ androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement expectedContent,
+ androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement expectedPrimaryLabel,
+ androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
expectedSecondaryLabel) {
assertLayoutIsEqual(
actualLayout,
@@ -183,13 +181,11 @@
private void assertLayoutIsEqual(
@NonNull EdgeContentLayout actualLayout,
- @Nullable
- androidx.wear.tiles.LayoutElementBuilders.LayoutElement
+ androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
expectedProgressIndicator,
- @Nullable androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedContent,
- @Nullable androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedPrimaryLabel,
- @Nullable
- androidx.wear.tiles.LayoutElementBuilders.LayoutElement
+ androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement expectedContent,
+ androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement expectedPrimaryLabel,
+ androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
expectedSecondaryLabel) {
byte[] expectedMetadata = EdgeContentLayout.METADATA_TAG_BASE.clone();
diff --git a/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/layouts/PrimaryLayoutTest.java b/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/layouts/PrimaryLayoutTest.java
index f2e689f..67eb223 100644
--- a/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/layouts/PrimaryLayoutTest.java
+++ b/wear/tiles/tiles-material/src/test/java/androidx/wear/tiles/material/layouts/PrimaryLayoutTest.java
@@ -22,11 +22,11 @@
import android.content.Context;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.internal.DoNotInstrument;
@@ -194,11 +194,10 @@
private void assertLayout(
float height,
@NonNull PrimaryLayout actualLayout,
- @Nullable androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedContent,
- @Nullable androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedPrimaryChip,
- @Nullable androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedPrimaryLabel,
- @Nullable
- androidx.wear.tiles.LayoutElementBuilders.LayoutElement
+ androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement expectedContent,
+ androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement expectedPrimaryChip,
+ androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement expectedPrimaryLabel,
+ androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
expectedSecondaryLabel) {
assertLayoutIsEqual(
height,
@@ -230,11 +229,10 @@
private void assertLayoutIsEqual(
float height,
@NonNull PrimaryLayout actualLayout,
- @Nullable androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedContent,
- @Nullable androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedPrimaryChip,
- @Nullable androidx.wear.tiles.LayoutElementBuilders.LayoutElement expectedPrimaryLabel,
- @Nullable
- androidx.wear.tiles.LayoutElementBuilders.LayoutElement
+ androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement expectedContent,
+ androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement expectedPrimaryChip,
+ androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement expectedPrimaryLabel,
+ androidx.wear.tiles.LayoutElementBuilders.@Nullable LayoutElement
expectedSecondaryLabel) {
byte[] expectedMetadata = PrimaryLayout.METADATA_TAG_BASE.clone();
diff --git a/wear/tiles/tiles-renderer/build.gradle b/wear/tiles/tiles-renderer/build.gradle
index 5c78299..8c21683 100644
--- a/wear/tiles/tiles-renderer/build.gradle
+++ b/wear/tiles/tiles-renderer/build.gradle
@@ -33,6 +33,7 @@
}
dependencies {
+ api(libs.jspecify)
api("androidx.annotation:annotation:1.8.1")
api(libs.guavaListenableFuture)
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/client/TileClient.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/client/TileClient.java
index bb730a1..cf7f642 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/client/TileClient.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/client/TileClient.java
@@ -18,7 +18,6 @@
import static com.google.common.util.concurrent.MoreExecutors.directExecutor;
-import androidx.annotation.NonNull;
import androidx.wear.protolayout.ResourceBuilders;
import androidx.wear.tiles.RequestBuilders;
import androidx.wear.tiles.TileBuilders;
@@ -26,22 +25,21 @@
import com.google.common.util.concurrent.FluentFuture;
import com.google.common.util.concurrent.ListenableFuture;
+import org.jspecify.annotations.NonNull;
+
/** Client to connect and interact with a TileService. */
public interface TileClient {
/** Gets the API version supported by the connected TileService. */
- @NonNull
- ListenableFuture<Integer> requestApiVersion();
+ @NonNull ListenableFuture<Integer> requestApiVersion();
/** Request a tile payload from the connected TileService. */
- @NonNull
- ListenableFuture<TileBuilders.Tile> requestTile(
- @NonNull RequestBuilders.TileRequest requestParams);
+ @NonNull ListenableFuture<TileBuilders.Tile> requestTile(
+ RequestBuilders.@NonNull TileRequest requestParams);
/** Request a resource bundle from the connected TileService. */
- @NonNull
@SuppressWarnings("deprecation") // For backward compatibility
- default ListenableFuture<ResourceBuilders.Resources> requestTileResourcesAsync(
- @NonNull RequestBuilders.ResourcesRequest requestParams) {
+ default @NonNull ListenableFuture<ResourceBuilders.Resources> requestTileResourcesAsync(
+ RequestBuilders.@NonNull ResourcesRequest requestParams) {
return FluentFuture.from(requestResources(requestParams))
.transform(
res -> ResourceBuilders.Resources.fromProto(res.toProto()),
@@ -53,24 +51,19 @@
*
* @deprecated Use {@link #requestTileResourcesAsync(RequestBuilders.ResourcesRequest)} instead.
*/
- @NonNull
@Deprecated
- ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources> requestResources(
- @NonNull RequestBuilders.ResourcesRequest requestParams);
+ @NonNull ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources> requestResources(
+ RequestBuilders.@NonNull ResourcesRequest requestParams);
/** Send a Tile Added notification to the connected TileService. */
- @NonNull
- ListenableFuture<Void> sendOnTileAddedEvent();
+ @NonNull ListenableFuture<Void> sendOnTileAddedEvent();
/** Send a Tile Removed notification to the connected TileService. */
- @NonNull
- ListenableFuture<Void> sendOnTileRemovedEvent();
+ @NonNull ListenableFuture<Void> sendOnTileRemovedEvent();
/** Send a Tile Enter notification to the connected TileService. */
- @NonNull
- ListenableFuture<Void> sendOnTileEnterEvent();
+ @NonNull ListenableFuture<Void> sendOnTileEnterEvent();
/** Send a Tile Leave notification to the connected TileService. */
- @NonNull
- ListenableFuture<Void> sendOnTileLeaveEvent();
+ @NonNull ListenableFuture<Void> sendOnTileLeaveEvent();
}
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/TileRenderer.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/TileRenderer.java
index 89f6230..084841d 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/TileRenderer.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/renderer/TileRenderer.java
@@ -23,8 +23,6 @@
import android.view.View;
import android.view.ViewGroup;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.StyleRes;
import androidx.wear.protolayout.LayoutElementBuilders;
@@ -49,6 +47,9 @@
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -81,24 +82,23 @@
*
* @param nextState The state that the next tile should be in.
*/
- void onClick(@NonNull androidx.wear.tiles.StateBuilders.State nextState);
+ void onClick(androidx.wear.tiles.StateBuilders.@NonNull State nextState);
}
- @NonNull private final Context mUiContext;
- @NonNull private final Executor mLoadActionExecutor;
- @NonNull private final Consumer<StateBuilders.State> mLoadActionListener;
+ private final @NonNull Context mUiContext;
+ private final @NonNull Executor mLoadActionExecutor;
+ private final @NonNull Consumer<StateBuilders.State> mLoadActionListener;
@StyleRes int mTilesTheme = 0; // Default theme.
- @NonNull
- private final Map<PlatformDataProvider, Set<PlatformDataKey<?>>> mPlatformDataProviders =
- new ArrayMap<>();
+ private final @NonNull Map<PlatformDataProvider, Set<PlatformDataKey<?>>>
+ mPlatformDataProviders = new ArrayMap<>();
- @NonNull private final ProtoLayoutViewInstance mInstance;
- @Nullable private final LayoutElementProto.Layout mLayout;
- @Nullable private final ResourceProto.Resources mResources;
- @NonNull private final ListeningExecutorService mUiExecutor;
- @NonNull private final StateStore mStateStore = new StateStore(ImmutableMap.of());
+ private final @NonNull ProtoLayoutViewInstance mInstance;
+ private final LayoutElementProto.@Nullable Layout mLayout;
+ private final ResourceProto.@Nullable Resources mResources;
+ private final @NonNull ListeningExecutorService mUiExecutor;
+ private final @NonNull StateStore mStateStore = new StateStore(ImmutableMap.of());
/**
* Default constructor.
@@ -115,8 +115,8 @@
@Deprecated
public TileRenderer(
@NonNull Context uiContext,
- @NonNull androidx.wear.tiles.LayoutElementBuilders.Layout layout,
- @NonNull androidx.wear.tiles.ResourceBuilders.Resources resources,
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull Layout layout,
+ androidx.wear.tiles.ResourceBuilders.@NonNull Resources resources,
@NonNull Executor loadActionExecutor,
@NonNull LoadActionListener loadActionListener) {
this(
@@ -146,9 +146,9 @@
@Deprecated
public TileRenderer(
@NonNull Context uiContext,
- @NonNull androidx.wear.tiles.LayoutElementBuilders.Layout layout,
+ androidx.wear.tiles.LayoutElementBuilders.@NonNull Layout layout,
@StyleRes int tilesTheme,
- @NonNull androidx.wear.tiles.ResourceBuilders.Resources resources,
+ androidx.wear.tiles.ResourceBuilders.@NonNull Resources resources,
@NonNull Executor loadActionExecutor,
@NonNull LoadActionListener loadActionListener) {
this(
@@ -189,8 +189,8 @@
@StyleRes int tilesTheme,
@NonNull Executor loadActionExecutor,
@NonNull Consumer<StateBuilders.State> loadActionListener,
- @Nullable LayoutElementProto.Layout layout,
- @Nullable ResourceProto.Resources resources,
+ LayoutElementProto.@Nullable Layout layout,
+ ResourceProto.@Nullable Resources resources,
@Nullable Map<PlatformDataProvider, Set<PlatformDataKey<?>>> platformDataProviders) {
this.mUiContext = uiContext;
@@ -227,9 +227,8 @@
this.mInstance = new ProtoLayoutViewInstance(config.build());
}
- @NonNull
@SuppressWarnings("deprecation") // For backward compatibility
- private static Consumer<StateBuilders.State> toStateConsumer(
+ private static @NonNull Consumer<StateBuilders.State> toStateConsumer(
@NonNull LoadActionListener loadActionListener) {
return nextState ->
loadActionListener.onClick(
@@ -253,8 +252,7 @@
* deprecated constructors that accept Layout and Resources.
*/
@Deprecated
- @Nullable
- public View inflate(@NonNull ViewGroup parent) {
+ public @Nullable View inflate(@NonNull ViewGroup parent) {
String errorMessage =
"This method only works with the deprecated constructors that accept Layout and"
+ " Resources.";
@@ -298,38 +296,33 @@
* empty or the top-level LayoutElement has no inner set, or the top-level LayoutElement
* contains an unsupported inner type.
*/
- @NonNull
- public ListenableFuture<View> inflateAsync(
- @NonNull LayoutElementBuilders.Layout layout,
- @NonNull ResourceBuilders.Resources resources,
+ public @NonNull ListenableFuture<View> inflateAsync(
+ LayoutElementBuilders.@NonNull Layout layout,
+ ResourceBuilders.@NonNull Resources resources,
@NonNull ViewGroup parent) {
return inflateLayout(layout.toProto(), resources.toProto(), parent);
}
- @NonNull
- private ListenableFuture<View> inflateLayout(
- @NonNull LayoutElementProto.Layout layout,
- @NonNull ResourceProto.Resources resources,
+ private @NonNull ListenableFuture<View> inflateLayout(
+ LayoutElementProto.@NonNull Layout layout,
+ ResourceProto.@NonNull Resources resources,
@NonNull ViewGroup parent) {
ListenableFuture<Void> result = mInstance.renderAndAttach(layout, resources, parent);
return FluentFuture.from(result).transform(ignored -> parent.getChildAt(0), mUiExecutor);
}
/** Returns the {@link Context} suitable for interacting with the UI. */
- @NonNull
- public Context getUiContext() {
+ public @NonNull Context getUiContext() {
return mUiContext;
}
/** Returns the {@link Executor} for {@code loadActionListener}. */
- @NonNull
- public Executor getLoadActionExecutor() {
+ public @NonNull Executor getLoadActionExecutor() {
return mLoadActionExecutor;
}
/** Returns the Listener for clicks that will cause the contents to be reloaded. */
- @NonNull
- public Consumer<StateBuilders.State> getLoadActionListener() {
+ public @NonNull Consumer<StateBuilders.State> getLoadActionListener() {
return mLoadActionListener;
}
@@ -343,22 +336,20 @@
}
/** Returns the platform data providers that will be registered for this Tile instance. */
- @NonNull
- public Map<PlatformDataProvider, Set<PlatformDataKey<?>>> getPlatformDataProviders() {
+ public @NonNull Map<PlatformDataProvider, Set<PlatformDataKey<?>>> getPlatformDataProviders() {
return Collections.unmodifiableMap(mPlatformDataProviders);
}
/** Builder for {@link TileRenderer}. */
public static final class Builder {
- @NonNull private final Context mUiContext;
- @NonNull private final Executor mLoadActionExecutor;
- @NonNull private final Consumer<StateBuilders.State> mLoadActionListener;
+ private final @NonNull Context mUiContext;
+ private final @NonNull Executor mLoadActionExecutor;
+ private final @NonNull Consumer<StateBuilders.State> mLoadActionListener;
@StyleRes int mTilesTheme = 0; // Default theme.
- @NonNull
- private final Map<PlatformDataProvider, Set<PlatformDataKey<?>>> mPlatformDataProviders =
- new ArrayMap<>();
+ private final @NonNull Map<PlatformDataProvider, Set<PlatformDataKey<?>>>
+ mPlatformDataProviders = new ArrayMap<>();
/**
* Builder for the {@link TileRenderer} class.
@@ -381,8 +372,7 @@
* Sets the theme to use for this Tile instance. This can be used to customise things like
* the default font family. If not set, zero (default theme) will be used.
*/
- @NonNull
- public Builder setTilesTheme(@StyleRes int tilesTheme) {
+ public @NonNull Builder setTilesTheme(@StyleRes int tilesTheme) {
mTilesTheme = tilesTheme;
return this;
}
@@ -392,18 +382,16 @@
* supportedKeys}. Adding the same {@link PlatformDataProvider} several times will override
* previous entries instead of adding multiple entries.
*/
- @NonNull
- public Builder addPlatformDataProvider(
+ public @NonNull Builder addPlatformDataProvider(
@NonNull PlatformDataProvider platformDataProvider,
- @NonNull PlatformDataKey<?>... supportedKeys) {
+ PlatformDataKey<?> @NonNull ... supportedKeys) {
this.mPlatformDataProviders.put(
platformDataProvider, ImmutableSet.copyOf(supportedKeys));
return this;
}
/** Builds {@link TileRenderer} object. */
- @NonNull
- public TileRenderer build() {
+ public @NonNull TileRenderer build() {
return new TileRenderer(
mUiContext,
mTilesTheme,
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineCache.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineCache.java
index edfd08b..8592cae 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineCache.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineCache.java
@@ -17,12 +17,13 @@
package androidx.wear.tiles.timeline;
import androidx.annotation.MainThread;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.wear.protolayout.TimelineBuilders;
import androidx.wear.protolayout.proto.TimelineProto.TimelineEntry;
import androidx.wear.tiles.timeline.internal.TilesTimelineCacheInternal;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
/**
* Timeline cache for Wear Tiles. This will take in a full timeline, and return the appropriate
* entry for the given time from {@code findTimelineEntryForTime}.
@@ -36,12 +37,12 @@
* @deprecated Use {@link #TilesTimelineCache(TimelineBuilders.Timeline)} instead.
*/
@Deprecated
- public TilesTimelineCache(@NonNull androidx.wear.tiles.TimelineBuilders.Timeline timeline) {
+ public TilesTimelineCache(androidx.wear.tiles.TimelineBuilders.@NonNull Timeline timeline) {
mCache = new TilesTimelineCacheInternal(timeline.toProto());
}
/** Default constructor. */
- public TilesTimelineCache(@NonNull TimelineBuilders.Timeline timeline) {
+ public TilesTimelineCache(TimelineBuilders.@NonNull Timeline timeline) {
mCache = new TilesTimelineCacheInternal(timeline.toProto());
}
@@ -58,8 +59,7 @@
*/
@Deprecated
@MainThread
- @Nullable
- public androidx.wear.tiles.TimelineBuilders.TimelineEntry findTimelineEntryForTime(
+ public androidx.wear.tiles.TimelineBuilders.@Nullable TimelineEntry findTimelineEntryForTime(
long timeMillis) {
TimelineEntry entry = mCache.findTimelineEntryForTime(timeMillis);
@@ -81,8 +81,7 @@
* none are valid.
*/
@MainThread
- @Nullable
- public TimelineBuilders.TimelineEntry findTileTimelineEntryForTime(long timeMillis) {
+ public TimelineBuilders.@Nullable TimelineEntry findTileTimelineEntryForTime(long timeMillis) {
TimelineEntry entry = mCache.findTimelineEntryForTime(timeMillis);
if (entry == null) {
@@ -107,9 +106,8 @@
* @deprecated Use {@link #findClosestTileTimelineEntry(long)} instead.
*/
@MainThread
- @Nullable
@Deprecated
- public androidx.wear.tiles.TimelineBuilders.TimelineEntry findClosestTimelineEntry(
+ public androidx.wear.tiles.TimelineBuilders.@Nullable TimelineEntry findClosestTimelineEntry(
long timeMillis) {
TimelineEntry entry = mCache.findClosestTimelineEntry(timeMillis);
@@ -134,8 +132,7 @@
* @return The timeline entry with validity period closest to {@code timeMillis}.
*/
@MainThread
- @Nullable
- public TimelineBuilders.TimelineEntry findClosestTileTimelineEntry(long timeMillis) {
+ public TimelineBuilders.@Nullable TimelineEntry findClosestTileTimelineEntry(long timeMillis) {
TimelineEntry entry = mCache.findClosestTimelineEntry(timeMillis);
if (entry == null) {
@@ -161,7 +158,7 @@
@Deprecated
@MainThread
public long findCurrentTimelineEntryExpiry(
- @NonNull androidx.wear.tiles.TimelineBuilders.TimelineEntry entry,
+ androidx.wear.tiles.TimelineBuilders.@NonNull TimelineEntry entry,
long fromTimeMillis) {
return mCache.findCurrentTimelineEntryExpiry(entry.toProto(), fromTimeMillis);
}
@@ -179,7 +176,7 @@
*/
@MainThread
public long findCurrentTimelineEntryExpiry(
- @NonNull TimelineBuilders.TimelineEntry entry, long fromTimeMillis) {
+ TimelineBuilders.@NonNull TimelineEntry entry, long fromTimeMillis) {
return mCache.findCurrentTimelineEntryExpiry(entry.toProto(), fromTimeMillis);
}
}
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineManager.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineManager.java
index d3ad277..85e601f 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineManager.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/TilesTimelineManager.java
@@ -18,12 +18,13 @@
import android.app.AlarmManager;
-import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import androidx.wear.protolayout.LayoutElementBuilders;
import androidx.wear.protolayout.TimelineBuilders;
import androidx.wear.tiles.timeline.internal.TilesTimelineManagerInternal;
+import org.jspecify.annotations.NonNull;
+
import java.util.concurrent.Executor;
/**
@@ -61,7 +62,7 @@
*/
@Deprecated
void onLayoutUpdate(
- int token, @NonNull androidx.wear.tiles.LayoutElementBuilders.Layout layout);
+ int token, androidx.wear.tiles.LayoutElementBuilders.@NonNull Layout layout);
}
/** Type to listen for layout updates from a given timeline. */
@@ -73,7 +74,7 @@
* @param token The token originally passed to {@link TilesTimelineManager}.
* @param layout The new layout to use.
*/
- void onLayoutUpdate(int token, @NonNull LayoutElementBuilders.Layout layout);
+ void onLayoutUpdate(int token, LayoutElementBuilders.@NonNull Layout layout);
}
private final TilesTimelineManagerInternal mManager;
@@ -96,7 +97,7 @@
public TilesTimelineManager(
@NonNull AlarmManager alarmManager,
@NonNull Clock clock,
- @NonNull androidx.wear.tiles.TimelineBuilders.Timeline timeline,
+ androidx.wear.tiles.TimelineBuilders.@NonNull Timeline timeline,
int token,
@NonNull Executor listenerExecutor,
@NonNull Listener listener) {
@@ -128,7 +129,7 @@
public TilesTimelineManager(
@NonNull AlarmManager alarmManager,
@NonNull Clock clock,
- @NonNull TimelineBuilders.Timeline timeline,
+ TimelineBuilders.@NonNull Timeline timeline,
int token,
@NonNull Executor listenerExecutor,
@NonNull LayoutUpdateListener listener) {
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineCacheInternal.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineCacheInternal.java
index 4571ad5..fa20027 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineCacheInternal.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineCacheInternal.java
@@ -17,12 +17,13 @@
package androidx.wear.tiles.timeline.internal;
import androidx.annotation.MainThread;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.wear.protolayout.proto.TimelineProto.TimeInterval;
import androidx.wear.protolayout.proto.TimelineProto.Timeline;
import androidx.wear.protolayout.proto.TimelineProto.TimelineEntry;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
/**
* Timeline cache for Tiles. This will take in a full timeline, and return the appropriate entry for
* the given time from {@code findTimelineEntryForTime}.
@@ -45,8 +46,7 @@
* none are valid.
*/
@MainThread
- @Nullable
- public TimelineEntry findTimelineEntryForTime(long timeMillis) {
+ public @Nullable TimelineEntry findTimelineEntryForTime(long timeMillis) {
TimelineEntry currentEntry = null;
long currentEntryLength = Long.MAX_VALUE;
@@ -93,8 +93,7 @@
* @return The timeline entry with validity period closest to {@code timeMillis}.
*/
@MainThread
- @Nullable
- public TimelineEntry findClosestTimelineEntry(long timeMillis) {
+ public @Nullable TimelineEntry findClosestTimelineEntry(long timeMillis) {
long currentEntryError = Long.MAX_VALUE;
TimelineEntry currentEntry = null;
diff --git a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineManagerInternal.java b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineManagerInternal.java
index d25e42d..4dc70ac 100644
--- a/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineManagerInternal.java
+++ b/wear/tiles/tiles-renderer/src/main/java/androidx/wear/tiles/timeline/internal/TilesTimelineManagerInternal.java
@@ -23,11 +23,12 @@
import android.app.AlarmManager.OnAlarmListener;
import android.util.Log;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.wear.protolayout.proto.TimelineProto.Timeline;
import androidx.wear.protolayout.proto.TimelineProto.TimelineEntry;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.util.concurrent.Executor;
/**
@@ -65,7 +66,7 @@
private final Executor mListenerExecutor;
private final Listener mListener;
private final int mToken;
- @Nullable private OnAlarmListener mAlarmListener = null;
+ private @Nullable OnAlarmListener mAlarmListener = null;
/**
* Default constructor.
diff --git a/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineCacheTest.java b/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineCacheTest.java
index e7a1782..5ef39ef 100644
--- a/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineCacheTest.java
+++ b/wear/tiles/tiles-renderer/src/test/java/androidx/wear/tiles/timeline/TilesTimelineCacheTest.java
@@ -18,13 +18,13 @@
import static com.google.common.truth.Truth.assertThat;
-import androidx.annotation.Nullable;
import androidx.wear.protolayout.LayoutElementBuilders;
import androidx.wear.protolayout.TimelineBuilders;
import androidx.wear.tiles.TilesTestRunner;
import com.google.common.truth.Expect;
+import org.jspecify.annotations.Nullable;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -552,8 +552,8 @@
}
private void expectTimelineEntryEqual(
- @Nullable TimelineBuilders.TimelineEntry actual,
- @Nullable TimelineBuilders.TimelineEntry expected) {
+ TimelineBuilders.@Nullable TimelineEntry actual,
+ TimelineBuilders.@Nullable TimelineEntry expected) {
if (expected == null) {
expect.that(actual).isNull();
} else {
diff --git a/wear/tiles/tiles/build.gradle b/wear/tiles/tiles/build.gradle
index 316a1fa..a69618c 100644
--- a/wear/tiles/tiles/build.gradle
+++ b/wear/tiles/tiles/build.gradle
@@ -29,6 +29,7 @@
}
dependencies {
+ api(libs.jspecify)
api("androidx.annotation:annotation:1.8.1")
api(project(":wear:protolayout:protolayout"))
api(project(":wear:protolayout:protolayout-expression"))
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ActionBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ActionBuilders.java
index 37ad14f..85f81af 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ActionBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ActionBuilders.java
@@ -22,13 +22,14 @@
import android.annotation.SuppressLint;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.wear.protolayout.expression.Fingerprint;
import androidx.wear.protolayout.proto.ActionProto;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.util.Collections;
import java.util.Map;
@@ -42,39 +43,34 @@
private ActionBuilders() {}
/** Shortcut for building an {@link AndroidStringExtra}. */
- @NonNull
- public static AndroidStringExtra stringExtra(@NonNull String value) {
+ public static @NonNull AndroidStringExtra stringExtra(@NonNull String value) {
return new AndroidStringExtra.Builder().setValue(value).build();
}
/** Shortcut for building an {@link AndroidIntExtra}. */
- @NonNull
- public static AndroidIntExtra intExtra(int value) {
+ public static @NonNull AndroidIntExtra intExtra(int value) {
return new AndroidIntExtra.Builder().setValue(value).build();
}
/** Shortcut for building an {@link AndroidLongExtra}. */
- @NonNull
- public static AndroidLongExtra longExtra(long value) {
+ public static @NonNull AndroidLongExtra longExtra(long value) {
return new AndroidLongExtra.Builder().setValue(value).build();
}
/** Shortcut for building an {@link AndroidDoubleExtra}. */
- @NonNull
- public static AndroidDoubleExtra doubleExtra(double value) {
+ public static @NonNull AndroidDoubleExtra doubleExtra(double value) {
return new AndroidDoubleExtra.Builder().setValue(value).build();
}
/** Shortcut for building an {@link AndroidBooleanExtra}. */
- @NonNull
- public static AndroidBooleanExtra booleanExtra(boolean value) {
+ public static @NonNull AndroidBooleanExtra booleanExtra(boolean value) {
return new AndroidBooleanExtra.Builder().setValue(value).build();
}
/** A string value that can be added to an Android intent's extras. */
public static final class AndroidStringExtra implements AndroidExtra {
private final ActionProto.AndroidStringExtra mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
AndroidStringExtra(ActionProto.AndroidStringExtra impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -82,32 +78,28 @@
}
/** Gets the value. Intended for testing purposes only. */
- @NonNull
- public String getValue() {
+ public @NonNull String getValue() {
return mImpl.getValue();
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static AndroidStringExtra fromProto(@NonNull ActionProto.AndroidStringExtra proto) {
+ static @NonNull AndroidStringExtra fromProto(
+ ActionProto.@NonNull AndroidStringExtra proto) {
return new AndroidStringExtra(proto, null);
}
- @NonNull
- ActionProto.AndroidStringExtra toProto() {
+ ActionProto.@NonNull AndroidStringExtra toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public ActionProto.AndroidExtra toAndroidExtraProto() {
+ public ActionProto.@NonNull AndroidExtra toAndroidExtraProto() {
return ActionProto.AndroidExtra.newBuilder().setStringVal(mImpl).build();
}
@@ -120,16 +112,14 @@
public Builder() {}
/** Sets the value. */
- @NonNull
- public Builder setValue(@NonNull String value) {
+ public @NonNull Builder setValue(@NonNull String value) {
mImpl.setValue(value);
mFingerprint.recordPropertyUpdate(1, value.hashCode());
return this;
}
@Override
- @NonNull
- public AndroidStringExtra build() {
+ public @NonNull AndroidStringExtra build() {
return new AndroidStringExtra(mImpl.build(), mFingerprint);
}
}
@@ -138,7 +128,7 @@
/** An integer value that can be added to an Android intent's extras. */
public static final class AndroidIntExtra implements AndroidExtra {
private final ActionProto.AndroidIntExtra mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
AndroidIntExtra(ActionProto.AndroidIntExtra impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -152,25 +142,21 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static AndroidIntExtra fromProto(@NonNull ActionProto.AndroidIntExtra proto) {
+ static @NonNull AndroidIntExtra fromProto(ActionProto.@NonNull AndroidIntExtra proto) {
return new AndroidIntExtra(proto, null);
}
- @NonNull
- ActionProto.AndroidIntExtra toProto() {
+ ActionProto.@NonNull AndroidIntExtra toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public ActionProto.AndroidExtra toAndroidExtraProto() {
+ public ActionProto.@NonNull AndroidExtra toAndroidExtraProto() {
return ActionProto.AndroidExtra.newBuilder().setIntVal(mImpl).build();
}
@@ -183,16 +169,14 @@
public Builder() {}
/** Sets the value. */
- @NonNull
- public Builder setValue(int value) {
+ public @NonNull Builder setValue(int value) {
mImpl.setValue(value);
mFingerprint.recordPropertyUpdate(1, value);
return this;
}
@Override
- @NonNull
- public AndroidIntExtra build() {
+ public @NonNull AndroidIntExtra build() {
return new AndroidIntExtra(mImpl.build(), mFingerprint);
}
}
@@ -201,7 +185,7 @@
/** A long value that can be added to an Android intent's extras. */
public static final class AndroidLongExtra implements AndroidExtra {
private final ActionProto.AndroidLongExtra mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
AndroidLongExtra(ActionProto.AndroidLongExtra impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -215,25 +199,21 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static AndroidLongExtra fromProto(@NonNull ActionProto.AndroidLongExtra proto) {
+ static @NonNull AndroidLongExtra fromProto(ActionProto.@NonNull AndroidLongExtra proto) {
return new AndroidLongExtra(proto, null);
}
- @NonNull
- ActionProto.AndroidLongExtra toProto() {
+ ActionProto.@NonNull AndroidLongExtra toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public ActionProto.AndroidExtra toAndroidExtraProto() {
+ public ActionProto.@NonNull AndroidExtra toAndroidExtraProto() {
return ActionProto.AndroidExtra.newBuilder().setLongVal(mImpl).build();
}
@@ -246,16 +226,14 @@
public Builder() {}
/** Sets the value. */
- @NonNull
- public Builder setValue(long value) {
+ public @NonNull Builder setValue(long value) {
mImpl.setValue(value);
mFingerprint.recordPropertyUpdate(1, Long.hashCode(value));
return this;
}
@Override
- @NonNull
- public AndroidLongExtra build() {
+ public @NonNull AndroidLongExtra build() {
return new AndroidLongExtra(mImpl.build(), mFingerprint);
}
}
@@ -264,7 +242,7 @@
/** A double value that can be added to an Android intent's extras. */
public static final class AndroidDoubleExtra implements AndroidExtra {
private final ActionProto.AndroidDoubleExtra mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
AndroidDoubleExtra(ActionProto.AndroidDoubleExtra impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -278,25 +256,22 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static AndroidDoubleExtra fromProto(@NonNull ActionProto.AndroidDoubleExtra proto) {
+ static @NonNull AndroidDoubleExtra fromProto(
+ ActionProto.@NonNull AndroidDoubleExtra proto) {
return new AndroidDoubleExtra(proto, null);
}
- @NonNull
- ActionProto.AndroidDoubleExtra toProto() {
+ ActionProto.@NonNull AndroidDoubleExtra toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public ActionProto.AndroidExtra toAndroidExtraProto() {
+ public ActionProto.@NonNull AndroidExtra toAndroidExtraProto() {
return ActionProto.AndroidExtra.newBuilder().setDoubleVal(mImpl).build();
}
@@ -309,16 +284,14 @@
public Builder() {}
/** Sets the value. */
- @NonNull
- public Builder setValue(double value) {
+ public @NonNull Builder setValue(double value) {
mImpl.setValue(value);
mFingerprint.recordPropertyUpdate(1, Double.hashCode(value));
return this;
}
@Override
- @NonNull
- public AndroidDoubleExtra build() {
+ public @NonNull AndroidDoubleExtra build() {
return new AndroidDoubleExtra(mImpl.build(), mFingerprint);
}
}
@@ -327,7 +300,7 @@
/** A boolean value that can be added to an Android intent's extras. */
public static final class AndroidBooleanExtra implements AndroidExtra {
private final ActionProto.AndroidBooleanExtra mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
AndroidBooleanExtra(
ActionProto.AndroidBooleanExtra impl, @Nullable Fingerprint fingerprint) {
@@ -342,25 +315,22 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static AndroidBooleanExtra fromProto(@NonNull ActionProto.AndroidBooleanExtra proto) {
+ static @NonNull AndroidBooleanExtra fromProto(
+ ActionProto.@NonNull AndroidBooleanExtra proto) {
return new AndroidBooleanExtra(proto, null);
}
- @NonNull
- ActionProto.AndroidBooleanExtra toProto() {
+ ActionProto.@NonNull AndroidBooleanExtra toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public ActionProto.AndroidExtra toAndroidExtraProto() {
+ public ActionProto.@NonNull AndroidExtra toAndroidExtraProto() {
return ActionProto.AndroidExtra.newBuilder().setBooleanVal(mImpl).build();
}
@@ -374,16 +344,14 @@
/** Sets the value. */
@SuppressLint("MissingGetterMatchingBuilder")
- @NonNull
- public Builder setValue(boolean value) {
+ public @NonNull Builder setValue(boolean value) {
mImpl.setValue(value);
mFingerprint.recordPropertyUpdate(1, Boolean.hashCode(value));
return this;
}
@Override
- @NonNull
- public AndroidBooleanExtra build() {
+ public @NonNull AndroidBooleanExtra build() {
return new AndroidBooleanExtra(mImpl.build(), mFingerprint);
}
}
@@ -396,29 +364,25 @@
public interface AndroidExtra {
/** Get the protocol buffer representation of this object. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- ActionProto.AndroidExtra toAndroidExtraProto();
+ ActionProto.@NonNull AndroidExtra toAndroidExtraProto();
/** Get the fingerprint for this object or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- Fingerprint getFingerprint();
+ @Nullable Fingerprint getFingerprint();
/** Builder to create {@link AndroidExtra} objects. */
@SuppressLint("StaticFinalBuilder")
interface Builder {
/** Builds an instance with values accumulated in this Builder. */
- @NonNull
- AndroidExtra build();
+ @NonNull AndroidExtra build();
}
}
/**
* Return an instance of one of this object's subtypes, from the protocol buffer representation.
*/
- @NonNull
- static AndroidExtra androidExtraFromProto(@NonNull ActionProto.AndroidExtra proto) {
+ static @NonNull AndroidExtra androidExtraFromProto(ActionProto.@NonNull AndroidExtra proto) {
if (proto.hasStringVal()) {
return AndroidStringExtra.fromProto(proto.getStringVal());
}
@@ -440,7 +404,7 @@
/** A launch action to send an intent to an Android activity. */
public static final class AndroidActivity {
private final ActionProto.AndroidActivity mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
AndroidActivity(ActionProto.AndroidActivity impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -451,8 +415,7 @@
* Gets the package name to send the intent to, for example, "com.google.weather". Intended
* for testing purposes only.
*/
- @NonNull
- public String getPackageName() {
+ public @NonNull String getPackageName() {
return mImpl.getPackageName();
}
@@ -461,14 +424,12 @@
* example, "com.google.weather.WeatherOverviewActivity". Intended for testing purposes
* only.
*/
- @NonNull
- public String getClassName() {
+ public @NonNull String getClassName() {
return mImpl.getClassName();
}
/** Gets the extras to be included in the intent. Intended for testing purposes only. */
- @NonNull
- public Map<String, AndroidExtra> getKeyToExtraMapping() {
+ public @NonNull Map<String, AndroidExtra> getKeyToExtraMapping() {
return Collections.unmodifiableMap(
mImpl.getKeyToExtraMap().entrySet().stream()
.collect(
@@ -479,18 +440,15 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static AndroidActivity fromProto(@NonNull ActionProto.AndroidActivity proto) {
+ static @NonNull AndroidActivity fromProto(ActionProto.@NonNull AndroidActivity proto) {
return new AndroidActivity(proto, null);
}
- @NonNull
- ActionProto.AndroidActivity toProto() {
+ ActionProto.@NonNull AndroidActivity toProto() {
return mImpl;
}
@@ -503,8 +461,7 @@
public Builder() {}
/** Sets the package name to send the intent to, for example, "com.google.weather". */
- @NonNull
- public Builder setPackageName(@NonNull String packageName) {
+ public @NonNull Builder setPackageName(@NonNull String packageName) {
mImpl.setPackageName(packageName);
mFingerprint.recordPropertyUpdate(1, packageName.hashCode());
return this;
@@ -514,8 +471,7 @@
* Sets the fully qualified class name (including the package) to send the intent to,
* for example, "com.google.weather.WeatherOverviewActivity".
*/
- @NonNull
- public Builder setClassName(@NonNull String className) {
+ public @NonNull Builder setClassName(@NonNull String className) {
mImpl.setClassName(className);
mFingerprint.recordPropertyUpdate(2, className.hashCode());
return this;
@@ -523,8 +479,8 @@
/** Adds an entry into the extras to be included in the intent. */
@SuppressLint("MissingGetterMatchingBuilder")
- @NonNull
- public Builder addKeyToExtraMapping(@NonNull String key, @NonNull AndroidExtra extra) {
+ public @NonNull Builder addKeyToExtraMapping(@NonNull String key,
+ @NonNull AndroidExtra extra) {
mImpl.putKeyToExtra(key, extra.toAndroidExtraProto());
mFingerprint.recordPropertyUpdate(
key.hashCode(), checkNotNull(extra.getFingerprint()).aggregateValueAsInt());
@@ -532,8 +488,7 @@
}
/** Builds an instance from accumulated values. */
- @NonNull
- public AndroidActivity build() {
+ public @NonNull AndroidActivity build() {
return new AndroidActivity(mImpl.build(), mFingerprint);
}
}
@@ -546,7 +501,7 @@
*/
public static final class LaunchAction implements Action {
private final ActionProto.LaunchAction mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
LaunchAction(ActionProto.LaunchAction impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -554,8 +509,7 @@
}
/** Gets an action to launch an Android activity. Intended for testing purposes only. */
- @Nullable
- public AndroidActivity getAndroidActivity() {
+ public @Nullable AndroidActivity getAndroidActivity() {
if (mImpl.hasAndroidActivity()) {
return AndroidActivity.fromProto(mImpl.getAndroidActivity());
} else {
@@ -565,25 +519,21 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static LaunchAction fromProto(@NonNull ActionProto.LaunchAction proto) {
+ static @NonNull LaunchAction fromProto(ActionProto.@NonNull LaunchAction proto) {
return new LaunchAction(proto, null);
}
- @NonNull
- ActionProto.LaunchAction toProto() {
+ ActionProto.@NonNull LaunchAction toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public ActionProto.Action toActionProto() {
+ public ActionProto.@NonNull Action toActionProto() {
return ActionProto.Action.newBuilder().setLaunchAction(mImpl).build();
}
@@ -596,8 +546,7 @@
public Builder() {}
/** Sets an action to launch an Android activity. */
- @NonNull
- public Builder setAndroidActivity(@NonNull AndroidActivity androidActivity) {
+ public @NonNull Builder setAndroidActivity(@NonNull AndroidActivity androidActivity) {
mImpl.setAndroidActivity(androidActivity.toProto());
mFingerprint.recordPropertyUpdate(
1, checkNotNull(androidActivity.getFingerprint()).aggregateValueAsInt());
@@ -605,8 +554,7 @@
}
@Override
- @NonNull
- public LaunchAction build() {
+ public @NonNull LaunchAction build() {
return new LaunchAction(mImpl.build(), mFingerprint);
}
}
@@ -615,7 +563,7 @@
/** An action used to load (or reload) the tile contents. */
public static final class LoadAction implements Action {
private final ActionProto.LoadAction mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
LoadAction(ActionProto.LoadAction impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -628,8 +576,7 @@
* {@link androidx.wear.tiles.ModifiersBuilders.Clickable}. Intended for testing purposes
* only.
*/
- @Nullable
- public StateBuilders.State getRequestState() {
+ public StateBuilders.@Nullable State getRequestState() {
if (mImpl.hasRequestState()) {
return StateBuilders.State.fromProto(mImpl.getRequestState());
} else {
@@ -639,25 +586,21 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static LoadAction fromProto(@NonNull ActionProto.LoadAction proto) {
+ static @NonNull LoadAction fromProto(ActionProto.@NonNull LoadAction proto) {
return new LoadAction(proto, null);
}
- @NonNull
- ActionProto.LoadAction toProto() {
+ ActionProto.@NonNull LoadAction toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public ActionProto.Action toActionProto() {
+ public ActionProto.@NonNull Action toActionProto() {
return ActionProto.Action.newBuilder().setLoadAction(mImpl).build();
}
@@ -674,8 +617,7 @@
* androidx.wear.tiles.RequestBuilders.TileRequest} sent after this action is invoked by
* a {@link androidx.wear.tiles.ModifiersBuilders.Clickable}.
*/
- @NonNull
- public Builder setRequestState(@NonNull StateBuilders.State requestState) {
+ public @NonNull Builder setRequestState(StateBuilders.@NonNull State requestState) {
mImpl.setRequestState(requestState.toProto());
mFingerprint.recordPropertyUpdate(
1, checkNotNull(requestState.getFingerprint()).aggregateValueAsInt());
@@ -683,8 +625,7 @@
}
@Override
- @NonNull
- public LoadAction build() {
+ public @NonNull LoadAction build() {
return new LoadAction(mImpl.build(), mFingerprint);
}
}
@@ -694,29 +635,25 @@
public interface Action {
/** Get the protocol buffer representation of this object. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- ActionProto.Action toActionProto();
+ ActionProto.@NonNull Action toActionProto();
/** Get the fingerprint for this object or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- Fingerprint getFingerprint();
+ @Nullable Fingerprint getFingerprint();
/** Builder to create {@link Action} objects. */
@SuppressLint("StaticFinalBuilder")
interface Builder {
/** Builds an instance with values accumulated in this Builder. */
- @NonNull
- Action build();
+ @NonNull Action build();
}
}
/**
* Return an instance of one of this object's subtypes, from the protocol buffer representation.
*/
- @NonNull
- static Action actionFromProto(@NonNull ActionProto.Action proto) {
+ static @NonNull Action actionFromProto(ActionProto.@NonNull Action proto) {
if (proto.hasLaunchAction()) {
return LaunchAction.fromProto(proto.getLaunchAction());
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ActiveTileIdentifier.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ActiveTileIdentifier.java
index 419d8f9..9d53721 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ActiveTileIdentifier.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ActiveTileIdentifier.java
@@ -18,7 +18,7 @@
import android.content.ComponentName;
-import androidx.annotation.NonNull;
+import org.jspecify.annotations.NonNull;
/**
* Tile information containing the tile instance ID and component name for identifying a tile
@@ -34,8 +34,7 @@
}
/** Component name of the tile provider. */
- @NonNull
- public ComponentName getComponentName() {
+ public @NonNull ComponentName getComponentName() {
return mComponentName;
}
@@ -53,8 +52,7 @@
* represented as the tileId, concatenated with a ':' and then the component name flattened
* to string.
*/
- @NonNull
- String flattenToString() {
+ @NonNull String flattenToString() {
return mInstanceId + ":" + mComponentName.flattenToString();
}
@@ -67,8 +65,7 @@
* @return Returns a new ActiveTileIdentifier containing the tile id and component name that
* were encoded in {@code string}.
*/
- @NonNull
- static ActiveTileIdentifier unflattenFromString(@NonNull String string) {
+ static @NonNull ActiveTileIdentifier unflattenFromString(@NonNull String string) {
int delimiterIndex = string.indexOf(":");
return new ActiveTileIdentifier(
ComponentName.unflattenFromString(string.substring(delimiterIndex + 1)),
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ColorBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ColorBuilders.java
index dd34db9..3e0526a 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ColorBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ColorBuilders.java
@@ -17,13 +17,14 @@
package androidx.wear.tiles;
import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.wear.protolayout.expression.Fingerprint;
import androidx.wear.protolayout.proto.ColorProto;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
/**
* Builders for color utilities for layout elements.
*
@@ -34,15 +35,14 @@
private ColorBuilders() {}
/** Shortcut for building a {@link ColorProp} using an ARGB value. */
- @NonNull
- public static ColorProp argb(@ColorInt int colorArgb) {
+ public static @NonNull ColorProp argb(@ColorInt int colorArgb) {
return new ColorProp.Builder().setArgb(colorArgb).build();
}
/** A property defining a color. */
public static final class ColorProp {
private final ColorProto.ColorProp mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
ColorProp(ColorProto.ColorProp impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -57,18 +57,15 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static ColorProp fromProto(@NonNull ColorProto.ColorProp proto) {
+ static @NonNull ColorProp fromProto(ColorProto.@NonNull ColorProp proto) {
return new ColorProp(proto, null);
}
- @NonNull
- ColorProto.ColorProp toProto() {
+ ColorProto.@NonNull ColorProp toProto() {
return mImpl;
}
@@ -80,16 +77,14 @@
public Builder() {}
/** Sets the color value, in ARGB format. */
- @NonNull
- public Builder setArgb(@ColorInt int argb) {
+ public @NonNull Builder setArgb(@ColorInt int argb) {
mImpl.setArgb(argb);
mFingerprint.recordPropertyUpdate(1, argb);
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public ColorProp build() {
+ public @NonNull ColorProp build() {
return new ColorProp(mImpl.build(), mFingerprint);
}
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/CompositeTileUpdateRequester.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/CompositeTileUpdateRequester.java
index 2233b74..3ac0640 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/CompositeTileUpdateRequester.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/CompositeTileUpdateRequester.java
@@ -16,7 +16,7 @@
package androidx.wear.tiles;
-import androidx.annotation.NonNull;
+import org.jspecify.annotations.NonNull;
import java.util.List;
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DeviceParametersBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DeviceParametersBuilders.java
index 662d045..fbd4755 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DeviceParametersBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DeviceParametersBuilders.java
@@ -21,10 +21,11 @@
import androidx.annotation.Dimension;
import androidx.annotation.FloatRange;
import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
import androidx.wear.protolayout.proto.DeviceParametersProto;
+import org.jspecify.annotations.NonNull;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -108,13 +109,12 @@
return mImpl.getScreenShape().getNumber();
}
- @NonNull
- static DeviceParameters fromProto(@NonNull DeviceParametersProto.DeviceParameters proto) {
+ static @NonNull DeviceParameters fromProto(
+ DeviceParametersProto.@NonNull DeviceParameters proto) {
return new DeviceParameters(proto);
}
- @NonNull
- DeviceParametersProto.DeviceParameters toProto() {
+ DeviceParametersProto.@NonNull DeviceParameters toProto() {
return mImpl;
}
@@ -126,15 +126,13 @@
public Builder() {}
/** Sets width of the device's screen in DP. */
- @NonNull
- public Builder setScreenWidthDp(@Dimension(unit = DP) int screenWidthDp) {
+ public @NonNull Builder setScreenWidthDp(@Dimension(unit = DP) int screenWidthDp) {
mImpl.setScreenWidthDp(screenWidthDp);
return this;
}
/** Sets height of the device's screen in DP. */
- @NonNull
- public Builder setScreenHeightDp(@Dimension(unit = DP) int screenHeightDp) {
+ public @NonNull Builder setScreenHeightDp(@Dimension(unit = DP) int screenHeightDp) {
mImpl.setScreenHeightDp(screenHeightDp);
return this;
}
@@ -143,8 +141,7 @@
* Sets density of the display. This value is the scaling factor to get from DP to
* Pixels (px = dp * density).
*/
- @NonNull
- public Builder setScreenDensity(
+ public @NonNull Builder setScreenDensity(
@FloatRange(from = 0.0, fromInclusive = false, toInclusive = false)
float screenDensity) {
mImpl.setScreenDensity(screenDensity);
@@ -152,23 +149,20 @@
}
/** Sets the platform of the device. */
- @NonNull
- public Builder setDevicePlatform(@DevicePlatform int devicePlatform) {
+ public @NonNull Builder setDevicePlatform(@DevicePlatform int devicePlatform) {
mImpl.setDevicePlatform(
DeviceParametersProto.DevicePlatform.forNumber(devicePlatform));
return this;
}
/** Sets the shape of the device's screen. */
- @NonNull
- public Builder setScreenShape(@ScreenShape int screenShape) {
+ public @NonNull Builder setScreenShape(@ScreenShape int screenShape) {
mImpl.setScreenShape(DeviceParametersProto.ScreenShape.forNumber(screenShape));
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public DeviceParameters build() {
+ public @NonNull DeviceParameters build() {
return DeviceParameters.fromProto(mImpl.build());
}
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DimensionBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DimensionBuilders.java
index e054a94..050de79 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DimensionBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DimensionBuilders.java
@@ -23,13 +23,14 @@
import androidx.annotation.Dimension;
import androidx.annotation.IntRange;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.wear.protolayout.expression.Fingerprint;
import androidx.wear.protolayout.proto.DimensionProto;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
/**
* Builders for dimensions for layout elements.
*
@@ -43,32 +44,27 @@
private static final WrappedDimensionProp WRAP = new WrappedDimensionProp.Builder().build();
/** Shortcut for building a {@link DpProp} using a measurement in DP. */
- @NonNull
- public static DpProp dp(@Dimension(unit = DP) float valueDp) {
+ public static @NonNull DpProp dp(@Dimension(unit = DP) float valueDp) {
return new DpProp.Builder().setValue(valueDp).build();
}
/** Shortcut for building a {@link SpProp} using a measurement in SP. */
- @NonNull
- public static SpProp sp(@Dimension(unit = SP) float valueSp) {
+ public static @NonNull SpProp sp(@Dimension(unit = SP) float valueSp) {
return new SpProp.Builder().setValue(valueSp).build();
}
/** Shortcut for building a {@link EmProp} using a measurement in EM. */
- @NonNull
- public static EmProp em(int valueEm) {
+ public static @NonNull EmProp em(int valueEm) {
return new EmProp.Builder().setValue(valueEm).build();
}
/** Shortcut for building a {@link EmProp} using a measurement in EM. */
- @NonNull
- public static EmProp em(float valueEm) {
+ public static @NonNull EmProp em(float valueEm) {
return new EmProp.Builder().setValue(valueEm).build();
}
/** Shortcut for building an {@link DegreesProp} using a measurement in degrees. */
- @NonNull
- public static DegreesProp degrees(float valueDegrees) {
+ public static @NonNull DegreesProp degrees(float valueDegrees) {
return new DegreesProp.Builder().setValue(valueDegrees).build();
}
@@ -76,8 +72,7 @@
* Shortcut for building an {@link ExpandedDimensionProp} that will expand to the size of its
* parent.
*/
- @NonNull
- public static ExpandedDimensionProp expand() {
+ public static @NonNull ExpandedDimensionProp expand() {
return EXPAND;
}
@@ -85,8 +80,7 @@
* Shortcut for building an {@link WrappedDimensionProp} that will shrink to the size of its
* children.
*/
- @NonNull
- public static WrappedDimensionProp wrap() {
+ public static @NonNull WrappedDimensionProp wrap() {
return WRAP;
}
@@ -94,7 +88,7 @@
public static final class DpProp
implements ContainerDimension, ImageDimension, SpacerDimension {
private final DimensionProto.DpProp mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
DpProp(DimensionProto.DpProp impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -109,39 +103,33 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static DpProp fromProto(@NonNull DimensionProto.DpProp proto) {
+ static @NonNull DpProp fromProto(DimensionProto.@NonNull DpProp proto) {
return new DpProp(proto, null);
}
- @NonNull
- DimensionProto.DpProp toProto() {
+ DimensionProto.@NonNull DpProp toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public DimensionProto.ContainerDimension toContainerDimensionProto() {
+ public DimensionProto.@NonNull ContainerDimension toContainerDimensionProto() {
return DimensionProto.ContainerDimension.newBuilder().setLinearDimension(mImpl).build();
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public DimensionProto.ImageDimension toImageDimensionProto() {
+ public DimensionProto.@NonNull ImageDimension toImageDimensionProto() {
return DimensionProto.ImageDimension.newBuilder().setLinearDimension(mImpl).build();
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public DimensionProto.SpacerDimension toSpacerDimensionProto() {
+ public DimensionProto.@NonNull SpacerDimension toSpacerDimensionProto() {
return DimensionProto.SpacerDimension.newBuilder().setLinearDimension(mImpl).build();
}
@@ -156,16 +144,14 @@
public Builder() {}
/** Sets the value, in dp. */
- @NonNull
- public Builder setValue(@Dimension(unit = DP) float value) {
+ public @NonNull Builder setValue(@Dimension(unit = DP) float value) {
mImpl.setValue(value);
mFingerprint.recordPropertyUpdate(1, Float.floatToIntBits(value));
return this;
}
@Override
- @NonNull
- public DpProp build() {
+ public @NonNull DpProp build() {
return new DpProp(mImpl.build(), mFingerprint);
}
}
@@ -174,7 +160,7 @@
/** A type for font sizes, measured in sp. */
public static final class SpProp {
private final DimensionProto.SpProp mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
SpProp(DimensionProto.SpProp impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -189,18 +175,15 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static SpProp fromProto(@NonNull DimensionProto.SpProp proto) {
+ static @NonNull SpProp fromProto(DimensionProto.@NonNull SpProp proto) {
return new SpProp(proto, null);
}
- @NonNull
- DimensionProto.SpProp toProto() {
+ DimensionProto.@NonNull SpProp toProto() {
return mImpl;
}
@@ -212,16 +195,14 @@
public Builder() {}
/** Sets the value, in sp. */
- @NonNull
- public Builder setValue(@Dimension(unit = SP) float value) {
+ public @NonNull Builder setValue(@Dimension(unit = SP) float value) {
mImpl.setValue(value);
mFingerprint.recordPropertyUpdate(2, Float.floatToIntBits(value));
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public SpProp build() {
+ public @NonNull SpProp build() {
return new SpProp(mImpl.build(), mFingerprint);
}
}
@@ -230,7 +211,7 @@
/** A type for font spacing, measured in em. */
public static final class EmProp {
private final DimensionProto.EmProp mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
EmProp(DimensionProto.EmProp impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -244,18 +225,15 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static EmProp fromProto(@NonNull DimensionProto.EmProp proto) {
+ static @NonNull EmProp fromProto(DimensionProto.@NonNull EmProp proto) {
return new EmProp(proto, null);
}
- @NonNull
- DimensionProto.EmProp toProto() {
+ DimensionProto.@NonNull EmProp toProto() {
return mImpl;
}
@@ -267,16 +245,14 @@
public Builder() {}
/** Sets the value, in em. */
- @NonNull
- public Builder setValue(float value) {
+ public @NonNull Builder setValue(float value) {
mImpl.setValue(value);
mFingerprint.recordPropertyUpdate(1, Float.floatToIntBits(value));
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public EmProp build() {
+ public @NonNull EmProp build() {
return new EmProp(mImpl.build(), mFingerprint);
}
}
@@ -285,7 +261,7 @@
/** A type for angular dimensions, measured in degrees. */
public static final class DegreesProp {
private final DimensionProto.DegreesProp mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
DegreesProp(DimensionProto.DegreesProp impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -299,18 +275,15 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static DegreesProp fromProto(@NonNull DimensionProto.DegreesProp proto) {
+ static @NonNull DegreesProp fromProto(DimensionProto.@NonNull DegreesProp proto) {
return new DegreesProp(proto, null);
}
- @NonNull
- DimensionProto.DegreesProp toProto() {
+ DimensionProto.@NonNull DegreesProp toProto() {
return mImpl;
}
@@ -323,16 +296,14 @@
public Builder() {}
/** Sets the value, in degrees. */
- @NonNull
- public Builder setValue(float value) {
+ public @NonNull Builder setValue(float value) {
mImpl.setValue(value);
mFingerprint.recordPropertyUpdate(1, Float.floatToIntBits(value));
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public DegreesProp build() {
+ public @NonNull DegreesProp build() {
return new DegreesProp(mImpl.build(), mFingerprint);
}
}
@@ -344,7 +315,7 @@
*/
public static final class ExpandedDimensionProp implements ContainerDimension, ImageDimension {
private final DimensionProto.ExpandedDimensionProp mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
ExpandedDimensionProp(
DimensionProto.ExpandedDimensionProp impl, @Nullable Fingerprint fingerprint) {
@@ -354,26 +325,22 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static ExpandedDimensionProp fromProto(
- @NonNull DimensionProto.ExpandedDimensionProp proto) {
+ static @NonNull ExpandedDimensionProp fromProto(
+ DimensionProto.@NonNull ExpandedDimensionProp proto) {
return new ExpandedDimensionProp(proto, null);
}
- @NonNull
- DimensionProto.ExpandedDimensionProp toProto() {
+ DimensionProto.@NonNull ExpandedDimensionProp toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public DimensionProto.ContainerDimension toContainerDimensionProto() {
+ public DimensionProto.@NonNull ContainerDimension toContainerDimensionProto() {
return DimensionProto.ContainerDimension.newBuilder()
.setExpandedDimension(mImpl)
.build();
@@ -381,8 +348,7 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public DimensionProto.ImageDimension toImageDimensionProto() {
+ public DimensionProto.@NonNull ImageDimension toImageDimensionProto() {
return DimensionProto.ImageDimension.newBuilder().setExpandedDimension(mImpl).build();
}
@@ -396,8 +362,7 @@
public Builder() {}
@Override
- @NonNull
- public ExpandedDimensionProp build() {
+ public @NonNull ExpandedDimensionProp build() {
return new ExpandedDimensionProp(mImpl.build(), mFingerprint);
}
}
@@ -409,7 +374,7 @@
*/
public static final class WrappedDimensionProp implements ContainerDimension {
private final DimensionProto.WrappedDimensionProp mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
WrappedDimensionProp(
DimensionProto.WrappedDimensionProp impl, @Nullable Fingerprint fingerprint) {
@@ -419,25 +384,22 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static WrappedDimensionProp fromProto(@NonNull DimensionProto.WrappedDimensionProp proto) {
+ static @NonNull WrappedDimensionProp fromProto(
+ DimensionProto.@NonNull WrappedDimensionProp proto) {
return new WrappedDimensionProp(proto, null);
}
- @NonNull
- DimensionProto.WrappedDimensionProp toProto() {
+ DimensionProto.@NonNull WrappedDimensionProp toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public DimensionProto.ContainerDimension toContainerDimensionProto() {
+ public DimensionProto.@NonNull ContainerDimension toContainerDimensionProto() {
return DimensionProto.ContainerDimension.newBuilder()
.setWrappedDimension(mImpl)
.build();
@@ -452,8 +414,7 @@
public Builder() {}
@Override
- @NonNull
- public WrappedDimensionProp build() {
+ public @NonNull WrappedDimensionProp build() {
return new WrappedDimensionProp(mImpl.build(), mFingerprint);
}
}
@@ -470,7 +431,7 @@
*/
public static final class ProportionalDimensionProp implements ImageDimension {
private final DimensionProto.ProportionalDimensionProp mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
ProportionalDimensionProp(
DimensionProto.ProportionalDimensionProp impl, @Nullable Fingerprint fingerprint) {
@@ -498,26 +459,22 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static ProportionalDimensionProp fromProto(
- @NonNull DimensionProto.ProportionalDimensionProp proto) {
+ static @NonNull ProportionalDimensionProp fromProto(
+ DimensionProto.@NonNull ProportionalDimensionProp proto) {
return new ProportionalDimensionProp(proto, null);
}
- @NonNull
- DimensionProto.ProportionalDimensionProp toProto() {
+ DimensionProto.@NonNull ProportionalDimensionProp toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public DimensionProto.ImageDimension toImageDimensionProto() {
+ public DimensionProto.@NonNull ImageDimension toImageDimensionProto() {
return DimensionProto.ImageDimension.newBuilder()
.setProportionalDimension(mImpl)
.build();
@@ -532,24 +489,22 @@
public Builder() {}
/** Sets the width to be used when calculating the aspect ratio to preserve. */
- @NonNull
- public Builder setAspectRatioWidth(@IntRange(from = 0) int aspectRatioWidth) {
+ public @NonNull Builder setAspectRatioWidth(@IntRange(from = 0) int aspectRatioWidth) {
mImpl.setAspectRatioWidth(aspectRatioWidth);
mFingerprint.recordPropertyUpdate(1, aspectRatioWidth);
return this;
}
/** Sets the height to be used when calculating the aspect ratio ratio to preserve. */
- @NonNull
- public Builder setAspectRatioHeight(@IntRange(from = 0) int aspectRatioHeight) {
+ public @NonNull Builder setAspectRatioHeight(
+ @IntRange(from = 0) int aspectRatioHeight) {
mImpl.setAspectRatioHeight(aspectRatioHeight);
mFingerprint.recordPropertyUpdate(2, aspectRatioHeight);
return this;
}
@Override
- @NonNull
- public ProportionalDimensionProp build() {
+ public @NonNull ProportionalDimensionProp build() {
return new ProportionalDimensionProp(mImpl.build(), mFingerprint);
}
}
@@ -559,30 +514,26 @@
public interface ContainerDimension {
/** Get the protocol buffer representation of this object. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- DimensionProto.ContainerDimension toContainerDimensionProto();
+ DimensionProto.@NonNull ContainerDimension toContainerDimensionProto();
/** Get the fingerprint for this object or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- Fingerprint getFingerprint();
+ @Nullable Fingerprint getFingerprint();
/** Builder to create {@link ContainerDimension} objects. */
@SuppressLint("StaticFinalBuilder")
interface Builder {
/** Builds an instance with values accumulated in this Builder. */
- @NonNull
- ContainerDimension build();
+ @NonNull ContainerDimension build();
}
}
/**
* Return an instance of one of this object's subtypes, from the protocol buffer representation.
*/
- @NonNull
- static ContainerDimension containerDimensionFromProto(
- @NonNull DimensionProto.ContainerDimension proto) {
+ static @NonNull ContainerDimension containerDimensionFromProto(
+ DimensionProto.@NonNull ContainerDimension proto) {
if (proto.hasLinearDimension()) {
return DpProp.fromProto(proto.getLinearDimension());
}
@@ -600,29 +551,26 @@
public interface ImageDimension {
/** Get the protocol buffer representation of this object. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- DimensionProto.ImageDimension toImageDimensionProto();
+ DimensionProto.@NonNull ImageDimension toImageDimensionProto();
/** Get the fingerprint for this object or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- Fingerprint getFingerprint();
+ @Nullable Fingerprint getFingerprint();
/** Builder to create {@link ImageDimension} objects. */
@SuppressLint("StaticFinalBuilder")
interface Builder {
/** Builds an instance with values accumulated in this Builder. */
- @NonNull
- ImageDimension build();
+ @NonNull ImageDimension build();
}
}
/**
* Return an instance of one of this object's subtypes, from the protocol buffer representation.
*/
- @NonNull
- static ImageDimension imageDimensionFromProto(@NonNull DimensionProto.ImageDimension proto) {
+ static @NonNull ImageDimension imageDimensionFromProto(
+ DimensionProto.@NonNull ImageDimension proto) {
if (proto.hasLinearDimension()) {
return DpProp.fromProto(proto.getLinearDimension());
}
@@ -639,26 +587,23 @@
public interface SpacerDimension {
/** Get the protocol buffer representation of this object. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- DimensionProto.SpacerDimension toSpacerDimensionProto();
+ DimensionProto.@NonNull SpacerDimension toSpacerDimensionProto();
/** Get the fingerprint for this object or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- Fingerprint getFingerprint();
+ @Nullable Fingerprint getFingerprint();
/** Builder to create {@link SpacerDimension} objects. */
@SuppressLint("StaticFinalBuilder")
interface Builder {
/** Builds an instance with values accumulated in this Builder. */
- @NonNull
- SpacerDimension build();
+ @NonNull SpacerDimension build();
}
}
- @NonNull
- static SpacerDimension spacerDimensionFromProto(@NonNull DimensionProto.SpacerDimension proto) {
+ static @NonNull SpacerDimension spacerDimensionFromProto(
+ DimensionProto.@NonNull SpacerDimension proto) {
if (proto.hasLinearDimension()) {
return DpProp.fromProto(proto.getLinearDimension());
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DiskAccessAllowedPrefs.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DiskAccessAllowedPrefs.java
index 7928651..884becd 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DiskAccessAllowedPrefs.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/DiskAccessAllowedPrefs.java
@@ -21,18 +21,19 @@
import android.os.StrictMode;
import android.os.StrictMode.ThreadPolicy;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.util.Map;
/** Get versions of shared prefs that ignore strict mode and allows disk reads and writes. */
@RestrictTo(Scope.LIBRARY_GROUP)
final class DiskAccessAllowedPrefs {
- @NonNull private final SharedPreferences preferences;
+ private final @NonNull SharedPreferences preferences;
private DiskAccessAllowedPrefs(@NonNull SharedPreferences preferences) {
this.preferences = preferences;
@@ -42,8 +43,7 @@
* Returns a simplified version of {@link SharedPreferences} wrapped to ignore disk read and
* write StrictMode violations.
*/
- @Nullable
- static DiskAccessAllowedPrefs wrap(@NonNull Context context, @NonNull String name) {
+ static @Nullable DiskAccessAllowedPrefs wrap(@NonNull Context context, @NonNull String name) {
ThreadPolicy policy = StrictMode.allowThreadDiskReads();
try {
SharedPreferences sharedPref = context.getSharedPreferences(name, Context.MODE_PRIVATE);
@@ -53,8 +53,7 @@
}
}
- @Nullable
- Map<String, ?> getAll() {
+ @Nullable Map<String, ?> getAll() {
ThreadPolicy policy = StrictMode.allowThreadDiskReads();
try {
return preferences.getAll();
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/EventBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/EventBuilders.java
index 7e72ffb..0e71b08 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/EventBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/EventBuilders.java
@@ -17,13 +17,14 @@
package androidx.wear.tiles;
import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.annotation.VisibleForTesting;
import androidx.wear.protolayout.expression.RequiresSchemaVersion;
import androidx.wear.tiles.proto.EventProto;
+import org.jspecify.annotations.NonNull;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.time.Instant;
@@ -52,21 +53,18 @@
/** Creates a new wrapper instance from the proto. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static TileAddEvent fromProto(@NonNull EventProto.TileAddEvent proto) {
+ public static @NonNull TileAddEvent fromProto(EventProto.@NonNull TileAddEvent proto) {
return new TileAddEvent(proto);
}
/** Returns the internal proto instance. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public EventProto.TileAddEvent toProto() {
+ public EventProto.@NonNull TileAddEvent toProto() {
return mImpl;
}
@Override
- @NonNull
- public String toString() {
+ public @NonNull String toString() {
return "TileAddEvent{" + "tileId=" + getTileId() + "}";
}
@@ -84,15 +82,13 @@
* carousel. This ID will remain the same for this tile instance as long it is not
* removed from the carousel.
*/
- @NonNull
- public Builder setTileId(int tileId) {
+ public @NonNull Builder setTileId(int tileId) {
mImpl.setTileId(tileId);
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public TileAddEvent build() {
+ public @NonNull TileAddEvent build() {
return TileAddEvent.fromProto(mImpl.build());
}
}
@@ -118,21 +114,19 @@
/** Creates a new wrapper instance from the proto. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static TileRemoveEvent fromProto(@NonNull EventProto.TileRemoveEvent proto) {
+ public static @NonNull TileRemoveEvent fromProto(
+ EventProto.@NonNull TileRemoveEvent proto) {
return new TileRemoveEvent(proto);
}
/** Returns the internal proto instance. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public EventProto.TileRemoveEvent toProto() {
+ public EventProto.@NonNull TileRemoveEvent toProto() {
return mImpl;
}
@Override
- @NonNull
- public String toString() {
+ public @NonNull String toString() {
return "TileRemoveEvent{" + "tileId=" + getTileId() + "}";
}
@@ -149,15 +143,13 @@
* Sets instance ID of the removed tile, allocated when the tile instance was added to
* the carousel.
*/
- @NonNull
- public Builder setTileId(int tileId) {
+ public @NonNull Builder setTileId(int tileId) {
mImpl.setTileId(tileId);
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public TileRemoveEvent build() {
+ public @NonNull TileRemoveEvent build() {
return TileRemoveEvent.fromProto(mImpl.build());
}
}
@@ -183,21 +175,18 @@
/** Creates a new wrapper instance from the proto. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static TileEnterEvent fromProto(@NonNull EventProto.TileEnterEvent proto) {
+ public static @NonNull TileEnterEvent fromProto(EventProto.@NonNull TileEnterEvent proto) {
return new TileEnterEvent(proto);
}
/** Returns the internal proto instance. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public EventProto.TileEnterEvent toProto() {
+ public EventProto.@NonNull TileEnterEvent toProto() {
return mImpl;
}
@Override
- @NonNull
- public String toString() {
+ public @NonNull String toString() {
return "TileEnterEvent{" + "tileId=" + getTileId() + "}";
}
@@ -215,15 +204,13 @@
* carousel. This ID will remain the same for this tile instance as long it is not
* removed from the carousel.
*/
- @NonNull
- public Builder setTileId(int tileId) {
+ public @NonNull Builder setTileId(int tileId) {
mImpl.setTileId(tileId);
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public TileEnterEvent build() {
+ public @NonNull TileEnterEvent build() {
return TileEnterEvent.fromProto(mImpl.build());
}
}
@@ -252,21 +239,18 @@
/** Creates a new wrapper instance from the proto. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static TileLeaveEvent fromProto(@NonNull EventProto.TileLeaveEvent proto) {
+ public static @NonNull TileLeaveEvent fromProto(EventProto.@NonNull TileLeaveEvent proto) {
return new TileLeaveEvent(proto);
}
/** Returns the internal proto instance. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public EventProto.TileLeaveEvent toProto() {
+ public EventProto.@NonNull TileLeaveEvent toProto() {
return mImpl;
}
@Override
- @NonNull
- public String toString() {
+ public @NonNull String toString() {
return "TileLeaveEvent{" + "tileId=" + getTileId() + "}";
}
@@ -284,15 +268,13 @@
* carousel. This ID will remain the same for this tile instance as long it is not
* removed from the carousel.
*/
- @NonNull
- public Builder setTileId(int tileId) {
+ public @NonNull Builder setTileId(int tileId) {
mImpl.setTileId(tileId);
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public TileLeaveEvent build() {
+ public @NonNull TileLeaveEvent build() {
return TileLeaveEvent.fromProto(mImpl.build());
}
}
@@ -347,29 +329,25 @@
* Instant#now()} (Created at the time of {@link
* TileInteractionEvent.Builder#Builder(int,int)} constructor call) if not provided.
*/
- @NonNull
- public Instant getTimestamp() {
+ public @NonNull Instant getTimestamp() {
return Instant.ofEpochMilli(mImpl.getTimestampEpochMillis());
}
/** Creates a new wrapper instance from the proto. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static TileInteractionEvent fromProto(
- @NonNull EventProto.TileInteractionEvent proto) {
+ public static @NonNull TileInteractionEvent fromProto(
+ EventProto.@NonNull TileInteractionEvent proto) {
return new TileInteractionEvent(proto);
}
/** Returns the internal proto instance. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public EventProto.TileInteractionEvent toProto() {
+ public EventProto.@NonNull TileInteractionEvent toProto() {
return mImpl;
}
@Override
- @NonNull
- public String toString() {
+ public @NonNull String toString() {
return "TileInteractionEvent{"
+ "tileId="
+ getTileId()
@@ -382,8 +360,7 @@
/** Builder for {@link TileInteractionEvent} */
public static final class Builder {
- @NonNull
- private final EventProto.TileInteractionEvent.Builder mImpl =
+ private final EventProto.TileInteractionEvent.@NonNull Builder mImpl =
EventProto.TileInteractionEvent.newBuilder();
/** Interface so this Builder can retrieve the current time. */
@@ -441,15 +418,13 @@
* call) if not provided.
*/
@RequiresSchemaVersion(major = 1, minor = 400)
- @NonNull
- public Builder setTimestamp(@NonNull Instant instant) {
+ public @NonNull Builder setTimestamp(@NonNull Instant instant) {
mImpl.setTimestampEpochMillis(instant.toEpochMilli());
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public TileInteractionEvent build() {
+ public @NonNull TileInteractionEvent build() {
return TileInteractionEvent.fromProto(mImpl.build());
}
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/LayoutElementBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/LayoutElementBuilders.java
index 259bddf..eca36c9 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/LayoutElementBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/LayoutElementBuilders.java
@@ -24,8 +24,6 @@
import androidx.annotation.IntDef;
import androidx.annotation.IntRange;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.OptIn;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
@@ -38,6 +36,9 @@
import androidx.wear.protolayout.proto.TypesProto;
import androidx.wear.protolayout.protobuf.InvalidProtocolBufferException;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Collections;
@@ -316,7 +317,7 @@
/** An extensible {@code HorizontalAlignment} property. */
public static final class HorizontalAlignmentProp {
private final AlignmentProto.HorizontalAlignmentProp mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
private HorizontalAlignmentProp(
AlignmentProto.HorizontalAlignmentProp impl, @Nullable Fingerprint fingerprint) {
@@ -332,19 +333,16 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static HorizontalAlignmentProp fromProto(
- @NonNull AlignmentProto.HorizontalAlignmentProp proto) {
+ static @NonNull HorizontalAlignmentProp fromProto(
+ AlignmentProto.@NonNull HorizontalAlignmentProp proto) {
return new HorizontalAlignmentProp(proto, null);
}
- @NonNull
- AlignmentProto.HorizontalAlignmentProp toProto() {
+ AlignmentProto.@NonNull HorizontalAlignmentProp toProto() {
return mImpl;
}
@@ -357,16 +355,14 @@
public Builder() {}
/** Sets the value. */
- @NonNull
- public Builder setValue(@HorizontalAlignment int value) {
+ public @NonNull Builder setValue(@HorizontalAlignment int value) {
mImpl.setValue(AlignmentProto.HorizontalAlignment.forNumber(value));
mFingerprint.recordPropertyUpdate(1, value);
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public HorizontalAlignmentProp build() {
+ public @NonNull HorizontalAlignmentProp build() {
return HorizontalAlignmentProp.fromProto(mImpl.build());
}
}
@@ -375,7 +371,7 @@
/** An extensible {@code VerticalAlignment} property. */
public static final class VerticalAlignmentProp {
private final AlignmentProto.VerticalAlignmentProp mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
VerticalAlignmentProp(
AlignmentProto.VerticalAlignmentProp impl, @Nullable Fingerprint fingerprint) {
@@ -391,19 +387,16 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static VerticalAlignmentProp fromProto(
- @NonNull AlignmentProto.VerticalAlignmentProp proto) {
+ static @NonNull VerticalAlignmentProp fromProto(
+ AlignmentProto.@NonNull VerticalAlignmentProp proto) {
return new VerticalAlignmentProp(proto, null);
}
- @NonNull
- AlignmentProto.VerticalAlignmentProp toProto() {
+ AlignmentProto.@NonNull VerticalAlignmentProp toProto() {
return mImpl;
}
@@ -416,16 +409,14 @@
public Builder() {}
/** Sets the value. */
- @NonNull
- public Builder setValue(@VerticalAlignment int value) {
+ public @NonNull Builder setValue(@VerticalAlignment int value) {
mImpl.setValue(AlignmentProto.VerticalAlignment.forNumber(value));
mFingerprint.recordPropertyUpdate(1, value);
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public VerticalAlignmentProp build() {
+ public @NonNull VerticalAlignmentProp build() {
return new VerticalAlignmentProp(mImpl.build(), mFingerprint);
}
}
@@ -434,7 +425,7 @@
/** An extensible {@code FontWeight} property. */
public static final class FontWeightProp {
private final LayoutElementProto.FontWeightProp mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
FontWeightProp(LayoutElementProto.FontWeightProp impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -449,18 +440,15 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static FontWeightProp fromProto(@NonNull LayoutElementProto.FontWeightProp proto) {
+ static @NonNull FontWeightProp fromProto(LayoutElementProto.@NonNull FontWeightProp proto) {
return new FontWeightProp(proto, null);
}
- @NonNull
- LayoutElementProto.FontWeightProp toProto() {
+ LayoutElementProto.@NonNull FontWeightProp toProto() {
return mImpl;
}
@@ -473,16 +461,14 @@
public Builder() {}
/** Sets the value. */
- @NonNull
- public Builder setValue(@FontWeight int value) {
+ public @NonNull Builder setValue(@FontWeight int value) {
mImpl.setValue(LayoutElementProto.FontWeight.forNumber(value));
mFingerprint.recordPropertyUpdate(1, value);
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public FontWeightProp build() {
+ public @NonNull FontWeightProp build() {
return new FontWeightProp(mImpl.build(), mFingerprint);
}
}
@@ -492,7 +478,7 @@
@TilesExperimental
public static final class FontVariantProp {
private final LayoutElementProto.FontVariantProp mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
FontVariantProp(
LayoutElementProto.FontVariantProp impl, @Nullable Fingerprint fingerprint) {
@@ -508,18 +494,16 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static FontVariantProp fromProto(@NonNull LayoutElementProto.FontVariantProp proto) {
+ static @NonNull FontVariantProp fromProto(
+ LayoutElementProto.@NonNull FontVariantProp proto) {
return new FontVariantProp(proto, null);
}
- @NonNull
- LayoutElementProto.FontVariantProp toProto() {
+ LayoutElementProto.@NonNull FontVariantProp toProto() {
return mImpl;
}
@@ -532,16 +516,14 @@
public Builder() {}
/** Sets the value. */
- @NonNull
- public Builder setValue(@FontVariant int value) {
+ public @NonNull Builder setValue(@FontVariant int value) {
mImpl.setValue(LayoutElementProto.FontVariant.forNumber(value));
mFingerprint.recordPropertyUpdate(1, value);
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public FontVariantProp build() {
+ public @NonNull FontVariantProp build() {
return new FontVariantProp(mImpl.build(), mFingerprint);
}
}
@@ -550,7 +532,7 @@
/** An extensible {@code SpanVerticalAlignment} property. */
public static final class SpanVerticalAlignmentProp {
private final LayoutElementProto.SpanVerticalAlignmentProp mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
SpanVerticalAlignmentProp(
LayoutElementProto.SpanVerticalAlignmentProp impl,
@@ -567,19 +549,16 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static SpanVerticalAlignmentProp fromProto(
- @NonNull LayoutElementProto.SpanVerticalAlignmentProp proto) {
+ static @NonNull SpanVerticalAlignmentProp fromProto(
+ LayoutElementProto.@NonNull SpanVerticalAlignmentProp proto) {
return new SpanVerticalAlignmentProp(proto, null);
}
- @NonNull
- LayoutElementProto.SpanVerticalAlignmentProp toProto() {
+ LayoutElementProto.@NonNull SpanVerticalAlignmentProp toProto() {
return mImpl;
}
@@ -592,16 +571,14 @@
public Builder() {}
/** Sets the value. */
- @NonNull
- public Builder setValue(@SpanVerticalAlignment int value) {
+ public @NonNull Builder setValue(@SpanVerticalAlignment int value) {
mImpl.setValue(LayoutElementProto.SpanVerticalAlignment.forNumber(value));
mFingerprint.recordPropertyUpdate(1, value);
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public SpanVerticalAlignmentProp build() {
+ public @NonNull SpanVerticalAlignmentProp build() {
return new SpanVerticalAlignmentProp(mImpl.build(), mFingerprint);
}
}
@@ -610,7 +587,7 @@
/** The styling of a font (e.g. font size, and metrics). */
public static final class FontStyle {
private final LayoutElementProto.FontStyle mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
FontStyle(LayoutElementProto.FontStyle impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -621,8 +598,7 @@
* Gets the size of the font, in scaled pixels (sp). If not specified, defaults to the size
* of the system's "body" font. Intended for testing purposes only.
*/
- @Nullable
- public DimensionBuilders.SpProp getSize() {
+ public DimensionBuilders.@Nullable SpProp getSize() {
List<DimensionProto.SpProp> sizes = mImpl.getSizeList();
if (!sizes.isEmpty()) {
return DimensionBuilders.SpProp.fromProto(sizes.get(0));
@@ -635,8 +611,7 @@
* Gets whether the text should be rendered in a italic typeface. If not specified, defaults
* to "false". Intended for testing purposes only.
*/
- @Nullable
- public TypeBuilders.BoolProp getItalic() {
+ public TypeBuilders.@Nullable BoolProp getItalic() {
if (mImpl.hasItalic()) {
return TypeBuilders.BoolProp.fromProto(mImpl.getItalic());
} else {
@@ -648,8 +623,7 @@
* Gets whether the text should be rendered with an underline. If not specified, defaults to
* "false". Intended for testing purposes only.
*/
- @Nullable
- public TypeBuilders.BoolProp getUnderline() {
+ public TypeBuilders.@Nullable BoolProp getUnderline() {
if (mImpl.hasUnderline()) {
return TypeBuilders.BoolProp.fromProto(mImpl.getUnderline());
} else {
@@ -661,8 +635,7 @@
* Gets the text color. If not defined, defaults to white. Intended for testing purposes
* only.
*/
- @Nullable
- public ColorBuilders.ColorProp getColor() {
+ public ColorBuilders.@Nullable ColorProp getColor() {
if (mImpl.hasColor()) {
return ColorBuilders.ColorProp.fromProto(mImpl.getColor());
} else {
@@ -675,8 +648,7 @@
* nearest supported value will be used. If not defined, or when set to an invalid value,
* defaults to "normal". Intended for testing purposes only.
*/
- @Nullable
- public FontWeightProp getWeight() {
+ public @Nullable FontWeightProp getWeight() {
if (mImpl.hasWeight()) {
return FontWeightProp.fromProto(mImpl.getWeight());
} else {
@@ -689,8 +661,7 @@
* negative numbers tighten the space. If not specified, defaults to 0. Intended for testing
* purposes only.
*/
- @Nullable
- public DimensionBuilders.EmProp getLetterSpacing() {
+ public DimensionBuilders.@Nullable EmProp getLetterSpacing() {
if (mImpl.hasLetterSpacing()) {
return DimensionBuilders.EmProp.fromProto(mImpl.getLetterSpacing());
} else {
@@ -704,8 +675,7 @@
* Intended for testing purposes only.
*/
@TilesExperimental
- @Nullable
- public FontVariantProp getVariant() {
+ public @Nullable FontVariantProp getVariant() {
if (mImpl.hasVariant()) {
return FontVariantProp.fromProto(mImpl.getVariant());
} else {
@@ -715,20 +685,17 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static FontStyle fromProto(@NonNull LayoutElementProto.FontStyle proto) {
+ static @NonNull FontStyle fromProto(LayoutElementProto.@NonNull FontStyle proto) {
return new FontStyle(proto, null);
}
/** Returns the internal proto instance. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public LayoutElementProto.FontStyle toProto() {
+ public LayoutElementProto.@NonNull FontStyle toProto() {
return mImpl;
}
@@ -744,8 +711,7 @@
* Sets the size of the font, in scaled pixels (sp). If not specified, defaults to the
* size of the system's "body" font.
*/
- @NonNull
- public Builder setSize(@NonNull DimensionBuilders.SpProp size) {
+ public @NonNull Builder setSize(DimensionBuilders.@NonNull SpProp size) {
mImpl.clearSize();
mImpl.addSize(size.toProto());
mFingerprint.recordPropertyUpdate(
@@ -757,8 +723,7 @@
* Sets whether the text should be rendered in a italic typeface. If not specified,
* defaults to "false".
*/
- @NonNull
- public Builder setItalic(@NonNull TypeBuilders.BoolProp italic) {
+ public @NonNull Builder setItalic(TypeBuilders.@NonNull BoolProp italic) {
mImpl.setItalic(italic.toProto());
mFingerprint.recordPropertyUpdate(
2, checkNotNull(italic.getFingerprint()).aggregateValueAsInt());
@@ -770,8 +735,7 @@
* defaults to "false".
*/
@SuppressLint("MissingGetterMatchingBuilder")
- @NonNull
- public Builder setItalic(boolean italic) {
+ public @NonNull Builder setItalic(boolean italic) {
mImpl.setItalic(TypesProto.BoolProp.newBuilder().setValue(italic));
mFingerprint.recordPropertyUpdate(2, Boolean.hashCode(italic));
return this;
@@ -781,8 +745,7 @@
* Sets whether the text should be rendered with an underline. If not specified,
* defaults to "false".
*/
- @NonNull
- public Builder setUnderline(@NonNull TypeBuilders.BoolProp underline) {
+ public @NonNull Builder setUnderline(TypeBuilders.@NonNull BoolProp underline) {
mImpl.setUnderline(underline.toProto());
mFingerprint.recordPropertyUpdate(
3, checkNotNull(underline.getFingerprint()).aggregateValueAsInt());
@@ -794,16 +757,14 @@
* defaults to "false".
*/
@SuppressLint("MissingGetterMatchingBuilder")
- @NonNull
- public Builder setUnderline(boolean underline) {
+ public @NonNull Builder setUnderline(boolean underline) {
mImpl.setUnderline(TypesProto.BoolProp.newBuilder().setValue(underline));
mFingerprint.recordPropertyUpdate(3, Boolean.hashCode(underline));
return this;
}
/** Sets the text color. If not defined, defaults to white. */
- @NonNull
- public Builder setColor(@NonNull ColorBuilders.ColorProp color) {
+ public @NonNull Builder setColor(ColorBuilders.@NonNull ColorProp color) {
mImpl.setColor(color.toProto());
mFingerprint.recordPropertyUpdate(
4, checkNotNull(color.getFingerprint()).aggregateValueAsInt());
@@ -815,8 +776,7 @@
* the nearest supported value will be used. If not defined, or when set to an invalid
* value, defaults to "normal".
*/
- @NonNull
- public Builder setWeight(@NonNull FontWeightProp weight) {
+ public @NonNull Builder setWeight(@NonNull FontWeightProp weight) {
mImpl.setWeight(weight.toProto());
mFingerprint.recordPropertyUpdate(
5, checkNotNull(weight.getFingerprint()).aggregateValueAsInt());
@@ -828,8 +788,7 @@
* the nearest supported value will be used. If not defined, or when set to an invalid
* value, defaults to "normal".
*/
- @NonNull
- public Builder setWeight(@FontWeight int weight) {
+ public @NonNull Builder setWeight(@FontWeight int weight) {
mImpl.setWeight(
LayoutElementProto.FontWeightProp.newBuilder()
.setValue(LayoutElementProto.FontWeight.forNumber(weight)));
@@ -841,8 +800,8 @@
* Sets the text letter-spacing. Positive numbers increase the space between letters
* while negative numbers tighten the space. If not specified, defaults to 0.
*/
- @NonNull
- public Builder setLetterSpacing(@NonNull DimensionBuilders.EmProp letterSpacing) {
+ public @NonNull Builder setLetterSpacing(
+ DimensionBuilders.@NonNull EmProp letterSpacing) {
mImpl.setLetterSpacing(letterSpacing.toProto());
mFingerprint.recordPropertyUpdate(
6, checkNotNull(letterSpacing.getFingerprint()).aggregateValueAsInt());
@@ -854,8 +813,7 @@
* text, which can be selected using this field. If not specified, defaults to "body".
*/
@TilesExperimental
- @NonNull
- public Builder setVariant(@NonNull FontVariantProp variant) {
+ public @NonNull Builder setVariant(@NonNull FontVariantProp variant) {
mImpl.setVariant(variant.toProto());
mFingerprint.recordPropertyUpdate(
7, checkNotNull(variant.getFingerprint()).aggregateValueAsInt());
@@ -867,8 +825,7 @@
* text, which can be selected using this field. If not specified, defaults to "body".
*/
@TilesExperimental
- @NonNull
- public Builder setVariant(@FontVariant int variant) {
+ public @NonNull Builder setVariant(@FontVariant int variant) {
mImpl.setVariant(
LayoutElementProto.FontVariantProp.newBuilder()
.setValue(LayoutElementProto.FontVariant.forNumber(variant)));
@@ -877,8 +834,7 @@
}
/** Builds an instance from accumulated values. */
- @NonNull
- public FontStyle build() {
+ public @NonNull FontStyle build() {
return new FontStyle(mImpl.build(), mFingerprint);
}
}
@@ -887,7 +843,7 @@
/** An extensible {@code TextAlignment} property. */
public static final class TextAlignmentProp {
private final AlignmentProto.TextAlignmentProp mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
TextAlignmentProp(
AlignmentProto.TextAlignmentProp impl, @Nullable Fingerprint fingerprint) {
@@ -903,18 +859,16 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static TextAlignmentProp fromProto(@NonNull AlignmentProto.TextAlignmentProp proto) {
+ static @NonNull TextAlignmentProp fromProto(
+ AlignmentProto.@NonNull TextAlignmentProp proto) {
return new TextAlignmentProp(proto, null);
}
- @NonNull
- AlignmentProto.TextAlignmentProp toProto() {
+ AlignmentProto.@NonNull TextAlignmentProp toProto() {
return mImpl;
}
@@ -927,16 +881,14 @@
public Builder() {}
/** Sets the value. */
- @NonNull
- public Builder setValue(@TextAlignment int value) {
+ public @NonNull Builder setValue(@TextAlignment int value) {
mImpl.setValue(AlignmentProto.TextAlignment.forNumber(value));
mFingerprint.recordPropertyUpdate(1, value);
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public TextAlignmentProp build() {
+ public @NonNull TextAlignmentProp build() {
return new TextAlignmentProp(mImpl.build(), mFingerprint);
}
}
@@ -945,7 +897,7 @@
/** An extensible {@code TextOverflow} property. */
public static final class TextOverflowProp {
private final LayoutElementProto.TextOverflowProp mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
TextOverflowProp(
LayoutElementProto.TextOverflowProp impl, @Nullable Fingerprint fingerprint) {
@@ -961,18 +913,16 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static TextOverflowProp fromProto(@NonNull LayoutElementProto.TextOverflowProp proto) {
+ static @NonNull TextOverflowProp fromProto(
+ LayoutElementProto.@NonNull TextOverflowProp proto) {
return new TextOverflowProp(proto, null);
}
- @NonNull
- LayoutElementProto.TextOverflowProp toProto() {
+ LayoutElementProto.@NonNull TextOverflowProp toProto() {
return mImpl;
}
@@ -985,16 +935,14 @@
public Builder() {}
/** Sets the value. */
- @NonNull
- public Builder setValue(@TextOverflow int value) {
+ public @NonNull Builder setValue(@TextOverflow int value) {
mImpl.setValue(LayoutElementProto.TextOverflow.forNumber(value));
mFingerprint.recordPropertyUpdate(1, value);
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public TextOverflowProp build() {
+ public @NonNull TextOverflowProp build() {
return new TextOverflowProp(mImpl.build(), mFingerprint);
}
}
@@ -1003,7 +951,7 @@
/** An extensible {@code ArcAnchorType} property. */
public static final class ArcAnchorTypeProp {
private final AlignmentProto.ArcAnchorTypeProp mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
ArcAnchorTypeProp(
AlignmentProto.ArcAnchorTypeProp impl, @Nullable Fingerprint fingerprint) {
@@ -1019,18 +967,16 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static ArcAnchorTypeProp fromProto(@NonNull AlignmentProto.ArcAnchorTypeProp proto) {
+ static @NonNull ArcAnchorTypeProp fromProto(
+ AlignmentProto.@NonNull ArcAnchorTypeProp proto) {
return new ArcAnchorTypeProp(proto, null);
}
- @NonNull
- AlignmentProto.ArcAnchorTypeProp toProto() {
+ AlignmentProto.@NonNull ArcAnchorTypeProp toProto() {
return mImpl;
}
@@ -1043,16 +989,14 @@
public Builder() {}
/** Sets the value. */
- @NonNull
- public Builder setValue(@ArcAnchorType int value) {
+ public @NonNull Builder setValue(@ArcAnchorType int value) {
mImpl.setValue(AlignmentProto.ArcAnchorType.forNumber(value));
mFingerprint.recordPropertyUpdate(1, value);
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public ArcAnchorTypeProp build() {
+ public @NonNull ArcAnchorTypeProp build() {
return new ArcAnchorTypeProp(mImpl.build(), mFingerprint);
}
}
@@ -1061,7 +1005,7 @@
/** A text string. */
public static final class Text implements LayoutElement {
private final LayoutElementProto.Text mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
Text(LayoutElementProto.Text impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -1069,8 +1013,7 @@
}
/** Gets the text to render. Intended for testing purposes only. */
- @Nullable
- public TypeBuilders.StringProp getText() {
+ public TypeBuilders.@Nullable StringProp getText() {
if (mImpl.hasText()) {
return TypeBuilders.StringProp.fromProto(mImpl.getText());
} else {
@@ -1082,8 +1025,7 @@
* Gets the style of font to use (size, bold etc). If not specified, defaults to the
* platform's default body font. Intended for testing purposes only.
*/
- @Nullable
- public FontStyle getFontStyle() {
+ public @Nullable FontStyle getFontStyle() {
if (mImpl.hasFontStyle()) {
return FontStyle.fromProto(mImpl.getFontStyle());
} else {
@@ -1095,8 +1037,7 @@
* Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
* for testing purposes only.
*/
- @Nullable
- public ModifiersBuilders.Modifiers getModifiers() {
+ public ModifiersBuilders.@Nullable Modifiers getModifiers() {
if (mImpl.hasModifiers()) {
return ModifiersBuilders.Modifiers.fromProto(mImpl.getModifiers());
} else {
@@ -1109,8 +1050,7 @@
* not defined, the {@link Text} element will be treated as a single-line element. Intended
* for testing purposes only.
*/
- @Nullable
- public TypeBuilders.Int32Prop getMaxLines() {
+ public TypeBuilders.@Nullable Int32Prop getMaxLines() {
if (mImpl.hasMaxLines()) {
return TypeBuilders.Int32Prop.fromProto(mImpl.getMaxLines());
} else {
@@ -1125,8 +1065,7 @@
* the alignment of lines relative to the {@link Text} element bounds. If not defined,
* defaults to TEXT_ALIGN_CENTER. Intended for testing purposes only.
*/
- @Nullable
- public TextAlignmentProp getMultilineAlignment() {
+ public @Nullable TextAlignmentProp getMultilineAlignment() {
if (mImpl.hasMultilineAlignment()) {
return TextAlignmentProp.fromProto(mImpl.getMultilineAlignment());
} else {
@@ -1141,8 +1080,7 @@
* which cannot fit inside its container will be truncated. If not defined, defaults to
* TEXT_OVERFLOW_TRUNCATE. Intended for testing purposes only.
*/
- @Nullable
- public TextOverflowProp getOverflow() {
+ public @Nullable TextOverflowProp getOverflow() {
if (mImpl.hasOverflow()) {
return TextOverflowProp.fromProto(mImpl.getOverflow());
} else {
@@ -1155,8 +1093,7 @@
* distance between subsequent baselines. If not specified, defaults the font's recommended
* interline spacing. Intended for testing purposes only.
*/
- @Nullable
- public DimensionBuilders.SpProp getLineHeight() {
+ public DimensionBuilders.@Nullable SpProp getLineHeight() {
if (mImpl.hasLineHeight()) {
return DimensionBuilders.SpProp.fromProto(mImpl.getLineHeight());
} else {
@@ -1166,26 +1103,22 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static Text fromProto(
- @NonNull LayoutElementProto.Text proto, @Nullable Fingerprint fingerprint) {
+ static @NonNull Text fromProto(
+ LayoutElementProto.@NonNull Text proto, @Nullable Fingerprint fingerprint) {
return new Text(proto, fingerprint);
}
- @NonNull
- LayoutElementProto.Text toProto() {
+ LayoutElementProto.@NonNull Text toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public LayoutElementProto.LayoutElement toLayoutElementProto() {
+ public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
return LayoutElementProto.LayoutElement.newBuilder().setText(mImpl).build();
}
@@ -1198,8 +1131,7 @@
public Builder() {}
/** Sets the text to render. */
- @NonNull
- public Builder setText(@NonNull TypeBuilders.StringProp text) {
+ public @NonNull Builder setText(TypeBuilders.@NonNull StringProp text) {
mImpl.setText(text.toProto());
mFingerprint.recordPropertyUpdate(
1, checkNotNull(text.getFingerprint()).aggregateValueAsInt());
@@ -1207,8 +1139,7 @@
}
/** Sets the text to render. */
- @NonNull
- public Builder setText(@NonNull String text) {
+ public @NonNull Builder setText(@NonNull String text) {
mImpl.mergeText(TypesProto.StringProp.newBuilder().setValue(text).build());
mFingerprint.recordPropertyUpdate(1, text.hashCode());
return this;
@@ -1218,8 +1149,7 @@
* Sets the style of font to use (size, bold etc). If not specified, defaults to the
* platform's default body font.
*/
- @NonNull
- public Builder setFontStyle(@NonNull FontStyle fontStyle) {
+ public @NonNull Builder setFontStyle(@NonNull FontStyle fontStyle) {
mImpl.setFontStyle(fontStyle.toProto());
mFingerprint.recordPropertyUpdate(
2, checkNotNull(fontStyle.getFingerprint()).aggregateValueAsInt());
@@ -1227,8 +1157,7 @@
}
/** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
- @NonNull
- public Builder setModifiers(@NonNull ModifiersBuilders.Modifiers modifiers) {
+ public @NonNull Builder setModifiers(ModifiersBuilders.@NonNull Modifiers modifiers) {
mImpl.setModifiers(modifiers.toProto());
mFingerprint.recordPropertyUpdate(
3, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -1239,8 +1168,7 @@
* Sets the maximum number of lines that can be represented by the {@link Text} element.
* If not defined, the {@link Text} element will be treated as a single-line element.
*/
- @NonNull
- public Builder setMaxLines(@NonNull TypeBuilders.Int32Prop maxLines) {
+ public @NonNull Builder setMaxLines(TypeBuilders.@NonNull Int32Prop maxLines) {
mImpl.setMaxLines(maxLines.toProto());
mFingerprint.recordPropertyUpdate(
4, checkNotNull(maxLines.getFingerprint()).aggregateValueAsInt());
@@ -1251,8 +1179,7 @@
* Sets the maximum number of lines that can be represented by the {@link Text} element.
* If not defined, the {@link Text} element will be treated as a single-line element.
*/
- @NonNull
- public Builder setMaxLines(@IntRange(from = 1) int maxLines) {
+ public @NonNull Builder setMaxLines(@IntRange(from = 1) int maxLines) {
mImpl.setMaxLines(TypesProto.Int32Prop.newBuilder().setValue(maxLines));
mFingerprint.recordPropertyUpdate(4, maxLines);
return this;
@@ -1265,8 +1192,8 @@
* will set the alignment of lines relative to the {@link Text} element bounds. If not
* defined, defaults to TEXT_ALIGN_CENTER.
*/
- @NonNull
- public Builder setMultilineAlignment(@NonNull TextAlignmentProp multilineAlignment) {
+ public @NonNull Builder setMultilineAlignment(
+ @NonNull TextAlignmentProp multilineAlignment) {
mImpl.setMultilineAlignment(multilineAlignment.toProto());
mFingerprint.recordPropertyUpdate(
5, checkNotNull(multilineAlignment.getFingerprint()).aggregateValueAsInt());
@@ -1280,8 +1207,7 @@
* will set the alignment of lines relative to the {@link Text} element bounds. If not
* defined, defaults to TEXT_ALIGN_CENTER.
*/
- @NonNull
- public Builder setMultilineAlignment(@TextAlignment int multilineAlignment) {
+ public @NonNull Builder setMultilineAlignment(@TextAlignment int multilineAlignment) {
mImpl.setMultilineAlignment(
AlignmentProto.TextAlignmentProp.newBuilder()
.setValue(
@@ -1298,8 +1224,7 @@
* its text, the text which cannot fit inside its container will be truncated. If not
* defined, defaults to TEXT_OVERFLOW_TRUNCATE.
*/
- @NonNull
- public Builder setOverflow(@NonNull TextOverflowProp overflow) {
+ public @NonNull Builder setOverflow(@NonNull TextOverflowProp overflow) {
mImpl.setOverflow(overflow.toProto());
mFingerprint.recordPropertyUpdate(
6, checkNotNull(overflow.getFingerprint()).aggregateValueAsInt());
@@ -1313,8 +1238,7 @@
* its text, the text which cannot fit inside its container will be truncated. If not
* defined, defaults to TEXT_OVERFLOW_TRUNCATE.
*/
- @NonNull
- public Builder setOverflow(@TextOverflow int overflow) {
+ public @NonNull Builder setOverflow(@TextOverflow int overflow) {
mImpl.setOverflow(
LayoutElementProto.TextOverflowProp.newBuilder()
.setValue(LayoutElementProto.TextOverflow.forNumber(overflow)));
@@ -1327,8 +1251,7 @@
* distance between subsequent baselines. If not specified, defaults the font's
* recommended interline spacing.
*/
- @NonNull
- public Builder setLineHeight(@NonNull DimensionBuilders.SpProp lineHeight) {
+ public @NonNull Builder setLineHeight(DimensionBuilders.@NonNull SpProp lineHeight) {
mImpl.setLineHeight(lineHeight.toProto());
mFingerprint.recordPropertyUpdate(
7, checkNotNull(lineHeight.getFingerprint()).aggregateValueAsInt());
@@ -1336,8 +1259,7 @@
}
@Override
- @NonNull
- public Text build() {
+ public @NonNull Text build() {
return new Text(mImpl.build(), mFingerprint);
}
}
@@ -1346,7 +1268,7 @@
/** An extensible {@code ContentScaleMode} property. */
public static final class ContentScaleModeProp {
private final LayoutElementProto.ContentScaleModeProp mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
ContentScaleModeProp(
LayoutElementProto.ContentScaleModeProp impl, @Nullable Fingerprint fingerprint) {
@@ -1362,19 +1284,16 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static ContentScaleModeProp fromProto(
- @NonNull LayoutElementProto.ContentScaleModeProp proto) {
+ static @NonNull ContentScaleModeProp fromProto(
+ LayoutElementProto.@NonNull ContentScaleModeProp proto) {
return new ContentScaleModeProp(proto, null);
}
- @NonNull
- LayoutElementProto.ContentScaleModeProp toProto() {
+ LayoutElementProto.@NonNull ContentScaleModeProp toProto() {
return mImpl;
}
@@ -1387,16 +1306,14 @@
public Builder() {}
/** Sets the value. */
- @NonNull
- public Builder setValue(@ContentScaleMode int value) {
+ public @NonNull Builder setValue(@ContentScaleMode int value) {
mImpl.setValue(LayoutElementProto.ContentScaleMode.forNumber(value));
mFingerprint.recordPropertyUpdate(1, value);
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public ContentScaleModeProp build() {
+ public @NonNull ContentScaleModeProp build() {
return new ContentScaleModeProp(mImpl.build(), mFingerprint);
}
}
@@ -1405,7 +1322,7 @@
/** Filtering parameters used for images. This can be used to apply a color tint to images. */
public static final class ColorFilter {
private final LayoutElementProto.ColorFilter mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
ColorFilter(LayoutElementProto.ColorFilter impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -1420,8 +1337,7 @@
* <p>Note that only Android image resources can be tinted; Inline images will not be
* tinted, and this property will have no effect. Intended for testing purposes only.
*/
- @Nullable
- public ColorBuilders.ColorProp getTint() {
+ public ColorBuilders.@Nullable ColorProp getTint() {
if (mImpl.hasTint()) {
return ColorBuilders.ColorProp.fromProto(mImpl.getTint());
} else {
@@ -1431,18 +1347,15 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static ColorFilter fromProto(@NonNull LayoutElementProto.ColorFilter proto) {
+ static @NonNull ColorFilter fromProto(LayoutElementProto.@NonNull ColorFilter proto) {
return new ColorFilter(proto, null);
}
- @NonNull
- LayoutElementProto.ColorFilter toProto() {
+ LayoutElementProto.@NonNull ColorFilter toProto() {
return mImpl;
}
@@ -1462,9 +1375,8 @@
* <p>Note that only Android image resources can be tinted; Inline images will not be
* tinted, and this property will have no effect.
*/
- @NonNull
- public LayoutElementBuilders.ColorFilter.Builder setTint(
- @NonNull ColorBuilders.ColorProp tint) {
+ public LayoutElementBuilders.ColorFilter.@NonNull Builder setTint(
+ ColorBuilders.@NonNull ColorProp tint) {
mImpl.setTint(tint.toProto());
mFingerprint.recordPropertyUpdate(
1, checkNotNull(tint.getFingerprint()).aggregateValueAsInt());
@@ -1472,8 +1384,7 @@
}
/** Builds an instance from accumulated values. */
- @NonNull
- public ColorFilter build() {
+ public @NonNull ColorFilter build() {
return new ColorFilter(mImpl.build(), mFingerprint);
}
}
@@ -1488,7 +1399,7 @@
*/
public static final class Image implements LayoutElement {
private final LayoutElementProto.Image mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
Image(LayoutElementProto.Image impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -1499,8 +1410,7 @@
* Gets the resource_id of the image to render. This must exist in the supplied resource
* bundle. Intended for testing purposes only.
*/
- @Nullable
- public TypeBuilders.StringProp getResourceId() {
+ public TypeBuilders.@Nullable StringProp getResourceId() {
if (mImpl.hasResourceId()) {
return TypeBuilders.StringProp.fromProto(mImpl.getResourceId());
} else {
@@ -1512,8 +1422,7 @@
* Gets the width of this image. If not defined, the image will not be rendered. Intended
* for testing purposes only.
*/
- @Nullable
- public DimensionBuilders.ImageDimension getWidth() {
+ public DimensionBuilders.@Nullable ImageDimension getWidth() {
if (mImpl.hasWidth()) {
return DimensionBuilders.imageDimensionFromProto(mImpl.getWidth());
} else {
@@ -1525,8 +1434,7 @@
* Gets the height of this image. If not defined, the image will not be rendered. Intended
* for testing purposes only.
*/
- @Nullable
- public DimensionBuilders.ImageDimension getHeight() {
+ public DimensionBuilders.@Nullable ImageDimension getHeight() {
if (mImpl.hasHeight()) {
return DimensionBuilders.imageDimensionFromProto(mImpl.getHeight());
} else {
@@ -1539,8 +1447,7 @@
* size does not match those bounds. Defaults to CONTENT_SCALE_MODE_FIT. Intended for
* testing purposes only.
*/
- @Nullable
- public ContentScaleModeProp getContentScaleMode() {
+ public @Nullable ContentScaleModeProp getContentScaleMode() {
if (mImpl.hasContentScaleMode()) {
return ContentScaleModeProp.fromProto(mImpl.getContentScaleMode());
} else {
@@ -1552,8 +1459,7 @@
* Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
* for testing purposes only.
*/
- @Nullable
- public ModifiersBuilders.Modifiers getModifiers() {
+ public ModifiersBuilders.@Nullable Modifiers getModifiers() {
if (mImpl.hasModifiers()) {
return ModifiersBuilders.Modifiers.fromProto(mImpl.getModifiers());
} else {
@@ -1562,8 +1468,7 @@
}
/** Gets filtering parameters for this image. If not specified, defaults to no filtering. */
- @Nullable
- public ColorFilter getColorFilter() {
+ public @Nullable ColorFilter getColorFilter() {
if (mImpl.hasColorFilter()) {
return ColorFilter.fromProto(mImpl.getColorFilter());
} else {
@@ -1573,26 +1478,22 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static Image fromProto(
- @NonNull LayoutElementProto.Image proto, @Nullable Fingerprint fingerprint) {
+ static @NonNull Image fromProto(
+ LayoutElementProto.@NonNull Image proto, @Nullable Fingerprint fingerprint) {
return new Image(proto, fingerprint);
}
- @NonNull
- LayoutElementProto.Image toProto() {
+ LayoutElementProto.@NonNull Image toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public LayoutElementProto.LayoutElement toLayoutElementProto() {
+ public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
return LayoutElementProto.LayoutElement.newBuilder().setImage(mImpl).build();
}
@@ -1608,8 +1509,7 @@
* Sets the resource_id of the image to render. This must exist in the supplied resource
* bundle.
*/
- @NonNull
- public Builder setResourceId(@NonNull TypeBuilders.StringProp resourceId) {
+ public @NonNull Builder setResourceId(TypeBuilders.@NonNull StringProp resourceId) {
mImpl.setResourceId(resourceId.toProto());
mFingerprint.recordPropertyUpdate(
1, checkNotNull(resourceId.getFingerprint()).aggregateValueAsInt());
@@ -1620,16 +1520,14 @@
* Sets the resource_id of the image to render. This must exist in the supplied resource
* bundle.
*/
- @NonNull
- public Builder setResourceId(@NonNull String resourceId) {
+ public @NonNull Builder setResourceId(@NonNull String resourceId) {
mImpl.setResourceId(TypesProto.StringProp.newBuilder().setValue(resourceId));
mFingerprint.recordPropertyUpdate(1, resourceId.hashCode());
return this;
}
/** Sets the width of this image. If not defined, the image will not be rendered. */
- @NonNull
- public Builder setWidth(@NonNull DimensionBuilders.ImageDimension width) {
+ public @NonNull Builder setWidth(DimensionBuilders.@NonNull ImageDimension width) {
mImpl.setWidth(width.toImageDimensionProto());
mFingerprint.recordPropertyUpdate(
2, checkNotNull(width.getFingerprint()).aggregateValueAsInt());
@@ -1637,8 +1535,7 @@
}
/** Sets the height of this image. If not defined, the image will not be rendered. */
- @NonNull
- public Builder setHeight(@NonNull DimensionBuilders.ImageDimension height) {
+ public @NonNull Builder setHeight(DimensionBuilders.@NonNull ImageDimension height) {
mImpl.setHeight(height.toImageDimensionProto());
mFingerprint.recordPropertyUpdate(
3, checkNotNull(height.getFingerprint()).aggregateValueAsInt());
@@ -1649,8 +1546,8 @@
* Sets how to scale the image resource inside the bounds specified by width/height if
* its size does not match those bounds. Defaults to CONTENT_SCALE_MODE_FIT.
*/
- @NonNull
- public Builder setContentScaleMode(@NonNull ContentScaleModeProp contentScaleMode) {
+ public @NonNull Builder setContentScaleMode(
+ @NonNull ContentScaleModeProp contentScaleMode) {
mImpl.setContentScaleMode(contentScaleMode.toProto());
mFingerprint.recordPropertyUpdate(
4, checkNotNull(contentScaleMode.getFingerprint()).aggregateValueAsInt());
@@ -1661,8 +1558,7 @@
* Sets how to scale the image resource inside the bounds specified by width/height if
* its size does not match those bounds. Defaults to CONTENT_SCALE_MODE_FIT.
*/
- @NonNull
- public Builder setContentScaleMode(@ContentScaleMode int contentScaleMode) {
+ public @NonNull Builder setContentScaleMode(@ContentScaleMode int contentScaleMode) {
mImpl.setContentScaleMode(
LayoutElementProto.ContentScaleModeProp.newBuilder()
.setValue(
@@ -1673,8 +1569,7 @@
}
/** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
- @NonNull
- public Builder setModifiers(@NonNull ModifiersBuilders.Modifiers modifiers) {
+ public @NonNull Builder setModifiers(ModifiersBuilders.@NonNull Modifiers modifiers) {
mImpl.setModifiers(modifiers.toProto());
mFingerprint.recordPropertyUpdate(
5, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -1684,8 +1579,7 @@
/**
* Sets filtering parameters for this image. If not specified, defaults to no filtering.
*/
- @NonNull
- public Builder setColorFilter(@NonNull ColorFilter colorFilter) {
+ public @NonNull Builder setColorFilter(@NonNull ColorFilter colorFilter) {
mImpl.setColorFilter(colorFilter.toProto());
mFingerprint.recordPropertyUpdate(
6, checkNotNull(colorFilter.getFingerprint()).aggregateValueAsInt());
@@ -1693,8 +1587,7 @@
}
@Override
- @NonNull
- public Image build() {
+ public @NonNull Image build() {
return new Image(mImpl.build(), mFingerprint);
}
}
@@ -1703,7 +1596,7 @@
/** A simple spacer, typically used to provide padding between adjacent elements. */
public static final class Spacer implements LayoutElement {
private final LayoutElementProto.Spacer mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
Spacer(LayoutElementProto.Spacer impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -1715,8 +1608,7 @@
* {@link Arc}, this must be specified as an angular dimension, otherwise a linear dimension
* must be used. If not defined, defaults to 0. Intended for testing purposes only.
*/
- @Nullable
- public DimensionBuilders.SpacerDimension getWidth() {
+ public DimensionBuilders.@Nullable SpacerDimension getWidth() {
if (mImpl.hasWidth()) {
return DimensionBuilders.spacerDimensionFromProto(mImpl.getWidth());
} else {
@@ -1728,8 +1620,7 @@
* Gets the height of this spacer. If not defined, defaults to 0. Intended for testing
* purposes only.
*/
- @Nullable
- public DimensionBuilders.SpacerDimension getHeight() {
+ public DimensionBuilders.@Nullable SpacerDimension getHeight() {
if (mImpl.hasHeight()) {
return DimensionBuilders.spacerDimensionFromProto(mImpl.getHeight());
} else {
@@ -1741,8 +1632,7 @@
* Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
* for testing purposes only.
*/
- @Nullable
- public ModifiersBuilders.Modifiers getModifiers() {
+ public ModifiersBuilders.@Nullable Modifiers getModifiers() {
if (mImpl.hasModifiers()) {
return ModifiersBuilders.Modifiers.fromProto(mImpl.getModifiers());
} else {
@@ -1752,26 +1642,22 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static Spacer fromProto(
- @NonNull LayoutElementProto.Spacer proto, @Nullable Fingerprint fingerprint) {
+ static @NonNull Spacer fromProto(
+ LayoutElementProto.@NonNull Spacer proto, @Nullable Fingerprint fingerprint) {
return new Spacer(proto, fingerprint);
}
- @NonNull
- LayoutElementProto.Spacer toProto() {
+ LayoutElementProto.@NonNull Spacer toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public LayoutElementProto.LayoutElement toLayoutElementProto() {
+ public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
return LayoutElementProto.LayoutElement.newBuilder().setSpacer(mImpl).build();
}
@@ -1788,8 +1674,7 @@
* {@link Arc}, this must be specified as an angular dimension, otherwise a linear
* dimension must be used. If not defined, defaults to 0.
*/
- @NonNull
- public Builder setWidth(@NonNull DimensionBuilders.SpacerDimension width) {
+ public @NonNull Builder setWidth(DimensionBuilders.@NonNull SpacerDimension width) {
mImpl.setWidth(width.toSpacerDimensionProto());
mFingerprint.recordPropertyUpdate(
1, checkNotNull(width.getFingerprint()).aggregateValueAsInt());
@@ -1797,8 +1682,7 @@
}
/** Sets the height of this spacer. If not defined, defaults to 0. */
- @NonNull
- public Builder setHeight(@NonNull DimensionBuilders.SpacerDimension height) {
+ public @NonNull Builder setHeight(DimensionBuilders.@NonNull SpacerDimension height) {
mImpl.setHeight(height.toSpacerDimensionProto());
mFingerprint.recordPropertyUpdate(
2, checkNotNull(height.getFingerprint()).aggregateValueAsInt());
@@ -1806,8 +1690,7 @@
}
/** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
- @NonNull
- public Builder setModifiers(@NonNull ModifiersBuilders.Modifiers modifiers) {
+ public @NonNull Builder setModifiers(ModifiersBuilders.@NonNull Modifiers modifiers) {
mImpl.setModifiers(modifiers.toProto());
mFingerprint.recordPropertyUpdate(
3, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -1815,8 +1698,7 @@
}
@Override
- @NonNull
- public Spacer build() {
+ public @NonNull Spacer build() {
return new Spacer(mImpl.build(), mFingerprint);
}
}
@@ -1828,7 +1710,7 @@
*/
public static final class Box implements LayoutElement {
private final LayoutElementProto.Box mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
Box(LayoutElementProto.Box impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -1836,8 +1718,7 @@
}
/** Gets the child element(s) to wrap. Intended for testing purposes only. */
- @NonNull
- public List<LayoutElement> getContents() {
+ public @NonNull List<LayoutElement> getContents() {
return Collections.unmodifiableList(
mImpl.getContentsList().stream()
.map(LayoutElementBuilders::layoutElementFromProto)
@@ -1848,8 +1729,7 @@
* Gets the height of this {@link Box}. If not defined, this will size itself to fit all of
* its children (i.e. a WrappedDimension). Intended for testing purposes only.
*/
- @Nullable
- public DimensionBuilders.ContainerDimension getHeight() {
+ public DimensionBuilders.@Nullable ContainerDimension getHeight() {
if (mImpl.hasHeight()) {
return DimensionBuilders.containerDimensionFromProto(mImpl.getHeight());
} else {
@@ -1861,8 +1741,7 @@
* Gets the width of this {@link Box}. If not defined, this will size itself to fit all of
* its children (i.e. a WrappedDimension). Intended for testing purposes only.
*/
- @Nullable
- public DimensionBuilders.ContainerDimension getWidth() {
+ public DimensionBuilders.@Nullable ContainerDimension getWidth() {
if (mImpl.hasWidth()) {
return DimensionBuilders.containerDimensionFromProto(mImpl.getWidth());
} else {
@@ -1874,8 +1753,7 @@
* Gets the horizontal alignment of the element inside this {@link Box}. If not defined,
* defaults to HORIZONTAL_ALIGN_CENTER. Intended for testing purposes only.
*/
- @Nullable
- public HorizontalAlignmentProp getHorizontalAlignment() {
+ public @Nullable HorizontalAlignmentProp getHorizontalAlignment() {
if (mImpl.hasHorizontalAlignment()) {
return HorizontalAlignmentProp.fromProto(mImpl.getHorizontalAlignment());
} else {
@@ -1887,8 +1765,7 @@
* Gets the vertical alignment of the element inside this {@link Box}. If not defined,
* defaults to VERTICAL_ALIGN_CENTER. Intended for testing purposes only.
*/
- @Nullable
- public VerticalAlignmentProp getVerticalAlignment() {
+ public @Nullable VerticalAlignmentProp getVerticalAlignment() {
if (mImpl.hasVerticalAlignment()) {
return VerticalAlignmentProp.fromProto(mImpl.getVerticalAlignment());
} else {
@@ -1900,8 +1777,7 @@
* Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
* for testing purposes only.
*/
- @Nullable
- public ModifiersBuilders.Modifiers getModifiers() {
+ public ModifiersBuilders.@Nullable Modifiers getModifiers() {
if (mImpl.hasModifiers()) {
return ModifiersBuilders.Modifiers.fromProto(mImpl.getModifiers());
} else {
@@ -1911,26 +1787,22 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static Box fromProto(
- @NonNull LayoutElementProto.Box proto, @Nullable Fingerprint fingerprint) {
+ static @NonNull Box fromProto(
+ LayoutElementProto.@NonNull Box proto, @Nullable Fingerprint fingerprint) {
return new Box(proto, fingerprint);
}
- @NonNull
- LayoutElementProto.Box toProto() {
+ LayoutElementProto.@NonNull Box toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public LayoutElementProto.LayoutElement toLayoutElementProto() {
+ public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
return LayoutElementProto.LayoutElement.newBuilder().setBox(mImpl).build();
}
@@ -1943,8 +1815,7 @@
public Builder() {}
/** Adds one item to the child element(s) to wrap. */
- @NonNull
- public Builder addContent(@NonNull LayoutElement content) {
+ public @NonNull Builder addContent(@NonNull LayoutElement content) {
mImpl.addContents(content.toLayoutElementProto());
mFingerprint.addChildNode(checkNotNull(content.getFingerprint()));
return this;
@@ -1954,8 +1825,8 @@
* Sets the height of this {@link Box}. If not defined, this will size itself to fit all
* of its children (i.e. a WrappedDimension).
*/
- @NonNull
- public Builder setHeight(@NonNull DimensionBuilders.ContainerDimension height) {
+ public @NonNull Builder setHeight(
+ DimensionBuilders.@NonNull ContainerDimension height) {
mImpl.setHeight(height.toContainerDimensionProto());
mFingerprint.recordPropertyUpdate(
2, checkNotNull(height.getFingerprint()).aggregateValueAsInt());
@@ -1966,8 +1837,7 @@
* Sets the width of this {@link Box}. If not defined, this will size itself to fit all
* of its children (i.e. a WrappedDimension).
*/
- @NonNull
- public Builder setWidth(@NonNull DimensionBuilders.ContainerDimension width) {
+ public @NonNull Builder setWidth(DimensionBuilders.@NonNull ContainerDimension width) {
mImpl.setWidth(width.toContainerDimensionProto());
mFingerprint.recordPropertyUpdate(
3, checkNotNull(width.getFingerprint()).aggregateValueAsInt());
@@ -1978,8 +1848,7 @@
* Sets the horizontal alignment of the element inside this {@link Box}. If not defined,
* defaults to HORIZONTAL_ALIGN_CENTER.
*/
- @NonNull
- public Builder setHorizontalAlignment(
+ public @NonNull Builder setHorizontalAlignment(
@NonNull HorizontalAlignmentProp horizontalAlignment) {
mImpl.setHorizontalAlignment(horizontalAlignment.toProto());
mFingerprint.recordPropertyUpdate(
@@ -1992,8 +1861,8 @@
* Sets the horizontal alignment of the element inside this {@link Box}. If not defined,
* defaults to HORIZONTAL_ALIGN_CENTER.
*/
- @NonNull
- public Builder setHorizontalAlignment(@HorizontalAlignment int horizontalAlignment) {
+ public @NonNull Builder setHorizontalAlignment(
+ @HorizontalAlignment int horizontalAlignment) {
mImpl.setHorizontalAlignment(
AlignmentProto.HorizontalAlignmentProp.newBuilder()
.setValue(
@@ -2007,8 +1876,8 @@
* Sets the vertical alignment of the element inside this {@link Box}. If not defined,
* defaults to VERTICAL_ALIGN_CENTER.
*/
- @NonNull
- public Builder setVerticalAlignment(@NonNull VerticalAlignmentProp verticalAlignment) {
+ public @NonNull Builder setVerticalAlignment(
+ @NonNull VerticalAlignmentProp verticalAlignment) {
mImpl.setVerticalAlignment(verticalAlignment.toProto());
mFingerprint.recordPropertyUpdate(
5, checkNotNull(verticalAlignment.getFingerprint()).aggregateValueAsInt());
@@ -2019,8 +1888,7 @@
* Sets the vertical alignment of the element inside this {@link Box}. If not defined,
* defaults to VERTICAL_ALIGN_CENTER.
*/
- @NonNull
- public Builder setVerticalAlignment(@VerticalAlignment int verticalAlignment) {
+ public @NonNull Builder setVerticalAlignment(@VerticalAlignment int verticalAlignment) {
mImpl.setVerticalAlignment(
AlignmentProto.VerticalAlignmentProp.newBuilder()
.setValue(
@@ -2031,8 +1899,7 @@
}
/** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
- @NonNull
- public Builder setModifiers(@NonNull ModifiersBuilders.Modifiers modifiers) {
+ public @NonNull Builder setModifiers(ModifiersBuilders.@NonNull Modifiers modifiers) {
mImpl.setModifiers(modifiers.toProto());
mFingerprint.recordPropertyUpdate(
6, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -2040,8 +1907,7 @@
}
@Override
- @NonNull
- public Box build() {
+ public @NonNull Box build() {
return new Box(mImpl.build(), mFingerprint);
}
}
@@ -2054,7 +1920,7 @@
*/
public static final class SpanText implements Span {
private final LayoutElementProto.SpanText mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
SpanText(LayoutElementProto.SpanText impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -2062,8 +1928,7 @@
}
/** Gets the text to render. Intended for testing purposes only. */
- @Nullable
- public TypeBuilders.StringProp getText() {
+ public TypeBuilders.@Nullable StringProp getText() {
if (mImpl.hasText()) {
return TypeBuilders.StringProp.fromProto(mImpl.getText());
} else {
@@ -2075,8 +1940,7 @@
* Gets the style of font to use (size, bold etc). If not specified, defaults to the
* platform's default body font. Intended for testing purposes only.
*/
- @Nullable
- public FontStyle getFontStyle() {
+ public @Nullable FontStyle getFontStyle() {
if (mImpl.hasFontStyle()) {
return FontStyle.fromProto(mImpl.getFontStyle());
} else {
@@ -2088,8 +1952,7 @@
* Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
* for testing purposes only.
*/
- @Nullable
- public ModifiersBuilders.SpanModifiers getModifiers() {
+ public ModifiersBuilders.@Nullable SpanModifiers getModifiers() {
if (mImpl.hasModifiers()) {
return ModifiersBuilders.SpanModifiers.fromProto(mImpl.getModifiers());
} else {
@@ -2099,25 +1962,21 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static SpanText fromProto(@NonNull LayoutElementProto.SpanText proto) {
+ static @NonNull SpanText fromProto(LayoutElementProto.@NonNull SpanText proto) {
return new SpanText(proto, null);
}
- @NonNull
- LayoutElementProto.SpanText toProto() {
+ LayoutElementProto.@NonNull SpanText toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public LayoutElementProto.Span toSpanProto() {
+ public LayoutElementProto.@NonNull Span toSpanProto() {
return LayoutElementProto.Span.newBuilder().setText(mImpl).build();
}
@@ -2130,8 +1989,7 @@
public Builder() {}
/** Sets the text to render. */
- @NonNull
- public Builder setText(@NonNull TypeBuilders.StringProp text) {
+ public @NonNull Builder setText(TypeBuilders.@NonNull StringProp text) {
mImpl.setText(text.toProto());
mFingerprint.recordPropertyUpdate(
1, checkNotNull(text.getFingerprint()).aggregateValueAsInt());
@@ -2139,8 +1997,7 @@
}
/** Sets the text to render. */
- @NonNull
- public Builder setText(@NonNull String text) {
+ public @NonNull Builder setText(@NonNull String text) {
mImpl.setText(TypesProto.StringProp.newBuilder().setValue(text));
mFingerprint.recordPropertyUpdate(1, text.hashCode());
return this;
@@ -2150,8 +2007,7 @@
* Sets the style of font to use (size, bold etc). If not specified, defaults to the
* platform's default body font.
*/
- @NonNull
- public Builder setFontStyle(@NonNull FontStyle fontStyle) {
+ public @NonNull Builder setFontStyle(@NonNull FontStyle fontStyle) {
mImpl.setFontStyle(fontStyle.toProto());
mFingerprint.recordPropertyUpdate(
2, checkNotNull(fontStyle.getFingerprint()).aggregateValueAsInt());
@@ -2159,8 +2015,8 @@
}
/** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
- @NonNull
- public Builder setModifiers(@NonNull ModifiersBuilders.SpanModifiers modifiers) {
+ public @NonNull Builder setModifiers(
+ ModifiersBuilders.@NonNull SpanModifiers modifiers) {
mImpl.setModifiers(modifiers.toProto());
mFingerprint.recordPropertyUpdate(
3, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -2168,8 +2024,7 @@
}
@Override
- @NonNull
- public SpanText build() {
+ public @NonNull SpanText build() {
return new SpanText(mImpl.build(), mFingerprint);
}
}
@@ -2178,7 +2033,7 @@
/** An image which can be added to a {@link Span}. */
public static final class SpanImage implements Span {
private final LayoutElementProto.SpanImage mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
SpanImage(LayoutElementProto.SpanImage impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -2189,8 +2044,7 @@
* Gets the resource_id of the image to render. This must exist in the supplied resource
* bundle. Intended for testing purposes only.
*/
- @Nullable
- public TypeBuilders.StringProp getResourceId() {
+ public TypeBuilders.@Nullable StringProp getResourceId() {
if (mImpl.hasResourceId()) {
return TypeBuilders.StringProp.fromProto(mImpl.getResourceId());
} else {
@@ -2202,8 +2056,7 @@
* Gets the width of this image. If not defined, the image will not be rendered. Intended
* for testing purposes only.
*/
- @Nullable
- public DimensionBuilders.DpProp getWidth() {
+ public DimensionBuilders.@Nullable DpProp getWidth() {
if (mImpl.hasWidth()) {
return DimensionBuilders.DpProp.fromProto(mImpl.getWidth());
} else {
@@ -2215,8 +2068,7 @@
* Gets the height of this image. If not defined, the image will not be rendered. Intended
* for testing purposes only.
*/
- @Nullable
- public DimensionBuilders.DpProp getHeight() {
+ public DimensionBuilders.@Nullable DpProp getHeight() {
if (mImpl.hasHeight()) {
return DimensionBuilders.DpProp.fromProto(mImpl.getHeight());
} else {
@@ -2228,8 +2080,7 @@
* Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
* for testing purposes only.
*/
- @Nullable
- public ModifiersBuilders.SpanModifiers getModifiers() {
+ public ModifiersBuilders.@Nullable SpanModifiers getModifiers() {
if (mImpl.hasModifiers()) {
return ModifiersBuilders.SpanModifiers.fromProto(mImpl.getModifiers());
} else {
@@ -2241,8 +2092,7 @@
* Gets alignment of this image within the line height of the surrounding {@link Spannable}.
* If undefined, defaults to SPAN_VERTICAL_ALIGN_BOTTOM. Intended for testing purposes only.
*/
- @Nullable
- public SpanVerticalAlignmentProp getAlignment() {
+ public @Nullable SpanVerticalAlignmentProp getAlignment() {
if (mImpl.hasAlignment()) {
return SpanVerticalAlignmentProp.fromProto(mImpl.getAlignment());
} else {
@@ -2252,25 +2102,21 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static SpanImage fromProto(@NonNull LayoutElementProto.SpanImage proto) {
+ static @NonNull SpanImage fromProto(LayoutElementProto.@NonNull SpanImage proto) {
return new SpanImage(proto, null);
}
- @NonNull
- LayoutElementProto.SpanImage toProto() {
+ LayoutElementProto.@NonNull SpanImage toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public LayoutElementProto.Span toSpanProto() {
+ public LayoutElementProto.@NonNull Span toSpanProto() {
return LayoutElementProto.Span.newBuilder().setImage(mImpl).build();
}
@@ -2286,8 +2132,7 @@
* Sets the resource_id of the image to render. This must exist in the supplied resource
* bundle.
*/
- @NonNull
- public Builder setResourceId(@NonNull TypeBuilders.StringProp resourceId) {
+ public @NonNull Builder setResourceId(TypeBuilders.@NonNull StringProp resourceId) {
mImpl.setResourceId(resourceId.toProto());
mFingerprint.recordPropertyUpdate(
1, checkNotNull(resourceId.getFingerprint()).aggregateValueAsInt());
@@ -2298,16 +2143,14 @@
* Sets the resource_id of the image to render. This must exist in the supplied resource
* bundle.
*/
- @NonNull
- public Builder setResourceId(@NonNull String resourceId) {
+ public @NonNull Builder setResourceId(@NonNull String resourceId) {
mImpl.setResourceId(TypesProto.StringProp.newBuilder().setValue(resourceId));
mFingerprint.recordPropertyUpdate(1, resourceId.hashCode());
return this;
}
/** Sets the width of this image. If not defined, the image will not be rendered. */
- @NonNull
- public Builder setWidth(@NonNull DimensionBuilders.DpProp width) {
+ public @NonNull Builder setWidth(DimensionBuilders.@NonNull DpProp width) {
mImpl.setWidth(width.toProto());
mFingerprint.recordPropertyUpdate(
2, checkNotNull(width.getFingerprint()).aggregateValueAsInt());
@@ -2315,8 +2158,7 @@
}
/** Sets the height of this image. If not defined, the image will not be rendered. */
- @NonNull
- public Builder setHeight(@NonNull DimensionBuilders.DpProp height) {
+ public @NonNull Builder setHeight(DimensionBuilders.@NonNull DpProp height) {
mImpl.setHeight(height.toProto());
mFingerprint.recordPropertyUpdate(
3, checkNotNull(height.getFingerprint()).aggregateValueAsInt());
@@ -2324,8 +2166,8 @@
}
/** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
- @NonNull
- public Builder setModifiers(@NonNull ModifiersBuilders.SpanModifiers modifiers) {
+ public @NonNull Builder setModifiers(
+ ModifiersBuilders.@NonNull SpanModifiers modifiers) {
mImpl.setModifiers(modifiers.toProto());
mFingerprint.recordPropertyUpdate(
4, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -2336,8 +2178,7 @@
* Sets alignment of this image within the line height of the surrounding {@link
* Spannable}. If undefined, defaults to SPAN_VERTICAL_ALIGN_BOTTOM.
*/
- @NonNull
- public Builder setAlignment(@NonNull SpanVerticalAlignmentProp alignment) {
+ public @NonNull Builder setAlignment(@NonNull SpanVerticalAlignmentProp alignment) {
mImpl.setAlignment(alignment.toProto());
mFingerprint.recordPropertyUpdate(
5, checkNotNull(alignment.getFingerprint()).aggregateValueAsInt());
@@ -2348,8 +2189,7 @@
* Sets alignment of this image within the line height of the surrounding {@link
* Spannable}. If undefined, defaults to SPAN_VERTICAL_ALIGN_BOTTOM.
*/
- @NonNull
- public Builder setAlignment(@SpanVerticalAlignment int alignment) {
+ public @NonNull Builder setAlignment(@SpanVerticalAlignment int alignment) {
mImpl.setAlignment(
LayoutElementProto.SpanVerticalAlignmentProp.newBuilder()
.setValue(
@@ -2360,8 +2200,7 @@
}
@Override
- @NonNull
- public SpanImage build() {
+ public @NonNull SpanImage build() {
return new SpanImage(mImpl.build(), mFingerprint);
}
}
@@ -2375,29 +2214,25 @@
public interface Span {
/** Get the protocol buffer representation of this object. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- LayoutElementProto.Span toSpanProto();
+ LayoutElementProto.@NonNull Span toSpanProto();
/** Get the fingerprint for this object or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- Fingerprint getFingerprint();
+ @Nullable Fingerprint getFingerprint();
/** Builder to create {@link Span} objects. */
@SuppressLint("StaticFinalBuilder")
interface Builder {
/** Builds an instance with values accumulated in this Builder. */
- @NonNull
- Span build();
+ @NonNull Span build();
}
}
/**
* Return an instance of one of this object's subtypes, from the protocol buffer representation.
*/
- @NonNull
- static Span spanFromProto(@NonNull LayoutElementProto.Span proto) {
+ static @NonNull Span spanFromProto(LayoutElementProto.@NonNull Span proto) {
if (proto.hasText()) {
return SpanText.fromProto(proto.getText());
}
@@ -2415,7 +2250,7 @@
*/
public static final class Spannable implements LayoutElement {
private final LayoutElementProto.Spannable mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
Spannable(LayoutElementProto.Spannable impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -2426,8 +2261,7 @@
* Gets the {@link Span} elements that form this {@link Spannable}. Intended for testing
* purposes only.
*/
- @NonNull
- public List<Span> getSpans() {
+ public @NonNull List<Span> getSpans() {
return Collections.unmodifiableList(
mImpl.getSpansList().stream()
.map(LayoutElementBuilders::spanFromProto)
@@ -2438,8 +2272,7 @@
* Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
* for testing purposes only.
*/
- @Nullable
- public ModifiersBuilders.Modifiers getModifiers() {
+ public ModifiersBuilders.@Nullable Modifiers getModifiers() {
if (mImpl.hasModifiers()) {
return ModifiersBuilders.Modifiers.fromProto(mImpl.getModifiers());
} else {
@@ -2452,8 +2285,7 @@
* element. If not defined, the {@link Spannable} element will be treated as a single-line
* element. Intended for testing purposes only.
*/
- @Nullable
- public TypeBuilders.Int32Prop getMaxLines() {
+ public TypeBuilders.@Nullable Int32Prop getMaxLines() {
if (mImpl.hasMaxLines()) {
return TypeBuilders.Int32Prop.fromProto(mImpl.getMaxLines());
} else {
@@ -2469,8 +2301,7 @@
* element bounds. If not defined, defaults to TEXT_ALIGN_CENTER. Intended for testing
* purposes only.
*/
- @Nullable
- public HorizontalAlignmentProp getMultilineAlignment() {
+ public @Nullable HorizontalAlignmentProp getMultilineAlignment() {
if (mImpl.hasMultilineAlignment()) {
return HorizontalAlignmentProp.fromProto(mImpl.getMultilineAlignment());
} else {
@@ -2485,8 +2316,7 @@
* content, the content which cannot fit inside its container will be truncated. If not
* defined, defaults to TEXT_OVERFLOW_TRUNCATE. Intended for testing purposes only.
*/
- @Nullable
- public TextOverflowProp getOverflow() {
+ public @Nullable TextOverflowProp getOverflow() {
if (mImpl.hasOverflow()) {
return TextOverflowProp.fromProto(mImpl.getOverflow());
} else {
@@ -2499,8 +2329,7 @@
* distance between subsequent baselines. If not specified, defaults the font's recommended
* interline spacing. Intended for testing purposes only.
*/
- @Nullable
- public DimensionBuilders.SpProp getLineHeight() {
+ public DimensionBuilders.@Nullable SpProp getLineHeight() {
if (mImpl.hasLineHeight()) {
return DimensionBuilders.SpProp.fromProto(mImpl.getLineHeight());
} else {
@@ -2510,26 +2339,22 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static Spannable fromProto(
- @NonNull LayoutElementProto.Spannable proto, @Nullable Fingerprint fingerprint) {
+ static @NonNull Spannable fromProto(
+ LayoutElementProto.@NonNull Spannable proto, @Nullable Fingerprint fingerprint) {
return new Spannable(proto, fingerprint);
}
- @NonNull
- LayoutElementProto.Spannable toProto() {
+ LayoutElementProto.@NonNull Spannable toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public LayoutElementProto.LayoutElement toLayoutElementProto() {
+ public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
return LayoutElementProto.LayoutElement.newBuilder().setSpannable(mImpl).build();
}
@@ -2542,8 +2367,7 @@
public Builder() {}
/** Adds one item to the {@link Span} elements that form this {@link Spannable}. */
- @NonNull
- public Builder addSpan(@NonNull Span span) {
+ public @NonNull Builder addSpan(@NonNull Span span) {
mImpl.addSpans(span.toSpanProto());
mFingerprint.recordPropertyUpdate(
1, checkNotNull(span.getFingerprint()).aggregateValueAsInt());
@@ -2551,8 +2375,7 @@
}
/** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
- @NonNull
- public Builder setModifiers(@NonNull ModifiersBuilders.Modifiers modifiers) {
+ public @NonNull Builder setModifiers(ModifiersBuilders.@NonNull Modifiers modifiers) {
mImpl.setModifiers(modifiers.toProto());
mFingerprint.recordPropertyUpdate(
2, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -2564,8 +2387,7 @@
* element. If not defined, the {@link Spannable} element will be treated as a
* single-line element.
*/
- @NonNull
- public Builder setMaxLines(@NonNull TypeBuilders.Int32Prop maxLines) {
+ public @NonNull Builder setMaxLines(TypeBuilders.@NonNull Int32Prop maxLines) {
mImpl.setMaxLines(maxLines.toProto());
mFingerprint.recordPropertyUpdate(
3, checkNotNull(maxLines.getFingerprint()).aggregateValueAsInt());
@@ -2577,8 +2399,7 @@
* element. If not defined, the {@link Spannable} element will be treated as a
* single-line element.
*/
- @NonNull
- public Builder setMaxLines(@IntRange(from = 1) int maxLines) {
+ public @NonNull Builder setMaxLines(@IntRange(from = 1) int maxLines) {
mImpl.setMaxLines(TypesProto.Int32Prop.newBuilder().setValue(maxLines));
mFingerprint.recordPropertyUpdate(3, maxLines);
return this;
@@ -2591,8 +2412,7 @@
* For multi-line content, however, this will set the alignment of lines relative to the
* {@link Spannable} element bounds. If not defined, defaults to TEXT_ALIGN_CENTER.
*/
- @NonNull
- public Builder setMultilineAlignment(
+ public @NonNull Builder setMultilineAlignment(
@NonNull HorizontalAlignmentProp multilineAlignment) {
mImpl.setMultilineAlignment(multilineAlignment.toProto());
mFingerprint.recordPropertyUpdate(
@@ -2607,8 +2427,8 @@
* For multi-line content, however, this will set the alignment of lines relative to the
* {@link Spannable} element bounds. If not defined, defaults to TEXT_ALIGN_CENTER.
*/
- @NonNull
- public Builder setMultilineAlignment(@HorizontalAlignment int multilineAlignment) {
+ public @NonNull Builder setMultilineAlignment(
+ @HorizontalAlignment int multilineAlignment) {
mImpl.setMultilineAlignment(
AlignmentProto.HorizontalAlignmentProp.newBuilder()
.setValue(
@@ -2625,8 +2445,7 @@
* render all of its content, the content which cannot fit inside its container will be
* truncated. If not defined, defaults to TEXT_OVERFLOW_TRUNCATE.
*/
- @NonNull
- public Builder setOverflow(@NonNull TextOverflowProp overflow) {
+ public @NonNull Builder setOverflow(@NonNull TextOverflowProp overflow) {
mImpl.setOverflow(overflow.toProto());
mFingerprint.recordPropertyUpdate(
5, checkNotNull(overflow.getFingerprint()).aggregateValueAsInt());
@@ -2640,8 +2459,7 @@
* render all of its content, the content which cannot fit inside its container will be
* truncated. If not defined, defaults to TEXT_OVERFLOW_TRUNCATE.
*/
- @NonNull
- public Builder setOverflow(@TextOverflow int overflow) {
+ public @NonNull Builder setOverflow(@TextOverflow int overflow) {
mImpl.setOverflow(
LayoutElementProto.TextOverflowProp.newBuilder()
.setValue(LayoutElementProto.TextOverflow.forNumber(overflow)));
@@ -2654,8 +2472,7 @@
* distance between subsequent baselines. If not specified, defaults the font's
* recommended interline spacing.
*/
- @NonNull
- public Builder setLineHeight(@NonNull DimensionBuilders.SpProp lineHeight) {
+ public @NonNull Builder setLineHeight(DimensionBuilders.@NonNull SpProp lineHeight) {
mImpl.setLineHeight(lineHeight.toProto());
mFingerprint.recordPropertyUpdate(
7, checkNotNull(lineHeight.getFingerprint()).aggregateValueAsInt());
@@ -2663,8 +2480,7 @@
}
@Override
- @NonNull
- public Spannable build() {
+ public @NonNull Spannable build() {
return new Spannable(mImpl.build(), mFingerprint);
}
}
@@ -2682,7 +2498,7 @@
*/
public static final class Column implements LayoutElement {
private final LayoutElementProto.Column mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
Column(LayoutElementProto.Column impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -2693,8 +2509,7 @@
* Gets the list of child elements to place inside this {@link Column}. Intended for testing
* purposes only.
*/
- @NonNull
- public List<LayoutElement> getContents() {
+ public @NonNull List<LayoutElement> getContents() {
return Collections.unmodifiableList(
mImpl.getContentsList().stream()
.map(LayoutElementBuilders::layoutElementFromProto)
@@ -2706,8 +2521,7 @@
* the resulting width of the column. If not defined, defaults to HORIZONTAL_ALIGN_CENTER.
* Intended for testing purposes only.
*/
- @Nullable
- public HorizontalAlignmentProp getHorizontalAlignment() {
+ public @Nullable HorizontalAlignmentProp getHorizontalAlignment() {
if (mImpl.hasHorizontalAlignment()) {
return HorizontalAlignmentProp.fromProto(mImpl.getHorizontalAlignment());
} else {
@@ -2719,8 +2533,7 @@
* Gets the width of this column. If not defined, this will size itself to fit all of its
* children (i.e. a WrappedDimension). Intended for testing purposes only.
*/
- @Nullable
- public DimensionBuilders.ContainerDimension getWidth() {
+ public DimensionBuilders.@Nullable ContainerDimension getWidth() {
if (mImpl.hasWidth()) {
return DimensionBuilders.containerDimensionFromProto(mImpl.getWidth());
} else {
@@ -2732,8 +2545,7 @@
* Gets the height of this column. If not defined, this will size itself to fit all of its
* children (i.e. a WrappedDimension). Intended for testing purposes only.
*/
- @Nullable
- public DimensionBuilders.ContainerDimension getHeight() {
+ public DimensionBuilders.@Nullable ContainerDimension getHeight() {
if (mImpl.hasHeight()) {
return DimensionBuilders.containerDimensionFromProto(mImpl.getHeight());
} else {
@@ -2745,8 +2557,7 @@
* Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
* for testing purposes only.
*/
- @Nullable
- public ModifiersBuilders.Modifiers getModifiers() {
+ public ModifiersBuilders.@Nullable Modifiers getModifiers() {
if (mImpl.hasModifiers()) {
return ModifiersBuilders.Modifiers.fromProto(mImpl.getModifiers());
} else {
@@ -2756,26 +2567,22 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static Column fromProto(
- @NonNull LayoutElementProto.Column proto, @Nullable Fingerprint fingerprint) {
+ static @NonNull Column fromProto(
+ LayoutElementProto.@NonNull Column proto, @Nullable Fingerprint fingerprint) {
return new Column(proto, fingerprint);
}
- @NonNull
- LayoutElementProto.Column toProto() {
+ LayoutElementProto.@NonNull Column toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public LayoutElementProto.LayoutElement toLayoutElementProto() {
+ public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
return LayoutElementProto.LayoutElement.newBuilder().setColumn(mImpl).build();
}
@@ -2788,8 +2595,7 @@
public Builder() {}
/** Adds one item to the list of child elements to place inside this {@link Column}. */
- @NonNull
- public Builder addContent(@NonNull LayoutElement content) {
+ public @NonNull Builder addContent(@NonNull LayoutElement content) {
mImpl.addContents(content.toLayoutElementProto());
mFingerprint.addChildNode(checkNotNull(content.getFingerprint()));
return this;
@@ -2800,8 +2606,7 @@
* than the resulting width of the column. If not defined, defaults to
* HORIZONTAL_ALIGN_CENTER.
*/
- @NonNull
- public Builder setHorizontalAlignment(
+ public @NonNull Builder setHorizontalAlignment(
@NonNull HorizontalAlignmentProp horizontalAlignment) {
mImpl.setHorizontalAlignment(horizontalAlignment.toProto());
mFingerprint.recordPropertyUpdate(
@@ -2815,8 +2620,8 @@
* than the resulting width of the column. If not defined, defaults to
* HORIZONTAL_ALIGN_CENTER.
*/
- @NonNull
- public Builder setHorizontalAlignment(@HorizontalAlignment int horizontalAlignment) {
+ public @NonNull Builder setHorizontalAlignment(
+ @HorizontalAlignment int horizontalAlignment) {
mImpl.setHorizontalAlignment(
AlignmentProto.HorizontalAlignmentProp.newBuilder()
.setValue(
@@ -2830,8 +2635,7 @@
* Sets the width of this column. If not defined, this will size itself to fit all of
* its children (i.e. a WrappedDimension).
*/
- @NonNull
- public Builder setWidth(@NonNull DimensionBuilders.ContainerDimension width) {
+ public @NonNull Builder setWidth(DimensionBuilders.@NonNull ContainerDimension width) {
mImpl.setWidth(width.toContainerDimensionProto());
mFingerprint.recordPropertyUpdate(
3, checkNotNull(width.getFingerprint()).aggregateValueAsInt());
@@ -2842,8 +2646,8 @@
* Sets the height of this column. If not defined, this will size itself to fit all of
* its children (i.e. a WrappedDimension).
*/
- @NonNull
- public Builder setHeight(@NonNull DimensionBuilders.ContainerDimension height) {
+ public @NonNull Builder setHeight(
+ DimensionBuilders.@NonNull ContainerDimension height) {
mImpl.setHeight(height.toContainerDimensionProto());
mFingerprint.recordPropertyUpdate(
4, checkNotNull(height.getFingerprint()).aggregateValueAsInt());
@@ -2851,8 +2655,7 @@
}
/** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
- @NonNull
- public Builder setModifiers(@NonNull ModifiersBuilders.Modifiers modifiers) {
+ public @NonNull Builder setModifiers(ModifiersBuilders.@NonNull Modifiers modifiers) {
mImpl.setModifiers(modifiers.toProto());
mFingerprint.recordPropertyUpdate(
5, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -2860,8 +2663,7 @@
}
@Override
- @NonNull
- public Column build() {
+ public @NonNull Column build() {
return new Column(mImpl.build(), mFingerprint);
}
}
@@ -2879,7 +2681,7 @@
*/
public static final class Row implements LayoutElement {
private final LayoutElementProto.Row mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
Row(LayoutElementProto.Row impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -2890,8 +2692,7 @@
* Gets the list of child elements to place inside this {@link Row}. Intended for testing
* purposes only.
*/
- @NonNull
- public List<LayoutElement> getContents() {
+ public @NonNull List<LayoutElement> getContents() {
return Collections.unmodifiableList(
mImpl.getContentsList().stream()
.map(LayoutElementBuilders::layoutElementFromProto)
@@ -2903,8 +2704,7 @@
* resulting height of the row. If not defined, defaults to VERTICAL_ALIGN_CENTER. Intended
* for testing purposes only.
*/
- @Nullable
- public VerticalAlignmentProp getVerticalAlignment() {
+ public @Nullable VerticalAlignmentProp getVerticalAlignment() {
if (mImpl.hasVerticalAlignment()) {
return VerticalAlignmentProp.fromProto(mImpl.getVerticalAlignment());
} else {
@@ -2916,8 +2716,7 @@
* Gets the width of this row. If not defined, this will size itself to fit all of its
* children (i.e. a WrappedDimension). Intended for testing purposes only.
*/
- @Nullable
- public DimensionBuilders.ContainerDimension getWidth() {
+ public DimensionBuilders.@Nullable ContainerDimension getWidth() {
if (mImpl.hasWidth()) {
return DimensionBuilders.containerDimensionFromProto(mImpl.getWidth());
} else {
@@ -2929,8 +2728,7 @@
* Gets the height of this row. If not defined, this will size itself to fit all of its
* children (i.e. a WrappedDimension). Intended for testing purposes only.
*/
- @Nullable
- public DimensionBuilders.ContainerDimension getHeight() {
+ public DimensionBuilders.@Nullable ContainerDimension getHeight() {
if (mImpl.hasHeight()) {
return DimensionBuilders.containerDimensionFromProto(mImpl.getHeight());
} else {
@@ -2942,8 +2740,7 @@
* Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
* for testing purposes only.
*/
- @Nullable
- public ModifiersBuilders.Modifiers getModifiers() {
+ public ModifiersBuilders.@Nullable Modifiers getModifiers() {
if (mImpl.hasModifiers()) {
return ModifiersBuilders.Modifiers.fromProto(mImpl.getModifiers());
} else {
@@ -2953,26 +2750,22 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static Row fromProto(
- @NonNull LayoutElementProto.Row proto, @Nullable Fingerprint fingerprint) {
+ static @NonNull Row fromProto(
+ LayoutElementProto.@NonNull Row proto, @Nullable Fingerprint fingerprint) {
return new Row(proto, fingerprint);
}
- @NonNull
- LayoutElementProto.Row toProto() {
+ LayoutElementProto.@NonNull Row toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public LayoutElementProto.LayoutElement toLayoutElementProto() {
+ public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
return LayoutElementProto.LayoutElement.newBuilder().setRow(mImpl).build();
}
@@ -2985,8 +2778,7 @@
public Builder() {}
/** Adds one item to the list of child elements to place inside this {@link Row}. */
- @NonNull
- public Builder addContent(@NonNull LayoutElement content) {
+ public @NonNull Builder addContent(@NonNull LayoutElement content) {
mImpl.addContents(content.toLayoutElementProto());
mFingerprint.addChildNode(checkNotNull(content.getFingerprint()));
return this;
@@ -2996,8 +2788,8 @@
* Sets the vertical alignment of elements inside this row, if they are narrower than
* the resulting height of the row. If not defined, defaults to VERTICAL_ALIGN_CENTER.
*/
- @NonNull
- public Builder setVerticalAlignment(@NonNull VerticalAlignmentProp verticalAlignment) {
+ public @NonNull Builder setVerticalAlignment(
+ @NonNull VerticalAlignmentProp verticalAlignment) {
mImpl.setVerticalAlignment(verticalAlignment.toProto());
mFingerprint.recordPropertyUpdate(
2, checkNotNull(verticalAlignment.getFingerprint()).aggregateValueAsInt());
@@ -3008,8 +2800,7 @@
* Sets the vertical alignment of elements inside this row, if they are narrower than
* the resulting height of the row. If not defined, defaults to VERTICAL_ALIGN_CENTER.
*/
- @NonNull
- public Builder setVerticalAlignment(@VerticalAlignment int verticalAlignment) {
+ public @NonNull Builder setVerticalAlignment(@VerticalAlignment int verticalAlignment) {
mImpl.setVerticalAlignment(
AlignmentProto.VerticalAlignmentProp.newBuilder()
.setValue(
@@ -3023,8 +2814,7 @@
* Sets the width of this row. If not defined, this will size itself to fit all of its
* children (i.e. a WrappedDimension).
*/
- @NonNull
- public Builder setWidth(@NonNull DimensionBuilders.ContainerDimension width) {
+ public @NonNull Builder setWidth(DimensionBuilders.@NonNull ContainerDimension width) {
mImpl.setWidth(width.toContainerDimensionProto());
mFingerprint.recordPropertyUpdate(
3, checkNotNull(width.getFingerprint()).aggregateValueAsInt());
@@ -3035,8 +2825,8 @@
* Sets the height of this row. If not defined, this will size itself to fit all of its
* children (i.e. a WrappedDimension).
*/
- @NonNull
- public Builder setHeight(@NonNull DimensionBuilders.ContainerDimension height) {
+ public @NonNull Builder setHeight(
+ DimensionBuilders.@NonNull ContainerDimension height) {
mImpl.setHeight(height.toContainerDimensionProto());
mFingerprint.recordPropertyUpdate(
4, checkNotNull(height.getFingerprint()).aggregateValueAsInt());
@@ -3044,8 +2834,7 @@
}
/** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
- @NonNull
- public Builder setModifiers(@NonNull ModifiersBuilders.Modifiers modifiers) {
+ public @NonNull Builder setModifiers(ModifiersBuilders.@NonNull Modifiers modifiers) {
mImpl.setModifiers(modifiers.toProto());
mFingerprint.recordPropertyUpdate(
5, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -3053,8 +2842,7 @@
}
@Override
- @NonNull
- public Row build() {
+ public @NonNull Row build() {
return new Row(mImpl.build(), mFingerprint);
}
}
@@ -3067,7 +2855,7 @@
*/
public static final class Arc implements LayoutElement {
private final LayoutElementProto.Arc mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
Arc(LayoutElementProto.Arc impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -3075,8 +2863,7 @@
}
/** Gets contents of this container. Intended for testing purposes only. */
- @NonNull
- public List<ArcLayoutElement> getContents() {
+ public @NonNull List<ArcLayoutElement> getContents() {
return Collections.unmodifiableList(
mImpl.getContentsList().stream()
.map(LayoutElementBuilders::arcLayoutElementFromProto)
@@ -3092,8 +2879,7 @@
* sweep anti-clockwise (i.e. -90 degrees is equivalent to 270 degrees), and values >360
* will be be placed at X mod 360 degrees. Intended for testing purposes only.
*/
- @Nullable
- public DimensionBuilders.DegreesProp getAnchorAngle() {
+ public DimensionBuilders.@Nullable DegreesProp getAnchorAngle() {
if (mImpl.hasAnchorAngle()) {
return DimensionBuilders.DegreesProp.fromProto(mImpl.getAnchorAngle());
} else {
@@ -3105,8 +2891,7 @@
* Gets how to align the contents of this container relative to anchor_angle. If not
* defined, defaults to ARC_ANCHOR_CENTER. Intended for testing purposes only.
*/
- @Nullable
- public ArcAnchorTypeProp getAnchorType() {
+ public @Nullable ArcAnchorTypeProp getAnchorType() {
if (mImpl.hasAnchorType()) {
return ArcAnchorTypeProp.fromProto(mImpl.getAnchorType());
} else {
@@ -3120,8 +2905,7 @@
* should be drawn towards the inner or outer edge of the arc, or drawn in the center. If
* not defined, defaults to VERTICAL_ALIGN_CENTER. Intended for testing purposes only.
*/
- @Nullable
- public VerticalAlignmentProp getVerticalAlign() {
+ public @Nullable VerticalAlignmentProp getVerticalAlign() {
if (mImpl.hasVerticalAlign()) {
return VerticalAlignmentProp.fromProto(mImpl.getVerticalAlign());
} else {
@@ -3133,8 +2917,7 @@
* Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
* for testing purposes only.
*/
- @Nullable
- public ModifiersBuilders.Modifiers getModifiers() {
+ public ModifiersBuilders.@Nullable Modifiers getModifiers() {
if (mImpl.hasModifiers()) {
return ModifiersBuilders.Modifiers.fromProto(mImpl.getModifiers());
} else {
@@ -3144,26 +2927,22 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static Arc fromProto(
- @NonNull LayoutElementProto.Arc proto, @Nullable Fingerprint fingerprint) {
+ static @NonNull Arc fromProto(
+ LayoutElementProto.@NonNull Arc proto, @Nullable Fingerprint fingerprint) {
return new Arc(proto, fingerprint);
}
- @NonNull
- LayoutElementProto.Arc toProto() {
+ LayoutElementProto.@NonNull Arc toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public LayoutElementProto.LayoutElement toLayoutElementProto() {
+ public LayoutElementProto.@NonNull LayoutElement toLayoutElementProto() {
return LayoutElementProto.LayoutElement.newBuilder().setArc(mImpl).build();
}
@@ -3176,8 +2955,7 @@
public Builder() {}
/** Adds one item to contents of this container. */
- @NonNull
- public Builder addContent(@NonNull ArcLayoutElement content) {
+ public @NonNull Builder addContent(@NonNull ArcLayoutElement content) {
mImpl.addContents(content.toArcLayoutElementProto());
mFingerprint.addChildNode(checkNotNull(content.getFingerprint()));
return this;
@@ -3192,8 +2970,8 @@
* 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.
*/
- @NonNull
- public Builder setAnchorAngle(@NonNull DimensionBuilders.DegreesProp anchorAngle) {
+ public @NonNull Builder setAnchorAngle(
+ DimensionBuilders.@NonNull DegreesProp anchorAngle) {
mImpl.setAnchorAngle(anchorAngle.toProto());
mFingerprint.recordPropertyUpdate(
2, checkNotNull(anchorAngle.getFingerprint()).aggregateValueAsInt());
@@ -3204,8 +2982,7 @@
* Sets how to align the contents of this container relative to anchor_angle. If not
* defined, defaults to ARC_ANCHOR_CENTER.
*/
- @NonNull
- public Builder setAnchorType(@NonNull ArcAnchorTypeProp anchorType) {
+ public @NonNull Builder setAnchorType(@NonNull ArcAnchorTypeProp anchorType) {
mImpl.setAnchorType(anchorType.toProto());
mFingerprint.recordPropertyUpdate(
3, checkNotNull(anchorType.getFingerprint()).aggregateValueAsInt());
@@ -3216,8 +2993,7 @@
* Sets how to align the contents of this container relative to anchor_angle. If not
* defined, defaults to ARC_ANCHOR_CENTER.
*/
- @NonNull
- public Builder setAnchorType(@ArcAnchorType int anchorType) {
+ public @NonNull Builder setAnchorType(@ArcAnchorType int anchorType) {
mImpl.setAnchorType(
AlignmentProto.ArcAnchorTypeProp.newBuilder()
.setValue(AlignmentProto.ArcAnchorType.forNumber(anchorType)));
@@ -3231,8 +3007,7 @@
* element should be drawn towards the inner or outer edge of the arc, or drawn in the
* center. If not defined, defaults to VERTICAL_ALIGN_CENTER.
*/
- @NonNull
- public Builder setVerticalAlign(@NonNull VerticalAlignmentProp verticalAlign) {
+ public @NonNull Builder setVerticalAlign(@NonNull VerticalAlignmentProp verticalAlign) {
mImpl.setVerticalAlign(verticalAlign.toProto());
mFingerprint.recordPropertyUpdate(
4, checkNotNull(verticalAlign.getFingerprint()).aggregateValueAsInt());
@@ -3245,8 +3020,7 @@
* element should be drawn towards the inner or outer edge of the arc, or drawn in the
* center. If not defined, defaults to VERTICAL_ALIGN_CENTER.
*/
- @NonNull
- public Builder setVerticalAlign(@VerticalAlignment int verticalAlign) {
+ public @NonNull Builder setVerticalAlign(@VerticalAlignment int verticalAlign) {
mImpl.setVerticalAlign(
AlignmentProto.VerticalAlignmentProp.newBuilder()
.setValue(
@@ -3256,8 +3030,7 @@
}
/** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
- @NonNull
- public Builder setModifiers(@NonNull ModifiersBuilders.Modifiers modifiers) {
+ public @NonNull Builder setModifiers(ModifiersBuilders.@NonNull Modifiers modifiers) {
mImpl.setModifiers(modifiers.toProto());
mFingerprint.recordPropertyUpdate(
5, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -3265,8 +3038,7 @@
}
@Override
- @NonNull
- public Arc build() {
+ public @NonNull Arc build() {
return new Arc(mImpl.build(), mFingerprint);
}
}
@@ -3275,7 +3047,7 @@
/** A text element that can be used in an {@link Arc}. */
public static final class ArcText implements ArcLayoutElement {
private final LayoutElementProto.ArcText mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
ArcText(LayoutElementProto.ArcText impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -3283,8 +3055,7 @@
}
/** Gets the text to render. Intended for testing purposes only. */
- @Nullable
- public TypeBuilders.StringProp getText() {
+ public TypeBuilders.@Nullable StringProp getText() {
if (mImpl.hasText()) {
return TypeBuilders.StringProp.fromProto(mImpl.getText());
} else {
@@ -3296,8 +3067,7 @@
* Gets the style of font to use (size, bold etc). If not specified, defaults to the
* platform's default body font. Intended for testing purposes only.
*/
- @Nullable
- public FontStyle getFontStyle() {
+ public @Nullable FontStyle getFontStyle() {
if (mImpl.hasFontStyle()) {
return FontStyle.fromProto(mImpl.getFontStyle());
} else {
@@ -3309,8 +3079,7 @@
* Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
* for testing purposes only.
*/
- @Nullable
- public ModifiersBuilders.ArcModifiers getModifiers() {
+ public ModifiersBuilders.@Nullable ArcModifiers getModifiers() {
if (mImpl.hasModifiers()) {
return ModifiersBuilders.ArcModifiers.fromProto(mImpl.getModifiers());
} else {
@@ -3320,25 +3089,21 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static ArcText fromProto(@NonNull LayoutElementProto.ArcText proto) {
+ static @NonNull ArcText fromProto(LayoutElementProto.@NonNull ArcText proto) {
return new ArcText(proto, null);
}
- @NonNull
- LayoutElementProto.ArcText toProto() {
+ LayoutElementProto.@NonNull ArcText toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public LayoutElementProto.ArcLayoutElement toArcLayoutElementProto() {
+ public LayoutElementProto.@NonNull ArcLayoutElement toArcLayoutElementProto() {
return LayoutElementProto.ArcLayoutElement.newBuilder().setText(mImpl).build();
}
@@ -3351,8 +3116,7 @@
public Builder() {}
/** Sets the text to render. */
- @NonNull
- public Builder setText(@NonNull TypeBuilders.StringProp text) {
+ public @NonNull Builder setText(TypeBuilders.@NonNull StringProp text) {
mImpl.setText(text.toProto());
mFingerprint.recordPropertyUpdate(
1, checkNotNull(text.getFingerprint()).aggregateValueAsInt());
@@ -3360,8 +3124,7 @@
}
/** Sets the text to render. */
- @NonNull
- public Builder setText(@NonNull String text) {
+ public @NonNull Builder setText(@NonNull String text) {
mImpl.setText(TypesProto.StringProp.newBuilder().setValue(text));
mFingerprint.recordPropertyUpdate(1, text.hashCode());
return this;
@@ -3371,8 +3134,7 @@
* Sets the style of font to use (size, bold etc). If not specified, defaults to the
* platform's default body font.
*/
- @NonNull
- public Builder setFontStyle(@NonNull FontStyle fontStyle) {
+ public @NonNull Builder setFontStyle(@NonNull FontStyle fontStyle) {
mImpl.setFontStyle(fontStyle.toProto());
mFingerprint.recordPropertyUpdate(
2, checkNotNull(fontStyle.getFingerprint()).aggregateValueAsInt());
@@ -3380,8 +3142,8 @@
}
/** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
- @NonNull
- public Builder setModifiers(@NonNull ModifiersBuilders.ArcModifiers modifiers) {
+ public @NonNull Builder setModifiers(
+ ModifiersBuilders.@NonNull ArcModifiers modifiers) {
mImpl.setModifiers(modifiers.toProto());
mFingerprint.recordPropertyUpdate(
3, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -3389,8 +3151,7 @@
}
@Override
- @NonNull
- public ArcText build() {
+ public @NonNull ArcText build() {
return new ArcText(mImpl.build(), mFingerprint);
}
}
@@ -3399,7 +3160,7 @@
/** A line that can be used in an {@link Arc} and renders as a round progress bar. */
public static final class ArcLine implements ArcLayoutElement {
private final LayoutElementProto.ArcLine mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
ArcLine(LayoutElementProto.ArcLine impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -3410,8 +3171,7 @@
* Gets the length of this line, in degrees. If not defined, defaults to 0. Intended for
* testing purposes only.
*/
- @Nullable
- public DimensionBuilders.DegreesProp getLength() {
+ public DimensionBuilders.@Nullable DegreesProp getLength() {
if (mImpl.hasLength()) {
return DimensionBuilders.DegreesProp.fromProto(mImpl.getLength());
} else {
@@ -3423,8 +3183,7 @@
* Gets the thickness of this line. If not defined, defaults to 0. Intended for testing
* purposes only.
*/
- @Nullable
- public DimensionBuilders.DpProp getThickness() {
+ public DimensionBuilders.@Nullable DpProp getThickness() {
if (mImpl.hasThickness()) {
return DimensionBuilders.DpProp.fromProto(mImpl.getThickness());
} else {
@@ -3433,8 +3192,7 @@
}
/** Gets the color of this line. Intended for testing purposes only. */
- @Nullable
- public ColorBuilders.ColorProp getColor() {
+ public ColorBuilders.@Nullable ColorProp getColor() {
if (mImpl.hasColor()) {
return ColorBuilders.ColorProp.fromProto(mImpl.getColor());
} else {
@@ -3446,8 +3204,7 @@
* Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
* for testing purposes only.
*/
- @Nullable
- public ModifiersBuilders.ArcModifiers getModifiers() {
+ public ModifiersBuilders.@Nullable ArcModifiers getModifiers() {
if (mImpl.hasModifiers()) {
return ModifiersBuilders.ArcModifiers.fromProto(mImpl.getModifiers());
} else {
@@ -3457,25 +3214,21 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static ArcLine fromProto(@NonNull LayoutElementProto.ArcLine proto) {
+ static @NonNull ArcLine fromProto(LayoutElementProto.@NonNull ArcLine proto) {
return new ArcLine(proto, null);
}
- @NonNull
- LayoutElementProto.ArcLine toProto() {
+ LayoutElementProto.@NonNull ArcLine toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public LayoutElementProto.ArcLayoutElement toArcLayoutElementProto() {
+ public LayoutElementProto.@NonNull ArcLayoutElement toArcLayoutElementProto() {
return LayoutElementProto.ArcLayoutElement.newBuilder().setLine(mImpl).build();
}
@@ -3488,8 +3241,7 @@
public Builder() {}
/** Sets the length of this line, in degrees. If not defined, defaults to 0. */
- @NonNull
- public Builder setLength(@NonNull DimensionBuilders.DegreesProp length) {
+ public @NonNull Builder setLength(DimensionBuilders.@NonNull DegreesProp length) {
mImpl.setLength(length.toProto());
mFingerprint.recordPropertyUpdate(
1, checkNotNull(length.getFingerprint()).aggregateValueAsInt());
@@ -3497,8 +3249,7 @@
}
/** Sets the thickness of this line. If not defined, defaults to 0. */
- @NonNull
- public Builder setThickness(@NonNull DimensionBuilders.DpProp thickness) {
+ public @NonNull Builder setThickness(DimensionBuilders.@NonNull DpProp thickness) {
mImpl.setThickness(thickness.toProto());
mFingerprint.recordPropertyUpdate(
2, checkNotNull(thickness.getFingerprint()).aggregateValueAsInt());
@@ -3506,8 +3257,7 @@
}
/** Sets the color of this line. */
- @NonNull
- public Builder setColor(@NonNull ColorBuilders.ColorProp color) {
+ public @NonNull Builder setColor(ColorBuilders.@NonNull ColorProp color) {
mImpl.setColor(color.toProto());
mFingerprint.recordPropertyUpdate(
3, checkNotNull(color.getFingerprint()).aggregateValueAsInt());
@@ -3515,8 +3265,8 @@
}
/** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
- @NonNull
- public Builder setModifiers(@NonNull ModifiersBuilders.ArcModifiers modifiers) {
+ public @NonNull Builder setModifiers(
+ ModifiersBuilders.@NonNull ArcModifiers modifiers) {
mImpl.setModifiers(modifiers.toProto());
mFingerprint.recordPropertyUpdate(
4, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -3524,8 +3274,7 @@
}
@Override
- @NonNull
- public ArcLine build() {
+ public @NonNull ArcLine build() {
return new ArcLine(mImpl.build(), mFingerprint);
}
}
@@ -3534,7 +3283,7 @@
/** A simple spacer used to provide padding between adjacent elements in an {@link Arc}. */
public static final class ArcSpacer implements ArcLayoutElement {
private final LayoutElementProto.ArcSpacer mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
ArcSpacer(LayoutElementProto.ArcSpacer impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -3545,8 +3294,7 @@
* Gets the length of this spacer, in degrees. If not defined, defaults to 0. Intended for
* testing purposes only.
*/
- @Nullable
- public DimensionBuilders.DegreesProp getLength() {
+ public DimensionBuilders.@Nullable DegreesProp getLength() {
if (mImpl.hasLength()) {
return DimensionBuilders.DegreesProp.fromProto(mImpl.getLength());
} else {
@@ -3558,8 +3306,7 @@
* Gets the thickness of this spacer, in DP. If not defined, defaults to 0. Intended for
* testing purposes only.
*/
- @Nullable
- public DimensionBuilders.DpProp getThickness() {
+ public DimensionBuilders.@Nullable DpProp getThickness() {
if (mImpl.hasThickness()) {
return DimensionBuilders.DpProp.fromProto(mImpl.getThickness());
} else {
@@ -3571,8 +3318,7 @@
* Gets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. Intended
* for testing purposes only.
*/
- @Nullable
- public ModifiersBuilders.ArcModifiers getModifiers() {
+ public ModifiersBuilders.@Nullable ArcModifiers getModifiers() {
if (mImpl.hasModifiers()) {
return ModifiersBuilders.ArcModifiers.fromProto(mImpl.getModifiers());
} else {
@@ -3582,25 +3328,21 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static ArcSpacer fromProto(@NonNull LayoutElementProto.ArcSpacer proto) {
+ static @NonNull ArcSpacer fromProto(LayoutElementProto.@NonNull ArcSpacer proto) {
return new ArcSpacer(proto, null);
}
- @NonNull
- LayoutElementProto.ArcSpacer toProto() {
+ LayoutElementProto.@NonNull ArcSpacer toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public LayoutElementProto.ArcLayoutElement toArcLayoutElementProto() {
+ public LayoutElementProto.@NonNull ArcLayoutElement toArcLayoutElementProto() {
return LayoutElementProto.ArcLayoutElement.newBuilder().setSpacer(mImpl).build();
}
@@ -3613,8 +3355,7 @@
public Builder() {}
/** Sets the length of this spacer, in degrees. If not defined, defaults to 0. */
- @NonNull
- public Builder setLength(@NonNull DimensionBuilders.DegreesProp length) {
+ public @NonNull Builder setLength(DimensionBuilders.@NonNull DegreesProp length) {
mImpl.setLength(length.toProto());
mFingerprint.recordPropertyUpdate(
1, checkNotNull(length.getFingerprint()).aggregateValueAsInt());
@@ -3622,8 +3363,7 @@
}
/** Sets the thickness of this spacer, in DP. If not defined, defaults to 0. */
- @NonNull
- public Builder setThickness(@NonNull DimensionBuilders.DpProp thickness) {
+ public @NonNull Builder setThickness(DimensionBuilders.@NonNull DpProp thickness) {
mFingerprint.recordPropertyUpdate(
2, checkNotNull(thickness.getFingerprint()).aggregateValueAsInt());
mImpl.setThickness(thickness.toProto());
@@ -3631,8 +3371,8 @@
}
/** Sets {@link androidx.wear.tiles.ModifiersBuilders.Modifiers} for this element. */
- @NonNull
- public Builder setModifiers(@NonNull ModifiersBuilders.ArcModifiers modifiers) {
+ public @NonNull Builder setModifiers(
+ ModifiersBuilders.@NonNull ArcModifiers modifiers) {
mImpl.setModifiers(modifiers.toProto());
mFingerprint.recordPropertyUpdate(
3, checkNotNull(modifiers.getFingerprint()).aggregateValueAsInt());
@@ -3640,8 +3380,7 @@
}
@Override
- @NonNull
- public ArcSpacer build() {
+ public @NonNull ArcSpacer build() {
return new ArcSpacer(mImpl.build(), mFingerprint);
}
}
@@ -3650,7 +3389,7 @@
/** A container that allows a standard {@link LayoutElement} to be added to an {@link Arc}. */
public static final class ArcAdapter implements ArcLayoutElement {
private final LayoutElementProto.ArcAdapter mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
ArcAdapter(LayoutElementProto.ArcAdapter impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -3658,8 +3397,7 @@
}
/** Gets the element to adapt to an {@link Arc}. Intended for testing purposes only. */
- @Nullable
- public LayoutElement getContent() {
+ public @Nullable LayoutElement getContent() {
if (mImpl.hasContent()) {
return LayoutElementBuilders.layoutElementFromProto(mImpl.getContent());
} else {
@@ -3676,8 +3414,7 @@
* will not be rotated. If not defined, defaults to false. Intended for testing purposes
* only.
*/
- @Nullable
- public TypeBuilders.BoolProp getRotateContents() {
+ public TypeBuilders.@Nullable BoolProp getRotateContents() {
if (mImpl.hasRotateContents()) {
return TypeBuilders.BoolProp.fromProto(mImpl.getRotateContents());
} else {
@@ -3687,25 +3424,21 @@
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static ArcAdapter fromProto(@NonNull LayoutElementProto.ArcAdapter proto) {
+ static @NonNull ArcAdapter fromProto(LayoutElementProto.@NonNull ArcAdapter proto) {
return new ArcAdapter(proto, null);
}
- @NonNull
- LayoutElementProto.ArcAdapter toProto() {
+ LayoutElementProto.@NonNull ArcAdapter toProto() {
return mImpl;
}
@Override
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public LayoutElementProto.ArcLayoutElement toArcLayoutElementProto() {
+ public LayoutElementProto.@NonNull ArcLayoutElement toArcLayoutElementProto() {
return LayoutElementProto.ArcLayoutElement.newBuilder().setAdapter(mImpl).build();
}
@@ -3718,8 +3451,7 @@
public Builder() {}
/** Sets the element to adapt to an {@link Arc}. */
- @NonNull
- public Builder setContent(@NonNull LayoutElement content) {
+ public @NonNull Builder setContent(@NonNull LayoutElement content) {
mImpl.setContent(content.toLayoutElementProto());
mFingerprint.addChildNode(checkNotNull(content.getFingerprint()));
return this;
@@ -3733,8 +3465,8 @@
* degrees. If rotate_contents = false, the image will be placed at the 3 o clock
* position, but itself will not be rotated. If not defined, defaults to false.
*/
- @NonNull
- public Builder setRotateContents(@NonNull TypeBuilders.BoolProp rotateContents) {
+ public @NonNull Builder setRotateContents(
+ TypeBuilders.@NonNull BoolProp rotateContents) {
mImpl.setRotateContents(rotateContents.toProto());
mFingerprint.recordPropertyUpdate(
2, checkNotNull(rotateContents.getFingerprint()).aggregateValueAsInt());
@@ -3750,16 +3482,14 @@
* position, but itself will not be rotated. If not defined, defaults to false.
*/
@SuppressLint("MissingGetterMatchingBuilder")
- @NonNull
- public Builder setRotateContents(boolean rotateContents) {
+ public @NonNull Builder setRotateContents(boolean rotateContents) {
mImpl.setRotateContents(TypesProto.BoolProp.newBuilder().setValue(rotateContents));
mFingerprint.recordPropertyUpdate(2, Boolean.hashCode(rotateContents));
return this;
}
@Override
- @NonNull
- public ArcAdapter build() {
+ public @NonNull ArcAdapter build() {
return new ArcAdapter(mImpl.build(), mFingerprint);
}
}
@@ -3772,29 +3502,25 @@
public interface LayoutElement {
/** Get the protocol buffer representation of this object. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- LayoutElementProto.LayoutElement toLayoutElementProto();
+ LayoutElementProto.@NonNull LayoutElement toLayoutElementProto();
/** Get the fingerprint for this object or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- Fingerprint getFingerprint();
+ @Nullable Fingerprint getFingerprint();
/** Builder to create {@link LayoutElement} objects. */
@SuppressLint("StaticFinalBuilder")
interface Builder {
/** Builds an instance with values accumulated in this Builder. */
- @NonNull
- LayoutElement build();
+ @NonNull LayoutElement build();
}
}
/** Creates a new wrapper instance from the proto. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static LayoutElement layoutElementFromProto(
- @NonNull LayoutElementProto.LayoutElement proto, @Nullable Fingerprint fingerprint) {
+ public static @NonNull LayoutElement layoutElementFromProto(
+ LayoutElementProto.@NonNull LayoutElement proto, @Nullable Fingerprint fingerprint) {
if (proto.hasColumn()) {
return Column.fromProto(proto.getColumn(), fingerprint);
}
@@ -3822,8 +3548,8 @@
throw new IllegalStateException("Proto was not a recognised instance of LayoutElement");
}
- @NonNull
- static LayoutElement layoutElementFromProto(@NonNull LayoutElementProto.LayoutElement proto) {
+ static @NonNull LayoutElement layoutElementFromProto(
+ LayoutElementProto.@NonNull LayoutElement proto) {
return layoutElementFromProto(proto, null);
}
@@ -3834,27 +3560,23 @@
public interface ArcLayoutElement {
/** Get the protocol buffer representation of this object. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- LayoutElementProto.ArcLayoutElement toArcLayoutElementProto();
+ LayoutElementProto.@NonNull ArcLayoutElement toArcLayoutElementProto();
/** Get the fingerprint for this object or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- Fingerprint getFingerprint();
+ @Nullable Fingerprint getFingerprint();
/** Builder to create {@link ArcLayoutElement} objects. */
@SuppressLint("StaticFinalBuilder")
interface Builder {
/** Builds an instance with values accumulated in this Builder. */
- @NonNull
- ArcLayoutElement build();
+ @NonNull ArcLayoutElement build();
}
}
- @NonNull
- static ArcLayoutElement arcLayoutElementFromProto(
- @NonNull LayoutElementProto.ArcLayoutElement proto) {
+ static @NonNull ArcLayoutElement arcLayoutElementFromProto(
+ LayoutElementProto.@NonNull ArcLayoutElement proto) {
if (proto.hasText()) {
return ArcText.fromProto(proto.getText());
}
@@ -3879,8 +3601,7 @@
}
/** Gets the root element in the layout. Intended for testing purposes only. */
- @Nullable
- public LayoutElement getRoot() {
+ public @Nullable LayoutElement getRoot() {
if (mImpl.hasRoot()) {
return LayoutElementBuilders.layoutElementFromProto(mImpl.getRoot());
} else {
@@ -3889,35 +3610,30 @@
}
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static Layout fromProto(@NonNull LayoutElementProto.Layout proto) {
+ public static @NonNull Layout fromProto(LayoutElementProto.@NonNull Layout proto) {
return new Layout(proto);
}
/** Creates a {@link Layout} object containing the given layout element. */
- @NonNull
- public static Layout fromLayoutElement(@NonNull LayoutElement layoutElement) {
+ public static @NonNull Layout fromLayoutElement(@NonNull LayoutElement layoutElement) {
return new Builder().setRoot(layoutElement).build();
}
/** Returns the internal proto instance. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public LayoutElementProto.Layout toProto() {
+ public LayoutElementProto.@NonNull Layout toProto() {
return mImpl;
}
/** Converts to byte array representation. */
@TilesExperimental
- @NonNull
- public byte[] toByteArray() {
+ public byte @NonNull [] toByteArray() {
return mImpl.toByteArray();
}
/** Converts from byte array representation. */
@TilesExperimental
- @Nullable
- public static Layout fromByteArray(@NonNull byte[] byteArray) {
+ public static @Nullable Layout fromByteArray(byte @NonNull [] byteArray) {
try {
return fromProto(LayoutElementProto.Layout.parseFrom(byteArray));
} catch (InvalidProtocolBufferException e) {
@@ -3933,10 +3649,9 @@
public Builder() {}
/** Sets the root element in the layout. */
- @NonNull
- public Builder setRoot(@NonNull LayoutElement root) {
+ public @NonNull Builder setRoot(@NonNull LayoutElement root) {
mImpl.setRoot(root.toLayoutElementProto());
- @Nullable Fingerprint fingerprint = root.getFingerprint();
+ Fingerprint fingerprint = root.getFingerprint();
if (fingerprint != null) {
mImpl.setFingerprint(
TreeFingerprint.newBuilder().setRoot(fingerprintToProto(fingerprint)));
@@ -3964,8 +3679,7 @@
}
/** Builds an instance from accumulated values. */
- @NonNull
- public Layout build() {
+ public @NonNull Layout build() {
return Layout.fromProto(mImpl.build());
}
}
@@ -3978,101 +3692,90 @@
private FontStyles() {}
private static boolean isLargeScreen(
- @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+ DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
return deviceParameters.getScreenWidthDp() >= LARGE_SCREEN_WIDTH_DP;
}
/** Font style for large display text. */
- @NonNull
- public static FontStyle.Builder display1(
- @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+ public static FontStyle.@NonNull Builder display1(
+ DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
return new FontStyle.Builder()
.setWeight(FONT_WEIGHT_BOLD)
.setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 54 : 50));
}
/** Font style for medium display text. */
- @NonNull
- public static FontStyle.Builder display2(
- @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+ public static FontStyle.@NonNull Builder display2(
+ DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
return new FontStyle.Builder()
.setWeight(FONT_WEIGHT_BOLD)
.setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 44 : 40));
}
/** Font style for small display text. */
- @NonNull
- public static FontStyle.Builder display3(
- @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+ public static FontStyle.@NonNull Builder display3(
+ DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
return new FontStyle.Builder()
.setWeight(FONT_WEIGHT_BOLD)
.setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 34 : 30));
}
/** Font style for large title text. */
- @NonNull
- public static FontStyle.Builder title1(
- @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+ public static FontStyle.@NonNull Builder title1(
+ DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
return new FontStyle.Builder()
.setWeight(FONT_WEIGHT_BOLD)
.setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 26 : 24));
}
/** Font style for medium title text. */
- @NonNull
- public static FontStyle.Builder title2(
- @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+ public static FontStyle.@NonNull Builder title2(
+ DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
return new FontStyle.Builder()
.setWeight(FONT_WEIGHT_BOLD)
.setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 22 : 20));
}
/** Font style for small title text. */
- @NonNull
- public static FontStyle.Builder title3(
- @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+ public static FontStyle.@NonNull Builder title3(
+ DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
return new FontStyle.Builder()
.setWeight(FONT_WEIGHT_BOLD)
.setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 18 : 16));
}
/** Font style for large body text. */
- @NonNull
- public static FontStyle.Builder body1(
- @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+ public static FontStyle.@NonNull Builder body1(
+ DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
return new FontStyle.Builder()
.setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 18 : 16));
}
/** Font style for medium body text. */
- @NonNull
- public static FontStyle.Builder body2(
- @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+ public static FontStyle.@NonNull Builder body2(
+ DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
return new FontStyle.Builder()
.setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 16 : 14));
}
/** Font style for button text. */
- @NonNull
- public static FontStyle.Builder button(
- @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+ public static FontStyle.@NonNull Builder button(
+ DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
return new FontStyle.Builder()
.setWeight(FONT_WEIGHT_BOLD)
.setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 16 : 14));
}
/** Font style for large caption text. */
- @NonNull
- public static FontStyle.Builder caption1(
- @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+ public static FontStyle.@NonNull Builder caption1(
+ DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
return new FontStyle.Builder()
.setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 16 : 14));
}
/** Font style for medium caption text. */
- @NonNull
- public static FontStyle.Builder caption2(
- @NonNull DeviceParametersBuilders.DeviceParameters deviceParameters) {
+ public static FontStyle.@NonNull Builder caption2(
+ DeviceParametersBuilders.@NonNull DeviceParameters deviceParameters) {
return new FontStyle.Builder()
.setSize(DimensionBuilders.sp(isLargeScreen(deviceParameters) ? 14 : 12));
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ModifiersBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ModifiersBuilders.java
index a92e6a1..c697106 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ModifiersBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ModifiersBuilders.java
@@ -20,8 +20,6 @@
import android.annotation.SuppressLint;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.wear.protolayout.expression.Fingerprint;
@@ -29,6 +27,9 @@
import androidx.wear.protolayout.proto.TypesProto;
import androidx.wear.protolayout.protobuf.ByteString;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.util.Arrays;
/**
@@ -46,7 +47,7 @@
*/
public static final class Clickable {
private final ModifiersProto.Clickable mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
Clickable(ModifiersProto.Clickable impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -54,8 +55,7 @@
}
/** Gets the ID associated with this action. Intended for testing purposes only. */
- @NonNull
- public String getId() {
+ public @NonNull String getId() {
return mImpl.getId();
}
@@ -63,8 +63,7 @@
* Gets the action to perform when the element this modifier is attached to is clicked.
* Intended for testing purposes only.
*/
- @Nullable
- public ActionBuilders.Action getOnClick() {
+ public ActionBuilders.@Nullable Action getOnClick() {
if (mImpl.hasOnClick()) {
return ActionBuilders.actionFromProto(mImpl.getOnClick());
} else {
@@ -74,20 +73,17 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static Clickable fromProto(@NonNull ModifiersProto.Clickable proto) {
+ static @NonNull Clickable fromProto(ModifiersProto.@NonNull Clickable proto) {
return new Clickable(proto, null);
}
/** Returns the internal proto instance. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public ModifiersProto.Clickable toProto() {
+ public ModifiersProto.@NonNull Clickable toProto() {
return mImpl;
}
@@ -100,8 +96,7 @@
public Builder() {}
/** Sets the ID associated with this action. */
- @NonNull
- public Builder setId(@NonNull String id) {
+ public @NonNull Builder setId(@NonNull String id) {
mImpl.setId(id);
mFingerprint.recordPropertyUpdate(1, id.hashCode());
return this;
@@ -110,8 +105,7 @@
/**
* Sets the action to perform when the element this modifier is attached to is clicked.
*/
- @NonNull
- public Builder setOnClick(@NonNull ActionBuilders.Action onClick) {
+ public @NonNull Builder setOnClick(ActionBuilders.@NonNull Action onClick) {
mImpl.setOnClick(onClick.toActionProto());
mFingerprint.recordPropertyUpdate(
2, checkNotNull(onClick.getFingerprint()).aggregateValueAsInt());
@@ -119,8 +113,7 @@
}
/** Builds an instance from accumulated values. */
- @NonNull
- public Clickable build() {
+ public @NonNull Clickable build() {
return new Clickable(mImpl.build(), mFingerprint);
}
}
@@ -133,7 +126,7 @@
*/
public static final class Semantics {
private final ModifiersProto.Semantics mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
Semantics(ModifiersProto.Semantics impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -144,25 +137,21 @@
* Gets the content description associated with this element. This will be dictated when the
* element is focused by the screen reader. Intended for testing purposes only.
*/
- @NonNull
- public String getContentDescription() {
+ public @NonNull String getContentDescription() {
return mImpl.getObsoleteContentDescription();
}
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static Semantics fromProto(@NonNull ModifiersProto.Semantics proto) {
+ static @NonNull Semantics fromProto(ModifiersProto.@NonNull Semantics proto) {
return new Semantics(proto, null);
}
- @NonNull
- ModifiersProto.Semantics toProto() {
+ ModifiersProto.@NonNull Semantics toProto() {
return mImpl;
}
@@ -178,18 +167,16 @@
* Sets the content description associated with this element. This will be dictated when
* the element is focused by the screen reader.
*/
- @NonNull
@SuppressWarnings(
"deprecation") // Updating a deprecated field for backward compatibility
- public Builder setContentDescription(@NonNull String contentDescription) {
+ public @NonNull Builder setContentDescription(@NonNull String contentDescription) {
mImpl.setObsoleteContentDescription(contentDescription);
mFingerprint.recordPropertyUpdate(4, contentDescription.hashCode());
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public Semantics build() {
+ public @NonNull Semantics build() {
return new Semantics(mImpl.build(), mFingerprint);
}
}
@@ -198,7 +185,7 @@
/** A modifier to apply padding around an element. */
public static final class Padding {
private final ModifiersProto.Padding mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
Padding(ModifiersProto.Padding impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -209,8 +196,7 @@
* Gets the padding on the end of the content, depending on the layout direction, in DP and
* the value of "rtl_aware". Intended for testing purposes only.
*/
- @Nullable
- public DimensionBuilders.DpProp getEnd() {
+ public DimensionBuilders.@Nullable DpProp getEnd() {
if (mImpl.hasEnd()) {
return DimensionBuilders.DpProp.fromProto(mImpl.getEnd());
} else {
@@ -222,8 +208,7 @@
* Gets the padding on the start of the content, depending on the layout direction, in DP
* and the value of "rtl_aware". Intended for testing purposes only.
*/
- @Nullable
- public DimensionBuilders.DpProp getStart() {
+ public DimensionBuilders.@Nullable DpProp getStart() {
if (mImpl.hasStart()) {
return DimensionBuilders.DpProp.fromProto(mImpl.getStart());
} else {
@@ -232,8 +217,7 @@
}
/** Gets the padding at the top, in DP. Intended for testing purposes only. */
- @Nullable
- public DimensionBuilders.DpProp getTop() {
+ public DimensionBuilders.@Nullable DpProp getTop() {
if (mImpl.hasTop()) {
return DimensionBuilders.DpProp.fromProto(mImpl.getTop());
} else {
@@ -242,8 +226,7 @@
}
/** Gets the padding at the bottom, in DP. Intended for testing purposes only. */
- @Nullable
- public DimensionBuilders.DpProp getBottom() {
+ public DimensionBuilders.@Nullable DpProp getBottom() {
if (mImpl.hasBottom()) {
return DimensionBuilders.DpProp.fromProto(mImpl.getBottom());
} else {
@@ -257,8 +240,7 @@
* of the container if the device is using an RTL locale). If false, start/end will always
* map to left/right, accordingly. Intended for testing purposes only.
*/
- @Nullable
- public TypeBuilders.BoolProp getRtlAware() {
+ public TypeBuilders.@Nullable BoolProp getRtlAware() {
if (mImpl.hasRtlAware()) {
return TypeBuilders.BoolProp.fromProto(mImpl.getRtlAware());
} else {
@@ -268,18 +250,15 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static Padding fromProto(@NonNull ModifiersProto.Padding proto) {
+ static @NonNull Padding fromProto(ModifiersProto.@NonNull Padding proto) {
return new Padding(proto, null);
}
- @NonNull
- ModifiersProto.Padding toProto() {
+ ModifiersProto.@NonNull Padding toProto() {
return mImpl;
}
@@ -295,8 +274,7 @@
* Sets the padding on the end of the content, depending on the layout direction, in DP
* and the value of "rtl_aware".
*/
- @NonNull
- public Builder setEnd(@NonNull DimensionBuilders.DpProp end) {
+ public @NonNull Builder setEnd(DimensionBuilders.@NonNull DpProp end) {
mImpl.setEnd(end.toProto());
mFingerprint.recordPropertyUpdate(
1, checkNotNull(end.getFingerprint()).aggregateValueAsInt());
@@ -307,8 +285,7 @@
* Sets the padding on the start of the content, depending on the layout direction, in
* DP and the value of "rtl_aware".
*/
- @NonNull
- public Builder setStart(@NonNull DimensionBuilders.DpProp start) {
+ public @NonNull Builder setStart(DimensionBuilders.@NonNull DpProp start) {
mImpl.setStart(start.toProto());
mFingerprint.recordPropertyUpdate(
2, checkNotNull(start.getFingerprint()).aggregateValueAsInt());
@@ -316,8 +293,7 @@
}
/** Sets the padding at the top, in DP. */
- @NonNull
- public Builder setTop(@NonNull DimensionBuilders.DpProp top) {
+ public @NonNull Builder setTop(DimensionBuilders.@NonNull DpProp top) {
mImpl.setTop(top.toProto());
mFingerprint.recordPropertyUpdate(
3, checkNotNull(top.getFingerprint()).aggregateValueAsInt());
@@ -325,8 +301,7 @@
}
/** Sets the padding at the bottom, in DP. */
- @NonNull
- public Builder setBottom(@NonNull DimensionBuilders.DpProp bottom) {
+ public @NonNull Builder setBottom(DimensionBuilders.@NonNull DpProp bottom) {
mImpl.setBottom(bottom.toProto());
mFingerprint.recordPropertyUpdate(
4, checkNotNull(bottom.getFingerprint()).aggregateValueAsInt());
@@ -339,8 +314,7 @@
* side of the container if the device is using an RTL locale). If false, start/end will
* always map to left/right, accordingly.
*/
- @NonNull
- public Builder setRtlAware(@NonNull TypeBuilders.BoolProp rtlAware) {
+ public @NonNull Builder setRtlAware(TypeBuilders.@NonNull BoolProp rtlAware) {
mImpl.setRtlAware(rtlAware.toProto());
mFingerprint.recordPropertyUpdate(
5, checkNotNull(rtlAware.getFingerprint()).aggregateValueAsInt());
@@ -354,23 +328,20 @@
* always map to left/right, accordingly.
*/
@SuppressLint("MissingGetterMatchingBuilder")
- @NonNull
- public Builder setRtlAware(boolean rtlAware) {
+ public @NonNull Builder setRtlAware(boolean rtlAware) {
mImpl.setRtlAware(TypesProto.BoolProp.newBuilder().setValue(rtlAware));
mFingerprint.recordPropertyUpdate(5, Boolean.hashCode(rtlAware));
return this;
}
/** Sets the padding for all sides of the content, in DP. */
- @NonNull
@SuppressLint("MissingGetterMatchingBuilder")
- public Builder setAll(@NonNull DimensionBuilders.DpProp value) {
+ public @NonNull Builder setAll(DimensionBuilders.@NonNull DpProp value) {
return setStart(value).setEnd(value).setTop(value).setBottom(value);
}
/** Builds an instance from accumulated values. */
- @NonNull
- public Padding build() {
+ public @NonNull Padding build() {
return new Padding(mImpl.build(), mFingerprint);
}
}
@@ -379,7 +350,7 @@
/** A modifier to apply a border around an element. */
public static final class Border {
private final ModifiersProto.Border mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
Border(ModifiersProto.Border impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -387,8 +358,7 @@
}
/** Gets the width of the border, in DP. Intended for testing purposes only. */
- @Nullable
- public DimensionBuilders.DpProp getWidth() {
+ public DimensionBuilders.@Nullable DpProp getWidth() {
if (mImpl.hasWidth()) {
return DimensionBuilders.DpProp.fromProto(mImpl.getWidth());
} else {
@@ -397,8 +367,7 @@
}
/** Gets the color of the border. Intended for testing purposes only. */
- @Nullable
- public ColorBuilders.ColorProp getColor() {
+ public ColorBuilders.@Nullable ColorProp getColor() {
if (mImpl.hasColor()) {
return ColorBuilders.ColorProp.fromProto(mImpl.getColor());
} else {
@@ -408,18 +377,15 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static Border fromProto(@NonNull ModifiersProto.Border proto) {
+ static @NonNull Border fromProto(ModifiersProto.@NonNull Border proto) {
return new Border(proto, null);
}
- @NonNull
- ModifiersProto.Border toProto() {
+ ModifiersProto.@NonNull Border toProto() {
return mImpl;
}
@@ -431,8 +397,7 @@
public Builder() {}
/** Sets the width of the border, in DP. */
- @NonNull
- public Builder setWidth(@NonNull DimensionBuilders.DpProp width) {
+ public @NonNull Builder setWidth(DimensionBuilders.@NonNull DpProp width) {
mImpl.setWidth(width.toProto());
mFingerprint.recordPropertyUpdate(
1, checkNotNull(width.getFingerprint()).aggregateValueAsInt());
@@ -440,8 +405,7 @@
}
/** Sets the color of the border. */
- @NonNull
- public Builder setColor(@NonNull ColorBuilders.ColorProp color) {
+ public @NonNull Builder setColor(ColorBuilders.@NonNull ColorProp color) {
mImpl.setColor(color.toProto());
mFingerprint.recordPropertyUpdate(
2, checkNotNull(color.getFingerprint()).aggregateValueAsInt());
@@ -449,8 +413,7 @@
}
/** Builds an instance from accumulated values. */
- @NonNull
- public Border build() {
+ public @NonNull Border build() {
return new Border(mImpl.build(), mFingerprint);
}
}
@@ -459,7 +422,7 @@
/** The corner of a {@link androidx.wear.tiles.LayoutElementBuilders.Box} element. */
public static final class Corner {
private final ModifiersProto.Corner mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
Corner(ModifiersProto.Corner impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -467,8 +430,7 @@
}
/** Gets the radius of the corner in DP. Intended for testing purposes only. */
- @Nullable
- public DimensionBuilders.DpProp getRadius() {
+ public DimensionBuilders.@Nullable DpProp getRadius() {
if (mImpl.hasRadius()) {
return DimensionBuilders.DpProp.fromProto(mImpl.getRadius());
} else {
@@ -478,18 +440,15 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static Corner fromProto(@NonNull ModifiersProto.Corner proto) {
+ static @NonNull Corner fromProto(ModifiersProto.@NonNull Corner proto) {
return new Corner(proto, null);
}
- @NonNull
- ModifiersProto.Corner toProto() {
+ ModifiersProto.@NonNull Corner toProto() {
return mImpl;
}
@@ -501,8 +460,7 @@
public Builder() {}
/** Sets the radius of the corner in DP. */
- @NonNull
- public Builder setRadius(@NonNull DimensionBuilders.DpProp radius) {
+ public @NonNull Builder setRadius(DimensionBuilders.@NonNull DpProp radius) {
mImpl.setRadius(radius.toProto());
mFingerprint.recordPropertyUpdate(
1, checkNotNull(radius.getFingerprint()).aggregateValueAsInt());
@@ -510,8 +468,7 @@
}
/** Builds an instance from accumulated values. */
- @NonNull
- public Corner build() {
+ public @NonNull Corner build() {
return new Corner(mImpl.build(), mFingerprint);
}
}
@@ -520,7 +477,7 @@
/** A modifier to apply a background to an element. */
public static final class Background {
private final ModifiersProto.Background mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
Background(ModifiersProto.Background impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -531,8 +488,7 @@
* Gets the background color for this element. If not defined, defaults to being
* transparent. Intended for testing purposes only.
*/
- @Nullable
- public ColorBuilders.ColorProp getColor() {
+ public ColorBuilders.@Nullable ColorProp getColor() {
if (mImpl.hasColor()) {
return ColorBuilders.ColorProp.fromProto(mImpl.getColor());
} else {
@@ -545,8 +501,7 @@
* if it has a background color or border. If not defined, defaults to having a square
* corner. Intended for testing purposes only.
*/
- @Nullable
- public Corner getCorner() {
+ public @Nullable Corner getCorner() {
if (mImpl.hasCorner()) {
return Corner.fromProto(mImpl.getCorner());
} else {
@@ -556,18 +511,15 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static Background fromProto(@NonNull ModifiersProto.Background proto) {
+ static @NonNull Background fromProto(ModifiersProto.@NonNull Background proto) {
return new Background(proto, null);
}
- @NonNull
- ModifiersProto.Background toProto() {
+ ModifiersProto.@NonNull Background toProto() {
return mImpl;
}
@@ -583,8 +535,7 @@
* Sets the background color for this element. If not defined, defaults to being
* transparent.
*/
- @NonNull
- public Builder setColor(@NonNull ColorBuilders.ColorProp color) {
+ public @NonNull Builder setColor(ColorBuilders.@NonNull ColorProp color) {
mImpl.setColor(color.toProto());
mFingerprint.recordPropertyUpdate(
1, checkNotNull(color.getFingerprint()).aggregateValueAsInt());
@@ -596,8 +547,7 @@
* element if it has a background color or border. If not defined, defaults to having a
* square corner.
*/
- @NonNull
- public Builder setCorner(@NonNull Corner corner) {
+ public @NonNull Builder setCorner(@NonNull Corner corner) {
mImpl.setCorner(corner.toProto());
mFingerprint.recordPropertyUpdate(
2, checkNotNull(corner.getFingerprint()).aggregateValueAsInt());
@@ -605,8 +555,7 @@
}
/** Builds an instance from accumulated values. */
- @NonNull
- public Background build() {
+ public @NonNull Background build() {
return new Background(mImpl.build(), mFingerprint);
}
}
@@ -618,7 +567,7 @@
*/
public static final class ElementMetadata {
private final ModifiersProto.ElementMetadata mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
ElementMetadata(ModifiersProto.ElementMetadata impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -629,27 +578,23 @@
* Gets property describing the element with which it is associated. For use by libraries
* building higher-level components only. This can be used to track component metadata.
*/
- @NonNull
- public byte[] getTagData() {
+ public byte @NonNull [] getTagData() {
return mImpl.getTagData().toByteArray();
}
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static ElementMetadata fromProto(@NonNull ModifiersProto.ElementMetadata proto) {
+ static @NonNull ElementMetadata fromProto(ModifiersProto.@NonNull ElementMetadata proto) {
return new ElementMetadata(proto, null);
}
/** Returns the internal proto instance. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public ModifiersProto.ElementMetadata toProto() {
+ public ModifiersProto.@NonNull ElementMetadata toProto() {
return mImpl;
}
@@ -666,16 +611,14 @@
* libraries building higher-level components only. This can be used to track component
* metadata.
*/
- @NonNull
- public Builder setTagData(@NonNull byte[] tagData) {
+ public @NonNull Builder setTagData(byte @NonNull [] tagData) {
mImpl.setTagData(ByteString.copyFrom(tagData));
mFingerprint.recordPropertyUpdate(1, Arrays.hashCode(tagData));
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public ElementMetadata build() {
+ public @NonNull ElementMetadata build() {
return new ElementMetadata(mImpl.build(), mFingerprint);
}
}
@@ -688,7 +631,7 @@
*/
public static final class Modifiers {
private final ModifiersProto.Modifiers mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
Modifiers(ModifiersProto.Modifiers impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -700,8 +643,7 @@
* have actions associated with it, which will be executed when the element is tapped.
* Intended for testing purposes only.
*/
- @Nullable
- public Clickable getClickable() {
+ public @Nullable Clickable getClickable() {
if (mImpl.hasClickable()) {
return Clickable.fromProto(mImpl.getClickable());
} else {
@@ -714,8 +656,7 @@
* modified element (eg. screen reader content descriptions). Intended for testing purposes
* only.
*/
- @Nullable
- public Semantics getSemantics() {
+ public @Nullable Semantics getSemantics() {
if (mImpl.hasSemantics()) {
return Semantics.fromProto(mImpl.getSemantics());
} else {
@@ -724,8 +665,7 @@
}
/** Gets the padding of the modified element. Intended for testing purposes only. */
- @Nullable
- public Padding getPadding() {
+ public @Nullable Padding getPadding() {
if (mImpl.hasPadding()) {
return Padding.fromProto(mImpl.getPadding());
} else {
@@ -734,8 +674,7 @@
}
/** Gets the border of the modified element. Intended for testing purposes only. */
- @Nullable
- public Border getBorder() {
+ public @Nullable Border getBorder() {
if (mImpl.hasBorder()) {
return Border.fromProto(mImpl.getBorder());
} else {
@@ -747,8 +686,7 @@
* Gets the background (with optional corner radius) of the modified element. Intended for
* testing purposes only.
*/
- @Nullable
- public Background getBackground() {
+ public @Nullable Background getBackground() {
if (mImpl.hasBackground()) {
return Background.fromProto(mImpl.getBackground());
} else {
@@ -760,8 +698,7 @@
* Gets metadata about an element. For use by libraries building higher-level components
* only. This can be used to track component metadata.
*/
- @Nullable
- public ElementMetadata getMetadata() {
+ public @Nullable ElementMetadata getMetadata() {
if (mImpl.hasMetadata()) {
return ElementMetadata.fromProto(mImpl.getMetadata());
} else {
@@ -771,16 +708,14 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
/** Creates a new wrapper instance from the proto. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static Modifiers fromProto(
- @NonNull ModifiersProto.Modifiers proto, @Nullable Fingerprint fingerprint) {
+ public static @NonNull Modifiers fromProto(
+ ModifiersProto.@NonNull Modifiers proto, @Nullable Fingerprint fingerprint) {
return new Modifiers(proto, fingerprint);
}
@@ -789,15 +724,13 @@
* object created using this method can't be added to any other wrapper.
*/
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static Modifiers fromProto(@NonNull ModifiersProto.Modifiers proto) {
+ public static @NonNull Modifiers fromProto(ModifiersProto.@NonNull Modifiers proto) {
return fromProto(proto, null);
}
/** Returns the internal proto instance. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public ModifiersProto.Modifiers toProto() {
+ public ModifiersProto.@NonNull Modifiers toProto() {
return mImpl;
}
@@ -813,8 +746,7 @@
* Sets the clickable property of the modified element. It allows its wrapped element to
* have actions associated with it, which will be executed when the element is tapped.
*/
- @NonNull
- public Builder setClickable(@NonNull Clickable clickable) {
+ public @NonNull Builder setClickable(@NonNull Clickable clickable) {
mImpl.setClickable(clickable.toProto());
mFingerprint.recordPropertyUpdate(
1, checkNotNull(clickable.getFingerprint()).aggregateValueAsInt());
@@ -825,8 +757,7 @@
* Sets the semantics of the modified element. This can be used to add metadata to the
* modified element (eg. screen reader content descriptions).
*/
- @NonNull
- public Builder setSemantics(@NonNull Semantics semantics) {
+ public @NonNull Builder setSemantics(@NonNull Semantics semantics) {
mImpl.setSemantics(semantics.toProto());
mFingerprint.recordPropertyUpdate(
2, checkNotNull(semantics.getFingerprint()).aggregateValueAsInt());
@@ -834,8 +765,7 @@
}
/** Sets the padding of the modified element. */
- @NonNull
- public Builder setPadding(@NonNull Padding padding) {
+ public @NonNull Builder setPadding(@NonNull Padding padding) {
mImpl.setPadding(padding.toProto());
mFingerprint.recordPropertyUpdate(
3, checkNotNull(padding.getFingerprint()).aggregateValueAsInt());
@@ -843,8 +773,7 @@
}
/** Sets the border of the modified element. */
- @NonNull
- public Builder setBorder(@NonNull Border border) {
+ public @NonNull Builder setBorder(@NonNull Border border) {
mImpl.setBorder(border.toProto());
mFingerprint.recordPropertyUpdate(
4, checkNotNull(border.getFingerprint()).aggregateValueAsInt());
@@ -852,8 +781,7 @@
}
/** Sets the background (with optional corner radius) of the modified element. */
- @NonNull
- public Builder setBackground(@NonNull Background background) {
+ public @NonNull Builder setBackground(@NonNull Background background) {
mImpl.setBackground(background.toProto());
mFingerprint.recordPropertyUpdate(
5, checkNotNull(background.getFingerprint()).aggregateValueAsInt());
@@ -864,8 +792,7 @@
* Sets metadata about an element. For use by libraries building higher-level components
* only. This can be used to track component metadata.
*/
- @NonNull
- public Builder setMetadata(@NonNull ElementMetadata metadata) {
+ public @NonNull Builder setMetadata(@NonNull ElementMetadata metadata) {
mImpl.setMetadata(metadata.toProto());
mFingerprint.recordPropertyUpdate(
6, checkNotNull(metadata.getFingerprint()).aggregateValueAsInt());
@@ -873,8 +800,7 @@
}
/** Builds an instance from accumulated values. */
- @NonNull
- public Modifiers build() {
+ public @NonNull Modifiers build() {
return new Modifiers(mImpl.build(), mFingerprint);
}
}
@@ -886,7 +812,7 @@
*/
public static final class ArcModifiers {
private final ModifiersProto.ArcModifiers mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
ArcModifiers(ModifiersProto.ArcModifiers impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -897,8 +823,7 @@
* Gets allows its wrapped element to have actions associated with it, which will be
* executed when the element is tapped. Intended for testing purposes only.
*/
- @Nullable
- public Clickable getClickable() {
+ public @Nullable Clickable getClickable() {
if (mImpl.hasClickable()) {
return Clickable.fromProto(mImpl.getClickable());
} else {
@@ -910,8 +835,7 @@
* Gets adds metadata for the modified element, for example, screen reader content
* descriptions. Intended for testing purposes only.
*/
- @Nullable
- public Semantics getSemantics() {
+ public @Nullable Semantics getSemantics() {
if (mImpl.hasSemantics()) {
return Semantics.fromProto(mImpl.getSemantics());
} else {
@@ -921,20 +845,17 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static ArcModifiers fromProto(@NonNull ModifiersProto.ArcModifiers proto) {
+ static @NonNull ArcModifiers fromProto(ModifiersProto.@NonNull ArcModifiers proto) {
return new ArcModifiers(proto, null);
}
/** Returns the internal proto instance. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public ModifiersProto.ArcModifiers toProto() {
+ public ModifiersProto.@NonNull ArcModifiers toProto() {
return mImpl;
}
@@ -950,8 +871,7 @@
* Sets allows its wrapped element to have actions associated with it, which will be
* executed when the element is tapped.
*/
- @NonNull
- public Builder setClickable(@NonNull Clickable clickable) {
+ public @NonNull Builder setClickable(@NonNull Clickable clickable) {
mImpl.setClickable(clickable.toProto());
mFingerprint.recordPropertyUpdate(
1, checkNotNull(clickable.getFingerprint()).aggregateValueAsInt());
@@ -962,8 +882,7 @@
* Sets adds metadata for the modified element, for example, screen reader content
* descriptions.
*/
- @NonNull
- public Builder setSemantics(@NonNull Semantics semantics) {
+ public @NonNull Builder setSemantics(@NonNull Semantics semantics) {
mImpl.setSemantics(semantics.toProto());
mFingerprint.recordPropertyUpdate(
2, checkNotNull(semantics.getFingerprint()).aggregateValueAsInt());
@@ -971,8 +890,7 @@
}
/** Builds an instance from accumulated values. */
- @NonNull
- public ArcModifiers build() {
+ public @NonNull ArcModifiers build() {
return new ArcModifiers(mImpl.build(), mFingerprint);
}
}
@@ -985,7 +903,7 @@
*/
public static final class SpanModifiers {
private final ModifiersProto.SpanModifiers mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
SpanModifiers(ModifiersProto.SpanModifiers impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -996,8 +914,7 @@
* Gets allows its wrapped element to have actions associated with it, which will be
* executed when the element is tapped. Intended for testing purposes only.
*/
- @Nullable
- public Clickable getClickable() {
+ public @Nullable Clickable getClickable() {
if (mImpl.hasClickable()) {
return Clickable.fromProto(mImpl.getClickable());
} else {
@@ -1007,20 +924,17 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static SpanModifiers fromProto(@NonNull ModifiersProto.SpanModifiers proto) {
+ static @NonNull SpanModifiers fromProto(ModifiersProto.@NonNull SpanModifiers proto) {
return new SpanModifiers(proto, null);
}
/** Returns the internal proto instance. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public ModifiersProto.SpanModifiers toProto() {
+ public ModifiersProto.@NonNull SpanModifiers toProto() {
return mImpl;
}
@@ -1036,8 +950,7 @@
* Sets allows its wrapped element to have actions associated with it, which will be
* executed when the element is tapped.
*/
- @NonNull
- public Builder setClickable(@NonNull Clickable clickable) {
+ public @NonNull Builder setClickable(@NonNull Clickable clickable) {
mImpl.setClickable(clickable.toProto());
mFingerprint.recordPropertyUpdate(
1, checkNotNull(clickable.getFingerprint()).aggregateValueAsInt());
@@ -1045,8 +958,7 @@
}
/** Builds an instance from accumulated values. */
- @NonNull
- public SpanModifiers build() {
+ public @NonNull SpanModifiers build() {
return new SpanModifiers(mImpl.build(), mFingerprint);
}
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ProtoParcelable.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ProtoParcelable.java
index 04413bd..0b0acd8 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ProtoParcelable.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ProtoParcelable.java
@@ -20,9 +20,10 @@
import android.os.Parcel;
import android.os.Parcelable;
-import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
+import org.jspecify.annotations.NonNull;
+
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.function.BiFunction;
@@ -57,14 +58,13 @@
};
}
- protected ProtoParcelable(@NonNull byte[] contents, int version) {
+ protected ProtoParcelable(byte @NonNull [] contents, int version) {
this.mContents = contents;
this.mVersion = version;
}
/** Get the payload contained within this ProtoParcelable. */
- @NonNull
- public byte[] getContents() {
+ public byte @NonNull [] getContents() {
return mContents;
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/RequestBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/RequestBuilders.java
index b12b8ff2..708bf5a 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/RequestBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/RequestBuilders.java
@@ -16,8 +16,6 @@
package androidx.wear.tiles;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters;
@@ -27,6 +25,9 @@
import androidx.wear.protolayout.proto.StateProto;
import androidx.wear.tiles.proto.RequestProto;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.util.List;
/** Builders for request messages used to fetch tiles and resources. */
@@ -50,8 +51,7 @@
* object describing the device requesting the tile update. If not set, a default empty
* instance is used.
*/
- @NonNull
- public DeviceParameters getDeviceConfiguration() {
+ public @NonNull DeviceParameters getDeviceConfiguration() {
if (mImpl.hasDeviceConfiguration()) {
return DeviceParameters.fromProto(mImpl.getDeviceConfiguration());
} else {
@@ -64,8 +64,7 @@
* Gets the {@link androidx.wear.protolayout.StateBuilders.State} that should be used when
* building the tile.
*/
- @NonNull
- public State getCurrentState() {
+ public @NonNull State getCurrentState() {
if (mImpl.hasCurrentState()) {
return State.fromProto(mImpl.getCurrentState());
} else {
@@ -89,9 +88,9 @@
* @deprecated Use {@link #getDeviceConfiguration()} instead.
*/
@Deprecated
- @Nullable
@SuppressWarnings("deprecation") // for backward compatibility
- public androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters getDeviceParameters() {
+ public androidx.wear.tiles.DeviceParametersBuilders.@Nullable DeviceParameters
+ getDeviceParameters() {
if (mImpl.hasDeviceConfiguration()) {
return androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters.fromProto(
mImpl.getDeviceConfiguration());
@@ -107,9 +106,8 @@
* @deprecated Use {@link #getCurrentState()} instead.
*/
@Deprecated
- @Nullable
@SuppressWarnings("deprecation") // for backward compatibility
- public androidx.wear.tiles.StateBuilders.State getState() {
+ public androidx.wear.tiles.StateBuilders.@Nullable State getState() {
if (mImpl.hasCurrentState()) {
return androidx.wear.tiles.StateBuilders.State.fromProto(mImpl.getCurrentState());
} else {
@@ -119,21 +117,18 @@
/** Creates a new wrapper instance from the proto. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static TileRequest fromProto(@NonNull RequestProto.TileRequest proto) {
+ public static @NonNull TileRequest fromProto(RequestProto.@NonNull TileRequest proto) {
return new TileRequest(proto);
}
/** Returns the internal proto instance. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public RequestProto.TileRequest toProto() {
+ public RequestProto.@NonNull TileRequest toProto() {
return mImpl;
}
@Override
- @NonNull
- public String toString() {
+ public @NonNull String toString() {
return "TileRequest{"
+ "deviceConfiguration="
+ getDeviceConfiguration()
@@ -159,8 +154,8 @@
* instance is used.
*/
@RequiresSchemaVersion(major = 1, minor = 0)
- @NonNull
- public Builder setDeviceConfiguration(@NonNull DeviceParameters deviceConfiguration) {
+ public @NonNull Builder setDeviceConfiguration(
+ @NonNull DeviceParameters deviceConfiguration) {
mImpl.setDeviceConfiguration(deviceConfiguration.toProto());
return this;
}
@@ -170,16 +165,14 @@
* when building the tile.
*/
@RequiresSchemaVersion(major = 1, minor = 0)
- @NonNull
- public Builder setCurrentState(@NonNull State currentState) {
+ public @NonNull Builder setCurrentState(@NonNull State currentState) {
mImpl.setCurrentState(currentState.toProto());
return this;
}
/** Sets the ID of the tile being requested. */
@RequiresSchemaVersion(major = 1, minor = 0)
- @NonNull
- public Builder setTileId(int tileId) {
+ public @NonNull Builder setTileId(int tileId) {
mImpl.setTileId(tileId);
return this;
}
@@ -191,10 +184,8 @@
* @deprecated Use {@link setDeviceConfiguration(DeviceParameters)} instead.
*/
@Deprecated
- @NonNull
- public Builder setDeviceParameters(
- @NonNull
- androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
+ public @NonNull Builder setDeviceParameters(
+ androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
deviceParameters) {
mImpl.setDeviceConfiguration(deviceParameters.toProto());
return this;
@@ -207,15 +198,14 @@
* @deprecated Use {@link setCurrentState(State)} instead.
*/
@Deprecated
- @NonNull
- public Builder setState(@NonNull androidx.wear.tiles.StateBuilders.State state) {
+ public @NonNull Builder setState(
+ androidx.wear.tiles.StateBuilders.@NonNull State state) {
mImpl.setCurrentState(state.toProto());
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public TileRequest build() {
+ public @NonNull TileRequest build() {
return TileRequest.fromProto(mImpl.build());
}
}
@@ -237,8 +227,7 @@
* Gets the version of the resources being fetched. This is the same as the requested
* resource version, passed in {@link androidx.wear.tiles.TileBuilders.Tile}.
*/
- @NonNull
- public String getVersion() {
+ public @NonNull String getVersion() {
return mImpl.getVersion();
}
@@ -251,8 +240,7 @@
* in {@link androidx.wear.protolayout.ResourceBuilders.Resources}.idToImage), not Android
* resource names or similar.
*/
- @NonNull
- public List<String> getResourceIds() {
+ public @NonNull List<String> getResourceIds() {
return mImpl.getResourceIdsList();
}
@@ -260,8 +248,7 @@
* Gets the {@link androidx.wear.protolayout.DeviceParametersBuilders.DeviceParameters}
* object describing the device requesting the resources.
*/
- @NonNull
- public DeviceParameters getDeviceConfiguration() {
+ public @NonNull DeviceParameters getDeviceConfiguration() {
if (mImpl.hasDeviceConfiguration()) {
return DeviceParameters.fromProto(mImpl.getDeviceConfiguration());
} else {
@@ -286,9 +273,9 @@
* @deprecated Use {@link #getDeviceConfiguration()} instead.
*/
@Deprecated
- @Nullable
@SuppressWarnings("deprecation") // for backward compatibility
- public androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters getDeviceParameters() {
+ public androidx.wear.tiles.DeviceParametersBuilders.@Nullable DeviceParameters
+ getDeviceParameters() {
if (mImpl.hasDeviceConfiguration()) {
return androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters.fromProto(
mImpl.getDeviceConfiguration());
@@ -299,21 +286,19 @@
/** Creates a new wrapper instance from the proto. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static ResourcesRequest fromProto(@NonNull RequestProto.ResourcesRequest proto) {
+ public static @NonNull ResourcesRequest fromProto(
+ RequestProto.@NonNull ResourcesRequest proto) {
return new ResourcesRequest(proto);
}
/** Returns the internal proto instance. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public RequestProto.ResourcesRequest toProto() {
+ public RequestProto.@NonNull ResourcesRequest toProto() {
return mImpl;
}
@Override
- @NonNull
- public String toString() {
+ public @NonNull String toString() {
return "ResourcesRequest{"
+ "version="
+ getVersion()
@@ -340,8 +325,7 @@
* resource version, passed in {@link androidx.wear.tiles.TileBuilders.Tile}.
*/
@RequiresSchemaVersion(major = 1, minor = 0)
- @NonNull
- public Builder setVersion(@NonNull String version) {
+ public @NonNull Builder setVersion(@NonNull String version) {
mImpl.setVersion(version);
return this;
}
@@ -357,8 +341,7 @@
* Android resource names or similar.
*/
@RequiresSchemaVersion(major = 1, minor = 0)
- @NonNull
- public Builder addResourceId(@NonNull String resourceId) {
+ public @NonNull Builder addResourceId(@NonNull String resourceId) {
mImpl.addResourceIds(resourceId);
return this;
}
@@ -368,16 +351,15 @@
* object describing the device requesting the resources.
*/
@RequiresSchemaVersion(major = 1, minor = 0)
- @NonNull
- public Builder setDeviceConfiguration(@NonNull DeviceParameters deviceConfiguration) {
+ public @NonNull Builder setDeviceConfiguration(
+ @NonNull DeviceParameters deviceConfiguration) {
mImpl.setDeviceConfiguration(deviceConfiguration.toProto());
return this;
}
/** Sets the ID of the tile for which resources are being requested. */
@RequiresSchemaVersion(major = 1, minor = 0)
- @NonNull
- public Builder setTileId(int tileId) {
+ public @NonNull Builder setTileId(int tileId) {
mImpl.setTileId(tileId);
return this;
}
@@ -389,19 +371,16 @@
* @deprecated Use {@link setDeviceConfiguration(DeviceParameters)} instead.
*/
@Deprecated
- @NonNull
@SuppressWarnings("deprecation") // for backward compatibility
- public Builder setDeviceParameters(
- @NonNull
- androidx.wear.tiles.DeviceParametersBuilders.DeviceParameters
+ public @NonNull Builder setDeviceParameters(
+ androidx.wear.tiles.DeviceParametersBuilders.@NonNull DeviceParameters
deviceParameters) {
mImpl.setDeviceConfiguration(deviceParameters.toProto());
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public ResourcesRequest build() {
+ public @NonNull ResourcesRequest build() {
return ResourcesRequest.fromProto(mImpl.build());
}
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourceBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourceBuilders.java
index 8979d32..846cf7d 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourceBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourceBuilders.java
@@ -23,14 +23,15 @@
import androidx.annotation.Dimension;
import androidx.annotation.DrawableRes;
import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.wear.protolayout.proto.ResourceProto;
import androidx.wear.protolayout.protobuf.ByteString;
import androidx.wear.protolayout.protobuf.InvalidProtocolBufferException;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Collections;
@@ -79,14 +80,12 @@
return mImpl.getResourceId();
}
- @NonNull
- static AndroidImageResourceByResId fromProto(
- @NonNull ResourceProto.AndroidImageResourceByResId proto) {
+ static @NonNull AndroidImageResourceByResId fromProto(
+ ResourceProto.@NonNull AndroidImageResourceByResId proto) {
return new AndroidImageResourceByResId(proto);
}
- @NonNull
- ResourceProto.AndroidImageResourceByResId toProto() {
+ ResourceProto.@NonNull AndroidImageResourceByResId toProto() {
return mImpl;
}
@@ -101,15 +100,13 @@
* Sets the Android resource ID of this image. This must refer to a drawable under
* R.drawable.
*/
- @NonNull
- public Builder setResourceId(@DrawableRes int resourceId) {
+ public @NonNull Builder setResourceId(@DrawableRes int resourceId) {
mImpl.setResourceId(resourceId);
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public AndroidImageResourceByResId build() {
+ public @NonNull AndroidImageResourceByResId build() {
return AndroidImageResourceByResId.fromProto(mImpl.build());
}
}
@@ -127,8 +124,7 @@
}
/** Gets the byte array representing the image. Intended for testing purposes only. */
- @NonNull
- public byte[] getData() {
+ public byte @NonNull [] getData() {
return mImpl.getData().toByteArray();
}
@@ -163,13 +159,12 @@
return mImpl.getFormat().getNumber();
}
- @NonNull
- static InlineImageResource fromProto(@NonNull ResourceProto.InlineImageResource proto) {
+ static @NonNull InlineImageResource fromProto(
+ ResourceProto.@NonNull InlineImageResource proto) {
return new InlineImageResource(proto);
}
- @NonNull
- ResourceProto.InlineImageResource toProto() {
+ ResourceProto.@NonNull InlineImageResource toProto() {
return mImpl;
}
@@ -181,8 +176,7 @@
public Builder() {}
/** Sets the byte array representing the image. */
- @NonNull
- public Builder setData(@NonNull byte[] data) {
+ public @NonNull Builder setData(byte @NonNull [] data) {
mImpl.setData(ByteString.copyFrom(data));
return this;
}
@@ -191,8 +185,7 @@
* Sets the native width of the image, in pixels. Only required for formats (e.g.
* IMAGE_FORMAT_RGB_565) where the image data does not include size.
*/
- @NonNull
- public Builder setWidthPx(@Dimension(unit = PX) int widthPx) {
+ public @NonNull Builder setWidthPx(@Dimension(unit = PX) int widthPx) {
mImpl.setWidthPx(widthPx);
return this;
}
@@ -201,8 +194,7 @@
* Sets the native height of the image, in pixels. Only required for formats (e.g.
* IMAGE_FORMAT_RGB_565) where the image data does not include size.
*/
- @NonNull
- public Builder setHeightPx(@Dimension(unit = PX) int heightPx) {
+ public @NonNull Builder setHeightPx(@Dimension(unit = PX) int heightPx) {
mImpl.setHeightPx(heightPx);
return this;
}
@@ -213,15 +205,13 @@
* to extract this from the raw image data. If the platform does not support the format,
* the image will not be decoded or displayed.
*/
- @NonNull
- public Builder setFormat(@ImageFormat int format) {
+ public @NonNull Builder setFormat(@ImageFormat int format) {
mImpl.setFormat(ResourceProto.ImageFormat.forNumber(format));
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public InlineImageResource build() {
+ public @NonNull InlineImageResource build() {
return InlineImageResource.fromProto(mImpl.build());
}
}
@@ -242,8 +232,7 @@
* Gets an image resource that maps to an Android drawable by resource ID. Intended for
* testing purposes only.
*/
- @Nullable
- public AndroidImageResourceByResId getAndroidResourceByResId() {
+ public @Nullable AndroidImageResourceByResId getAndroidResourceByResId() {
if (mImpl.hasAndroidResourceByResId()) {
return AndroidImageResourceByResId.fromProto(mImpl.getAndroidResourceByResId());
} else {
@@ -255,8 +244,7 @@
* Gets an image resource that contains the image data inline. Intended for testing purposes
* only.
*/
- @Nullable
- public InlineImageResource getInlineResource() {
+ public @Nullable InlineImageResource getInlineResource() {
if (mImpl.hasInlineResource()) {
return InlineImageResource.fromProto(mImpl.getInlineResource());
} else {
@@ -264,13 +252,11 @@
}
}
- @NonNull
- static ImageResource fromProto(@NonNull ResourceProto.ImageResource proto) {
+ static @NonNull ImageResource fromProto(ResourceProto.@NonNull ImageResource proto) {
return new ImageResource(proto);
}
- @NonNull
- ResourceProto.ImageResource toProto() {
+ ResourceProto.@NonNull ImageResource toProto() {
return mImpl;
}
@@ -282,23 +268,20 @@
public Builder() {}
/** Sets an image resource that maps to an Android drawable by resource ID. */
- @NonNull
- public Builder setAndroidResourceByResId(
+ public @NonNull Builder setAndroidResourceByResId(
@NonNull AndroidImageResourceByResId androidResourceByResId) {
mImpl.setAndroidResourceByResId(androidResourceByResId.toProto());
return this;
}
/** Sets an image resource that contains the image data inline. */
- @NonNull
- public Builder setInlineResource(@NonNull InlineImageResource inlineResource) {
+ public @NonNull Builder setInlineResource(@NonNull InlineImageResource inlineResource) {
mImpl.setInlineResource(inlineResource.toProto());
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public ImageResource build() {
+ public @NonNull ImageResource build() {
return ImageResource.fromProto(mImpl.build());
}
}
@@ -324,8 +307,7 @@
* androidx.wear.tiles.RequestBuilders.ResourcesRequest} which triggered this request.
* Intended for testing purposes only.
*/
- @NonNull
- public String getVersion() {
+ public @NonNull String getVersion() {
return mImpl.getVersion();
}
@@ -333,8 +315,7 @@
* Gets a map of resource_ids to images, which can be used by layouts. Intended for testing
* purposes only.
*/
- @NonNull
- public Map<String, ImageResource> getIdToImageMapping() {
+ public @NonNull Map<String, ImageResource> getIdToImageMapping() {
Map<String, ImageResource> map = new HashMap<>();
for (Entry<String, ResourceProto.ImageResource> entry :
mImpl.getIdToImageMap().entrySet()) {
@@ -344,17 +325,15 @@
}
/** Converts to byte array representation. */
- @NonNull
@TilesExperimental
- public byte[] toByteArray() {
+ public byte @NonNull [] toByteArray() {
return mImpl.toByteArray();
}
/** Converts from byte array representation. */
@SuppressWarnings("ProtoParseWithRegistry")
- @Nullable
@TilesExperimental
- public static Resources fromByteArray(@NonNull byte[] byteArray) {
+ public static @Nullable Resources fromByteArray(byte @NonNull [] byteArray) {
try {
return fromProto(ResourceProto.Resources.parseFrom(byteArray));
} catch (InvalidProtocolBufferException e) {
@@ -363,15 +342,13 @@
}
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static Resources fromProto(@NonNull ResourceProto.Resources proto) {
+ public static @NonNull Resources fromProto(ResourceProto.@NonNull Resources proto) {
return new Resources(proto);
}
/** Returns the internal proto instance. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public ResourceProto.Resources toProto() {
+ public ResourceProto.@NonNull Resources toProto() {
return mImpl;
}
@@ -393,23 +370,21 @@
* tile to render successfully, and must match the resource version specified in {@link
* androidx.wear.tiles.RequestBuilders.ResourcesRequest} which triggered this request.
*/
- @NonNull
- public Builder setVersion(@NonNull String version) {
+ public @NonNull Builder setVersion(@NonNull String version) {
mImpl.setVersion(version);
return this;
}
/** Adds an entry into a map of resource_ids to images, which can be used by layouts. */
@SuppressLint("MissingGetterMatchingBuilder")
- @NonNull
- public Builder addIdToImageMapping(@NonNull String id, @NonNull ImageResource image) {
+ public @NonNull Builder addIdToImageMapping(@NonNull String id,
+ @NonNull ImageResource image) {
mImpl.putIdToImage(id, image.toProto());
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public Resources build() {
+ public @NonNull Resources build() {
return Resources.fromProto(mImpl.build());
}
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesData.java
index d103204..98839a0 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesData.java
@@ -16,9 +16,10 @@
package androidx.wear.tiles;
-import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
+import org.jspecify.annotations.NonNull;
+
/**
* Holder for Tiles' Resources class, to be parceled and transferred to Wear.
*
@@ -31,7 +32,7 @@
public static final Creator<ResourcesData> CREATOR =
newCreator(ResourcesData.class, ResourcesData::new);
- public ResourcesData(@NonNull byte[] payload, int version) {
+ public ResourcesData(byte @NonNull [] payload, int version) {
super(payload, version);
}
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesRequestData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesRequestData.java
index c314400..665d180 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesRequestData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ResourcesRequestData.java
@@ -16,9 +16,10 @@
package androidx.wear.tiles;
-import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
+import org.jspecify.annotations.NonNull;
+
/**
* Holder for Tiles' ResourceRequest class, to be parceled and transferred to a Tile Service.
*
@@ -30,7 +31,7 @@
public static final Creator<ResourcesRequestData> CREATOR =
newCreator(ResourcesRequestData.class, ResourcesRequestData::new);
- public ResourcesRequestData(@NonNull byte[] params, int version) {
+ public ResourcesRequestData(byte @NonNull [] params, int version) {
super(params, version);
}
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/StateBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/StateBuilders.java
index 3798263..48fa917 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/StateBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/StateBuilders.java
@@ -16,13 +16,14 @@
package androidx.wear.tiles;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.wear.protolayout.expression.Fingerprint;
import androidx.wear.protolayout.proto.StateProto;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
/**
* Builders for state of a tile.
*
@@ -35,7 +36,7 @@
/** {@link State} information. */
public static final class State {
private final StateProto.State mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
State(StateProto.State impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -43,27 +44,23 @@
}
/** Gets the ID of the clickable that was last clicked. */
- @NonNull
- public String getLastClickableId() {
+ public @NonNull String getLastClickableId() {
return mImpl.getLastClickableId();
}
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static State fromProto(@NonNull StateProto.State proto) {
+ public static @NonNull State fromProto(StateProto.@NonNull State proto) {
return new State(proto, null);
}
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public StateProto.State toProto() {
+ public StateProto.@NonNull State toProto() {
return mImpl;
}
@@ -75,8 +72,7 @@
public Builder() {}
/** Builds an instance from accumulated values. */
- @NonNull
- public State build() {
+ public @NonNull State build() {
return new State(mImpl.build(), mFingerprint);
}
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/SysUiTileUpdateRequester.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/SysUiTileUpdateRequester.java
index b2f3ab5..c24a580 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/SysUiTileUpdateRequester.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/SysUiTileUpdateRequester.java
@@ -35,8 +35,9 @@
import android.util.Log;
import androidx.annotation.GuardedBy;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
+
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
import java.util.ArrayList;
import java.util.HashSet;
@@ -128,8 +129,7 @@
}
}
- @Nullable
- private Intent buildUpdateBindIntent() {
+ private @Nullable Intent buildUpdateBindIntent() {
Intent bindIntent = new Intent(ACTION_BIND_UPDATE_REQUESTER);
bindIntent.setPackage(getSysUiPackageName());
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileAddEventData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileAddEventData.java
index 517a473..220c401 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileAddEventData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileAddEventData.java
@@ -16,9 +16,10 @@
package androidx.wear.tiles;
-import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
+import org.jspecify.annotations.NonNull;
+
/**
* Holder for Tiles' TileAddEvent class, to be parceled and transferred to a Tile Service.
*
@@ -30,7 +31,7 @@
public static final Creator<TileAddEventData> CREATOR =
newCreator(TileAddEventData.class, TileAddEventData::new);
- public TileAddEventData(@NonNull byte[] params, int version) {
+ public TileAddEventData(byte @NonNull [] params, int version) {
super(params, version);
}
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileBuilders.java
index bf1dcec..d8607e9 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileBuilders.java
@@ -16,8 +16,6 @@
package androidx.wear.tiles;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.wear.protolayout.StateBuilders.State;
@@ -26,6 +24,9 @@
import androidx.wear.protolayout.expression.proto.VersionProto.VersionInfo;
import androidx.wear.tiles.proto.TileProto;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
/** Builders for the components of a tile that can be rendered by a tile renderer. */
public final class TileBuilders {
private TileBuilders() {}
@@ -48,8 +49,7 @@
* androidx.wear.tiles.RequestBuilders.ResourcesRequest} if the system does not have a copy
* of the specified resource version.
*/
- @NonNull
- public String getResourcesVersion() {
+ public @NonNull String getResourcesVersion() {
return mImpl.getResourcesVersion();
}
@@ -57,8 +57,7 @@
* Gets the {@link androidx.wear.protolayout.TimelineBuilders.Timeline} containing the
* layouts for the tiles to show in the carousel, along with their validity periods.
*/
- @Nullable
- public Timeline getTileTimeline() {
+ public @Nullable Timeline getTileTimeline() {
if (mImpl.hasTileTimeline()) {
return Timeline.fromProto(mImpl.getTileTimeline());
} else {
@@ -84,8 +83,7 @@
}
/** Gets {@link androidx.wear.protolayout.StateBuilders.State} for this tile. */
- @Nullable
- public State getState() {
+ public @Nullable State getState() {
if (mImpl.hasState()) {
return State.fromProto(mImpl.getState());
} else {
@@ -100,9 +98,8 @@
* @deprecated Use {@link #getTileTimeline()} instead.
*/
@Deprecated
- @Nullable
@SuppressWarnings("deprecation") // for backward compatibility
- public androidx.wear.tiles.TimelineBuilders.Timeline getTimeline() {
+ public androidx.wear.tiles.TimelineBuilders.@Nullable Timeline getTimeline() {
if (mImpl.hasTileTimeline()) {
return androidx.wear.tiles.TimelineBuilders.Timeline.fromProto(
mImpl.getTileTimeline());
@@ -113,21 +110,18 @@
/** Creates a new wrapper instance from the proto. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static Tile fromProto(@NonNull TileProto.Tile proto) {
+ public static @NonNull Tile fromProto(TileProto.@NonNull Tile proto) {
return new Tile(proto);
}
/** Returns the internal proto instance. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public TileProto.Tile toProto() {
+ public TileProto.@NonNull Tile toProto() {
return mImpl;
}
@Override
- @NonNull
- public String toString() {
+ public @NonNull String toString() {
return "Tile{"
+ "resourcesVersion="
+ getResourcesVersion()
@@ -155,8 +149,7 @@
* copy of the specified resource version.
*/
@RequiresSchemaVersion(major = 1, minor = 0)
- @NonNull
- public Builder setResourcesVersion(@NonNull String resourcesVersion) {
+ public @NonNull Builder setResourcesVersion(@NonNull String resourcesVersion) {
mImpl.setResourcesVersion(resourcesVersion);
return this;
}
@@ -166,8 +159,7 @@
* layouts for the tiles to show in the carousel, along with their validity periods.
*/
@RequiresSchemaVersion(major = 1, minor = 0)
- @NonNull
- public Builder setTileTimeline(@NonNull Timeline tileTimeline) {
+ public @NonNull Builder setTileTimeline(@NonNull Timeline tileTimeline) {
mImpl.setTileTimeline(tileTimeline.toProto());
return this;
}
@@ -186,16 +178,14 @@
* due to system-level optimizations.
*/
@RequiresSchemaVersion(major = 1, minor = 0)
- @NonNull
- public Builder setFreshnessIntervalMillis(long freshnessIntervalMillis) {
+ public @NonNull Builder setFreshnessIntervalMillis(long freshnessIntervalMillis) {
mImpl.setFreshnessIntervalMillis(freshnessIntervalMillis);
return this;
}
/** Sets {@link androidx.wear.protolayout.StateBuilders.State} for this tile. */
@RequiresSchemaVersion(major = 1, minor = 200)
- @NonNull
- public Builder setState(@NonNull State state) {
+ public @NonNull Builder setState(@NonNull State state) {
mImpl.setState(state.toProto());
return this;
}
@@ -207,16 +197,14 @@
* @deprecated Use {@link #setTileTimeline(Timeline)} instead.
*/
@Deprecated
- @NonNull
- public Builder setTimeline(
- @NonNull androidx.wear.tiles.TimelineBuilders.Timeline timeline) {
+ public @NonNull Builder setTimeline(
+ androidx.wear.tiles.TimelineBuilders.@NonNull Timeline timeline) {
mImpl.setTileTimeline(timeline.toProto());
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public Tile build() {
+ public @NonNull Tile build() {
return Tile.fromProto(mImpl.build());
}
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileData.java
index d6dbca0..beb1a7d 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileData.java
@@ -16,9 +16,10 @@
package androidx.wear.tiles;
-import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
+import org.jspecify.annotations.NonNull;
+
/**
* Holder for Tiles' Tile class, to be parceled and transferred to Wear.
*
@@ -29,7 +30,7 @@
public static final int VERSION_PROTOBUF = 1;
public static final Creator<TileData> CREATOR = newCreator(TileData.class, TileData::new);
- public TileData(@NonNull byte[] tile, int version) {
+ public TileData(byte @NonNull [] tile, int version) {
super(tile, version);
}
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileEnterEventData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileEnterEventData.java
index 052dd79..f2cba65 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileEnterEventData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileEnterEventData.java
@@ -16,9 +16,10 @@
package androidx.wear.tiles;
-import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
+import org.jspecify.annotations.NonNull;
+
/**
* Holder for Tiles' TileEnterEvent class, to be parceled and transferred to a Tile Service.
*
@@ -30,7 +31,7 @@
public static final Creator<TileEnterEventData> CREATOR =
newCreator(TileEnterEventData.class, TileEnterEventData::new);
- public TileEnterEventData(@NonNull byte[] params, int version) {
+ public TileEnterEventData(byte @NonNull [] params, int version) {
super(params, version);
}
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileInteractionEventData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileInteractionEventData.java
index 53f32ff..2ca9682 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileInteractionEventData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileInteractionEventData.java
@@ -15,9 +15,10 @@
*/
package androidx.wear.tiles;
-import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
+import org.jspecify.annotations.NonNull;
+
/**
* Holder for Tiles' TileInteractionEvent class, to be parceled and transferred to a Tile Service.
*
@@ -29,7 +30,7 @@
public static final Creator<TileInteractionEventData> CREATOR =
newCreator(TileInteractionEventData.class, TileInteractionEventData::new);
- public TileInteractionEventData(@NonNull byte[] params, int version) {
+ public TileInteractionEventData(byte @NonNull [] params, int version) {
super(params, version);
}
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileLeaveEventData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileLeaveEventData.java
index 476cd9a..0edd237 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileLeaveEventData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileLeaveEventData.java
@@ -16,9 +16,10 @@
package androidx.wear.tiles;
-import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
+import org.jspecify.annotations.NonNull;
+
/**
* Holder for Tiles' TileLeaveEvent class, to be parceled and transferred to a Tile Service.
*
@@ -30,7 +31,7 @@
public static final Creator<TileLeaveEventData> CREATOR =
newCreator(TileLeaveEventData.class, TileLeaveEventData::new);
- public TileLeaveEventData(@NonNull byte[] params, int version) {
+ public TileLeaveEventData(byte @NonNull [] params, int version) {
super(params, version);
}
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRemoveEventData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRemoveEventData.java
index fc6152c..6d97a2c 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRemoveEventData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRemoveEventData.java
@@ -16,9 +16,10 @@
package androidx.wear.tiles;
-import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
+import org.jspecify.annotations.NonNull;
+
/**
* Holder for Tiles' TileRemoveEvent class, to be parceled and transferred to a Tile Service.
*
@@ -30,7 +31,7 @@
public static final Creator<TileRemoveEventData> CREATOR =
newCreator(TileRemoveEventData.class, TileRemoveEventData::new);
- public TileRemoveEventData(@NonNull byte[] params, int version) {
+ public TileRemoveEventData(byte @NonNull [] params, int version) {
super(params, version);
}
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRequestData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRequestData.java
index e4d83ae..352e188 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRequestData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileRequestData.java
@@ -16,9 +16,10 @@
package androidx.wear.tiles;
-import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
+import org.jspecify.annotations.NonNull;
+
/**
* Holder for Tiles' TileRequest class, to be parceled and transferred to a Tile Service.
*
@@ -30,7 +31,7 @@
public static final Creator<TileRequestData> CREATOR =
newCreator(TileRequestData.class, TileRequestData::new);
- public TileRequestData(@NonNull byte[] params, int version) {
+ public TileRequestData(byte @NonNull [] params, int version) {
super(params, version);
}
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileService.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileService.java
index e85f9ae..37c203e 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileService.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileService.java
@@ -29,8 +29,6 @@
import android.util.Log;
import androidx.annotation.MainThread;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.annotation.VisibleForTesting;
import androidx.concurrent.futures.CallbackToFutureAdapter;
@@ -57,6 +55,9 @@
import com.google.wear.services.tiles.TileInstance;
import com.google.wear.services.tiles.TilesManager;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.lang.ref.WeakReference;
import java.time.Duration;
import java.util.ArrayList;
@@ -152,8 +153,8 @@
* @param requestParams Parameters about the request. See {@link TileRequest} for more info.
*/
@MainThread
- @NonNull
- protected abstract ListenableFuture<Tile> onTileRequest(@NonNull TileRequest requestParams);
+ protected abstract @NonNull ListenableFuture<Tile> onTileRequest(
+ @NonNull TileRequest requestParams);
/**
* Called when the system is requesting a resource bundle from this Tile Provider. The returned
@@ -167,10 +168,9 @@
* @deprecated Use {@link #onTileResourcesRequest} instead.
*/
@MainThread
- @NonNull
@Deprecated
- protected ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources> onResourcesRequest(
- @NonNull ResourcesRequest requestParams) {
+ protected @NonNull ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources>
+ onResourcesRequest(@NonNull ResourcesRequest requestParams) {
return ON_RESOURCES_REQUEST_NOT_IMPLEMENTED;
}
@@ -190,9 +190,8 @@
* info.
*/
@MainThread
- @NonNull
@SuppressWarnings({"AsyncSuffixFuture", "deprecation"}) // For backward compatibility
- protected ListenableFuture<Resources> onTileResourcesRequest(
+ protected @NonNull ListenableFuture<Resources> onTileResourcesRequest(
@NonNull ResourcesRequest requestParams) {
// We are offering a default implementation for onTileResourcesRequest for backward
// compatibility as older clients are overriding onResourcesRequest.
@@ -280,8 +279,7 @@
*
* @param context The application context.
*/
- @NonNull
- public static TileUpdateRequester getUpdater(@NonNull Context context) {
+ public static @NonNull TileUpdateRequester getUpdater(@NonNull Context context) {
List<TileUpdateRequester> requesters = new ArrayList<>();
requesters.add(new SysUiTileUpdateRequester(context));
@@ -313,8 +311,7 @@
* context} present in the carousel, or a value based on platform-specific fallback
* behavior.
*/
- @NonNull
- public static ListenableFuture<List<ActiveTileIdentifier>> getActiveTilesAsync(
+ public static @NonNull ListenableFuture<List<ActiveTileIdentifier>> getActiveTilesAsync(
@NonNull Context context, @NonNull Executor executor) {
if (useWearSdkImpl(context)
&& Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
@@ -325,8 +322,7 @@
}
@VisibleForTesting
- @NonNull
- static ListenableFuture<List<ActiveTileIdentifier>> getActiveTilesAsyncLegacy(
+ static @NonNull ListenableFuture<List<ActiveTileIdentifier>> getActiveTilesAsyncLegacy(
@NonNull Context context,
@NonNull Executor executor,
@NonNull TimeSourceClock timeSourceClock) {
@@ -344,8 +340,7 @@
private TileProvider.Stub mBinder;
@Override
- @Nullable
- public IBinder onBind(@NonNull Intent intent) {
+ public @Nullable IBinder onBind(@NonNull Intent intent) {
if (ACTION_BIND_TILE_PROVIDER.equals(intent.getAction())) {
if (mBinder == null) {
mBinder = new TileProviderWrapper(this, new Handler(getMainLooper()));
@@ -697,8 +692,7 @@
});
}
- @NonNull
- private static Optional<TileInteractionEvent> tileInteractionEventFromProto(
+ private static @NonNull Optional<TileInteractionEvent> tileInteractionEventFromProto(
TileInteractionEventData data) {
try {
return Optional.of(
@@ -755,8 +749,7 @@
@RequiresApi(34)
private static class Api34Impl {
- @NonNull
- static ListenableFuture<List<ActiveTileIdentifier>> getActiveTilesAsync(
+ static @NonNull ListenableFuture<List<ActiveTileIdentifier>> getActiveTilesAsync(
@NonNull TilesManager tilesManager, @NonNull Executor executor) {
return CallbackToFutureAdapter.getFuture(
completer -> {
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequestData.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequestData.java
index 1907b70..d2e7c82 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequestData.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequestData.java
@@ -16,9 +16,10 @@
package androidx.wear.tiles;
-import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
+import org.jspecify.annotations.NonNull;
+
/**
* Holder for parameters, used when a Tile update request is triggered. This is currently a
* placeholder to allow for future expansion, and should be filled in with an empty byte array.
@@ -30,7 +31,7 @@
public static final Creator<TileUpdateRequestData> CREATOR =
newCreator(TileUpdateRequestData.class, TileUpdateRequestData::new);
- private TileUpdateRequestData(@NonNull byte[] params, int version) {
+ private TileUpdateRequestData(byte @NonNull [] params, int version) {
super(params, version);
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequester.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequester.java
index 23f8def..bf0a573 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequester.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TileUpdateRequester.java
@@ -16,7 +16,7 @@
package androidx.wear.tiles;
-import androidx.annotation.NonNull;
+import org.jspecify.annotations.NonNull;
/**
* Interface used for a Tile Service to notify a Tile Renderer that it should fetch a new Timeline
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TimelineBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TimelineBuilders.java
index 9ec8f9e..d5da952 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TimelineBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TimelineBuilders.java
@@ -16,12 +16,13 @@
package androidx.wear.tiles;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.wear.protolayout.proto.TimelineProto;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -62,13 +63,11 @@
return mImpl.getEndMillis();
}
- @NonNull
- static TimeInterval fromProto(@NonNull TimelineProto.TimeInterval proto) {
+ static @NonNull TimeInterval fromProto(TimelineProto.@NonNull TimeInterval proto) {
return new TimeInterval(proto);
}
- @NonNull
- TimelineProto.TimeInterval toProto() {
+ TimelineProto.@NonNull TimeInterval toProto() {
return mImpl;
}
@@ -80,22 +79,19 @@
public Builder() {}
/** Sets starting point of the time interval, in milliseconds since the Unix epoch. */
- @NonNull
- public Builder setStartMillis(long startMillis) {
+ public @NonNull Builder setStartMillis(long startMillis) {
mImpl.setStartMillis(startMillis);
return this;
}
/** Sets end point of the time interval, in milliseconds since the Unix epoch. */
- @NonNull
- public Builder setEndMillis(long endMillis) {
+ public @NonNull Builder setEndMillis(long endMillis) {
mImpl.setEndMillis(endMillis);
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public TimeInterval build() {
+ public @NonNull TimeInterval build() {
return TimeInterval.fromProto(mImpl.build());
}
}
@@ -110,8 +106,7 @@
}
/** Gets the validity period for this timeline entry. Intended for testing purposes only. */
- @Nullable
- public TimeInterval getValidity() {
+ public @Nullable TimeInterval getValidity() {
if (mImpl.hasValidity()) {
return TimeInterval.fromProto(mImpl.getValidity());
} else {
@@ -120,8 +115,7 @@
}
/** Gets the contents of this timeline entry. Intended for testing purposes only. */
- @Nullable
- public LayoutElementBuilders.Layout getLayout() {
+ public LayoutElementBuilders.@Nullable Layout getLayout() {
if (mImpl.hasLayout()) {
return LayoutElementBuilders.Layout.fromProto(mImpl.getLayout());
} else {
@@ -130,23 +124,20 @@
}
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static TimelineEntry fromProto(@NonNull TimelineProto.TimelineEntry proto) {
+ public static @NonNull TimelineEntry fromProto(TimelineProto.@NonNull TimelineEntry proto) {
return new TimelineEntry(proto);
}
/** Returns the {@link TimelineEntry} object containing the given layout element. */
- @NonNull
- public static TimelineEntry fromLayoutElement(
- @NonNull LayoutElementBuilders.LayoutElement layoutElement) {
+ public static @NonNull TimelineEntry fromLayoutElement(
+ LayoutElementBuilders.@NonNull LayoutElement layoutElement) {
return new Builder()
.setLayout(LayoutElementBuilders.Layout.fromLayoutElement(layoutElement))
.build();
}
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public TimelineProto.TimelineEntry toProto() {
+ public TimelineProto.@NonNull TimelineEntry toProto() {
return mImpl;
}
@@ -158,22 +149,19 @@
public Builder() {}
/** Sets the validity period for this timeline entry. */
- @NonNull
- public Builder setValidity(@NonNull TimeInterval validity) {
+ public @NonNull Builder setValidity(@NonNull TimeInterval validity) {
mImpl.setValidity(validity.toProto());
return this;
}
/** Sets the contents of this timeline entry. */
- @NonNull
- public Builder setLayout(@NonNull LayoutElementBuilders.Layout layout) {
+ public @NonNull Builder setLayout(LayoutElementBuilders.@NonNull Layout layout) {
mImpl.setLayout(layout.toProto());
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public TimelineEntry build() {
+ public @NonNull TimelineEntry build() {
return TimelineEntry.fromProto(mImpl.build());
}
}
@@ -201,8 +189,7 @@
}
/** Gets the entries in a timeline. Intended for testing purposes only. */
- @NonNull
- public List<TimelineEntry> getTimelineEntries() {
+ public @NonNull List<TimelineEntry> getTimelineEntries() {
List<TimelineEntry> list = new ArrayList<>();
for (TimelineProto.TimelineEntry item : mImpl.getTimelineEntriesList()) {
list.add(TimelineEntry.fromProto(item));
@@ -211,23 +198,20 @@
}
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public static Timeline fromProto(@NonNull TimelineProto.Timeline proto) {
+ public static @NonNull Timeline fromProto(TimelineProto.@NonNull Timeline proto) {
return new Timeline(proto);
}
/** Returns the {@link Timeline} object containing the given layout element. */
- @NonNull
- public static Timeline fromLayoutElement(
- @NonNull LayoutElementBuilders.LayoutElement layoutElement) {
+ public static @NonNull Timeline fromLayoutElement(
+ LayoutElementBuilders.@NonNull LayoutElement layoutElement) {
return new Builder()
.addTimelineEntry(TimelineEntry.fromLayoutElement(layoutElement))
.build();
}
@RestrictTo(Scope.LIBRARY_GROUP)
- @NonNull
- public TimelineProto.Timeline toProto() {
+ public TimelineProto.@NonNull Timeline toProto() {
return mImpl;
}
@@ -239,15 +223,13 @@
public Builder() {}
/** Adds one item to the entries in a timeline. */
- @NonNull
- public Builder addTimelineEntry(@NonNull TimelineEntry timelineEntry) {
+ public @NonNull Builder addTimelineEntry(@NonNull TimelineEntry timelineEntry) {
mImpl.addTimelineEntries(timelineEntry.toProto());
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public Timeline build() {
+ public @NonNull Timeline build() {
return Timeline.fromProto(mImpl.build());
}
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TypeBuilders.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TypeBuilders.java
index 60c066c..a0f0a19 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TypeBuilders.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/TypeBuilders.java
@@ -18,13 +18,14 @@
import android.annotation.SuppressLint;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.wear.protolayout.expression.Fingerprint;
import androidx.wear.protolayout.proto.TypesProto;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
+
/**
* Builders for extensible primitive types used by layout elements.
*
@@ -37,7 +38,7 @@
/** An int32 type. */
public static final class Int32Prop {
private final TypesProto.Int32Prop mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
Int32Prop(TypesProto.Int32Prop impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -51,18 +52,15 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static Int32Prop fromProto(@NonNull TypesProto.Int32Prop proto) {
+ static @NonNull Int32Prop fromProto(TypesProto.@NonNull Int32Prop proto) {
return new Int32Prop(proto, null);
}
- @NonNull
- TypesProto.Int32Prop toProto() {
+ TypesProto.@NonNull Int32Prop toProto() {
return mImpl;
}
@@ -74,16 +72,14 @@
public Builder() {}
/** Sets the value. */
- @NonNull
- public Builder setValue(int value) {
+ public @NonNull Builder setValue(int value) {
mImpl.setValue(value);
mFingerprint.recordPropertyUpdate(1, value);
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public Int32Prop build() {
+ public @NonNull Int32Prop build() {
return new Int32Prop(mImpl.build(), mFingerprint);
}
}
@@ -92,7 +88,7 @@
/** A string type. */
public static final class StringProp {
private final TypesProto.StringProp mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
StringProp(TypesProto.StringProp impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -100,25 +96,21 @@
}
/** Gets the value. Intended for testing purposes only. */
- @NonNull
- public String getValue() {
+ public @NonNull String getValue() {
return mImpl.getValue();
}
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static StringProp fromProto(@NonNull TypesProto.StringProp proto) {
+ static @NonNull StringProp fromProto(TypesProto.@NonNull StringProp proto) {
return new StringProp(proto, null);
}
- @NonNull
- TypesProto.StringProp toProto() {
+ TypesProto.@NonNull StringProp toProto() {
return mImpl;
}
@@ -130,16 +122,14 @@
public Builder() {}
/** Sets the value. */
- @NonNull
- public Builder setValue(@NonNull String value) {
+ public @NonNull Builder setValue(@NonNull String value) {
mImpl.setValue(value);
mFingerprint.recordPropertyUpdate(1, value.hashCode());
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public StringProp build() {
+ public @NonNull StringProp build() {
return new StringProp(mImpl.build(), mFingerprint);
}
}
@@ -148,7 +138,7 @@
/** A float type. */
public static final class FloatProp {
private final TypesProto.FloatProp mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
FloatProp(TypesProto.FloatProp impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -162,18 +152,15 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static FloatProp fromProto(@NonNull TypesProto.FloatProp proto) {
+ static @NonNull FloatProp fromProto(TypesProto.@NonNull FloatProp proto) {
return new FloatProp(proto, null);
}
- @NonNull
- TypesProto.FloatProp toProto() {
+ TypesProto.@NonNull FloatProp toProto() {
return mImpl;
}
@@ -185,16 +172,14 @@
public Builder() {}
/** Sets the value. */
- @NonNull
- public Builder setValue(float value) {
+ public @NonNull Builder setValue(float value) {
mImpl.setValue(value);
mFingerprint.recordPropertyUpdate(1, Float.floatToIntBits(value));
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public FloatProp build() {
+ public @NonNull FloatProp build() {
return new FloatProp(mImpl.build(), mFingerprint);
}
}
@@ -203,7 +188,7 @@
/** A boolean type. */
public static final class BoolProp {
private final TypesProto.BoolProp mImpl;
- @Nullable private final Fingerprint mFingerprint;
+ private final @Nullable Fingerprint mFingerprint;
BoolProp(TypesProto.BoolProp impl, @Nullable Fingerprint fingerprint) {
this.mImpl = impl;
@@ -217,18 +202,15 @@
/** Get the fingerprint for this object, or null if unknown. */
@RestrictTo(Scope.LIBRARY_GROUP)
- @Nullable
- public Fingerprint getFingerprint() {
+ public @Nullable Fingerprint getFingerprint() {
return mFingerprint;
}
- @NonNull
- static BoolProp fromProto(@NonNull TypesProto.BoolProp proto) {
+ static @NonNull BoolProp fromProto(TypesProto.@NonNull BoolProp proto) {
return new BoolProp(proto, null);
}
- @NonNull
- TypesProto.BoolProp toProto() {
+ TypesProto.@NonNull BoolProp toProto() {
return mImpl;
}
@@ -241,16 +223,14 @@
/** Sets the value. */
@SuppressLint("MissingGetterMatchingBuilder")
- @NonNull
- public Builder setValue(boolean value) {
+ public @NonNull Builder setValue(boolean value) {
mImpl.setValue(value);
mFingerprint.recordPropertyUpdate(1, Boolean.hashCode(value));
return this;
}
/** Builds an instance from accumulated values. */
- @NonNull
- public BoolProp build() {
+ public @NonNull BoolProp build() {
return new BoolProp(mImpl.build(), mFingerprint);
}
}
diff --git a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ViewerTileUpdateRequester.java b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ViewerTileUpdateRequester.java
index cffb82d..a18a073 100644
--- a/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ViewerTileUpdateRequester.java
+++ b/wear/tiles/tiles/src/main/java/androidx/wear/tiles/ViewerTileUpdateRequester.java
@@ -19,7 +19,7 @@
import android.content.Context;
import android.content.Intent;
-import androidx.annotation.NonNull;
+import org.jspecify.annotations.NonNull;
/**
* {@link TileUpdateRequester} which notifies the viewer that it should fetch a new version of the
diff --git a/wear/tiles/tiles/src/test/java/androidx/wear/tiles/CompositeTileUpdateRequesterTest.java b/wear/tiles/tiles/src/test/java/androidx/wear/tiles/CompositeTileUpdateRequesterTest.java
index 5c0133e..5d62133 100644
--- a/wear/tiles/tiles/src/test/java/androidx/wear/tiles/CompositeTileUpdateRequesterTest.java
+++ b/wear/tiles/tiles/src/test/java/androidx/wear/tiles/CompositeTileUpdateRequesterTest.java
@@ -21,8 +21,6 @@
import android.content.Intent;
import android.os.IBinder;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.concurrent.futures.ResolvableFuture;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.wear.protolayout.ResourceBuilders;
@@ -30,6 +28,8 @@
import com.google.common.collect.ImmutableList;
import com.google.common.util.concurrent.ListenableFuture;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -71,27 +71,24 @@
}
private static class FakeService extends TileService {
- @NonNull
@Override
- protected ListenableFuture<TileBuilders.Tile> onTileRequest(
- @NonNull RequestBuilders.TileRequest requestParams) {
+ protected @NonNull ListenableFuture<TileBuilders.Tile> onTileRequest(
+ RequestBuilders.@NonNull TileRequest requestParams) {
ResolvableFuture<TileBuilders.Tile> f = ResolvableFuture.create();
f.set(null);
return f;
}
- @NonNull
@Override
- protected ListenableFuture<ResourceBuilders.Resources> onTileResourcesRequest(
- @NonNull RequestBuilders.ResourcesRequest requestParams) {
+ protected @NonNull ListenableFuture<ResourceBuilders.Resources> onTileResourcesRequest(
+ RequestBuilders.@NonNull ResourcesRequest requestParams) {
ResolvableFuture<ResourceBuilders.Resources> f = ResolvableFuture.create();
f.set(null);
return f;
}
- @Nullable
@Override
- public IBinder onBind(Intent intent) {
+ public @Nullable IBinder onBind(Intent intent) {
return null;
}
}
diff --git a/wear/tiles/tiles/src/test/java/androidx/wear/tiles/ProtoParcelableTest.java b/wear/tiles/tiles/src/test/java/androidx/wear/tiles/ProtoParcelableTest.java
index d0032c7..92e0dc8 100644
--- a/wear/tiles/tiles/src/test/java/androidx/wear/tiles/ProtoParcelableTest.java
+++ b/wear/tiles/tiles/src/test/java/androidx/wear/tiles/ProtoParcelableTest.java
@@ -27,7 +27,6 @@
import org.junit.runner.RunWith;
import org.robolectric.annotation.internal.DoNotInstrument;
-
@RunWith(AndroidJUnit4.class)
@DoNotInstrument // See http://g/robolectric-users/fTi2FRXgyGA/m/PkB0wYuwBgAJ
public final class ProtoParcelableTest {
diff --git a/wear/tiles/tiles/src/test/java/androidx/wear/tiles/TileServiceTest.java b/wear/tiles/tiles/src/test/java/androidx/wear/tiles/TileServiceTest.java
index 5db6074..2b87fe2 100644
--- a/wear/tiles/tiles/src/test/java/androidx/wear/tiles/TileServiceTest.java
+++ b/wear/tiles/tiles/src/test/java/androidx/wear/tiles/TileServiceTest.java
@@ -39,8 +39,6 @@
import android.os.Looper;
import android.os.RemoteException;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.wear.protolayout.ResourceBuilders.Resources;
@@ -66,6 +64,8 @@
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
@@ -1000,8 +1000,7 @@
}
@Override
- @NonNull
- protected ListenableFuture<TileBuilders.Tile> onTileRequest(
+ protected @NonNull ListenableFuture<TileBuilders.Tile> onTileRequest(
@NonNull TileRequest requestParams) {
mTileRequestParams = requestParams;
mTileId = requestParams.getTileId();
@@ -1012,8 +1011,7 @@
}
@Override
- @NonNull
- protected ListenableFuture<Resources> onTileResourcesRequest(
+ protected @NonNull ListenableFuture<Resources> onTileResourcesRequest(
@NonNull ResourcesRequest requestParams) {
mResourcesRequestParams = requestParams;
mTileId = requestParams.getTileId();
@@ -1051,16 +1049,14 @@
protected void onTileLeaveEvent(@NonNull TileLeaveEvent requestParams) {}
@Override
- @NonNull
- protected ListenableFuture<TileBuilders.Tile> onTileRequest(
+ protected @NonNull ListenableFuture<TileBuilders.Tile> onTileRequest(
@NonNull TileRequest requestParams) {
return Futures.immediateFuture(DUMMY_TILE_TO_RETURN);
}
@Override
- @NonNull
@SuppressWarnings("deprecation") // for backward compatibility
- protected ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources>
+ protected @NonNull ListenableFuture<androidx.wear.tiles.ResourceBuilders.Resources>
onResourcesRequest(@NonNull ResourcesRequest requestParams) {
androidx.wear.tiles.ResourceBuilders.Resources resources =
new androidx.wear.tiles.ResourceBuilders.Resources.Builder()
diff --git a/webkit/webkit/src/main/java/androidx/webkit/internal/PrefetchParametersAdapter.java b/webkit/webkit/src/main/java/androidx/webkit/internal/PrefetchParametersAdapter.java
index 9ef2c2a..ec1528b 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/internal/PrefetchParametersAdapter.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/internal/PrefetchParametersAdapter.java
@@ -19,7 +19,6 @@
import androidx.webkit.NoVarySearchData;
import androidx.webkit.PrefetchParameters;
-import org.chromium.support_lib_boundary.PrefetchParamsBoundaryInterface;
import org.chromium.support_lib_boundary.util.BoundaryInterfaceReflectionUtil;
import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;
@@ -28,21 +27,18 @@
import java.util.HashMap;
import java.util.Map;
-public class PrefetchParametersAdapter implements
- PrefetchParamsBoundaryInterface {
+public class PrefetchParametersAdapter {
private final PrefetchParameters mPrefetchParameters;
public PrefetchParametersAdapter(@Nullable PrefetchParameters impl) {
mPrefetchParameters = impl;
}
- @Override
public @NonNull Map<String, String> getAdditionalHeaders() {
if (mPrefetchParameters == null) return new HashMap<>();
return mPrefetchParameters.getAdditionalHeaders();
}
- @Override
public @Nullable InvocationHandler getNoVarySearchData() {
if (mPrefetchParameters == null) return null;
NoVarySearchData noVarySearchData = mPrefetchParameters.getExpectedNoVarySearchData();
@@ -51,7 +47,6 @@
new NoVarySearchDataAdapter(noVarySearchData));
}
- @Override
public boolean isJavaScriptEnabled() {
if (mPrefetchParameters == null) return false;
return mPrefetchParameters.isJavaScriptEnabled();
diff --git a/webkit/webkit/src/main/java/androidx/webkit/internal/ProfileImpl.java b/webkit/webkit/src/main/java/androidx/webkit/internal/ProfileImpl.java
index 29b2df9..a762e5d 100644
--- a/webkit/webkit/src/main/java/androidx/webkit/internal/ProfileImpl.java
+++ b/webkit/webkit/src/main/java/androidx/webkit/internal/ProfileImpl.java
@@ -16,26 +16,20 @@
package androidx.webkit.internal;
-import android.util.Log;
import android.webkit.CookieManager;
import android.webkit.GeolocationPermissions;
import android.webkit.ServiceWorkerController;
import android.webkit.WebStorage;
import androidx.core.os.CancellationSignal;
-import androidx.webkit.PrefetchException;
import androidx.webkit.PrefetchOperationCallback;
import androidx.webkit.PrefetchParameters;
import androidx.webkit.Profile;
-import org.chromium.support_lib_boundary.PrefetchOperationResultBoundaryInterface;
-import org.chromium.support_lib_boundary.PrefetchStatusCodeBoundaryInterface;
import org.chromium.support_lib_boundary.ProfileBoundaryInterface;
-import org.chromium.support_lib_boundary.util.BoundaryInterfaceReflectionUtil;
import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;
-import java.lang.reflect.InvocationHandler;
/**
* Internal implementation of Profile.
@@ -110,26 +104,6 @@
@Nullable CancellationSignal cancellationSignal,
@NonNull PrefetchOperationCallback<Void> operationCallback,
@Nullable PrefetchParameters params) {
- ApiFeature.NoFramework feature = WebViewFeatureInternal.PROFILE_URL_PREFETCH;
- if (feature.isSupportedByWebView()) {
- try {
- InvocationHandler paramsBoundaryInterface =
- BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
- new PrefetchParametersAdapter(params));
-
- mProfileImpl.prefetchUrl(url, paramsBoundaryInterface,
- value -> mapOperationResult(value, operationCallback));
-
- } catch (Exception e) {
- operationCallback.onError(e);
- }
- if (cancellationSignal != null) {
- cancellationSignal.setOnCancelListener(() -> mProfileImpl.cancelPrefetch(url,
- value -> mapOperationResult(value, operationCallback)));
- }
- } else {
- throw WebViewFeatureInternal.getUnsupportedOperationException();
- }
}
@Override
@@ -142,35 +116,6 @@
@Override
public void clearPrefetchAsync(@NonNull String url,
@NonNull PrefetchOperationCallback<Void> operationCallback) {
- ApiFeature.NoFramework feature = WebViewFeatureInternal.PROFILE_URL_PREFETCH;
- if (feature.isSupportedByWebView()) {
- try {
- mProfileImpl.clearPrefetch(url,
- value -> mapOperationResult(value, operationCallback));
- } catch (Exception e) {
- operationCallback.onError(e);
- }
- } else {
- throw WebViewFeatureInternal.getUnsupportedOperationException();
- }
- }
-
- private void mapOperationResult(InvocationHandler resultInvocation,
- PrefetchOperationCallback<Void> operationCallback) {
- PrefetchOperationResultBoundaryInterface result =
- BoundaryInterfaceReflectionUtil.castToSuppLibClass(
- PrefetchOperationResultBoundaryInterface.class, resultInvocation);
- assert result != null;
- switch (result.getStatusCode()) {
- case PrefetchStatusCodeBoundaryInterface.SUCCESS:
- operationCallback.onSuccess(null);
- break;
- case PrefetchStatusCodeBoundaryInterface.FAILURE:
- operationCallback.onError(new PrefetchException("An unexpected error occurred."));
- break;
- default:
- Log.e("Prefetch", "Unsupported status code received");
- }
}
}