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