Skip to content

Commit

Permalink
Add "More Translations" to spinner (#802)
Browse files Browse the repository at this point in the history
  • Loading branch information
uzairmad authored and ahmedre committed Mar 19, 2017
1 parent ba6cc38 commit 8e4f606
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.LayoutInflater;
import android.widget.Toast;

import com.quran.labs.androidquran.HelpActivity;
Expand Down Expand Up @@ -1114,15 +1115,21 @@ private void updateActionBarSpinner() {
@NonNull
@Override
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
convertView = super.getView(position, convertView, parent);
SpinnerHolder holder = (SpinnerHolder) convertView.getTag();
int page = getCurrentPage();

String sura = QuranInfo.getSuraNameFromPage(PagerActivity.this, page, true);
holder.title.setText(sura);
String desc = QuranInfo.getPageSubtitle(PagerActivity.this, page);
holder.subtitle.setText(desc);
holder.subtitle.setVisibility(View.VISIBLE);
int type = super.getItemViewType(position);
if (type == 1) {
LayoutInflater inflater = getLayoutInflater();
convertView = inflater.inflate(R.layout.translation_ab_spinner_selected, parent, false);
} else {
convertView = super.getView(position, convertView, parent);
SpinnerHolder holder = (SpinnerHolder) convertView.getTag();
int page = getCurrentPage();

String sura = QuranInfo.getSuraNameFromPage(PagerActivity.this, page, true);
holder.title.setText(sura);
String desc = QuranInfo.getPageSubtitle(PagerActivity.this, page);
holder.subtitle.setText(desc);
holder.subtitle.setVisibility(View.VISIBLE);
}
return convertView;
}
};
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.quran.labs.androidquran.ui.util;

import android.content.Context;
import android.content.res.Resources;
import android.support.annotation.NonNull;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
Expand All @@ -11,13 +13,15 @@

import com.quran.labs.androidquran.R;
import com.quran.labs.androidquran.common.LocalTranslation;
import com.quran.labs.androidquran.ui.PagerActivity;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

