finished 'Set Status Message' dialog
This commit is contained in:
		
							parent
							
								
									76732af63d
								
							
						
					
					
						commit
						78fd19195d
					
				| @ -107,12 +107,6 @@ | |||||||
|             android:name=".ui.MagicCreateActivity" |             android:name=".ui.MagicCreateActivity" | ||||||
|             android:label="@string/create_account" |             android:label="@string/create_account" | ||||||
|             android:launchMode="singleTask"/> |             android:launchMode="singleTask"/> | ||||||
|         <activity |  | ||||||
|             android:name=".ui.SetPresenceActivity" |  | ||||||
|             android:configChanges="orientation|screenSize" |  | ||||||
|             android:label="@string/change_presence" |  | ||||||
|             android:launchMode="singleTop" |  | ||||||
|             android:windowSoftInputMode="stateHidden|adjustResize" /> |  | ||||||
|         <activity |         <activity | ||||||
|             android:name=".ui.SettingsActivity" |             android:name=".ui.SettingsActivity" | ||||||
|             android:label="@string/title_activity_settings" /> |             android:label="@string/title_activity_settings" /> | ||||||
|  | |||||||
| @ -198,7 +198,7 @@ public class PgpEngine { | |||||||
| 		}); | 		}); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public void generateSignature(Intent intent, final Account account, String status, final UiCallback<Account> callback) { | 	public void generateSignature(Intent intent, final Account account, String status, final UiCallback<String> callback) { | ||||||
| 		if (account.getPgpId() == 0) { | 		if (account.getPgpId() == 0) { | ||||||
| 			return; | 			return; | ||||||
| 		} | 		} | ||||||
| @ -232,19 +232,18 @@ public class PgpEngine { | |||||||
| 							} | 							} | ||||||
| 						} | 						} | ||||||
| 					} catch (IOException e) { | 					} catch (IOException e) { | ||||||
| 						callback.error(R.string.openpgp_error, account); | 						callback.error(R.string.openpgp_error, null); | ||||||
| 						return; | 						return; | ||||||
| 					} | 					} | ||||||
| 					account.setPgpSignature(signatureBuilder.toString()); | 					callback.success(signatureBuilder.toString()); | ||||||
| 					callback.success(account); |  | ||||||
| 					return; | 					return; | ||||||
| 				case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED: | 				case OpenPgpApi.RESULT_CODE_USER_INTERACTION_REQUIRED: | ||||||
| 					callback.userInputRequried(result.getParcelableExtra(OpenPgpApi.RESULT_INTENT), account); | 					callback.userInputRequried(result.getParcelableExtra(OpenPgpApi.RESULT_INTENT), status); | ||||||
| 					return; | 					return; | ||||||
| 				case OpenPgpApi.RESULT_CODE_ERROR: | 				case OpenPgpApi.RESULT_CODE_ERROR: | ||||||
| 					OpenPgpError error = result.getParcelableExtra(OpenPgpApi.RESULT_ERROR); | 					OpenPgpError error = result.getParcelableExtra(OpenPgpApi.RESULT_ERROR); | ||||||
| 					if (error != null && "signing subkey not found!".equals(error.getMessage())) { | 					if (error != null && "signing subkey not found!".equals(error.getMessage())) { | ||||||
| 						callback.error(0, account); | 						callback.error(0, null); | ||||||
| 					} else { | 					} else { | ||||||
| 						logError(account, error); | 						logError(account, error); | ||||||
| 						callback.error(R.string.unable_to_connect_to_keychain, null); | 						callback.error(R.string.unable_to_connect_to_keychain, null); | ||||||
|  | |||||||
| @ -644,6 +644,10 @@ public class DatabaseBackend extends SQLiteOpenHelper { | |||||||
| 
 | 
 | ||||||
| 	public void insertPresenceTemplate(PresenceTemplate template) { | 	public void insertPresenceTemplate(PresenceTemplate template) { | ||||||
| 		SQLiteDatabase db = this.getWritableDatabase(); | 		SQLiteDatabase db = this.getWritableDatabase(); | ||||||
|  | 		String whereToDelete = PresenceTemplate.MESSAGE+"=?"; | ||||||
|  | 		String[] whereToDeleteArgs = {template.getStatusMessage()}; | ||||||
|  | 		db.delete(PresenceTemplate.TABELNAME,whereToDelete,whereToDeleteArgs); | ||||||
|  | 		db.delete(PresenceTemplate.TABELNAME,PresenceTemplate.UUID+" not in (select "+PresenceTemplate.UUID+" from "+PresenceTemplate.TABELNAME+" order by "+PresenceTemplate.LAST_USED+" desc limit 9)",null); | ||||||
| 		db.insert(PresenceTemplate.TABELNAME, null, template.getContentValues()); | 		db.insert(PresenceTemplate.TABELNAME, null, template.getContentValues()); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| @ -658,14 +662,6 @@ public class DatabaseBackend extends SQLiteOpenHelper { | |||||||
| 		return templates; | 		return templates; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public void deletePresenceTemplate(PresenceTemplate template) { |  | ||||||
| 		Log.d(Config.LOGTAG,"deleting presence template with uuid "+template.getUuid()); |  | ||||||
| 		SQLiteDatabase db = this.getWritableDatabase(); |  | ||||||
| 		String where = PresenceTemplate.UUID+"=?"; |  | ||||||
| 		String[] whereArgs = {template.getUuid()}; |  | ||||||
| 		db.delete(PresenceTemplate.TABELNAME,where,whereArgs); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	public CopyOnWriteArrayList<Conversation> getConversations(int status) { | 	public CopyOnWriteArrayList<Conversation> getConversations(int status) { | ||||||
| 		CopyOnWriteArrayList<Conversation> list = new CopyOnWriteArrayList<>(); | 		CopyOnWriteArrayList<Conversation> list = new CopyOnWriteArrayList<>(); | ||||||
| 		SQLiteDatabase db = this.getReadableDatabase(); | 		SQLiteDatabase db = this.getReadableDatabase(); | ||||||
|  | |||||||
| @ -3474,15 +3474,16 @@ public class XmppConnectionService extends Service { | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private void sendPresence(final Account account, final boolean includeIdleTimestamp) { | 	private void sendPresence(final Account account, final boolean includeIdleTimestamp) { | ||||||
| 		PresencePacket packet; | 		Presence.Status status; | ||||||
| 		if (manuallyChangePresence()) { | 		if (manuallyChangePresence()) { | ||||||
| 			packet = mPresenceGenerator.selfPresence(account, account.getPresenceStatus()); | 			status = account.getPresenceStatus(); | ||||||
| 			String message = account.getPresenceStatusMessage(); |  | ||||||
| 			if (message != null && !message.isEmpty()) { |  | ||||||
| 				packet.addChild(new Element("status").setContent(message)); |  | ||||||
| 			} |  | ||||||
| 		} else { | 		} else { | ||||||
| 			packet = mPresenceGenerator.selfPresence(account, getTargetPresence()); | 			status = getTargetPresence(); | ||||||
|  | 		} | ||||||
|  | 		PresencePacket packet = mPresenceGenerator.selfPresence(account,status); | ||||||
|  | 		String message = account.getPresenceStatusMessage(); | ||||||
|  | 		if (message != null && !message.isEmpty()) { | ||||||
|  | 			packet.addChild(new Element("status").setContent(message)); | ||||||
| 		} | 		} | ||||||
| 		if (mLastActivity > 0 && includeIdleTimestamp) { | 		if (mLastActivity > 0 && includeIdleTimestamp) { | ||||||
| 			long since = Math.min(mLastActivity, System.currentTimeMillis()); //don't send future dates | 			long since = Math.min(mLastActivity, System.currentTimeMillis()); //don't send future dates | ||||||
| @ -3779,29 +3780,15 @@ public class XmppConnectionService extends Service { | |||||||
| 		return pending; | 		return pending; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public void changeStatus(Account account, Presence.Status status, String statusMessage, boolean send) { | 	public void changeStatus(Account account, PresenceTemplate template, String signature) { | ||||||
| 		if (!statusMessage.isEmpty()) { | 		if (!template.getStatusMessage().isEmpty()) { | ||||||
| 			databaseBackend.insertPresenceTemplate(new PresenceTemplate(status, statusMessage)); | 			databaseBackend.insertPresenceTemplate(template); | ||||||
| 		} | 		} | ||||||
| 		changeStatusReal(account, status, statusMessage, send); | 		account.setPgpSignature(signature); | ||||||
| 	} | 		account.setPresenceStatus(template.getStatus()); | ||||||
| 
 | 		account.setPresenceStatusMessage(template.getStatusMessage()); | ||||||
| 	private void changeStatusReal(Account account, Presence.Status status, String statusMessage, boolean send) { |  | ||||||
| 		account.setPresenceStatus(status); |  | ||||||
| 		account.setPresenceStatusMessage(statusMessage); |  | ||||||
| 		databaseBackend.updateAccount(account); | 		databaseBackend.updateAccount(account); | ||||||
| 		if (account.isEnabled() && send) { | 		sendPresence(account); | ||||||
| 			sendPresence(account); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	public void changeStatus(Presence.Status status, String statusMessage) { |  | ||||||
| 		if (!statusMessage.isEmpty()) { |  | ||||||
| 			databaseBackend.insertPresenceTemplate(new PresenceTemplate(status, statusMessage)); |  | ||||||
| 		} |  | ||||||
| 		for (Account account : getAccounts()) { |  | ||||||
| 			changeStatusReal(account, status, statusMessage, true); |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	public List<PresenceTemplate> getPresenceTemplates(Account account) { | 	public List<PresenceTemplate> getPresenceTemplates(Account account) { | ||||||
|  | |||||||
| @ -1,9 +1,11 @@ | |||||||
| package eu.siacs.conversations.ui; | package eu.siacs.conversations.ui; | ||||||
| 
 | 
 | ||||||
|  | import android.app.Activity; | ||||||
| import android.app.PendingIntent; | import android.app.PendingIntent; | ||||||
| import android.content.ActivityNotFoundException; | import android.content.ActivityNotFoundException; | ||||||
| import android.content.DialogInterface; | import android.content.DialogInterface; | ||||||
| import android.content.Intent; | import android.content.Intent; | ||||||
|  | import android.content.IntentSender; | ||||||
| import android.content.SharedPreferences; | import android.content.SharedPreferences; | ||||||
| import android.databinding.DataBindingUtil; | import android.databinding.DataBindingUtil; | ||||||
| import android.graphics.Bitmap; | import android.graphics.Bitmap; | ||||||
| @ -15,7 +17,6 @@ import android.provider.Settings; | |||||||
| import android.security.KeyChain; | import android.security.KeyChain; | ||||||
| import android.security.KeyChainAliasCallback; | import android.security.KeyChainAliasCallback; | ||||||
| import android.support.design.widget.TextInputLayout; | import android.support.design.widget.TextInputLayout; | ||||||
| import android.support.v4.content.ContextCompat; |  | ||||||
| import android.support.v7.app.ActionBar; | import android.support.v7.app.ActionBar; | ||||||
| import android.support.v7.app.AlertDialog; | import android.support.v7.app.AlertDialog; | ||||||
| import android.support.v7.app.AlertDialog.Builder; | import android.support.v7.app.AlertDialog.Builder; | ||||||
| @ -26,8 +27,6 @@ import android.view.Menu; | |||||||
| import android.view.MenuItem; | import android.view.MenuItem; | ||||||
| import android.view.View; | import android.view.View; | ||||||
| import android.view.View.OnClickListener; | import android.view.View.OnClickListener; | ||||||
| import android.widget.AdapterView; |  | ||||||
| import android.widget.AutoCompleteTextView; |  | ||||||
| import android.widget.Button; | import android.widget.Button; | ||||||
| import android.widget.CheckBox; | import android.widget.CheckBox; | ||||||
| import android.widget.CompoundButton; | import android.widget.CompoundButton; | ||||||
| @ -57,6 +56,7 @@ import eu.siacs.conversations.crypto.axolotl.XmppAxolotlSession; | |||||||
| import eu.siacs.conversations.databinding.ActivityEditAccountBinding; | import eu.siacs.conversations.databinding.ActivityEditAccountBinding; | ||||||
| import eu.siacs.conversations.databinding.DialogPresenceBinding; | import eu.siacs.conversations.databinding.DialogPresenceBinding; | ||||||
| import eu.siacs.conversations.entities.Account; | import eu.siacs.conversations.entities.Account; | ||||||
|  | import eu.siacs.conversations.entities.Presence; | ||||||
| import eu.siacs.conversations.entities.PresenceTemplate; | import eu.siacs.conversations.entities.PresenceTemplate; | ||||||
| import eu.siacs.conversations.services.BarcodeProvider; | import eu.siacs.conversations.services.BarcodeProvider; | ||||||
| import eu.siacs.conversations.services.XmppConnectionService; | import eu.siacs.conversations.services.XmppConnectionService; | ||||||
| @ -64,6 +64,7 @@ import eu.siacs.conversations.services.XmppConnectionService.OnAccountUpdate; | |||||||
| import eu.siacs.conversations.services.XmppConnectionService.OnCaptchaRequested; | import eu.siacs.conversations.services.XmppConnectionService.OnCaptchaRequested; | ||||||
| import eu.siacs.conversations.ui.adapter.KnownHostsAdapter; | import eu.siacs.conversations.ui.adapter.KnownHostsAdapter; | ||||||
| import eu.siacs.conversations.ui.adapter.PresenceTemplateAdapter; | import eu.siacs.conversations.ui.adapter.PresenceTemplateAdapter; | ||||||
|  | import eu.siacs.conversations.ui.util.PendingItem; | ||||||
| import eu.siacs.conversations.ui.widget.DisabledActionModeCallback; | import eu.siacs.conversations.ui.widget.DisabledActionModeCallback; | ||||||
| import eu.siacs.conversations.utils.CryptoHelper; | import eu.siacs.conversations.utils.CryptoHelper; | ||||||
| import eu.siacs.conversations.utils.UIHelper; | import eu.siacs.conversations.utils.UIHelper; | ||||||
| @ -82,6 +83,7 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat | |||||||
| 		OnKeyStatusUpdated, OnCaptchaRequested, KeyChainAliasCallback, XmppConnectionService.OnShowErrorToast, XmppConnectionService.OnMamPreferencesFetched { | 		OnKeyStatusUpdated, OnCaptchaRequested, KeyChainAliasCallback, XmppConnectionService.OnShowErrorToast, XmppConnectionService.OnMamPreferencesFetched { | ||||||
| 
 | 
 | ||||||
| 	private static final int REQUEST_DATA_SAVER = 0xf244; | 	private static final int REQUEST_DATA_SAVER = 0xf244; | ||||||
|  | 	private static final int REQUEST_CHANGE_STATUS = 0xee11; | ||||||
| 	private TextInputLayout mAccountJidLayout; | 	private TextInputLayout mAccountJidLayout; | ||||||
| 	private EditText mPassword; | 	private EditText mPassword; | ||||||
| 	private TextInputLayout mPasswordLayout; | 	private TextInputLayout mPasswordLayout; | ||||||
| @ -126,6 +128,8 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat | |||||||
| 	private Account mAccount; | 	private Account mAccount; | ||||||
| 	private String messageFingerprint; | 	private String messageFingerprint; | ||||||
| 
 | 
 | ||||||
|  | 	private final PendingItem<PresenceTemplate> mPendingPresenceTemplate = new PendingItem<>(); | ||||||
|  | 
 | ||||||
| 	private boolean mFetchingAvatar = false; | 	private boolean mFetchingAvatar = false; | ||||||
| 
 | 
 | ||||||
| 	private final OnClickListener mSaveButtonClickListener = new OnClickListener() { | 	private final OnClickListener mSaveButtonClickListener = new OnClickListener() { | ||||||
| @ -429,6 +433,14 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat | |||||||
| 		if (requestCode == REQUEST_BATTERY_OP || requestCode == REQUEST_DATA_SAVER) { | 		if (requestCode == REQUEST_BATTERY_OP || requestCode == REQUEST_DATA_SAVER) { | ||||||
| 			updateAccountInformation(mAccount == null); | 			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 | 	@Override | ||||||
| @ -843,21 +855,88 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat | |||||||
| 		boolean manualStatus = sharedPreferences.getBoolean(SettingsActivity.MANUALLY_CHANGE_PRESENCE, getResources().getBoolean(R.bool.manually_change_presence)); | 		boolean manualStatus = sharedPreferences.getBoolean(SettingsActivity.MANUALLY_CHANGE_PRESENCE, getResources().getBoolean(R.bool.manually_change_presence)); | ||||||
| 		AlertDialog.Builder builder = new AlertDialog.Builder(this); | 		AlertDialog.Builder builder = new AlertDialog.Builder(this); | ||||||
| 		final DialogPresenceBinding binding = DataBindingUtil.inflate(getLayoutInflater(),R.layout.dialog_presence,null,false); | 		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); | 		binding.show.setVisibility(manualStatus ? View.VISIBLE : View.GONE); | ||||||
| 		List<PresenceTemplate> templates = xmppConnectionService.getPresenceTemplates(mAccount); | 		List<PresenceTemplate> templates = xmppConnectionService.getPresenceTemplates(mAccount); | ||||||
| 		PresenceTemplateAdapter presenceTemplateAdapter = new PresenceTemplateAdapter(this,R.layout.simple_list_item,templates); | 		PresenceTemplateAdapter presenceTemplateAdapter = new PresenceTemplateAdapter(this,R.layout.simple_list_item,templates); | ||||||
| 		binding.statusMessage.setAdapter(presenceTemplateAdapter); | 		binding.statusMessage.setAdapter(presenceTemplateAdapter); | ||||||
| 		binding.statusMessage.setOnItemClickListener((parent, view, position, id) -> { | 		binding.statusMessage.setOnItemClickListener((parent, view, position, id) -> { | ||||||
| 			PresenceTemplate template = (PresenceTemplate) parent.getItemAtPosition(position); | 			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.setView(binding.getRoot()); | ||||||
| 		builder.setNegativeButton(R.string.cancel,null); | 		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(); | 		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 | 	@Override | ||||||
| 	public void alias(String alias) { | 	public void alias(String alias) { | ||||||
| 		if (alias != null) { | 		if (alias != null) { | ||||||
|  | |||||||
| @ -1,213 +0,0 @@ | |||||||
| package eu.siacs.conversations.ui; |  | ||||||
| 
 |  | ||||||
| import android.content.Intent; |  | ||||||
| import android.databinding.DataBindingUtil; |  | ||||||
| import android.os.Bundle; |  | ||||||
| import android.os.Handler; |  | ||||||
| import android.util.Pair; |  | ||||||
| import android.view.LayoutInflater; |  | ||||||
| import android.view.Menu; |  | ||||||
| import android.view.MenuItem; |  | ||||||
| import android.view.View; |  | ||||||
| import android.widget.ArrayAdapter; |  | ||||||
| import android.widget.Button; |  | ||||||
| import android.widget.CheckBox; |  | ||||||
| import android.widget.EditText; |  | ||||||
| import android.widget.ImageButton; |  | ||||||
| import android.widget.LinearLayout; |  | ||||||
| import android.widget.ScrollView; |  | ||||||
| import android.widget.Spinner; |  | ||||||
| import android.widget.TextView; |  | ||||||
| 
 |  | ||||||
| import java.util.List; |  | ||||||
| 
 |  | ||||||
| import eu.siacs.conversations.R; |  | ||||||
| import eu.siacs.conversations.databinding.ActivitySetPresenceBinding; |  | ||||||
| import eu.siacs.conversations.entities.Account; |  | ||||||
| import eu.siacs.conversations.entities.ListItem; |  | ||||||
| import eu.siacs.conversations.entities.Presence; |  | ||||||
| import eu.siacs.conversations.entities.PresenceTemplate; |  | ||||||
| import eu.siacs.conversations.utils.UIHelper; |  | ||||||
| 
 |  | ||||||
| public class SetPresenceActivity extends XmppActivity implements View.OnClickListener { |  | ||||||
| 
 |  | ||||||
| 	//data |  | ||||||
| 	protected Account mAccount; |  | ||||||
| 	private List<PresenceTemplate> mTemplates; |  | ||||||
| 
 |  | ||||||
| 	private ActivitySetPresenceBinding binding; |  | ||||||
| 
 |  | ||||||
| 	private Pair<Integer, Intent> mPostponedActivityResult; |  | ||||||
| 
 |  | ||||||
| 	private Runnable onPresenceChanged = new Runnable() { |  | ||||||
| 		@Override |  | ||||||
| 		public void run() { |  | ||||||
| 			finish(); |  | ||||||
| 		} |  | ||||||
| 	}; |  | ||||||
| 
 |  | ||||||
| 	protected void onCreate(final Bundle savedInstanceState) { |  | ||||||
| 		super.onCreate(savedInstanceState); |  | ||||||
| 		this.binding = DataBindingUtil.setContentView(this,R.layout.activity_set_presence); |  | ||||||
| 		ArrayAdapter adapter = ArrayAdapter.createFromResource(this, |  | ||||||
| 				R.array.presence_show_options, |  | ||||||
| 				R.layout.simple_list_item); |  | ||||||
| 		this.binding.presenceShow.setAdapter(adapter); |  | ||||||
| 		this.binding.presenceShow.setSelection(1); |  | ||||||
| 		this.binding.changePresence.setOnClickListener(v -> executeChangePresence()); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	@Override |  | ||||||
| 	public boolean onCreateOptionsMenu(Menu menu) { |  | ||||||
| 		getMenuInflater().inflate(R.menu.change_presence, menu); |  | ||||||
| 		return super.onCreateOptionsMenu(menu); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	@Override |  | ||||||
| 	public boolean onOptionsItemSelected(final MenuItem item) { |  | ||||||
| 		if (item.getItemId() == R.id.action_account_details) { |  | ||||||
| 			if (mAccount != null) { |  | ||||||
| 				switchToAccount(mAccount); |  | ||||||
| 			} |  | ||||||
| 			return true; |  | ||||||
| 		} else { |  | ||||||
| 			return super.onOptionsItemSelected(item); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	@Override |  | ||||||
| 	protected void onActivityResult(int requestCode, int resultCode, Intent data) { |  | ||||||
| 		super.onActivityResult(requestCode, resultCode, data); |  | ||||||
| 		if (resultCode == RESULT_OK) { |  | ||||||
| 			if (xmppConnectionServiceBound && mAccount != null) { |  | ||||||
| 				if (requestCode == REQUEST_ANNOUNCE_PGP) { |  | ||||||
| 					announcePgp(mAccount, null,data, onPresenceChanged); |  | ||||||
| 				} |  | ||||||
| 				this.mPostponedActivityResult = null; |  | ||||||
| 			} else { |  | ||||||
| 				this.mPostponedActivityResult = new Pair<>(requestCode, data); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	private void executeChangePresence() { |  | ||||||
| 		Presence.Status status = getStatusFromSpinner(); |  | ||||||
| 		boolean allAccounts = this.binding.allAccounts.isChecked(); |  | ||||||
| 		String statusMessage = this.binding.presenceStatusMessage.getText().toString().trim(); |  | ||||||
| 		if (allAccounts && noAccountUsesPgp()) { |  | ||||||
| 			xmppConnectionService.changeStatus(status, statusMessage); |  | ||||||
| 			finish(); |  | ||||||
| 		} else if (mAccount != null) { |  | ||||||
| 			if (mAccount.getPgpId() == 0 || !hasPgp()) { |  | ||||||
| 				xmppConnectionService.changeStatus(mAccount, status, statusMessage, true); |  | ||||||
| 				finish(); |  | ||||||
| 			} else { |  | ||||||
| 				xmppConnectionService.changeStatus(mAccount, status, statusMessage, false); |  | ||||||
| 				announcePgp(mAccount, null,null, onPresenceChanged); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	private Presence.Status getStatusFromSpinner() { |  | ||||||
| 		switch (this.binding.presenceShow.getSelectedItemPosition()) { |  | ||||||
| 			case 0: |  | ||||||
| 				return Presence.Status.CHAT; |  | ||||||
| 			case 2: |  | ||||||
| 				return Presence.Status.AWAY; |  | ||||||
| 			case 3: |  | ||||||
| 				return Presence.Status.XA; |  | ||||||
| 			case 4: |  | ||||||
| 				return Presence.Status.DND; |  | ||||||
| 			default: |  | ||||||
| 				return Presence.Status.ONLINE; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	private void setStatusInSpinner(Presence.Status status) { |  | ||||||
| 		switch(status) { |  | ||||||
| 			case AWAY: |  | ||||||
| 				this.binding.presenceShow.setSelection(2); |  | ||||||
| 				break; |  | ||||||
| 			case XA: |  | ||||||
| 				this.binding.presenceShow.setSelection(3); |  | ||||||
| 				break; |  | ||||||
| 			case CHAT: |  | ||||||
| 				this.binding.presenceShow.setSelection(0); |  | ||||||
| 				break; |  | ||||||
| 			case DND: |  | ||||||
| 				this.binding.presenceShow.setSelection(4); |  | ||||||
| 				break; |  | ||||||
| 			default: |  | ||||||
| 				this.binding.presenceShow.setSelection(1); |  | ||||||
| 				break; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	@Override |  | ||||||
| 	protected void refreshUiReal() { |  | ||||||
| 
 |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	@Override |  | ||||||
| 	void onBackendConnected() { |  | ||||||
| 		mAccount = extractAccount(getIntent()); |  | ||||||
| 		if (mAccount != null) { |  | ||||||
| 			setStatusInSpinner(mAccount.getPresenceStatus()); |  | ||||||
| 			String message = mAccount.getPresenceStatusMessage(); |  | ||||||
| 			if (this.binding.presenceStatusMessage.getText().length() == 0 && message != null) { |  | ||||||
| 				this.binding.presenceStatusMessage.append(message); |  | ||||||
| 			} |  | ||||||
| 			mTemplates = xmppConnectionService.getPresenceTemplates(mAccount); |  | ||||||
| 			if (this.mPostponedActivityResult != null) { |  | ||||||
| 				this.onActivityResult(mPostponedActivityResult.first, RESULT_OK, mPostponedActivityResult.second); |  | ||||||
| 			} |  | ||||||
| 			boolean e = noAccountUsesPgp(); |  | ||||||
| 			this.binding.allAccounts.setEnabled(e); |  | ||||||
| 		} |  | ||||||
| 		redrawTemplates(); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	private void redrawTemplates() { |  | ||||||
| 		if (mTemplates == null || mTemplates.size() == 0) { |  | ||||||
| 			this.binding.templatesCard.setVisibility(View.GONE); |  | ||||||
| 		} else { |  | ||||||
| 			this.binding.templates.removeAllViews(); |  | ||||||
| 			this.binding.templatesCard.setVisibility(View.VISIBLE); |  | ||||||
| 			LayoutInflater inflater = getLayoutInflater(); |  | ||||||
| 			for (PresenceTemplate template : mTemplates) { |  | ||||||
| 				View templateLayout = inflater.inflate(R.layout.presence_template, this.binding.templates, false); |  | ||||||
| 				templateLayout.setTag(template); |  | ||||||
| 				setListItemBackgroundOnView(templateLayout); |  | ||||||
| 				templateLayout.setOnClickListener(this); |  | ||||||
| 				TextView message = (TextView) templateLayout.findViewById(R.id.presence_status_message); |  | ||||||
| 				TextView status = (TextView) templateLayout.findViewById(R.id.status); |  | ||||||
| 				ImageButton button = (ImageButton) templateLayout.findViewById(R.id.delete_button); |  | ||||||
| 				button.setTag(template); |  | ||||||
| 				button.setOnClickListener(this); |  | ||||||
| 				ListItem.Tag tag = UIHelper.getTagForStatus(this, template.getStatus()); |  | ||||||
| 				status.setText(tag.getName()); |  | ||||||
| 				status.setBackgroundColor(tag.getColor()); |  | ||||||
| 				message.setText(template.getStatusMessage()); |  | ||||||
| 				this.binding.templates.addView(templateLayout); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	@Override |  | ||||||
| 	public void onClick(View v) { |  | ||||||
| 		PresenceTemplate template = (PresenceTemplate) v.getTag(); |  | ||||||
| 		if (template == null) { |  | ||||||
| 			return; |  | ||||||
| 		} |  | ||||||
| 		if (v.getId() == R.id.presence_template) { |  | ||||||
| 			setStatusInSpinner(template.getStatus()); |  | ||||||
| 			this.binding.presenceStatusMessage.getEditableText().clear(); |  | ||||||
| 			this.binding.presenceStatusMessage.getEditableText().append(template.getStatusMessage()); |  | ||||||
| 			new Handler().post(() -> this.binding.scrollView.smoothScrollTo(0,0)); |  | ||||||
| 		} else if (v.getId() == R.id.delete_button) { |  | ||||||
| 			xmppConnectionService.databaseBackend.deletePresenceTemplate(template); |  | ||||||
| 			mTemplates.remove(template); |  | ||||||
| 			redrawTemplates(); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| @ -338,9 +338,6 @@ public class SettingsActivity extends XmppActivity implements | |||||||
| 				if (name.equals(AWAY_WHEN_SCREEN_IS_OFF) || name.equals(MANUALLY_CHANGE_PRESENCE)) { | 				if (name.equals(AWAY_WHEN_SCREEN_IS_OFF) || name.equals(MANUALLY_CHANGE_PRESENCE)) { | ||||||
| 					xmppConnectionService.toggleScreenEventReceiver(); | 					xmppConnectionService.toggleScreenEventReceiver(); | ||||||
| 				} | 				} | ||||||
| 				if (name.equals(MANUALLY_CHANGE_PRESENCE) && !noAccountUsesPgp()) { |  | ||||||
| 					Toast.makeText(this, R.string.republish_pgp_keys, Toast.LENGTH_LONG).show(); |  | ||||||
| 				} |  | ||||||
| 				xmppConnectionService.refreshAllPresences(); | 				xmppConnectionService.refreshAllPresences(); | ||||||
| 			} | 			} | ||||||
| 		} else if (name.equals("dont_trust_system_cas")) { | 		} else if (name.equals("dont_trust_system_cas")) { | ||||||
|  | |||||||
| @ -562,7 +562,7 @@ public abstract class XmppActivity extends AppCompatActivity { | |||||||
| 		startActivityForResult(ChooseContactActivity.create(this,conversation), REQUEST_INVITE_TO_CONVERSATION); | 		startActivityForResult(ChooseContactActivity.create(this,conversation), REQUEST_INVITE_TO_CONVERSATION); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	protected void announcePgp(Account account, final Conversation conversation, Intent intent, final Runnable onSuccess) { | 	protected void announcePgp(final Account account, final Conversation conversation, Intent intent, final Runnable onSuccess) { | ||||||
| 		if (account.getPgpId() == 0) { | 		if (account.getPgpId() == 0) { | ||||||
| 			choosePgpSignId(account); | 			choosePgpSignId(account); | ||||||
| 		} else { | 		} else { | ||||||
| @ -573,10 +573,10 @@ public abstract class XmppActivity extends AppCompatActivity { | |||||||
| 			if (status == null) { | 			if (status == null) { | ||||||
| 				status = ""; | 				status = ""; | ||||||
| 			} | 			} | ||||||
| 			xmppConnectionService.getPgpEngine().generateSignature(intent, account, status, new UiCallback<Account>() { | 			xmppConnectionService.getPgpEngine().generateSignature(intent, account, status, new UiCallback<String>() { | ||||||
| 
 | 
 | ||||||
| 				@Override | 				@Override | ||||||
| 				public void userInputRequried(PendingIntent pi, Account account) { | 				public void userInputRequried(PendingIntent pi, String signature) { | ||||||
| 					try { | 					try { | ||||||
| 						startIntentSenderForResult(pi.getIntentSender(), REQUEST_ANNOUNCE_PGP, null, 0, 0, 0); | 						startIntentSenderForResult(pi.getIntentSender(), REQUEST_ANNOUNCE_PGP, null, 0, 0, 0); | ||||||
| 					} catch (final SendIntentException ignored) { | 					} catch (final SendIntentException ignored) { | ||||||
| @ -584,7 +584,8 @@ public abstract class XmppActivity extends AppCompatActivity { | |||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				@Override | 				@Override | ||||||
| 				public void success(Account account) { | 				public void success(String signature) { | ||||||
|  | 					account.setPgpSignature(signature); | ||||||
| 					xmppConnectionService.databaseBackend.updateAccount(account); | 					xmppConnectionService.databaseBackend.updateAccount(account); | ||||||
| 					xmppConnectionService.sendPresence(account); | 					xmppConnectionService.sendPresence(account); | ||||||
| 					if (conversation != null) { | 					if (conversation != null) { | ||||||
| @ -598,8 +599,8 @@ public abstract class XmppActivity extends AppCompatActivity { | |||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				@Override | 				@Override | ||||||
| 				public void error(int error, Account account) { | 				public void error(int error, String signature) { | ||||||
| 					if (error == 0 && account != null) { | 					if (error == 0) { | ||||||
| 						account.setPgpSignId(0); | 						account.setPgpSignId(0); | ||||||
| 						account.unsetPgpSignature(); | 						account.unsetPgpSignature(); | ||||||
| 						xmppConnectionService.databaseBackend.updateAccount(account); | 						xmppConnectionService.databaseBackend.updateAccount(account); | ||||||
|  | |||||||
| @ -15,23 +15,25 @@ | |||||||
|         android:layout_marginBottom="?attr/dialog_vertical_padding"> |         android:layout_marginBottom="?attr/dialog_vertical_padding"> | ||||||
| 
 | 
 | ||||||
|         <RadioButton |         <RadioButton | ||||||
|  |             android:id="@+id/online" | ||||||
|             android:layout_width="match_parent" |             android:layout_width="match_parent" | ||||||
|             android:layout_height="wrap_content" |             android:layout_height="wrap_content" | ||||||
|             android:text="@string/presence_online"/> |             android:text="@string/presence_online"/> | ||||||
| 
 | 
 | ||||||
|         <RadioButton |         <RadioButton | ||||||
|             android:id="@+id/radioButton" |             android:id="@+id/away" | ||||||
|             android:layout_width="match_parent" |             android:layout_width="match_parent" | ||||||
|             android:layout_height="wrap_content" |             android:layout_height="wrap_content" | ||||||
|             android:text="@string/presence_away"/> |             android:text="@string/presence_away"/> | ||||||
| 
 | 
 | ||||||
|         <RadioButton |         <RadioButton | ||||||
|             android:id="@+id/radioButton2" |             android:id="@+id/xa" | ||||||
|             android:layout_width="match_parent" |             android:layout_width="match_parent" | ||||||
|             android:layout_height="wrap_content" |             android:layout_height="wrap_content" | ||||||
|             android:text="@string/presence_xa"/> |             android:text="@string/presence_xa"/> | ||||||
| 
 | 
 | ||||||
|         <RadioButton |         <RadioButton | ||||||
|  |             android:id="@+id/dnd" | ||||||
|             android:layout_width="match_parent" |             android:layout_width="match_parent" | ||||||
|             android:layout_height="wrap_content" |             android:layout_height="wrap_content" | ||||||
|             android:text="@string/presence_dnd"/> |             android:text="@string/presence_dnd"/> | ||||||
| @ -46,7 +48,7 @@ | |||||||
|         android:layout_height="wrap_content" |         android:layout_height="wrap_content" | ||||||
|         android:ems="10" |         android:ems="10" | ||||||
|         android:hint="@string/status_message" |         android:hint="@string/status_message" | ||||||
|         android:inputType="textPersonName"/> |         android:inputType="textShortMessage"/> | ||||||
|     </android.support.design.widget.TextInputLayout> |     </android.support.design.widget.TextInputLayout> | ||||||
| 
 | 
 | ||||||
| </LinearLayout> | </LinearLayout> | ||||||
|  | |||||||
| @ -5,7 +5,7 @@ | |||||||
|         android:id="@+id/action_change_presence" |         android:id="@+id/action_change_presence" | ||||||
|         android:icon="@drawable/ic_announcement_white_24dp" |         android:icon="@drawable/ic_announcement_white_24dp" | ||||||
|         app:showAsAction="always" |         app:showAsAction="always" | ||||||
|         android:title="@string/change_presence"/> |         android:title="@string/edit_status_message"/> | ||||||
| 
 | 
 | ||||||
|     <item |     <item | ||||||
|         android:id="@+id/action_share" |         android:id="@+id/action_share" | ||||||
|  | |||||||
| @ -164,7 +164,6 @@ | |||||||
| 	<string name="unpublish_pgp">Remove OpenPGP public key</string> | 	<string name="unpublish_pgp">Remove OpenPGP public key</string> | ||||||
| 	<string name="unpublish_pgp_message">Are you sure you want to remove your OpenPGP public key from your presence announcement?\nYour contacts will no longer be able to send you OpenPGP encrypted messages.</string> | 	<string name="unpublish_pgp_message">Are you sure you want to remove your OpenPGP public key from your presence announcement?\nYour contacts will no longer be able to send you OpenPGP encrypted messages.</string> | ||||||
| 	<string name="openpgp_has_been_published">OpenPGP public key has been published.</string> | 	<string name="openpgp_has_been_published">OpenPGP public key has been published.</string> | ||||||
| 	<string name="republish_pgp_keys">Remember to republish your OpenPGP public keys!</string> |  | ||||||
| 	<string name="mgmt_account_enable">Enable account</string> | 	<string name="mgmt_account_enable">Enable account</string> | ||||||
| 	<string name="mgmt_account_are_you_sure">Are you sure?</string> | 	<string name="mgmt_account_are_you_sure">Are you sure?</string> | ||||||
| 	<string name="mgmt_account_delete_confirm_text">If you delete your account, your entire conversation history will be lost</string> | 	<string name="mgmt_account_delete_confirm_text">If you delete your account, your entire conversation history will be lost</string> | ||||||
| @ -483,7 +482,7 @@ | |||||||
| 	<string name="account_status_bind_failure">Bind failure</string> | 	<string name="account_status_bind_failure">Bind failure</string> | ||||||
| 	<string name="account_status_host_unknown">Server not responsible for domain</string> | 	<string name="account_status_host_unknown">Server not responsible for domain</string> | ||||||
| 	<string name="server_info_broken">Broken</string> | 	<string name="server_info_broken">Broken</string> | ||||||
| 	<string name="pref_presence_settings">Presence</string> | 	<string name="pref_presence_settings">Availability</string> | ||||||
| 	<string name="pref_away_when_screen_off">Away when screen is off</string> | 	<string name="pref_away_when_screen_off">Away when screen is off</string> | ||||||
| 	<string name="pref_away_when_screen_off_summary">Marks your resource as away when the screen is turned off</string> | 	<string name="pref_away_when_screen_off_summary">Marks your resource as away when the screen is turned off</string> | ||||||
| 	<string name="pref_dnd_on_silent_mode">“Do not disturb” in silent mode</string> | 	<string name="pref_dnd_on_silent_mode">“Do not disturb” in silent mode</string> | ||||||
| @ -568,8 +567,8 @@ | |||||||
| 	<string name="create_account">Create Account</string> | 	<string name="create_account">Create Account</string> | ||||||
| 	<string name="use_own_provider">Use my own provider</string> | 	<string name="use_own_provider">Use my own provider</string> | ||||||
| 	<string name="pick_your_username">Pick your username</string> | 	<string name="pick_your_username">Pick your username</string> | ||||||
| 	<string name="pref_manually_change_presence">Manually change presence</string> | 	<string name="pref_manually_change_presence">Manage availability manually</string> | ||||||
| 	<string name="pref_manually_change_presence_summary">Touch your avatar to change your presence</string> | 	<string name="pref_manually_change_presence_summary">Set your availability when editing your status message.</string> | ||||||
| 	<string name="change_presence">Change Presence</string> | 	<string name="change_presence">Change Presence</string> | ||||||
| 	<string name="status_message">Status message</string> | 	<string name="status_message">Status message</string> | ||||||
| 	<string name="all_accounts_on_this_device">Set for all accounts on this device</string> | 	<string name="all_accounts_on_this_device">Set for all accounts on this device</string> | ||||||
| @ -710,4 +709,6 @@ | |||||||
|     <string name="qr_code_scanner_needs_access_to_camera">The QR code scanner needs access to the camera</string> |     <string name="qr_code_scanner_needs_access_to_camera">The QR code scanner needs access to the camera</string> | ||||||
|     <string name="pref_scroll_to_bottom">Scroll to bottom</string> |     <string name="pref_scroll_to_bottom">Scroll to bottom</string> | ||||||
| 	<string name="pref_scroll_to_bottom_summary">Scroll down after sending a message</string> | 	<string name="pref_scroll_to_bottom_summary">Scroll down after sending a message</string> | ||||||
|  |     <string name="edit_status_message_title">Edit Status Message</string> | ||||||
|  | 	<string name="edit_status_message">Edit status message</string> | ||||||
| </resources> | </resources> | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Daniel Gultsch
						Daniel Gultsch