diff --git a/app/src/main/java/com/termux/app/TermuxInstaller.java b/app/src/main/java/com/termux/app/TermuxInstaller.java index b14149993a..efc1081524 100644 --- a/app/src/main/java/com/termux/app/TermuxInstaller.java +++ b/app/src/main/java/com/termux/app/TermuxInstaller.java @@ -21,6 +21,7 @@ import com.termux.shared.android.PackageUtils; import com.termux.shared.termux.TermuxConstants; import com.termux.shared.termux.TermuxUtils; +import com.termux.shared.termux.settings.properties.TermuxAppSharedProperties; import com.termux.shared.termux.shell.command.environment.TermuxShellEnvironment; import java.io.BufferedReader; @@ -281,6 +282,9 @@ static void setupStorageSymlinks(final Context context) { Logger.logInfo(LOG_TAG, "Setting up storage symlinks."); new Thread() { + + private static final char ZERO_WIDTH_SPACE = '\u200b'; + public void run() { try { Error error; @@ -300,7 +304,7 @@ public void run() { // Get primary storage root "/storage/emulated/0" symlink File sharedDir = Environment.getExternalStorageDirectory(); - Os.symlink(sharedDir.getAbsolutePath(), new File(storageDir, "shared").getAbsolutePath()); + Os.symlink(sharedDir.getAbsolutePath() + (TermuxAppSharedProperties.getProperties().isAppendZeroWidthSpaceToSymlinkShared() ? String.valueOf(ZERO_WIDTH_SPACE) : ""), new File(storageDir, "shared").getAbsolutePath()); File documentsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS); Os.symlink(documentsDir.getAbsolutePath(), new File(storageDir, "documents").getAbsolutePath()); diff --git a/termux-shared/src/main/java/com/termux/shared/termux/settings/properties/TermuxPropertyConstants.java b/termux-shared/src/main/java/com/termux/shared/termux/settings/properties/TermuxPropertyConstants.java index dd935f3ab5..f54f0769a4 100644 --- a/termux-shared/src/main/java/com/termux/shared/termux/settings/properties/TermuxPropertyConstants.java +++ b/termux-shared/src/main/java/com/termux/shared/termux/settings/properties/TermuxPropertyConstants.java @@ -153,6 +153,13 @@ public final class TermuxPropertyConstants { + /** Defines the key for whether to append 'Zero Width Space' to symlink shared + * Allows to access the “Android/data” or “Android/obb” folders in Android 11+ without root privileges. + */ + public static final String KEY_APPEND_ZERO_WIDTH_SPACE_TO_SYMLINK_SHARED = "append-zero-width-space-to-symlink-shared"; // Default: "default-working-directory" + + + /** Defines the key for whether to use fullscreen */ public static final String KEY_USE_FULLSCREEN = "fullscreen"; // Default: "fullscreen" @@ -401,6 +408,7 @@ public final class TermuxPropertyConstants { KEY_RUN_TERMUX_AM_SOCKET_SERVER, KEY_TERMINAL_ONCLICK_URL_OPEN, KEY_USE_CTRL_SPACE_WORKAROUND, + KEY_APPEND_ZERO_WIDTH_SPACE_TO_SYMLINK_SHARED, KEY_USE_FULLSCREEN, KEY_USE_FULLSCREEN_WORKAROUND, TermuxConstants.PROP_ALLOW_EXTERNAL_APPS, @@ -447,6 +455,7 @@ public final class TermuxPropertyConstants { KEY_HIDE_SOFT_KEYBOARD_ON_STARTUP, KEY_TERMINAL_ONCLICK_URL_OPEN, KEY_USE_CTRL_SPACE_WORKAROUND, + KEY_APPEND_ZERO_WIDTH_SPACE_TO_SYMLINK_SHARED, KEY_USE_FULLSCREEN, KEY_USE_FULLSCREEN_WORKAROUND, TermuxConstants.PROP_ALLOW_EXTERNAL_APPS diff --git a/termux-shared/src/main/java/com/termux/shared/termux/settings/properties/TermuxSharedProperties.java b/termux-shared/src/main/java/com/termux/shared/termux/settings/properties/TermuxSharedProperties.java index e277f4506a..db5cad640f 100644 --- a/termux-shared/src/main/java/com/termux/shared/termux/settings/properties/TermuxSharedProperties.java +++ b/termux-shared/src/main/java/com/termux/shared/termux/settings/properties/TermuxSharedProperties.java @@ -618,6 +618,10 @@ public boolean isUsingCtrlSpaceWorkaround() { return (boolean) getInternalPropertyValue(TermuxPropertyConstants.KEY_USE_CTRL_SPACE_WORKAROUND, true); } + public boolean isAppendZeroWidthSpaceToSymlinkShared() { + return (boolean) getInternalPropertyValue(TermuxPropertyConstants.KEY_APPEND_ZERO_WIDTH_SPACE_TO_SYMLINK_SHARED, true); + } + public boolean isUsingFullScreen() { return (boolean) getInternalPropertyValue(TermuxPropertyConstants.KEY_USE_FULLSCREEN, true); }