Conversations/src/eu/siacs/conversations/ui/ManageAccountActivity.java

536 lines
18 KiB
Java
Raw Normal View History

2014-02-28 12:46:01 -05:00
package eu.siacs.conversations.ui;
2014-01-23 20:04:05 -05:00
2014-01-28 13:21:54 -05:00
import java.util.ArrayList;
import java.util.List;
2014-01-23 20:04:05 -05:00
2014-02-28 12:46:01 -05:00
import eu.siacs.conversations.R;
import eu.siacs.conversations.entities.Account;
2014-07-12 07:42:17 -04:00
import eu.siacs.conversations.services.XmppConnectionService.OnAccountUpdate;
import eu.siacs.conversations.ui.EditAccountDialog.EditAccountListener;
import eu.siacs.conversations.xmpp.XmppConnection;
import android.app.Activity;
2014-02-04 15:44:16 -05:00
import android.app.AlertDialog;
2014-01-28 13:21:54 -05:00
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
2014-01-28 13:21:54 -05:00
import android.content.Intent;
import android.os.Bundle;
import android.os.SystemClock;
2014-02-04 15:44:16 -05:00
import android.view.ActionMode;
2014-01-28 13:21:54 -05:00
import android.view.LayoutInflater;
import android.view.Menu;
2014-02-04 15:44:16 -05:00
import android.view.MenuInflater;
2014-01-28 13:21:54 -05:00
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
2014-02-04 15:44:16 -05:00
import android.widget.AdapterView.OnItemLongClickListener;
2014-01-28 13:21:54 -05:00
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
2014-01-23 20:04:05 -05:00
public class ManageAccountActivity extends XmppActivity {
2014-07-12 07:42:17 -04:00
2014-02-04 15:44:16 -05:00
protected boolean isActionMode = false;
protected ActionMode actionMode;
protected Account selectedAccountForActionMode = null;
2014-03-07 08:24:33 -05:00
protected ManageAccountActivity activity = this;
2014-07-12 07:42:17 -04:00
protected boolean firstrun = true;
2014-07-12 07:42:17 -04:00
2014-01-28 13:21:54 -05:00
protected List<Account> accountList = new ArrayList<Account>();
protected ListView accountListView;
protected ArrayAdapter<Account> accountListViewAdapter;
2014-07-12 07:42:17 -04:00
protected OnAccountUpdate accountChanged = new OnAccountUpdate() {
@Override
2014-07-12 07:42:17 -04:00
public void onAccountUpdate() {
accountList.clear();
accountList.addAll(xmppConnectionService.getAccounts());
runOnUiThread(new Runnable() {
@Override
public void run() {
accountListViewAdapter.notifyDataSetChanged();
}
});
}
};
2014-07-12 07:42:17 -04:00
2014-01-28 13:21:54 -05:00
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.manage_accounts);
2014-01-28 13:21:54 -05:00
accountListView = (ListView) findViewById(R.id.account_list);
accountListViewAdapter = new ArrayAdapter<Account>(
getApplicationContext(), R.layout.account_row, this.accountList) {
2014-01-28 13:21:54 -05:00
@Override
public View getView(int position, View view, ViewGroup parent) {
Account account = getItem(position);
2014-01-28 13:21:54 -05:00
if (view == null) {
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = (View) inflater.inflate(R.layout.account_row, null);
}
((TextView) view.findViewById(R.id.account_jid))
.setText(account.getJid());
TextView statusView = (TextView) view
.findViewById(R.id.account_status);
switch (account.getStatus()) {
2014-02-04 15:44:16 -05:00
case Account.STATUS_DISABLED:
2014-07-12 07:42:17 -04:00
statusView
.setText(getString(R.string.account_status_disabled));
2014-02-04 15:44:16 -05:00
statusView.setTextColor(0xFF1da9da);
break;
case Account.STATUS_ONLINE:
2014-07-12 07:42:17 -04:00
statusView
.setText(getString(R.string.account_status_online));
statusView.setTextColor(0xFF83b600);
break;
2014-03-05 21:57:29 -05:00
case Account.STATUS_CONNECTING:
2014-07-12 07:42:17 -04:00
statusView
.setText(getString(R.string.account_status_connecting));
2014-03-05 21:57:29 -05:00
statusView.setTextColor(0xFF1da9da);
break;
case Account.STATUS_OFFLINE:
2014-07-12 07:42:17 -04:00
statusView
.setText(getString(R.string.account_status_offline));
statusView.setTextColor(0xFFe92727);
break;
case Account.STATUS_UNAUTHORIZED:
2014-07-12 07:42:17 -04:00
statusView
.setText(getString(R.string.account_status_unauthorized));
statusView.setTextColor(0xFFe92727);
break;
case Account.STATUS_SERVER_NOT_FOUND:
2014-07-12 07:42:17 -04:00
statusView
.setText(getString(R.string.account_status_not_found));
statusView.setTextColor(0xFFe92727);
break;
2014-03-05 21:57:29 -05:00
case Account.STATUS_NO_INTERNET:
2014-07-12 07:42:17 -04:00
statusView
.setText(getString(R.string.account_status_no_internet));
2014-03-05 21:57:29 -05:00
statusView.setTextColor(0xFFe92727);
break;
2014-03-06 09:11:56 -05:00
case Account.STATUS_SERVER_REQUIRES_TLS:
2014-07-12 07:42:17 -04:00
statusView
.setText(getString(R.string.account_status_requires_tls));
2014-03-06 09:11:56 -05:00
statusView.setTextColor(0xFFe92727);
break;
2014-03-13 12:29:22 -04:00
case Account.STATUS_REGISTRATION_FAILED:
2014-07-12 07:42:17 -04:00
statusView
.setText(getString(R.string.account_status_regis_fail));
2014-03-13 12:29:22 -04:00
statusView.setTextColor(0xFFe92727);
break;
case Account.STATUS_REGISTRATION_CONFLICT:
2014-07-12 07:42:17 -04:00
statusView
.setText(getString(R.string.account_status_regis_conflict));
2014-03-13 12:29:22 -04:00
statusView.setTextColor(0xFFe92727);
break;
2014-07-12 07:42:17 -04:00
case Account.STATUS_REGISTRATION_SUCCESSFULL:
statusView
.setText(getString(R.string.account_status_regis_success));
2014-03-13 12:29:22 -04:00
statusView.setTextColor(0xFF83b600);
break;
case Account.STATUS_REGISTRATION_NOT_SUPPORTED:
2014-07-12 07:42:17 -04:00
statusView
.setText(getString(R.string.account_status_regis_not_sup));
statusView.setTextColor(0xFFe92727);
break;
default:
2014-03-13 12:29:22 -04:00
statusView.setText("");
break;
}
2014-01-28 13:21:54 -05:00
return view;
}
};
final XmppActivity activity = this;
2014-01-28 13:21:54 -05:00
accountListView.setAdapter(this.accountListViewAdapter);
accountListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View view,
int position, long arg3) {
2014-02-04 15:44:16 -05:00
if (!isActionMode) {
2014-03-07 08:24:33 -05:00
Account account = accountList.get(position);
2014-07-23 19:37:38 -04:00
if (account.getStatus() == Account.STATUS_OFFLINE) {
2014-07-12 07:42:17 -04:00
activity.xmppConnectionService.reconnectAccount(
accountList.get(position), true);
2014-03-07 08:24:33 -05:00
} else if (account.getStatus() == Account.STATUS_ONLINE) {
2014-07-12 07:42:17 -04:00
activity.startActivity(new Intent(activity
.getApplicationContext(),
StartConversationActivity.class));
} else if (account.getStatus() != Account.STATUS_DISABLED) {
2014-03-12 23:21:59 -04:00
editAccount(account);
2014-03-07 08:24:33 -05:00
}
2014-02-04 15:44:16 -05:00
} else {
selectedAccountForActionMode = accountList.get(position);
actionMode.invalidate();
}
}
});
2014-07-12 07:42:17 -04:00
accountListView
.setOnItemLongClickListener(new OnItemLongClickListener() {
2014-01-28 13:21:54 -05:00
2014-07-12 07:42:17 -04:00
@Override
public boolean onItemLongClick(AdapterView<?> arg0,
View view, int position, long arg3) {
if (!isActionMode) {
accountListView
.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
accountListView.setItemChecked(position, true);
selectedAccountForActionMode = accountList
.get(position);
actionMode = activity
.startActionMode((new ActionMode.Callback() {
@Override
public boolean onPrepareActionMode(
ActionMode mode, Menu menu) {
if (selectedAccountForActionMode
.isOptionSet(Account.OPTION_DISABLED)) {
menu.findItem(
R.id.mgmt_account_enable)
.setVisible(true);
menu.findItem(
R.id.mgmt_account_disable)
.setVisible(false);
} else {
menu.findItem(
R.id.mgmt_account_disable)
.setVisible(true);
menu.findItem(
R.id.mgmt_account_enable)
.setVisible(false);
}
return true;
2014-03-13 16:37:27 -04:00
}
2014-07-12 07:42:17 -04:00
@Override
public void onDestroyActionMode(
ActionMode mode) {
// TODO Auto-generated method stub
}
@Override
public boolean onCreateActionMode(
ActionMode mode, Menu menu) {
MenuInflater inflater = mode
.getMenuInflater();
inflater.inflate(
R.menu.manageaccounts_context,
menu);
return true;
}
@Override
public boolean onActionItemClicked(
final ActionMode mode,
MenuItem item) {
if (item.getItemId() == R.id.mgmt_account_edit) {
editAccount(selectedAccountForActionMode);
} else if (item.getItemId() == R.id.mgmt_account_disable) {
selectedAccountForActionMode
.setOption(
Account.OPTION_DISABLED,
true);
xmppConnectionService
.updateAccount(selectedAccountForActionMode);
mode.finish();
} else if (item.getItemId() == R.id.mgmt_account_enable) {
selectedAccountForActionMode
.setOption(
Account.OPTION_DISABLED,
false);
xmppConnectionService
.updateAccount(selectedAccountForActionMode);
mode.finish();
} else if (item.getItemId() == R.id.mgmt_account_delete) {
AlertDialog.Builder builder = new AlertDialog.Builder(
activity);
builder.setTitle(getString(R.string.mgmt_account_are_you_sure));
builder.setIconAttribute(android.R.attr.alertDialogIcon);
builder.setMessage(getString(R.string.mgmt_account_delete_confirm_text));
builder.setPositiveButton(
getString(R.string.delete),
new OnClickListener() {
@Override
public void onClick(
DialogInterface dialog,
int which) {
xmppConnectionService
.deleteAccount(selectedAccountForActionMode);
selectedAccountForActionMode = null;
mode.finish();
}
});
builder.setNegativeButton(
getString(R.string.cancel),
null);
builder.create().show();
} else if (item.getItemId() == R.id.mgmt_account_announce_pgp) {
if (activity.hasPgp()) {
mode.finish();
announcePgp(
selectedAccountForActionMode,
null);
} else {
activity.showInstallPgpDialog();
}
} else if (item.getItemId() == R.id.mgmt_otr_key) {
AlertDialog.Builder builder = new AlertDialog.Builder(
activity);
builder.setTitle("OTR Fingerprint");
String fingerprintTxt = selectedAccountForActionMode
.getOtrFingerprint(getApplicationContext());
View view = (View) getLayoutInflater()
.inflate(
R.layout.otr_fingerprint,
null);
if (fingerprintTxt != null) {
TextView fingerprint = (TextView) view
.findViewById(R.id.otr_fingerprint);
TextView noFingerprintView = (TextView) view
.findViewById(R.id.otr_no_fingerprint);
fingerprint
.setText(fingerprintTxt);
fingerprint
.setVisibility(View.VISIBLE);
noFingerprintView
.setVisibility(View.GONE);
}
builder.setView(view);
builder.setPositiveButton(
getString(R.string.done),
null);
builder.create().show();
} else if (item.getItemId() == R.id.mgmt_account_info) {
AlertDialog.Builder builder = new AlertDialog.Builder(
activity);
builder.setTitle(getString(R.string.account_info));
if (selectedAccountForActionMode
.getStatus() == Account.STATUS_ONLINE) {
XmppConnection xmpp = selectedAccountForActionMode
.getXmppConnection();
long connectionAge = (SystemClock
.elapsedRealtime() - xmpp.lastConnect) / 60000;
long sessionAge = (SystemClock
.elapsedRealtime() - xmpp.lastSessionStarted) / 60000;
long connectionAgeHours = connectionAge / 60;
long sessionAgeHours = sessionAge / 60;
View view = (View) getLayoutInflater()
.inflate(
R.layout.server_info,
null);
TextView connection = (TextView) view
.findViewById(R.id.connection);
TextView session = (TextView) view
.findViewById(R.id.session);
TextView pcks_sent = (TextView) view
.findViewById(R.id.pcks_sent);
TextView pcks_received = (TextView) view
.findViewById(R.id.pcks_received);
TextView carbon = (TextView) view
.findViewById(R.id.carbon);
TextView stream = (TextView) view
.findViewById(R.id.stream);
TextView roster = (TextView) view
.findViewById(R.id.roster);
TextView presences = (TextView) view
.findViewById(R.id.number_presences);
presences.setText(selectedAccountForActionMode
.countPresences()
+ "");
pcks_received.setText(""
+ xmpp.getReceivedStanzas());
pcks_sent.setText(""
+ xmpp.getSentStanzas());
if (connectionAgeHours >= 2) {
connection
.setText(connectionAgeHours
+ " "
+ getString(R.string.hours));
} else {
connection
.setText(connectionAge
+ " "
+ getString(R.string.mins));
}
if (xmpp.hasFeatureStreamManagment()) {
if (sessionAgeHours >= 2) {
session.setText(sessionAgeHours
+ " "
+ getString(R.string.hours));
} else {
session.setText(sessionAge
+ " "
+ getString(R.string.mins));
}
stream.setText(getString(R.string.yes));
} else {
stream.setText(getString(R.string.no));
session.setText(connection
.getText());
}
if (xmpp.hasFeaturesCarbon()) {
carbon.setText(getString(R.string.yes));
} else {
carbon.setText(getString(R.string.no));
}
if (xmpp.hasFeatureRosterManagment()) {
roster.setText(getString(R.string.yes));
} else {
roster.setText(getString(R.string.no));
}
builder.setView(view);
} else {
builder.setMessage(getString(R.string.mgmt_account_account_offline));
}
builder.setPositiveButton(
getString(R.string.hide),
null);
builder.create().show();
}
return true;
}
}));
return true;
2014-07-12 07:42:17 -04:00
} else {
return false;
}
2014-07-12 07:42:17 -04:00
}
});
2014-01-28 13:21:54 -05:00
}
2014-07-12 07:42:17 -04:00
2014-01-28 13:21:54 -05:00
@Override
protected void onStop() {
2014-01-28 13:21:54 -05:00
if (xmppConnectionServiceBound) {
xmppConnectionService.removeOnAccountListChangedListener();
2014-01-28 13:21:54 -05:00
}
super.onStop();
2014-01-28 13:21:54 -05:00
}
2014-01-28 13:21:54 -05:00
@Override
void onBackendConnected() {
xmppConnectionService.setOnAccountListChangedListener(accountChanged);
2014-01-28 13:21:54 -05:00
this.accountList.clear();
this.accountList.addAll(xmppConnectionService.getAccounts());
accountListViewAdapter.notifyDataSetChanged();
2014-07-12 07:42:17 -04:00
if ((this.accountList.size() == 0) && (this.firstrun)) {
getActionBar().setDisplayHomeAsUpEnabled(false);
getActionBar().setHomeButtonEnabled(false);
addAccount();
this.firstrun = false;
}
2014-01-28 13:21:54 -05:00
}
2014-01-28 13:21:54 -05:00
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.manageaccounts, menu);
return true;
}
2014-01-28 13:21:54 -05:00
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_add_account:
addAccount();
2014-01-28 13:21:54 -05:00
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
2014-05-31 11:50:09 -04:00
@Override
public boolean onNavigateUp() {
if (xmppConnectionService.getConversations().size() == 0) {
Intent contactsIntent = new Intent(this, StartConversationActivity.class);
contactsIntent.setFlags(
2014-07-12 07:42:17 -04:00
// if activity exists in stack, pop the stack and go back to it
Intent.FLAG_ACTIVITY_CLEAR_TOP |
// otherwise, make a new task for it
2014-07-12 07:42:17 -04:00
Intent.FLAG_ACTIVITY_NEW_TASK |
// don't use the new activity animation; finish
// animation runs instead
Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(contactsIntent);
2014-05-31 11:50:09 -04:00
finish();
return true;
} else {
return super.onNavigateUp();
}
}
2014-03-12 23:21:59 -04:00
private void editAccount(Account account) {
EditAccountDialog dialog = new EditAccountDialog();
2014-07-12 07:42:17 -04:00
dialog.setAccount(account);
dialog.setEditAccountListener(new EditAccountListener() {
2014-03-12 23:21:59 -04:00
2014-07-12 07:42:17 -04:00
@Override
public void onAccountEdited(Account account) {
xmppConnectionService.updateAccount(account);
if (actionMode != null) {
actionMode.finish();
2014-03-12 23:21:59 -04:00
}
2014-07-12 07:42:17 -04:00
}
});
dialog.show(getFragmentManager(), "edit_account");
dialog.setKnownHosts(xmppConnectionService.getKnownHosts(), this);
2014-03-12 23:21:59 -04:00
}
2014-07-12 07:42:17 -04:00
protected void addAccount() {
final Activity activity = this;
EditAccountDialog dialog = new EditAccountDialog();
dialog.setEditAccountListener(new EditAccountListener() {
@Override
public void onAccountEdited(Account account) {
xmppConnectionService.createAccount(account);
activity.getActionBar().setDisplayHomeAsUpEnabled(true);
activity.getActionBar().setHomeButtonEnabled(true);
}
});
dialog.show(getFragmentManager(), "add_account");
2014-07-12 07:42:17 -04:00
dialog.setKnownHosts(xmppConnectionService.getKnownHosts(), this);
}
2014-02-04 15:44:16 -05:00
@Override
public void onActionModeStarted(ActionMode mode) {
super.onActionModeStarted(mode);
this.isActionMode = true;
}
2014-07-12 07:42:17 -04:00
2014-02-04 15:44:16 -05:00
@Override
public void onActionModeFinished(ActionMode mode) {
super.onActionModeFinished(mode);
this.isActionMode = false;
accountListView.clearChoices();
accountListView.requestLayout();
accountListView.post(new Runnable() {
2014-07-12 07:42:17 -04:00
@Override
public void run() {
accountListView.setChoiceMode(ListView.CHOICE_MODE_NONE);
}
});
2014-02-04 15:44:16 -05:00
}
2014-07-12 07:42:17 -04:00
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
2014-02-27 18:22:56 -05:00
if (requestCode == REQUEST_ANNOUNCE_PGP) {
2014-07-12 07:42:17 -04:00
announcePgp(selectedAccountForActionMode, null);
}
2014-07-12 07:42:17 -04:00
}
}
2014-01-23 20:04:05 -05:00
}