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