Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sort menu redesign - Bottom Sheet Dialog #1242

Merged
merged 22 commits into from
Aug 9, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
7d97d15
Adds icons
shobhitagarwal1612 Jul 9, 2017
67a96a9
Adds bottom sheet dialog
shobhitagarwal1612 Jul 9, 2017
a2ceb90
Makes selected item title bold
shobhitagarwal1612 Jul 10, 2017
17773e5
Adds bottom sheet dialog to Delete Saved Forms
shobhitagarwal1612 Jul 10, 2017
d7a66cd
Removes drawerLayout from xmls
shobhitagarwal1612 Jul 10, 2017
f1c836a
Removes unused resources
shobhitagarwal1612 Jul 10, 2017
3bcb263
Adds new icons, iproves UI
shobhitagarwal1612 Jul 11, 2017
01550bd
Removes unused imports
shobhitagarwal1612 Jul 11, 2017
b807c08
converts the method to return hashmap in ApplicationConstants
shobhitagarwal1612 Jul 12, 2017
8c70808
Retains the state of the bottom sheet on rotation
shobhitagarwal1612 Jul 12, 2017
b3be9b0
Adjusts the peek height
shobhitagarwal1612 Jul 12, 2017
84ecc5b
Adjusts the peek height to display all the items in landscape mode
shobhitagarwal1612 Jul 14, 2017
ff66b72
Fixes dialog showing on screen lock/unlocking
shobhitagarwal1612 Jul 20, 2017
51d3c1f
Fixes WindowLeaked error while changing orientation
shobhitagarwal1612 Jul 25, 2017
c7c4da0
Fixes the blue icon for previous selected item
shobhitagarwal1612 Jul 25, 2017
0fc4e57
uses tintColor in dialog adapter
shobhitagarwal1612 Jul 26, 2017
5165133
Removes unused color
shobhitagarwal1612 Jul 26, 2017
8ab3360
Fixes wrong tint color in pre-lollipop devices
shobhitagarwal1612 Jul 31, 2017
e05dee4
Merge branch 'master' into issue-1039-sortdialog
shobhitagarwal1612 Aug 8, 2017
1f861d5
Merge branch 'master' into issue-1039-sortdialog
shobhitagarwal1612 Aug 9, 2017
a5b6e58
Merge remote-tracking branch 'origin/issue-1039-sortdialog' into issu…
shobhitagarwal1612 Aug 9, 2017
b44521f
Removes unused resources
shobhitagarwal1612 Aug 9, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,27 +16,22 @@

package org.odk.collect.android.activities;

import android.content.res.Configuration;
import android.database.Cursor;
import android.graphics.Color;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.design.widget.BottomSheetDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
Expand All @@ -45,8 +40,10 @@
import android.widget.TextView;

import org.odk.collect.android.R;
import org.odk.collect.android.adapters.SortDialogAdapter;
import org.odk.collect.android.application.Collect;
import org.odk.collect.android.database.ActivityLogger;
import org.odk.collect.android.listeners.RecyclerViewClickListener;
import org.odk.collect.android.provider.InstanceProviderAPI;

import java.util.ArrayList;
Expand All @@ -56,26 +53,60 @@
import static org.odk.collect.android.utilities.ApplicationConstants.SortingOrder.BY_NAME_ASC;

