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

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

Revert "Updater: process the json file to avoid multiple updates"

This reverts commit 11dce935.
parent f4b3d3d8
Loading
Loading
Loading
Loading
+0 −80
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ 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;
@@ -53,18 +52,13 @@ 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;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
@@ -189,84 +183,10 @@ 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))) {
            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");
        }

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