Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8f5e0709 authored by Mohammed Althaf T's avatar Mohammed Althaf T 😊
Browse files

Merge branch '6006-r-latest_update' into 'v1-r'

Updater: process the json file to avoid multiple updates

See merge request !149
parents 8f235884 fb7bf821
Loading
Loading
Loading
Loading
+68 −0
Original line number Diff line number Diff line
@@ -55,12 +55,15 @@ 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.Matcher;
@@ -208,10 +211,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<String, JSONObject> entriesMap = new HashMap<>();
        int deviceAndroidVersion = parseAndroidVersion(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 (parseAndroidVersion(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 (parseAndroidVersion(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<UpdateInfo> parseJson(File file, boolean compatibleOnly)
            throws IOException, JSONException {
        List<UpdateInfo> updates = new ArrayList<>();

        if (processJsonFile(file)) {
            Log.d(TAG, "Ignored incompatible updates");
        }

        StringBuilder json = new StringBuilder();
        try (BufferedReader br = new BufferedReader(new FileReader(file))) {
            for (String line; (line = br.readLine()) != null;) {