Moving sort and filter code to the correct files

This commit is contained in:
Clayton Wilson 2020-10-26 00:59:18 -04:00
parent d8bf4e02f8
commit e7c1ab85ea
6 changed files with 191 additions and 123 deletions

View File

@ -8,24 +8,20 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.widget.AdapterView; import android.widget.AdapterView;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.Spinner; import android.widget.Spinner;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment; import androidx.fragment.app.DialogFragment;
import com.crystal.crystalrangeseekbar.interfaces.OnRangeSeekbarChangeListener; import com.crystal.crystalrangeseekbar.interfaces.OnRangeSeekbarChangeListener;
import com.crystal.crystalrangeseekbar.widgets.CrystalRangeSeekbar; import com.crystal.crystalrangeseekbar.widgets.CrystalRangeSeekbar;
import java.util.ArrayList; import java.util.ArrayList;
public class FilterDialogFragment extends DialogFragment { public class FilterDialogFragment extends DialogFragment {
public interface OnFilterListener { public interface OnFilterListener {
void sendSort(int storeSelection, int sortMode, boolean descending, double minPrice, double maxPrice); void sendFilter(int storeSelection, double minPrice, double maxPrice);
} }
public OnFilterListener onFilterListener; public OnFilterListener onFilterListener;
@ -33,18 +29,14 @@ public class FilterDialogFragment extends DialogFragment {
CrystalRangeSeekbar priceSeekbar; CrystalRangeSeekbar priceSeekbar;
private int storeSelection; private int storeSelection;
private int sortMode;
private boolean descending;
private ArrayList<String> stores; private ArrayList<String> stores;
private double maxProductPrice; // The highest price on the slider private double maxProductPrice; // The highest price on the slider
private double minPrice; // The selected min price private double minPrice; // The selected min price
private double maxPrice; // The selected max price private double maxPrice; // The selected max price
public FilterDialogFragment(int storeSelection, ArrayList<String> stores, int sortMode, boolean descending, double maxProductPrice, double minPrice, double maxPrice) { public FilterDialogFragment(int storeSelection, ArrayList<String> stores, double maxProductPrice, double minPrice, double maxPrice) {
this.storeSelection = storeSelection; this.storeSelection = storeSelection;
this.stores = stores; this.stores = stores;
this.sortMode = sortMode;
this.descending = descending;
this.maxProductPrice = maxProductPrice; this.maxProductPrice = maxProductPrice;
this.minPrice = minPrice; this.minPrice = minPrice;
this.maxPrice = maxPrice; this.maxPrice = maxPrice;
@ -65,7 +57,7 @@ public class FilterDialogFragment extends DialogFragment {
.setPositiveButton("OK", new DialogInterface.OnClickListener() { .setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialog, int id) { public void onClick(DialogInterface dialog, int id) {
onFilterListener.sendSort(storeSelection, sortMode, descending, priceSeekbar.getSelectedMinValue().doubleValue(), priceSeekbar.getSelectedMaxValue().doubleValue()); onFilterListener.sendFilter(storeSelection, priceSeekbar.getSelectedMinValue().doubleValue(), priceSeekbar.getSelectedMaxValue().doubleValue());
} }
}) })
.setNegativeButton("cancel", new DialogInterface.OnClickListener() { .setNegativeButton("cancel", new DialogInterface.OnClickListener() {
@ -97,57 +89,6 @@ public class FilterDialogFragment extends DialogFragment {
} }
}); });
// Change the sort arrow to be pointing up or down based on ascending or descending
final ImageButton sortDirectionButton = root.findViewById(R.id.sort_direction_button);
if (descending) {
sortDirectionButton.setImageResource(R.drawable.ic_baseline_arrow_downward_50);
} else {
sortDirectionButton.setImageResource(R.drawable.ic_baseline_arrow_upward_50);
}
// Change arrow pointing direction whenever the user clicks the button
sortDirectionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (descending) {
descending = false;
sortDirectionButton.setImageResource(R.drawable.ic_baseline_arrow_upward_50);
} else {
descending = true;
sortDirectionButton.setImageResource(R.drawable.ic_baseline_arrow_downward_50);
}
}
});
// Create the sort mode selection dropdown
Spinner sortDropdown = (Spinner) root.findViewById(R.id.sort_mode_dropdown);
String[] items = new String[] {"<Default>", "Name", "Price", "Store"};
ArrayAdapter<String> adapter = new ArrayAdapter<>(root.getContext(), android.R.layout.simple_spinner_dropdown_item, items);
sortDropdown.setAdapter(adapter);
sortDropdown.setSelection(this.sortMode);
sortDropdown.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
sortMode = position;
// Update the sort direction button
if (position == 0) {
sortDirectionButton.setEnabled(false);
} else {
sortDirectionButton.setEnabled(true);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {}
});
// Disable the direction button if they have the default sorting mode selected
// Ascending and Descending are mostly irrelevant in the default sort mode
if (sortDropdown.getSelectedItemPosition() == 0) {
sortDirectionButton.setEnabled(false);
}
// Set up the seekbar for price // Set up the seekbar for price
priceSeekbar = (CrystalRangeSeekbar) root.findViewById(R.id.price_range_seekbar); priceSeekbar = (CrystalRangeSeekbar) root.findViewById(R.id.price_range_seekbar);
final TextView tvMin = (TextView) root.findViewById(R.id.tv_min_price); final TextView tvMin = (TextView) root.findViewById(R.id.tv_min_price);