abstract class AppListActivity extends AppCompatActivity {
protected final ActivityLogger logger = Collect.getInstance().getActivityLogger();

private static final String SELECTED_INSTANCES = "selectedInstances";
private static final String IS_SEARCH_BOX_SHOWN = "isSearchBoxShown";

private ListView drawerList;
private DrawerLayout drawerLayout;
private ActionBarDrawerToggle drawerToggle;
private LinearLayout searchBoxLayout;
private EditText inputSearch;

private static final String IS_BOTTOM_DIALOG_SHOWN = "isBottomDialogShown";
private BottomSheetDialog bottomSheetDialog;
protected final ActivityLogger logger = Collect.getInstance().getActivityLogger();
protected SimpleCursorAdapter listAdapter;
protected LinkedHashSet<Long> selectedInstances = new LinkedHashSet<>();
protected String[] sortingOptions;

private boolean isSearchBoxShown;

protected Integer selectedSortingOrder;
protected Toolbar toolbar;
protected ListView listView;
private LinearLayout searchBoxLayout;
private EditText inputSearch;
private boolean isSearchBoxShown;
private boolean isBottomDialogShown;

// toggles to all checked or all unchecked
// returns:
// true if result is all checked
// false if result is all unchecked
//
// Toggle behavior is as follows:
// if ANY items are unchecked, check them all
// if ALL items are checked, uncheck them all
public static boolean toggleChecked(ListView lv) {
// shortcut null case
if (lv == null) {
return false;
}

boolean newCheckState = lv.getCount() > lv.getCheckedItemCount();
setAllToCheckedState(lv, newCheckState);
return newCheckState;
}

public static void setAllToCheckedState(ListView lv, boolean check) {
// no-op if ListView null
if (lv == null) {
return;
}

for (int x = 0; x < lv.getCount(); x++) {
lv.setItemChecked(x, check);
}
}

// Function to toggle button label
public static void toggleButtonLabel(Button toggleButton, ListView lv) {
if (lv.getCheckedItemCount() != lv.getCount()) {
toggleButton.setText(R.string.select_all);
} else {
toggleButton.setText(R.string.clear_all);
}
}

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
Expand All @@ -101,22 +132,27 @@ protected void onResume() {
searchBoxLayout = (LinearLayout) findViewById(R.id.searchBoxLayout);
restoreSelectedSortingOrder();
setupSearchBox();
setupDrawer();
setupDrawerItems();
setupBottomSheet();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable(SELECTED_INSTANCES, selectedInstances);
outState.putBoolean(IS_SEARCH_BOX_SHOWN, searchBoxLayout.getVisibility() == View.VISIBLE);
outState.putBoolean(IS_BOTTOM_DIALOG_SHOWN, bottomSheetDialog.isShowing());

if (bottomSheetDialog.isShowing()) {
bottomSheetDialog.dismiss();
}
}

@Override
protected void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
selectedInstances = (LinkedHashSet<Long>) state.getSerializable(SELECTED_INSTANCES);
isSearchBoxShown = state.getBoolean(IS_SEARCH_BOX_SHOWN);
isBottomDialogShown = state.getBoolean(IS_BOTTOM_DIALOG_SHOWN);
}

@Override
Expand All @@ -132,12 +168,9 @@ public boolean onCreateOptionsMenu(Menu menu) {
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_sort:
if (drawerLayout.isDrawerOpen(Gravity.END)) {
drawerLayout.closeDrawer(Gravity.END);
} else {
Collect.getInstance().hideKeyboard(inputSearch);
drawerLayout.openDrawer(Gravity.END);
}
Collect.getInstance().hideKeyboard(inputSearch);
bottomSheetDialog.show();
isBottomDialogShown = true;
return true;

case R.id.menu_filter:
Expand All @@ -152,22 +185,6 @@ public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
if (drawerToggle != null) {
drawerToggle.syncState();
}
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (drawerToggle != null) {
drawerToggle.onConfigurationChanged(newConfig);
}
}

private void setupSearchBox() {
inputSearch = (EditText) findViewById(R.id.inputSearch);
inputSearch.addTextChangedListener(new TextWatcher() {
Expand Down Expand Up @@ -202,58 +219,11 @@ private void showSearchBox() {
Collect.getInstance().showKeyboard(inputSearch);
}

private void setupDrawerItems() {
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, sortingOptions) {
@NonNull
@Override
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
TextView textView = (TextView) super.getView(position, convertView, parent);
if (position == getSelectedSortingOrder()) {
textView.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.tintColor));
}
textView.setPadding(50, 0, 0, 0);
return textView;
}
};
drawerList.setAdapter(adapter);
drawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
parent.getChildAt(selectedSortingOrder).setBackgroundColor(Color.TRANSPARENT);
view.setBackgroundColor(ContextCompat.getColor(getBaseContext(), R.color.tintColor));
performSelectedSearch(position);
drawerLayout.closeDrawer(Gravity.END);
}
});
}

