Created custom LanguageSelectDialog class

Created custom LanguageSelectDialog class. This can be reused in multiple places. The library screen has been modified to use this class. Settings screen still requires modification.
This commit is contained in:
Automata-Development 2017-12-06 20:31:15 -07:00 committed by Isaac Hutt
parent b9c78f7ca7
commit e0ec00b3d1
2 changed files with 143 additions and 73 deletions

View File

@ -0,0 +1,134 @@
package org.kiwix.kiwixmobile.views;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import org.kiwix.kiwixmobile.R;
import org.kiwix.kiwixmobile.library.LibraryAdapter;
import java.util.List;
import java.util.Map;
/**
* Created by judebrauer on 12/6/17
*/
public class LanguageSelectDialog extends AlertDialog {
protected LanguageSelectDialog(@NonNull Context context) {
super(context);
}
public LanguageSelectDialog(@NonNull Context context, int themeResId) {
super(context, themeResId);
}
public static class Builder extends AlertDialog.Builder {
private List<LibraryAdapter.Language> languages;
private Map<String, Integer> languageCounts;
public Builder(@NonNull Context context) {
super(context);
}
public Builder(@NonNull Context context, int themeResId) {
super(context, themeResId);
}
public Builder setLanguages(List<LibraryAdapter.Language> languages) {
this.languages = languages;
return this;
}
public Builder setLanguageCounts(Map<String, Integer> languageCounts) {
this.languageCounts = languageCounts;
return this;
}
@Override
public AlertDialog create() {
LinearLayout view = (LinearLayout) View.inflate(getContext(), R.layout.language_selection, null);
ListView listView = view.findViewById(R.id.language_check_view);
int size = 0;
try {
size = languages.size();
} catch (NullPointerException e) {}
if (size == 0) {
Toast.makeText(getContext(), getContext().getResources().getString(R.string.wait_for_load), Toast.LENGTH_LONG).show();
}
LanguageArrayAdapter languageArrayAdapter = new LanguageArrayAdapter(getContext(), 0, languages, languageCounts);
listView.setAdapter(languageArrayAdapter);
setView(view);
return super.create();
}
}
private static class LanguageArrayAdapter extends ArrayAdapter<LibraryAdapter.Language> {
private Map<String, Integer> languageCounts;
private Context context;
public LanguageArrayAdapter(Context context, int textViewResourceId, List<LibraryAdapter.Language> languages, Map<String, Integer> languageCounts) {
super(context, textViewResourceId, languages);
this.languageCounts = languageCounts;
this.context = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LanguageArrayAdapter.ViewHolder holder;
if (convertView == null) {
convertView = View.inflate(getContext(), R.layout.language_check_item, null);
holder = new LanguageArrayAdapter.ViewHolder();
holder.row = convertView.findViewById(R.id.language_row);
holder.checkBox = convertView.findViewById(R.id.language_checkbox);
holder.language = convertView.findViewById(R.id.language_name);
holder.languageLocalized = convertView.findViewById(R.id.language_name_localized);
holder.languageEntriesCount = convertView.findViewById(R.id.language_entries_count);
convertView.setTag(holder);
} else {
holder = (LanguageArrayAdapter.ViewHolder) convertView.getTag();
}
// Set event listeners first, since updating the default values can trigger them.
holder.row.setOnClickListener((view) -> holder.checkBox.toggle());
holder.checkBox.setOnCheckedChangeListener((compoundButton, b) -> getItem(position).active = b);
LibraryAdapter.Language language = getItem(position);
holder.language.setText(language.language);
holder.languageLocalized.setText(language.languageLocalized);
if (languageCounts != null) {
holder.languageEntriesCount.setText(
context.getString(R.string.language_count,
languageCounts.get(language.languageCode)));
} else {
holder.languageEntriesCount.setVisibility(View.GONE);
}
holder.checkBox.setChecked(language.active);
return convertView;
}
// We are using the ViewHolder pattern in order to optimize the ListView by reusing
// Views and saving them to this mLibrary class, and not inflating the layout every time
// we need to create a row.
private class ViewHolder {
ViewGroup row;
CheckBox checkBox;
TextView language;
TextView languageLocalized;
TextView languageEntriesCount;
}
}
}

