diff options
author | Christian Schneppe <christian@pix-art.de> | 2018-04-01 22:14:30 +0200 |
---|---|---|
committer | Christian Schneppe <christian@pix-art.de> | 2018-04-01 22:14:30 +0200 |
commit | 0c9ba838e10d75713c2b51c22fb53a8ceb2f408c (patch) | |
tree | 7c07321883a10780f031b12c90bf65ecc557f678 /src/main/java/de/pixart/messenger/ui/EditAccountActivity.java | |
parent | 6dae9982e26a8ddcb0856f641acb247607c70143 (diff) |
finished 'Set Status Message' dialog
Diffstat (limited to 'src/main/java/de/pixart/messenger/ui/EditAccountActivity.java')
-rw-r--r-- | src/main/java/de/pixart/messenger/ui/EditAccountActivity.java | 88 |
1 files changed, 85 insertions, 3 deletions
diff --git a/src/main/java/de/pixart/messenger/ui/EditAccountActivity.java b/src/main/java/de/pixart/messenger/ui/EditAccountActivity.java index a24dd3691..eddbc44b6 100644 --- a/src/main/java/de/pixart/messenger/ui/EditAccountActivity.java +++ b/src/main/java/de/pixart/messenger/ui/EditAccountActivity.java @@ -1,9 +1,11 @@ package de.pixart.messenger.ui; +import android.app.Activity; import android.app.AlertDialog.Builder; import android.app.PendingIntent; import android.content.ActivityNotFoundException; import android.content.Intent; +import android.content.IntentSender; import android.content.SharedPreferences; import android.databinding.DataBindingUtil; import android.graphics.Bitmap; @@ -54,6 +56,7 @@ import de.pixart.messenger.crypto.axolotl.XmppAxolotlSession; import de.pixart.messenger.databinding.ActivityEditAccountBinding; import de.pixart.messenger.databinding.DialogPresenceBinding; import de.pixart.messenger.entities.Account; +import de.pixart.messenger.entities.Presence; import de.pixart.messenger.entities.PresenceTemplate; import de.pixart.messenger.services.BarcodeProvider; import de.pixart.messenger.services.XmppConnectionService; @@ -61,6 +64,7 @@ import de.pixart.messenger.services.XmppConnectionService.OnAccountUpdate; import de.pixart.messenger.services.XmppConnectionService.OnCaptchaRequested; import de.pixart.messenger.ui.adapter.KnownHostsAdapter; import de.pixart.messenger.ui.adapter.PresenceTemplateAdapter; +import de.pixart.messenger.ui.util.PendingItem; import de.pixart.messenger.utils.CryptoHelper; import de.pixart.messenger.utils.UIHelper; import de.pixart.messenger.utils.XmppUri; @@ -77,6 +81,7 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat OnKeyStatusUpdated, OnCaptchaRequested, KeyChainAliasCallback, XmppConnectionService.OnShowErrorToast, XmppConnectionService.OnMamPreferencesFetched { private static final int REQUEST_DATA_SAVER = 0xf244; + private static final int REQUEST_CHANGE_STATUS = 0xee11; private TextInputLayout mAccountJidLayout; private EditText mPassword; private TextInputLayout mPasswordLayout; @@ -125,6 +130,8 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat private Account mAccount; private String messageFingerprint; + private final PendingItem<PresenceTemplate> mPendingPresenceTemplate = new PendingItem<>(); + private boolean mFetchingAvatar = false; private final OnClickListener mSaveButtonClickListener = new OnClickListener() { @@ -436,6 +443,14 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat if (requestCode == REQUEST_BATTERY_OP || requestCode == REQUEST_DATA_SAVER) { updateAccountInformation(mAccount == null); } + if (requestCode == REQUEST_CHANGE_STATUS) { + PresenceTemplate template = mPendingPresenceTemplate.pop(); + if (template != null && resultCode == Activity.RESULT_OK) { + generateSignature(data, template); + } else { + Log.d(Config.LOGTAG, "pgp result not ok"); + } + } } @Override @@ -887,21 +902,88 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat boolean manualStatus = sharedPreferences.getBoolean(SettingsActivity.MANUALLY_CHANGE_PRESENCE, getResources().getBoolean(R.bool.manually_change_presence)); AlertDialog.Builder builder = new AlertDialog.Builder(this); final DialogPresenceBinding binding = DataBindingUtil.inflate(getLayoutInflater(), R.layout.dialog_presence, null, false); + String current = mAccount.getPresenceStatusMessage(); + if (current != null && !current.trim().isEmpty()) { + binding.statusMessage.append(current); + } + setAvailabilityRadioButton(mAccount.getPresenceStatus(), binding); binding.show.setVisibility(manualStatus ? View.VISIBLE : View.GONE); List<PresenceTemplate> templates = xmppConnectionService.getPresenceTemplates(mAccount); PresenceTemplateAdapter presenceTemplateAdapter = new PresenceTemplateAdapter(this, R.layout.simple_list_item, templates); binding.statusMessage.setAdapter(presenceTemplateAdapter); binding.statusMessage.setOnItemClickListener((parent, view, position, id) -> { PresenceTemplate template = (PresenceTemplate) parent.getItemAtPosition(position); - Log.d(Config.LOGTAG, "selected: " + template.getStatusMessage()); + setAvailabilityRadioButton(template.getStatus(), binding); }); - builder.setTitle(R.string.change_presence); + builder.setTitle(R.string.edit_status_message_title); builder.setView(binding.getRoot()); builder.setNegativeButton(R.string.cancel, null); - builder.setPositiveButton(R.string.confirm, null); + builder.setPositiveButton(R.string.confirm, (dialog, which) -> { + PresenceTemplate template = new PresenceTemplate(getAvailabilityRadioButton(binding), binding.statusMessage.getText().toString().trim()); + if (mAccount.getPgpId() != 0 && hasPgp()) { + generateSignature(null, template); + } else { + xmppConnectionService.changeStatus(mAccount, template, null); + } + }); builder.create().show(); } + private void generateSignature(Intent intent, PresenceTemplate template) { + xmppConnectionService.getPgpEngine().generateSignature(intent, mAccount, template.getStatusMessage(), new UiCallback<String>() { + @Override + public void success(String signature) { + xmppConnectionService.changeStatus(mAccount, template, signature); + } + + @Override + public void error(int errorCode, String object) { + + } + + @Override + public void userInputRequried(PendingIntent pi, String object) { + mPendingPresenceTemplate.push(template); + try { + startIntentSenderForResult(pi.getIntentSender(), REQUEST_CHANGE_STATUS, null, 0, 0, 0); + } catch (final IntentSender.SendIntentException ignored) { + } + } + }); + } + + private static void setAvailabilityRadioButton(Presence.Status status, DialogPresenceBinding binding) { + if (status == null) { + binding.online.setChecked(true); + return; + } + switch (status) { + case DND: + binding.dnd.setChecked(true); + break; + case XA: + binding.xa.setChecked(true); + break; + case AWAY: + binding.xa.setChecked(true); + break; + default: + binding.online.setChecked(true); + } + } + + private static Presence.Status getAvailabilityRadioButton(DialogPresenceBinding binding) { + if (binding.dnd.isChecked()) { + return Presence.Status.DND; + } else if (binding.xa.isChecked()) { + return Presence.Status.XA; + } else if (binding.away.isChecked()) { + return Presence.Status.AWAY; + } else { + return Presence.Status.ONLINE; + } + } + @Override public void alias(String alias) { if (alias != null) { |