/*
* Copyright (C) 2011 Steven Luo
*
* 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 jackpal.androidterm;
import android.app.ListActivity;
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.util.AttributeSet;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.ListView;
import jackpal.androidterm.compat.ActionBarCompat;
import jackpal.androidterm.compat.ActivityCompat;
import jackpal.androidterm.compat.AndroidCompat;
import jackpal.androidterm.util.SessionList;
public class WindowList extends ListActivity {
private SessionList sessions;
private WindowListAdapter mWindowListAdapter;
private TermService mTermService;
/**
* View which isn't automatically in the pressed state if its parent is
* pressed. This allows the window's entry to be pressed without the close
* button being triggered.
* Idea and code shamelessly borrowed from the Android browser's tabs list.
*
* Used by layout xml.
*/
public static class CloseButton extends ImageView {
public CloseButton(Context context) {
super(context);
}
public CloseButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CloseButton(Context context, AttributeSet attrs, int style) {
super(context, attrs, style);
}
@Override
public void setPressed(boolean pressed) {
if (pressed && ((View) getParent()).isPressed()) {
return;
}
super.setPressed(pressed);
}
}
private ServiceConnection mTSConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
TermService.TSBinder binder = (TermService.TSBinder) service;
mTermService = binder.getService();
populateList();
}
public void onServiceDisconnected(ComponentName arg0) {
mTermService = null;
}
};
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
ListView listView = getListView();
View newWindow = getLayoutInflater().inflate(R.layout.window_list_new_window, listView, false);
listView.addHeaderView(newWindow, null, true);
setResult(RESULT_CANCELED);
// Display up indicator on action bar home button
if (AndroidCompat.SDK >= 11) {
ActionBarCompat bar = ActivityCompat.getActionBar(this);
if (bar != null) {
bar.setDisplayOptions(ActionBarCompat.DISPLAY_HOME_AS_UP, ActionBarCompat.DISPLAY_HOME_AS_UP);
}
}
}
@Override
protected void onResume() {
super.onResume();
Intent TSIntent = new Intent(this, TermService.class);
if (!bindService(TSIntent, mTSConnection, BIND_AUTO_CREATE)) {
Log.w(TermDebug.LOG_TAG, "bind to service failed!");
}
}
@Override
protected void onPause() {
super.onPause();
WindowListAdapter adapter = mWindowListAdapter;
if (sessions != null) {
sessions.removeCallback(adapter);
sessions.removeTitleChangedListener(adapter);
}
if (adapter != null) {
adapter.setSessions(null);
}
unbindService(mTSConnection);
}
private void populateList() {
sessions = mTermService.getSessions();
WindowListAdapter adapter = mWindowListAdapter;
if (adapter == null) {
adapter = new WindowListAdapter(sessions);
setListAdapter(adapter);
mWindowListAdapter = adapter;
} else {
adapter.setSessions(sessions);
}
sessions.addCallback(adapter);
sessions.addTitleChangedListener(adapter);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Intent data = new Intent();
data.putExtra(Term.EXTRA_WINDOW_ID, position-1);
setResult(RESULT_OK, data);
finish();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case ActionBarCompat.ID_HOME:
// Action bar home button selected
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}