blob: 025a14a2a7f7f7d5caac2b68988168b81c2f8593 [file] [log] [blame]
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.terminal;
import static com.android.terminal.Terminal.TAG;
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.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.PagerTitleStrip;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.util.SparseArray;
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 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();
invalidateOptionsMenu();
}
@Override
public void onServiceDisconnected(ComponentName name) {
mService = null;
throw new RuntimeException("Service in same process disconnected?");
}
};
private final PagerAdapter mTermAdapter = new PagerAdapter() {
private SparseArray<SparseArray<Parcelable>>
mSavedState = new SparseArray<SparseArray<Parcelable>>();
@Override
public int getCount() {
if (mService != null) {
return mService.getTerminals().size();
} else {
return 0;
}
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
final TerminalView view = new TerminalView(container.getContext());
view.setId(android.R.id.list);
final Terminal term = mService.getTerminals().valueAt(position);
view.setTerminal(term);
final SparseArray<Parcelable> state = mSavedState.get(term.key);
if (state != null) {
view.restoreHierarchyState(state);
}
container.addView(view);
view.requestFocus();
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
final TerminalView view = (TerminalView) object;
final int key = view.getTerminal().key;
SparseArray<Parcelable> state = mSavedState.get(key);
if (state == null) {
state = new SparseArray<Parcelable>();
mSavedState.put(key, state);
}
view.saveHierarchyState(state);
view.setTerminal(null);
container.removeView(view);
}
@Override
public int getItemPosition(Object object) {
final TerminalView view = (TerminalView) object;
final int key = view.getTerminal().key;
final int index = mService.getTerminals().indexOfKey(key);
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().valueAt(position).getTitle();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
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);
}
@Override
protected void onStop() {
super.onStop();
unbindService(mServiceConn);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
menu.findItem(R.id.menu_close_tab).setEnabled(mTermAdapter.getCount() > 0);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_new_tab: {
mService.createTerminal();
mTermAdapter.notifyDataSetChanged();
invalidateOptionsMenu();
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 int key = mService.getTerminals().keyAt(index);
mService.destroyTerminal(key);
mTermAdapter.notifyDataSetChanged();
invalidateOptionsMenu();
return true;
}
}
return false;
}
}