View File

@ -190,18 +190,6 @@ public class MainActivity extends AppCompatActivity implements CreateListDialogF
return NavigationUI.navigateUp(navController, mAppBarConfiguration) || super.onSupportNavigateUp(); return NavigationUI.navigateUp(navController, mAppBarConfiguration) || super.onSupportNavigateUp();
} }
// This function only exists for the create new list option in hamburger menu
public void onClickCreateList(MenuItem m) {
m.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
CreateListDialogFragment createListDialogFragment = new CreateListDialogFragment();
createListDialogFragment.show(getSupportFragmentManager(), "Create New List");
return false;
}
});
}
public void onClickSignout(MenuItem m) { public void onClickSignout(MenuItem m) {
m.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { m.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override @Override

View File

@ -25,7 +25,7 @@ import java.util.Properties;
import static com.example.listify.MainActivity.am; import static com.example.listify.MainActivity.am;
public class SearchResults extends AppCompatActivity implements FilterDialogFragment.OnFilterListener { public class SearchResults extends AppCompatActivity implements FilterDialogFragment.OnFilterListener, SortDialogFragment.OnSortListener {
private ListView listView; private ListView listView;
private SearchResultsListAdapter searchResultsListAdapter; private SearchResultsListAdapter searchResultsListAdapter;
private List<Product> resultsProductList = new ArrayList<>(); private List<Product> resultsProductList = new ArrayList<>();
@ -38,15 +38,20 @@ public class SearchResults extends AppCompatActivity implements FilterDialogFrag
private double maxPrice = -1; private double maxPrice = -1;
@Override @Override
public void sendSort(int storeSelection, int sortMode, boolean descending, double minPrice, double maxPrice) { public void sendFilter(int storeSelection, double minPrice, double maxPrice) {
this.storeSelection = storeSelection; this.storeSelection = storeSelection;
this.sortMode = sortMode;
this.descending = descending;
this.minPrice = minPrice; this.minPrice = minPrice;
this.maxPrice = maxPrice; this.maxPrice = maxPrice;
sortResults(); sortResults();
} }
@Override
public void sendSort(int sortMode, boolean descending) {
this.sortMode = sortMode;
this.descending = descending;
sortResults();
}
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -122,11 +127,13 @@ public class SearchResults extends AppCompatActivity implements FilterDialogFrag
@Override @Override
public boolean onMenuItemClick(MenuItem item) { public boolean onMenuItemClick(MenuItem item) {
// TODO: Create a sort dialog // TODO: Create a sort dialog
SortDialogFragment sortDialog = new SortDialogFragment(sortMode, descending);
sortDialog.show(getSupportFragmentManager(), "Sort Dialog");
return false; return false;
} }
}); });
// TODO: filter should be disabled until a search is made // TODO: price filter should be disabled until a search is made
MenuItem filterItem = menu.findItem(R.id.action_filter); MenuItem filterItem = menu.findItem(R.id.action_filter);
filterItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { filterItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override @Override
@ -162,8 +169,8 @@ public class SearchResults extends AppCompatActivity implements FilterDialogFrag
// Round up to nearest whole number for display on price seekbar // Round up to nearest whole number for display on price seekbar
maxProductPrice = Math.ceil(maxProductPrice); maxProductPrice = Math.ceil(maxProductPrice);
FilterDialogFragment sortDialog = new FilterDialogFragment(storeSelection, stores, sortMode, descending, maxProductPrice, minPrice, maxPrice); FilterDialogFragment sortDialog = new FilterDialogFragment(storeSelection, stores, maxProductPrice, minPrice, maxPrice);
sortDialog.show(getSupportFragmentManager(), "Sort"); sortDialog.show(getSupportFragmentManager(), "Filter Dialog");
return false; return false;
} }
}); });

