1package eu.siacs.conversations.ui;
2
3import android.os.Bundle;
4import android.os.Handler;
5import android.view.LayoutInflater;
6import android.view.Menu;
7import android.view.MenuItem;
8import android.view.View;
9import android.widget.ArrayAdapter;
10import android.widget.Button;
11import android.widget.CheckBox;
12import android.widget.EditText;
13import android.widget.ImageButton;
14import android.widget.LinearLayout;
15import android.widget.ScrollView;
16import android.widget.Spinner;
17import android.widget.TextView;
18
19import android.util.Log;
20
21import java.util.List;
22import java.util.concurrent.RunnableFuture;
23import java.util.concurrent.atomic.AtomicBoolean;
24
25import eu.siacs.conversations.Config;
26import eu.siacs.conversations.R;
27import eu.siacs.conversations.entities.Account;
28import eu.siacs.conversations.entities.ListItem;
29import eu.siacs.conversations.entities.Presence;
30import eu.siacs.conversations.entities.PresenceTemplate;
31import eu.siacs.conversations.utils.UIHelper;
32
33public class SetPresenceActivity extends XmppActivity implements View.OnClickListener {
34
35 //data
36 protected Account mAccount;
37 private List<PresenceTemplate> mTemplates;
38
39 //UI Elements
40 protected ScrollView mScrollView;
41 protected EditText mStatusMessage;
42 protected Spinner mShowSpinner;
43 protected CheckBox mAllAccounts;
44 protected LinearLayout mTemplatesView;
45
46 protected void onCreate(final Bundle savedInstanceState) {
47 super.onCreate(savedInstanceState);
48 setContentView(R.layout.activity_set_presence);
49 mScrollView = (ScrollView) findViewById(R.id.scroll_view);
50 mShowSpinner = (Spinner) findViewById(R.id.presence_show);
51 ArrayAdapter adapter = ArrayAdapter.createFromResource(this,
52 R.array.presence_show_options,
53 R.layout.simple_list_item);
54 mShowSpinner.setAdapter(adapter);
55 mShowSpinner.setSelection(1);
56 mStatusMessage = (EditText) findViewById(R.id.presence_status_message);
57 mAllAccounts = (CheckBox) findViewById(R.id.all_accounts);
58 mTemplatesView = (LinearLayout) findViewById(R.id.templates);
59 final Button changePresence = (Button) findViewById(R.id.change_presence);
60 changePresence.setOnClickListener(new View.OnClickListener() {
61 @Override
62 public void onClick(View v) {
63 executeChangePresence();
64 }
65 });
66 }
67
68 @Override
69 public boolean onCreateOptionsMenu(Menu menu) {
70 getMenuInflater().inflate(R.menu.change_presence, menu);
71 return super.onCreateOptionsMenu(menu);
72 }
73
74 @Override
75 public boolean onOptionsItemSelected(final MenuItem item) {
76 if (item.getItemId() == R.id.action_account_details) {
77 if (mAccount != null) {
78 switchToAccount(mAccount);
79 }
80 return true;
81 } else {
82 return super.onOptionsItemSelected(item);
83 }
84 }
85
86 private void executeChangePresence() {
87 Presence.Status status = getStatusFromSpinner();
88 boolean allAccounts = mAllAccounts.isChecked();
89 String statusMessage = mStatusMessage.getText().toString().trim();
90 if (allAccounts) {
91 xmppConnectionService.changeStatus(status, statusMessage);
92 } else if (mAccount != null) {
93 xmppConnectionService.changeStatus(mAccount, status, statusMessage);
94 }
95 finish();
96 }
97
98 private Presence.Status getStatusFromSpinner() {
99 switch (mShowSpinner.getSelectedItemPosition()) {
100 case 0:
101 return Presence.Status.CHAT;
102 case 2:
103 return Presence.Status.AWAY;
104 case 3:
105 return Presence.Status.XA;
106 case 4:
107 return Presence.Status.DND;
108 default:
109 return Presence.Status.ONLINE;
110 }
111 }
112
113 private void setStatusInSpinner(Presence.Status status) {
114 switch(status) {
115 case AWAY:
116 mShowSpinner.setSelection(2);
117 break;
118 case XA:
119 mShowSpinner.setSelection(3);
120 break;
121 case CHAT:
122 mShowSpinner.setSelection(0);
123 break;
124 case DND:
125 mShowSpinner.setSelection(4);
126 break;
127 default:
128 mShowSpinner.setSelection(1);
129 break;
130 }
131 }
132
133 @Override
134 protected void refreshUiReal() {
135
136 }
137
138 @Override
139 void onBackendConnected() {
140 mAccount = extractAccount(getIntent());
141 if (mAccount != null) {
142 setStatusInSpinner(mAccount.getPresenceStatus());
143 String message = mAccount.getPresenceStatusMessage();
144 if (mStatusMessage.getText().length() == 0 && message != null) {
145 mStatusMessage.append(message);
146 }
147 mTemplates = xmppConnectionService.databaseBackend.getPresenceTemplates();
148 }
149 redrawTemplates();
150 }
151
152 private void redrawTemplates() {
153 if (mTemplates == null || mTemplates.size() == 0) {
154 mTemplatesView.setVisibility(View.GONE);
155 } else {
156 mTemplatesView.removeAllViews();
157 mTemplatesView.setVisibility(View.VISIBLE);
158 LayoutInflater inflater = getLayoutInflater();
159 for (PresenceTemplate template : mTemplates) {
160 View templateLayout = inflater.inflate(R.layout.presence_template, mTemplatesView, false);
161 templateLayout.setTag(template);
162 setListItemBackgroundOnView(templateLayout);
163 templateLayout.setOnClickListener(this);
164 TextView message = (TextView) templateLayout.findViewById(R.id.presence_status_message);
165 TextView status = (TextView) templateLayout.findViewById(R.id.status);
166 ImageButton button = (ImageButton) templateLayout.findViewById(R.id.delete_button);
167 button.setTag(template);
168 button.setOnClickListener(this);
169 ListItem.Tag tag = UIHelper.getTagForStatus(this, template.getStatus());
170 status.setText(tag.getName());
171 status.setBackgroundColor(tag.getColor());
172 message.setText(template.getStatusMessage());
173 mTemplatesView.addView(templateLayout);
174 }
175 }
176 }
177
178 @Override
179 public void onClick(View v) {
180 PresenceTemplate template = (PresenceTemplate) v.getTag();
181 if (template == null) {
182 return;
183 }
184 if (v.getId() == R.id.presence_template) {
185 setStatusInSpinner(template.getStatus());
186 mStatusMessage.getEditableText().clear();
187 mStatusMessage.getEditableText().append(template.getStatusMessage());
188 new Handler().post(new Runnable() {
189 @Override
190 public void run() {
191 mScrollView.smoothScrollTo(0,0);
192 }
193 });
194 } else if (v.getId() == R.id.delete_button) {
195 xmppConnectionService.databaseBackend.deletePresenceTemplate(template);
196 mTemplates.remove(template);
197 redrawTemplates();
198 }
199 }
200}