diff --git a/app/src/main/java/io/neoterm/NeoTermActivity.kt b/app/src/main/java/io/neoterm/NeoTermActivity.kt index b009fe6..6ce4118 100644 --- a/app/src/main/java/io/neoterm/NeoTermActivity.kt +++ b/app/src/main/java/io/neoterm/NeoTermActivity.kt @@ -11,6 +11,7 @@ import android.support.v4.view.OnApplyWindowInsetsListener import android.support.v4.view.ViewCompat import android.support.v7.app.AppCompatActivity import android.support.v7.widget.Toolbar +import android.util.Log import android.view.View import android.view.inputmethod.InputMethodManager import android.widget.ImageButton @@ -61,7 +62,25 @@ class NeoTermActivity : AppCompatActivity(), ServiceConnection { .setToolbarNavigationIcon(R.drawable.ic_add_box_white_24dp, createAddSessionListener()) tabSwitcher.inflateToolbarMenu(R.menu.tab_switcher, createToolbarMenuListener()) tabSwitcher.addListener(object : TabSwitcherListener { + private var tabSwitcherButtonInited = false + override fun onSwitcherShown(tabSwitcher: TabSwitcher) { + if (tabSwitcherButtonInited) { + return + } + + val menu = tabSwitcher.toolbarMenu + if (menu != null) { + tabSwitcherButtonInited = true + val tabSwitcherButton = menu.findItem(R.id.toggle_tab_switcher_menu_item).actionView as TabSwitcherButton + tabSwitcherButton.setOnClickListener { + if (tabSwitcher.isSwitcherShown) { + tabSwitcher.hideSwitcher() + } else { + tabSwitcher.showSwitcher() + } + } + } } override fun onSwitcherHidden(tabSwitcher: TabSwitcher) { @@ -79,13 +98,8 @@ class NeoTermActivity : AppCompatActivity(), ServiceConnection { override fun onTabRemoved(tabSwitcher: TabSwitcher, index: Int, tab: Tab, animation: Animation) { if (tab is TermTab) { - tab.termSession?.finishIfRunning() - tab.viewClient?.termView = null - tab.viewClient?.extraKeysView = null - tab.sessionCallback?.termView = null - removeFinishedSession(tab.termSession) - tab.termSession = null + tab.cleanup() } updateTabSwitcherButton() } @@ -180,7 +194,7 @@ class NeoTermActivity : AppCompatActivity(), ServiceConnection { } private fun getStoredCurrentSessionOrLast(): TerminalSession? { - val stored = NeoTermPreference.getCurrentSession(this) + val stored = NeoTermPreference.getCurrentSession(termService) if (stored != null) return stored val numberOfSessions = termService!!.sessions.size if (numberOfSessions == 0) return null diff --git a/app/src/main/java/io/neoterm/NeoTermService.java b/app/src/main/java/io/neoterm/NeoTermService.java index 2981b3a..2c3e34e 100644 --- a/app/src/main/java/io/neoterm/NeoTermService.java +++ b/app/src/main/java/io/neoterm/NeoTermService.java @@ -15,7 +15,6 @@ import android.util.Log; import java.util.ArrayList; import java.util.List; -import io.neoterm.tab.TermSessionChangedCallback; import io.neoterm.terminal.EmulatorDebug; import io.neoterm.terminal.TerminalSession; @@ -79,7 +78,7 @@ public class NeoTermService extends Service { return mTerminalSessions; } - TerminalSession createTermSession(String executablePath, String[] arguments, String cwd, String[] env, TermSessionChangedCallback sessionCallback) { + TerminalSession createTermSession(String executablePath, String[] arguments, String cwd, String[] env, TerminalSession.SessionChangedCallback sessionCallback) { if (cwd == null) cwd = getFilesDir().getAbsolutePath(); boolean isLoginShell = false; diff --git a/app/src/main/java/io/neoterm/preference/NeoTermPreference.kt b/app/src/main/java/io/neoterm/preference/NeoTermPreference.kt index 4f31157..b006a6d 100644 --- a/app/src/main/java/io/neoterm/preference/NeoTermPreference.kt +++ b/app/src/main/java/io/neoterm/preference/NeoTermPreference.kt @@ -4,6 +4,7 @@ import android.content.Context import android.preference.PreferenceManager import io.neoterm.NeoTermActivity +import io.neoterm.NeoTermService import io.neoterm.terminal.TerminalSession /** @@ -17,12 +18,12 @@ object NeoTermPreference { PreferenceManager.getDefaultSharedPreferences(context).edit().putString(NeoTermPreference.CURRENT_SESSION_KEY, session.mHandle).apply() } - fun getCurrentSession(termActivity: NeoTermActivity): TerminalSession? { - val sessionHandle = PreferenceManager.getDefaultSharedPreferences(termActivity).getString(CURRENT_SESSION_KEY, "") + fun getCurrentSession(termService: NeoTermService?): TerminalSession? { + val sessionHandle = PreferenceManager.getDefaultSharedPreferences(termService!!).getString(CURRENT_SESSION_KEY, "") var i = 0 - val len = termActivity.termService!!.sessions.size + val len = termService.sessions.size while (i < len) { - val session = termActivity.termService!!.sessions[i] + val session = termService.sessions[i] if (session.mHandle == sessionHandle) return session i++ } diff --git a/app/src/main/java/io/neoterm/tab/TermSessionChangedCallback.kt b/app/src/main/java/io/neoterm/tab/TermSessionChangedCallback.kt index 4da64fb..ee7e14b 100644 --- a/app/src/main/java/io/neoterm/tab/TermSessionChangedCallback.kt +++ b/app/src/main/java/io/neoterm/tab/TermSessionChangedCallback.kt @@ -8,13 +8,16 @@ import io.neoterm.view.TerminalView */ class TermSessionChangedCallback : TerminalSession.SessionChangedCallback { var termView: TerminalView? = null + var termTab: TermTab? = null override fun onTextChanged(changedSession: TerminalSession?) { termView?.onScreenUpdated() } override fun onTitleChanged(changedSession: TerminalSession?) { - + if (changedSession?.title != null) { + termTab?.updateTitle(changedSession.title) + } } override fun onSessionFinished(finishedSession: TerminalSession?) { @@ -22,15 +25,11 @@ class TermSessionChangedCallback : TerminalSession.SessionChangedCallback { } override fun onClipboardText(session: TerminalSession?, text: String?) { - } override fun onBell(session: TerminalSession?) { - } override fun onColorsChanged(session: TerminalSession?) { - } - } \ No newline at end of file diff --git a/app/src/main/java/io/neoterm/tab/TermTab.kt b/app/src/main/java/io/neoterm/tab/TermTab.kt index 5d40c38..6563aae 100644 --- a/app/src/main/java/io/neoterm/tab/TermTab.kt +++ b/app/src/main/java/io/neoterm/tab/TermTab.kt @@ -2,6 +2,7 @@ package io.neoterm.tab import android.os.Parcel import android.os.Parcelable +import android.support.v7.widget.Toolbar import de.mrapp.android.tabswitcher.Tab import io.neoterm.terminal.TerminalSession @@ -13,11 +14,22 @@ class TermTab : Tab { var termSession: TerminalSession? = null var sessionCallback: TermSessionChangedCallback? = null var viewClient: TermViewClient? = null + var toolbar: Toolbar? = null constructor(title: CharSequence) : super(title) private constructor(source: Parcel) : super(source) + fun cleanup() { + termSession?.finishIfRunning() + viewClient?.termView = null + viewClient?.extraKeysView = null + sessionCallback?.termView = null + sessionCallback?.termTab = null + toolbar = null + termSession = null + } + companion object { val CREATOR: Parcelable.Creator = object : Parcelable.Creator { override fun createFromParcel(source: Parcel): TermTab { @@ -29,4 +41,9 @@ class TermTab : Tab { } } } + + fun updateTitle(title: String) { + this.title = title + toolbar?.title = title + } } diff --git a/app/src/main/java/io/neoterm/tab/TermTabDecorator.kt b/app/src/main/java/io/neoterm/tab/TermTabDecorator.kt index 059c56b..54b0575 100644 --- a/app/src/main/java/io/neoterm/tab/TermTabDecorator.kt +++ b/app/src/main/java/io/neoterm/tab/TermTabDecorator.kt @@ -1,7 +1,6 @@ package io.neoterm.tab import android.content.Context -import android.graphics.Color import android.graphics.Typeface import android.os.Bundle import android.support.v7.widget.Toolbar @@ -13,7 +12,6 @@ import de.mrapp.android.tabswitcher.TabSwitcher import de.mrapp.android.tabswitcher.TabSwitcherDecorator import io.neoterm.NeoTermActivity import io.neoterm.R -import io.neoterm.terminal.TerminalSession import io.neoterm.view.ExtraKeysView import io.neoterm.view.TerminalView @@ -38,33 +36,45 @@ class TermTabDecorator(val context: NeoTermActivity) : TabSwitcherDecorator() { override fun onShowTab(context: Context, tabSwitcher: TabSwitcher, view: View, tab: Tab, index: Int, viewType: Int, savedInstanceState: Bundle?) { val toolbar = findViewById(R.id.terminal_toolbar) - toolbar?.title = tab.title + toolbar.title = tab.title + + if (tabSwitcher.isSwitcherShown) { + toolbar.visibility = View.GONE + } else { + toolbar.visibility = View.VISIBLE + } + + if (tab is TermTab) { + tab.toolbar = toolbar + } val terminalView = findViewById(R.id.terminal_view) val extraKeysView = findViewById(R.id.extra_keys) - setupTerminalView(tab, terminalView, extraKeysView) + bindTerminalView(tab, terminalView, extraKeysView) terminalView.requestFocus() } - private fun setupTerminalView(tab: Tab, view: TerminalView?, extraKeysView: ExtraKeysView?) { + private fun bindTerminalView(tab: Tab, view: TerminalView?, extraKeysView: ExtraKeysView?) { if (view == null) { return } - view.setBackgroundColor(Color.BLACK) view.textSize = 30 view.setTypeface(Typeface.MONOSPACE) - val termTab = tab as TermTab + if (tab is TermTab) { + val termTab = tab - // 复用前一次的 TermSession - termTab.sessionCallback?.termView = view + // 复用前一次的 TermSession + termTab.sessionCallback?.termView = view + termTab.sessionCallback?.termTab = tab - // 复用上一次的 TermViewClient - termTab.viewClient?.termView = view - termTab.viewClient?.extraKeysView = extraKeysView + // 复用上一次的 TermViewClient + termTab.viewClient?.termView = view + termTab.viewClient?.extraKeysView = extraKeysView - view.setOnKeyListener(termTab.viewClient) - view.attachSession(termTab.termSession) + view.setOnKeyListener(termTab.viewClient) + view.attachSession(termTab.termSession) + } } override fun getViewTypeCount(): Int { diff --git a/app/src/main/res/layout/term.xml b/app/src/main/res/layout/term.xml index 1edceb8..415e498 100644 --- a/app/src/main/res/layout/term.xml +++ b/app/src/main/res/layout/term.xml @@ -17,7 +17,7 @@ android:id="@+id/extra_keys" style="?android:buttonBarStyle" android:layout_width="match_parent" - android:layout_height="48dp" + android:layout_height="36dp" android:layout_alignParentBottom="true" android:background="@color/terminal_background" android:orientation="horizontal" /> diff --git a/build.gradle b/build.gradle index d51b410..5188cb1 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.0-alpha1' + classpath 'com.android.tools.build:gradle:3.0.0-alpha3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/chrome-tabs/src/main/java/de/mrapp/android/tabswitcher/Tab.java b/chrome-tabs/src/main/java/de/mrapp/android/tabswitcher/Tab.java index ff72303..9a3c154 100755 --- a/chrome-tabs/src/main/java/de/mrapp/android/tabswitcher/Tab.java +++ b/chrome-tabs/src/main/java/de/mrapp/android/tabswitcher/Tab.java @@ -27,6 +27,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StringRes; import android.support.v4.content.ContextCompat; +import android.support.v7.widget.Toolbar; import android.text.TextUtils; import java.util.LinkedHashSet; diff --git a/chrome-tabs/src/main/java/de/mrapp/android/tabswitcher/layout/phone/PhoneDragHandler.java b/chrome-tabs/src/main/java/de/mrapp/android/tabswitcher/layout/phone/PhoneDragHandler.java index e4532d6..d6a5b12 100755 --- a/chrome-tabs/src/main/java/de/mrapp/android/tabswitcher/layout/phone/PhoneDragHandler.java +++ b/chrome-tabs/src/main/java/de/mrapp/android/tabswitcher/layout/phone/PhoneDragHandler.java @@ -191,7 +191,8 @@ public class PhoneDragHandler extends AbstractDragHandler