private void populateViewFlipper() { if (mTermService != null) { mTermSessions = mTermService.getSessions(); mTermSessions.addCallback(this); if (mTermSessions.size() == 0) { mTermSessions.add(createTermSession()); } for (TermSession session : mTermSessions) { EmulatorView view = createEmulatorView(session); mViewFlipper.addView(view); } updatePrefs(); Intent intent = getIntent(); int flags = intent.getFlags(); String action = intent.getAction(); if ((flags & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0 && action != null) { if (action.equals(RemoteInterface.PRIVACT_OPEN_NEW_WINDOW)) { mViewFlipper.setDisplayedChild(mTermSessions.size() - 1); } else if (action.equals(RemoteInterface.PRIVACT_SWITCH_WINDOW)) { int target = intent.getIntExtra(RemoteInterface.PRIVEXTRA_TARGET_WINDOW, -1); if (target >= 0) { mViewFlipper.setDisplayedChild(target); } } } mViewFlipper.resumeCurrentView(); } }
/** Keyboard shortcuts (tab management, paste) */ private boolean keyboardShortcuts(int keyCode, KeyEvent event) { if (event.getAction() != KeyEvent.ACTION_DOWN) { return false; } if (!mUseKeyboardShortcuts) { return false; } boolean isCtrlPressed = (event.getMetaState() & KeycodeConstants.META_CTRL_ON) != 0; boolean isShiftPressed = (event.getMetaState() & KeycodeConstants.META_SHIFT_ON) != 0; if (keyCode == KeycodeConstants.KEYCODE_TAB && isCtrlPressed) { if (isShiftPressed) { mViewFlipper.showPrevious(); } else { mViewFlipper.showNext(); } return true; } else if (keyCode == KeycodeConstants.KEYCODE_N && isCtrlPressed && isShiftPressed) { doCreateNewWindow(); return true; } else if (keyCode == KeycodeConstants.KEYCODE_V && isCtrlPressed && isShiftPressed) { doPaste(); return true; } else { return false; } }
public boolean onNavigationItemSelected(int position, long id) { int oldPosition = mViewFlipper.getDisplayedChild(); if (position != oldPosition) { mViewFlipper.setDisplayedChild(position); if (mActionBarMode == TermSettings.ACTION_BAR_MODE_HIDES) { mActionBar.hide(); } } return true; }
private void doCreateNewWindow() { if (mTermSessions == null) { Log.w(TermDebug.LOG_TAG, "Couldn't create new window because mTermSessions == null"); return; } TermSession session = createTermSession(); mTermSessions.add(session); TermView view = createEmulatorView(session); view.updatePrefs(mSettings); mViewFlipper.addView(view); mViewFlipper.setDisplayedChild(mViewFlipper.getChildCount() - 1); }
@Override protected void onNewIntent(Intent intent) { if ((intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) { // Don't repeat action if intent comes from history return; } String action = intent.getAction(); if (action == null) { return; } if (action.equals(RemoteInterface.PRIVACT_OPEN_NEW_WINDOW)) { // New session was created, add an EmulatorView to match SessionList sessions = mTermSessions; if (sessions == null) { // Presumably populateViewFlipper() will do this later ... return; } int position = sessions.size() - 1; TermSession session = sessions.get(position); EmulatorView view = createEmulatorView(session); mViewFlipper.addView(view); onResumeSelectWindow = position; } else if (action.equals(RemoteInterface.PRIVACT_SWITCH_WINDOW)) { int target = intent.getIntExtra(RemoteInterface.PRIVEXTRA_TARGET_WINDOW, -1); if (target >= 0) { onResumeSelectWindow = target; } } }
private TermSession getCurrentTermSession() { SessionList sessions = mTermSessions; if (sessions == null) { return null; } else { return sessions.get(mViewFlipper.getDisplayedChild()); } }
// Called when the list of sessions changes public void onUpdate() { SessionList sessions = mTermSessions; if (sessions == null) { return; } if (sessions.size() == 0) { mStopServiceOnFinish = true; finish(); } else if (sessions.size() < mViewFlipper.getChildCount()) { for (int i = 0; i < mViewFlipper.getChildCount(); ++i) { EmulatorView v = (EmulatorView) mViewFlipper.getChildAt(i); if (!sessions.contains(v.getTermSession())) { v.onPause(); mViewFlipper.removeView(v); --i; } } } }
private void doCloseWindow() { if (mTermSessions == null) { return; } EmulatorView view = getCurrentEmulatorView(); if (view == null) { return; } TermSession session = mTermSessions.remove(mViewFlipper.getDisplayedChild()); view.onPause(); session.finish(); mViewFlipper.removeView(view); if (mTermSessions.size() == 0) { mStopServiceOnFinish = true; finish(); } else { mViewFlipper.showNext(); } }
private void updatePrefs() { mUseKeyboardShortcuts = mSettings.getUseKeyboardShortcutsFlag(); DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); ColorScheme colorScheme = new ColorScheme(mSettings.getColorScheme()); mViewFlipper.updatePrefs(mSettings); for (View v : mViewFlipper) { ((EmulatorView) v).setDensity(metrics); ((TermView) v).updatePrefs(mSettings); } if (mTermSessions != null) { for (TermSession session : mTermSessions) { ((ShellTermSession) session).updatePrefs(mSettings); } } { Window win = getWindow(); WindowManager.LayoutParams params = win.getAttributes(); final int FULLSCREEN = WindowManager.LayoutParams.FLAG_FULLSCREEN; int desiredFlag = mSettings.showStatusBar() ? 0 : FULLSCREEN; if (desiredFlag != (params.flags & FULLSCREEN) || (AndroidCompat.SDK >= 11 && mActionBarMode != mSettings.actionBarMode())) { if (mAlreadyStarted) { // Can't switch to/from fullscreen after // starting the activity. restart(); } else { win.setFlags(desiredFlag, FULLSCREEN); if (mActionBarMode == TermSettings.ACTION_BAR_MODE_HIDES) { mActionBar.hide(); } } } } int orientation = mSettings.getScreenOrientation(); int o = 0; if (orientation == 0) { o = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; } else if (orientation == 1) { o = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; } else if (orientation == 2) { o = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; } else { /* Shouldn't be happened. */ } setRequestedOrientation(o); }
@Override public void onPause() { super.onPause(); SessionList sessions = mTermSessions; TermViewFlipper viewFlipper = mViewFlipper; viewFlipper.onPause(); if (sessions != null) { sessions.removeCallback(this); WindowListAdapter adapter = mWinListAdapter; if (adapter != null) { sessions.removeCallback(adapter); sessions.removeTitleChangedListener(adapter); viewFlipper.removeCallback(adapter); } } if (AndroidCompat.SDK < 5) { /* If we lose focus between a back key down and a back key up, we shouldn't respond to the next back key up event unless we get another key down first */ mBackKeyPressed = false; } /* Explicitly close the input method Otherwise, the soft keyboard could cover up whatever activity takes our place */ final IBinder token = viewFlipper.getWindowToken(); new Thread() { @Override public void run() { InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(token, 0); } }.start(); }
private void populateWindowList() { if (mActionBar == null) { // Not needed return; } if (mTermSessions != null) { int position = mViewFlipper.getDisplayedChild(); WindowListAdapter adapter = mWinListAdapter; if (adapter == null) { adapter = new WindowListActionBarAdapter(mTermSessions); mWinListAdapter = adapter; SessionList sessions = mTermSessions; sessions.addCallback(adapter); sessions.addTitleChangedListener(adapter); mViewFlipper.addCallback(adapter); mActionBar.setListNavigationCallbacks(adapter, mWinListItemSelected); } else { adapter.setSessions(mTermSessions); } mActionBar.setSelectedNavigationItem(position); } }
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mHaveFullHwKeyboard = checkHaveFullHwKeyboard(newConfig); EmulatorView v = (EmulatorView) mViewFlipper.getCurrentView(); if (v != null) { v.updateSize(false); } if (mWinListAdapter != null) { // Force Android to redraw the label in the navigation dropdown mWinListAdapter.notifyDataSetChanged(); } }
@Override public void onDestroy() { super.onDestroy(); mViewFlipper.removeAllViews(); unbindService(mTSConnection); if (mStopServiceOnFinish) { stopService(TSIntent); } mTermService = null; mTSConnection = null; if (mWakeLock.isHeld()) { mWakeLock.release(); } if (mWifiLock.isHeld()) { mWifiLock.release(); } }
@Override public void onResume() { super.onResume(); SessionList sessions = mTermSessions; TermViewFlipper viewFlipper = mViewFlipper; if (sessions != null) { sessions.addCallback(this); WindowListAdapter adapter = mWinListAdapter; if (adapter != null) { sessions.addCallback(adapter); sessions.addTitleChangedListener(adapter); viewFlipper.addCallback(adapter); } } if (sessions != null && sessions.size() < viewFlipper.getChildCount()) { for (int i = 0; i < viewFlipper.getChildCount(); ++i) { EmulatorView v = (EmulatorView) viewFlipper.getChildAt(i); if (!sessions.contains(v.getTermSession())) { v.onPause(); viewFlipper.removeView(v); --i; } } } mPrefs = PreferenceManager.getDefaultSharedPreferences(this); // the HOME dir needs to be set here since it comes from Context SharedPreferences.Editor editor = mPrefs.edit(); String defValue = getDir("HOME", MODE_PRIVATE).getAbsolutePath(); String homePath = mPrefs.getString("home_path", defValue); editor.putString("home_path", homePath); editor.commit(); mSettings.readPrefs(mPrefs); updatePrefs(); if (onResumeSelectWindow >= 0) { viewFlipper.setDisplayedChild(onResumeSelectWindow); onResumeSelectWindow = -1; } viewFlipper.onResume(); }
private void updatePrefs() { DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); ColorScheme colorScheme = new ColorScheme(mSettings.getColorScheme()); mViewFlipper.updatePrefs(mSettings); for (View v : mViewFlipper) { ((EmulatorView) v).setDensity(metrics); ((TermView) v).updatePrefs(mSettings); } if (mTermSessions != null) { for (TermSession session : mTermSessions) { ((ShellTermSession) session).updatePrefs(mSettings); } } { Window win = getWindow(); WindowManager.LayoutParams params = win.getAttributes(); final int FULLSCREEN = WindowManager.LayoutParams.FLAG_FULLSCREEN; int desiredFlag = mSettings.showStatusBar() ? 0 : FULLSCREEN; if (desiredFlag != (params.flags & FULLSCREEN) || (AndroidCompat.SDK >= 11 && mActionBarMode != mSettings.actionBarMode())) { if (mAlreadyStarted) { // Can't switch to/from fullscreen after // starting the activity. restart(); } else { win.setFlags(desiredFlag, FULLSCREEN); if (mActionBarMode == TermSettings.ACTION_BAR_MODE_HIDES) { mActionBar.hide(); } } } } }
private EmulatorView getCurrentEmulatorView() { return (EmulatorView) mViewFlipper.getCurrentView(); }