From f045c0687a62d7ed9dcc62243216e72c5fd18d2b Mon Sep 17 00:00:00 2001 From: zt515 Date: Sun, 18 Jun 2017 03:12:23 +0800 Subject: [PATCH] Feature: Full Screen Mode --- app/src/main/AndroidManifest.xml | 1 - app/src/main/java/io/neoterm/NeoApp.java | 21 --- .../io/neoterm/customize/font/FontManager.kt | 9 +- .../java/io/neoterm/ui/NeoTermActivity.kt | 131 +++++++++++------- .../io/neoterm/utils/NeoTermFullScreen.java | 112 +++++++++++++++ .../io/neoterm/view/tab/TermTabDecorator.kt | 1 - app/src/main/res/values-zh/strings.xml | 7 + app/src/main/res/values/preference_keys.xml | 1 + app/src/main/res/values/strings.xml | 7 + app/src/main/res/xml/settings_ui.xml | 6 + .../android/tabswitcher/TabSwitcher.java | 4 +- 11 files changed, 224 insertions(+), 76 deletions(-) delete mode 100644 app/src/main/java/io/neoterm/NeoApp.java create mode 100644 app/src/main/java/io/neoterm/utils/NeoTermFullScreen.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 162a59f..cd4b62a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,7 +8,6 @@ - if (error == null) { - initShortcutKeys() - systemShell = false - if (!termService!!.sessions.isEmpty()) { - for (session in termService!!.sessions) { - addNewSession(session) - } - switchToSession(getStoredCurrentSessionOrLast()) - } else { - tabSwitcher.showSwitcher() - addNewSession("NeoTerm #0", systemShell, createRevealAnimation()) - } - } else { - AlertDialog.Builder(this@NeoTermActivity) - .setTitle("Error") - .setMessage(error.toString()) - .setNegativeButton("System Shell", { _, _ -> - tabSwitcher.showSwitcher() - addNewSession("NeoTerm #0", systemShell, createRevealAnimation()) - }) - .setPositiveButton("Retry", { dialog, _ -> - dialog.dismiss() - BaseFileInstaller.installBaseFiles(this@NeoTermActivity, resultListener) - }).show() - } - } - - BaseFileInstaller.installBaseFiles(this, resultListener) - } + var restartRequired = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) NeoPermission.initAppPermission(this, NeoPermission.REQUEST_APP_PERMISSION) + FontManager.init(this) NeoTermPreference.init(this) if (NeoTermPreference.loadBoolean(R.string.key_ui_fullscreen, false)) { @@ -92,6 +55,17 @@ class NeoTermActivity : AppCompatActivity(), ServiceConnection { setContentView(R.layout.tab_main) + val fullScreenHelper = NeoTermFullScreen.injectActivity(this) + fullScreenHelper.setKeyBoardListener({ isShow, _ -> + if (NeoTermPreference.loadBoolean(R.string.key_ui_fullscreen, false) + || NeoTermPreference.loadBoolean(R.string.key_ui_hide_toolbar, false)) { + if (tabSwitcher.selectedTab is TermTab) { + val tab = tabSwitcher.selectedTab as TermTab + tab.toolbar?.visibility = if (isShow) View.GONE else View.VISIBLE + } + } + }) + tabSwitcher = findViewById(R.id.tab_switcher) as TabSwitcher tabSwitcher.decorator = TermTabDecorator(this) ViewCompat.setOnApplyWindowInsetsListener(tabSwitcher, createWindowInsetsListener()) @@ -114,6 +88,13 @@ class NeoTermActivity : AppCompatActivity(), ServiceConnection { override fun onResume() { super.onResume() + if (restartRequired) { + restartRequired = false + this.recreate() + } + + PreferenceManager.getDefaultSharedPreferences(this) + .registerOnSharedPreferenceChangeListener(this) tabSwitcher.addListener(object : TabSwitcherListener { private var tabSwitcherButtonInit = false @@ -162,6 +143,8 @@ class NeoTermActivity : AppCompatActivity(), ServiceConnection { override fun onDestroy() { super.onDestroy() + PreferenceManager.getDefaultSharedPreferences(this) + .unregisterOnSharedPreferenceChangeListener(this) if (termService != null) { if (termService!!.sessions.isEmpty()) { termService!!.stopSelf() @@ -189,7 +172,7 @@ class NeoTermActivity : AppCompatActivity(), ServiceConnection { NeoPermission.REQUEST_APP_PERMISSION -> { if (grantResults.isEmpty() || grantResults[0] != PackageManager.PERMISSION_GRANTED) { - AlertDialog.Builder(this).setMessage("应用无法取得必须的权限,正在退出") + AlertDialog.Builder(this).setMessage(R.string.permission_denied) .setPositiveButton(android.R.string.ok, { _: DialogInterface, _: Int -> finish() }) @@ -200,6 +183,58 @@ class NeoTermActivity : AppCompatActivity(), ServiceConnection { } } + 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 + } + + var resultListener: BaseFileInstaller.ResultListener? = null + resultListener = BaseFileInstaller.ResultListener { error -> + if (error == null) { + initShortcutKeys() + systemShell = false + if (!termService!!.sessions.isEmpty()) { + for (session in termService!!.sessions) { + addNewSession(session) + } + switchToSession(getStoredCurrentSessionOrLast()) + } else { + tabSwitcher.showSwitcher() + addNewSession("NeoTerm #0", systemShell, createRevealAnimation()) + } + } else { + AlertDialog.Builder(this@NeoTermActivity) + .setTitle(R.string.error) + .setMessage(error.toString()) + .setNegativeButton(R.string.use_system_shell, { _, _ -> + tabSwitcher.showSwitcher() + addNewSession("NeoTerm #0", systemShell, createRevealAnimation()) + }) + .setPositiveButton(R.string.retry, { dialog, _ -> + dialog.dismiss() + BaseFileInstaller.installBaseFiles(this@NeoTermActivity, resultListener) + }).show() + } + } + + BaseFileInstaller.installBaseFiles(this, resultListener) + } + + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + if (key == getString(R.string.key_ui_fullscreen)) { + Toast.makeText(this, R.string.fullscreen_mode_changed, Toast.LENGTH_SHORT).show() + restartRequired = true + } + } + private fun addNewSession(session: TerminalSession?) { if (session == null) { return diff --git a/app/src/main/java/io/neoterm/utils/NeoTermFullScreen.java b/app/src/main/java/io/neoterm/utils/NeoTermFullScreen.java new file mode 100644 index 0000000..647e891 --- /dev/null +++ b/app/src/main/java/io/neoterm/utils/NeoTermFullScreen.java @@ -0,0 +1,112 @@ +package io.neoterm.utils; + +import android.app.Activity; +import android.graphics.Rect; +import android.view.View; +import android.view.ViewTreeObserver; +import android.widget.FrameLayout; + +/** + * Helper class to "adjustResize" Activity when we are in full screen mode and check IME status. + * Android Bug 5497: https://code.google.com/p/android/issues/detail?id=5497 + * author @kiva + */ +public class NeoTermFullScreen { + public static NeoTermFullScreen injectActivity(Activity activity) { + return new NeoTermFullScreen(activity); + } + + public interface KeyBoardListener { + /** + * call back + * + * @param isShow true is show else hidden + * @param keyboardHeight keyboard height + */ + void onKeyboardChange(boolean isShow, int keyboardHeight); + } + + private View mChildOfContent; + private int usableHeightPrevious; + private FrameLayout.LayoutParams frameLayoutParams; + + private int mOriginHeight; + private int mPreHeight; + private KeyBoardListener mKeyBoardListener; + + public void setKeyBoardListener(KeyBoardListener mKeyBoardListener) { + this.mKeyBoardListener = mKeyBoardListener; + } + + private NeoTermFullScreen(Activity activity) { + FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content); + mChildOfContent = content.getChildAt(0); + mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + public void onGlobalLayout() { + possiblyResizeChildOfContent(); + monitorImeStatus(); + } + }); + frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams(); + } + + private void monitorImeStatus() { + int currHeight = mChildOfContent.getHeight(); + if (currHeight == 0) { + // First time + return; + } + boolean hasChange = false; + if (mPreHeight == 0) { + mPreHeight = currHeight; + mOriginHeight = currHeight; + } else { + if (mPreHeight != currHeight) { + hasChange = true; + mPreHeight = currHeight; + } else { + hasChange = false; + } + } + if (hasChange) { + boolean isShow; + int keyboardHeight = 0; + if (Math.abs(mOriginHeight - currHeight) < 100) { + //hidden + isShow = false; + } else { + //show + keyboardHeight = mOriginHeight - currHeight; + isShow = true; + } + + if (mKeyBoardListener != null) { + mKeyBoardListener.onKeyboardChange(isShow, keyboardHeight); + } + } + } + + private void possiblyResizeChildOfContent() { + int usableHeightNow = computeUsableHeight(); + if (usableHeightNow != usableHeightPrevious) { + int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight(); + int heightDifference = usableHeightSansKeyboard - usableHeightNow; + if (heightDifference > (usableHeightSansKeyboard/4)) { + // keyboard probably just became visible + frameLayoutParams.height = usableHeightSansKeyboard - heightDifference; + } else { + // keyboard probably just became hidden + frameLayoutParams.height = usableHeightSansKeyboard; + } + mChildOfContent.requestLayout(); + usableHeightPrevious = usableHeightNow; + } + } + + private int computeUsableHeight() { + Rect r = new Rect(); + mChildOfContent.getWindowVisibleDisplayFrame(r); + return (r.bottom - r.top); + } + +} \ No newline at end of file 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 054e0ef..624cd9a 100644 --- a/app/src/main/java/io/neoterm/view/tab/TermTabDecorator.kt +++ b/app/src/main/java/io/neoterm/view/tab/TermTabDecorator.kt @@ -36,7 +36,6 @@ class TermTabDecorator(val context: NeoTermActivity) : TabSwitcherDecorator() { } context.tabSwitcher.showSwitcher() }) - return view } diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index d28d9f4..5eddb07 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -20,6 +20,8 @@ 配色方案 字体 全屏 + 隐藏标题栏 + 键盘显示时隐藏标题栏 显示建议 (需要 oh-my-zsh) 使用一些软件时,屏幕下方显示快捷键 为宽字符设置权重 @@ -31,4 +33,9 @@ 界面设置 Shell %s 未找到, 请先安装. 正在安装 + 全屏模式已改变,请重启 NeoTerm + NeoTerm 无法取得必需的权限,正在退出 + 还有这种操作? + 使用系统Shell + 重试 \ No newline at end of file diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index 9dc963e..2461be9 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -6,6 +6,7 @@ neoterm_general_shell neoterm_ui_fullscreen + neoterm_ui_hide_toolbar neoterm_ui_font neoterm_ui_color_scheme neoterm_ui_next_tab_anim diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cbddc8e..4bb501c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -24,6 +24,8 @@ Shell Which shell should we use when login Full Screen + Hide Toolbar + Hide toolbar when keyboard is showing Font Color Scheme Next tab animation @@ -35,6 +37,11 @@ Source Toggle IME Shell %s not found, please install it first. + FullScreen mode changed, please restart NeoTerm. + NeoTerm cannot get essential permissions, exiting. + Error + System Shell + Retry Default diff --git a/app/src/main/res/xml/settings_ui.xml b/app/src/main/res/xml/settings_ui.xml index 8f81c1a..debf9d5 100644 --- a/app/src/main/res/xml/settings_ui.xml +++ b/app/src/main/res/xml/settings_ui.xml @@ -6,6 +6,12 @@ android:key="@string/key_ui_fullscreen" android:title="@string/pref_ui_fullscreen" /> + + (); - listeners = new LinkedHashSet<>(); +// listeners = new LinkedHashSet<>(); + listeners = new CopyOnWriteArraySet<>(new LinkedHashSet()); model = new TabSwitcherModel(this); model.addListener(createModelListener()); getViewTreeObserver().addOnGlobalLayoutListener(