SetPresenceActivity.java

  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}