From a5a7ceef1f5e55b9767fc2ebe4e5bddf067359fa Mon Sep 17 00:00:00 2001 From: althafvly Date: Tue, 9 Jan 2024 21:43:29 +0530 Subject: [PATCH 1/2] Revert "Updater: hide local update" This reverts commit 9fc7a146b644cf54ffc253a5cc1f73e59604bb90. --- app/src/main/res/menu/menu_toolbar.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/res/menu/menu_toolbar.xml b/app/src/main/res/menu/menu_toolbar.xml index 88d193e4..9b97c5f9 100644 --- a/app/src/main/res/menu/menu_toolbar.xml +++ b/app/src/main/res/menu/menu_toolbar.xml @@ -9,7 +9,6 @@ Date: Wed, 10 Jan 2024 12:32:07 +0530 Subject: [PATCH 2/2] Updater: /e/ changes for local update --- .../org/lineageos/updater/UpdateImporter.java | 96 ++++++++++++++++--- 1 file changed, 85 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/lineageos/updater/UpdateImporter.java b/app/src/main/java/org/lineageos/updater/UpdateImporter.java index 791c5244..f79964fd 100644 --- a/app/src/main/java/org/lineageos/updater/UpdateImporter.java +++ b/app/src/main/java/org/lineageos/updater/UpdateImporter.java @@ -18,18 +18,19 @@ package org.lineageos.updater; import android.annotation.SuppressLint; import android.app.Activity; +import android.content.ContentResolver; import android.content.Intent; +import android.database.Cursor; import android.net.Uri; +import android.os.Build; import android.os.ParcelFileDescriptor; +import android.provider.OpenableColumns; import android.util.Log; -import org.json.JSONException; import org.lineageos.updater.controller.UpdaterController; -import org.lineageos.updater.controller.UpdaterService; import org.lineageos.updater.misc.StringGenerator; import org.lineageos.updater.misc.Utils; import org.lineageos.updater.model.Update; -import org.lineageos.updater.model.UpdateInfo; import org.lineageos.updater.model.UpdateStatus; import java.io.File; @@ -41,7 +42,9 @@ import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.text.DateFormat; import java.util.Enumeration; -import java.util.List; +import java.util.Objects; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -52,11 +55,13 @@ public class UpdateImporter { private static final String FILE_NAME = "localUpdate.zip"; private static final String METADATA_PATH = "META-INF/com/android/metadata"; private static final String METADATA_TIMESTAMP_KEY = "post-timestamp="; + private static final String METADATA_ANDROID_SDK_KEY = "post-sdk-level="; private final Activity activity; private final Callbacks callbacks; private Thread workingThread; + private String filename; public UpdateImporter(Activity activity, Callbacks callbacks) { this.activity = activity; @@ -93,6 +98,7 @@ public class UpdateImporter { File importedFile = null; try { importedFile = importFile(uri); + filename = getFileNameFromUri(uri); verifyPackage(importedFile); final Update update = buildLocalUpdate(importedFile); @@ -112,6 +118,29 @@ public class UpdateImporter { return true; } + public String getFileNameFromUri(Uri uri) { + String fileName = null; + if (Objects.equals(uri.getScheme(), "content")) { + ContentResolver contentResolver = activity.getContentResolver(); + Cursor cursor = contentResolver.query(uri, null, null, null, null); + if (cursor != null) { + try { + if (cursor.moveToFirst()) { + int displayNameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); + if (displayNameIndex != -1) { + fileName = cursor.getString(displayNameIndex); + } + } + } finally { + cursor.close(); + } + } + } else if (Objects.equals(uri.getScheme(), "file")) { + fileName = uri.getLastPathSegment(); + } + return fileName; + } + @SuppressLint("SetWorldReadable") @SuppressWarnings("ResultOfMethodCallIgnored") private File importFile(Uri uri) throws IOException { @@ -149,8 +178,18 @@ public class UpdateImporter { final long timeStamp = getTimeStamp(file); final String buildDate = StringGenerator.getDateLocalizedUTC( activity, DateFormat.MEDIUM, timeStamp); - final String name = activity.getString(R.string.local_update_name); + String name = activity.getString(R.string.local_update_name); + final String androidVersion = getAndroidVersion(file); final Update update = new Update(); + + if (filename != null) { + Pattern pattern = Pattern.compile("-(\\d+\\.\\d+(\\.\\d+)?)"); + Matcher matcher = pattern.matcher(filename); + if (matcher.find()) { + name = matcher.group(1); + } + } + update.setAvailableOnline(false); update.setName(name); update.setFile(file); @@ -160,6 +199,8 @@ public class UpdateImporter { update.setStatus(UpdateStatus.VERIFIED); update.setPersistentStatus(UpdateStatus.Persistent.VERIFIED); update.setVersion(String.format("%s (%s)", name, buildDate)); + update.setAndroidVersion(androidVersion); + update.setDisplayVersion(name); return update; } @@ -183,25 +224,58 @@ public class UpdateImporter { } private long getTimeStamp(File file) { + String timeStamp = getFromMetadata(file, METADATA_TIMESTAMP_KEY); + if (timeStamp != null) { + return Long.parseLong(timeStamp); + } + return System.currentTimeMillis(); + } + + private String getAndroidVersion(File file) { + String sdkInt = getFromMetadata(file, METADATA_ANDROID_SDK_KEY); + if (sdkInt != null) { + return getAndroidVersionFromSDKInt(Integer.parseInt(sdkInt)); + } + return String.valueOf(Build.VERSION.RELEASE); + } + + public static String getAndroidVersionFromSDKInt(int sdkInt) { + switch (sdkInt) { + case Build.VERSION_CODES.Q: + return "10"; + case Build.VERSION_CODES.R: + return "11"; + case Build.VERSION_CODES.S: + case Build.VERSION_CODES.S_V2: + return "12"; + case Build.VERSION_CODES.TIRAMISU: + return "13"; + case 34: // Build.VERSION_CODES.UPSIDE_DOWN_CAKE + return "14"; + default: + return Build.VERSION.RELEASE; + } + } + + private String getFromMetadata(File file, String key) { try { final String metadataContent = readZippedFile(file, METADATA_PATH); final String[] lines = metadataContent.split("\n"); for (String line : lines) { - if (!line.startsWith(METADATA_TIMESTAMP_KEY)) { + if (!line.startsWith(key)) { continue; } - final String timeStampStr = line.replace(METADATA_TIMESTAMP_KEY, ""); - return Long.parseLong(timeStampStr); + return line.replace(key, ""); } } catch (IOException e) { Log.e(TAG, "Failed to read date from local update zip package", e); } catch (NumberFormatException e) { - Log.e(TAG, "Failed to parse timestamp number from zip metadata file", e); + Log.e(TAG, "Failed to parse from zip metadata file", e); } - Log.e(TAG, "Couldn't find timestamp in zip file, falling back to $now"); - return System.currentTimeMillis(); + Log.e(TAG, "Couldn't find metadata in zip file, falling back to 0"); + return null; } private String readZippedFile(File file, String path) throws IOException { -- GitLab