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}