diff --git a/CHANGELOG.md b/CHANGELOG.md index 83882ab3..168be0f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # CHANGELOG +## Version 4.2.0 + +### Date: 02-Mar-2026 + +- Added asset localisation support + ## Version 4.1.0 ### Date: 15-Sept-2025 diff --git a/LICENSE b/LICENSE index c7d34c7c..0c2b6003 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2012 - 2025 Contentstack +Copyright (c) 2012 - 2026 Contentstack Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/contentstack/build.gradle b/contentstack/build.gradle index f7a3ed44..f0ad9685 100755 --- a/contentstack/build.gradle +++ b/contentstack/build.gradle @@ -7,7 +7,7 @@ plugins { ext { PUBLISH_GROUP_ID = 'com.contentstack.sdk' PUBLISH_ARTIFACT_ID = 'android' - PUBLISH_VERSION = '4.1.0' + PUBLISH_VERSION = '4.2.0' } android { diff --git a/contentstack/src/androidTest/java/com/contentstack/sdk/AssetTestCase.java b/contentstack/src/androidTest/java/com/contentstack/sdk/AssetTestCase.java index ce358ec1..1f807b6e 100644 --- a/contentstack/src/androidTest/java/com/contentstack/sdk/AssetTestCase.java +++ b/contentstack/src/androidTest/java/com/contentstack/sdk/AssetTestCase.java @@ -124,6 +124,22 @@ public void onCompletion(ResponseType responseType, Error error) { latch.await(5, TimeUnit.SECONDS); } + @Test + public void test_setLocale_fetch() throws InterruptedException { + final CountDownLatch latch = new CountDownLatch(1); + final Asset asset = stack.asset(assetUid); + asset.setLocale("en-us"); + asset.fetch(new FetchResultCallback() { + @Override + public void onCompletion(ResponseType responseType, Error error) { + assertNotNull(asset.getAssetUid()); + latch.countDown(); + } + }); + latch.await(5, TimeUnit.SECONDS); + assertEquals("Query was not completed in time", 0, latch.getCount()); + } + @Test public void test_include_branch() { final Asset asset = stack.asset(assetUid); diff --git a/contentstack/src/main/java/com/contentstack/sdk/Asset.java b/contentstack/src/main/java/com/contentstack/sdk/Asset.java index c135e2a6..a30eb371 100755 --- a/contentstack/src/main/java/com/contentstack/sdk/Asset.java +++ b/contentstack/src/main/java/com/contentstack/sdk/Asset.java @@ -616,4 +616,22 @@ public Asset includeBranch() { return this; } + /** + *
+ *
Example :
+ *
+ * Asset asset = asset.setLocale("en-hi");
+ *
+ *
+ */
+ public Asset setLocale(String locale) {
+ if (locale != null) {
+ try {
+ urlQueries.put("locale", locale);
+ } catch (JSONException e) {
+ Log.e(TAG, e.getLocalizedMessage());
+ }
+ }
+ return this;
+ }
}
diff --git a/contentstack/src/test/java/com/contentstack/sdk/TestAssetAdvanced.java b/contentstack/src/test/java/com/contentstack/sdk/TestAssetAdvanced.java
index 8b12c8a9..fb3bd0a9 100644
--- a/contentstack/src/test/java/com/contentstack/sdk/TestAssetAdvanced.java
+++ b/contentstack/src/test/java/com/contentstack/sdk/TestAssetAdvanced.java
@@ -189,6 +189,37 @@ public void testAddParamOverwrite() {
assertNotNull(asset);
}
+ // ==================== SET LOCALE Tests ====================
+
+ @Test
+ public void testSetLocale() {
+ Asset result = asset.setLocale("en-us");
+ assertNotNull(result);
+ assertSame(asset, result);
+ assertEquals("en-us", asset.urlQueries.optString("locale", ""));
+ }
+
+ @Test
+ public void testSetLocaleReturnsThis() {
+ Asset result = asset.setLocale("en-hi");
+ assertSame(asset, result);
+ }
+
+ @Test
+ public void testSetLocaleWithNull() {
+ asset.setLocale("en-us");
+ Asset result = asset.setLocale(null);
+ assertSame(asset, result);
+ assertEquals("en-us", asset.urlQueries.optString("locale", ""));
+ }
+
+ @Test
+ public void testSetLocaleChainedWithFetch() {
+ asset.setLocale("en-us").includeFallback();
+ assertTrue(asset.urlQueries.has("locale"));
+ assertEquals("en-us", asset.urlQueries.optString("locale", ""));
+ }
+
// ==================== GET METHODS Tests ====================
@Test
diff --git a/contentstack/src/test/java/com/contentstack/sdk/TestContentType.java b/contentstack/src/test/java/com/contentstack/sdk/TestContentType.java
index c008c10d..c0409588 100644
--- a/contentstack/src/test/java/com/contentstack/sdk/TestContentType.java
+++ b/contentstack/src/test/java/com/contentstack/sdk/TestContentType.java
@@ -14,8 +14,10 @@
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.Map;
-import static org.mockito.Mockito.*;
+import java.util.concurrent.atomic.AtomicReference;
+
@RunWith(RobolectricTestRunner.class)
@Config(sdk = 28, manifest = Config.NONE)
public class TestContentType {
@@ -336,27 +338,8 @@ private ContentType createBareContentType(String contentTypeUid) {
return new ContentType(contentTypeUid);
}
- private ContentType createContentTypeWithStackAndHeaders(String contentTypeUid) throws Exception {
- ContentType contentType = new ContentType(contentTypeUid);
-
- // mock Stack and inject a stackHeader / localHeader field if present
- Stack mockStack = mock(Stack.class);
-
- // We will inject "localHeader" field into Stack if it exists
- try {
- Field localHeaderField = Stack.class.getDeclaredField("localHeader");
- localHeaderField.setAccessible(true);
- ArrayMap