diff options
Diffstat (limited to 'src/com/android/terminal/TerminalActivity.java')
-rw-r--r-- | src/com/android/terminal/TerminalActivity.java | 141 |
1 files changed, 136 insertions, 5 deletions
diff --git a/src/com/android/terminal/TerminalActivity.java b/src/com/android/terminal/TerminalActivity.java index bef1859..99d2be6 100644 --- a/src/com/android/terminal/TerminalActivity.java +++ b/src/com/android/terminal/TerminalActivity.java @@ -17,23 +17,154 @@ package com.android.terminal; import android.app.Activity; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; import android.os.Bundle; +import android.os.IBinder; +import android.support.v4.view.PagerAdapter; +import android.support.v4.view.PagerTitleStrip; +import android.support.v4.view.ViewPager; import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +/** + * Activity that displays all {@link Terminal} instances running in a bound + * {@link TerminalService}. + */ public class TerminalActivity extends Activity { private static final String TAG = "Terminal"; + private TerminalService mService; + + private ViewPager mPager; + private PagerTitleStrip mTitles; + + private final ServiceConnection mServiceConn = new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + mService = ((TerminalService.ServiceBinder) service).getService(); + + final int size = mService.getTerminals().size(); + Log.d(TAG, "Bound to service with " + size + " active terminals"); + + // Give ourselves at least one terminal session + if (size == 0) { + mService.createTerminal(); + } + + // Bind UI to known terminals + mTermAdapter.notifyDataSetChanged(); + } + + @Override + public void onServiceDisconnected(ComponentName name) { + mService = null; + throw new RuntimeException("Service in same process disconnected?"); + } + }; + + private final PagerAdapter mTermAdapter = new PagerAdapter() { + @Override + public int getCount() { + if (mService != null) { + return mService.getTerminals().size(); + } else { + return 0; + } + } + + @Override + public Object instantiateItem(ViewGroup container, int position) { + final Terminal term = mService.getTerminals().get(position); + final TerminalView view = new TerminalView(container.getContext()); + view.setTerminal(term); + container.addView(view); + return view; + } + + @Override + public void destroyItem(ViewGroup container, int position, Object object) { + final TerminalView view = (TerminalView) object; + view.setTerminal(null); + container.removeView(view); + } + + @Override + public int getItemPosition(Object object) { + final int index = mService.getTerminals().indexOf(object); + if (index == -1) { + return POSITION_NONE; + } else { + return index; + } + } + + @Override + public boolean isViewFromObject(View view, Object object) { + return view == object; + } + + @Override + public CharSequence getPageTitle(int position) { + return mService.getTerminals().get(position).getTitle(); + } + }; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - final Terminal term = new Terminal(); - term.start(); + setContentView(R.layout.activity); + + mPager = (ViewPager) findViewById(R.id.pager); + mTitles = (PagerTitleStrip) findViewById(R.id.titles); + + mPager.setAdapter(mTermAdapter); + } + + @Override + protected void onStart() { + super.onStart(); + bindService( + new Intent(this, TerminalService.class), mServiceConn, Context.BIND_AUTO_CREATE); + } - final TerminalView view = new TerminalView(this, term); + @Override + protected void onStop() { + super.onStop(); + unbindService(mServiceConn); + } - setContentView(view); + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.activity, menu); + return true; + } - Log.d(TAG, "Rows: " + term.getRows()); + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.menu_new_tab: { + mService.createTerminal(); + mTermAdapter.notifyDataSetChanged(); + final int index = mService.getTerminals().size() - 1; + mPager.setCurrentItem(index, true); + return true; + } + case R.id.menu_close_tab: { + final int index = mPager.getCurrentItem(); + final Terminal term = mService.getTerminals().get(index); + mService.destroyTerminal(term); + // TODO: ask adamp about buggy zero item behavior + mTermAdapter.notifyDataSetChanged(); + return true; + } + } + return false; } } |