package com.homesnap.android.ui.activities; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ListView; import android.widget.PopupWindow; import android.widget.SimpleAdapter; import com.homesnap.R; import com.adgsoftware.mydomo.engine.controller.Controller; import com.adgsoftware.mydomo.engine.controller.Status; import com.adgsoftware.mydomo.engine.house.Group; import com.adgsoftware.mydomo.engine.house.Label; import com.homesnap.android.ui.AbstractActivity; import com.homesnap.android.ui.adapters.ControllerAdapter; /** * Label edition screen. Used when editing a label to add controllers to it. */ public class LabelDetailsActivity extends AbstractActivity { List<Controller<? extends Status>> labelControllers = new ArrayList<Controller<? extends Status>>(); List<Controller<? extends Status>> controllersWithoutLabel = new ArrayList<Controller<? extends Status>>(); private static final int MENU_EDIT_CONTROLLER = 0; private static final int MENU_DELETE_CONTROLLER = 1; // Dialog box to select action (rename/delete) private Builder contextualDialog; private int itemPositionForAlertAction; SimpleAdapter controllersWithoutLabelAdapter; Label selectedLabel; PopupWindow popUp; Builder alertDialog; private String selectedLabelId; @Override protected void onResume() { super.onResume(); refreshControllers(); refreshList(); if (selectedLabel.isEmpty()) { alertDialog.show(); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.edit_label); popUp = new PopupWindow(this); // Set selected label Bundle extras = getIntent().getExtras(); if (extras != null) { selectedLabelId = String.valueOf(extras.get("selectedLabelId")); setTitle(String.valueOf(extras.get("selectedLabelTitle"))); } else { Log.e("Edit label", "You must call the activity with a label ID"); } // Bind list view actions ListView listView = (ListView) findViewById(R.id.listControllersForLabel); registerForContextMenu(listView); listView.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (position == parent.getChildCount()-1) { // Add new Label showLabelsPopup(controllersWithoutLabelAdapter); alertDialog.show(); } } }); listView.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { if (position == parent.getChildCount()-1) { // Add new Label // showAddLabelPopup(parent.getWidth(), null); return false; } else { Label labelEnum = (Label) parent.getItemAtPosition(position); Log.i("Item Long selected", labelEnum.toString()); try { itemPositionForAlertAction = position; alertDialog.show(); return true; // Open the label and display controllers } catch (Exception e) { Log.e("Error when selecting Label", null, e); return false; } } } }); contextualDialog = new AlertDialog.Builder(this).setTitle( "Select action").setAdapter( createControllersWithNoLabelAdapter(), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int position) { switch (position) { case MENU_EDIT_CONTROLLER: // Controller<Status> controller = (Controller<Status>) dialog.getItemAtPosition(position); Intent intent = new Intent(LabelDetailsActivity.this, EditControllerActivity.class); // intent.putExtra("selectedControllerId", controller.getWhere()); startActivity(intent); break; case MENU_DELETE_CONTROLLER: break; default: break; } refreshList(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.edit_label_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection switch (item.getItemId()) { case R.id.menu_add_controller: showControllersPopup(); return true; case R.id.menu_settings: showSettingsScreen(); return true; default: return super.onOptionsItemSelected(item); } } private void showControllersPopup() { this.alertDialog.show(); } /** * Load the label and its nested controllers, then bind to the list view. */ private void refreshList() { Log.d("Edit label", "Refresh list"); ListView listView = (ListView) findViewById(R.id.listControllersForLabel); listView.setAdapter(createLabelControllersAdapter()); // Create the adapter according to the list of controllers without label controllersWithoutLabelAdapter = createControllersWithNoLabelAdapter(); if (controllersWithoutLabel.isEmpty()) { alertDialog = new AlertDialog.Builder(this).setMessage(getResources().getText(R.string.message_no_controller_without_label)).setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { showSettingsScreen(); } }); } else { showLabelsPopup(controllersWithoutLabelAdapter); } } private void showLabelsPopup(SimpleAdapter controllersWithoutLabelAdapter) { alertDialog = new AlertDialog.Builder(this).setTitle( getResources().getText(R.string.title_controllers_without_label)).setAdapter( controllersWithoutLabelAdapter, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int position) { Log.d("Edit label dialog", String.valueOf(position)); Controller<? extends Status> selectedController = controllersWithoutLabel.get(position); selectedLabel.add(selectedController); saveHouse(); refreshControllers(); refreshList(); } }); } private ControllerAdapter createLabelControllersAdapter() { // fill in the grid_item layout ControllerAdapter adapter = new ControllerAdapter(this, labelControllers); return adapter; } private SimpleAdapter createControllersWithNoLabelAdapter() { // create the grid item mapping String[] from = new String[] { "text1", "text2" }; int[] to = new int[] { android.R.id.text1, android.R.id.text2 }; // prepare the list of all records List<HashMap<String, String>> fillMaps = new ArrayList<HashMap<String, String>>(); int i = 0; for (Controller<? extends Status> controller : controllersWithoutLabel) { HashMap<String, String> map = new HashMap<String, String>(); i++; String title = controller.getTitle() == null ? "Controller " + i : controller.getTitle(); map.put("text1", title); Log.d("Edit label", "Add orphan controller " + title); fillMaps.add(map); } // fill in the grid_item layout SimpleAdapter adapter = new SimpleAdapter(this, fillMaps, android.R.layout.simple_dropdown_item_1line, from, to); return adapter; } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); menu.setHeaderTitle("Controller"); menu.add(0, MENU_EDIT_CONTROLLER, 0, "Edit controller"); menu.add(0, MENU_DELETE_CONTROLLER, 1, "Delete controller"); } public boolean onContextItemSelected(MenuItem menuItem) { int pos = ((AdapterContextMenuInfo) menuItem.getMenuInfo()).position; Controller<? extends Status> controller = labelControllers.get(pos); switch (menuItem.getItemId()) { case MENU_EDIT_CONTROLLER: editController(controller); return true; case MENU_DELETE_CONTROLLER: deleteController(controller); return true; default: return super.onContextItemSelected(menuItem); } } private void editController(Controller<? extends Status> controller) { showEditControllerScreen(controller.getWhere()); } private void deleteController(Controller<? extends Status> controller) { Log.i("Delete controller", controller.getTitle()); selectedLabel.remove(controller); saveHouse(); refreshControllers(); refreshList(); } private void refreshControllers() { Log.d("Controllers", "Load/refresh controllers"); // Reload label from back-end selectedLabel = getLabel(getHouse(), selectedLabelId); // Load controllers without label controllersWithoutLabel.clear(); for (Group group : getHouse().getGroups()) { for (Controller<? extends Status> controller : group .getControllerList()) { if (controller.getLabels() == null || controller.getLabels().isEmpty()) { controllersWithoutLabel.add(controller); } } } // Load controllers of this label labelControllers.clear(); for (Controller<? extends Status> controller : selectedLabel) { labelControllers.add(controller); } } }