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