anotherim/src/main/java/eu/siacs/conversations/ui/SetPresenceActivity.java
2018-03-07 22:30:33 +01:00

215 lines
6.8 KiB
Java

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);
this.binding.allAccounts.setTextColor(e ? getPrimaryTextColor() : getSecondaryTextColor());
}
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();
}
}
}