Feature: TermHere and UserScript from FileManager
This commit is contained in:
@ -17,8 +17,8 @@ android {
|
|||||||
applicationId "io.neoterm"
|
applicationId "io.neoterm"
|
||||||
minSdkVersion 21
|
minSdkVersion 21
|
||||||
targetSdkVersion 25
|
targetSdkVersion 25
|
||||||
versionCode 11
|
versionCode 12
|
||||||
versionName "1.1.9"
|
versionName "1.2.0-rc1"
|
||||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||||
resConfigs "zh"
|
resConfigs "zh"
|
||||||
externalNativeBuild {
|
externalNativeBuild {
|
||||||
|
@ -29,19 +29,45 @@
|
|||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.term.TermHereActivity"
|
android:name=".ui.term.NeoTermRemoteInterface"
|
||||||
|
android:excludeFromRecents="true"
|
||||||
|
android:exported="false">
|
||||||
|
<intent-filter>
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
|
<activity-alias
|
||||||
|
android:name=".ui.term.TermHere"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:label="@string/term_here">
|
android:label="@string/term_here"
|
||||||
|
android:targetActivity=".ui.term.NeoTermRemoteInterface">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.SEND" />
|
<action android:name="android.intent.action.SEND" />
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
<data android:mimeType="*/*" />
|
<data android:mimeType="*/*" />
|
||||||
|
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity-alias>
|
||||||
|
|
||||||
|
<activity-alias
|
||||||
|
android:name=".ui.term.UserScript"
|
||||||
|
android:exported="true"
|
||||||
|
android:label="@string/user_script"
|
||||||
|
android:targetActivity=".ui.term.NeoTermRemoteInterface">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.SEND" />
|
||||||
|
<action android:name="android.intent.action.SEND_MULTIPLE" />
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
|
<data android:mimeType="*/*" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity-alias>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.crash.CrashActivity"
|
android:name=".ui.crash.CrashActivity"
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
|
@ -143,16 +143,18 @@ public final class TerminalSession extends TerminalOutput {
|
|||||||
|
|
||||||
private final String mShellPath;
|
private final String mShellPath;
|
||||||
private final String mCwd;
|
private final String mCwd;
|
||||||
|
private final String mInitialCommand;
|
||||||
private final String[] mArgs;
|
private final String[] mArgs;
|
||||||
private final String[] mEnv;
|
private final String[] mEnv;
|
||||||
|
|
||||||
public TerminalSession(String shellPath, String cwd, String[] args, String[] env, SessionChangedCallback changeCallback) {
|
public TerminalSession(String shellPath, String cwd, String initialCommand, String[] args, String[] env, SessionChangedCallback changeCallback) {
|
||||||
mChangeCallback = changeCallback;
|
mChangeCallback = changeCallback;
|
||||||
|
|
||||||
this.mShellPath = shellPath;
|
this.mShellPath = shellPath;
|
||||||
this.mCwd = cwd;
|
this.mCwd = cwd;
|
||||||
this.mArgs = args;
|
this.mArgs = args;
|
||||||
this.mEnv = env;
|
this.mEnv = env;
|
||||||
|
this.mInitialCommand = initialCommand;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Inform the attached pty of the new size and reflow or initialize the emulator. */
|
/** Inform the attached pty of the new size and reflow or initialize the emulator. */
|
||||||
@ -226,6 +228,9 @@ public final class TerminalSession extends TerminalOutput {
|
|||||||
}
|
}
|
||||||
}.start();
|
}.start();
|
||||||
|
|
||||||
|
if (mInitialCommand != null && mInitialCommand.length() > 0) {
|
||||||
|
write(mInitialCommand + '\r');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Write data to the shell process. */
|
/** Write data to the shell process. */
|
||||||
|
@ -18,6 +18,7 @@ object NeoTermPath {
|
|||||||
const val EKS_DEFAULT_FILE = "$EKS_PATH/default.eks"
|
const val EKS_DEFAULT_FILE = "$EKS_PATH/default.eks"
|
||||||
const val FONT_PATH = "$CUSTOM_PATH/font"
|
const val FONT_PATH = "$CUSTOM_PATH/font"
|
||||||
const val COLORS_PATH = "$CUSTOM_PATH/color"
|
const val COLORS_PATH = "$CUSTOM_PATH/color"
|
||||||
|
const val USER_SCRIPT_PATH = "$CUSTOM_PATH/script"
|
||||||
|
|
||||||
const val SOURCE_FILE = "$USR_PATH/etc/apt/sources.list"
|
const val SOURCE_FILE = "$USR_PATH/etc/apt/sources.list"
|
||||||
const val PACKAGE_LIST_DIR = "$USR_PATH/var/lib/apt/lists"
|
const val PACKAGE_LIST_DIR = "$USR_PATH/var/lib/apt/lists"
|
||||||
|
@ -12,7 +12,6 @@ import android.os.Binder
|
|||||||
import android.os.IBinder
|
import android.os.IBinder
|
||||||
import android.os.PowerManager
|
import android.os.PowerManager
|
||||||
import android.support.v4.content.WakefulBroadcastReceiver
|
import android.support.v4.content.WakefulBroadcastReceiver
|
||||||
import android.util.Log
|
|
||||||
import io.neoterm.R
|
import io.neoterm.R
|
||||||
import io.neoterm.backend.EmulatorDebug
|
import io.neoterm.backend.EmulatorDebug
|
||||||
import io.neoterm.backend.TerminalSession
|
import io.neoterm.backend.TerminalSession
|
||||||
@ -77,8 +76,8 @@ class NeoTermService : Service() {
|
|||||||
val sessions: List<TerminalSession>
|
val sessions: List<TerminalSession>
|
||||||
get() = mTerminalSessions
|
get() = mTerminalSessions
|
||||||
|
|
||||||
fun createTermSession(executablePath: String?, arguments: Array<String>?, cwd: String?, env: Array<String>?, sessionCallback: TerminalSession.SessionChangedCallback?, systemShell: Boolean): TerminalSession {
|
fun createTermSession(executablePath: String?, arguments: Array<String>?, cwd: String?, initialCommand: String?, env: Array<String>?, sessionCallback: TerminalSession.SessionChangedCallback?, systemShell: Boolean): TerminalSession {
|
||||||
val session = TerminalUtils.createSession(this, executablePath, arguments, cwd, env, sessionCallback, systemShell)
|
val session = TerminalUtils.createSession(this, executablePath, arguments, cwd, initialCommand, env, sessionCallback, systemShell)
|
||||||
mTerminalSessions.add(session)
|
mTerminalSessions.add(session)
|
||||||
updateNotification()
|
updateNotification()
|
||||||
return session
|
return session
|
||||||
@ -165,9 +164,9 @@ class NeoTermService : Service() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val ACTION_SERVICE_STOP = "neoterm.action.service.stop"
|
val ACTION_SERVICE_STOP = "neoterm.action.termService.stop"
|
||||||
val ACTION_ACQUIRE_LOCK = "neoterm.action.service.lock.acquire"
|
val ACTION_ACQUIRE_LOCK = "neoterm.action.termService.lock.acquire"
|
||||||
val ACTION_RELEASE_LOCK = "neoterm.action.service.lock.release"
|
val ACTION_RELEASE_LOCK = "neoterm.action.termService.lock.release"
|
||||||
private val NOTIFICATION_ID = 52019
|
private val NOTIFICATION_ID = 52019
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -58,7 +58,7 @@ class CustomizationActivity : AppCompatActivity() {
|
|||||||
sessionCallback = BasicSessionCallback(terminalView)
|
sessionCallback = BasicSessionCallback(terminalView)
|
||||||
TerminalUtils.setupTerminalView(terminalView, viewClient)
|
TerminalUtils.setupTerminalView(terminalView, viewClient)
|
||||||
session = TerminalUtils.createSession(this, "${NeoTermPath.USR_PATH}/bin/applets/echo",
|
session = TerminalUtils.createSession(this, "${NeoTermPath.USR_PATH}/bin/applets/echo",
|
||||||
arrayOf("echo", "Hello NeoTerm."), null, null, sessionCallback, false)
|
arrayOf("echo", "Hello NeoTerm."), null, null, null, sessionCallback, false)
|
||||||
terminalView.attachSession(session)
|
terminalView.attachSession(session)
|
||||||
|
|
||||||
findViewById(R.id.custom_install_font_button).setOnClickListener {
|
findViewById(R.id.custom_install_font_button).setOnClickListener {
|
||||||
|
@ -6,7 +6,6 @@ import android.app.Activity
|
|||||||
import android.app.AlertDialog
|
import android.app.AlertDialog
|
||||||
import android.content.*
|
import android.content.*
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import android.graphics.Rect
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.IBinder
|
import android.os.IBinder
|
||||||
import android.preference.PreferenceManager
|
import android.preference.PreferenceManager
|
||||||
@ -34,7 +33,7 @@ import io.neoterm.ui.bonus.BonusActivity
|
|||||||
import io.neoterm.ui.pm.PackageManagerActivity
|
import io.neoterm.ui.pm.PackageManagerActivity
|
||||||
import io.neoterm.ui.settings.SettingActivity
|
import io.neoterm.ui.settings.SettingActivity
|
||||||
import io.neoterm.ui.setup.SetupActivity
|
import io.neoterm.ui.setup.SetupActivity
|
||||||
import io.neoterm.ui.term.tab.TermSessionChangedCallback
|
import io.neoterm.ui.term.tab.TermSessionCallback
|
||||||
import io.neoterm.ui.term.tab.TermTab
|
import io.neoterm.ui.term.tab.TermTab
|
||||||
import io.neoterm.ui.term.tab.TermTabDecorator
|
import io.neoterm.ui.term.tab.TermTabDecorator
|
||||||
import io.neoterm.ui.term.tab.TermViewClient
|
import io.neoterm.ui.term.tab.TermViewClient
|
||||||
@ -382,8 +381,8 @@ class NeoTermActivity : AppCompatActivity(), ServiceConnection, SharedPreference
|
|||||||
.filter { it is TermTab && it.termSession == session }
|
.filter { it is TermTab && it.termSession == session }
|
||||||
.forEach { return }
|
.forEach { return }
|
||||||
|
|
||||||
val tab = createTab(session.mSessionName) as TermTab
|
val tab = createTab(session.title) as TermTab
|
||||||
tab.sessionCallback = session.sessionChangedCallback as TermSessionChangedCallback
|
tab.sessionCallback = session.sessionChangedCallback as TermSessionCallback
|
||||||
tab.viewClient = TermViewClient(this)
|
tab.viewClient = TermViewClient(this)
|
||||||
tab.termSession = session
|
tab.termSession = session
|
||||||
|
|
||||||
@ -393,9 +392,10 @@ class NeoTermActivity : AppCompatActivity(), ServiceConnection, SharedPreference
|
|||||||
|
|
||||||
private fun addNewSession(sessionName: String?, systemShell: Boolean, animation: Animation) {
|
private fun addNewSession(sessionName: String?, systemShell: Boolean, animation: Animation) {
|
||||||
val tab = createTab(sessionName) as TermTab
|
val tab = createTab(sessionName) as TermTab
|
||||||
tab.sessionCallback = TermSessionChangedCallback()
|
tab.sessionCallback = TermSessionCallback()
|
||||||
tab.viewClient = TermViewClient(this)
|
tab.viewClient = TermViewClient(this)
|
||||||
tab.termSession = termService!!.createTermSession(null, null, null, null, tab.sessionCallback, systemShell)
|
tab.termSession = termService!!.createTermSession(null, null,
|
||||||
|
null, null, null, tab.sessionCallback, systemShell)
|
||||||
|
|
||||||
if (sessionName != null) {
|
if (sessionName != null) {
|
||||||
tab.termSession!!.mSessionName = sessionName
|
tab.termSession!!.mSessionName = sessionName
|
||||||
|
123
app/src/main/java/io/neoterm/ui/term/NeoTermRemoteInterface.kt
Normal file
123
app/src/main/java/io/neoterm/ui/term/NeoTermRemoteInterface.kt
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
package io.neoterm.ui.term
|
||||||
|
|
||||||
|
import android.content.ComponentName
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.ServiceConnection
|
||||||
|
import android.net.Uri
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.os.IBinder
|
||||||
|
import android.support.v7.app.AppCompatActivity
|
||||||
|
import io.neoterm.preference.NeoPreference
|
||||||
|
import io.neoterm.services.NeoTermService
|
||||||
|
import io.neoterm.ui.term.tab.TermSessionCallback
|
||||||
|
import io.neoterm.utils.TerminalUtils
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author kiva
|
||||||
|
*/
|
||||||
|
class NeoTermRemoteInterface : AppCompatActivity(), ServiceConnection {
|
||||||
|
var termService: NeoTermService? = null
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
val serviceIntent = Intent(this, NeoTermService::class.java)
|
||||||
|
startService(serviceIntent)
|
||||||
|
if (!bindService(serviceIntent, this, 0)) {
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDestroy() {
|
||||||
|
super.onDestroy()
|
||||||
|
termService = null
|
||||||
|
unbindService(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onServiceDisconnected(name: ComponentName?) {
|
||||||
|
if (termService != null) {
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
|
||||||
|
termService = (service as NeoTermService.NeoTermBinder).service
|
||||||
|
if (termService == null) {
|
||||||
|
finish()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
handleIntent()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleIntent() {
|
||||||
|
val className = intent.component.className.substringAfterLast('.')
|
||||||
|
when (className) {
|
||||||
|
"TermHere" -> handleTermHere()
|
||||||
|
"UserScript" -> handleUserScript()
|
||||||
|
else -> openTerm(null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun openTerm(initialCommand: String?) {
|
||||||
|
val session = termService!!.createTermSession(null,
|
||||||
|
null, null, initialCommand,
|
||||||
|
null, TermSessionCallback(), false)
|
||||||
|
|
||||||
|
// Set current session to our new one
|
||||||
|
// In order to switch to it when entering NeoTermActivity
|
||||||
|
NeoPreference.storeCurrentSession(session)
|
||||||
|
|
||||||
|
val intent = Intent(this, NeoTermActivity::class.java)
|
||||||
|
intent.addCategory(Intent.CATEGORY_DEFAULT)
|
||||||
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
|
startActivity(intent)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleTermHere() {
|
||||||
|
if (intent.hasExtra(Intent.EXTRA_STREAM)) {
|
||||||
|
val extra = intent.extras.get(Intent.EXTRA_STREAM)
|
||||||
|
if (extra is Uri) {
|
||||||
|
val path = extra.path
|
||||||
|
val file = File(path)
|
||||||
|
val dirPath = if (file.isDirectory) path else file.parent
|
||||||
|
openTerm("cd " + TerminalUtils.escapeString(dirPath))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleUserScript() {
|
||||||
|
if (intent.hasExtra(Intent.EXTRA_STREAM)) {
|
||||||
|
val extra = intent.extras.get(Intent.EXTRA_STREAM)
|
||||||
|
val filesToHandle = mutableListOf<String>()
|
||||||
|
|
||||||
|
when (extra) {
|
||||||
|
is ArrayList<*> -> {
|
||||||
|
(0..extra.size - 1)
|
||||||
|
.map { extra[it] }
|
||||||
|
.takeWhile { it is Uri }
|
||||||
|
.mapTo(filesToHandle, { File((it as Uri).path).absolutePath })
|
||||||
|
}
|
||||||
|
is Uri -> {
|
||||||
|
filesToHandle.add(File(extra.path).absolutePath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filesToHandle.isNotEmpty()) {
|
||||||
|
openTerm("echo -e ${buildUserScriptArgument(filesToHandle)}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun buildUserScriptArgument(files: List<String>): String {
|
||||||
|
val builder = StringBuilder()
|
||||||
|
files.forEach {
|
||||||
|
builder.append(TerminalUtils.escapeString(it))
|
||||||
|
builder.append(" ")
|
||||||
|
}
|
||||||
|
return builder.toString()
|
||||||
|
}
|
||||||
|
}
|
@ -1,9 +0,0 @@
|
|||||||
package io.neoterm.ui.term
|
|
||||||
|
|
||||||
import android.support.v7.app.AppCompatActivity
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author kiva
|
|
||||||
*/
|
|
||||||
class TermHereActivity : AppCompatActivity() {
|
|
||||||
}
|
|
@ -13,7 +13,7 @@ import io.neoterm.view.TerminalView
|
|||||||
/**
|
/**
|
||||||
* @author kiva
|
* @author kiva
|
||||||
*/
|
*/
|
||||||
class TermSessionChangedCallback : TerminalSession.SessionChangedCallback {
|
class TermSessionCallback : TerminalSession.SessionChangedCallback {
|
||||||
var termView: TerminalView? = null
|
var termView: TerminalView? = null
|
||||||
var termTab: TermTab? = null
|
var termTab: TermTab? = null
|
||||||
|
|
@ -20,7 +20,7 @@ import org.greenrobot.eventbus.EventBus
|
|||||||
|
|
||||||
class TermTab(title: CharSequence) : Tab(title) {
|
class TermTab(title: CharSequence) : Tab(title) {
|
||||||
var termSession: TerminalSession? = null
|
var termSession: TerminalSession? = null
|
||||||
var sessionCallback: TermSessionChangedCallback? = null
|
var sessionCallback: TermSessionCallback? = null
|
||||||
var viewClient: TermViewClient? = null
|
var viewClient: TermViewClient? = null
|
||||||
var onAutoCompleteListener: OnAutoCompleteListener? = null
|
var onAutoCompleteListener: OnAutoCompleteListener? = null
|
||||||
var toolbar: Toolbar? = null
|
var toolbar: Toolbar? = null
|
||||||
|
@ -6,7 +6,7 @@ import android.hardware.SensorEvent
|
|||||||
import android.hardware.SensorEventListener
|
import android.hardware.SensorEventListener
|
||||||
import android.hardware.SensorManager
|
import android.hardware.SensorManager
|
||||||
|
|
||||||
class Shaker(context: Context) : SensorEventListener {
|
class ShakeUtils(context: Context) : SensorEventListener {
|
||||||
companion object {
|
companion object {
|
||||||
private val SHAKE_SENSITIVITY = 14
|
private val SHAKE_SENSITIVITY = 14
|
||||||
}
|
}
|
@ -4,9 +4,9 @@ import android.content.Context
|
|||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import io.neoterm.R
|
import io.neoterm.R
|
||||||
import io.neoterm.backend.TerminalSession
|
import io.neoterm.backend.TerminalSession
|
||||||
import io.neoterm.preference.NeoTermPath
|
|
||||||
import io.neoterm.customize.font.FontManager
|
import io.neoterm.customize.font.FontManager
|
||||||
import io.neoterm.preference.NeoPreference
|
import io.neoterm.preference.NeoPreference
|
||||||
|
import io.neoterm.preference.NeoTermPath
|
||||||
import io.neoterm.view.BasicViewClient
|
import io.neoterm.view.BasicViewClient
|
||||||
import io.neoterm.view.ExtraKeysView
|
import io.neoterm.view.ExtraKeysView
|
||||||
import io.neoterm.view.TerminalView
|
import io.neoterm.view.TerminalView
|
||||||
@ -31,11 +31,16 @@ object TerminalUtils {
|
|||||||
fun setupTerminalSession(session: TerminalSession?) {
|
fun setupTerminalSession(session: TerminalSession?) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createSession(context: Context, executablePath: String?, arguments: Array<String>?, cwd: String?, env: Array<String>?, sessionCallback: TerminalSession.SessionChangedCallback?, systemShell: Boolean): TerminalSession {
|
fun createSession(context: Context, executablePath: String?, arguments: Array<String>?,
|
||||||
|
cwd: String?, initialCommand: String?, env: Array<String>?,
|
||||||
|
sessionCallback: TerminalSession.SessionChangedCallback?,
|
||||||
|
systemShell: Boolean): TerminalSession {
|
||||||
|
|
||||||
var executablePath = executablePath
|
var executablePath = executablePath
|
||||||
var arguments = arguments
|
var arguments = arguments
|
||||||
|
var initialCommand = initialCommand
|
||||||
var cwd = cwd
|
var cwd = cwd
|
||||||
|
|
||||||
if (cwd == null) {
|
if (cwd == null) {
|
||||||
cwd = NeoTermPath.HOME_PATH
|
cwd = NeoTermPath.HOME_PATH
|
||||||
}
|
}
|
||||||
@ -56,10 +61,34 @@ object TerminalUtils {
|
|||||||
arguments = arrayOf<String>(executablePath)
|
arguments = arrayOf<String>(executablePath)
|
||||||
}
|
}
|
||||||
|
|
||||||
val session = TerminalSession(executablePath, cwd, arguments,
|
if (initialCommand == null) {
|
||||||
|
initialCommand = NeoPreference.loadString(R.string.key_general_initial_command, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
val session = TerminalSession(executablePath, cwd, initialCommand, arguments,
|
||||||
env ?: NeoPreference.buildEnvironment(cwd, systemShell, executablePath),
|
env ?: NeoPreference.buildEnvironment(cwd, systemShell, executablePath),
|
||||||
sessionCallback)
|
sessionCallback)
|
||||||
setupTerminalSession(session)
|
setupTerminalSession(session)
|
||||||
return session
|
return session
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun escapeString(s: String?): String {
|
||||||
|
if (s == null) {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
val builder = StringBuilder()
|
||||||
|
val specialChars = "\"\\$`!"
|
||||||
|
builder.append('"')
|
||||||
|
val length = s.length
|
||||||
|
for (i in 0..length - 1) {
|
||||||
|
val c = s[i]
|
||||||
|
if (specialChars.indexOf(c) >= 0) {
|
||||||
|
builder.append('\\')
|
||||||
|
}
|
||||||
|
builder.append(c)
|
||||||
|
}
|
||||||
|
builder.append('"')
|
||||||
|
return builder.toString()
|
||||||
|
}
|
||||||
}
|
}
|
@ -56,7 +56,7 @@ class TerminalDialog(val context: Context) {
|
|||||||
}
|
}
|
||||||
.create()
|
.create()
|
||||||
|
|
||||||
terminalSession = TerminalUtils.createSession(context, executablePath, arguments, null, null, terminalSessionCallback, false)
|
terminalSession = TerminalUtils.createSession(context, executablePath, arguments, null, null, null, terminalSessionCallback, false)
|
||||||
terminalView.attachSession(terminalSession)
|
terminalView.attachSession(terminalSession)
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
<string name="package_settings">软件包设置</string>
|
<string name="package_settings">软件包设置</string>
|
||||||
<string name="paste_text">粘贴</string>
|
<string name="paste_text">粘贴</string>
|
||||||
<string name="pref_general_backspace_map_to_esc">返回键发送ESC</string>
|
<string name="pref_general_backspace_map_to_esc">返回键发送ESC</string>
|
||||||
<string name="pref_general_backspace_map_to_esc_desc">当返回键按下时,发送ESC而不是退出终端</string>
|
<string name="pref_general_backspace_map_to_esc_desc">当返回键按下时,发送ESC而不是关闭窗口</string>
|
||||||
<string name="pref_general_bell">响铃</string>
|
<string name="pref_general_bell">响铃</string>
|
||||||
<string name="pref_general_bell_desc">收到 \'\\a\' 时响铃</string>
|
<string name="pref_general_bell_desc">收到 \'\\a\' 时响铃</string>
|
||||||
<string name="pref_general_shell_desc">登录时使用指定的 Shell</string>
|
<string name="pref_general_shell_desc">登录时使用指定的 Shell</string>
|
||||||
@ -16,10 +16,12 @@
|
|||||||
<string name="pref_general_vibrate_desc">收到 \'\\a\' 时振动</string>
|
<string name="pref_general_vibrate_desc">收到 \'\\a\' 时振动</string>
|
||||||
<string name="pref_general_program_selection">程序选择模式</string>
|
<string name="pref_general_program_selection">程序选择模式</string>
|
||||||
<string name="pref_general_program_selection_desc">当 NeoTerm 和 系统 中都含有同一个程序时,选择将要被执行的程序的模式</string>
|
<string name="pref_general_program_selection_desc">当 NeoTerm 和 系统 中都含有同一个程序时,选择将要被执行的程序的模式</string>
|
||||||
|
<string name="pref_general_initial_command">初始命令</string>
|
||||||
|
<string name="pref_general_initial_command_desc">在新的实例创建时执行命令</string>
|
||||||
<string name="pref_package_source">软件源</string>
|
<string name="pref_package_source">软件源</string>
|
||||||
<string name="pref_ui_close_tab_anim_next_tab">向下切换窗口</string>
|
<string name="pref_ui_close_tab_anim_next_tab">向下切换窗口</string>
|
||||||
<string name="pref_ui_close_tab_anim_next_tab_desc">关闭当前窗口时切换到下一个窗口而不是上一个</string>
|
<string name="pref_ui_close_tab_anim_next_tab_desc">关闭当前窗口时切换到下一个窗口而不是上一个</string>
|
||||||
<string name="customization_settings_desc">字体,主题,拓展键盘</string>
|
<string name="customization_settings_desc">字体,主题,拓展键盘,自动补全</string>
|
||||||
<string name="customization_settings">个性化</string>
|
<string name="customization_settings">个性化</string>
|
||||||
<string name="pref_ui_fullscreen">全屏</string>
|
<string name="pref_ui_fullscreen">全屏</string>
|
||||||
<string name="pref_ui_hide_toolbar">隐藏标题栏</string>
|
<string name="pref_ui_hide_toolbar">隐藏标题栏</string>
|
||||||
@ -47,7 +49,7 @@
|
|||||||
<string name="package_details">软件包: %s\n版本: %s\n依赖: %s\n占用空间: %s\n描述: %s\n主页: %s</string>
|
<string name="package_details">软件包: %s\n版本: %s\n依赖: %s\n占用空间: %s\n描述: %s\n主页: %s</string>
|
||||||
<string name="package_list_empty">软件包列表为空,请检查你的软件源</string>
|
<string name="package_list_empty">软件包列表为空,请检查你的软件源</string>
|
||||||
<string name="menu_refresh_list">刷新</string>
|
<string name="menu_refresh_list">刷新</string>
|
||||||
<string name="menu_update">更新, 刷新</string>
|
<string name="menu_update">更新并刷新</string>
|
||||||
|
|
||||||
<string-array name="pref_general_program_selection_entries">
|
<string-array name="pref_general_program_selection_entries">
|
||||||
<item>只使用 NeoTerm</item>
|
<item>只使用 NeoTerm</item>
|
||||||
@ -63,9 +65,9 @@
|
|||||||
<item>输入…</item>
|
<item>输入…</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
<string name="pref_customization_eks">拓展键盘</string>
|
<string name="pref_customization_eks">拓展键盘</string>
|
||||||
<string name="general_settings_desc">响铃,振动,Shell</string>
|
<string name="general_settings_desc">响铃,振动,Shell,初始命令</string>
|
||||||
<string name="ui_settings_desc">全屏,标题栏,快捷键盘</string>
|
<string name="ui_settings_desc">全屏,标题栏,切换动画</string>
|
||||||
<string name="package_settings_desc">源,更新,升级</string>
|
<string name="package_settings_desc">软件源,更新,升级</string>
|
||||||
<string name="install_font">安装字体</string>
|
<string name="install_font">安装字体</string>
|
||||||
<string name="install_color">安装配色方案</string>
|
<string name="install_color">安装配色方案</string>
|
||||||
<string name="setup_hello">发现</string>
|
<string name="setup_hello">发现</string>
|
||||||
@ -83,4 +85,5 @@
|
|||||||
<string name="service_release_lock">释放休眠锁</string>
|
<string name="service_release_lock">释放休眠锁</string>
|
||||||
<string name="exit">退出</string>
|
<string name="exit">退出</string>
|
||||||
<string name="term_here">在此处打开终端</string>
|
<string name="term_here">在此处打开终端</string>
|
||||||
|
<string name="user_script">用户脚本</string>
|
||||||
</resources>
|
</resources>
|
@ -5,6 +5,7 @@
|
|||||||
<string name="key_generaL_backspace_map_to_esc" translatable="false">neoterm_general_backspace_map_to_esc</string>
|
<string name="key_generaL_backspace_map_to_esc" translatable="false">neoterm_general_backspace_map_to_esc</string>
|
||||||
<string name="key_general_shell" translatable="false">neoterm_general_shell</string>
|
<string name="key_general_shell" translatable="false">neoterm_general_shell</string>
|
||||||
<string name="key_general_program_selection" translatable="false">neoterm_general_program_selection</string>
|
<string name="key_general_program_selection" translatable="false">neoterm_general_program_selection</string>
|
||||||
|
<string name="key_general_initial_command" translatable="false">neoterm_general_initial_command</string>
|
||||||
|
|
||||||
<string name="key_ui_fullscreen" translatable="false">neoterm_ui_fullscreen</string>
|
<string name="key_ui_fullscreen" translatable="false">neoterm_ui_fullscreen</string>
|
||||||
<string name="key_ui_hide_toolbar" translatable="false">neoterm_ui_hide_toolbar</string>
|
<string name="key_ui_hide_toolbar" translatable="false">neoterm_ui_hide_toolbar</string>
|
||||||
|
@ -20,12 +20,12 @@
|
|||||||
<string name="discovery">Discovery</string>
|
<string name="discovery">Discovery</string>
|
||||||
<string name="settings">Settings</string>
|
<string name="settings">Settings</string>
|
||||||
<string name="general_settings">General Settings</string>
|
<string name="general_settings">General Settings</string>
|
||||||
<string name="general_settings_desc">Bell, Vibrate, Shell</string>
|
<string name="general_settings_desc">Bell, Vibrate, Shell, Initial Command</string>
|
||||||
<string name="ui_settings">UI Settings</string>
|
<string name="ui_settings">UI Settings</string>
|
||||||
<string name="ui_settings_desc">FullScreen, Title Bar, Suggestions</string>
|
<string name="ui_settings_desc">FullScreen, Title Bar, Animation</string>
|
||||||
<string name="package_settings">Package Settings</string>
|
<string name="package_settings">Package Settings</string>
|
||||||
<string name="package_settings_desc">Source, Updates, Upgrades</string>
|
<string name="package_settings_desc">Source, Updates, Upgrades</string>
|
||||||
<string name="customization_settings_desc">Font, ColorScheme, ExtraKeys</string>
|
<string name="customization_settings_desc">Font, ColorScheme, ExtraKeys, AutoComplete</string>
|
||||||
<string name="customization_settings">Customization</string>
|
<string name="customization_settings">Customization</string>
|
||||||
|
|
||||||
<string name="toggle_ime">Toggle IME</string>
|
<string name="toggle_ime">Toggle IME</string>
|
||||||
@ -41,7 +41,7 @@
|
|||||||
<string name="package_details">Package: %s\nVersion: %s\nDepends: %s\nInstalled Size: %s\nDescription: %s\nHome Page: %s</string>
|
<string name="package_details">Package: %s\nVersion: %s\nDepends: %s\nInstalled Size: %s\nDescription: %s\nHome Page: %s</string>
|
||||||
<string name="package_list_empty">Package list is empty, please check out your source.</string>
|
<string name="package_list_empty">Package list is empty, please check out your source.</string>
|
||||||
<string name="menu_refresh_list">Refresh</string>
|
<string name="menu_refresh_list">Refresh</string>
|
||||||
<string name="menu_update">Update, Refresh</string>
|
<string name="menu_update">Update and Refresh</string>
|
||||||
<string name="install_font">Install Font</string>
|
<string name="install_font">Install Font</string>
|
||||||
<string name="install_color">Install Color Scheme</string>
|
<string name="install_color">Install Color Scheme</string>
|
||||||
|
|
||||||
@ -63,6 +63,8 @@
|
|||||||
<string name="pref_general_shell_desc">Which shell should we use when login</string>
|
<string name="pref_general_shell_desc">Which shell should we use when login</string>
|
||||||
<string name="pref_general_program_selection">Program Selection</string>
|
<string name="pref_general_program_selection">Program Selection</string>
|
||||||
<string name="pref_general_program_selection_desc">When both Neo Term and your Android OS have a program, which one should we choose?</string>
|
<string name="pref_general_program_selection_desc">When both Neo Term and your Android OS have a program, which one should we choose?</string>
|
||||||
|
<string name="pref_general_initial_command">Initial Command</string>
|
||||||
|
<string name="pref_general_initial_command_desc">Execute commands when a session is being created</string>
|
||||||
<string name="pref_ui_fullscreen">Full Screen</string>
|
<string name="pref_ui_fullscreen">Full Screen</string>
|
||||||
<string name="pref_ui_hide_toolbar">Hide Toolbar</string>
|
<string name="pref_ui_hide_toolbar">Hide Toolbar</string>
|
||||||
<string name="pref_ui_hide_toolbar_desc">Hide toolbar when keyboard is showing</string>
|
<string name="pref_ui_hide_toolbar_desc">Hide toolbar when keyboard is showing</string>
|
||||||
@ -78,6 +80,7 @@
|
|||||||
<string name="pref_package_source">Source</string>
|
<string name="pref_package_source">Source</string>
|
||||||
<string name="exit">Exit</string>
|
<string name="exit">Exit</string>
|
||||||
<string name="term_here">Term Here</string>
|
<string name="term_here">Term Here</string>
|
||||||
|
<string name="user_script">User Script</string>
|
||||||
|
|
||||||
<string-array name="pref_general_shell_entries" translatable="false">
|
<string-array name="pref_general_shell_entries" translatable="false">
|
||||||
<item>sh</item>
|
<item>sh</item>
|
||||||
@ -108,7 +111,7 @@
|
|||||||
|
|
||||||
<string-array name="pref_package_source_values" translatable="false">
|
<string-array name="pref_package_source_values" translatable="false">
|
||||||
<item>https://mirrors.geekpie.org/neoterm</item>
|
<item>https://mirrors.geekpie.org/neoterm</item>
|
||||||
<item>http://192.243.117.135</item>
|
<item>http://neoterm.studio</item>
|
||||||
<item>User-Input</item>
|
<item>User-Input</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
|
@ -8,6 +8,11 @@
|
|||||||
android:summary="@string/pref_general_shell_desc"
|
android:summary="@string/pref_general_shell_desc"
|
||||||
android:title="@string/pref_general_shell" />
|
android:title="@string/pref_general_shell" />
|
||||||
|
|
||||||
|
<EditTextPreference
|
||||||
|
android:key="@string/key_general_initial_command"
|
||||||
|
android:summary="@string/pref_general_initial_command_desc"
|
||||||
|
android:title="@string/pref_general_initial_command" />
|
||||||
|
|
||||||
<CheckBoxPreference
|
<CheckBoxPreference
|
||||||
android:defaultValue="false"
|
android:defaultValue="false"
|
||||||
android:key="@string/key_general_bell"
|
android:key="@string/key_general_bell"
|
||||||
@ -28,10 +33,10 @@
|
|||||||
|
|
||||||
<ListPreference
|
<ListPreference
|
||||||
android:defaultValue="NeoTermOnly"
|
android:defaultValue="NeoTermOnly"
|
||||||
android:key="@string/key_general_program_selection"
|
|
||||||
android:title="@string/pref_general_program_selection"
|
|
||||||
android:summary="@string/pref_general_program_selection_desc"
|
|
||||||
android:entries="@array/pref_general_program_selection_entries"
|
android:entries="@array/pref_general_program_selection_entries"
|
||||||
android:entryValues="@array/pref_general_program_selection_values"/>
|
android:entryValues="@array/pref_general_program_selection_values"
|
||||||
|
android:key="@string/key_general_program_selection"
|
||||||
|
android:summary="@string/pref_general_program_selection_desc"
|
||||||
|
android:title="@string/pref_general_program_selection" />
|
||||||
|
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
Reference in New Issue
Block a user