diff --git a/app/build.gradle b/app/build.gradle
index dacfdc7..6aefc8c 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -41,4 +41,5 @@ dependencies {
testCompile 'junit:junit:4.12'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile project(':chrome-tabs')
+ implementation 'com.android.support:design:25.3.1'
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 069dc6e..848c04b 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -2,6 +2,8 @@
+
+
-
-
-
-
@@ -42,6 +40,11 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/java/io/neoterm/preference/NeoTermPreference.kt b/app/src/main/java/io/neoterm/preference/NeoTermPreference.kt
index 3508e60..9d2ea10 100644
--- a/app/src/main/java/io/neoterm/preference/NeoTermPreference.kt
+++ b/app/src/main/java/io/neoterm/preference/NeoTermPreference.kt
@@ -1,6 +1,7 @@
package io.neoterm.preference
import android.content.Context
+import android.content.SharedPreferences
import android.preference.PreferenceManager
import io.neoterm.backend.TerminalSession
import io.neoterm.services.NeoTermService
@@ -10,17 +11,66 @@ import io.neoterm.services.NeoTermService
*/
object NeoTermPreference {
- var CURRENT_SESSION_KEY = "neoterm_current_session"
+ const val KEY_FONT_SIZE = "neoterm_general_font_size"
+ const val KEY_CURRENT_SESSION = "neoterm_service_current_session"
- fun storeCurrentSession(context: Context, session: TerminalSession) {
- PreferenceManager.getDefaultSharedPreferences(context)
- .edit()
- .putString(NeoTermPreference.CURRENT_SESSION_KEY, session.mHandle)
+ var preference: SharedPreferences? = null
+ var context: Context? = null
+
+ fun init(context: Context) {
+ this.context = context
+ preference = PreferenceManager.getDefaultSharedPreferences(context)
+ }
+
+ fun cleanup() {
+ preference = null
+ context = null
+ }
+
+ fun store(key: Int, value: Any) {
+ store(context!!.getString(key), value)
+ }
+
+ fun store(key: String, value: Any) {
+ when (value) {
+ is Int -> preference!!.edit().putInt(key, value).apply()
+ is String -> preference!!.edit().putString(key, value).apply()
+ is Boolean -> preference!!.edit().putBoolean(key, value).apply()
+ }
+ }
+
+ fun loadInt(key: Int, defaultValue: Int): Int {
+ return loadInt(context!!.getString(key), defaultValue)
+ }
+
+ fun loadString(key: Int, defaultValue: String?): String {
+ return loadString(context!!.getString(key), defaultValue)
+ }
+
+ fun loadBoolean(key: Int, defaultValue: Boolean): Boolean {
+ return loadBoolean(context!!.getString(key), defaultValue)
+ }
+
+ fun loadInt(key: String, defaultValue: Int): Int {
+ return preference!!.getInt(key, defaultValue)
+ }
+
+ fun loadString(key: String, defaultValue: String?): String {
+ return preference!!.getString(key, defaultValue)
+ }
+
+ fun loadBoolean(key: String, defaultValue: Boolean): Boolean {
+ return preference!!.getBoolean(key, defaultValue)
+ }
+
+ fun storeCurrentSession(session: TerminalSession) {
+ preference!!.edit()
+ .putString(NeoTermPreference.KEY_CURRENT_SESSION, session.mHandle)
.apply()
}
fun getCurrentSession(termService: NeoTermService?): TerminalSession? {
- val sessionHandle = PreferenceManager.getDefaultSharedPreferences(termService!!).getString(CURRENT_SESSION_KEY, "")
+ val sessionHandle = PreferenceManager.getDefaultSharedPreferences(termService!!).getString(KEY_CURRENT_SESSION, "")
var i = 0
val len = termService.sessions.size
while (i < len) {
diff --git a/app/src/main/java/io/neoterm/ui/AboutActivity.kt b/app/src/main/java/io/neoterm/ui/AboutActivity.kt
new file mode 100644
index 0000000..727dd0d
--- /dev/null
+++ b/app/src/main/java/io/neoterm/ui/AboutActivity.kt
@@ -0,0 +1,25 @@
+package io.neoterm.ui
+
+import android.os.Bundle
+import android.support.design.widget.FloatingActionButton
+import android.support.design.widget.Snackbar
+import android.support.v7.app.AppCompatActivity
+import android.support.v7.widget.Toolbar
+
+import io.neoterm.R
+
+class AboutActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_about)
+ val toolbar = findViewById(R.id.about_toolbar) as Toolbar
+ setSupportActionBar(toolbar)
+
+ val fab = findViewById(R.id.about_fab) as FloatingActionButton
+ fab.setOnClickListener({ view ->
+ Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
+ .setAction("Action", null).show()
+ })
+ }
+}
diff --git a/app/src/main/java/io/neoterm/ui/NeoTermActivity.kt b/app/src/main/java/io/neoterm/ui/NeoTermActivity.kt
index caafbfc..c4635af 100644
--- a/app/src/main/java/io/neoterm/ui/NeoTermActivity.kt
+++ b/app/src/main/java/io/neoterm/ui/NeoTermActivity.kt
@@ -12,6 +12,7 @@ import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.Toolbar
import android.view.KeyEvent
import android.view.View
+import android.view.WindowManager
import android.widget.ImageButton
import de.mrapp.android.tabswitcher.*
import de.mrapp.android.tabswitcher.view.TabSwitcherButton
@@ -45,11 +46,20 @@ class NeoTermActivity : AppCompatActivity(), ServiceConnection {
addNewSession(session)
}
switchToSession(getStoredCurrentSessionOrLast())
+ } else {
+ tabSwitcher.showSwitcher()
+ addNewSession("NeoTerm #0", createRevealAnimation())
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
+ NeoTermPreference.init(this)
+ if (NeoTermPreference.loadBoolean(R.string.key_ui_fullscreen, false)) {
+ window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
+ WindowManager.LayoutParams.FLAG_FULLSCREEN)
+ }
+
setContentView(R.layout.tab_main)
tabSwitcher = findViewById(R.id.tab_switcher) as TabSwitcher
@@ -68,16 +78,16 @@ class NeoTermActivity : AppCompatActivity(), ServiceConnection {
override fun onResume() {
super.onResume()
tabSwitcher.addListener(object : TabSwitcherListener {
- private var tabSwitcherButtonInited = false
+ private var tabSwitcherButtonInit = false
override fun onSwitcherShown(tabSwitcher: TabSwitcher) {
- if (tabSwitcherButtonInited) {
+ if (tabSwitcherButtonInit) {
return
}
val menu = tabSwitcher.toolbarMenu
if (menu != null) {
- tabSwitcherButtonInited = true
+ tabSwitcherButtonInit = true
val tabSwitcherButton = menu.findItem(R.id.toggle_tab_switcher_menu_item).actionView as TabSwitcherButton
tabSwitcherButton.setOnClickListener {
if (tabSwitcher.isSwitcherShown) {
@@ -94,7 +104,7 @@ class NeoTermActivity : AppCompatActivity(), ServiceConnection {
override fun onSelectionChanged(tabSwitcher: TabSwitcher, selectedTabIndex: Int, selectedTab: Tab?) {
if (selectedTab is TermTab && selectedTab.termSession != null) {
- NeoTermPreference.storeCurrentSession(this@NeoTermActivity, selectedTab.termSession!!)
+ NeoTermPreference.storeCurrentSession(selectedTab.termSession!!)
}
}
@@ -125,6 +135,7 @@ class NeoTermActivity : AppCompatActivity(), ServiceConnection {
termService = null
}
unbindService(this)
+ NeoTermPreference.cleanup()
}
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
diff --git a/app/src/main/java/io/neoterm/view/tab/TermSessionChangedCallback.kt b/app/src/main/java/io/neoterm/view/tab/TermSessionChangedCallback.kt
index d813c57..47ce936 100644
--- a/app/src/main/java/io/neoterm/view/tab/TermSessionChangedCallback.kt
+++ b/app/src/main/java/io/neoterm/view/tab/TermSessionChangedCallback.kt
@@ -3,7 +3,11 @@ package io.neoterm.view.tab
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
+import android.media.SoundPool
+import android.os.Vibrator
+import io.neoterm.R
import io.neoterm.backend.TerminalSession
+import io.neoterm.preference.NeoTermPreference
import io.neoterm.view.TerminalView
/**
@@ -13,6 +17,9 @@ class TermSessionChangedCallback : TerminalSession.SessionChangedCallback {
var termView: TerminalView? = null
var termTab: TermTab? = null
+ var bellId: Int = 0
+ var soundPool: SoundPool? = null
+
override fun onTextChanged(changedSession: TerminalSession?) {
termView?.onScreenUpdated()
}
@@ -35,6 +42,22 @@ class TermSessionChangedCallback : TerminalSession.SessionChangedCallback {
}
override fun onBell(session: TerminalSession?) {
+ if (termView == null) {
+ return
+ }
+
+ if (NeoTermPreference.loadBoolean(R.string.key_general_bell, false)) {
+ if (soundPool == null) {
+ soundPool = SoundPool.Builder().setMaxStreams(1).build()
+ bellId = soundPool!!.load(termView!!.context, R.raw.bell, 1)
+ }
+ soundPool?.play(bellId, 1f, 1f, 0, 0, 1f)
+ }
+
+ if (NeoTermPreference.loadBoolean(R.string.key_general_vibrate, false)) {
+ val vibrator = termView!!.context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
+ vibrator.vibrate(100)
+ }
}
override fun onColorsChanged(session: TerminalSession?) {
diff --git a/app/src/main/java/io/neoterm/view/tab/TermTabDecorator.kt b/app/src/main/java/io/neoterm/view/tab/TermTabDecorator.kt
index edf0253..4d1494b 100644
--- a/app/src/main/java/io/neoterm/view/tab/TermTabDecorator.kt
+++ b/app/src/main/java/io/neoterm/view/tab/TermTabDecorator.kt
@@ -10,9 +10,9 @@ import android.view.ViewGroup
import de.mrapp.android.tabswitcher.Tab
import de.mrapp.android.tabswitcher.TabSwitcher
import de.mrapp.android.tabswitcher.TabSwitcherDecorator
-import io.neoterm.ui.NeoTermActivity
import io.neoterm.R
-import io.neoterm.customize.color.builtin.MaterialColorScheme
+import io.neoterm.preference.NeoTermPreference
+import io.neoterm.ui.NeoTermActivity
import io.neoterm.view.ExtraKeysView
import io.neoterm.view.TerminalView
@@ -59,7 +59,7 @@ class TermTabDecorator(val context: NeoTermActivity) : TabSwitcherDecorator() {
if (view == null) {
return
}
- view.textSize = 30
+ view.textSize = NeoTermPreference.loadInt(NeoTermPreference.KEY_FONT_SIZE, 30)
view.setTypeface(Typeface.MONOSPACE)
if (tab is TermTab) {
diff --git a/app/src/main/java/io/neoterm/view/tab/TermViewClient.kt b/app/src/main/java/io/neoterm/view/tab/TermViewClient.kt
index 6d749f9..2fddcde 100644
--- a/app/src/main/java/io/neoterm/view/tab/TermViewClient.kt
+++ b/app/src/main/java/io/neoterm/view/tab/TermViewClient.kt
@@ -5,7 +5,9 @@ import android.view.InputDevice
import android.view.KeyEvent
import android.view.MotionEvent
import android.view.inputmethod.InputMethodManager
+import io.neoterm.R
import io.neoterm.backend.TerminalSession
+import io.neoterm.preference.NeoTermPreference
import io.neoterm.view.ExtraKeysView
import io.neoterm.view.TerminalView
import io.neoterm.view.TerminalViewClient
@@ -27,7 +29,9 @@ class TermViewClient(val context: Context) : TerminalViewClient {
if (scale < 0.9f || scale > 1.1f) {
val increase = scale > 1f
val changedSize = (if (increase) 1 else -1) * 2
- termView!!.textSize = termView!!.textSize + changedSize
+ val fontSize = termView!!.textSize + changedSize
+ termView!!.textSize = fontSize
+ NeoTermPreference.store(NeoTermPreference.KEY_FONT_SIZE, fontSize)
return 1.0f
}
return scale
@@ -39,7 +43,7 @@ class TermViewClient(val context: Context) : TerminalViewClient {
}
override fun shouldBackButtonBeMappedToEscape(): Boolean {
- return false
+ return NeoTermPreference.loadBoolean(R.string.key_generaL_backspace_map_to_esc, false)
}
override fun copyModeChanged(copyMode: Boolean) {
diff --git a/app/src/main/res/drawable-hdpi/ic_apps_white_36dp.png b/app/src/main/res/drawable-hdpi/ic_apps_white_36dp.png
new file mode 100644
index 0000000..5098d29
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_apps_white_36dp.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_general_white_36dp.png b/app/src/main/res/drawable-hdpi/ic_general_white_36dp.png
new file mode 100644
index 0000000..3a61724
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_general_white_36dp.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_info_white_36dp.png b/app/src/main/res/drawable-hdpi/ic_info_white_36dp.png
new file mode 100644
index 0000000..00f53ed
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_info_white_36dp.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_ui_white_36dp.png b/app/src/main/res/drawable-hdpi/ic_ui_white_36dp.png
new file mode 100644
index 0000000..7a3362a
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_ui_white_36dp.png differ
diff --git a/app/src/main/res/drawable/ic_terminal_running_white.xml b/app/src/main/res/drawable/ic_terminal_running_white.xml
new file mode 100755
index 0000000..06aa138
--- /dev/null
+++ b/app/src/main/res/drawable/ic_terminal_running_white.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml
new file mode 100644
index 0000000..a0b3a33
--- /dev/null
+++ b/app/src/main/res/layout/activity_about.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/content_about.xml b/app/src/main/res/layout/content_about.xml
new file mode 100644
index 0000000..30375df
--- /dev/null
+++ b/app/src/main/res/layout/content_about.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/tab_main.xml b/app/src/main/res/layout/tab_main.xml
index 97e5ac7..a0ed0c9 100644
--- a/app/src/main/res/layout/tab_main.xml
+++ b/app/src/main/res/layout/tab_main.xml
@@ -5,7 +5,7 @@
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="#ff14181c"
+ android:background="@color/terminal_background"
custom:layoutPolicy="auto"
custom:tabBackgroundColor="@color/tab_background_color"
custom:tabIcon="@drawable/ic_tab_icon"
diff --git a/app/src/main/res/raw/bell.ogg b/app/src/main/res/raw/bell.ogg
new file mode 100755
index 0000000..674f25d
Binary files /dev/null and b/app/src/main/res/raw/bell.ogg differ
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 79056d3..b8e99e6 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -2,6 +2,6 @@
#607D8B
#455A64
- #03A9F4
- #13181a
+ #FF5252
+ #ff14181c
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..da62b5f
--- /dev/null
+++ b/app/src/main/res/values/dimens.xml
@@ -0,0 +1,5 @@
+
+ 180dp
+ 16dp
+ 16dp
+
diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml
new file mode 100644
index 0000000..4d93391
--- /dev/null
+++ b/app/src/main/res/values/preference_keys.xml
@@ -0,0 +1,12 @@
+
+
+ neoterm_general_bell
+ neoterm_general_vibrate
+ neoterm_general_backspace_map_to_esc
+
+ neoterm_ui_fullscreen
+ neoterm_ui_font
+ neoterm_ui_color_scheme
+
+ neoterm_package_source
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index b77efaf..20a435a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -12,4 +12,17 @@
General Settings
UI Settings
Package Settings
+
+ Hello NeoTerm.
+
+ Bell
+ Bell when receiving \'\\a\'
+ Vibrate
+ Vibrate when receiving \'\\a\'
+ BackSpace Mapped to Esc
+ Send esc when backspace is pressed
+ Full Screen
+ Font
+ Color Scheme
+ Source
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 030c370..8870a63 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -1,7 +1,7 @@
-
+
+
+
+
diff --git a/app/src/main/res/xml/setting_general.xml b/app/src/main/res/xml/setting_general.xml
index 624ed13..df26501 100644
--- a/app/src/main/res/xml/setting_general.xml
+++ b/app/src/main/res/xml/setting_general.xml
@@ -1,4 +1,21 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/settings_main.xml b/app/src/main/res/xml/settings_main.xml
index cc57b2f..1992fce 100644
--- a/app/src/main/res/xml/settings_main.xml
+++ b/app/src/main/res/xml/settings_main.xml
@@ -1,25 +1,33 @@
-
+
-
+
-
+
-
+
diff --git a/app/src/main/res/xml/settings_package.xml b/app/src/main/res/xml/settings_package.xml
index 624ed13..24b20ec 100644
--- a/app/src/main/res/xml/settings_package.xml
+++ b/app/src/main/res/xml/settings_package.xml
@@ -1,4 +1,7 @@
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/settings_ui.xml b/app/src/main/res/xml/settings_ui.xml
index 624ed13..cdb3f3a 100644
--- a/app/src/main/res/xml/settings_ui.xml
+++ b/app/src/main/res/xml/settings_ui.xml
@@ -1,4 +1,18 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/chrome-tabs/src/main/java/de/mrapp/android/tabswitcher/TabSwitcher.java b/chrome-tabs/src/main/java/de/mrapp/android/tabswitcher/TabSwitcher.java
index bf201a8..3e693c6 100755
--- a/chrome-tabs/src/main/java/de/mrapp/android/tabswitcher/TabSwitcher.java
+++ b/chrome-tabs/src/main/java/de/mrapp/android/tabswitcher/TabSwitcher.java
@@ -1418,7 +1418,7 @@ public class TabSwitcher extends FrameLayout implements TabSwitcherLayout, Model
savedState.modelState = new Bundle();
Pair pair = null;
- if (getCount() > 0) {
+ if (getCount() > 0 && layout != null) {
pair = layout.detachLayout(true);
}
@@ -1434,8 +1434,10 @@ public class TabSwitcher extends FrameLayout implements TabSwitcherLayout, Model
model.setFirstVisibleTabIndex(-1);
}
- model.removeListener(layout);
- layout = null;
+ if (layout != null) {
+ model.removeListener(layout);
+ layout = null;
+ }
executePendingAction();
getViewTreeObserver().addOnGlobalLayoutListener(
new LayoutListenerWrapper(this, createGlobalLayoutListener(true)));