public class TranslationsSpinnerAdapter extends ArrayAdapter<String> {

private Context context;
private final LayoutInflater layoutInflater;

private String[] translationNames;
Expand All @@ -35,7 +39,9 @@ public TranslationsSpinnerAdapter(Context context,
// this is because clear() relies on being able to clear the List passed into the constructor,
// and the String[] constructor makes a new (immutable) List with the items of the array.
super(context, resource, new ArrayList<>());
this.layoutInflater = LayoutInflater.from(context);
this.context = context;
this.layoutInflater = LayoutInflater.from(this.context);
translationNames = updateTranslationNames(translationNames);
this.translationNames = translationNames;
this.translations = translations;
this.selectedItems = selectedItems;
Expand All @@ -45,7 +51,7 @@ public TranslationsSpinnerAdapter(Context context,

private View.OnClickListener onCheckedChangeListener = buttonView -> {
CheckBoxHolder holder = (CheckBoxHolder) ((View) buttonView.getParent()).getTag();
LocalTranslation localTranslation = translations.get(holder.checkBoxPosition);
LocalTranslation localTranslation = translations.get(holder.position);

boolean updated = true;
if (selectedItems.contains(localTranslation.filename)) {
Expand All @@ -65,6 +71,18 @@ public TranslationsSpinnerAdapter(Context context,

};

private View.OnClickListener onTextClickedListener = textView -> {
CheckBoxHolder holder = (CheckBoxHolder) ((View) textView.getParent()).getTag();
if (holder.position == translationNames.length - 1) {
if (this.context instanceof PagerActivity) {
final PagerActivity pagerActivity = (PagerActivity) this.context;
pagerActivity.startTranslationManager();
}
} else {
holder.checkBox.performClick();
}
};

@NonNull
@Override
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
Expand All @@ -85,39 +103,61 @@ public View getView(int position, View convertView, @NonNull ViewGroup parent) {
}

@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) {
CheckBoxHolder holder;
if (convertView == null) {
convertView = layoutInflater.inflate(
R.layout.translation_ab_spinner_item, parent, false);
convertView.setTag(new CheckBoxHolder(convertView));
}
holder = (CheckBoxHolder) convertView.getTag();
holder.position = position;
holder.textView.setOnClickListener(onTextClickedListener);
if (position == translationNames.length - 1) {
holder.checkBox.setVisibility(View.GONE);
holder.checkBox.setOnClickListener(null);
Resources r = convertView.getResources();
float leftPadding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, r.getDisplayMetrics());
holder.textView.setPadding(Math.round(leftPadding), 0, 0, 0);
holder.textView.setText(R.string.more_translations);
} else {
holder.checkBox.setVisibility(View.VISIBLE);
holder.checkBox.setChecked(selectedItems.contains(translations.get(position).filename));
holder.checkBox.setOnClickListener(onCheckedChangeListener);
holder.textView.setText(translationNames[position]);
}

holder.checkBoxPosition = position;
holder.checkBox.setText(translationNames[position]);
holder.checkBox.setChecked(selectedItems.contains(translations.get(position).filename));
holder.checkBox.setOnClickListener(onCheckedChangeListener);
return convertView;
}

public int getItemViewType(int position) {
if (position == translationNames.length - 1) {
return 1; // Last item in spinner should be text "More Translations"
} else {
return 0;
}
}

public void updateItems(String[] translationNames,
List<LocalTranslation> translations,
Set<String> selectedItems) {
clear();
translationNames = updateTranslationNames(translationNames);
this.translationNames = translationNames;
this.translations = translations;
this.selectedItems = selectedItems;
addAll(translationNames);
notifyDataSetChanged();
}

static class CheckBoxHolder {
private static class CheckBoxHolder {
final CheckBox checkBox;
int checkBoxPosition;
final TextView textView;
int position;

CheckBoxHolder(View view) {
this.checkBox = (CheckBox) view.findViewById(R.id.checkbox);
this.textView = (TextView) view.findViewById(R.id.text);
}
}

Expand All @@ -129,4 +169,15 @@ protected static class SpinnerHolder {
public interface OnSelectionChangedListener {
void onSelectionChanged(Set<String> selectedItems);
}

private String[] updateTranslationNames(String[] translationNames) {
List<String> translationsList = new ArrayList<>();
for (String translation : translationNames) {
translationsList.add(translation);
}
translationsList.add(getContext().getString(R.string.more_translations));
translationNames = translationsList.toArray(new String[translationsList.size()]);

return translationNames;
}
}
27 changes: 20 additions & 7 deletions app/src/main/res/layout/translation_ab_spinner_item.xml
Original file line number Diff line number Diff line change
@@ -1,15 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="@dimen/spinner_dropdown_item_height"
>
android:layout_height="@dimen/spinner_dropdown_item_height">

<CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@null" />

<TextView
android:id="@+id/text"
style="?android:attr/spinnerDropDownItemStyle"
android:maxLines="1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignBaseline="@+id/checkbox"
android:layout_alignBottom="@+id/checkbox"
android:layout_toEndOf="@+id/checkbox"
android:layout_toRightOf="@+id/checkbox"
android:background="?attr/selectableItemBackground"
android:ellipsize="marquee"
/>
</FrameLayout>
android:marqueeRepeatLimit="marquee_forever"
android:maxLines="1"
android:paddingEnd="2dp"
android:paddingLeft="2dp"
android:paddingStart="2dp" />
</RelativeLayout>
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,7 @@
<string name="prefs_export_summary">Export a copy of bookmarks and tags</string>

<string name="translations">@string/prefs_translations</string>
<string name="more_translations">More Translations</string>
<string name="import_data_permissions_error">Unable to read backup file due to permissions error.</string>
<string name="import_data_error">Invalid backup file (or unable to read backup file).</string>
<string name="import_data">Import Data</string>
Expand Down

0 comments on commit 8e4f606

Please sign in to comment.