View File

@ -36,6 +36,7 @@ import org.kiwix.kiwixmobile.downloader.DownloadService;
import org.kiwix.kiwixmobile.library.LibraryAdapter;
import org.kiwix.kiwixmobile.library.LibraryAdapter.Language;
import org.kiwix.kiwixmobile.settings.KiwixSettingsActivity;
import org.kiwix.kiwixmobile.views.LanguageSelectDialog;
import org.kiwix.kiwixmobile.zim_manager.fileselect_view.ZimFileSelectFragment;
import org.kiwix.kiwixmobile.zim_manager.library_view.LibraryFragment;
@ -236,29 +237,16 @@ public class ZimManageActivity extends AppCompatActivity {
}
private void showLanguageSelect() {
LinearLayout view = (LinearLayout) getLayoutInflater().inflate(R.layout.language_selection, null);
ListView listView = (ListView) view.findViewById(R.id.language_check_view);
int size = 0;
try {
size = mSectionsPagerAdapter.libraryFragment.libraryAdapter.languages.size();
} catch (NullPointerException e) { }
if (size == 0) {
Toast.makeText(this, getResources().getString(R.string.wait_for_load), Toast.LENGTH_LONG).show();
return;
}
LanguageArrayAdapter languageArrayAdapter =
new LanguageArrayAdapter(this, 0, mSectionsPagerAdapter.libraryFragment.libraryAdapter);
listView.setAdapter(languageArrayAdapter);
new AlertDialog.Builder(this, dialogStyle())
.setView(view)
.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> {
mSectionsPagerAdapter.libraryFragment.libraryAdapter.updateNetworkLanguages();
mSectionsPagerAdapter.libraryFragment.libraryAdapter.getFilter().filter(searchQuery);
})
.show();
new LanguageSelectDialog.Builder(this, dialogStyle())
.setLanguages(mSectionsPagerAdapter.libraryFragment.libraryAdapter.languages)
.setLanguageCounts(mSectionsPagerAdapter.libraryFragment.libraryAdapter.languageCounts)
.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> {
mSectionsPagerAdapter.libraryFragment.libraryAdapter.updateNetworkLanguages();
mSectionsPagerAdapter.libraryFragment.libraryAdapter.getFilter().filter(searchQuery);
})
.show();
}
/**
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.
@ -312,56 +300,4 @@ public class ZimManageActivity extends AppCompatActivity {
return null;
}
}
private class LanguageArrayAdapter extends ArrayAdapter<LibraryAdapter.Language> {
public LanguageArrayAdapter(Context context, int textViewResourceId, LibraryAdapter library_adapter) {
super(context, textViewResourceId, library_adapter.languages);
this.library_adapter = library_adapter;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = View.inflate(getContext(), R.layout.language_check_item, null);
holder = new ViewHolder();
holder.row = (ViewGroup) convertView.findViewById(R.id.language_row);
holder.checkBox = (CheckBox) convertView.findViewById(R.id.language_checkbox);
holder.language = (TextView) convertView.findViewById(R.id.language_name);
holder.languageLocalized = (TextView) convertView.findViewById(R.id.language_name_localized);
holder.languageEntriesCount = (TextView) convertView.findViewById(R.id.language_entries_count);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// Set event listeners first, since updating the default values can trigger them.
holder.row.setOnClickListener((view) -> holder.checkBox.toggle());
holder.checkBox.setOnCheckedChangeListener((compoundButton, b) -> getItem(position).active = b);
Language language = getItem(position);
holder.language.setText(language.language);
holder.languageLocalized.setText(language.languageLocalized);
holder.languageEntriesCount.setText(
getString(R.string.language_count, library_adapter.languageCounts.get(language.languageCode)));
holder.checkBox.setChecked(language.active);
return convertView;
}
private LibraryAdapter library_adapter;
// We are using the ViewHolder pattern in order to optimize the ListView by reusing
// Views and saving them to this mLibrary class, and not inflating the layout every time
// we need to create a row.
private class ViewHolder {
ViewGroup row;
CheckBox checkBox;
TextView language;
TextView languageLocalized;
TextView languageEntriesCount;
}
}
}