ConversationActivity.java

  1package de.gultsch.chat.ui;
  2
  3import java.util.HashMap;
  4
  5import de.gultsch.chat.Contact;
  6import de.gultsch.chat.Conversation;
  7import de.gultsch.chat.ConversationCursor;
  8import de.gultsch.chat.ConversationList;
  9import de.gultsch.chat.R;
 10import de.gultsch.chat.R.id;
 11import android.os.Bundle;
 12import android.app.Activity;
 13import android.app.FragmentTransaction;
 14import android.content.Context;
 15import android.content.Intent;
 16import android.support.v4.widget.SlidingPaneLayout;
 17import android.support.v4.widget.SlidingPaneLayout.PanelSlideListener;
 18import android.util.Log;
 19import android.view.KeyEvent;
 20import android.view.Menu;
 21import android.view.MenuItem;
 22import android.view.View;
 23import android.view.inputmethod.InputMethodManager;
 24import android.widget.AdapterView;
 25import android.widget.AdapterView.OnItemClickListener;
 26import android.widget.ListView;
 27import android.widget.SimpleCursorAdapter;
 28
 29public class ConversationActivity extends Activity {
 30
 31	public static final String START_CONVERSATION = "startconversation";
 32	public static final String CONVERSATION_CONTACT = "conversationcontact";
 33
 34	protected SlidingPaneLayout spl;
 35
 36	protected HashMap<Conversation, ConversationFragment> conversationFragments = new HashMap<Conversation, ConversationFragment>();
 37
 38	@Override
 39	protected void onCreate(Bundle savedInstanceState) {
 40		super.onCreate(savedInstanceState);
 41
 42		setContentView(R.layout.fragment_conversations_overview);
 43
 44		final ConversationList conversationList = new ConversationList();
 45
 46		String[] fromColumns = { ConversationCursor.NAME,
 47				ConversationCursor.LAST_MSG };
 48		int[] toViews = { R.id.conversation_name, R.id.conversation_lastmsg };
 49
 50		final SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
 51				R.layout.conversation_list_row, conversationList.getCursor(),
 52				fromColumns, toViews, 0);
 53		final ListView listView = (ListView) findViewById(R.id.list);
 54		listView.setAdapter(adapter);
 55
 56		listView.setOnItemClickListener(new OnItemClickListener() {
 57
 58			@Override
 59			public void onItemClick(AdapterView<?> arg0, View clickedView,
 60					int position, long arg3) {
 61				conversationList.setSelectedConversationPosition(position);
 62				swapConversationFragment(conversationList);
 63				getActionBar().setTitle(
 64						conversationList.getSelectedConversation().getName());
 65				spl.closePane();
 66			}
 67		});
 68		spl = (SlidingPaneLayout) findViewById(id.slidingpanelayout);
 69		spl.setParallaxDistance(150);
 70		spl.openPane();
 71		spl.setShadowResource(R.drawable.es_slidingpane_shadow);
 72		spl.setSliderFadeColor(0);
 73		spl.setPanelSlideListener(new PanelSlideListener() {
 74
 75			@Override
 76			public void onPanelOpened(View arg0) {
 77				getActionBar().setDisplayHomeAsUpEnabled(false);
 78				getActionBar().setTitle(R.string.app_name);
 79				invalidateOptionsMenu();
 80
 81				InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
 82
 83				View focus = getCurrentFocus();
 84
 85				if (focus != null) {
 86
 87					inputManager.hideSoftInputFromWindow(
 88							focus.getWindowToken(),
 89							InputMethodManager.HIDE_NOT_ALWAYS);
 90				}
 91				listView.requestFocus();
 92			}
 93
 94			@Override
 95			public void onPanelClosed(View arg0) {
 96				if (conversationList.size() > 0) {
 97					getActionBar().setDisplayHomeAsUpEnabled(true);
 98					getActionBar().setTitle(
 99							conversationList.getSelectedConversation()
100									.getName());
101					invalidateOptionsMenu();
102				}
103			}
104
105			@Override
106			public void onPanelSlide(View arg0, float arg1) {
107				// TODO Auto-generated method stub
108
109			}
110		});
111
112		if (getIntent().getAction().equals(Intent.ACTION_VIEW)) {
113			if (getIntent().getType().equals(
114					ConversationActivity.START_CONVERSATION)) {
115				Contact contact = (Contact) getIntent().getExtras().get(
116						ConversationActivity.CONVERSATION_CONTACT);
117				Log.d("gultsch",
118						"start conversation with " + contact.getDisplayName());
119				int pos = conversationList
120						.addAndReturnPosition(new Conversation(contact
121								.getDisplayName()));
122				conversationList.setSelectedConversationPosition(pos);
123				swapConversationFragment(conversationList);
124				spl.closePane();
125
126				// why do i even need this
127				getActionBar().setDisplayHomeAsUpEnabled(true);
128				getActionBar().setTitle(
129						conversationList.getSelectedConversation().getName());
130			}
131		} else {
132			// normal startup
133			if (conversationList.size() >= 1) {
134				conversationList.setSelectedConversationPosition(0);
135				swapConversationFragment(conversationList);
136			} else {
137				startActivity(new Intent(this, NewConversationActivity.class));
138			}
139		}
140	}
141
142	@Override
143	public boolean onCreateOptionsMenu(Menu menu) {
144		// Inflate the menu; this adds items to the action bar if it is present.
145		getMenuInflater().inflate(R.menu.conversations, menu);
146
147		if (spl.isOpen()) {
148			((MenuItem) menu.findItem(R.id.action_archive)).setVisible(false);
149			((MenuItem) menu.findItem(R.id.action_details)).setVisible(false);
150			((MenuItem) menu.findItem(R.id.action_security)).setVisible(false);
151		} else {
152			((MenuItem) menu.findItem(R.id.action_add)).setVisible(false);
153		}
154		return true;
155	}
156
157	@Override
158	public boolean onOptionsItemSelected(MenuItem item) {
159		switch (item.getItemId()) {
160		case android.R.id.home:
161			spl.openPane();
162			break;
163		case R.id.action_settings:
164			startActivity(new Intent(this, SettingsActivity.class));
165			break;
166		case R.id.action_accounts:
167			startActivity(new Intent(this, ManageAccountActivity.class));
168			break;
169		case R.id.action_add:
170			startActivity(new Intent(this, NewConversationActivity.class));
171		default:
172			break;
173		}
174		return super.onOptionsItemSelected(item);
175	}
176
177	protected void swapConversationFragment(
178			final ConversationList conversationList) {
179		ConversationFragment selectedFragment;
180		if (conversationFragments.containsKey(conversationList
181				.getSelectedConversation())) {
182			selectedFragment = conversationFragments.get(conversationList
183					.getSelectedConversation());
184		} else {
185			selectedFragment = new ConversationFragment();
186			conversationFragments.put(
187					conversationList.getSelectedConversation(),
188					selectedFragment);
189		}
190		FragmentTransaction transaction = getFragmentManager()
191				.beginTransaction();
192		transaction.replace(R.id.selected_conversation, selectedFragment);
193		transaction.commit();
194	}
195
196	@Override
197	public boolean onKeyDown(int keyCode, KeyEvent event) {
198		if (keyCode == KeyEvent.KEYCODE_BACK) {
199			if (!spl.isOpen()) {
200				spl.openPane();
201				return false;
202			}
203		}
204		return super.onKeyDown(keyCode, event);
205	}
206
207}