From 25c319c147d47390fc4b291e703b8316489217bb Mon Sep 17 00:00:00 2001 From: althafvly Date: Tue, 15 Aug 2023 13:27:21 +0530 Subject: [PATCH 1/3] Updater: process the json file to avoid multiple updates Change-Id: I6422593ddd1c98506f32febc4bf2f7574d983a3a --- src/org/lineageos/updater/misc/Utils.java | 69 +++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/src/org/lineageos/updater/misc/Utils.java b/src/org/lineageos/updater/misc/Utils.java index 6423b13f..1f702c56 100644 --- a/src/org/lineageos/updater/misc/Utils.java +++ b/src/org/lineageos/updater/misc/Utils.java @@ -52,12 +52,16 @@ import org.lineageos.updater.model.UpdateInfo; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; +import java.io.FileWriter; import java.io.IOException; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Enumeration; +import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Map; +import java.util.Objects; import java.util.UUID; import java.util.regex.Pattern; import java.util.zip.ZipEntry; @@ -183,10 +187,75 @@ public class Utils { update.getTimestamp() > SystemProperties.getLong(Constants.PROP_BUILD_DATE, 0)); } + private static boolean processJsonFile(File inputJsonFile) throws IOException, JSONException { + StringBuilder jsonBuilder = new StringBuilder(); + try (BufferedReader br = new BufferedReader(new FileReader(inputJsonFile))) { + for (String line; (line = br.readLine()) != null;) { + jsonBuilder.append(line); + } + } + + JSONObject inputJsonObject = new JSONObject(jsonBuilder.toString()); + JSONArray responseArray = inputJsonObject.getJSONArray("response"); + Map entriesMap = new HashMap<>(); + int deviceAndroidVersion = Integer.parseInt(Build.VERSION.RELEASE); + + for (int i = 0; i < responseArray.length(); i++) { + JSONObject entry = responseArray.getJSONObject(i); + String androidVersion = entry.getString("android_version"); + long datetime = entry.getLong("datetime"); + + // Allow the latest update for current android. + if (Integer.parseInt(androidVersion) == deviceAndroidVersion) { + if (!entriesMap.containsKey(androidVersion) || datetime > Objects.requireNonNull( + entriesMap.get(androidVersion)).getLong("datetime")) { + entriesMap.put(androidVersion, entry); + } else { + Log.d(TAG, "Update : Skipping " + entry.getString("filename") + + " since a newer build is available"); + } + // Allow upgrade from next major release only. Allow to install initial build + // for that major release and not the latest release. + } else if (Integer.parseInt(androidVersion) == deviceAndroidVersion + 1) { + if (!entriesMap.containsKey(androidVersion) || (((Build.TIME / 1000) < datetime) + && (datetime < Objects.requireNonNull(entriesMap.get(androidVersion) + ).getLong("datetime")))) { + entriesMap.put(androidVersion, entry); + } else { + Log.d(TAG, "Update : Skipping " + entry.getString("filename") + + " since latest build is not preferred for upgrade"); + } + // Ignore if the device has an update available by skipping one major update. + // Allow it only after installing one major android. + } else { + Log.d(TAG, "Update : Skipping " + entry.getString("filename") + + " since the upgrade is unsupported from this android version"); + } + } + + JSONArray modifiedResponseArray = new JSONArray(); + for (JSONObject entry : entriesMap.values()) { + modifiedResponseArray.put(entry); + } + + inputJsonObject.put("response", modifiedResponseArray); + + // Write the modified JSON object back to the input JSON file + FileWriter writer = new FileWriter(inputJsonFile); + writer.write(inputJsonObject.toString()); + writer.close(); + + return true; + } + public static List parseJson(File file, boolean compatibleOnly) throws IOException, JSONException { List updates = new ArrayList<>(); + if (processJsonFile(file)) { + Log.d(TAG, "Ignored incompatible updates"); + } + String json = ""; try (BufferedReader br = new BufferedReader(new FileReader(file))) { for (String line; (line = br.readLine()) != null;) { -- GitLab From f77388264a2c3d1a4aeca9dd888bda62aecf451b Mon Sep 17 00:00:00 2001 From: althafvly Date: Thu, 17 Aug 2023 13:27:15 +0530 Subject: [PATCH 2/3] add missing import Change-Id: I7e5b9588fbeb5454b83193ca3961038632b928e3 --- src/org/lineageos/updater/misc/Utils.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/org/lineageos/updater/misc/Utils.java b/src/org/lineageos/updater/misc/Utils.java index 1f702c56..3e2ce8d9 100644 --- a/src/org/lineageos/updater/misc/Utils.java +++ b/src/org/lineageos/updater/misc/Utils.java @@ -29,6 +29,7 @@ import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.BatteryManager; +import android.os.Build; import android.os.Environment; import android.os.StatFs; import android.os.SystemProperties; -- GitLab From 6b666bc470ac80f5d5e70f5831055aa88bfaa12f Mon Sep 17 00:00:00 2001 From: althafvly Date: Fri, 15 Sep 2023 15:56:05 +0530 Subject: [PATCH 3/3] Updater: parse android version --- src/org/lineageos/updater/misc/Utils.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/org/lineageos/updater/misc/Utils.java b/src/org/lineageos/updater/misc/Utils.java index 3e2ce8d9..22aaca52 100644 --- a/src/org/lineageos/updater/misc/Utils.java +++ b/src/org/lineageos/updater/misc/Utils.java @@ -64,6 +64,7 @@ import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.UUID; +import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -188,6 +189,15 @@ public class Utils { update.getTimestamp() > SystemProperties.getLong(Constants.PROP_BUILD_DATE, 0)); } + public static int parseAndroidVersion(String versionString) { + // Parse android versions such as 8.1.0. + // Older updates still shows in ota requests. + Pattern pattern = Pattern.compile("(\\d+)\\.(\\d+)\\.(\\d+)"); + Matcher matcher = pattern.matcher(versionString); + return matcher.matches() ? Integer.parseInt(Objects.requireNonNull(matcher.group(1))) + : Float.valueOf(versionString).intValue(); + } + private static boolean processJsonFile(File inputJsonFile) throws IOException, JSONException { StringBuilder jsonBuilder = new StringBuilder(); try (BufferedReader br = new BufferedReader(new FileReader(inputJsonFile))) { @@ -199,7 +209,7 @@ public class Utils { JSONObject inputJsonObject = new JSONObject(jsonBuilder.toString()); JSONArray responseArray = inputJsonObject.getJSONArray("response"); Map entriesMap = new HashMap<>(); - int deviceAndroidVersion = Integer.parseInt(Build.VERSION.RELEASE); + int deviceAndroidVersion = parseAndroidVersion(Build.VERSION.RELEASE); for (int i = 0; i < responseArray.length(); i++) { JSONObject entry = responseArray.getJSONObject(i); @@ -207,7 +217,7 @@ public class Utils { long datetime = entry.getLong("datetime"); // Allow the latest update for current android. - if (Integer.parseInt(androidVersion) == deviceAndroidVersion) { + if (parseAndroidVersion(androidVersion) == deviceAndroidVersion) { if (!entriesMap.containsKey(androidVersion) || datetime > Objects.requireNonNull( entriesMap.get(androidVersion)).getLong("datetime")) { entriesMap.put(androidVersion, entry); @@ -217,7 +227,7 @@ public class Utils { } // Allow upgrade from next major release only. Allow to install initial build // for that major release and not the latest release. - } else if (Integer.parseInt(androidVersion) == deviceAndroidVersion + 1) { + } else if (parseAndroidVersion(androidVersion) == deviceAndroidVersion + 1) { if (!entriesMap.containsKey(androidVersion) || (((Build.TIME / 1000) < datetime) && (datetime < Objects.requireNonNull(entriesMap.get(androidVersion) ).getLong("datetime")))) { -- GitLab