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();
 }