Skip to content

Commit 05ab922

Browse files
committed
feat: open terminal in adjacent window on large screens
Extract multi-window intent flags and handle new intents in TerminalActivity.
1 parent d45ac54 commit 05ab922

File tree

5 files changed

+58
-14
lines changed

5 files changed

+58
-14
lines changed

app/src/main/java/com/itsaky/androidide/actions/main/OpenTerminalAction.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import com.itsaky.androidide.actions.ActionItem
1010
import com.itsaky.androidide.actions.markInvisible
1111
import com.itsaky.androidide.activities.TerminalActivity
1212
import com.itsaky.androidide.idetooltips.TooltipTag
13+
import com.itsaky.androidide.utils.applyMultiWindowFlags
1314

1415
class OpenTerminalAction(context: Context) : ActionItem {
1516

@@ -38,7 +39,9 @@ class OpenTerminalAction(context: Context) : ActionItem {
3839

3940
override suspend fun execAction(data: ActionData): Any {
4041
val context = data.get(Context::class.java) ?: return false
41-
context.startActivity(Intent(context, TerminalActivity::class.java))
42+
val intent = Intent(context, TerminalActivity::class.java)
43+
.applyMultiWindowFlags(context)
44+
context.startActivity(intent)
4245
return true
4346
}
4447
}

app/src/main/java/com/itsaky/androidide/actions/sidebar/TerminalSidebarAction.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import com.itsaky.androidide.actions.requireContext
2727
import com.itsaky.androidide.activities.TerminalActivity
2828
import com.itsaky.androidide.idetooltips.TooltipTag
2929
import com.itsaky.androidide.projects.IProjectManager
30+
import com.itsaky.androidide.utils.applyMultiWindowFlags
3031
import com.termux.shared.termux.TermuxConstants.TERMUX_APP.TERMUX_ACTIVITY
3132
import java.util.Objects
3233
import kotlin.reflect.KClass
@@ -71,7 +72,7 @@ class TerminalSidebarAction(
7172
?.name,
7273
)
7374
putExtra(TERMUX_ACTIVITY.EXTRA_FAILSAFE_SESSION, isFailsafe)
74-
}
75+
}.applyMultiWindowFlags(context)
7576
context.startActivity(intent)
7677
}
7778
}

common/src/main/java/com/itsaky/androidide/activities/editor/HelpActivity.kt

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import com.itsaky.androidide.common.databinding.ActivityHelpBinding
3333
import com.itsaky.androidide.utils.DeviceFormFactorUtils
3434
import com.itsaky.androidide.utils.isSystemInDarkMode
3535
import com.itsaky.androidide.utils.UrlManager
36+
import com.itsaky.androidide.utils.applyMultiWindowFlags
3637
import org.adfa.constants.CONTENT_TITLE_KEY
3738

3839
class HelpActivity : BaseIDEActivity() {
@@ -46,20 +47,10 @@ class HelpActivity : BaseIDEActivity() {
4647
putExtra(CONTENT_KEY, url)
4748
putExtra(CONTENT_TITLE_KEY, title)
4849

49-
val formFactor = DeviceFormFactorUtils.getCurrent(context)
50-
51-
if (formFactor.isLargeScreenLike) {
52-
addFlags(
53-
Intent.FLAG_ACTIVITY_NEW_TASK or
54-
Intent.FLAG_ACTIVITY_NEW_DOCUMENT or
55-
Intent.FLAG_ACTIVITY_SINGLE_TOP or
56-
Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT
57-
)
50+
if (DeviceFormFactorUtils.getCurrent(context).isLargeScreenLike) {
5851
data = MULTI_WINDOW_URI.toUri()
59-
} else if (context !is Activity) {
60-
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
6152
}
62-
}
53+
}.applyMultiWindowFlags(context)
6354
context.startActivity(intent)
6455
}
6556
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.itsaky.androidide.utils
2+
3+
import android.app.Activity
4+
import android.content.Context
5+
import android.content.Intent
6+
7+
8+
fun Intent.applyMultiWindowFlags(context: Context): Intent = apply {
9+
val formFactor = DeviceFormFactorUtils.getCurrent(context)
10+
11+
if (formFactor.isLargeScreenLike) {
12+
addFlags(
13+
Intent.FLAG_ACTIVITY_NEW_TASK or
14+
Intent.FLAG_ACTIVITY_NEW_DOCUMENT or
15+
Intent.FLAG_ACTIVITY_SINGLE_TOP or
16+
Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT
17+
)
18+
} else if (context !is Activity) {
19+
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
20+
}
21+
}

termux/termux-app/src/main/java/com/itsaky/androidide/activities/TerminalActivity.kt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,15 @@
1818
package com.itsaky.androidide.activities
1919

2020
import android.content.ComponentName
21+
import android.content.Intent
2122
import android.os.Bundle
2223
import android.os.IBinder
2324
import androidx.core.content.ContextCompat
2425
import androidx.core.view.WindowCompat
2526
import androidx.lifecycle.lifecycleScope
2627
import com.itsaky.androidide.utils.Environment
2728
import com.termux.app.TermuxActivity
29+
import com.termux.shared.termux.TermuxConstants
2830
import kotlinx.coroutines.Dispatchers
2931
import kotlinx.coroutines.launch
3032

@@ -52,4 +54,30 @@ class TerminalActivity : TermuxActivity() {
5254
Environment.mkdirIfNotExists(Environment.TMP_DIR)
5355
}
5456
}
57+
58+
override fun onNewIntent(intent: Intent?) {
59+
super.onNewIntent(intent)
60+
setIntent(intent)
61+
if (intent == null) return
62+
63+
val newWorkingDir = intent.getStringExtra(TermuxConstants.TERMUX_APP.TERMUX_ACTIVITY.EXTRA_SESSION_WORKING_DIR)
64+
val newSessionName = intent.getStringExtra(TermuxConstants.TERMUX_APP.TERMUX_ACTIVITY.EXTRA_SESSION_NAME)
65+
val isFailsafe = intent.getBooleanExtra(TermuxConstants.TERMUX_APP.TERMUX_ACTIVITY.EXTRA_FAILSAFE_SESSION, false)
66+
67+
val service = mTermuxService
68+
if (service != null) {
69+
val newSession = service.createTermuxSession(
70+
null,
71+
null,
72+
null,
73+
newWorkingDir,
74+
isFailsafe,
75+
newSessionName
76+
)
77+
78+
if (newSession != null) {
79+
mTermuxTerminalSessionActivityClient.setCurrentSession(newSession.terminalSession)
80+
}
81+
}
82+
}
5583
}

0 commit comments

Comments
 (0)