diff --git a/android/KMAPro/kMAPro/src/main/java/com/keyman/android/CheckInstallReferrer.java b/android/KMAPro/kMAPro/src/main/java/com/keyman/android/CheckInstallReferrer.java index 3c0eff4ec5..afd0c5e574 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/keyman/android/CheckInstallReferrer.java +++ b/android/KMAPro/kMAPro/src/main/java/com/keyman/android/CheckInstallReferrer.java @@ -30,12 +30,12 @@ import java.lang.IllegalArgumentException; import com.android.installreferrer.api.InstallReferrerClient; import com.android.installreferrer.api.InstallReferrerStateListener; import com.android.installreferrer.api.ReferrerDetails; -import com.tavultesoft.kmapro.BuildConfig; import com.tavultesoft.kmapro.MainActivity; import com.tavultesoft.kmapro.R; import com.tavultesoft.kmea.KmpInstallMode; import com.tavultesoft.kmea.util.KMLog; import com.tavultesoft.kmea.util.KMString; +import com.tavultesoft.kmea.util.VersionUtils; public class CheckInstallReferrer { private static final String TAG = "CheckInstallReferrer"; @@ -66,8 +66,7 @@ public class CheckInstallReferrer { editor.commit(); // local environment or test builds are nearly always side loaded - if (BuildConfig.VERSION_ENVIRONMENT.equalsIgnoreCase("local") || - BuildConfig.VERSION_NAME.matches("^.*(-test-\\d+)$")) { + if (VersionUtils.isLocalBuild() || VersionUtils.isTestBuild()) { return; } diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/CloudDataJsonUtil.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/CloudDataJsonUtil.java index 8c64622464..6482095864 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/CloudDataJsonUtil.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/CloudDataJsonUtil.java @@ -153,20 +153,24 @@ public class CloudDataJsonUtil { for (int i = 0; i < KeyboardController.getInstance().get().size(); i++) { Keyboard kbd = KeyboardController.getInstance().getKeyboardInfo(i); String version = kbd.getVersion(); - String updateKMP = kbd.getUpdateKMP(); if (keyboardID.equalsIgnoreCase(kbd.getKeyboardID()) && - FileUtils.compareVersions(cloudVersion, version) == FileUtils.VERSION_GREATER && - updateKMP != null && - !updateKMP.equalsIgnoreCase(cloudKMP)) { - // Update keyboard with the latest KMP link - kbd.setUpdateKMP(cloudKMP); - KeyboardController.getInstance().add(kbd); + FileUtils.compareVersions(cloudVersion, version) == FileUtils.VERSION_GREATER) { + // Cloud catalog has newer KMP version available + String updateKMP = kbd.getUpdateKMP(); + if (updateKMP != null) { + if (!updateKMP.equalsIgnoreCase(cloudKMP)) { + // Update keyboard info with the latest KMP link + kbd.setUpdateKMP(cloudKMP); + KeyboardController.getInstance().add(kbd); + saveKeyboardList = true; + } - // Update bundle list - Bundle bundle = new Bundle(kbd.buildDownloadBundle()); - updateBundles.add(bundle); - - saveKeyboardList = true; + if (!updateKMP.isEmpty()) { + // Update bundle list for update notifications + Bundle bundle = new Bundle(kbd.buildDownloadBundle()); + updateBundles.add(bundle); + } + } } } } diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/impl/CloudCatalogDownloadCallback.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/impl/CloudCatalogDownloadCallback.java index 74bea7d606..ca99c2f0c6 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/impl/CloudCatalogDownloadCallback.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/cloud/impl/CloudCatalogDownloadCallback.java @@ -18,6 +18,7 @@ import com.tavultesoft.kmea.data.KeyboardController; import com.tavultesoft.kmea.data.LanguageResource; import com.tavultesoft.kmea.data.LexicalModel; import com.tavultesoft.kmea.util.FileUtils; +import com.tavultesoft.kmea.util.VersionUtils; import org.json.JSONArray; import org.json.JSONObject; @@ -69,7 +70,8 @@ public class CloudCatalogDownloadCallback implements ICloudDownloadCallback cloudQueries = new ArrayList<>(2); - if (!cacheValid) { + // For local and PR test builds, force check of keyboard updates + if (!cacheValid || VersionUtils.isLocalOrTestBuild()) { cloudQueries.add(prepareResourcesUpdateQuery(context)); } diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/logic/ResourcesUpdateTool.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/logic/ResourcesUpdateTool.java index 9aae22632b..0b666049ab 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/logic/ResourcesUpdateTool.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/logic/ResourcesUpdateTool.java @@ -28,6 +28,7 @@ import com.tavultesoft.kmea.KeyboardEventHandler; import com.tavultesoft.kmea.R; import com.tavultesoft.kmea.data.CloudRepository; import com.tavultesoft.kmea.util.KMLog; +import com.tavultesoft.kmea.util.VersionUtils; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; @@ -296,6 +297,11 @@ public class ResourcesUpdateTool implements KeyboardEventHandler.OnKeyboardDownl * @return true if the notification should be ignored */ private boolean shouldIgnoreNotification(String id) { + // For local and PR test builds, return false to make it easier to get updates for testing + if (VersionUtils.isLocalOrTestBuild()) { + return false; + } + SharedPreferences prefs = currentContext.getSharedPreferences(currentContext.getString(R.string.kma_prefs_name), Context.MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); String ignoredNotificationsStr = prefs.getString(PREF_KEY_IGNORE_NOTIFICATIONS, null); @@ -464,6 +470,10 @@ public class ResourcesUpdateTool implements KeyboardEventHandler.OnKeyboardDownl } public boolean shouldCheckUpdate(Context aContext) { + // For local and PR test builds, invalidate cache to make keyboard updates easier + if (VersionUtils.isLocalOrTestBuild() || FORCE_RESOURCE_UPDATE) { + return true; + } boolean shouldCheckUpdate = false; if (lastUpdateCheck == null) { SharedPreferences prefs = aContext.getSharedPreferences(aContext.getString(R.string.kma_prefs_name), Context.MODE_PRIVATE); @@ -491,9 +501,6 @@ public class ResourcesUpdateTool implements KeyboardEventHandler.OnKeyboardDownl shouldCheckUpdate = true; } - if(FORCE_RESOURCE_UPDATE) - shouldCheckUpdate = true; - return shouldCheckUpdate; } diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/VersionUtils.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/VersionUtils.java new file mode 100644 index 0000000000..311cc4c642 --- /dev/null +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/VersionUtils.java @@ -0,0 +1,26 @@ +/** + * Copyright (C) 2022 SIL International. All rights reserved. + */ +package com.tavultesoft.kmea.util; + +import com.tavultesoft.kmea.BuildConfig; + +/** + * Utilities to determine if a build is local or a test (PR) build. + */ +public final class VersionUtils { + public static final String TAG = "VersionUtils"; + + public static boolean isLocalBuild() { + return BuildConfig.VERSION_ENVIRONMENT.equalsIgnoreCase("local"); + } + + public static boolean isTestBuild() { + return BuildConfig.VERSION_ENVIRONMENT.equalsIgnoreCase("test"); + } + + // Utility for local and PR test builds - e.g. force check of keyboard updates + public static boolean isLocalOrTestBuild() { + return isLocalBuild() || isTestBuild(); + } +}