SetPresenceActivity.java

  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}