View File

@ -0,0 +1,122 @@
package com.example.listify;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.Spinner;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;
public class SortDialogFragment extends DialogFragment {
public interface OnSortListener {
void sendSort(int sortMode, boolean descending);
}
public OnSortListener onSortListener;
private int sortMode;
private boolean descending;
public SortDialogFragment(int sortMode, boolean descending) {
this.sortMode = sortMode;
this.descending = descending;
}
@Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// Get the layout inflater
LayoutInflater inflater = requireActivity().getLayoutInflater();
// Inflate and set the layout for the dialog
// Pass null as the parent view because its going in the dialog layout
View root = inflater.inflate(R.layout.dialog_sort, null);
builder.setView(root)
// Add action buttons
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
onSortListener.sendSort(sortMode, descending);
}
})
.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
SortDialogFragment.this.getDialog().cancel();
}
});
// Change the sort arrow to be pointing up or down based on ascending or descending
final ImageButton sortDirectionButton = root.findViewById(R.id.sort_direction_button);
if (descending) {
sortDirectionButton.setImageResource(R.drawable.ic_baseline_arrow_downward_50);
} else {
sortDirectionButton.setImageResource(R.drawable.ic_baseline_arrow_upward_50);
}
// Change arrow pointing direction whenever the user clicks the button
sortDirectionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (descending) {
descending = false;
sortDirectionButton.setImageResource(R.drawable.ic_baseline_arrow_upward_50);
} else {
descending = true;
sortDirectionButton.setImageResource(R.drawable.ic_baseline_arrow_downward_50);
}
}
});
// Create the sort mode selection dropdown
Spinner sortDropdown = (Spinner) root.findViewById(R.id.sort_mode_dropdown);
String[] items = new String[] {"<Default>", "Name", "Price", "Store"};
ArrayAdapter<String> adapter = new ArrayAdapter<>(root.getContext(), android.R.layout.simple_spinner_dropdown_item, items);
sortDropdown.setAdapter(adapter);
sortDropdown.setSelection(this.sortMode);
sortDropdown.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
sortMode = position;
// Update the sort direction button
if (position == 0) {
sortDirectionButton.setEnabled(false);
} else {
sortDirectionButton.setEnabled(true);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {}
});
// Disable the direction button if they have the default sorting mode selected
// Ascending and Descending are mostly irrelevant in the default sort mode
if (sortDropdown.getSelectedItemPosition() == 0) {
sortDirectionButton.setEnabled(false);
}
return builder.create();
}
// Required to extend DialogFragment
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
try {
onSortListener = (OnSortListener) getActivity();
} catch (ClassCastException e) {
Log.e("FilterDialogFragment", "onAttach: ClassCastException: " + e.getMessage());
}
}
}

View File

@ -20,37 +20,6 @@
android:background="@android:drawable/spinner_dropdown_background" android:background="@android:drawable/spinner_dropdown_background"
android:spinnerMode="dropdown"/> android:spinnerMode="dropdown"/>
<TextView
android:id="@+id/tv_sort_by"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginTop="20dp"
android:layout_marginStart="15dp"
android:text="Sort by" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="15dp">
<Spinner
android:id="@+id/sort_mode_dropdown"
android:layout_width="265dp"
android:layout_height="wrap_content"
android:background="@android:drawable/spinner_dropdown_background"
android:spinnerMode="dropdown"/>
<ImageButton
android:id="@+id/sort_direction_button"
android:layout_marginTop="-6dp"
android:layout_width="57dp"
android:layout_height="70dp"
android:background="@null"
android:src="@drawable/ic_baseline_arrow_upward_50"/>
</LinearLayout>
<TextView <TextView
android:id="@+id/tv_price_label" android:id="@+id/tv_price_label"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View File

@ -0,0 +1,41 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_sort_by"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginTop="20dp"
android:layout_marginStart="15dp"
android:text="Sort by" />
<LinearLayout
android:layout_width="265dp"
android:layout_height="wrap_content"
android:paddingStart="15dp">
<Spinner
android:id="@+id/sort_mode_dropdown"
android:layout_width="265dp"
android:layout_height="wrap_content"
android:background="@android:drawable/spinner_dropdown_background"
android:spinnerMode="dropdown"/>
<ImageButton
android:id="@+id/sort_direction_button"
android:layout_marginTop="-6dp"
android:layout_width="57dp"
android:layout_height="70dp"
android:background="@null"
android:src="@drawable/ic_baseline_arrow_upward_50"/>
</LinearLayout>
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>