ConversationActivity.java

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