diff --git a/app/src/main/java/com/itsaky/androidide/actions/main/OpenTerminalAction.kt b/app/src/main/java/com/itsaky/androidide/actions/main/OpenTerminalAction.kt index febc8f2be5..93a9986101 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/main/OpenTerminalAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/main/OpenTerminalAction.kt @@ -10,6 +10,7 @@ import com.itsaky.androidide.actions.ActionItem import com.itsaky.androidide.actions.markInvisible import com.itsaky.androidide.activities.TerminalActivity import com.itsaky.androidide.idetooltips.TooltipTag +import com.itsaky.androidide.utils.applyMultiWindowFlags class OpenTerminalAction(context: Context) : ActionItem { @@ -38,7 +39,9 @@ class OpenTerminalAction(context: Context) : ActionItem { override suspend fun execAction(data: ActionData): Any { val context = data.get(Context::class.java) ?: return false - context.startActivity(Intent(context, TerminalActivity::class.java)) + val intent = Intent(context, TerminalActivity::class.java) + .applyMultiWindowFlags(context) + context.startActivity(intent) return true } } diff --git a/app/src/main/java/com/itsaky/androidide/actions/sidebar/TerminalSidebarAction.kt b/app/src/main/java/com/itsaky/androidide/actions/sidebar/TerminalSidebarAction.kt index 84b988a22d..9f346c01cd 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/sidebar/TerminalSidebarAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/sidebar/TerminalSidebarAction.kt @@ -27,6 +27,7 @@ import com.itsaky.androidide.actions.requireContext import com.itsaky.androidide.activities.TerminalActivity import com.itsaky.androidide.idetooltips.TooltipTag import com.itsaky.androidide.projects.IProjectManager +import com.itsaky.androidide.utils.applyMultiWindowFlags import com.termux.shared.termux.TermuxConstants.TERMUX_APP.TERMUX_ACTIVITY import java.util.Objects import kotlin.reflect.KClass @@ -71,7 +72,7 @@ class TerminalSidebarAction( ?.name, ) putExtra(TERMUX_ACTIVITY.EXTRA_FAILSAFE_SESSION, isFailsafe) - } + }.applyMultiWindowFlags(context) context.startActivity(intent) } } diff --git a/common/src/main/java/com/itsaky/androidide/activities/editor/HelpActivity.kt b/common/src/main/java/com/itsaky/androidide/activities/editor/HelpActivity.kt index c0342e1df7..166ff76380 100644 --- a/common/src/main/java/com/itsaky/androidide/activities/editor/HelpActivity.kt +++ b/common/src/main/java/com/itsaky/androidide/activities/editor/HelpActivity.kt @@ -33,6 +33,7 @@ import com.itsaky.androidide.common.databinding.ActivityHelpBinding import com.itsaky.androidide.utils.DeviceFormFactorUtils import com.itsaky.androidide.utils.isSystemInDarkMode import com.itsaky.androidide.utils.UrlManager +import com.itsaky.androidide.utils.applyMultiWindowFlags import org.adfa.constants.CONTENT_TITLE_KEY class HelpActivity : BaseIDEActivity() { @@ -46,20 +47,10 @@ class HelpActivity : BaseIDEActivity() { putExtra(CONTENT_KEY, url) putExtra(CONTENT_TITLE_KEY, title) - val formFactor = DeviceFormFactorUtils.getCurrent(context) - - if (formFactor.isLargeScreenLike) { - addFlags( - Intent.FLAG_ACTIVITY_NEW_TASK or - Intent.FLAG_ACTIVITY_NEW_DOCUMENT or - Intent.FLAG_ACTIVITY_SINGLE_TOP or - Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT - ) + if (DeviceFormFactorUtils.getCurrent(context).isLargeScreenLike) { data = MULTI_WINDOW_URI.toUri() - } else if (context !is Activity) { - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } - } + }.applyMultiWindowFlags(context) context.startActivity(intent) } } diff --git a/common/src/main/java/com/itsaky/androidide/utils/IntentExtensions.kt b/common/src/main/java/com/itsaky/androidide/utils/IntentExtensions.kt new file mode 100644 index 0000000000..a29050d86b --- /dev/null +++ b/common/src/main/java/com/itsaky/androidide/utils/IntentExtensions.kt @@ -0,0 +1,21 @@ +package com.itsaky.androidide.utils + +import android.app.Activity +import android.content.Context +import android.content.Intent + + +fun Intent.applyMultiWindowFlags(context: Context): Intent = apply { + val formFactor = DeviceFormFactorUtils.getCurrent(context) + + if (formFactor.isLargeScreenLike) { + addFlags( + Intent.FLAG_ACTIVITY_NEW_TASK or + Intent.FLAG_ACTIVITY_NEW_DOCUMENT or + Intent.FLAG_ACTIVITY_SINGLE_TOP or + Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT + ) + } else if (context !is Activity) { + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } +} diff --git a/termux/termux-app/src/main/java/com/itsaky/androidide/activities/TerminalActivity.kt b/termux/termux-app/src/main/java/com/itsaky/androidide/activities/TerminalActivity.kt index f37747b801..d0a7d46d77 100644 --- a/termux/termux-app/src/main/java/com/itsaky/androidide/activities/TerminalActivity.kt +++ b/termux/termux-app/src/main/java/com/itsaky/androidide/activities/TerminalActivity.kt @@ -18,6 +18,7 @@ package com.itsaky.androidide.activities import android.content.ComponentName +import android.content.Intent import android.os.Bundle import android.os.IBinder import androidx.core.content.ContextCompat @@ -25,6 +26,7 @@ import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope import com.itsaky.androidide.utils.Environment import com.termux.app.TermuxActivity +import com.termux.shared.termux.TermuxConstants import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -52,4 +54,30 @@ class TerminalActivity : TermuxActivity() { Environment.mkdirIfNotExists(Environment.TMP_DIR) } } + + override fun onNewIntent(intent: Intent?) { + super.onNewIntent(intent) + setIntent(intent) + if (intent == null) return + + val newWorkingDir = intent.getStringExtra(TermuxConstants.TERMUX_APP.TERMUX_ACTIVITY.EXTRA_SESSION_WORKING_DIR) + val newSessionName = intent.getStringExtra(TermuxConstants.TERMUX_APP.TERMUX_ACTIVITY.EXTRA_SESSION_NAME) + val isFailsafe = intent.getBooleanExtra(TermuxConstants.TERMUX_APP.TERMUX_ACTIVITY.EXTRA_FAILSAFE_SESSION, false) + + val service = mTermuxService + if (service != null) { + val newSession = service.createTermuxSession( + null, + null, + null, + newWorkingDir, + isFailsafe, + newSessionName + ) + + if (newSession != null) { + mTermuxTerminalSessionActivityClient.setCurrentSession(newSession.terminalSession) + } + } + } }