package net.cmikavac.autowol.partials; import java.util.List; import net.cmikavac.autowol.DeviceActivity; import net.cmikavac.autowol.R; import net.cmikavac.autowol.data.DbProvider; import net.cmikavac.autowol.models.DeviceModel; import net.cmikavac.autowol.services.WolService; import net.cmikavac.autowol.utils.TimeUtil; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Vibrator; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; public class DeviceListAdapter extends ArrayAdapter<DeviceModel> { private Context mContext = null; private List<DeviceModel> mDevices = null; private DbProvider mDbProvider = null; /** * Constructor. * @param context Context entity. * @param devices List of DeviceModel entities. */ public DeviceListAdapter(Context context, List<DeviceModel> devices) { super(context, R.layout.device_item_view, devices); mContext = context; mDevices = devices; mDbProvider = new DbProvider(context); } /** * Binds data to current itemView and registers its click callbacks. * @see android.widget.ArrayAdapter#getView(int, android.view.View, android.view.ViewGroup) * @param position Current itemView position in list. * @param itemView Current View item on which to bind data. * @param parentGroup Parent ViewGroup entity. */ @Override public View getView(final int position, View itemView, ViewGroup parentGroup) { ItemHolder itemHolder = new ItemHolder(); // Inflates new items on scroll to improve performance. if (itemView == null) { LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); itemView = inflater.inflate(R.layout.device_item_view, parentGroup, false); itemHolder = createItemHolder(itemView); itemView.setTag(itemHolder); } else { itemHolder = (ItemHolder)itemView.getTag(); } setItemHolderTextValues(position, itemHolder); registerOnClickListener(position, itemView); registerOnLongClickListener(position, itemView); return itemView; } /** * Sets text values for ItemHolder entity from mDevice entity. * Sets default values for null mDevice text values. * @param position ItemHolder position in list. * @param itemHolder ItemHolder entity for which to set text values. */ private void setItemHolderTextValues(final int position, ItemHolder itemHolder) { DeviceModel device = mDevices.get(position); itemHolder.nameText.setText(device.getName()); itemHolder.broadcastText.setText(device.getBroadcast()); itemHolder.macText.setText(device.getMac()); itemHolder.portText.setText("Port: " + device.getPort()); if (device.getSSID() != null) { itemHolder.ssidText.setText("SSID: " + device.getSSID()); } if (device.getQuietHoursFrom() != null) { String hoursFrom = TimeUtil.getFormatedTime(device.getQuietHoursFrom(), mContext); String hoursTo = TimeUtil.getFormatedTime(device.getQuietHoursTo(), mContext); String quietHours = "QH: " + hoursFrom + " to " + hoursTo; itemHolder.quietHoursText.setText(quietHours); } if (device.getIdleTime() != null) { itemHolder.idleTimeText.setText("Idle time: " + device.getIdleTime() + " (min)"); } } /** * Registers wakeDevice onClick callback to itemView entity. * @param position Item position in the list. * @param itemView ItemView entity for which to set callback. */ private void registerOnClickListener(final int position, View itemView) { itemView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { wakeDevice(position); } }); } /** * Registers showDialog onLongClick callback to itemView entity. * @param position Item position in the list. * @param itemView ItemView entity for which to set callback. */ private void registerOnLongClickListener(final int position, View itemView) { itemView.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View v) { Vibrator vibrator = (Vibrator)mContext.getSystemService(Context.VIBRATOR_SERVICE); vibrator.vibrate(50); showDialog(position); return false; } }); } /** * Builds and shows alert dialog with "2ake, edit and delete" options. * @param position Item position in the list. */ private void showDialog(final int position) { final CharSequence[] dialogItems = {"Wake", "Edit", "Delete"}; AlertDialog.Builder builder = new AlertDialog.Builder(mContext); builder.setTitle("Choose action"); builder.setItems(dialogItems, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { switch(item) { case 0: // Wake wakeDevice(position); break; case 1: // Edit editDevice(position); break; case 2: // Delete confirmDeviceDeletion(position); break; } } }); AlertDialog alert = builder.create(); alert.show(); } /** * Wakes the device. * @param position Item position in the list. */ private void wakeDevice(int position) { DeviceModel device = mDevices.get(position); new WolService(mContext, false).execute(device); } /** * Starts edit activity for selected device and passes the DeviceModel * entity as extended data (deviceObject). * @param position Item position in the list. */ private void editDevice(int position) { DeviceModel device = mDevices.get(position); Intent intent = new Intent(mContext, DeviceActivity.class); intent.putExtra("deviceObject", device); mContext.startActivity(intent); } /** * Prompts the user with a confirmation dialog for device deletion. * If deletion is confirmed, delete device from DB else do nothing. * @param position Item position in the list. */ private void confirmDeviceDeletion(final int position) { AlertDialog.Builder alert = new AlertDialog.Builder(mContext); alert.setTitle("Confirm"); alert.setMessage("Are you sure you wish to delete this device?"); alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { deleteDevice(position); } }); alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // Deletion canceled. Do nothing. } }); alert.show(); } /** * Deletes selected device record from DB and removes it from the item list on main activity. * @param position Item position in the list. */ private void deleteDevice(int position) { mDbProvider.open(); DeviceModel device = mDevices.get(position); mDbProvider.deleteDevice(device.getId()); mDbProvider.close(); mDevices.remove(position); notifyDataSetChanged(); } /** * Creates ItemHolder with all the view items view entities found * by their R.Ids and cast to appropriate types. * @param itemView ItemView entity for which to create ItemHolder entity. * @return New ItemHolder entity. */ private ItemHolder createItemHolder(View itemView) { ItemHolder itemHolder = new ItemHolder(); itemHolder.nameText = (TextView)itemView.findViewById(R.id.device_item_text_name); itemHolder.broadcastText = (TextView)itemView.findViewById(R.id.device_item_txt_broadcast); itemHolder.macText = (TextView)itemView.findViewById(R.id.device_item_txt_mac); itemHolder.portText = (TextView)itemView.findViewById(R.id.device_item_txt_port); itemHolder.ssidText = (TextView)itemView.findViewById(R.id.device_item_txt_ssid); itemHolder.quietHoursText = (TextView)itemView.findViewById(R.id.device_item_txt_quiet_hours); itemHolder.idleTimeText = (TextView)itemView.findViewById(R.id.device_item_txt_idle_time); return itemHolder; } /** * ItemHolder class containing definitions of all needed view elements. Used in parent class * to access view elements more easily without the need to find them by Id each time. */ private class ItemHolder { TextView nameText; TextView broadcastText; TextView macText; TextView portText; TextView ssidText; TextView quietHoursText; TextView idleTimeText; } }