Skip to content

Commit

Permalink
2.1.6
Browse files Browse the repository at this point in the history
Fix a bug with processing multiple split APKs at once with the option "Ask where to save the file each time" disabled
disable desugaring
clean up
  • Loading branch information
AbdurazaaqMohammed committed Jan 25, 2025
1 parent 995cc9c commit 52f5b7f
Show file tree
Hide file tree
Showing 15 changed files with 645 additions and 609 deletions.
7 changes: 3 additions & 4 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ android {
applicationId = "com.abdurazaaqmohammed.AntiSplit"
minSdk = 19
targetSdk = 35
versionCode = 43
versionName = "2.1.5"
versionCode = 44
versionName = "2.1.6"
multiDexEnabled = true
}

Expand All @@ -26,15 +26,14 @@ android {
}
}
compileOptions {
isCoreLibraryDesugaringEnabled = true
isCoreLibraryDesugaringEnabled = false
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
buildFeatures {
viewBinding = false
}
dependencies {
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.2")
implementation("com.google.android.material:material:1.12.0")
implementation(files("libs/APKEditor.jar"))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
import android.graphics.drawable.Drawable;

public class AppInfo {
String name;
public String name;
String packageName;
Drawable icon;
long lastUpdated;
long firstInstall;
public long lastUpdated;
public long firstInstall;

public AppInfo(String name, Drawable icon, String packageName, long lastUpdated, long firstInstall) {
this.name = name;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.abdurazaaqmohammed.AntiSplit.main;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
Expand All @@ -16,13 +15,13 @@
import java.util.List;

public class AppListArrayAdapter extends ArrayAdapter<AppInfo> implements Filterable {
private final Context context;
private final MainActivity context;
private final List<AppInfo> originalAppInfoList;
public List<AppInfo> filteredAppInfoList;
private final boolean showIcon;
private AppInfoFilter filter;

public AppListArrayAdapter(Context context, List<AppInfo> appInfoList, boolean showIcon) {
public AppListArrayAdapter(MainActivity context, List<AppInfo> appInfoList, boolean showIcon) {
super(context, R.layout.list_item, appInfoList);
this.context = context;
this.originalAppInfoList = new ArrayList<>(appInfoList);
Expand Down Expand Up @@ -55,7 +54,7 @@ public View getView(int position, View convertView, ViewGroup parent) {
if (showIcon) {
iconView.setImageDrawable(appInfo.icon);
iconView.setVisibility(View.VISIBLE);
iconView.setContentDescription(MainActivity.rss.getString(R.string.app_icon_list_label));
iconView.setContentDescription(context.getRss().getString(R.string.app_icon_list_label));
} else iconView.setVisibility(View.GONE);

return convertView;
Expand Down
916 changes: 390 additions & 526 deletions app/src/main/java/com/abdurazaaqmohammed/AntiSplit/main/MainActivity.java

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.abdurazaaqmohammed.AntiSplit.main;

import android.view.View;
import android.widget.TextView;

import androidx.core.widget.NestedScrollView;

import com.reandroid.apk.APKLogger;

public class MyAPKLogger implements APKLogger {
private final MainActivity mainActivity;
private final TextView logField;
private final NestedScrollView scrollView;

MyAPKLogger(MainActivity mainActivity, TextView logField, NestedScrollView scrollView) {
this.mainActivity = mainActivity;
this.logField = logField;
this.scrollView = scrollView;
}

@Override
public void logMessage(String s) {
if (mainActivity.logEnabled) {
mainActivity.getHandler().post(() -> logField.append(new StringBuilder(s).append('\n')));
scrollView.post(() -> scrollView.fullScroll(View.FOCUS_DOWN));
}
}

@Override
public void logError(String s, Throwable throwable) {
mainActivity.showError(throwable);
}

@Override
public void logVerbose(String s) {
logMessage(s);
}

public void logMessage(int resourceId) {
if (mainActivity.logEnabled) logMessage(mainActivity.getRss().getString(resourceId));
}
}
17 changes: 17 additions & 0 deletions app/src/main/java/com/abdurazaaqmohammed/utils/CompareUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.abdurazaaqmohammed.utils;

import com.abdurazaaqmohammed.AntiSplit.main.AppInfo;

import java.util.Locale;

public class CompareUtils {
public static int compareAppInfoByName(AppInfo p1, AppInfo p2) {
return p1.name.toLowerCase(Locale.ROOT).compareTo(p2.name.toLowerCase(Locale.ROOT));
}
public static int compareByName(String p1, String p2) {
return p1.toLowerCase(Locale.ROOT).compareTo(p2.toLowerCase(Locale.ROOT));
}
public long getSortField(AppInfo appInfo, int sortMode) {
return sortMode == 1 ? appInfo.lastUpdated : appInfo.firstInstall;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@
import android.text.TextUtils;
import android.util.DisplayMetrics;

import com.abdurazaaqmohammed.AntiSplit.main.MainActivity;
import com.j256.simplezip.ZipFileInput;
import com.j256.simplezip.format.ZipFileHeader;
import com.reandroid.archive.ArchiveFile;
import com.reandroid.archive.InputSource;
import com.starry.FileUtils;

import java.io.File;
Expand All @@ -20,24 +22,83 @@

public class DeviceSpecsUtil {

private final Context context;
private final MainActivity context;
public final String lang;
private final String densityType;
public static ArchiveFile zipFile = null;

public DeviceSpecsUtil(Context context) {
public DeviceSpecsUtil(MainActivity context) {
this.context = context;
this.lang = Locale.getDefault().getLanguage();
this.densityType = getDeviceDpi();
}

public List<String> getSplitsForDevice(Uri uri) throws IOException {
List<String> splits = getListOfSplits(uri);
switch (splits.size()) {
case 4:
case 3:
case 2:
splits.clear();
break;
default:
List<String> copy = List.copyOf(splits);
List<String> toRemove = new ArrayList<>();
boolean splitApkContainsArch = false;
for (int i = 0; i < splits.size(); i++) {
final String thisSplit = splits.get(i);
if (!splitApkContainsArch && DeviceSpecsUtil.isArch(thisSplit)) {
splitApkContainsArch = true;
}
if (shouldIncludeSplit(thisSplit))
toRemove.add(thisSplit);
}
if (splitApkContainsArch) {
boolean selectedSplitsContainsArch = false;
for (int i = 0; i < copy.size(); i++) {
final String thisSplit = copy.get(i);
if (DeviceSpecsUtil.isArch(thisSplit) && toRemove.contains(thisSplit)) {
selectedSplitsContainsArch = true;
break;
}
}
if (!selectedSplitsContainsArch) {
context.getLogger().logMessage("Could not find device architecture, selecting all architectures");
for (int i = 0; i < splits.size(); i++) {
final String thisSplit = splits.get(i);
if (DeviceSpecsUtil.isArch(thisSplit)) toRemove.add(thisSplit); // select all to be sure
}
}
}

boolean didNotFindDpi = true;
for (int i = 0; i < copy.size(); i++) {
String thisSplit = copy.get(i);
if (thisSplit.contains("dpi") && toRemove.contains(thisSplit)) {
didNotFindDpi = false;
break;
}
}
if (didNotFindDpi) {
for (int i = 0; i < splits.size(); i++) {
String thisSplit = splits.get(i);
if (thisSplit.contains("hdpi"))
toRemove.add(thisSplit);
}
}
splits.removeAll(toRemove);
}
return splits;
}

private List<String> getListOfSplitsFromFile(File file) throws IOException {
List<String> splits = new ArrayList<>();

// Do not close this ZipFile it could be used later in merger
(zipFile = new ArchiveFile(file)).createZipEntryMap().forEach(inputSource -> {
for(InputSource inputSource : (zipFile = new ArchiveFile(file)).getInputSources()) {
String name = inputSource.getName();
if (name.endsWith(".apk")) splits.add(name);
});
}

return splits;
}
Expand Down Expand Up @@ -72,8 +133,7 @@ public static boolean isArch(String thisSplit) {
}

public static boolean isBaseApk(String name) {
return name.equals("base.apk")
|| !name.startsWith("config") && !name.startsWith("split"); // this is base.apk hopefully
return name.equals("base.apk") || !name.startsWith("config") && !name.startsWith("split"); // this is base.apk hopefully
}

public boolean shouldIncludeSplit(String name) {
Expand Down
17 changes: 16 additions & 1 deletion app/src/main/java/com/abdurazaaqmohammed/utils/FileUtils.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package com.abdurazaaqmohammed.utils;


import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Environment;

import org.apache.commons.io.FilenameUtils;

Expand All @@ -28,7 +32,7 @@ public static File getUnusedFile(File file) {
i++;
String fileName = file.getName();
String extension = FilenameUtils.getExtension(fileName);
file = new File(file.getParentFile(), fileName.replace(extension, "").replaceFirst("_\\d+$", "") + '_' + i + '.' + extension);
file = new File(file.getParentFile(), fileName.replace('.' + extension, "").replaceFirst("_\\d+$", "") + '_' + i + '.' + extension);
}
return file;
}
Expand Down Expand Up @@ -83,4 +87,15 @@ public static OutputStream getOutputStream(File file) throws IOException {
StreamBackups.getOutputStream(file)
: new FileOutputStream(file);
}

public static boolean doesNotHaveStoragePerm(Context context) {
return Build.VERSION.SDK_INT > 22 && (LegacyUtils.supportsWriteExternalStorage ?
context.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED :
!Environment.isExternalStorageManager());
}

public static File getAntisplitMFolder() {
final File antisplitMFolder = new File(Environment.getExternalStorageDirectory(), "AntiSplit-M");
return antisplitMFolder.exists() || antisplitMFolder.mkdir() ? antisplitMFolder : new File(Environment.getExternalStorageDirectory(), "Download");
}
}
38 changes: 38 additions & 0 deletions app/src/main/java/com/abdurazaaqmohammed/utils/LanguageUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.abdurazaaqmohammed.utils;

import android.content.res.Resources;
import android.widget.ScrollView;
import android.widget.TextView;

import com.abdurazaaqmohammed.AntiSplit.R;
import com.abdurazaaqmohammed.AntiSplit.main.MainActivity;
import com.google.android.material.textfield.TextInputLayout;

public class LanguageUtil {
public static void updateLang(Resources res, ScrollView settingsDialog, MainActivity context) {
updateMain(res, context);
updateSettingsDialog(settingsDialog, res);
}

public static void updateMain(Resources res, MainActivity context) {
context.<TextView>findViewById(R.id.decodeButton).setText(res.getString(R.string.merge));
context.<TextView>findViewById(R.id.fromAppsButton).setText(res.getString(R.string.select_from_installed_apps));
context.findViewById(R.id.settingsButton).setContentDescription(res.getString(R.string.settings));
context.findViewById(R.id.installButton).setContentDescription(res.getString(R.string.install));
context.findViewById(R.id.cancelButton).setContentDescription(res.getString(R.string.cancel));
context.findViewById(R.id.copyButton).setContentDescription(res.getString(R.string.copy_log));
}

public static void updateSettingsDialog(ScrollView settingsDialog, Resources res) {
((TextView) settingsDialog.findViewById(R.id.langPicker)).setText(res.getString(R.string.lang));
((TextView) settingsDialog.findViewById(R.id.logToggle)).setText(res.getString(R.string.enable_logs));
((TextView) settingsDialog.findViewById(R.id.ask)).setText(res.getString(R.string.ask));
((TextView) settingsDialog.findViewById(R.id.showDialogToggle)).setText(res.getString(R.string.show_dialog));
((TextView) settingsDialog.findViewById(R.id.signToggle)).setText(res.getString(R.string.sign_apk));
((TextView) settingsDialog.findViewById(R.id.forceToggle)).setText(res.getString(R.string.force));
((TextView) settingsDialog.findViewById(R.id.selectSplitsForDeviceToggle)).setText(res.getString(R.string.automatically_select));
((TextView) settingsDialog.findViewById(R.id.updateToggle)).setText(res.getString(R.string.auto_update));
((TextView) settingsDialog.findViewById(R.id.checkUpdateNow)).setText(res.getString(R.string.check_update_now));
((TextInputLayout) settingsDialog.findViewById(R.id.suffixLayout)).setHint(res.getString(R.string.suffix));
}
}
6 changes: 6 additions & 0 deletions app/src/main/java/com/abdurazaaqmohammed/utils/RunUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,12 @@ public RunUtil(Handler handler, MainActivity context, CharSequence msg) {
this.msg = msg;
}

public static void runInBackground(Runnable runnable) {
try {
Executors.newSingleThreadExecutor().submit(runnable).get();
} catch (Exception ignored) { }
}

public void runInBackground(Callable<Boolean> callable) {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Boolean> future = executor.submit(callable);
Expand Down
8 changes: 4 additions & 4 deletions app/src/main/java/com/abdurazaaqmohammed/utils/SignUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,8 @@ public static void signDebugKey(Context c, File inputApk, File output) throws IO
signDebugKey(c, inputApk, output, true, true, true);
}

public static void signPseudoApkSigner(File temp, Context context, Uri out, Exception e) throws IOException {
String msg = com.abdurazaaqmohammed.AntiSplit.main.MainActivity.rss.getString(R.string.sign_failed);
public static void signPseudoApkSigner(File temp, MainActivity context, Uri out, Exception e) throws IOException {
String msg = context.getRss().getString(R.string.sign_failed);
if(Build.VERSION.SDK_INT < 30) {
// When I tried signing with apksig in AVD with sdk 10 java.security is throwing some error saying something not found
// Apparently 11 is the last version that supports v1 signing alone.
Expand All @@ -81,14 +81,14 @@ public static void signPseudoApkSigner(File temp, Context context, Uri out, Exce
PseudoApkSigner.sign(is, os, pastFile, privateKeyFile);
}
} catch (Exception e2) {
MainActivity.logger.logMessage(msg);
context.getLogger().logMessage(msg);
try(OutputStream os = FileUtils.getOutputStream(out, context)) {
com.abdurazaaqmohammed.utils.FileUtils.copyFile(temp, os);
}
throw(new RuntimeException(msg, e)); // for showError
}
} else {
MainActivity.logger.logMessage(msg);
context.getLogger().logMessage(msg);
try(OutputStream os = FileUtils.getOutputStream(out, context)) {
com.abdurazaaqmohammed.utils.FileUtils.copyFile(temp, os);
}
Expand Down
6 changes: 3 additions & 3 deletions app/src/main/java/com/fom/storage/media/AndroidXI.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import android.app.RecoverableSecurityException;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.IntentSender;
import android.database.Cursor;
import android.net.Uri;
Expand All @@ -15,6 +14,7 @@
import androidx.activity.result.IntentSenderRequest;


import com.abdurazaaqmohammed.AntiSplit.main.MainActivity;
import com.abdurazaaqmohammed.utils.FileUtils;

import java.io.IOException;
Expand All @@ -37,13 +37,13 @@
*/
public class AndroidXI {

private Context context;
private MainActivity context;

public static AndroidXI getInstance() {
return new AndroidXI();
}

public AndroidXI with(Context context) {
public AndroidXI with(MainActivity context) {
this.context = context;
return this;
}
Expand Down
Loading

0 comments on commit 52f5b7f

Please sign in to comment.