private void performSelectedSearch(int position) {
saveSelectedSortingOrder(position);
updateAdapter();
}

private void setupDrawer() {
drawerList = (ListView) findViewById(R.id.sortingMenu);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.sorting_menu_open, R.string.sorting_menu_close) {
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
supportInvalidateOptionsMenu();
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
}

public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
supportInvalidateOptionsMenu();
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}
};

drawerToggle.setDrawerIndicatorEnabled(true);
drawerLayout.addDrawerListener(drawerToggle);
}

protected void checkPreviouslyCheckedItems() {
listView.clearChoices();
List<Integer> selectedPositions = new ArrayList<>();
Expand Down Expand Up @@ -286,54 +256,6 @@ protected int getCheckedCount() {
return listView.getCheckedItemCount();
}

// toggles to all checked or all unchecked
// returns:
// true if result is all checked
// false if result is all unchecked
//
// Toggle behavior is as follows:
// if ANY items are unchecked, check them all
// if ALL items are checked, uncheck them all
public static boolean toggleChecked(ListView lv) {
// shortcut null case
if (lv == null) {
return false;
}

boolean newCheckState = lv.getCount() > lv.getCheckedItemCount();
setAllToCheckedState(lv, newCheckState);
return newCheckState;
}

public static void setAllToCheckedState(ListView lv, boolean check) {
// no-op if ListView null
if (lv == null) {
return;
}

for (int x = 0; x < lv.getCount(); x++) {
lv.setItemChecked(x, check);
}
}

// Function to toggle button label
public static void toggleButtonLabel(Button toggleButton, ListView lv) {
if (lv.getCheckedItemCount() != lv.getCount()) {
toggleButton.setText(R.string.select_all);
} else {
toggleButton.setText(R.string.clear_all);
}
}

@Override
public void onBackPressed() {
if (drawerLayout.isDrawerOpen(Gravity.END)) {
drawerLayout.closeDrawer(Gravity.END);
} else {
super.onBackPressed();
}
}

private void saveSelectedSortingOrder(int selectedStringOrder) {
selectedSortingOrder = selectedStringOrder;
PreferenceManager.getDefaultSharedPreferences(Collect.getInstance())
Expand All @@ -358,4 +280,30 @@ protected int getSelectedSortingOrder() {
protected CharSequence getFilterText() {
return inputSearch != null ? inputSearch.getText() : "";
}

private void setupBottomSheet() {
bottomSheetDialog = new BottomSheetDialog(this, R.style.MaterialDialogSheet);
View sheetView = getLayoutInflater().inflate(R.layout.bottom_sheet, null);
final RecyclerView recyclerView = (RecyclerView) sheetView.findViewById(R.id.recyclerView);

final SortDialogAdapter adapter = new SortDialogAdapter(this, recyclerView, sortingOptions, getSelectedSortingOrder(), new RecyclerViewClickListener() {
@Override
public void onItemClicked(SortDialogAdapter.ViewHolder holder, int position) {
holder.updateItemColor(selectedSortingOrder);
performSelectedSearch(position);
bottomSheetDialog.dismiss();
isBottomDialogShown = false;
}
});
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(adapter);
recyclerView.setItemAnimator(new DefaultItemAnimator());

bottomSheetDialog.setContentView(sheetView);

if (isBottomDialogShown) {
bottomSheetDialog.show();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -87,14 +87,4 @@ protected void onStop() {
Collect.getInstance().getActivityLogger().logOnStop(this);
super.onStop();
}

@Override
public void onBackPressed() {
if (dataManagerList.getDrawerStatus()) {
dataManagerList.setUserVisibleHint(false);
} else {
super.onBackPressed();
}
}

}
Loading