From 7a00f663a93289ccb83e6c98fcbd770355018095 Mon Sep 17 00:00:00 2001 From: aiselp Date: Thu, 7 Aug 2025 19:29:18 +0800 Subject: [PATCH] ui fix,add ariaNg --- app/.gitignore | 1 + app/build.gradle | 25 ++- app/src/main/AndroidManifest.xml | 9 +- .../gianlu/aria2android/AriaNgActivity.java | 70 ++++++ .../com/gianlu/aria2android/BastActivity.java | 6 + .../aria2android/ConfigEditorActivity.java | 205 ++++++++++++++++++ .../com/gianlu/aria2android/MainActivity.java | 7 +- .../main/res/drawable-anydpi/ic_ariang.xml | 21 ++ app/src/main/res/drawable-hdpi/ic_ariang.png | Bin 0 -> 557 bytes app/src/main/res/drawable-mdpi/ic_ariang.png | Bin 0 -> 392 bytes app/src/main/res/drawable-xhdpi/ic_ariang.png | Bin 0 -> 758 bytes .../main/res/drawable-xxhdpi/ic_ariang.png | Bin 0 -> 1145 bytes app/src/main/res/layout/ariang_layout.xml | 13 ++ app/src/main/res/layout/config_editor.xml | 20 ++ app/src/main/res/menu/main.xml | 5 + app/src/main/res/values-night/styles.xml | 3 +- app/src/main/res/values/strings.xml | 1 + app/src/main/res/values/styles.xml | 12 +- 18 files changed, 390 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/com/gianlu/aria2android/AriaNgActivity.java create mode 100644 app/src/main/java/com/gianlu/aria2android/BastActivity.java create mode 100644 app/src/main/java/com/gianlu/aria2android/ConfigEditorActivity.java create mode 100644 app/src/main/res/drawable-anydpi/ic_ariang.xml create mode 100644 app/src/main/res/drawable-hdpi/ic_ariang.png create mode 100644 app/src/main/res/drawable-mdpi/ic_ariang.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_ariang.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_ariang.png create mode 100644 app/src/main/res/layout/ariang_layout.xml create mode 100644 app/src/main/res/layout/config_editor.xml diff --git a/app/.gitignore b/app/.gitignore index 796b96d1..e8d6c3ff 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1 +1,2 @@ /build +src/main/assets/ariang \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 4f011098..1bc38d60 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,6 +2,7 @@ import com.github.triplet.gradle.androidpublisher.ReleaseStatus plugins { id 'com.github.triplet.play' version '3.12.1' + id 'de.undercouch.download' version '5.6.0' } apply plugin: 'com.android.application' @@ -21,6 +22,9 @@ android { versionCode 77 versionName "2.7.0" } + buildFeatures { + viewBinding true + } if (isCi) { signingConfigs { @@ -88,6 +92,7 @@ android { useLegacyPackaging = true } } + compileSdk 36 } play { @@ -108,4 +113,22 @@ dependencies { } } -apply plugin: 'com.google.gms.google-services' \ No newline at end of file +apply plugin: 'com.google.gms.google-services' + +tasks.register('downloadAriaNg', Download) { + src 'https://github.com/mayswind/AriaNg/releases/download/1.3.11/AriaNg-1.3.11-AllInOne.zip' + dest layout.buildDirectory.file('AriaNg-1.3.11-AllInOne.zip') + overwrite false +} + +tasks.register('installAriaNg', Copy) { + dependsOn downloadAriaNg + from zipTree(tasks.downloadAriaNg.dest) + into project.file('src/main/assets/ariang') +} +tasks.named("preBuild").configure { + dependsOn tasks.installAriaNg +} +tasks.named('clean').configure { + delete project.file('src/main/assets/ariang') +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index acaaf39f..87a4ff97 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,6 +11,7 @@ + @@ -30,6 +31,7 @@ android:label="@string/app_name" android:resizeableActivity="true" android:supportsRtl="true" + android:usesCleartextTraffic="true" android:theme="@style/AppTheme" tools:ignore="GoogleAppIndexingWarning"> @@ -64,11 +66,16 @@ + - + onBackPressed()); + + getMenuInflater().inflate(R.menu.aria2lib_config_editor, binding.toolbar.getMenu()); + binding.toolbar.setOnMenuItemClickListener(this::onOptionsItemSelected); + setNight(); + + rmv.linearLayoutManager(RecyclerView.VERTICAL, false); + rmv.dividerDecoration(RecyclerView.VERTICAL); + adapter = new SimpleOptionsAdapter(this, this); + rmv.loadListData(adapter); + + try { + load(); + } catch (JSONException ex) { + Log.e(TAG, "Failed loading JSON.", ex); + Toaster.with(this).message(R.string.failedLoadingOptions).show(); + onBackPressed(); + } + } + + private void setNight() { + boolean b = Prefs.getBoolean(CommonPK.NIGHT_MODE, false); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + View decor = getWindow().getDecorView(); + int flags = decor.getSystemUiVisibility(); + if (!b) { + flags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; + } else { + flags &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; + } + decor.setSystemUiVisibility(flags); + } + } + + private void save() { + try { + JsonStoring.intoPrefs().putJsonObject(Aria2PK.CUSTOM_OPTIONS, ImportExportUtils.toJson(adapter.get())); + adapter.saved(); + } catch (JSONException ex) { + Log.e(TAG, "Failed saving JSON.", ex); + Toaster.with(this).message(R.string.failedSavingCustomOptions).show(); + } + } + + @SuppressLint("InflateParams") + private void showAddDialog() { + LinearLayout layout = (LinearLayout) getLayoutInflater().inflate(R.layout.aria2lib_dialog_new_option, null, false); + TextInputLayout key = layout.findViewById(R.id.editOptionDialog_key); + TextInputLayout value = layout.findViewById(R.id.editOptionDialog_value); + + MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this); + builder.setTitle(R.string.newOption).setView(layout) + .setPositiveButton(R.string.apply, (dialogInterface, i) -> { + String keyStr = CommonUtils.getText(key); + if (keyStr.startsWith("--")) keyStr = keyStr.substring(2); + adapter.add(new Pair<>(keyStr, CommonUtils.getText(value))); + }).setNegativeButton(android.R.string.cancel, null); + + showDialog(builder); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == IMPORT_CODE) { + if (resultCode == Activity.RESULT_OK && data.getData() != null) { + try { + InputStream in = getContentResolver().openInputStream(data.getData()); + if (in == null || adapter == null) return; + + try { + adapter.add(ImportExportUtils.readConfigFromStream(in)); + } catch (IOException | OutOfMemoryError ex) { + Toaster.with(this).message(R.string.cannotImport).show(); + } + } catch (FileNotFoundException ex) { + Toaster.with(this).message(R.string.fileNotFound).show(); + } + } + } else { + super.onActivityResult(requestCode, resultCode, data); + } + } + + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + int id = item.getItemId(); + if (id == R.id.configEditor_add) { + showAddDialog(); + return true; + } else if (id == android.R.id.home) { + if (adapter.hasChanged()) { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(R.string.unsavedChanges) + .setMessage(R.string.unsavedChanges_message) + .setPositiveButton(R.string.yes, (dialogInterface, i) -> { + save(); + onBackPressed(); + }) + .setNegativeButton(R.string.no, (dialogInterface, i) -> onBackPressed()) + .setNeutralButton(android.R.string.cancel, null); + + showDialog(builder); + } else { + onBackPressed(); + } + + return true; + } else if (id == R.id.configEditor_import) { + try { + startActivityForResult(Intent.createChooser(ImportExportUtils.createConfigImportIntent(), getString(R.string.importConfig)), IMPORT_CODE); + } catch (ActivityNotFoundException ex) { + Toaster.with(this).message(R.string.missingFileExplorer).show(); + } + return true; + } else if (id == R.id.configEditor_done) { + save(); + onBackPressed(); + return true; + } + + return super.onOptionsItemSelected(item); + } + + @Override + @SuppressLint("InflateParams") + public void onEditOption(@NonNull Pair option) { + FrameLayout layout = (FrameLayout) getLayoutInflater().inflate(R.layout.aria2lib_dialog_edit_option, null, false); + TextInputLayout newValue = layout.findViewById(R.id.editOptionDialog_value); + CommonUtils.setText(newValue, option.second); + + MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this); + builder.setTitle(option.first) + .setView(layout) + .setPositiveButton(R.string.apply, (dialogInterface, i) -> { + String newValueStr = CommonUtils.getText(newValue); + if (!newValueStr.equals(option.second)) + adapter.set(new Pair<>(option.first, newValueStr)); + }) + .setNegativeButton(android.R.string.cancel, null); + + showDialog(builder); + } + + @Override + public void onItemsCountChanged(int count) { + if (count <= 0) rmv.showInfo(R.string.noCustomOptions); + else rmv.showList(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gianlu/aria2android/MainActivity.java b/app/src/main/java/com/gianlu/aria2android/MainActivity.java index 3eb0dba2..3b845a05 100644 --- a/app/src/main/java/com/gianlu/aria2android/MainActivity.java +++ b/app/src/main/java/com/gianlu/aria2android/MainActivity.java @@ -11,9 +11,7 @@ import com.gianlu.aria2lib.BadEnvironmentException; import com.gianlu.aria2lib.ui.Aria2ConfigurationScreen; -import com.gianlu.aria2lib.ui.ConfigEditorActivity; import com.gianlu.aria2lib.ui.ImportExportUtils; -import com.gianlu.commonutils.dialogs.ActivityWithDialog; import com.gianlu.commonutils.preferences.Prefs; import com.google.android.material.bottomappbar.BottomAppBar; import com.google.android.material.dialog.MaterialAlertDialogBuilder; @@ -21,7 +19,7 @@ import java.io.IOException; -public class MainActivity extends ActivityWithDialog implements ControlActivityDelegate.UpdateToggle { +public class MainActivity extends BastActivity implements ControlActivityDelegate.UpdateToggle { private static final String TAG = MainActivity.class.getSimpleName(); private ControlActivityDelegate delegate; private FloatingActionButton toggleServer; @@ -112,6 +110,9 @@ public boolean onCreateOptionsMenu(Menu menu) { @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { + case R.id.mainMenu_ariaNg: + startActivity(new Intent(this, AriaNgActivity.class)); + return true; case R.id.mainMenu_preferences: startActivity(new Intent(this, PreferenceActivity.class)); return true; diff --git a/app/src/main/res/drawable-anydpi/ic_ariang.xml b/app/src/main/res/drawable-anydpi/ic_ariang.xml new file mode 100644 index 00000000..40954fcd --- /dev/null +++ b/app/src/main/res/drawable-anydpi/ic_ariang.xml @@ -0,0 +1,21 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/ic_ariang.png b/app/src/main/res/drawable-hdpi/ic_ariang.png new file mode 100644 index 0000000000000000000000000000000000000000..ec11088d0dbc699e9b137c5f14f7f513c42ce46b GIT binary patch literal 557 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 LNkvXXu0mjfs!tP~ literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/ariang_layout.xml b/app/src/main/res/layout/ariang_layout.xml new file mode 100644 index 00000000..9ff5a5a3 --- /dev/null +++ b/app/src/main/res/layout/ariang_layout.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/config_editor.xml b/app/src/main/res/layout/config_editor.xml new file mode 100644 index 00000000..b12a02b4 --- /dev/null +++ b/app/src/main/res/layout/config_editor.xml @@ -0,0 +1,20 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/main.xml b/app/src/main/res/menu/main.xml index e798f23b..fcefa3bf 100644 --- a/app/src/main/res/menu/main.xml +++ b/app/src/main/res/menu/main.xml @@ -8,6 +8,11 @@ android:title="@string/customOptions" app:showAsAction="ifRoom" /> + + - + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 802df219..a30db06b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -13,4 +13,5 @@ Aria2App will not provide the same functionalities of this app, but all-in-one. You are encouraged to migrate to Aria2App only if you were using the service on this device only. This app will be kept updated and working as usual. Missing executable You have installed the app correctly, but it looks like Android didn\'t extract the native libraries for this app. + AriaNg diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index f37c744f..40ad813f 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,6 +1,14 @@ - + - + +