package com.llamacorp.equate.view;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.database.DataSetObserver;
import android.support.annotation.Nullable;
import android.text.Editable;
import android.text.InputType;
import android.text.TextWatcher;
import android.view.Gravity;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import com.llamacorp.equate.R;
import com.llamacorp.equate.unit.Unit;
import com.llamacorp.equate.unit.UnitType;
import com.llamacorp.equate.unit.UnitTypeList;
import com.llamacorp.equate.view.IdlingResource.SimpleIdlingResource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Map;
/**
* Helper class used to build a dialog list of units that is searchable
*/
public class UnitSearchDialogBuilder {
private AlertDialog mAlertDialog;
private final ArrayList<UnitSearchItem> mOriginalList;
private FilterAdapter mArrayAdapter;
/**
* Constructor for the unit search dialog builder
* @param unitTypeList is the collection of Unit Types and units to search
* over.
*/
public UnitSearchDialogBuilder(UnitTypeList unitTypeList){
ArrayList<UnitSearchItem> items = new ArrayList<>();
for (Map.Entry<String, UnitType> entry :
unitTypeList.getUnitTypeArray().entrySet()) {
String unitTypeKey = entry.getKey();
UnitType unitType = entry.getValue();
for (int i = 0; i < unitType.size(); i++) {
Unit unit = unitType.getUnitPosInUnitArray(i);
// some units are just dummies to help position other units
if (unit.toString().equals("") || unit.getLongName().equals("")){
continue;
}
items.add(new UnitSearchItem(unitTypeKey, unit.getLongName(),
unit.getAbbreviation(), i));
}
Collections.sort(items, new Comparator<UnitSearchItem>() {
@Override
public int compare(UnitSearchItem o1, UnitSearchItem o2) {
return o1.getUnitName().compareTo(o2.getUnitName());
}
});
}
mOriginalList = items;
}
/**
* Method to create the actual search dialog.
* @param context of the application used to create the dialog
* @param listener is called back when a item in the dialog list is clicked
*/
public void buildDialog(Context context,
@Nullable final SimpleIdlingResource idlingResource,
AdapterView.OnItemClickListener listener) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
final EditText filterEditText = new EditText(context);
final ListView listView = new ListView(context);
filterEditText.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_search_white, 0, 0, 0);
filterEditText.setInputType(InputType.TYPE_CLASS_TEXT);
LinearLayout layout = new LinearLayout(context);
layout.setOrientation(LinearLayout.VERTICAL);
layout.addView(filterEditText);
layout.addView(listView);
builder.setView(layout);
mArrayAdapter = new FilterAdapter(context, mOriginalList);
mArrayAdapter.registerDataSetObserver(new DataSetObserver() {
/**
* Call in UI thread once filter action has finished
*/
@Override
public void onChanged() {
super.onChanged();
// The IdlingResource is null in production.
if (idlingResource != null) {
idlingResource.setIdleState(true);
}
}
});
listView.setAdapter(mArrayAdapter);
listView.setOnItemClickListener(listener);
filterEditText.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
}
public void beforeTextChanged(CharSequence s,
int start, int count, int after) {
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
// The IdlingResource is null in production.
if (idlingResource != null) {
idlingResource.setIdleState(false);
}
// use Filter to filter results so filtering actions don't
// operate on the UI thread
mArrayAdapter.getFilter().filter(s.toString());
}
});
builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
mAlertDialog = builder.create();
// put dialog at top of screen so it doesn't move while filtering
Window window = mAlertDialog.getWindow();
if (window != null){
WindowManager.LayoutParams layoutParams = window.getAttributes();
layoutParams.gravity = Gravity.TOP;
window.setAttributes(layoutParams);
}
// show the keyboard by default
mAlertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
mAlertDialog.show();
}
public UnitSearchItem getItem(int position) {
return mArrayAdapter.getUnitSearchItem(position);
}
/**
* Clears the dialog if one exists.
*/
public void cancelDialog(){
if (mAlertDialog != null){
mAlertDialog.cancel();
}
}
}