16 Commits

Author SHA1 Message Date
shihaam d297ab1059 new version 1.3 2026-03-11 11:13:22 +05:00
shihaam 371e38dc2f show dynamic path 2026-03-11 11:10:26 +05:00
shihaam 1e850a2d1a fix path typos 2026-03-11 11:08:28 +05:00
shihaam 4cd9202609 fix app name, update version no, update images 2026-03-11 01:04:19 +05:00
shihaam 6becf2907e fix app name, update version no, update images 2026-03-11 01:01:15 +05:00
shihaam c34900a2b1 Add SPDX license headers to source files 2026-03-10 23:46:43 +05:00
shihaam f654ba52a1 Add SPDX license headers to source files 2026-03-10 23:42:40 +05:00
shihaam e7735a0446 script to build isodrive 2026-03-10 21:15:17 +05:00
shihaam 1e0d5dd640 script to pull precompiled binaries 2026-03-10 20:07:25 +05:00
shihaam 2672f8dfa5 copy actual images back to where it belong 2026-03-10 18:20:17 +05:00
shihaam 157f5103f1 prep for fdroid release 2026-03-10 18:15:39 +05:00
shihaam bcf0ffec4c remove deprecated 2026-03-10 17:25:31 +05:00
shihaam 8a08b31f32 1.1 release: new icon 2026-03-10 17:23:30 +05:00
shihaam b974fd1b2b create and update logo 2026-03-10 17:21:14 +05:00
shihaam 881bb70e99 update docs 2026-03-10 16:47:52 +05:00
shihaam a0012b4d5e credit svgrepo 2026-03-10 15:49:57 +05:00
54 changed files with 610 additions and 215 deletions
+35
View File
@@ -0,0 +1,35 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.3] - 2025-03-11
### Changed
- Fix default image dir to be /sdcard/isodroid instead of /sdcard/isodrive
## [1.2] - 2025-03-10
### Changed
- Fix app name displaying as "ISO Drive" instead of "ISO Droid" in some places
## [1.1] - 2025-03-10
### Changed
- New app icon
## [1.0] - 2025-03-10
### Added
- Mount ISO/IMG files as USB mass storage or CD-ROM
- Create blank IMG files for writable USB drives
- Read-only or read-write mount options
- Persistent notification with quick unmount button
- OS-specific icons for popular distributions (Linux, BSD, etc.)
- Download links to popular operating systems (Linux, BSD, Windows, Recovery tools)
- Rename and delete files
- Material 3 dynamic theming with dark mode support
- Support for Magisk, KernelSU, and APatch root solutions
- Bundled isodrive binary for all architectures (arm64-v8a, armeabi-v7a, x86_64, x86)
+5 -7
View File
@@ -4,11 +4,9 @@ Android app for mounting ISO/IMG files as USB mass storage or CD-ROM devices on
## Screenshots ## Screenshots
| OS images listing | Mounted Status | Mount Options Dialog | | OS images listing | Mounted Status | Mount Options Dialog | Create IMG Dialog | Download OS ISOs |
|:--:|:--:|:--:| |:--:|:--:|:--:|:--:|:--:|
| ![File Browser](docs/screenshots/list_images_home.jpg) | ![Mounted Status](docs/screenshots/mounted_status_home.jpg) | ![Mount Options](docs/screenshots/mount_options_dialogbox.jpg) | | ![File Browser](docs/screenshots/list_images_home.jpg) | ![Mounted Status](docs/screenshots/mounted_status_home.jpg) | ![Mount Options](docs/screenshots/mount_options_dialogbox.jpg) | ![Create IMG](docs/screenshots/create_img_digalogbox.jpg) | ![Download ISOs](docs/screenshots/list_listing_download.jpg) |
| **Create IMG Dialog** | **Download OS ISOs** | |
| ![Create IMG](docs/screenshots/create_img_digalogbox.jpg) | ![Download ISOs](docs/screenshots/list_listing_download.jpg) | |
## Features ## Features
@@ -37,7 +35,7 @@ Android app for mounting ISO/IMG files as USB mass storage or CD-ROM devices on
1. Download the APK from the links above 1. Download the APK from the links above
2. Install the APK on your rooted Android device 2. Install the APK on your rooted Android device
3. Grant root access when prompted 3. Grant root access when prompted
4. Place your ISO/IMG files in `/sdcard/isodrive/` (or configure a different directory in settings) 4. Place your ISO/IMG files in `/sdcard/isodroid/` (or configure a different directory in settings)
> **Note**: The app includes a bundled `isodrive` binary. No additional setup required! > **Note**: The app includes a bundled `isodrive` binary. No additional setup required!
@@ -65,7 +63,7 @@ Android app for mounting ISO/IMG files as USB mass storage or CD-ROM devices on
- [isodrive](https://github.com/nitanmarcel/isodrive) by nitanmarcel - The CLI tool that powers ISO Droid - [isodrive](https://github.com/nitanmarcel/isodrive) by nitanmarcel - The CLI tool that powers ISO Droid
- [ISODriveUT](https://github.com/fredldotme/ISODriveUT) by fredldotme - Original inspiration for isodrive - [ISODriveUT](https://github.com/fredldotme/ISODriveUT) by fredldotme - Original inspiration for isodrive
- OS icons from [Simple Icons](https://simpleicons.org/) - OS icons from [Simple Icons](https://simpleicons.org/) and [SVG Repo](https://www.svgrepo.com/)
## License ## License
+1 -1
View File
@@ -13,7 +13,7 @@ android {
minSdk = 26 minSdk = 26
targetSdk = 36 targetSdk = 36
versionCode = 1 versionCode = 1
versionName = "1.0" versionName = "1.3"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
} }
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid package sh.sar.isodroid
import android.app.Application import android.app.Application
@@ -12,7 +17,7 @@ class ISODroidApp : Application() {
Shell.enableVerboseLogging = BuildConfig.DEBUG Shell.enableVerboseLogging = BuildConfig.DEBUG
Shell.setDefaultBuilder( Shell.setDefaultBuilder(
Shell.Builder.create() Shell.Builder.create()
.setFlags(Shell.FLAG_MOUNT_MASTER or Shell.FLAG_REDIRECT_STDERR) .setFlags(Shell.FLAG_MOUNT_MASTER)
.setTimeout(10) .setTimeout(10)
) )
} }
@@ -23,7 +28,7 @@ class ISODroidApp : Application() {
Shell.enableVerboseLogging = true Shell.enableVerboseLogging = true
Shell.setDefaultBuilder( Shell.setDefaultBuilder(
Shell.Builder.create() Shell.Builder.create()
.setFlags(Shell.FLAG_MOUNT_MASTER or Shell.FLAG_REDIRECT_STDERR) .setFlags(Shell.FLAG_MOUNT_MASTER)
.setTimeout(10) .setTimeout(10)
) )
} }
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid package sh.sar.isodroid
import android.content.Context import android.content.Context
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.data package sh.sar.isodroid.data
import java.io.File import java.io.File
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.data package sh.sar.isodroid.data
data class MountOptions( data class MountOptions(
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.data package sh.sar.isodroid.data
enum class MountType { enum class MountType {
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.isodrive package sh.sar.isodroid.isodrive
import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableSharedFlow
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.isodrive package sh.sar.isodroid.isodrive
import android.content.Context import android.content.Context
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.isodrive package sh.sar.isodroid.isodrive
import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableSharedFlow
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.notification package sh.sar.isodroid.notification
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.notification package sh.sar.isodroid.notification
import android.app.NotificationChannel import android.app.NotificationChannel
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.notification package sh.sar.isodroid.notification
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.root package sh.sar.isodroid.root
import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.Shell
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.ui.components package sh.sar.isodroid.ui.components
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.ui.components package sh.sar.isodroid.ui.components
import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.ExperimentalFoundationApi
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.ui.components package sh.sar.isodroid.ui.components
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.ui.components package sh.sar.isodroid.ui.components
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.ui.components package sh.sar.isodroid.ui.components
import androidx.compose.foundation.background import androidx.compose.foundation.background
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.ui.screens package sh.sar.isodroid.ui.screens
import android.content.Context import android.content.Context
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.ui.screens package sh.sar.isodroid.ui.screens
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
@@ -84,7 +89,7 @@ fun MainScreen(
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( TopAppBar(
title = { Text("ISO Drive") }, title = { Text("ISO Droid") },
colors = TopAppBarDefaults.topAppBarColors( colors = TopAppBarDefaults.topAppBarColors(
containerColor = MaterialTheme.colorScheme.primaryContainer, containerColor = MaterialTheme.colorScheme.primaryContainer,
titleContentColor = MaterialTheme.colorScheme.onPrimaryContainer titleContentColor = MaterialTheme.colorScheme.onPrimaryContainer
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.ui.screens package sh.sar.isodroid.ui.screens
import android.Manifest import android.Manifest
@@ -226,11 +231,11 @@ fun SettingsScreen(
Spacer(modifier = Modifier.width(12.dp)) Spacer(modifier = Modifier.width(12.dp))
Column { Column {
Text( Text(
text = "ISO Drive", text = "ISO Droid",
style = MaterialTheme.typography.titleMedium style = MaterialTheme.typography.titleMedium
) )
Text( Text(
text = "Version 1.0", text = "Version 1.2",
style = MaterialTheme.typography.bodySmall, style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant color = MaterialTheme.colorScheme.onSurfaceVariant
) )
@@ -254,13 +259,13 @@ fun SettingsScreen(
color = MaterialTheme.colorScheme.primary color = MaterialTheme.colorScheme.primary
) )
Text( Text(
text = "git.shihaam.dev/shihaam/ISODrive", text = "git.shihaam.dev/shihaam/ISODroid",
style = MaterialTheme.typography.bodySmall.copy( style = MaterialTheme.typography.bodySmall.copy(
textDecoration = TextDecoration.Underline textDecoration = TextDecoration.Underline
), ),
color = MaterialTheme.colorScheme.primary, color = MaterialTheme.colorScheme.primary,
modifier = Modifier.clickable { modifier = Modifier.clickable {
openUrl("https://git.shihaam.dev/shihaam/ISODrive") openUrl("https://git.shihaam.dev/shihaam/ISODroid")
} }
) )
} }
@@ -301,7 +306,7 @@ fun SettingsScreen(
} }
} }
Text( Text(
text = "The CLI tool that powers ISO Drive. Mounts ISO/IMG files as bootable USB devices using configfs.", text = "The CLI tool that powers ISO Droid. Mounts ISO/IMG files as bootable USB devices using configfs.",
style = MaterialTheme.typography.bodySmall, style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant, color = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.padding(top = 8.dp) modifier = Modifier.padding(top = 8.dp)
@@ -1,8 +1,14 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.ui.screens package sh.sar.isodroid.ui.screens
import android.Manifest import android.Manifest
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.os.Build import android.os.Build
import android.os.Environment
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
@@ -92,7 +98,7 @@ private fun WelcomeStep(
Spacer(modifier = Modifier.height(24.dp)) Spacer(modifier = Modifier.height(24.dp))
Text( Text(
text = "Welcome to ISO Drive", text = "Welcome to ISO Droid",
style = MaterialTheme.typography.headlineMedium, style = MaterialTheme.typography.headlineMedium,
fontWeight = FontWeight.Bold fontWeight = FontWeight.Bold
) )
@@ -147,7 +153,7 @@ private fun RootAccessStep(
title = "Root Access", title = "Root Access",
description = when (hasRoot) { description = when (hasRoot) {
false -> "Root access was denied. The app requires root to mount ISO files. You can try again or skip and grant access later from your root manager." false -> "Root access was denied. The app requires root to mount ISO files. You can try again or skip and grant access later from your root manager."
else -> "ISO Drive needs superuser (root) access to mount ISO files as USB devices. This is required because mounting USB gadgets is a system-level operation." else -> "ISO Droid needs superuser (root) access to mount ISO files as USB devices. This is required because mounting USB gadgets is a system-level operation."
}, },
granted = hasRoot granted = hasRoot
) )
@@ -253,7 +259,7 @@ private fun NotificationStep(
description = when { description = when {
permanentlyDenied -> "Notification permission was denied. You can enable it later in system settings if you change your mind." permanentlyDenied -> "Notification permission was denied. You can enable it later in system settings if you change your mind."
wasDenied -> "Notification permission was denied. You can try again or continue without notifications." wasDenied -> "Notification permission was denied. You can try again or continue without notifications."
else -> "ISO Drive shows a notification when an ISO is mounted, with a quick unmount button. This helps you keep track of the mount status." else -> "ISO Droid shows a notification when an ISO is mounted, with a quick unmount button. This helps you keep track of the mount status."
}, },
granted = if (wasDenied) false else if (hasPermission) true else null granted = if (wasDenied) false else if (hasPermission) true else null
) )
@@ -318,7 +324,7 @@ private fun CompleteStep(
Spacer(modifier = Modifier.height(16.dp)) Spacer(modifier = Modifier.height(16.dp))
Text( Text(
text = "ISO Drive is ready to use. Place your ISO or IMG files in the isodrive folder and start mounting.", text = "ISO Droid is ready to use. Place your ISO or IMG files in the isodroid folder and start mounting.",
style = MaterialTheme.typography.bodyLarge, style = MaterialTheme.typography.bodyLarge,
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
color = MaterialTheme.colorScheme.onSurfaceVariant color = MaterialTheme.colorScheme.onSurfaceVariant
@@ -327,7 +333,7 @@ private fun CompleteStep(
Spacer(modifier = Modifier.height(8.dp)) Spacer(modifier = Modifier.height(8.dp))
Text( Text(
text = "Default directory: /sdcard/isodrive/", text = "Default directory: ${Environment.getExternalStorageDirectory().absolutePath}/isodroid/",
style = MaterialTheme.typography.bodySmall, style = MaterialTheme.typography.bodySmall,
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
color = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.7f) color = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.7f)
@@ -339,7 +345,7 @@ private fun CompleteStep(
onClick = onFinish, onClick = onFinish,
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text("Start Using ISO Drive") Text("Start Using ISO Droid")
} }
} }
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.ui.theme package sh.sar.isodroid.ui.theme
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.ui.theme package sh.sar.isodroid.ui.theme
import android.app.Activity import android.app.Activity
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.ui.theme package sh.sar.isodroid.ui.theme
import androidx.compose.material3.Typography import androidx.compose.material3.Typography
@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Shiham Abdul Rahman <shihaam@shihaam.dev>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package sh.sar.isodroid.viewmodel package sh.sar.isodroid.viewmodel
import android.app.Application import android.app.Application
@@ -47,7 +52,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
companion object { companion object {
private val KEY_ISO_DIRECTORY = stringPreferencesKey("iso_directory") private val KEY_ISO_DIRECTORY = stringPreferencesKey("iso_directory")
private val DEFAULT_ISO_DIRECTORY = "${Environment.getExternalStorageDirectory().absolutePath}/isodrive" private val DEFAULT_ISO_DIRECTORY = "${Environment.getExternalStorageDirectory().absolutePath}/isodroid"
} }
private var initialized = false private var initialized = false
@@ -4,167 +4,10 @@
android:height="108dp" android:height="108dp"
android:viewportWidth="108" android:viewportWidth="108"
android:viewportHeight="108"> android:viewportHeight="108">
<!-- ISODroid Background - Clean Android Green -->
<path <path
android:fillColor="#3DDC84" android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" /> android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector> </vector>
@@ -1,30 +1,99 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp" android:width="108dp"
android:height="108dp" android:height="108dp"
android:viewportWidth="108" android:viewportWidth="108"
android:viewportHeight="108"> android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor"> <!-- ISODroid Launcher Icon Foreground -->
<gradient <!-- Safe zone is 66dp centered (21-87 in 108dp viewport) -->
android:endX="85.84757"
android:endY="92.4963" <!-- Left antenna with ball -->
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path <path
android:fillColor="#FFFFFF" android:fillColor="#FFFFFF"
android:fillType="nonZero" android:pathData="M38,24 a3,3 0 1,1 0.01,0"/>
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z" <path
android:strokeWidth="1" android:fillColor="#FFFFFF"
android:strokeColor="#00000000" /> android:strokeColor="#FFFFFF"
android:strokeWidth="3.5"
android:strokeLineCap="round"
android:pathData="M39.5,26.5 L44,33"/>
<!-- Right antenna with ball -->
<path
android:fillColor="#FFFFFF"
android:pathData="M70,24 a3,3 0 1,1 0.01,0"/>
<path
android:fillColor="#FFFFFF"
android:strokeColor="#FFFFFF"
android:strokeWidth="3.5"
android:strokeLineCap="round"
android:pathData="M68.5,26.5 L64,33"/>
<!-- Droid head -->
<path
android:fillColor="#FFFFFF"
android:pathData="M34,42 Q34,30 54,30 Q74,30 74,42 L74,56 Q74,62 68,62 L40,62 Q34,62 34,56 Z"/>
<!-- Left eye -->
<path
android:fillColor="#3DDC84"
android:pathData="M44,46 a4,4 0 1,0 0.01,0"/>
<!-- Right eye -->
<path
android:fillColor="#3DDC84"
android:pathData="M64,46 a4,4 0 1,0 0.01,0"/>
<!-- USB Trident Symbol -->
<!-- Main vertical stem -->
<path
android:fillColor="#FFFFFF"
android:strokeColor="#FFFFFF"
android:strokeWidth="5"
android:strokeLineCap="round"
android:pathData="M54,62 L54,88"/>
<!-- Horizontal bar -->
<path
android:fillColor="#FFFFFF"
android:strokeColor="#FFFFFF"
android:strokeWidth="4"
android:strokeLineCap="round"
android:pathData="M40,70 L68,70"/>
<!-- Left branch -->
<path
android:fillColor="#FFFFFF"
android:strokeColor="#FFFFFF"
android:strokeWidth="3.5"
android:strokeLineCap="round"
android:pathData="M40,70 L40,76"/>
<!-- Left terminal (rectangle) -->
<path
android:fillColor="#FFFFFF"
android:pathData="M36,76 L44,76 L44,82 L36,82 Z"/>
<!-- Right branch -->
<path
android:fillColor="#FFFFFF"
android:strokeColor="#FFFFFF"
android:strokeWidth="3.5"
android:strokeLineCap="round"
android:pathData="M68,70 L68,76"/>
<!-- Right terminal (circle) -->
<path
android:fillColor="#FFFFFF"
android:pathData="M68,80 a4,4 0 1,0 0.01,0"/>
<!-- USB bottom arrow -->
<path
android:fillColor="#FFFFFF"
android:strokeColor="#FFFFFF"
android:strokeWidth="4"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:pathData="M48,88 L54,94 L60,88"/>
</vector> </vector>
@@ -0,0 +1,90 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<!-- ISODroid Monochrome Icon for Material You Theming -->
<!-- This icon uses a single color that Android will tint based on wallpaper -->
<!-- Left antenna with ball -->
<path
android:fillColor="#000000"
android:pathData="M38,24 a3,3 0 1,1 0.01,0"/>
<path
android:fillColor="#000000"
android:strokeColor="#000000"
android:strokeWidth="3.5"
android:strokeLineCap="round"
android:pathData="M39.5,26.5 L44,33"/>
<!-- Right antenna with ball -->
<path
android:fillColor="#000000"
android:pathData="M70,24 a3,3 0 1,1 0.01,0"/>
<path
android:fillColor="#000000"
android:strokeColor="#000000"
android:strokeWidth="3.5"
android:strokeLineCap="round"
android:pathData="M68.5,26.5 L64,33"/>
<!-- Droid head with hollow eyes -->
<path
android:fillColor="#000000"
android:fillType="evenOdd"
android:pathData="M34,42 Q34,30 54,30 Q74,30 74,42 L74,56 Q74,62 68,62 L40,62 Q34,62 34,56 Z M44,50 a4,4 0 1,0 0.01,0 M64,50 a4,4 0 1,0 0.01,0"/>
<!-- USB Trident Symbol -->
<!-- Main vertical stem -->
<path
android:fillColor="#000000"
android:strokeColor="#000000"
android:strokeWidth="5"
android:strokeLineCap="round"
android:pathData="M54,62 L54,88"/>
<!-- Horizontal bar -->
<path
android:fillColor="#000000"
android:strokeColor="#000000"
android:strokeWidth="4"
android:strokeLineCap="round"
android:pathData="M40,70 L68,70"/>
<!-- Left branch -->
<path
android:fillColor="#000000"
android:strokeColor="#000000"
android:strokeWidth="3.5"
android:strokeLineCap="round"
android:pathData="M40,70 L40,76"/>
<!-- Left terminal (rectangle) -->
<path
android:fillColor="#000000"
android:pathData="M36,76 L44,76 L44,82 L36,82 Z"/>
<!-- Right branch -->
<path
android:fillColor="#000000"
android:strokeColor="#000000"
android:strokeWidth="3.5"
android:strokeLineCap="round"
android:pathData="M68,70 L68,76"/>
<!-- Right terminal (circle) -->
<path
android:fillColor="#000000"
android:pathData="M68,80 a4,4 0 1,0 0.01,0"/>
<!-- USB bottom arrow -->
<path
android:fillColor="#000000"
android:strokeColor="#000000"
android:strokeWidth="4"
android:strokeLineCap="round"
android:strokeLineJoin="round"
android:pathData="M48,88 L54,94 L60,88"/>
</vector>
+61 -1
View File
@@ -4,7 +4,67 @@
android:viewportWidth="24" android:viewportWidth="24"
android:viewportHeight="24" android:viewportHeight="24"
android:tint="?attr/colorControlNormal"> android:tint="?attr/colorControlNormal">
<!-- ISODroid Notification Icon -->
<!-- Left antenna ball -->
<path <path
android:fillColor="@android:color/white" android:fillColor="@android:color/white"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,16.5c-2.49,0 -4.5,-2.01 -4.5,-4.5S9.51,7.5 12,7.5s4.5,2.01 4.5,4.5 -2.01,4.5 -4.5,4.5zM12,9.5c-1.38,0 -2.5,1.12 -2.5,2.5s1.12,2.5 2.5,2.5 2.5,-1.12 2.5,-2.5 -1.12,-2.5 -2.5,-2.5z"/> android:pathData="M7.5,2.5 m-0.9,0 a0.9,0.9 0 1,1 1.8,0 a0.9,0.9 0 1,1 -1.8,0"/>
<!-- Left antenna stem -->
<path
android:fillColor="@android:color/white"
android:pathData="M7.8,3.3 L8.8,3.8 L9.3,5.3 L8.3,5.5 Z"/>
<!-- Right antenna ball -->
<path
android:fillColor="@android:color/white"
android:pathData="M16.5,2.5 m-0.9,0 a0.9,0.9 0 1,1 1.8,0 a0.9,0.9 0 1,1 -1.8,0"/>
<!-- Right antenna stem -->
<path
android:fillColor="@android:color/white"
android:pathData="M16.2,3.3 L15.2,3.8 L14.7,5.3 L15.7,5.5 Z"/>
<!-- Droid head -->
<path
android:fillColor="@android:color/white"
android:pathData="M8,8 Q8,5.2 12,5.2 Q16,5.2 16,8 L16,11 Q16,12.5 14.5,12.5 L9.5,12.5 Q8,12.5 8,11 Z"/>
<!-- USB main stem -->
<path
android:fillColor="@android:color/white"
android:pathData="M11.2,12.5 L12.8,12.5 L12.8,20 L11.2,20 Z"/>
<!-- USB horizontal bar -->
<path
android:fillColor="@android:color/white"
android:pathData="M9,14.8 L15,14.8 L15,16 L9,16 Z"/>
<!-- USB left branch vertical -->
<path
android:fillColor="@android:color/white"
android:pathData="M8.5,16 L9.6,16 L9.6,17 L8.5,17 Z"/>
<!-- USB left terminal rectangle -->
<path
android:fillColor="@android:color/white"
android:pathData="M8,17 L10.2,17 L10.2,19.2 L8,19.2 Z"/>
<!-- USB right branch vertical -->
<path
android:fillColor="@android:color/white"
android:pathData="M14.4,16 L15.5,16 L15.5,17.5 L14.4,17.5 Z"/>
<!-- USB right terminal circle -->
<path
android:fillColor="@android:color/white"
android:pathData="M15,18.5 m-1.2,0 a1.2,1.2 0 1,1 2.4,0 a1.2,1.2 0 1,1 -2.4,0"/>
<!-- USB bottom arrow -->
<path
android:fillColor="@android:color/white"
android:pathData="M10.5,20 L12,22 L13.5,20 Z"/>
</vector> </vector>
@@ -2,5 +2,5 @@
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" /> <background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" /> <foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" /> <monochrome android:drawable="@drawable/ic_launcher_monochrome" />
</adaptive-icon> </adaptive-icon>
@@ -2,5 +2,5 @@
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" /> <background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" /> <foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" /> <monochrome android:drawable="@drawable/ic_launcher_monochrome" />
</adaptive-icon> </adaptive-icon>
+77
View File
@@ -0,0 +1,77 @@
#!/usr/bin/env bash
set -euo pipefail
# Build isodrive from source for all Android architectures
# Requires: Android NDK (or runs via nix-shell on NixOS)
SCRIPT_DIR=$(dirname "$(realpath "$0")")
ISODRIVE_DIR="/tmp/isodrive"
OUTPUT_DIR="$SCRIPT_DIR/app/src/main/assets/bin"
# Clone isodrive source
if [[ -d "$ISODRIVE_DIR" ]]; then
echo "Updating isodrive source..."
git -C "$ISODRIVE_DIR" pull
else
echo "Cloning isodrive..."
git clone --depth 1 https://github.com/nitanmarcel/isodrive "$ISODRIVE_DIR"
fi
SRCS="$ISODRIVE_DIR/src/util.cpp $ISODRIVE_DIR/src/configfsisomanager.cpp $ISODRIVE_DIR/src/androidusbisomanager.cpp $ISODRIVE_DIR/src/main.cpp"
CFLAGS="-I$ISODRIVE_DIR/src/include -static-libstdc++ -Os -s"
build_all() {
local NDK="$1"
local TOOLCHAIN="$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin"
echo "Building arm64-v8a..."
"$TOOLCHAIN/aarch64-linux-android26-clang++" $CFLAGS $SRCS -o "$OUTPUT_DIR/arm64-v8a/isodrive"
echo "Building armeabi-v7a..."
"$TOOLCHAIN/armv7a-linux-androideabi26-clang++" $CFLAGS $SRCS -o "$OUTPUT_DIR/armeabi-v7a/isodrive"
echo "Building x86_64..."
"$TOOLCHAIN/x86_64-linux-android26-clang++" $CFLAGS $SRCS -o "$OUTPUT_DIR/x86_64/isodrive"
echo "Building x86..."
"$TOOLCHAIN/i686-linux-android26-clang++" $CFLAGS $SRCS -o "$OUTPUT_DIR/x86/isodrive"
echo "Done! Built isodrive for all architectures."
ls -la "$OUTPUT_DIR"/*/isodrive
}
# On NixOS, prefer nix-shell (local Android SDK has /bin/bash issues)
if command -v nix-shell &>/dev/null; then
echo "Using nix-shell to get Android NDK..."
export SRCS CFLAGS OUTPUT_DIR
NIXPKGS_ALLOW_UNFREE=1 nix-shell -p androidenv.androidPkgs.ndk-bundle --run '
SDK_ROOT=$(find /nix/store -maxdepth 1 -name "*android-sdk-ndk*" -type d 2>/dev/null | head -1)
NDK=$(ls -d "$SDK_ROOT/libexec/android-sdk/ndk/"* | head -1)
TOOLCHAIN="$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin"
echo "Using NDK: $NDK"
echo "Building arm64-v8a..."
"$TOOLCHAIN/aarch64-linux-android26-clang++" $CFLAGS $SRCS -o "$OUTPUT_DIR/arm64-v8a/isodrive"
echo "Building armeabi-v7a..."
"$TOOLCHAIN/armv7a-linux-androideabi26-clang++" $CFLAGS $SRCS -o "$OUTPUT_DIR/armeabi-v7a/isodrive"
echo "Building x86_64..."
"$TOOLCHAIN/x86_64-linux-android26-clang++" $CFLAGS $SRCS -o "$OUTPUT_DIR/x86_64/isodrive"
echo "Building x86..."
"$TOOLCHAIN/i686-linux-android26-clang++" $CFLAGS $SRCS -o "$OUTPUT_DIR/x86/isodrive"
echo "Done!"
ls -la "$OUTPUT_DIR"/*/isodrive
'
elif [[ -n "${ANDROID_NDK_HOME:-}" ]]; then
build_all "$ANDROID_NDK_HOME"
elif [[ -n "${ANDROID_NDK:-}" ]]; then
build_all "$ANDROID_NDK"
else
echo "Error: Android NDK not found."
echo "Set ANDROID_NDK_HOME or ANDROID_NDK, or install nix-shell."
exit 1
fi
+4 -4
View File
@@ -229,13 +229,13 @@ fun toCommandArgs(): List<String> {
**Example commands:** **Example commands:**
```bash ```bash
# Mount as read-only mass storage # Mount as read-only mass storage
isodrive "/sdcard/isodrive/ubuntu.iso" -configfs isodrive "/sdcard/isodroid/ubuntu.iso" -configfs
# Mount as writable drive # Mount as writable drive
isodrive "/sdcard/isodrive/drive.img" -rw -configfs isodrive "/sdcard/isodroid/drive.img" -rw -configfs
# Mount as CD-ROM # Mount as CD-ROM
isodrive "/sdcard/isodrive/windows.iso" -cdrom -configfs isodrive "/sdcard/isodroid/windows.iso" -cdrom -configfs
``` ```
## Event System ## Event System
@@ -338,7 +338,7 @@ private val KEY_ISO_DIRECTORY = stringPreferencesKey("iso_directory")
``` ```
Stores: Stores:
- Custom ISO directory path (default: `/sdcard/isodrive/`) - Custom ISO directory path (default: `/sdcard/isodroid/`)
### SharedPreferences ### SharedPreferences
Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 KiB

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 109 KiB

@@ -0,0 +1,9 @@
* New app icon
* Mount ISO/IMG files as USB mass storage or CD-ROM
* Create blank IMG files for writable USB drives
* Read-only or read-write mount options
* Persistent notification with quick unmount button
* OS-specific icons for popular distributions
* Download links to popular operating systems
* Rename and delete files
* Material 3 dynamic theming with dark mode support
@@ -0,0 +1,24 @@
ISO Droid lets you mount ISO and IMG files as USB mass storage or CD-ROM devices on rooted Android devices. Connect your phone to any PC and it will appear as a bootable USB drive or CD-ROM.
Features:
* Mount ISO/IMG files as USB mass storage or CD-ROM
* Create blank IMG files for writable USB drives
* Read-only or read-write mount options
* Persistent notification with quick unmount button
* OS-specific icons for popular distributions (Linux, BSD, etc.)
* Download links to popular operating systems
* Rename and delete files
* Material 3 dynamic theming with dark mode support
Requirements:
* Rooted Android device (Magisk, KernelSU, APatch, etc.)
* USB gadget support (configfs or sysfs)
* Android 8.0+ (API 26)
Usage:
1. Place your ISO/IMG files in /sdcard/isodroid/
2. Select an ISO/IMG file from the list
3. Choose mount options (Mass Storage or CD-ROM)
4. Tap Mount
5. Connect your phone to a PC via USB
6. Unmount via the app or notification when done
Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

@@ -0,0 +1 @@
Mount ISO/IMG files as USB drives on rooted Android
@@ -0,0 +1 @@
ISO Droid
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Get the directory where this script lives
SCRIPT_DIR=$(dirname "$(realpath "$0")")
ISODRIVE_VERSION=$(curl -sI https://github.com/nitanmarcel/isodrive-magisk/releases/latest | grep -i ^location | grep -oP 'v\K[\d.]+')
curl -sL https://github.com/nitanmarcel/isodrive-magisk/releases/download/v$ISODRIVE_VERSION/isodrive-magisk-v$ISODRIVE_VERSION.zip -o /tmp/isodrive-magisk.zip
unzip -q /tmp/isodrive-magisk.zip -d /tmp/isodrive-magisk
# Move the isodrive binary for each architecture
mv /tmp/isodrive-magisk/libs/arm64-v8a/isodrive $SCRIPT_DIR/app/src/main/assets/bin/arm64-v8a/
mv /tmp/isodrive-magisk/libs/armeabi-v7a/isodrive $SCRIPT_DIR/app/src/main/assets/bin/armeabi-v7a/
mv /tmp/isodrive-magisk/libs/x86/isodrive $SCRIPT_DIR/app/src/main/assets/bin/x86/
mv /tmp/isodrive-magisk/libs/x86_64/isodrive $SCRIPT_DIR/app/src/main/assets/bin/x86_64/
# Clean up temp files
rm -rf /tmp/isodrive-magisk /tmp/isodrive-magisk.zip
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

+44
View File
@@ -0,0 +1,44 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 108 108" width="512" height="512">
<!-- Background -->
<rect width="108" height="108" rx="20" fill="#3DDC84"/>
<!-- Left antenna ball -->
<circle cx="38" cy="24" r="3" fill="#FFFFFF"/>
<!-- Left antenna stem -->
<line x1="39.5" y1="26.5" x2="44" y2="33" stroke="#FFFFFF" stroke-width="3.5" stroke-linecap="round"/>
<!-- Right antenna ball -->
<circle cx="70" cy="24" r="3" fill="#FFFFFF"/>
<!-- Right antenna stem -->
<line x1="68.5" y1="26.5" x2="64" y2="33" stroke="#FFFFFF" stroke-width="3.5" stroke-linecap="round"/>
<!-- Droid head -->
<path d="M34,42 Q34,30 54,30 Q74,30 74,42 L74,56 Q74,62 68,62 L40,62 Q34,62 34,56 Z" fill="#FFFFFF"/>
<!-- Left eye -->
<circle cx="44" cy="46" r="4" fill="#3DDC84"/>
<!-- Right eye -->
<circle cx="64" cy="46" r="4" fill="#3DDC84"/>
<!-- USB main stem -->
<line x1="54" y1="62" x2="54" y2="88" stroke="#FFFFFF" stroke-width="5" stroke-linecap="round"/>
<!-- USB horizontal bar -->
<line x1="40" y1="70" x2="68" y2="70" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round"/>
<!-- USB left branch -->
<line x1="40" y1="70" x2="40" y2="76" stroke="#FFFFFF" stroke-width="3.5" stroke-linecap="round"/>
<!-- USB left terminal rectangle -->
<rect x="36" y="76" width="8" height="6" fill="#FFFFFF"/>
<!-- USB right branch -->
<line x1="68" y1="70" x2="68" y2="76" stroke="#FFFFFF" stroke-width="3.5" stroke-linecap="round"/>
<!-- USB right terminal circle -->
<circle cx="68" cy="80" r="4" fill="#FFFFFF"/>
<!-- USB bottom arrow -->
<path d="M48,88 L54,94 L60,88" stroke="#FFFFFF" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB