package com.mikifus.padland; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.v4.app.FragmentManager; import android.util.Log; import android.util.SparseBooleanArray; import android.view.ActionMode; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; import com.mikifus.padland.Adapters.ServerListAdapter; import com.mikifus.padland.Dialog.FormDialog; import com.mikifus.padland.Dialog.NewServerDialog; import com.mikifus.padland.Models.ServerModel; import java.util.ArrayList; /** * Created by mikifus on 29/05/16. */ public class ServerListActivity extends PadLandDataActivity implements ActionMode.Callback, FormDialog.FormDialogCallBack { /** * Multiple choice for all the groups */ private int choiceMode = ListView.CHOICE_MODE_MULTIPLE; /** * mActionMode defines behaviour of the action-bar */ protected ActionMode mActionMode; ArrayAdapter mAdapter; ListView listView; private static final String NEW_SERVER_DIALOG = "dialog_new_server"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_server_list); mAdapter = new ServerListAdapter(ServerListActivity.this, R.layout.serverlist_item); listView = (ListView) findViewById(R.id.listView); if (listView != null) { listView.setChoiceMode(choiceMode); listView.setEmptyView(findViewById(android.R.id.empty)); listView.setAdapter(mAdapter); this._setListViewEvents(); } } /** * This function adds events listeners for a ListView object to provide usage of the ActionBar */ private void _setListViewEvents() { // They look similar but they are different. listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { startActionMode(); boolean checked = listView.isItemChecked(position); listView.setItemChecked(position, !checked); view.setSelected(!checked); if (listView.getCheckedItemCount() == 0) { mActionMode.finish(); } // Return true as we are handling the event. return true; } }); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (mActionMode == null) { editServer( id ); listView.setItemChecked(position, false); view.setSelected(false); } else { boolean checked = listView.isItemChecked(position); listView.setItemChecked(position, checked); view.setSelected(checked); if (listView.getCheckedItemCount() == 0) { mActionMode.finish(); } } // Return true as we are handling the event. return; } }); } public void onNewServerClick(View view) { FragmentManager fm = getSupportFragmentManager(); NewServerDialog dialog = new NewServerDialog(getString(R.string.serverlist_dialog_new_server_title), this); dialog.show(fm, NEW_SERVER_DIALOG); } public void editServer(long id) { FragmentManager fm = getSupportFragmentManager(); NewServerDialog dialog = new NewServerDialog(getString(R.string.serverlist_dialog_edit_server_title), this); dialog.editServerId(id); dialog.show(fm, NEW_SERVER_DIALOG); } /** * Check an item and set is as selected. * */ public void startActionMode() { // Log.d(TAG, "SELECTION NEW: pos:" + String.valueOf(position) + " id:" + String.valueOf(id)); // if (mActionMode == null) { // // Start the CAB using the ActionMode.Callback defined above this.startActionMode(this); } } /** * Called when the action mode is created; startActionMode() was called * * @param mode * @param menu * @return boolean */ @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { // Inflate a menu resource providing context menu items MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.server_list, menu); mActionMode = mode; return true; } /** * Called each time the action mode is shown. Always called after onCreateActionMode, but * may be called multiple times if the mode is invalidated. * * @param mode * @param menu * @return boolean */ @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; // Return false if nothing is done } /** * Called when the user exits the action mode * * @param mode */ @Override public void onDestroyActionMode(ActionMode mode) { mActionMode = null; uncheckAllItems(); } private void uncheckAllItems() { if( listView == null ) { return; } SparseBooleanArray checked = listView.getCheckedItemPositions(); for (int i = 0; i < checked.size(); i++) { // Item position in adapter int position = checked.keyAt(i); // Add sport if it is checked i.e.) == TRUE! if (checked.valueAt(i)) { listView.setItemChecked(position, false); } } } /** * Called when the user selects a contextual menu item * * @param mode * @param item * @return */ @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.menuitem_delete: AskDelete(getCheckedItemIds()); // Action picked, so close the CAB mode.finish(); return true; // case R.id.menuitem_share: // menu_share(getCheckedItemIds()); // Action picked, so close the CAB // mode.finish(); // return true; default: return false; } } private ArrayList<String> getCheckedItemIds() { ArrayList<String> selectedItems = new ArrayList<>(); // HashMap<Long, ArrayList<String>> padlist_data = _getPadListData(); SparseBooleanArray positions = listView.getCheckedItemPositions(); // Log.d(TAG, "selectedItemsPositions: " + positions); for (int i = 0; i < positions.size(); ++i) { int position = positions.keyAt(i); if ( positions.valueAt(i) ) { selectedItems.add( String.valueOf(mAdapter.getItemId(position)) ); } } // Log.d(TAG, "selectedItemsIds: " + selectedItems.toString()); return selectedItems; } @Override public void onDialogDismiss() { } @Override public void onDialogSuccess() { mAdapter.notifyDataSetChanged(); } /** * Asks the user to confirm deleting a server. * If confirmed the info will be deleted. * * @param selectedItems * @return AlertDialog */ @Override public AlertDialog AskDelete(final ArrayList<String> selectedItems) { AlertDialog DeleteDialogBox = new AlertDialog.Builder(this) .setTitle(R.string.delete) .setMessage(getString(R.string.serverlist_dialog_delete_sure_to_delete)) .setIcon(android.R.drawable.ic_menu_delete) .setPositiveButton(R.string.delete, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { ServerModel serverModel = new ServerModel(getBaseContext()); for(int i = 0 ; i < selectedItems.size(); i++) { Log.d("DELETE_SERVER", "list_get: " + selectedItems.get(i)); boolean result = serverModel.deleteServer(Long.parseLong(selectedItems.get(i))); if (result) { Toast.makeText(getBaseContext(), getString(R.string.serverlist_dialog_delete_server_deleted), Toast.LENGTH_LONG).show(); mAdapter.notifyDataSetChanged(); } } dialog.dismiss(); } }) .setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }) .create(); DeleteDialogBox.show(); return DeleteDialogBox; } }