aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Gultsch <daniel.gultsch@rwth-aachen.de>2014-02-04 21:44:16 +0100
committerDaniel Gultsch <daniel.gultsch@rwth-aachen.de>2014-02-04 21:44:16 +0100
commit4fd8620c6cc1ca88c4496671e6e59c40aba93019 (patch)
tree1e5063ec85002960036e39071ae210903167b7d5
parent0d80d88736926d06e97f22f9ecc63d4fb696751c (diff)
allow to temporarily disable accounts
-rw-r--r--gen/de/gultsch/chat/R.java23
-rw-r--r--res/drawable-hdpi/ic_action_add_person.pngbin0 -> 679 bytes
-rw-r--r--res/drawable-hdpi/ic_action_delete.pngbin0 -> 1624 bytes
-rw-r--r--res/drawable-mdpi/ic_action_add_person.pngbin0 -> 513 bytes
-rw-r--r--res/drawable-mdpi/ic_action_delete.pngbin0 -> 1359 bytes
-rw-r--r--res/drawable-xhdpi/ic_action_add_person.pngbin0 -> 884 bytes
-rw-r--r--res/drawable-xhdpi/ic_action_delete.pngbin0 -> 1848 bytes
-rw-r--r--res/drawable-xxhdpi/ic_action_add_person.pngbin0 -> 1171 bytes
-rw-r--r--res/layout/account_row.xml3
-rw-r--r--res/menu/manageaccounts.xml3
-rw-r--r--res/menu/manageaccounts_context.xml17
-rw-r--r--res/values/arrays.xml4
-rw-r--r--src/de/gultsch/chat/entities/Account.java23
-rw-r--r--src/de/gultsch/chat/services/XmppConnectionService.java13
-rw-r--r--src/de/gultsch/chat/ui/EditAccount.java4
-rw-r--r--src/de/gultsch/chat/ui/ManageAccountActivity.java124
-rw-r--r--src/de/gultsch/chat/ui/NewConversationActivity.java2
17 files changed, 183 insertions, 33 deletions
diff --git a/gen/de/gultsch/chat/R.java b/gen/de/gultsch/chat/R.java
index 596a2bad..982b1e2e 100644
--- a/gen/de/gultsch/chat/R.java
+++ b/gen/de/gultsch/chat/R.java
@@ -11,6 +11,7 @@ public final class R {
public static final class array {
public static final int conversation_encryption_type_entries=0x7f050000;
public static final int conversation_encryption_type_values=0x7f050001;
+ public static final int manage_account_options=0x7f050002;
}
public static final class attr {
}
@@ -28,17 +29,20 @@ public final class R {
public static final int es_slidingpane_shadow=0x7f020000;
public static final int ic_action_add=0x7f020001;
public static final int ic_action_add_person=0x7f020002;
- public static final int ic_action_send=0x7f020003;
- public static final int ic_action_send_now=0x7f020004;
- public static final int ic_action_unsecure=0x7f020005;
- public static final int ic_launcher=0x7f020006;
- public static final int ic_profile=0x7f020007;
- public static final int message_border=0x7f020008;
- public static final int notification=0x7f020009;
- public static final int section_header=0x7f02000a;
+ public static final int ic_action_delete=0x7f020003;
+ public static final int ic_action_send=0x7f020004;
+ public static final int ic_action_send_now=0x7f020005;
+ public static final int ic_action_unsecure=0x7f020006;
+ public static final int ic_launcher=0x7f020007;
+ public static final int ic_profile=0x7f020008;
+ public static final int message_border=0x7f020009;
+ public static final int notification=0x7f02000a;
+ public static final int section_header=0x7f02000b;
}
public static final class id {
public static final int account_confirm_password_desc=0x7f0a0011;
+ public static final int account_disable=0x7f0a002c;
+ public static final int account_enable=0x7f0a002d;
public static final int account_jid=0x7f0a0000;
public static final int account_list=0x7f0a0021;
public static final int account_password=0x7f0a000f;
@@ -98,7 +102,8 @@ public final class R {
public static final class menu {
public static final int conversations=0x7f090000;
public static final int manageaccounts=0x7f090001;
- public static final int newconversation=0x7f090002;
+ public static final int manageaccounts_context=0x7f090002;
+ public static final int newconversation=0x7f090003;
}
public static final class string {
public static final int action_accounts=0x7f070003;
diff --git a/res/drawable-hdpi/ic_action_add_person.png b/res/drawable-hdpi/ic_action_add_person.png
new file mode 100644
index 00000000..5ebac970
--- /dev/null
+++ b/res/drawable-hdpi/ic_action_add_person.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_action_delete.png b/res/drawable-hdpi/ic_action_delete.png
new file mode 100644
index 00000000..e9ce89e0
--- /dev/null
+++ b/res/drawable-hdpi/ic_action_delete.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_action_add_person.png b/res/drawable-mdpi/ic_action_add_person.png
new file mode 100644
index 00000000..c43cf655
--- /dev/null
+++ b/res/drawable-mdpi/ic_action_add_person.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_action_delete.png b/res/drawable-mdpi/ic_action_delete.png
new file mode 100644
index 00000000..cedb1085
--- /dev/null
+++ b/res/drawable-mdpi/ic_action_delete.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_action_add_person.png b/res/drawable-xhdpi/ic_action_add_person.png
new file mode 100644
index 00000000..91434a47
--- /dev/null
+++ b/res/drawable-xhdpi/ic_action_add_person.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_action_delete.png b/res/drawable-xhdpi/ic_action_delete.png
new file mode 100644
index 00000000..98c73da1
--- /dev/null
+++ b/res/drawable-xhdpi/ic_action_delete.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_action_add_person.png b/res/drawable-xxhdpi/ic_action_add_person.png
new file mode 100644
index 00000000..f18aa614
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_action_add_person.png
Binary files differ
diff --git a/res/layout/account_row.xml b/res/layout/account_row.xml
index 92e179f8..402cb965 100644
--- a/res/layout/account_row.xml
+++ b/res/layout/account_row.xml
@@ -2,7 +2,8 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:padding="8dp">
+ android:padding="8dp"
+ android:background="?android:attr/activatedBackgroundIndicator">
diff --git a/res/menu/manageaccounts.xml b/res/menu/manageaccounts.xml
index 63441919..1d81ba3c 100644
--- a/res/menu/manageaccounts.xml
+++ b/res/menu/manageaccounts.xml
@@ -2,7 +2,8 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/action_add_account"
android:showAsAction="always"
- android:title="@string/action_add_account"/>
+ android:title="@string/action_add_account"
+ android:icon="@drawable/ic_action_add_person"/>
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
diff --git a/res/menu/manageaccounts_context.xml b/res/menu/manageaccounts_context.xml
new file mode 100644
index 00000000..30ba747d
--- /dev/null
+++ b/res/menu/manageaccounts_context.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android" >
+ <item android:icon="@drawable/ic_action_delete"
+ android:title="Delete"
+ android:showAsAction="always"
+ />
+ <item
+ android:id="@+id/account_disable"
+ android:title="Temporarily disable"
+ android:showAsAction="always"/>
+ <item
+ android:id="@+id/account_enable"
+ android:title="Enable"
+ android:showAsAction="always"
+ android:visible="false"/>
+
+</menu>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 592007ba..b8135cde 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -10,4 +10,8 @@
<item>pgp</item>
<item>otr</item>
</array>
+ <array name="manage_account_options">
+ <item>Delete</item>
+ <item>Disable</item>
+ </array>
</resources>
diff --git a/src/de/gultsch/chat/entities/Account.java b/src/de/gultsch/chat/entities/Account.java
index 3dfb298a..6f8daf8d 100644
--- a/src/de/gultsch/chat/entities/Account.java
+++ b/src/de/gultsch/chat/entities/Account.java
@@ -17,7 +17,9 @@ public class Account extends AbstractEntity{
public static final String ROSTERVERSION = "rosterversion";
public static final int OPTION_USETLS = 0;
+ public static final int OPTION_DISABLED = 1;
+ public static final int STATUS_DISABLED = -1;
public static final int STATUS_OFFLINE = 0;
public static final int STATUS_ONLINE = 1;
public static final int STATUS_UNAUTHORIZED = 2;
@@ -55,6 +57,20 @@ public class Account extends AbstractEntity{
return ((options & (1 << option)) != 0);
}
+ public void setOption(int option, boolean value) {
+ if (value) {
+ Log.d("xmppService","options: "+options);
+ this.options = (this.options | 1 << option);
+ Log.d("xmppService","setting option "+option+" to 1");
+ Log.d("xmppService","options: "+options);
+ } else {
+ Log.d("xmppService","options: "+options);
+ Log.d("xmppService","setting option "+option+" to 0");
+ this.options = (this.options ^ 1 << option);
+ Log.d("xmppService","options: "+options);
+ }
+ }
+
public String getUsername() {
return username;
}
@@ -84,7 +100,11 @@ public class Account extends AbstractEntity{
}
public int getStatus() {
- return this.status;
+ if (isOptionSet(OPTION_DISABLED)) {
+ return STATUS_DISABLED;
+ } else {
+ return this.status;
+ }
}
public void setResource(String resource) {
@@ -102,6 +122,7 @@ public class Account extends AbstractEntity{
values.put(USERNAME, username);
values.put(SERVER, server);
values.put(PASSWORD, password);
+ values.put(OPTIONS,options);
return values;
}
diff --git a/src/de/gultsch/chat/services/XmppConnectionService.java b/src/de/gultsch/chat/services/XmppConnectionService.java
index fbbaca5c..ae1140ee 100644
--- a/src/de/gultsch/chat/services/XmppConnectionService.java
+++ b/src/de/gultsch/chat/services/XmppConnectionService.java
@@ -95,8 +95,11 @@ public class XmppConnectionService extends Service {
public int onStartCommand(Intent intent, int flags, int startId) {
for (Account account : accounts) {
if (!connections.containsKey(account)) {
-
- this.connections.put(account, this.createConnection(account));
+ if (!account.isOptionSet(Account.OPTION_DISABLED)) {
+ this.connections.put(account, this.createConnection(account));
+ } else {
+ Log.d(LOGTAG,account.getJid()+": not starting because it's disabled");
+ }
}
}
return START_STICKY;
@@ -253,7 +256,11 @@ public class XmppConnectionService extends Service {
connection.disconnect();
this.connections.remove(account);
}
- this.connections.put(account, this.createConnection(account));
+ if (!account.isOptionSet(Account.OPTION_DISABLED)) {
+ this.connections.put(account, this.createConnection(account));
+ } else {
+ Log.d(LOGTAG,account.getJid()+": not starting because it's disabled");
+ }
if (accountChangedListener!=null) accountChangedListener.onAccountListChangedListener();
}
diff --git a/src/de/gultsch/chat/ui/EditAccount.java b/src/de/gultsch/chat/ui/EditAccount.java
index 7cb48472..f8d70981 100644
--- a/src/de/gultsch/chat/ui/EditAccount.java
+++ b/src/de/gultsch/chat/ui/EditAccount.java
@@ -92,7 +92,7 @@ public class EditAccount extends DialogFragment {
usernameText.setText(account.getUsername());
serverText.setText(account.getServer());
okButtonDesc = "Edit";
- builder.setNegativeButton("Delete Account", new OnClickListener() {
+ /*builder.setNegativeButton("Delete Account", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
@@ -112,7 +112,7 @@ public class EditAccount extends DialogFragment {
builder.setNegativeButton("Cancel",null);
builder.create().show();
}
- });
+ });*/
} else {
builder.setTitle("Add account");
okButtonDesc = "Add";
diff --git a/src/de/gultsch/chat/ui/ManageAccountActivity.java b/src/de/gultsch/chat/ui/ManageAccountActivity.java
index 0a9b03de..33469acd 100644
--- a/src/de/gultsch/chat/ui/ManageAccountActivity.java
+++ b/src/de/gultsch/chat/ui/ManageAccountActivity.java
@@ -7,23 +7,32 @@ import de.gultsch.chat.R;
import de.gultsch.chat.entities.Account;
import de.gultsch.chat.ui.EditAccount.EditAccountListener;
import android.app.Activity;
+import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
+import android.view.ActionMode;
+import android.view.ActionMode.Callback;
import android.view.LayoutInflater;
import android.view.Menu;
+import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
+import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
-public class ManageAccountActivity extends XmppActivity {
+public class ManageAccountActivity extends XmppActivity implements ActionMode.Callback {
+ protected boolean isActionMode = false;
+ protected ActionMode actionMode;
+ protected Account selectedAccountForActionMode = null;
+
protected List<Account> accountList = new ArrayList<Account>();
protected ListView accountListView;
protected ArrayAdapter<Account> accountListViewAdapter;
@@ -70,6 +79,10 @@ public class ManageAccountActivity extends XmppActivity {
TextView statusView = (TextView) view
.findViewById(R.id.account_status);
switch (account.getStatus()) {
+ case Account.STATUS_DISABLED:
+ statusView.setText("temporarily disabled");
+ statusView.setTextColor(0xFF1da9da);
+ break;
case Account.STATUS_ONLINE:
statusView.setText("online");
statusView.setTextColor(0xFF83b600);
@@ -93,27 +106,49 @@ public class ManageAccountActivity extends XmppActivity {
return view;
}
};
+ final Activity activity = this;
accountListView.setAdapter(this.accountListViewAdapter);
accountListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View view,
int position, long arg3) {
- EditAccount dialog = new EditAccount();
- dialog.setAccount(accountList.get(position));
- dialog.setEditAccountListener(new EditAccountListener() {
-
- @Override
- public void onAccountEdited(Account account) {
- xmppConnectionService.updateAccount(account);
- }
+ if (!isActionMode) {
+ EditAccount dialog = new EditAccount();
+ dialog.setAccount(accountList.get(position));
+ dialog.setEditAccountListener(new EditAccountListener() {
+
+ @Override
+ public void onAccountEdited(Account account) {
+ xmppConnectionService.updateAccount(account);
+ }
+
+ @Override
+ public void onAccountDelete(Account account) {
+ xmppConnectionService.deleteAccount(account);
+ }
+ });
+ dialog.show(getFragmentManager(), "edit_account");
+ } else {
+ selectedAccountForActionMode = accountList.get(position);
+ actionMode.invalidate();
+ }
+ }
+ });
+ accountListView.setOnItemLongClickListener(new OnItemLongClickListener() {
- @Override
- public void onAccountDelete(Account account) {
- xmppConnectionService.deleteAccount(account);
- }
- });
- dialog.show(getFragmentManager(), "edit_account");
+ @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((Callback) activity);
+ return true;
+ } else {
+ return false;
+ }
}
});
}
@@ -180,4 +215,63 @@ public class ManageAccountActivity extends XmppActivity {
});
dialog.show(getFragmentManager(), "add_account");
}
+
+ @Override
+ public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
+ if (item.getItemId()==R.id.account_disable) {
+ selectedAccountForActionMode.setOption(Account.OPTION_DISABLED, true);
+ xmppConnectionService.updateAccount(selectedAccountForActionMode);
+ mode.finish();
+ } else if (item.getItemId()==R.id.account_enable) {
+ selectedAccountForActionMode.setOption(Account.OPTION_DISABLED, false);
+ xmppConnectionService.updateAccount(selectedAccountForActionMode);
+ mode.finish();
+ }
+ return true;
+ }
+
+ @Override
+ public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+ MenuInflater inflater = mode.getMenuInflater();
+ inflater.inflate(R.menu.manageaccounts_context, menu);
+ return true;
+ }
+
+ @Override
+ public void onDestroyActionMode(ActionMode mode) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
+ if (selectedAccountForActionMode.isOptionSet(Account.OPTION_DISABLED)) {
+ menu.findItem(R.id.account_enable).setVisible(true);
+ menu.findItem(R.id.account_disable).setVisible(false);
+ } else {
+ menu.findItem(R.id.account_disable).setVisible(true);
+ menu.findItem(R.id.account_enable).setVisible(false);
+ }
+ return true;
+ }
+
+ @Override
+ public void onActionModeStarted(ActionMode mode) {
+ super.onActionModeStarted(mode);
+ this.isActionMode = true;
+ }
+
+ @Override
+ public void onActionModeFinished(ActionMode mode) {
+ super.onActionModeFinished(mode);
+ this.isActionMode = false;
+ accountListView.clearChoices();
+ accountListView.requestLayout();
+ accountListView.post(new Runnable() {
+ @Override
+ public void run() {
+ accountListView.setChoiceMode(ListView.CHOICE_MODE_NONE);
+ }
+ });
+ }
}
diff --git a/src/de/gultsch/chat/ui/NewConversationActivity.java b/src/de/gultsch/chat/ui/NewConversationActivity.java
index 71c377dd..3bfb4e2a 100644
--- a/src/de/gultsch/chat/ui/NewConversationActivity.java
+++ b/src/de/gultsch/chat/ui/NewConversationActivity.java
@@ -185,7 +185,7 @@ public class NewConversationActivity extends XmppActivity {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Choose account");
- builder.setSingleChoiceItems(accountList,0,new OnClickListener() {
+ builder.setItems(accountList,new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {