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 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}