diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 5a2791307788..d1172d3caa0a 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -1,5 +1,9 @@ *** PLEASE FOLLOW THIS FORMAT: [] [] +24.6 +----- + + 24.5 ----- * [*] [internal] Block editor: Remove code associated to Story block [https://github.com/wordpress-mobile/WordPress-Android/pull/20400] diff --git a/WordPress/build.gradle b/WordPress/build.gradle index 2b5816adfe43..00a9e1978624 100644 --- a/WordPress/build.gradle +++ b/WordPress/build.gradle @@ -722,11 +722,18 @@ if (project.hasProperty("debugStoreFile")) { // Copy React Native JavaScript bundle and source map so they can be upload it to the Crash logging // service during the build process. android { - applicationVariants.all { variant -> + applicationVariants.configureEach { variant -> + def variantAssets = variant.mergeAssetsProvider.get().outputDir.get() + + tasks.register("delete${variant.name.capitalize()}ReactNativeBundleSourceMap", Delete) { + delete(fileTree(dir: variantAssets, includes: ['**/*.bundle.map'])) + } + tasks.register("copy${variant.name.capitalize()}ReactNativeBundleSourceMap", Copy) { - from("${buildDir}/intermediates/assets/${variant.name}") + from(variantAssets) into("${buildDir}/react-native-bundle-source-map") include("*.bundle", "*.bundle.map") + finalizedBy("delete${variant.name.capitalize()}ReactNativeBundleSourceMap") } variant.mergeAssetsProvider.configure { diff --git a/WordPress/jetpack_metadata/release_notes.txt b/WordPress/jetpack_metadata/release_notes.txt index 24855a2e2753..b16879e8b529 100644 --- a/WordPress/jetpack_metadata/release_notes.txt +++ b/WordPress/jetpack_metadata/release_notes.txt @@ -1,6 +1,4 @@ -- Added a new Traffic tab on the Stats screen -- Upgraded the Notifications design -- Introduced video block support for VideoPress v5 -- Fixed a crash caused by block editor auto-scrolling -- Provided an error message for video upload failure -- Removed image transparency during upload +* [*] [internal] Block editor: Remove code associated to Story block [https://github.com/wordpress-mobile/WordPress-Android/pull/20400] +* [*] [Jetpack-only] Fixes broken links on some notifications [https://github.com/wordpress-mobile/WordPress-Android/pull/20417] +* [**] [internal] Block editor: Upgrade React Native to version 0.73.3 [#20167] + diff --git a/WordPress/metadata/release_notes.txt b/WordPress/metadata/release_notes.txt index a2522385fd21..e8785f47b116 100644 --- a/WordPress/metadata/release_notes.txt +++ b/WordPress/metadata/release_notes.txt @@ -1,5 +1,3 @@ -We made a few changes to the block editor. +* [*] [internal] Block editor: Remove code associated to Story block [https://github.com/wordpress-mobile/WordPress-Android/pull/20400] +* [**] [internal] Block editor: Upgrade React Native to version 0.73.3 [#20167] -- The app won’t crash anymore when the editor auto-scrolls down to a block. -- You’ll now see an error message when a video fails to upload to media and text blocks. -- Images no longer appear partly transparent while they’re being uploaded. diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java b/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java index cbe82cda4cf3..8f8f10a92f5d 100644 --- a/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java +++ b/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java @@ -185,9 +185,11 @@ public static ReaderPost fromJson(JSONObject json) { // if there's no featured image, check if featured media has been set to an image if (!post.hasFeaturedImage() && json.has("featured_media")) { JSONObject jsonMedia = json.optJSONObject("featured_media"); - String type = JSONUtils.getString(jsonMedia, "type"); - if (type.equals("image")) { - post.mFeaturedImage = JSONUtils.getString(jsonMedia, "uri"); + if (jsonMedia != null) { + String type = JSONUtils.getString(jsonMedia, "type"); + if (type.equals("image")) { + post.mFeaturedImage = JSONUtils.getString(jsonMedia, "uri"); + } } } diff --git a/WordPress/src/main/java/org/wordpress/android/models/recommend/RecommendApiCallsProvider.kt b/WordPress/src/main/java/org/wordpress/android/models/recommend/RecommendApiCallsProvider.kt index d59d2c1f6119..e324f64e5679 100644 --- a/WordPress/src/main/java/org/wordpress/android/models/recommend/RecommendApiCallsProvider.kt +++ b/WordPress/src/main/java/org/wordpress/android/models/recommend/RecommendApiCallsProvider.kt @@ -51,7 +51,7 @@ class RecommendApiCallsProvider @Inject constructor( cont.resume(Failure(errorMessage)) } - restClientProvider.getRestClientUtilsV2().get( + restClientProvider.getRestClientUtilsV2().getWithLocale( endPointPath, listener, errorListener diff --git a/WordPress/src/main/java/org/wordpress/android/ui/notifications/utils/NotificationsUtils.java b/WordPress/src/main/java/org/wordpress/android/ui/notifications/utils/NotificationsUtils.java index 5653112f7af5..5f5634bcba7b 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/notifications/utils/NotificationsUtils.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/notifications/utils/NotificationsUtils.java @@ -87,7 +87,7 @@ public static void getPushNotificationSettings(Context context, RestRequest.List if (!TextUtils.isEmpty(deviceID)) { settingsEndpoint += "?device_id=" + deviceID; } - WordPress.getRestClientUtilsV1_1().get(settingsEndpoint, listener, errorListener); + WordPress.getRestClientUtilsV1_1().getWithLocale(settingsEndpoint, listener, errorListener); } public static void registerDeviceForPushNotifications(final Context ctx, String token) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/people/InviteLinksApiCallsProvider.kt b/WordPress/src/main/java/org/wordpress/android/ui/people/InviteLinksApiCallsProvider.kt index 0d349d3a307f..6ea4dd44eb67 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/people/InviteLinksApiCallsProvider.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/people/InviteLinksApiCallsProvider.kt @@ -39,7 +39,7 @@ class InviteLinksApiCallsProvider @Inject constructor( cont.resume(Failure(error)) } - WordPress.getRestClientUtilsV1_1().get( + WordPress.getRestClientUtilsV1_1().getWithLocale( endPointPath, listener, errorListener diff --git a/WordPress/src/main/java/org/wordpress/android/ui/people/utils/PeopleUtils.java b/WordPress/src/main/java/org/wordpress/android/ui/people/utils/PeopleUtils.java index 5709f56c62a4..418d586a4077 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/people/utils/PeopleUtils.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/people/utils/PeopleUtils.java @@ -62,7 +62,7 @@ public void onErrorResponse(VolleyError volleyError) { params.put("order_by", "display_name"); params.put("order", "ASC"); String path = String.format(Locale.US, "sites/%d/users", site.getSiteId()); - WordPress.getRestClientUtilsV1_1().get(path, params, null, listener, errorListener); + WordPress.getRestClientUtilsV1_1().getWithLocale(path, params, null, listener, errorListener); } public static void fetchAuthors(final SiteModel site, final int offset, final FetchUsersCallback callback) { @@ -95,7 +95,7 @@ public static void fetchAuthors(final SiteModel site, final int offset, final Fe params.put("order", "ASC"); params.put("authors_only", "true"); String path = String.format(Locale.US, "sites/%d/users", site.getSiteId()); - WordPress.getRestClientUtilsV1_1().get(path, params, null, listener, errorListener); + WordPress.getRestClientUtilsV1_1().getWithLocale(path, params, null, listener, errorListener); } public static void fetchRevisionAuthorsDetails(final SiteModel site, List authors, @@ -144,7 +144,7 @@ public void onErrorResponse(VolleyError volleyError) { site.getSiteId(), authors.get(i))); } - WordPress.getRestClientUtilsV1_1().get("batch/", batchParams, null, listener, errorListener); + WordPress.getRestClientUtilsV1_1().getWithLocale("batch/", batchParams, null, listener, errorListener); } public static void fetchFollowers(final SiteModel site, final int page, final FetchFollowersCallback callback) { @@ -195,7 +195,7 @@ public void onErrorResponse(VolleyError volleyError) { params.put("page", Integer.toString(page)); params.put("type", isEmailFollower ? "email" : "wp_com"); String path = String.format(Locale.US, "sites/%d/stats/followers", site.getSiteId()); - WordPress.getRestClientUtilsV1_1().get(path, params, null, listener, errorListener); + WordPress.getRestClientUtilsV1_1().getWithLocale(path, params, null, listener, errorListener); } public static void fetchViewers(final SiteModel site, final int offset, final FetchViewersCallback callback) { @@ -233,7 +233,7 @@ public void onErrorResponse(VolleyError volleyError) { params.put("number", Integer.toString(FETCH_LIMIT)); params.put("page", Integer.toString(page)); String path = String.format(Locale.US, "sites/%d/viewers", site.getSiteId()); - WordPress.getRestClientUtilsV1_1().get(path, params, null, listener, errorListener); + WordPress.getRestClientUtilsV1_1().getWithLocale(path, params, null, listener, errorListener); } public static void updateRole(final SiteModel site, long personID, String newRole, final int localTableBlogId, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeActions.java b/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeActions.java index 8fad36d11e09..307e118fbd78 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeActions.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeActions.java @@ -153,7 +153,7 @@ public void onErrorResponse(VolleyError volleyError) { }; String path = "/me/keyring-connections"; - WordPress.getRestClientUtilsV1_1().get(path, listener, errorListener); + WordPress.getRestClientUtilsV1_1().getWithLocale(path, listener, errorListener); } /* diff --git a/WordPress/src/main/java/org/wordpress/android/ui/publicize/services/PublicizeUpdateServicesV2.kt b/WordPress/src/main/java/org/wordpress/android/ui/publicize/services/PublicizeUpdateServicesV2.kt index ed549f49e226..ce089cdb7ca7 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/publicize/services/PublicizeUpdateServicesV2.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/publicize/services/PublicizeUpdateServicesV2.kt @@ -27,7 +27,7 @@ class PublicizeUpdateServicesV2 @Inject constructor( } val errorListener = RestRequest.ErrorListener { volleyError -> failure(volleyError) } val path = "sites/$siteId/external-services?type=publicize" - restClientProvider.getRestClientUtilsV2().get(path, listener, errorListener) + restClientProvider.getRestClientUtilsV2().getWithLocale(path, listener, errorListener) } /* @@ -45,6 +45,6 @@ class PublicizeUpdateServicesV2 @Inject constructor( } val errorListener = RestRequest.ErrorListener { volleyError -> failure(volleyError) } val path = String.format(Locale.ROOT, "sites/%d/publicize-connections", siteId) - restClientProvider.getRestClientUtilsV1_1().get(path, listener, errorListener) + restClientProvider.getRestClientUtilsV1_1().getWithLocale(path, listener, errorListener) } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderBlogActions.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderBlogActions.java index 2451b933cb18..21f2a01c547f 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderBlogActions.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderBlogActions.java @@ -398,10 +398,11 @@ public void onErrorResponse(VolleyError volleyError) { }; if (hasBlogId) { - WordPress.getRestClientUtilsV1_1().get("read/sites/" + blogId, listener, errorListener); + WordPress.getRestClientUtilsV1_1().getWithLocale("read/sites/" + blogId, listener, errorListener); } else { WordPress.getRestClientUtilsV1_1() - .get("read/sites/" + UrlUtils.urlEncode(UrlUtils.getHost(blogUrl)), listener, errorListener); + .getWithLocale("read/sites/" + UrlUtils.urlEncode(UrlUtils.getHost(blogUrl)), listener, + errorListener); } } @@ -438,7 +439,7 @@ public void onErrorResponse(VolleyError volleyError) { } else { path = "read/feed/" + UrlUtils.urlEncode(feedUrl); } - WordPress.getRestClientUtilsV1_1().get(path, listener, errorListener); + WordPress.getRestClientUtilsV1_1().getWithLocale(path, listener, errorListener); } private static void handleUpdateBlogInfoResponse(JSONObject jsonObject, UpdateBlogInfoListener infoListener) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java index ee49b07f0a92..7b6e9527bba4 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java @@ -159,7 +159,7 @@ public void onErrorResponse(VolleyError volleyError) { } }; AppLog.d(T.READER, "updating post"); - WordPress.getRestClientUtilsV1_2().get(path, null, null, listener, errorListener); + WordPress.getRestClientUtilsV1_2().getWithLocale(path, null, null, listener, errorListener); } private static void handleUpdatePostResponse(@NonNull final ReaderPost localPost, @@ -320,7 +320,7 @@ public void onErrorResponse(VolleyError volleyError) { }; AppLog.d(T.READER, "requesting post"); - restClientUtils.get(path, null, null, listener, errorListener); + restClientUtils.getWithLocale(path, null, null, listener, errorListener); } private static String getTrackingPixelForPost(@NonNull ReaderPost post) { @@ -417,7 +417,7 @@ public void onErrorResponse(VolleyError volleyError) { + "?size_local=" + NUM_RELATED_POSTS_TO_REQUEST + "&size_global=" + NUM_RELATED_POSTS_TO_REQUEST + "&fields=" + ReaderSimplePost.SIMPLE_POST_FIELDS; - WordPress.getRestClientUtilsV1_2().get(path, null, null, listener, errorListener); + WordPress.getRestClientUtilsV1_2().getWithLocale(path, null, null, listener, errorListener); } private static void handleRelatedPostsResponse(final ReaderPost sourcePost, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/ParseDiscoverCardsJsonUseCase.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/ParseDiscoverCardsJsonUseCase.kt index 9197e5e635c2..1e5806799c47 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/ParseDiscoverCardsJsonUseCase.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/repository/usecases/ParseDiscoverCardsJsonUseCase.kt @@ -78,7 +78,7 @@ class ParseDiscoverCardsJsonUseCase @Inject constructor( } fun parseNextPageHandle(jsonObject: JSONObject): String = - jsonObject.getString(ReaderConstants.JSON_NEXT_PAGE_HANDLE) + jsonObject.optString(ReaderConstants.JSON_NEXT_PAGE_HANDLE) fun convertListOfJsonArraysIntoSingleJsonArray(jsons: List): JSONArray { val arrays = jsons.map { JSONArray(it) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/comment/ReaderCommentService.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/comment/ReaderCommentService.java index 56487cc3f0bc..748577aafb40 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/comment/ReaderCommentService.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/comment/ReaderCommentService.java @@ -201,7 +201,7 @@ public void onErrorResponse(VolleyError volleyError) { } }; AppLog.d(AppLog.T.READER, "updating comments"); - WordPress.getRestClientUtilsV1_1().get(path, null, null, listener, errorListener); + WordPress.getRestClientUtilsV1_1().getWithLocale(path, null, null, listener, errorListener); } private static void handleUpdateCommentsResponse(final JSONObject jsonObject, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/discover/ReaderDiscoverLogic.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/discover/ReaderDiscoverLogic.kt index 8e384e3626a5..8678093db272 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/discover/ReaderDiscoverLogic.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/discover/ReaderDiscoverLogic.kt @@ -46,6 +46,7 @@ import org.wordpress.android.ui.reader.services.discover.ReaderDiscoverLogic.Dis import org.wordpress.android.ui.reader.services.discover.ReaderDiscoverLogic.DiscoverTasks.REQUEST_MORE import org.wordpress.android.util.AppLog import org.wordpress.android.util.AppLog.T.READER +import org.wordpress.android.util.LocaleManagerWrapper import org.wordpress.android.util.config.ReaderDiscoverNewEndpointFeatureConfig import javax.inject.Inject @@ -59,6 +60,7 @@ class ReaderDiscoverLogic @Inject constructor( private val getDiscoverCardsUseCase: GetDiscoverCardsUseCase, private val appPrefsWrapper: AppPrefsWrapper, private val readerDiscoverNewEndpointFeatureConfig: ReaderDiscoverNewEndpointFeatureConfig, + private val localeManagerWrapper: LocaleManagerWrapper, ) { enum class DiscoverTasks { REQUEST_MORE, REQUEST_FIRST_PAGE @@ -118,12 +120,13 @@ class ReaderDiscoverLogic @Inject constructor( AppLog.e(READER, volleyError) resultListener.onUpdateResult(FAILED) } + params["_locale"] = localeManagerWrapper.getLanguage() val endpoint = if (readerDiscoverNewEndpointFeatureConfig.isEnabled()) { "read/streams/discover" } else { "read/tags/cards" } - WordPress.getRestClientUtilsV2()[endpoint, params, null, listener, errorListener] + WordPress.getRestClientUtilsV2().get(endpoint, params, null, listener, errorListener) } } @@ -150,7 +153,9 @@ class ReaderDiscoverLogic @Inject constructor( insertCardsJsonIntoDb(simplifiedCardsJson) val nextPageHandle = parseDiscoverCardsJsonUseCase.parseNextPageHandle(json) - appPrefsWrapper.readerCardsPageHandle = nextPageHandle + if (nextPageHandle.isNotEmpty()) { + appPrefsWrapper.readerCardsPageHandle = nextPageHandle + } if (cards.isEmpty()) { readerTagTableWrapper.clearTagLastUpdated(ReaderTag.createDiscoverPostCardsTag()) @@ -238,7 +243,11 @@ class ReaderDiscoverLogic @Inject constructor( // If we've received a recommended tags or blogs card as the first element, // it should be displayed as the third card. if (firstRecommendationCard != null) { - simplifiedJsonList.add(2, firstRecommendationCard) + if (simplifiedJsonList.size >=2) { + simplifiedJsonList.add(2, firstRecommendationCard) + } else { + simplifiedJsonList.add(firstRecommendationCard) + } } return JSONArray(simplifiedJsonList) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/post/ReaderPostJobService.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/post/ReaderPostJobService.java index 3eb45bc78936..70a2ed80efb8 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/post/ReaderPostJobService.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/post/ReaderPostJobService.java @@ -10,6 +10,11 @@ import org.wordpress.android.ui.reader.ReaderEvents; import org.wordpress.android.ui.reader.services.ServiceCompletionListener; import org.wordpress.android.util.AppLog; +import org.wordpress.android.util.LocaleManagerWrapper; + +import javax.inject.Inject; + +import dagger.hilt.android.AndroidEntryPoint; import static org.wordpress.android.ui.reader.services.post.ReaderPostServiceStarter.ARG_ACTION; import static org.wordpress.android.ui.reader.services.post.ReaderPostServiceStarter.ARG_BLOG_ID; @@ -26,9 +31,12 @@ * EventBus to alert of update status */ +@AndroidEntryPoint public class ReaderPostJobService extends JobService implements ServiceCompletionListener { private ReaderPostLogic mReaderPostLogic; + @Inject LocaleManagerWrapper mLocaleManagerWrapper; + @Override public boolean onStartJob(JobParameters params) { AppLog.i(AppLog.T.READER, "reader post job service > started"); UpdateAction action; @@ -66,7 +74,7 @@ public class ReaderPostJobService extends JobService implements ServiceCompletio @Override public void onCreate() { super.onCreate(); - mReaderPostLogic = new ReaderPostLogic(this); + mReaderPostLogic = new ReaderPostLogic(this, mLocaleManagerWrapper); AppLog.i(AppLog.T.READER, "reader post job service > created"); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/post/ReaderPostLogic.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/post/ReaderPostLogic.java index ca1619ae3788..212d32230fab 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/post/ReaderPostLogic.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/post/ReaderPostLogic.java @@ -25,15 +25,19 @@ import org.wordpress.android.ui.reader.services.post.ReaderPostServiceStarter.UpdateAction; import org.wordpress.android.ui.reader.utils.ReaderUtils; import org.wordpress.android.util.AppLog; +import org.wordpress.android.util.LocaleManagerWrapper; import org.wordpress.android.util.StringUtils; import org.wordpress.android.util.UrlUtils; public class ReaderPostLogic { private ServiceCompletionListener mCompletionListener; + private final LocaleManagerWrapper mLocaleManagerWrapper; private Object mListenerCompanion; - public ReaderPostLogic(ServiceCompletionListener listener) { + public ReaderPostLogic(@NonNull final ServiceCompletionListener listener, + @NonNull final LocaleManagerWrapper localeManagerWrapper) { mCompletionListener = listener; + mLocaleManagerWrapper = localeManagerWrapper; } public void performTask(Object companion, UpdateAction action, @@ -87,7 +91,7 @@ public void onUpdateResult(ReaderActions.UpdateResult result) { requestPostsForFeed(feedId, action, listener); } - private static void requestPostsWithTag(final ReaderTag tag, + private void requestPostsWithTag(final ReaderTag tag, final UpdateAction updateAction, final ReaderActions.UpdateResultListener resultListener) { String path = getRelativeEndpointForTag(tag); @@ -126,22 +130,18 @@ private static void requestPostsWithTag(final ReaderTag tag, sb.append("&meta=site,likes"); - com.wordpress.rest.RestRequest.Listener listener = new RestRequest.Listener() { - @Override - public void onResponse(JSONObject jsonObject) { - // remember when this tag was updated if newer posts were requested - if (updateAction == UpdateAction.REQUEST_NEWER || updateAction == UpdateAction.REQUEST_REFRESH) { - ReaderTagTable.setTagLastUpdated(tag); - } - handleUpdatePostsResponse(tag, jsonObject, updateAction, resultListener); + sb.append("&lang=").append(mLocaleManagerWrapper.getLanguage()); + + com.wordpress.rest.RestRequest.Listener listener = jsonObject -> { + // remember when this tag was updated if newer posts were requested + if (updateAction == UpdateAction.REQUEST_NEWER || updateAction == UpdateAction.REQUEST_REFRESH) { + ReaderTagTable.setTagLastUpdated(tag); } + handleUpdatePostsResponse(tag, jsonObject, updateAction, resultListener); }; - RestRequest.ErrorListener errorListener = new RestRequest.ErrorListener() { - @Override - public void onErrorResponse(VolleyError volleyError) { - AppLog.e(AppLog.T.READER, volleyError); - resultListener.onUpdateResult(ReaderActions.UpdateResult.FAILED); - } + RestRequest.ErrorListener errorListener = volleyError -> { + AppLog.e(AppLog.T.READER, volleyError); + resultListener.onUpdateResult(ReaderActions.UpdateResult.FAILED); }; WordPress.getRestClientUtilsV1_2().get(sb.toString(), null, null, listener, errorListener); @@ -174,7 +174,7 @@ public void onErrorResponse(VolleyError volleyError) { } }; AppLog.d(AppLog.T.READER, "updating posts in blog " + blogId); - WordPress.getRestClientUtilsV1_2().get(path, null, null, listener, errorListener); + WordPress.getRestClientUtilsV1_2().getWithLocale(path, null, null, listener, errorListener); } private static void requestPostsForFeed(final long feedId, @@ -203,7 +203,7 @@ public void onErrorResponse(VolleyError volleyError) { }; AppLog.d(AppLog.T.READER, "updating posts in feed " + feedId); - WordPress.getRestClientUtilsV1_2().get(path, null, null, listener, errorListener); + WordPress.getRestClientUtilsV1_2().getWithLocale(path, null, null, listener, errorListener); } /* diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/post/ReaderPostService.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/post/ReaderPostService.java index f00bcf4f3445..5753d9ce4cb7 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/post/ReaderPostService.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/post/ReaderPostService.java @@ -9,6 +9,11 @@ import org.wordpress.android.ui.reader.ReaderEvents; import org.wordpress.android.ui.reader.services.ServiceCompletionListener; import org.wordpress.android.util.AppLog; +import org.wordpress.android.util.LocaleManagerWrapper; + +import javax.inject.Inject; + +import dagger.hilt.android.AndroidEntryPoint; import static org.wordpress.android.ui.reader.services.post.ReaderPostServiceStarter.ARG_ACTION; import static org.wordpress.android.ui.reader.services.post.ReaderPostServiceStarter.ARG_BLOG_ID; @@ -21,9 +26,12 @@ * EventBus to alert of update status */ +@AndroidEntryPoint public class ReaderPostService extends Service implements ServiceCompletionListener { private ReaderPostLogic mReaderPostLogic; + @Inject LocaleManagerWrapper mLocaleManagerWrapper; + @Override public IBinder onBind(Intent intent) { return null; @@ -32,7 +40,7 @@ public IBinder onBind(Intent intent) { @Override public void onCreate() { super.onCreate(); - mReaderPostLogic = new ReaderPostLogic(this); + mReaderPostLogic = new ReaderPostLogic(this, mLocaleManagerWrapper); AppLog.i(AppLog.T.READER, "reader post service > created"); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/search/ReaderSearchJobService.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/search/ReaderSearchJobService.java index e4f9db580dbb..f5fd3f46892d 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/search/ReaderSearchJobService.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/search/ReaderSearchJobService.java @@ -5,6 +5,11 @@ import org.wordpress.android.ui.reader.services.ServiceCompletionListener; import org.wordpress.android.util.AppLog; +import org.wordpress.android.util.LocaleManagerWrapper; + +import javax.inject.Inject; + +import dagger.hilt.android.AndroidEntryPoint; import static org.wordpress.android.ui.reader.services.search.ReaderSearchServiceStarter.ARG_OFFSET; import static org.wordpress.android.ui.reader.services.search.ReaderSearchServiceStarter.ARG_QUERY; @@ -13,9 +18,12 @@ * service which searches for reader posts on wordpress.com */ +@AndroidEntryPoint public class ReaderSearchJobService extends JobService implements ServiceCompletionListener { private ReaderSearchLogic mReaderSearchLogic; + @Inject LocaleManagerWrapper mLocaleManagerWrapper; + @Override public boolean onStartJob(JobParameters params) { if (params.getExtras() != null && params.getExtras().getString(ARG_QUERY) != null) { String query = params.getExtras().getString(ARG_QUERY); @@ -34,7 +42,7 @@ public class ReaderSearchJobService extends JobService implements ServiceComplet @Override public void onCreate() { super.onCreate(); - mReaderSearchLogic = new ReaderSearchLogic(this); + mReaderSearchLogic = new ReaderSearchLogic(this, mLocaleManagerWrapper); AppLog.i(AppLog.T.READER, "reader search job service > created"); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/search/ReaderSearchLogic.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/search/ReaderSearchLogic.java index 0002fe3febce..b865a00e28ec 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/search/ReaderSearchLogic.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/search/ReaderSearchLogic.java @@ -14,16 +14,21 @@ import org.wordpress.android.ui.reader.ReaderEvents; import org.wordpress.android.ui.reader.services.ServiceCompletionListener; import org.wordpress.android.util.AppLog; +import org.wordpress.android.util.LocaleManagerWrapper; import org.wordpress.android.util.UrlUtils; import static org.wordpress.android.ui.reader.utils.ReaderUtils.getTagForSearchQuery; public class ReaderSearchLogic { - private ServiceCompletionListener mCompletionListener; + private final ServiceCompletionListener mCompletionListener; + + private final LocaleManagerWrapper mLocaleManagerWrapper; private Object mListenerCompanion; - public ReaderSearchLogic(ServiceCompletionListener listener) { + public ReaderSearchLogic(@NonNull final ServiceCompletionListener listener, + final @NonNull LocaleManagerWrapper localeManagerWrapper) { mCompletionListener = listener; + mLocaleManagerWrapper = localeManagerWrapper; } public void startSearch(@NonNull final String query, final int offset, Object companion) { @@ -32,16 +37,14 @@ public void startSearch(@NonNull final String query, final int offset, Object co + UrlUtils.urlEncode(query) + "&number=" + ReaderConstants.READER_MAX_SEARCH_RESULTS_TO_REQUEST + "&offset=" + offset - + "&meta=site,likes"; + + "&meta=site,likes" + + "&lang=" + mLocaleManagerWrapper.getLanguage(); - RestRequest.Listener listener = new RestRequest.Listener() { - @Override - public void onResponse(JSONObject jsonObject) { - if (jsonObject != null) { - handleSearchResponse(query, offset, jsonObject); - } else { - EventBus.getDefault().post(new ReaderEvents.SearchPostsEnded(query, offset, false)); - } + RestRequest.Listener listener = jsonObject -> { + if (jsonObject != null) { + handleSearchResponse(query, offset, jsonObject); + } else { + EventBus.getDefault().post(new ReaderEvents.SearchPostsEnded(query, offset, false)); } }; RestRequest.ErrorListener errorListener = new RestRequest.ErrorListener() { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/search/ReaderSearchService.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/search/ReaderSearchService.java index ddbf822e4100..200bd615e43c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/search/ReaderSearchService.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/search/ReaderSearchService.java @@ -6,18 +6,26 @@ import org.wordpress.android.ui.reader.services.ServiceCompletionListener; import org.wordpress.android.util.AppLog; +import org.wordpress.android.util.LocaleManagerWrapper; import org.wordpress.android.util.StringUtils; +import javax.inject.Inject; + +import dagger.hilt.android.AndroidEntryPoint; + /** * service which searches for reader posts on wordpress.com */ +@AndroidEntryPoint public class ReaderSearchService extends Service implements ServiceCompletionListener { private static final String ARG_QUERY = "query"; private static final String ARG_OFFSET = "offset"; private ReaderSearchLogic mReaderSearchLogic; + @Inject LocaleManagerWrapper mLocaleManagerWrapper; + @Override public IBinder onBind(Intent intent) { return null; @@ -26,7 +34,7 @@ public IBinder onBind(Intent intent) { @Override public void onCreate() { super.onCreate(); - mReaderSearchLogic = new ReaderSearchLogic(this); + mReaderSearchLogic = new ReaderSearchLogic(this, mLocaleManagerWrapper); AppLog.i(AppLog.T.READER, "reader search service > created"); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/update/ReaderUpdateLogic.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/update/ReaderUpdateLogic.java index 151bdebd5101..9af7b113c7db 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/update/ReaderUpdateLogic.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/update/ReaderUpdateLogic.java @@ -120,7 +120,7 @@ public void onErrorResponse(VolleyError volleyError) { HashMap params = new HashMap<>(); params.put("locale", mLanguage); mClientUtilsProvider.getRestClientForTagUpdate() - .get("read/menu", params, null, listener, errorListener); + .getWithLocale("read/menu", params, null, listener, errorListener); } /** @@ -316,7 +316,8 @@ public void onErrorResponse(VolleyError volleyError) { AppLog.d(AppLog.T.READER, "reader service > updating followed blogs. Page requested: " + page); // request using ?meta=site,feed to get extra info WordPress.getRestClientUtilsV1_2() - .get("read/following/mine?number=100&page=" + page + "&meta=site%2Cfeed", listener, errorListener); + .getWithLocale("read/following/mine?number=100&page=" + page + "&meta=site%2Cfeed", listener, + errorListener); } private void handleFollowedBlogsResponse(final ReaderBlogList serverBlogs, final JSONObject jsonObject) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/PostSubscribersApiCallsProvider.kt b/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/PostSubscribersApiCallsProvider.kt index 40f2d8aefe89..a0887da7d86b 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/PostSubscribersApiCallsProvider.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/PostSubscribersApiCallsProvider.kt @@ -38,7 +38,7 @@ class PostSubscribersApiCallsProvider @Inject constructor( cont.resume(false) } - WordPress.getRestClientUtilsV1_1().get( + WordPress.getRestClientUtilsV1_1().getWithLocale( endPointPath, listener, errorListener @@ -64,7 +64,7 @@ class PostSubscribersApiCallsProvider @Inject constructor( cont.resume(Failure(error)) } - WordPress.getRestClientUtilsV1_1().get( + WordPress.getRestClientUtilsV1_1().getWithLocale( endPointPath, listener, errorListener diff --git a/WordPress/src/main/java/org/wordpress/android/ui/suggestion/service/SuggestionService.java b/WordPress/src/main/java/org/wordpress/android/ui/suggestion/service/SuggestionService.java index 7853bb5dba14..0c215405c511 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/suggestion/service/SuggestionService.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/suggestion/service/SuggestionService.java @@ -91,7 +91,7 @@ private void updateSuggestions(final long siteId) { AppLog.d(AppLog.T.SUGGESTION, "suggestion service > updating suggestions for siteId: " + siteId); String path = "/users/suggest" + "?site_id=" + siteId; - WordPress.getRestClientUtils().get(path, listener, errorListener); + WordPress.getRestClientUtils().getWithLocale(path, listener, errorListener); } private void handleSuggestionsUpdatedResponse(final long siteId, final JSONObject jsonObject) { @@ -136,7 +136,7 @@ private void updateTags(final long siteId) { AppLog.d(AppLog.T.SUGGESTION, "suggestion service > updating tags for siteId: " + siteId); String path = "/sites/" + siteId + "/tags"; - WordPress.getRestClientUtils().get(path, listener, errorListener); + WordPress.getRestClientUtils().getWithLocale(path, listener, errorListener); } private void handleTagsUpdatedResponse(final long siteId, final JSONObject jsonObject) { diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index ef4354f0bdd0..36c4a2bb7004 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -4796,4 +4796,12 @@ translators: %s: Select control option value e.g: "Auto, 25%". --> Edit video Video caption. Empty Video caption. %s + Button to copy error details + Button to copy post text + Copy error details + Copy post text + Tap here to copy error details + Tap here to copy post text + The editor has encountered an unexpected error + You can copy your post text in case your content is impacted. Copy error details to debug and share with support. diff --git a/WordPress/src/test/java/org/wordpress/android/models/recommend/RecommendApiCallsProviderTest.kt b/WordPress/src/test/java/org/wordpress/android/models/recommend/RecommendApiCallsProviderTest.kt index 9132c83d0598..ddf347895251 100644 --- a/WordPress/src/test/java/org/wordpress/android/models/recommend/RecommendApiCallsProviderTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/models/recommend/RecommendApiCallsProviderTest.kt @@ -109,7 +109,13 @@ class RecommendApiCallsProviderTest : BaseUnitTest() { val error = "Invalid response received" whenever(jsonObject.toString()).thenReturn("{name:\"wordpress\",message=[]}") whenever(context.getString(R.string.recommend_app_bad_format_response)).thenReturn(error) - whenever(restClientUtils.get(anyString(), listenerCaptor.capture(), errorListenerCaptor.capture())).doAnswer { + whenever( + restClientUtils.getWithLocale( + anyString(), + listenerCaptor.capture(), + errorListenerCaptor.capture() + ) + ).doAnswer { listenerCaptor.lastValue.onResponse(jsonObject) null } @@ -127,7 +133,13 @@ class RecommendApiCallsProviderTest : BaseUnitTest() { val error = "Invalid response received" whenever(jsonObject.optString("name")).thenReturn("jetpack") whenever(context.getString(R.string.recommend_app_bad_format_response)).thenReturn(error) - whenever(restClientUtils.get(anyString(), listenerCaptor.capture(), errorListenerCaptor.capture())).doAnswer { + whenever( + restClientUtils.getWithLocale( + anyString(), + listenerCaptor.capture(), + errorListenerCaptor.capture() + ) + ).doAnswer { listenerCaptor.lastValue.onResponse(jsonObject) null } @@ -144,7 +156,13 @@ class RecommendApiCallsProviderTest : BaseUnitTest() { fun `error is tracked on null net response`() = test { val error = "No response received" whenever(context.getString(R.string.recommend_app_null_response)).thenReturn(error) - whenever(restClientUtils.get(anyString(), listenerCaptor.capture(), errorListenerCaptor.capture())).doAnswer { + whenever( + restClientUtils.getWithLocale( + anyString(), + listenerCaptor.capture(), + errorListenerCaptor.capture() + ) + ).doAnswer { listenerCaptor.lastValue.onResponse(null) null } @@ -161,7 +179,13 @@ class RecommendApiCallsProviderTest : BaseUnitTest() { fun `error is tracked on volley error`() = test { val error = "Unknown error fetching recommend app template" whenever(context.getString(R.string.recommend_app_generic_get_template_error)).thenReturn(error) - whenever(restClientUtils.get(anyString(), listenerCaptor.capture(), errorListenerCaptor.capture())).doAnswer { + whenever( + restClientUtils.getWithLocale( + anyString(), + listenerCaptor.capture(), + errorListenerCaptor.capture() + ) + ).doAnswer { errorListenerCaptor.lastValue.onErrorResponse(mock()) null } diff --git a/build.gradle b/build.gradle index a9696d28acaf..5dbdd2f08470 100644 --- a/build.gradle +++ b/build.gradle @@ -25,10 +25,10 @@ ext { automatticTracksVersion = '3.5.0' gutenbergMobileVersion = 'v1.115.0' wordPressAztecVersion = 'v2.0' - wordPressFluxCVersion = 'trunk-b9ecc708dde74d6cc95aeab42e56fb8067640039' + wordPressFluxCVersion = '2.72.0' wordPressLoginVersion = '1.14.1' wordPressPersistentEditTextVersion = '1.0.2' - wordPressUtilsVersion = 'trunk-4d6cb9a20bfda0dfe2310cf8275cbdcfb0d42ba7' + wordPressUtilsVersion = '3.14.0' indexosMediaForMobileVersion = '43a9026f0973a2f0a74fa813132f6a16f7499c3a' // debug diff --git a/fastlane/resources/values/strings.xml b/fastlane/resources/values/strings.xml index 82adbf31dd1d..36c4a2bb7004 100644 --- a/fastlane/resources/values/strings.xml +++ b/fastlane/resources/values/strings.xml @@ -1629,14 +1629,6 @@ 1 Like %d Likes Error loading like data. %s. - - <a href="">You</a> like this. - <a href="">You and 1 blogger</a> like this. - <a href="">You and %1$s bloggers</a> like this. - <a href="">1 blogger</a> likes this. - <a href="">%1$s bloggers</a> like this. Reader @@ -1720,6 +1712,8 @@ Your draft is uploading Post converted back to draft Failed to insert media.\nPlease tap to retry. + Updating post content + Failed to update post content Post settings @@ -4802,4 +4796,12 @@ translators: %s: Select control option value e.g: "Auto, 25%". --> Edit video Video caption. Empty Video caption. %s + Button to copy error details + Button to copy post text + Copy error details + Copy post text + Tap here to copy error details + Tap here to copy post text + The editor has encountered an unexpected error + You can copy your post text in case your content is impacted. Copy error details to debug and share with support. diff --git a/libs/networking/src/main/java/org/wordpress/android/networking/RestClientUtils.java b/libs/networking/src/main/java/org/wordpress/android/networking/RestClientUtils.java index 2e62fea38810..148a2674e399 100644 --- a/libs/networking/src/main/java/org/wordpress/android/networking/RestClientUtils.java +++ b/libs/networking/src/main/java/org/wordpress/android/networking/RestClientUtils.java @@ -103,7 +103,7 @@ public RestClient getRestClient() { public void getCategories(long siteId, Listener listener, ErrorListener errorListener) { String path = String.format(Locale.US, "sites/%d/categories", siteId); - get(path, null, null, listener, errorListener); + getWithLocale(path, null, null, listener, errorListener); } /** @@ -112,7 +112,7 @@ public void getCategories(long siteId, Listener listener, ErrorListener errorLis * api/1/get/notifications */ public void getNotifications(Map params, Listener listener, ErrorListener errorListener) { - get("notifications", params, null, listener, errorListener); + getWithLocale("notifications", params, null, listener, errorListener); } /** @@ -123,7 +123,7 @@ public void getNotification(Map params, String noteId, Listener listener, ErrorListener errorListener) { params.put("fields", NOTIFICATION_FIELDS); String path = String.format(Locale.US, "notifications/%s/", noteId); - get(path, params, null, listener, errorListener); + getWithLocale(path, params, null, listener, errorListener); } /** @@ -135,7 +135,7 @@ public void getNotification(String noteId, Listener listener, ErrorListener erro HashMap params = new HashMap<>(); params.put("fields", NOTIFICATION_FIELDS); String path = String.format("notifications/%s", noteId); - get(path, params, null, listener, errorListener); + getWithLocale(path, params, null, listener, errorListener); } /** @@ -166,23 +166,23 @@ public void decrementUnreadCount(String noteId, String decrementAmount, public void getJetpackSettings(long siteId, Listener listener, ErrorListener errorListener) { String path = String.format(Locale.US, "jetpack-blogs/%d/rest-api/?path=/jetpack/v4/settings", siteId); - get(path, listener, errorListener); + getWithLocale(path, listener, errorListener); } public void getGeneralSettings(long siteId, Listener listener, ErrorListener errorListener) { String path = String.format(Locale.US, "sites/%d/settings", siteId); - get(path, listener, errorListener); + getWithLocale(path, listener, errorListener); } public void getJetpackMonitorSettings(long siteId, Listener listener, ErrorListener errorListener) { String path = String.format(Locale.US, "jetpack-blogs/%d", siteId); - get(path, listener, errorListener); + getWithLocale(path, listener, errorListener); } public void getJetpackModuleSettings(long siteId, Listener listener, ErrorListener errorListener) { String path = String.format(Locale.US, "sites/%d/jetpack/modules", siteId); - get(path, listener, errorListener); + getWithLocale(path, listener, errorListener); } public void setGeneralSiteSettings(long siteId, JSONObject params, Listener listener, ErrorListener errorListener) { @@ -228,7 +228,7 @@ public void setJetpackModuleSettings(long siteId, String module, boolean active, public void getSitePurchases(long siteId, Listener listener, ErrorListener errorListener) { String path = String.format(Locale.US, "sites/%d/purchases", siteId); - get(path, listener, errorListener); + getWithLocale(path, listener, errorListener); } public void exportContentAll(long siteId, Listener listener, ErrorListener errorListener) { @@ -238,7 +238,7 @@ public void exportContentAll(long siteId, Listener listener, ErrorListener error public void getSharingButtons(String siteId, Listener listener, ErrorListener errorListener) { String path = String.format("sites/%s/sharing-buttons", siteId); - get(path, listener, errorListener); + getWithLocale(path, listener, errorListener); } public void setSharingButtons(String siteId, JSONObject params, Listener listener, ErrorListener errorListener) { @@ -249,29 +249,44 @@ public void setSharingButtons(String siteId, JSONObject params, Listener listene /** * Make GET request */ - public Request get(String path, Listener listener, ErrorListener errorListener) { - return get(path, null, null, listener, errorListener); + public Request getWithLocale(final String path, final Listener listener, + final ErrorListener errorListener) { + return getWithLocale(path, null, null, listener, errorListener); } /** - * Make GET request with params + * Make GET request with params. Locale param is added automatically. */ - public Request get(String path, Map params, RetryPolicy retryPolicy, Listener listener, - ErrorListener errorListener) { + public Request getWithLocale(final String path, final Map params, + RetryPolicy retryPolicy, final Listener listener, + final ErrorListener errorListener) { // turn params into query string HashMap paramsWithLocale = getRestLocaleParams(mContext); if (params != null) { paramsWithLocale.putAll(params); } + return get(path, paramsWithLocale, retryPolicy, listener, errorListener); + } + /** + * Make GET request with params. + */ + public Request get(final String path, final Map params, RetryPolicy retryPolicy, + final Listener listener, final ErrorListener errorListener) { + final Map paramsWithPath = new HashMap<>(); + if (params != null) { + paramsWithPath.putAll(params); + } String realPath = getSanitizedPath(path); if (TextUtils.isEmpty(realPath)) { realPath = path; } - paramsWithLocale.putAll(getSanitizedParameters(path)); + if (path != null) { + paramsWithPath.putAll(getSanitizedParameters(path)); + } RestRequest request = mRestClient.makeRequest(Method.GET, mRestClient - .getAbsoluteURL(realPath, paramsWithLocale), null, listener, errorListener); + .getAbsoluteURL(realPath, paramsWithPath), null, listener, errorListener); if (retryPolicy == null) { retryPolicy = new DefaultRetryPolicy(REST_TIMEOUT_MS, REST_MAX_RETRIES_GET, REST_BACKOFF_MULT); diff --git a/version.properties b/version.properties index ea1f6fa20b9a..72b14604191b 100644 --- a/version.properties +++ b/version.properties @@ -1,2 +1,2 @@ -versionName=24.4 -versionCode=1416 \ No newline at end of file +versionName=24.5-rc-1 +versionCode=1417 \ No newline at end of file