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}