aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--res/drawable-hdpi/ic_menu_password_dark.pngbin0 -> 843 bytes
-rw-r--r--res/drawable-hdpi/ic_menu_password_light.pngbin0 -> 958 bytes
-rw-r--r--res/drawable-mdpi/ic_menu_password_dark.pngbin0 -> 554 bytes
-rw-r--r--res/drawable-mdpi/ic_menu_password_light.pngbin0 -> 676 bytes
-rw-r--r--res/drawable-xhdpi/ic_menu_password_dark.pngbin0 -> 1067 bytes
-rw-r--r--res/drawable-xhdpi/ic_menu_password_light.pngbin0 -> 1234 bytes
-rw-r--r--res/drawable-xxhdpi/ic_menu_password_dark.pngbin0 -> 1610 bytes
-rw-r--r--res/drawable-xxhdpi/ic_menu_password_light.pngbin0 -> 1852 bytes
-rw-r--r--res/layout/change_email.xml28
-rw-r--r--res/menu/admin_context.xml4
-rw-r--r--res/menu/user.xml10
-rw-r--r--res/menu/user_user.xml14
-rw-r--r--res/values/attrs.xml1
-rw-r--r--res/values/strings.xml5
-rw-r--r--res/values/themes.xml3
-rw-r--r--src/github/daneren2005/dsub/fragments/AdminFragment.java98
-rw-r--r--src/github/daneren2005/dsub/fragments/UserFragment.java58
-rw-r--r--src/github/daneren2005/dsub/service/CachedMusicService.java9
-rw-r--r--src/github/daneren2005/dsub/service/MusicService.java2
-rw-r--r--src/github/daneren2005/dsub/service/OfflineMusicService.java5
-rw-r--r--src/github/daneren2005/dsub/service/RESTMusicService.java10
-rw-r--r--src/github/daneren2005/dsub/util/UserUtil.java184
22 files changed, 302 insertions, 129 deletions
diff --git a/res/drawable-hdpi/ic_menu_password_dark.png b/res/drawable-hdpi/ic_menu_password_dark.png
new file mode 100644
index 00000000..67fa3e84
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_password_dark.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_password_light.png b/res/drawable-hdpi/ic_menu_password_light.png
new file mode 100644
index 00000000..bd99c01f
--- /dev/null
+++ b/res/drawable-hdpi/ic_menu_password_light.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_password_dark.png b/res/drawable-mdpi/ic_menu_password_dark.png
new file mode 100644
index 00000000..74d0095a
--- /dev/null
+++ b/res/drawable-mdpi/ic_menu_password_dark.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_password_light.png b/res/drawable-mdpi/ic_menu_password_light.png
new file mode 100644
index 00000000..159f7889
--- /dev/null
+++ b/res/drawable-mdpi/ic_menu_password_light.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_password_dark.png b/res/drawable-xhdpi/ic_menu_password_dark.png
new file mode 100644
index 00000000..d1fc0a97
--- /dev/null
+++ b/res/drawable-xhdpi/ic_menu_password_dark.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_password_light.png b/res/drawable-xhdpi/ic_menu_password_light.png
new file mode 100644
index 00000000..1cbf085c
--- /dev/null
+++ b/res/drawable-xhdpi/ic_menu_password_light.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_menu_password_dark.png b/res/drawable-xxhdpi/ic_menu_password_dark.png
new file mode 100644
index 00000000..a7cd1a6d
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_menu_password_dark.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_menu_password_light.png b/res/drawable-xxhdpi/ic_menu_password_light.png
new file mode 100644
index 00000000..5670a209
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_menu_password_light.png
Binary files differ
diff --git a/res/layout/change_email.xml b/res/layout/change_email.xml
new file mode 100644
index 00000000..8b74215c
--- /dev/null
+++ b/res/layout/change_email.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="horizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content">
+
+ <TextView
+ android:id="@+id/new_email_label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="4dp"
+ android:textSize="20dp"
+ android:text="@string/admin.change_email_label" />
+ <EditText
+ android:id="@+id/new_email"
+ android:inputType="textEmailAddress"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginLeft="4dp" />
+ </LinearLayout>
+
+</LinearLayout> \ No newline at end of file
diff --git a/res/menu/admin_context.xml b/res/menu/admin_context.xml
index 8cd04859..922a24a9 100644
--- a/res/menu/admin_context.xml
+++ b/res/menu/admin_context.xml
@@ -3,6 +3,10 @@
xmlns:compat="http://schemas.android.com/apk/res-auto">
<item
+ android:id="@+id/admin_change_email"
+ android:title="@string/admin.change_email"/>
+
+ <item
android:id="@+id/admin_change_password"
android:title="@string/admin.change_password"/>
diff --git a/res/menu/user.xml b/res/menu/user.xml
index ace011b1..aea881fc 100644
--- a/res/menu/user.xml
+++ b/res/menu/user.xml
@@ -9,6 +9,16 @@
compat:showAsAction="always|withText"/>
<item
+ android:id="@+id/menu_change_password"
+ android:title="@string/admin.change_password"
+ android:icon="?attr/password"
+ compat:showAsAction="always|withText"/>
+
+ <item
+ android:id="@+id/menu_change_email"
+ android:title="@string/admin.change_email"/>
+
+ <item
android:id="@+id/menu_exit"
android:title="@string/menu.exit"/>
</menu> \ No newline at end of file
diff --git a/res/menu/user_user.xml b/res/menu/user_user.xml
new file mode 100644
index 00000000..f66aa793
--- /dev/null
+++ b/res/menu/user_user.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:compat="http://schemas.android.com/apk/res-auto">
+
+ <item
+ android:id="@+id/menu_change_password"
+ android:title="@string/admin.change_password"
+ android:icon="?attr/password"
+ compat:showAsAction="always|withText"/>
+
+ <item
+ android:id="@+id/menu_exit"
+ android:title="@string/menu.exit"/>
+</menu> \ No newline at end of file
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index b820c371..ac535487 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -22,5 +22,6 @@
<attr name="bookmark" format="reference"/>
<attr name="share" format="reference"/>
<attr name="add_person" format="reference"/>
+ <attr name="password" format="reference"/>
<attr name="drawerItemsIcons" format="reference"/>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 460e46db..d43d8c7b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -450,6 +450,11 @@
<string name="admin.update_permissions">Update Permissions</string>
<string name="admin.update_permissions_success">Successfully updated permission for %1$s</string>
<string name="admin.update_permissions_error">Failed to update permissions for %1$s</string>
+ <string name="admin.change_email">Change Email</string>
+ <string name="admin.change_email_success">Successfully changed email for %1$s</string>
+ <string name="admin.change_email_error">Failed to change email for %1$s</string>
+ <string name="admin.change_email_label">New Email:</string>
+ <string name="admin.change_email_invalid">Enter a valid email</string>
<string name="admin.change_password">Change Password</string>
<string name="admin.change_password_success">Successfully changed password for %1$s</string>
<string name="admin.change_password_error">Failed to change password for %1$s</string>
diff --git a/res/values/themes.xml b/res/values/themes.xml
index 0f464baa..6611cff7 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -25,6 +25,7 @@
<item name="bookmark">@drawable/ic_menu_bookmark_light</item>
<item name="share">@drawable/ic_menu_share_light</item>
<item name="add_person">@drawable/ic_menu_add_person_light</item>
+ <item name="password">@drawable/ic_menu_password_light</item>
<item name="drawerItemsIcons">@array/drawerItemIconsLight</item>
<item name="android:textViewStyle">@style/DSub.TextViewStyle</item>
<item name="android:buttonStyle">@style/DSub.ButtonStyle.Light</item>
@@ -55,6 +56,7 @@
<item name="bookmark">@drawable/ic_menu_bookmark_dark</item>
<item name="share">@drawable/ic_menu_share_dark</item>
<item name="add_person">@drawable/ic_menu_add_person_dark</item>
+ <item name="password">@drawable/ic_menu_password_dark</item>
<item name="drawerItemsIcons">@array/drawerItemIconsDark</item>
<item name="android:textViewStyle">@style/DSub.TextViewStyle</item>
<item name="android:buttonStyle">@style/DSub.ButtonStyle.Dark</item>
@@ -88,6 +90,7 @@
<item name="bookmark">@drawable/ic_menu_bookmark_dark</item>
<item name="share">@drawable/ic_menu_share_dark</item>
<item name="add_person">@drawable/ic_menu_add_person_dark</item>
+ <item name="password">@drawable/ic_menu_password_dark</item>
<item name="drawerItemsIcons">@array/drawerItemIconsDark</item>
<item name="android:textViewStyle">@style/DSub.TextViewStyle</item>
<item name="android:buttonStyle">@style/DSub.ButtonStyle.Dark</item>
diff --git a/src/github/daneren2005/dsub/fragments/AdminFragment.java b/src/github/daneren2005/dsub/fragments/AdminFragment.java
index b7f09532..e0989e43 100644
--- a/src/github/daneren2005/dsub/fragments/AdminFragment.java
+++ b/src/github/daneren2005/dsub/fragments/AdminFragment.java
@@ -53,7 +53,7 @@ public class AdminFragment extends SelectListFragment<User> {
super.onCreateContextMenu(menu, view, menuInfo);
MenuInflater inflater = context.getMenuInflater();
- if(UserUtil.isCurrentAdmin(context) && Util.checkServerVersion(context, "1.10")) {
+ if(UserUtil.isCurrentAdmin()) {
inflater.inflate(R.menu.admin_context, menu);
} else {
inflater.inflate(R.menu.admin_context_user, menu);
@@ -66,11 +66,14 @@ public class AdminFragment extends SelectListFragment<User> {
User user = objects.get(info.position);
switch(menuItem.getItemId()) {
+ case R.id.admin_change_email:
+ UserUtil.changeEmail(context, user);
+ break;
case R.id.admin_change_password:
- changePassword(user);
+ UserUtil.changePassword(context, user);
break;
case R.id.admin_delete_user:
- deleteUser(user);
+ UserUtil.deleteUser(context, user, adapter);
break;
}
@@ -79,7 +82,7 @@ public class AdminFragment extends SelectListFragment<User> {
@Override
public int getOptionsMenu() {
- if(UserUtil.isCurrentAdmin(context)) {
+ if(UserUtil.isCurrentAdmin()) {
return R.menu.admin;
} else {
return R.menu.empty;
@@ -125,91 +128,4 @@ public class AdminFragment extends SelectListFragment<User> {
replaceFragment(fragment);
}
-
- private void changePassword(final User user) {
- View layout = context.getLayoutInflater().inflate(R.layout.change_password, null);
- final TextView passwordView = (TextView) layout.findViewById(R.id.new_password);
-
- AlertDialog.Builder builder = new AlertDialog.Builder(context);
- builder.setTitle(R.string.admin_change_password)
- .setView(layout)
- .setPositiveButton(R.string.common_save, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int id) {
- final String password = passwordView.getText().toString();
- // Don't allow blank passwords
- if ("".equals(password)) {
- Util.toast(context, R.string.admin_change_password_invalid);
- return;
- }
-
- new SilentBackgroundTask<Void>(context) {
- @Override
- protected Void doInBackground() throws Throwable {
- MusicService musicService = MusicServiceFactory.getMusicService(context);
- musicService.changePassword(user.getUsername(), password, context, null);
- return null;
- }
-
- @Override
- protected void done(Void v) {
- Util.toast(context, context.getResources().getString(R.string.admin_change_password_success, user.getUsername()));
- }
-
- @Override
- protected void error(Throwable error) {
- String msg;
- if (error instanceof OfflineException || error instanceof ServerTooOldException) {
- msg = getErrorMessage(error);
- } else {
- msg = context.getResources().getString(R.string.admin_change_password_error, user.getUsername());
- }
-
- Util.toast(context, msg);
- }
- }.execute();
- }
- })
- .setNegativeButton(R.string.common_cancel, null)
- .setCancelable(true);
-
- AlertDialog dialog = builder.create();
- dialog.show();
- }
-
- private void deleteUser(final User user) {
- Util.confirmDialog(context, R.string.common_delete, user.getUsername(), new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- new SilentBackgroundTask<Void>(context) {
- @Override
- protected Void doInBackground() throws Throwable {
- MusicService musicService = MusicServiceFactory.getMusicService(context);
- musicService.deleteUser(user.getUsername(), context, null);
- return null;
- }
-
- @Override
- protected void done(Void v) {
- adapter.remove(user);
- adapter.notifyDataSetChanged();
-
- Util.toast(context, context.getResources().getString(R.string.admin_delete_user_success, user.getUsername()));
- }
-
- @Override
- protected void error(Throwable error) {
- String msg;
- if (error instanceof OfflineException || error instanceof ServerTooOldException) {
- msg = getErrorMessage(error);
- } else {
- msg = context.getResources().getString(R.string.admin_delete_user_error, user.getUsername());
- }
-
- Util.toast(context, msg);
- }
- }.execute();
- }
- });
- }
}
diff --git a/src/github/daneren2005/dsub/fragments/UserFragment.java b/src/github/daneren2005/dsub/fragments/UserFragment.java
index f2af85fb..6423ebcd 100644
--- a/src/github/daneren2005/dsub/fragments/UserFragment.java
+++ b/src/github/daneren2005/dsub/fragments/UserFragment.java
@@ -15,6 +15,9 @@
package github.daneren2005.dsub.fragments;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
@@ -24,8 +27,10 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
+import android.widget.TextView;
import github.daneren2005.dsub.R;
+import github.daneren2005.dsub.activity.SubsonicActivity;
import github.daneren2005.dsub.domain.User;
import github.daneren2005.dsub.service.MusicService;
import github.daneren2005.dsub.service.MusicServiceFactory;
@@ -39,12 +44,10 @@ import github.daneren2005.dsub.view.SettingsAdapter;
public class UserFragment extends SubsonicFragment{
private ListView listView;
- private LayoutInflater inflater;
private User user;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) {
- this.inflater = inflater;
rootView = inflater.inflate(R.layout.abstract_list_fragment, container, false);
refreshLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.refresh_layout);
@@ -54,7 +57,7 @@ public class UserFragment extends SubsonicFragment{
user = (User) args.getSerializable(Constants.INTENT_EXTRA_NAME_ID);
listView = (ListView)rootView.findViewById(R.id.fragment_list);
- listView.setAdapter(new SettingsAdapter(context, user.getSettings(), UserUtil.isCurrentAdmin(context)));
+ listView.setAdapter(new SettingsAdapter(context, user.getSettings(), UserUtil.isCurrentAdmin()));
setTitle(user.getUsername());
@@ -62,15 +65,22 @@ public class UserFragment extends SubsonicFragment{
}
@Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ activity.invalidateOptionsMenu();
+ }
+
+ @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
- if(!primaryFragment) {
+ // For some reason this is called before onAttach
+ if(!primaryFragment || context == null) {
return;
}
- if(UserUtil.isCurrentAdmin(context)) {
+ if(UserUtil.isCurrentAdmin() && Util.checkServerVersion(context, "1.10")) {
menuInflater.inflate(R.menu.user, menu);
} else {
- menuInflater.inflate(R.menu.empty, menu);
+ menuInflater.inflate(R.menu.user_user, menu);
}
}
@@ -82,38 +92,16 @@ public class UserFragment extends SubsonicFragment{
switch (item.getItemId()) {
case R.id.menu_update_permissions:
- updateSettings();
+ UserUtil.updateSettings(context, user);
+ return true;
+ case R.id.menu_change_password:
+ UserUtil.changePassword(context, user);
+ return true;
+ case R.id.menu_change_email:
+ UserUtil.changeEmail(context, user);
return true;
}
return false;
}
-
- private void updateSettings() {
- new SilentBackgroundTask<Void>(context) {
- @Override
- protected Void doInBackground() throws Throwable {
- MusicService musicService = MusicServiceFactory.getMusicService(context);
- musicService.updateUser(user, context, null);
- return null;
- }
-
- @Override
- protected void done(Void v) {
- Util.toast(context, context.getResources().getString(R.string.admin_update_permissions_success, user.getUsername()));
- }
-
- @Override
- protected void error(Throwable error) {
- String msg;
- if (error instanceof OfflineException || error instanceof ServerTooOldException) {
- msg = getErrorMessage(error);
- } else {
- msg = context.getResources().getString(R.string.admin_update_permissions_error, user.getUsername());
- }
-
- Util.toast(context, msg);
- }
- }.execute();
- }
}
diff --git a/src/github/daneren2005/dsub/service/CachedMusicService.java b/src/github/daneren2005/dsub/service/CachedMusicService.java
index 86289511..0049e0ac 100644
--- a/src/github/daneren2005/dsub/service/CachedMusicService.java
+++ b/src/github/daneren2005/dsub/service/CachedMusicService.java
@@ -563,6 +563,15 @@ public class CachedMusicService implements MusicService {
}
@Override
+ public void changeEmail(String username, String email, Context context, ProgressListener progressListener) throws Exception {
+ musicService.changeEmail(username, email, context, progressListener);
+
+ // Delete cached users if any have been removed from list
+ File file = new File(context.getCacheDir(), getCacheName(context, "users"));
+ file.delete();
+ }
+
+ @Override
public void changePassword(String username, String password, Context context, ProgressListener progressListener) throws Exception {
musicService.changePassword(username, password, context, progressListener);
}
diff --git a/src/github/daneren2005/dsub/service/MusicService.java b/src/github/daneren2005/dsub/service/MusicService.java
index 6f58603c..dc760f86 100644
--- a/src/github/daneren2005/dsub/service/MusicService.java
+++ b/src/github/daneren2005/dsub/service/MusicService.java
@@ -172,6 +172,8 @@ public interface MusicService {
void deleteUser(String username, Context context, ProgressListener progressListener) throws Exception;
+ void changeEmail(String username, String email, Context context, ProgressListener progressListener) throws Exception;
+
void changePassword(String username, String password, Context context, ProgressListener progressListener) throws Exception;
Bitmap getAvatar(String username, Context context, ProgressListener progressListener) throws Exception;
diff --git a/src/github/daneren2005/dsub/service/OfflineMusicService.java b/src/github/daneren2005/dsub/service/OfflineMusicService.java
index 9e2b9e13..75a090c6 100644
--- a/src/github/daneren2005/dsub/service/OfflineMusicService.java
+++ b/src/github/daneren2005/dsub/service/OfflineMusicService.java
@@ -716,6 +716,11 @@ public class OfflineMusicService extends RESTMusicService {
}
@Override
+ public void changeEmail(String username, String email, Context context, ProgressListener progressListener) throws Exception {
+ throw new OfflineException("Changing email not available in offline mode");
+ }
+
+ @Override
public void changePassword(String username, String password, Context context, ProgressListener progressListener) throws Exception {
throw new OfflineException("Changing passwords not available in offline mode");
}
diff --git a/src/github/daneren2005/dsub/service/RESTMusicService.java b/src/github/daneren2005/dsub/service/RESTMusicService.java
index c2f64dad..371e309c 100644
--- a/src/github/daneren2005/dsub/service/RESTMusicService.java
+++ b/src/github/daneren2005/dsub/service/RESTMusicService.java
@@ -1264,6 +1264,16 @@ public class RESTMusicService implements MusicService {
}
@Override
+ public void changeEmail(String username, String email, Context context, ProgressListener progressListener) throws Exception {
+ Reader reader = getReader(context, progressListener, "updateUser", null, Arrays.asList("username", "email"), Arrays.<Object>asList(username, email));
+ try {
+ new ErrorParser(context).parse(reader);
+ } finally {
+ Util.close(reader);
+ }
+ }
+
+ @Override
public void changePassword(String username, String password, Context context, ProgressListener progressListener) throws Exception {
Reader reader = getReader(context, progressListener, "changePassword", null, Arrays.asList("username", "password"), Arrays.<Object>asList(username, password));
try {
diff --git a/src/github/daneren2005/dsub/util/UserUtil.java b/src/github/daneren2005/dsub/util/UserUtil.java
index 5158829c..60243731 100644
--- a/src/github/daneren2005/dsub/util/UserUtil.java
+++ b/src/github/daneren2005/dsub/util/UserUtil.java
@@ -15,14 +15,24 @@
package github.daneren2005.dsub.util;
+import android.app.Activity;
+import android.app.AlertDialog;
import android.content.Context;
+import android.content.DialogInterface;
import android.content.SharedPreferences;
+import android.view.View;
+import android.widget.Adapter;
+import android.widget.ArrayAdapter;
+import android.widget.TextView;
import java.io.File;
import github.daneren2005.dsub.R;
import github.daneren2005.dsub.domain.User;
+import github.daneren2005.dsub.service.MusicService;
import github.daneren2005.dsub.service.MusicServiceFactory;
+import github.daneren2005.dsub.service.OfflineException;
+import github.daneren2005.dsub.service.ServerTooOldException;
public final class UserUtil {
private static User currentUser;
@@ -55,15 +65,15 @@ public final class UserUtil {
return getCurrentUsername(context, Util.getActiveServer(context));
}
- public static boolean isCurrentAdmin(Context context) {
+ public static boolean isCurrentAdmin() {
if(currentUser == null) {
return false;
} else {
- return isCurrentRole(context, "adminRole");
+ return isCurrentRole("adminRole");
}
}
- public static boolean isCurrentRole(Context context, String role) {
+ public static boolean isCurrentRole(String role) {
if(currentUser == null) {
return false;
}
@@ -76,4 +86,172 @@ public final class UserUtil {
return false;
}
+
+ public static void changePassword(final Activity context, final User user) {
+ View layout = context.getLayoutInflater().inflate(R.layout.change_password, null);
+ final TextView passwordView = (TextView) layout.findViewById(R.id.new_password);
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(context);
+ builder.setTitle(R.string.admin_change_password)
+ .setView(layout)
+ .setPositiveButton(R.string.common_save, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int id) {
+ final String password = passwordView.getText().toString();
+ // Don't allow blank passwords
+ if ("".equals(password)) {
+ Util.toast(context, R.string.admin_change_password_invalid);
+ return;
+ }
+
+ new SilentBackgroundTask<Void>(context) {
+ @Override
+ protected Void doInBackground() throws Throwable {
+ MusicService musicService = MusicServiceFactory.getMusicService(context);
+ musicService.changePassword(user.getUsername(), password, context, null);
+ return null;
+ }
+
+ @Override
+ protected void done(Void v) {
+ Util.toast(context, context.getResources().getString(R.string.admin_change_password_success, user.getUsername()));
+ }
+
+ @Override
+ protected void error(Throwable error) {
+ String msg;
+ if (error instanceof OfflineException || error instanceof ServerTooOldException) {
+ msg = getErrorMessage(error);
+ } else {
+ msg = context.getResources().getString(R.string.admin_change_password_error, user.getUsername());
+ }
+
+ Util.toast(context, msg);
+ }
+ }.execute();
+ }
+ })
+ .setNegativeButton(R.string.common_cancel, null)
+ .setCancelable(true);
+
+ AlertDialog dialog = builder.create();
+ dialog.show();
+ }
+
+ public static void updateSettings(final Context context, final User user) {
+ new SilentBackgroundTask<Void>(context) {
+ @Override
+ protected Void doInBackground() throws Throwable {
+ MusicService musicService = MusicServiceFactory.getMusicService(context);
+ musicService.updateUser(user, context, null);
+ return null;
+ }
+
+ @Override
+ protected void done(Void v) {
+ Util.toast(context, context.getResources().getString(R.string.admin_update_permissions_success, user.getUsername()));
+ }
+
+ @Override
+ protected void error(Throwable error) {
+ String msg;
+ if (error instanceof OfflineException || error instanceof ServerTooOldException) {
+ msg = getErrorMessage(error);
+ } else {
+ msg = context.getResources().getString(R.string.admin_update_permissions_error, user.getUsername());
+ }
+
+ Util.toast(context, msg);
+ }
+ }.execute();
+ }
+
+ public static void changeEmail(final Activity context, final User user) {
+ View layout = context.getLayoutInflater().inflate(R.layout.change_email, null);
+ final TextView emailView = (TextView) layout.findViewById(R.id.new_email);
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(context);
+ builder.setTitle(R.string.admin_change_email)
+ .setView(layout)
+ .setPositiveButton(R.string.common_save, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int id) {
+ final String email = emailView.getText().toString();
+ // Don't allow blank emails
+ if ("".equals(email)) {
+ Util.toast(context, R.string.admin_change_email_invalid);
+ return;
+ }
+
+ new SilentBackgroundTask<Void>(context) {
+ @Override
+ protected Void doInBackground() throws Throwable {
+ MusicService musicService = MusicServiceFactory.getMusicService(context);
+ musicService.changeEmail(user.getUsername(), email, context, null);
+ return null;
+ }
+
+ @Override
+ protected void done(Void v) {
+ Util.toast(context, context.getResources().getString(R.string.admin_change_email_success, user.getUsername()));
+ }
+
+ @Override
+ protected void error(Throwable error) {
+ String msg;
+ if (error instanceof OfflineException || error instanceof ServerTooOldException) {
+ msg = getErrorMessage(error);
+ } else {
+ msg = context.getResources().getString(R.string.admin_change_email_error, user.getUsername());
+ }
+
+ Util.toast(context, msg);
+ }
+ }.execute();
+ }
+ })
+ .setNegativeButton(R.string.common_cancel, null)
+ .setCancelable(true);
+
+ AlertDialog dialog = builder.create();
+ dialog.show();
+ }
+
+ public static void deleteUser(final Context context, final User user, final ArrayAdapter adapter) {
+ Util.confirmDialog(context, R.string.common_delete, user.getUsername(), new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ new SilentBackgroundTask<Void>(context) {
+ @Override
+ protected Void doInBackground() throws Throwable {
+ MusicService musicService = MusicServiceFactory.getMusicService(context);
+ musicService.deleteUser(user.getUsername(), context, null);
+ return null;
+ }
+
+ @Override
+ protected void done(Void v) {
+ if(adapter != null) {
+ adapter.remove(user);
+ adapter.notifyDataSetChanged();
+ }
+
+ Util.toast(context, context.getResources().getString(R.string.admin_delete_user_success, user.getUsername()));
+ }
+
+ @Override
+ protected void error(Throwable error) {
+ String msg;
+ if (error instanceof OfflineException || error instanceof ServerTooOldException) {
+ msg = getErrorMessage(error);
+ } else {
+ msg = context.getResources().getString(R.string.admin_delete_user_error, user.getUsername());
+ }
+
+ Util.toast(context, msg);
+ }
+ }.execute();
+ }
+ });
+ }
}