From 2d1a783bdc5679a770748d3330aad42e48f2157d Mon Sep 17 00:00:00 2001 From: Scott Jackson Date: Tue, 9 Jun 2015 17:39:34 -0700 Subject: Convert UserFragment to RecyclerView --- .../daneren2005/dsub/adapter/SettingsAdapter.java | 77 ++++++++++++----- .../daneren2005/dsub/fragments/UserFragment.java | 99 ++++++++-------------- .../github/daneren2005/dsub/util/UserUtil.java | 12 ++- .../github/daneren2005/dsub/view/SettingView.java | 55 +++++++----- app/src/main/res/layout/basic_choice_item.xml | 26 ++++++ app/src/main/res/layout/create_user.xml | 5 +- 6 files changed, 164 insertions(+), 110 deletions(-) create mode 100644 app/src/main/res/layout/basic_choice_item.xml (limited to 'app/src') diff --git a/app/src/main/java/github/daneren2005/dsub/adapter/SettingsAdapter.java b/app/src/main/java/github/daneren2005/dsub/adapter/SettingsAdapter.java index 45c3ead1..d99b294b 100644 --- a/app/src/main/java/github/daneren2005/dsub/adapter/SettingsAdapter.java +++ b/app/src/main/java/github/daneren2005/dsub/adapter/SettingsAdapter.java @@ -16,44 +16,83 @@ package github.daneren2005.dsub.adapter; import android.content.Context; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.TextView; import java.util.List; import github.daneren2005.dsub.R; import github.daneren2005.dsub.domain.User; +import github.daneren2005.dsub.util.ImageLoader; import github.daneren2005.dsub.view.SettingView; +import github.daneren2005.dsub.view.UpdateView; import static github.daneren2005.dsub.domain.User.Setting; -public class SettingsAdapter extends ArrayAdapter { - private final Context context; +public class SettingsAdapter extends SectionAdapter { + public final int VIEW_TYPE_SETTING = 1; + + private final User user; private final boolean editable; + private final ImageLoader imageLoader; - public SettingsAdapter(Context context, User user, boolean editable) { - super(context, R.layout.basic_list_item, user.getSettings()); - this.context = context; + public SettingsAdapter(Context context, User user, ImageLoader imageLoader, boolean editable) { + super(context, user.getSettings(), imageLoader != null); + this.user = user; + this.imageLoader = imageLoader; this.editable = editable; + + List settings = sections.get(0); + for(Setting setting: settings) { + if(setting.getValue()) { + addSelected(setting); + } + } } - public SettingsAdapter(Context context, List settings, boolean editable) { - super(context, R.layout.basic_list_item, settings); - this.context = context; - this.editable = editable; + public UpdateView.UpdateViewHolder onCreateHeaderHolder(ViewGroup parent) { + View header = LayoutInflater.from(context).inflate(R.layout.user_header, parent, false); + return new UpdateView.UpdateViewHolder(header, false); } + public void onBindHeaderHolder(UpdateView.UpdateViewHolder holder, String description) { + View header = holder.getView(); - @Override - public View getView(int position, View convertView, ViewGroup parent) { - Setting entry = getItem(position); - SettingView view; - if (convertView != null && convertView instanceof SettingView) { - view = (SettingView) convertView; + ImageView coverArtView = (ImageView) header.findViewById(R.id.user_avatar); + imageLoader.loadAvatar(context, coverArtView, user.getUsername()); + + TextView usernameView = (TextView) header.findViewById(R.id.user_username); + usernameView.setText(user.getUsername()); + + final TextView emailView = (TextView) header.findViewById(R.id.user_email); + if(user.getEmail() != null) { + emailView.setText(user.getEmail()); } else { - view = new SettingView(context); + emailView.setVisibility(View.GONE); + } + } + + @Override + public UpdateView.UpdateViewHolder onCreateSectionViewHolder(ViewGroup parent, int viewType) { + return new UpdateView.UpdateViewHolder(new SettingView(context)); + } + + @Override + public void onBindViewHolder(UpdateView.UpdateViewHolder holder, Setting item, int viewType) { + holder.getUpdateView().setObject(item, editable); + } + + @Override + public int getItemViewType(Setting item) { + return VIEW_TYPE_SETTING; + } + + @Override + public void setChecked(UpdateView updateView, boolean checked) { + if(updateView instanceof SettingView) { + ((SettingView) updateView).setChecked(checked); } - view.setObject(entry, editable); - return view; } } diff --git a/app/src/main/java/github/daneren2005/dsub/fragments/UserFragment.java b/app/src/main/java/github/daneren2005/dsub/fragments/UserFragment.java index 00c7c603..25196d66 100644 --- a/app/src/main/java/github/daneren2005/dsub/fragments/UserFragment.java +++ b/app/src/main/java/github/daneren2005/dsub/fragments/UserFragment.java @@ -15,71 +15,30 @@ package github.daneren2005.dsub.fragments; -import android.app.Activity; import android.os.Bundle; -import android.support.v4.widget.SwipeRefreshLayout; -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.ImageView; -import android.widget.ListView; -import android.widget.TextView; + +import java.util.List; import github.daneren2005.dsub.R; -import github.daneren2005.dsub.activity.SubsonicActivity; +import github.daneren2005.dsub.adapter.SectionAdapter; import github.daneren2005.dsub.domain.ServerInfo; import github.daneren2005.dsub.domain.User; +import github.daneren2005.dsub.service.MusicService; import github.daneren2005.dsub.util.Constants; -import github.daneren2005.dsub.util.ImageLoader; +import github.daneren2005.dsub.util.ProgressListener; import github.daneren2005.dsub.util.UserUtil; import github.daneren2005.dsub.adapter.SettingsAdapter; -public class UserFragment extends SubsonicFragment{ - private ListView listView; +public class UserFragment extends SelectRecyclerFragment{ private User user; @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) { - rootView = inflater.inflate(R.layout.abstract_list_fragment, container, false); - - refreshLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.refresh_layout); - refreshLayout.setEnabled(false); - + public void onCreate(Bundle bundle) { + super.onCreate(bundle); Bundle args = getArguments(); user = (User) args.getSerializable(Constants.INTENT_EXTRA_NAME_ID); - - listView = (ListView)rootView.findViewById(R.id.fragment_list); - createHeader(); - listView.setAdapter(new SettingsAdapter(context, user.getSettings(), UserUtil.isCurrentAdmin() && ServerInfo.checkServerVersion(context, "1.10"))); - - setTitle(user.getUsername()); - - return rootView; - } - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - ((SubsonicActivity) activity).supportInvalidateOptionsMenu(); - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) { - // For some reason this is called before onAttach - if(!primaryFragment || context == null) { - return; - } - - if(UserUtil.isCurrentAdmin() && ServerInfo.checkServerVersion(context, "1.10")) { - menuInflater.inflate(R.menu.user, menu); - } else if(UserUtil.isCurrentRole(User.SETTINGS)) { - menuInflater.inflate(R.menu.user_user, menu); - } else { - menuInflater.inflate(R.menu.empty, menu); - } + pullToRefresh = false; } @Override @@ -103,23 +62,35 @@ public class UserFragment extends SubsonicFragment{ return false; } - private void createHeader() { - View header = LayoutInflater.from(context).inflate(R.layout.user_header, listView, false); + @Override + public int getOptionsMenu() { + if(UserUtil.isCurrentAdmin() && ServerInfo.checkServerVersion(context, "1.10")) { + return R.menu.user; + } else if(UserUtil.isCurrentRole(User.SETTINGS)) { + return R.menu.user_user; + } else { + return R.menu.empty; + } + } + + @Override + public SectionAdapter getAdapter(List objs) { + return new SettingsAdapter(context, user, getImageLoader(), UserUtil.isCurrentAdmin() && ServerInfo.checkServerVersion(context, "1.10")); + } - final ImageLoader imageLoader = getImageLoader(); - ImageView coverArtView = (ImageView) header.findViewById(R.id.user_avatar); - imageLoader.loadAvatar(context, coverArtView, user.getUsername()); + @Override + public List getObjects(MusicService musicService, boolean refresh, ProgressListener listener) throws Exception { + return user.getSettings(); + } - TextView usernameView = (TextView) header.findViewById(R.id.user_username); - usernameView.setText(user.getUsername()); + @Override + public int getTitleResource() { + setTitle(user.getUsername()); + return 0; + } - final TextView emailView = (TextView) header.findViewById(R.id.user_email); - if(user.getEmail() != null) { - emailView.setText(user.getEmail()); - } else { - emailView.setVisibility(View.GONE); - } + @Override + public void onItemClicked(User.Setting item) { - listView.addHeaderView(header); } } diff --git a/app/src/main/java/github/daneren2005/dsub/util/UserUtil.java b/app/src/main/java/github/daneren2005/dsub/util/UserUtil.java index 5c5f1543..fb2de05e 100644 --- a/app/src/main/java/github/daneren2005/dsub/util/UserUtil.java +++ b/app/src/main/java/github/daneren2005/dsub/util/UserUtil.java @@ -21,8 +21,11 @@ import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.support.v7.app.ActionBarActivity; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.View; +import android.view.WindowManager; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; @@ -183,6 +186,7 @@ public final class UserUtil { .setCancelable(true); AlertDialog dialog = builder.create(); + dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); dialog.show(); } } @@ -248,7 +252,6 @@ public final class UserUtil { protected Void doInBackground() throws Throwable { MusicService musicService = MusicServiceFactory.getMusicService(context); musicService.updateUser(user, context, null); - user.setSettings(user.getSettings()); return null; } @@ -378,8 +381,11 @@ public final class UserUtil { final TextView usernameView = (TextView) layout.findViewById(R.id.username); final TextView emailView = (TextView) layout.findViewById(R.id.email); final TextView passwordView = (TextView) layout.findViewById(R.id.password); - final ListView listView = (ListView) layout.findViewById(R.id.settings_list); - listView.setAdapter(new SettingsAdapter(context, user, true)); + final RecyclerView recyclerView = (RecyclerView) layout.findViewById(R.id.settings_list); + LinearLayoutManager layoutManager = new LinearLayoutManager(context); + layoutManager.setOrientation(LinearLayoutManager.VERTICAL); + recyclerView.setLayoutManager(layoutManager); + recyclerView.setAdapter(new SettingsAdapter(context, user, null, true)); AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(R.string.menu_add_user) diff --git a/app/src/main/java/github/daneren2005/dsub/view/SettingView.java b/app/src/main/java/github/daneren2005/dsub/view/SettingView.java index 1c78706e..63b2c844 100644 --- a/app/src/main/java/github/daneren2005/dsub/view/SettingView.java +++ b/app/src/main/java/github/daneren2005/dsub/view/SettingView.java @@ -17,8 +17,9 @@ package github.daneren2005.dsub.view; import android.content.Context; import android.view.LayoutInflater; -import android.view.View; -import android.widget.CheckedTextView; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.TextView; import github.daneren2005.dsub.R; import github.daneren2005.dsub.domain.User; @@ -26,16 +27,28 @@ import github.daneren2005.dsub.domain.User; import static github.daneren2005.dsub.domain.User.Setting; public class SettingView extends UpdateView { - Setting setting; + private final TextView titleView; + private final CheckBox checkBox; - CheckedTextView view; + private Setting setting; + private boolean enabled = false; public SettingView(Context context) { super(context, false); this.context = context; - LayoutInflater.from(context).inflate(android.R.layout.simple_list_item_multiple_choice, this, true); + LayoutInflater.from(context).inflate(R.layout.basic_choice_item, this, true); - view = (CheckedTextView) findViewById(android.R.id.text1); + titleView = (TextView) findViewById(R.id.item_name); + checkBox = (CheckBox) findViewById(R.id.item_checkbox); + checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if(setting != null) { + setting.setValue(isChecked); + } + } + }); + checkBox.setClickable(false); } protected void setObjectImpl(Object obj, Object editable) { @@ -74,29 +87,29 @@ public class SettingView extends UpdateView { res = R.string.admin_role_lastfm; } else { // Last resort to display the raw value - view.setText(name); + titleView.setText(name); } if(res != -1) { - view.setText(res); + titleView.setText(res); } if(setting.getValue()) { - view.setChecked(setting.getValue()); + checkBox.setChecked(setting.getValue()); } else { - view.setChecked(false); + checkBox.setChecked(false); } - if((Boolean) editable) { - view.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - view.toggle(); - setting.setValue(view.isChecked()); - } - }); - } else { - view.setOnClickListener(null); - } + enabled = (Boolean) editable; + checkBox.setEnabled(enabled); + } + + @Override + public boolean isCheckable() { + return this.enabled; + } + + public void setChecked(boolean checked) { + checkBox.setChecked(checked); } } diff --git a/app/src/main/res/layout/basic_choice_item.xml b/app/src/main/res/layout/basic_choice_item.xml new file mode 100644 index 00000000..00a45be4 --- /dev/null +++ b/app/src/main/res/layout/basic_choice_item.xml @@ -0,0 +1,26 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/create_user.xml b/app/src/main/res/layout/create_user.xml index eac6e5cb..e2f6c4eb 100644 --- a/app/src/main/res/layout/create_user.xml +++ b/app/src/main/res/layout/create_user.xml @@ -67,11 +67,10 @@ android:layout_marginLeft="4dp" /> - - + android:scrollbars="vertical"/> \ No newline at end of file -- cgit v1.2.3