From ab1814ea9b50feebce21aff2759172d7193afa7a Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Mon, 9 Jun 2014 19:46:44 -0700 Subject: #171 Add change password, delete user, start of user settings fragment --- .../daneren2005/dsub/fragments/AdminFragment.java | 105 +++++++++++++++++++++ .../dsub/fragments/SelectListFragment.java | 6 +- .../daneren2005/dsub/fragments/UserFragment.java | 61 ++++++++++++ .../dsub/service/CachedMusicService.java | 4 + src/github/daneren2005/dsub/view/UserAdapter.java | 1 - 5 files changed, 174 insertions(+), 3 deletions(-) create mode 100644 src/github/daneren2005/dsub/fragments/UserFragment.java (limited to 'src') diff --git a/src/github/daneren2005/dsub/fragments/AdminFragment.java b/src/github/daneren2005/dsub/fragments/AdminFragment.java index 716279cb..f6e8e153 100644 --- a/src/github/daneren2005/dsub/fragments/AdminFragment.java +++ b/src/github/daneren2005/dsub/fragments/AdminFragment.java @@ -15,6 +15,9 @@ package github.daneren2005.dsub.fragments; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.os.Bundle; import android.util.Log; import android.view.ContextMenu; import android.view.MenuInflater; @@ -22,6 +25,7 @@ import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; +import android.widget.TextView; import java.io.File; import java.util.ArrayList; @@ -30,8 +34,13 @@ import java.util.List; 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; import github.daneren2005.dsub.service.parser.SubsonicRESTException; +import github.daneren2005.dsub.util.Constants; import github.daneren2005.dsub.util.ProgressListener; +import github.daneren2005.dsub.util.SilentBackgroundTask; import github.daneren2005.dsub.util.Util; import github.daneren2005.dsub.view.UserAdapter; @@ -55,8 +64,10 @@ public class AdminFragment extends SelectListFragment { case R.id.admin_update_permissions: break; case R.id.admin_change_password: + changePassword(user); break; case R.id.admin_delete_user: + deleteUser(user); break; } @@ -98,6 +109,100 @@ public class AdminFragment extends SelectListFragment { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { + User user = (User) parent.getItemAtPosition(position); + SubsonicFragment fragment = new UserFragment(); + Bundle args = new Bundle(); + args.putSerializable(Constants.INTENT_EXTRA_NAME_ID, user); + fragment.setArguments(args); + + 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(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(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/SelectListFragment.java b/src/github/daneren2005/dsub/fragments/SelectListFragment.java index 4938fb3b..1c77ad68 100644 --- a/src/github/daneren2005/dsub/fragments/SelectListFragment.java +++ b/src/github/daneren2005/dsub/fragments/SelectListFragment.java @@ -107,12 +107,14 @@ public abstract class SelectListFragment extends SubsonicFragment implements @Override public boolean onOptionsItemSelected(MenuItem item) { return super.onOptionsItemSelected(item); - } @Override protected void refresh(final boolean refresh) { - setTitle(getTitleResource()); + int titleRes = getTitleResource(); + if(titleRes != 0) { + setTitle(getTitleResource()); + } listView.setVisibility(View.INVISIBLE); emptyView.setVisibility(View.GONE); diff --git a/src/github/daneren2005/dsub/fragments/UserFragment.java b/src/github/daneren2005/dsub/fragments/UserFragment.java new file mode 100644 index 00000000..3a85c6bb --- /dev/null +++ b/src/github/daneren2005/dsub/fragments/UserFragment.java @@ -0,0 +1,61 @@ +/* + This file is part of Subsonic. + Subsonic is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + Subsonic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with Subsonic. If not, see . + Copyright 2014 (C) Scott Jackson +*/ + +package github.daneren2005.dsub.fragments; + +import android.os.Bundle; +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.ListView; + +import github.daneren2005.dsub.R; +import github.daneren2005.dsub.domain.User; +import github.daneren2005.dsub.util.Constants; + +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); + + Bundle args = getArguments(); + user = (User) args.getSerializable(Constants.INTENT_EXTRA_NAME_ID); + setTitle(user.getUsername()); + + return rootView; + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) { + if(!primaryFragment) { + return; + } + + menuInflater.inflate(R.menu.empty, menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + return super.onOptionsItemSelected(item); + } +} diff --git a/src/github/daneren2005/dsub/service/CachedMusicService.java b/src/github/daneren2005/dsub/service/CachedMusicService.java index e14b4d84..1f1715c4 100644 --- a/src/github/daneren2005/dsub/service/CachedMusicService.java +++ b/src/github/daneren2005/dsub/service/CachedMusicService.java @@ -552,6 +552,10 @@ public class CachedMusicService implements MusicService { @Override public void deleteUser(String username, Context context, ProgressListener progressListener) throws Exception { musicService.deleteUser(username, context, progressListener); + + // Delete cached users if any have been removed from list + File file = new File(context.getCacheDir(), getCacheName(context, "users")); + file.delete(); } @Override diff --git a/src/github/daneren2005/dsub/view/UserAdapter.java b/src/github/daneren2005/dsub/view/UserAdapter.java index 8aaa261c..937e2e92 100644 --- a/src/github/daneren2005/dsub/view/UserAdapter.java +++ b/src/github/daneren2005/dsub/view/UserAdapter.java @@ -26,7 +26,6 @@ import github.daneren2005.dsub.R; import github.daneren2005.dsub.domain.User; public class UserAdapter extends ArrayAdapter { - private final Context activity; public UserAdapter(Context activity, List users) { -- cgit v1.2.3