/* * This source is part of the * _____ ___ ____ * __ / / _ \/ _ | / __/___ _______ _ * / // / , _/ __ |/ _/_/ _ \/ __/ _ `/ * \___/_/|_/_/ |_/_/ (_)___/_/ \_, / * /___/ * repository. * * Copyright (C) 2016 Carmen Alvarez (c@rmen.ca) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ca.rmen.android.networkmonitor.app.prefs; import android.databinding.DataBindingUtil; import android.support.v4.app.FragmentActivity; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import ca.rmen.android.networkmonitor.R; import ca.rmen.android.networkmonitor.app.dialog.DialogFragmentFactory; import ca.rmen.android.networkmonitor.databinding.FieldItemBinding; import ca.rmen.android.networkmonitor.provider.NetMonColumns; class SelectedFieldsAdapter extends RecyclerView.Adapter<SelectedFieldsAdapter.SelectedFieldHolder> { private static class SelectedField { final String dbName; final String label; final String tip; // Build the list of choices for the user. Look up the friendly label of each column name, and pre-select the one the user chose last time. SelectedField(String dbName, String label, String tip) { this.dbName = dbName; this.label = label; this.tip = tip; } @Override public String toString() { return label; } } private final FragmentActivity mActivity; private final SelectedField[] mSelectedFields; private final Set<String> mCheckedItems = new HashSet<>(); SelectedFieldsAdapter(FragmentActivity activity) { mActivity = activity; String[] dbColumns = NetMonColumns.getColumnNames(activity); String[] columnLabels = NetMonColumns.getColumnLabels(activity); mSelectedFields = new SelectedField[dbColumns.length]; for (int i = 0; i < dbColumns.length; i++) { int tipId = activity.getResources().getIdentifier(dbColumns[i] + "_help", "string", activity.getPackageName()); String tip = tipId > 0 ? activity.getString(tipId) : null; mSelectedFields[i] = new SelectedField(dbColumns[i], columnLabels[i], tip); } // Preselect the columns from the preferences List<String> selectedColumns = NetMonPreferences.getInstance(activity).getSelectedColumns(); mCheckedItems.addAll(selectedColumns); } void selectAll() { for (SelectedField field : mSelectedFields) mCheckedItems.add(field.dbName); notifyDataSetChanged(); } void selectNone() { mCheckedItems.clear(); notifyDataSetChanged(); } void selectColumns(String[] dbColumns) { mCheckedItems.clear(); Collections.addAll(mCheckedItems, dbColumns); notifyDataSetChanged(); } List<String> getSelectedColumns() { List<String> result = new ArrayList<>(); for (SelectedField field : mSelectedFields) { if (mCheckedItems.contains(field.dbName)) { result.add(field.dbName); } } return result; } @Override public void onBindViewHolder(SelectedFieldHolder holder, int position) { final SelectedField selectedField = mSelectedFields[position]; holder.binding.fieldName.setText(selectedField.label); holder.binding.fieldHelp.setVisibility(TextUtils.isEmpty(selectedField.tip) ? View.GONE : View.VISIBLE); holder.binding.checkbox.setOnCheckedChangeListener(null); holder.binding.checkbox.setChecked(mCheckedItems.contains(selectedField.dbName)); holder.binding.checkbox.setOnCheckedChangeListener((compoundButton, checked) -> { if (checked) mCheckedItems.add(selectedField.dbName); else mCheckedItems.remove(selectedField.dbName); notifyDataSetChanged(); }); holder.binding.fieldHelp.setOnClickListener(view -> DialogFragmentFactory.showInfoDialog(mActivity, selectedField.label, selectedField.tip)); } @Override public SelectedFieldHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new SelectedFieldHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.field_item, parent, false)); } @Override public int getItemCount() { return mSelectedFields.length; } static class SelectedFieldHolder extends RecyclerView.ViewHolder { final FieldItemBinding binding; SelectedFieldHolder(FieldItemBinding binding) { super(binding.getRoot()); this.binding = binding; binding.getRoot().setOnClickListener(v -> binding.checkbox.performClick()); } } }