From c578d2e85947d643bbdd510dda5cf2da84e5521e Mon Sep 17 00:00:00 2001 From: Mauricio de Oliveira Date: Wed, 14 Feb 2018 17:40:14 -0800 Subject: [PATCH 001/129] More clean up... --- app/src/main/AndroidManifest.xml | 8 +- .../{HospitalApp.java => AmbulanceApp.java} | 2 +- .../hospital/AmbulanceListActivity.java | 138 ++++++++++++ .../hospital/HospitalEquipmentActivity.java | 200 ------------------ .../hospital/HospitalListActivity.java | 125 ----------- .../org/emstrack/hospital/LoginActivity.java | 4 +- .../hospital/adapters/ListAdapter.java | 156 -------------- .../dialogs/EquipmentBooleanDialog.java | 181 ---------------- .../dialogs/EquipmentValueDialog.java | 129 ----------- .../hospital/dialogs/LogoutDialog.java | 4 +- .../main/res/layout/activity_dashboard.xml | 13 -- app/src/main/res/layout/list_item_boolean.xml | 37 ---- app/src/main/res/layout/list_item_value.xml | 38 ---- app/src/main/res/layout/toggle_dialog.xml | 40 ---- 14 files changed, 145 insertions(+), 930 deletions(-) rename app/src/main/java/org/emstrack/hospital/{HospitalApp.java => AmbulanceApp.java} (94%) create mode 100644 app/src/main/java/org/emstrack/hospital/AmbulanceListActivity.java delete mode 100644 app/src/main/java/org/emstrack/hospital/HospitalEquipmentActivity.java delete mode 100644 app/src/main/java/org/emstrack/hospital/HospitalListActivity.java delete mode 100644 app/src/main/java/org/emstrack/hospital/adapters/ListAdapter.java delete mode 100644 app/src/main/java/org/emstrack/hospital/dialogs/EquipmentBooleanDialog.java delete mode 100644 app/src/main/java/org/emstrack/hospital/dialogs/EquipmentValueDialog.java delete mode 100644 app/src/main/res/layout/activity_dashboard.xml delete mode 100644 app/src/main/res/layout/list_item_boolean.xml delete mode 100644 app/src/main/res/layout/list_item_value.xml delete mode 100644 app/src/main/res/layout/toggle_dialog.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b94432a0..d1a686eb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,7 +6,7 @@ - - - - diff --git a/app/src/main/java/org/emstrack/hospital/HospitalApp.java b/app/src/main/java/org/emstrack/hospital/AmbulanceApp.java similarity index 94% rename from app/src/main/java/org/emstrack/hospital/HospitalApp.java rename to app/src/main/java/org/emstrack/hospital/AmbulanceApp.java index 4b25bb1e..35cf3812 100644 --- a/app/src/main/java/org/emstrack/hospital/HospitalApp.java +++ b/app/src/main/java/org/emstrack/hospital/AmbulanceApp.java @@ -11,7 +11,7 @@ * Created by mauri on 2/10/2018. */ -public class HospitalApp extends Application { +public class AmbulanceApp extends Application { final String serverUri = "ssl://cruzroja.ucsd.edu:8883"; final String clientId = "HospitalAppClient_" + UUID.randomUUID().toString(); diff --git a/app/src/main/java/org/emstrack/hospital/AmbulanceListActivity.java b/app/src/main/java/org/emstrack/hospital/AmbulanceListActivity.java new file mode 100644 index 00000000..cecbd6a3 --- /dev/null +++ b/app/src/main/java/org/emstrack/hospital/AmbulanceListActivity.java @@ -0,0 +1,138 @@ +package org.emstrack.hospital; + +import java.util.ArrayList; +import java.util.List; + +import android.content.DialogInterface; +import android.os.Bundle; +import android.support.v7.app.AlertDialog; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.app.ActionBar; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.Spinner; +import android.widget.Toast; +import android.util.Log; + +import org.emstrack.hospital.dialogs.LogoutDialog; +import org.emstrack.models.AmbulancePermission; +import org.emstrack.mqtt.MqttProfileClient; + +/** + * Created by devinhickey on 5/24/17. + */ + +public class AmbulanceListActivity extends AppCompatActivity { + + private static final String TAG = "AmbulanceListActivity"; + + @Override + public void onCreate(Bundle savedInstanceState) { + + Log.d(TAG, "onCreate"); + + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_hospital_list); + + // Action bar + getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); + getSupportActionBar().setDisplayShowCustomEnabled(true); + getSupportActionBar().setCustomView(R.layout.maintitlebar); + View view = getSupportActionBar().getCustomView(); + + // Connect logout dialog + ImageView imageButton = view.findViewById(R.id.LogoutBtn); + imageButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + LogoutDialog ld = LogoutDialog.newInstance(); + ld.show(getFragmentManager(), "logout_dialog"); + } + }); + + // Retrieve ambulances + final MqttProfileClient profileClient = ((AmbulanceApp) getApplication()).getProfileClient(); + final List ambulances = profileClient.getProfile().getAmbulances(); + + // No ambulances associated with this account + if (ambulances.size() < 1) { + Toast toast = new Toast(this); + toast.setText("This account has no ambulances associated with it!"); + toast.setDuration(Toast.LENGTH_LONG); + toast.show(); + return; + } + + // Creates string arraylist of ambulance names + Log.d(TAG, "Creating ambulance list..."); + ArrayList listObjects = new ArrayList<>(); + for (AmbulancePermission ambulance : ambulances) { + Log.d(TAG, "Adding ambulance " + ambulance.getAmbulanceIdentifier()); + listObjects.add(ambulance.getAmbulanceIdentifier()); + } + + // Create the Spinner connection + final Spinner ambulanceSpinner = findViewById(R.id.hospitalSpinner); + ambulanceSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + Log.d(TAG, "OnItemSelected Called"); + } + + @Override + public void onNothingSelected(AdapterView parent) { + Log.d(TAG, "OnNothingSelected Called"); + } + }); + + // Create the basic adapter + ArrayAdapter ambulanceListAdapter = new ArrayAdapter<>(this, + android.R.layout.simple_spinner_item, listObjects); + ambulanceListAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + + // Set the spinner's adapter + ambulanceSpinner.setAdapter(ambulanceListAdapter); + + // Create the ambulance button + Button submitAmbulanceButton = findViewById(R.id.submitHospitalButton); + submitAmbulanceButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Log.d(TAG, "AmbulanceEquipmentMetadata Submit Button Clicked"); + + int position = ambulanceSpinner.getSelectedItemPosition(); + Log.d(TAG, "Position Selected: " + position); + + AmbulancePermission selectedAmbulance = ambulances.get(position); + Log.d(TAG, "Selected AmbulanceEquipmentMetadata: " + selectedAmbulance.getAmbulanceIdentifier()); + + int ambulanceId = selectedAmbulance.getAmbulanceId(); + + // START GPS + AlertDialog alertDialog = new AlertDialog.Builder(AmbulanceListActivity.this).create(); + alertDialog.setTitle("GPS"); + alertDialog.setMessage("Start GPS"); + alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, + getResources().getString(R.string.alert_button_positive_text), + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + } + }); + alertDialog.show(); + + } + }); + + } // end onCreate + + @Override + public void onBackPressed() { + LogoutDialog ld = LogoutDialog.newInstance(); + ld.show(getFragmentManager(), "logout_dialog"); + } + +} diff --git a/app/src/main/java/org/emstrack/hospital/HospitalEquipmentActivity.java b/app/src/main/java/org/emstrack/hospital/HospitalEquipmentActivity.java deleted file mode 100644 index b4cee813..00000000 --- a/app/src/main/java/org/emstrack/hospital/HospitalEquipmentActivity.java +++ /dev/null @@ -1,200 +0,0 @@ -package org.emstrack.hospital; - -import java.util.ArrayList; - -import android.os.Bundle; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatActivity; -import android.util.Log; -import android.view.View; -import android.view.Window; -import android.widget.ImageView; -import android.widget.ListView; - -import com.google.gson.FieldNamingPolicy; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -import org.eclipse.paho.client.mqttv3.MqttException; -import org.eclipse.paho.client.mqttv3.MqttMessage; - -import org.emstrack.hospital.adapters.ListAdapter; -import org.emstrack.hospital.dialogs.LogoutDialog; -import org.emstrack.hospital.interfaces.DataListener; - -import org.emstrack.mqtt.MqttProfileClient; -import org.emstrack.mqtt.MqttProfileMessageCallback; - -import org.emstrack.models.HospitalEquipment; - -/** - * Created by devinhickey on 4/20/17. - * The Dashboard - */ -public class HospitalEquipmentActivity extends AppCompatActivity { - - private static final String TAG = HospitalEquipmentActivity.class.getSimpleName(); - private ListAdapter adapter; - int hospitalId = -1; - - @Override - public void onCreate(Bundle savedInstanceState) { - - super.onCreate(savedInstanceState); - - this.requestWindowFeature(Window.FEATURE_NO_TITLE); - setContentView(R.layout.activity_dashboard); - - // Action bar - getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); - getSupportActionBar().setDisplayShowCustomEnabled(true); - getSupportActionBar().setCustomView(R.layout.maintitlebar); - - // Connect logout dialog - View view = getSupportActionBar().getCustomView(); - ImageView imageButton= view.findViewById(R.id.LogoutBtn); - imageButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - // Create the logout dialog for the user - LogoutDialog ld = LogoutDialog.newInstance(); - ld.show(getFragmentManager(), "logout_dialog"); - } - }); - - // Get data from Login and place it into the hospital - hospitalId = Integer - .parseInt(getIntent().getStringExtra("SELECTED_HOSPITAL_ID")); - - // Retrieve client - final MqttProfileClient profileClient = ((HospitalApp) getApplication()).getProfileClient(); - - // Set list adapter - ListView lv = findViewById(R.id.dashboardListView); - adapter = new ListAdapter(this, - new ArrayList(), - getSupportFragmentManager()); - adapter.setOnDataChangedListener(new DataListener() { - - @Override - public void onDataChanged(String equipmentName, String data) { - - Log.d(TAG, "onDataChanged: " + equipmentName + "@" + data); - String format = "{\"hospital_id\":%1$s,\"equipment_name\":\"%2$s\",\"value\":%3$s}"; - - try { - profileClient.publish("user/" + profileClient.getUsername() + - "/hospital/" + hospitalId + - "/equipment/" + equipmentName + "/data", - String.format(format, hospitalId, equipmentName, data), - 2, false); - } catch (MqttException e) { - Log.d(TAG, "Failed to publish updated equipment"); - } - } - - }); - lv.setAdapter(adapter); - - try { - - // Start retrieving data - profileClient.subscribe("hospital/" + hospitalId + "/metadata", - 1, new MqttProfileMessageCallback() { - - @Override - public void messageArrived(String topic, MqttMessage message) { - - try { - - // Unsubscribe to metadata - profileClient.unsubscribe("hospital/" + hospitalId + "/metadata"); - - } catch ( MqttException exception ) { - - Log.d(TAG,"Could not unsubscribe to 'hospital/" + hospitalId + "/metadata'"); - return; - } - - // Parse to hospital metadata - GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); - Gson gson = gsonBuilder.create(); - - try { - // Subscribe to all hospital equipment topics - profileClient.subscribe( - "hospital/" + hospitalId + "/equipment/+/data", - 1, new MqttProfileMessageCallback() { - @Override - public void messageArrived(String topic, MqttMessage message) { - - // Parse to hospital equipment - GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.setFieldNamingPolicy( - FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); - Gson gson = gsonBuilder.create(); - - // Found item in the hospital equipments object - HospitalEquipment equipment = gson - .fromJson(new String(message.getPayload()), - HospitalEquipment.class); - - // add equipment to list - adapter.add(equipment); - - } - }); - - /* - - // NOT NECESSARY: Already subscribed to all equipment topics - - HospitalEquipmentMetadata[] equipmentMetadata = gson - .fromJson(new String(message.getPayload()), - HospitalEquipmentMetadata[].class); - for (HospitalEquipmentMetadata equipment : equipmentMetadata) { - // Subscribe without a callback - profileClient.subscribe( - "hospital/" + hospitalId + - "/equipment/" + equipment.getName() + "/data", - 1, null); - } - - */ - - } catch (MqttException e) { - Log.d(TAG, "Could not subscribe to hospital equipment topics"); - } - } - - }); - - } catch (MqttException e) { - Log.d(TAG, "Could not subscribe to hospital metadata"); - } - - } - - @Override - public void onBackPressed() { - - try { - - // Retrieve client - final MqttProfileClient profileClient = ((HospitalApp) getApplication()).getProfileClient(); - - // unsubscribe to current hospital equipment data - profileClient.unsubscribe("hospital/" + hospitalId + "/equipment/+/data"); - - } catch ( MqttException exception ) { - - Log.d(TAG,"Could not unsubscribe to 'hospital/" + hospitalId + "/equipment/+/data'"); - - } - - // go back - super.onBackPressed(); - } - -} diff --git a/app/src/main/java/org/emstrack/hospital/HospitalListActivity.java b/app/src/main/java/org/emstrack/hospital/HospitalListActivity.java deleted file mode 100644 index 1d6e5a39..00000000 --- a/app/src/main/java/org/emstrack/hospital/HospitalListActivity.java +++ /dev/null @@ -1,125 +0,0 @@ -package org.emstrack.hospital; - -import java.util.ArrayList; -import java.util.List; - -import android.content.Intent; -import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.app.ActionBar; -import android.view.View; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; -import android.widget.Button; -import android.widget.ImageView; -import android.widget.Spinner; -import android.widget.Toast; -import android.util.Log; - -import org.emstrack.hospital.dialogs.LogoutDialog; -import org.emstrack.models.HospitalPermission; -import org.emstrack.mqtt.MqttProfileClient; - -/** - * Created by devinhickey on 5/24/17. - */ - -public class HospitalListActivity extends AppCompatActivity { - - private static final String TAG = "HospitalListActivity"; - - @Override - public void onCreate(Bundle savedInstanceState) { - - Log.d(TAG, "onCreate"); - - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_hospital_list); - - // Action bar - getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); - getSupportActionBar().setDisplayShowCustomEnabled(true); - getSupportActionBar().setCustomView(R.layout.maintitlebar); - View view = getSupportActionBar().getCustomView(); - - // Connect logout dialog - ImageView imageButton = view.findViewById(R.id.LogoutBtn); - imageButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - LogoutDialog ld = LogoutDialog.newInstance(); - ld.show(getFragmentManager(), "logout_dialog"); - } - }); - - // Retrieve hospitals - final MqttProfileClient profileClient = ((HospitalApp) getApplication()).getProfileClient(); - final List hospitals = profileClient.getProfile().getHospitals(); - - // No hospitals associated with this account - if (hospitals.size() < 1) { - Toast toast = new Toast(this); - toast.setText("This account has no hospitals associated with it!"); - toast.setDuration(Toast.LENGTH_LONG); - toast.show(); - return; - } - - // Creates string arraylist of hospital names - Log.d(TAG, "Creating hospital list..."); - ArrayList listObjects = new ArrayList<>(); - for (HospitalPermission hospital : hospitals) { - Log.d(TAG, "Adding hospital " + hospital.getHospitalName()); - listObjects.add(hospital.getHospitalName()); - } - - // Create the Spinner connection - final Spinner hospitalSpinner = findViewById(R.id.hospitalSpinner); - hospitalSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - Log.d(TAG, "OnItemSelected Called"); - } - - @Override - public void onNothingSelected(AdapterView parent) { - Log.d(TAG, "OnNothingSelected Called"); - } - }); - - // Create the basic adapter - ArrayAdapter hospitalListAdapter = new ArrayAdapter<>(this, - android.R.layout.simple_spinner_item, listObjects); - hospitalListAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - - // Set the spinner's adapter - hospitalSpinner.setAdapter(hospitalListAdapter); - - // Create the hospital button - Button submitHospitalButton = findViewById(R.id.submitHospitalButton); - submitHospitalButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Log.d(TAG, "HospitalEquipmentMetadata Submit Button Clicked"); - - int position = hospitalSpinner.getSelectedItemPosition(); - Log.d(TAG, "Position Selected: " + position); - HospitalPermission selectedHospital = hospitals.get(position); - Log.d(TAG, "Selected HospitalEquipmentMetadata: " + selectedHospital.getHospitalName()); - - // Set the static list of HospitalEquipment in Dashboard - Intent intent = new Intent(HospitalListActivity.this, HospitalEquipmentActivity.class); - intent.putExtra("SELECTED_HOSPITAL_ID", Integer.toString(selectedHospital.getHospitalId())); - startActivity(intent); - } - }); - - } // end onCreate - - @Override - public void onBackPressed() { - LogoutDialog ld = LogoutDialog.newInstance(); - ld.show(getFragmentManager(), "logout_dialog"); - } - -} diff --git a/app/src/main/java/org/emstrack/hospital/LoginActivity.java b/app/src/main/java/org/emstrack/hospital/LoginActivity.java index fec2a68d..451a0b8a 100644 --- a/app/src/main/java/org/emstrack/hospital/LoginActivity.java +++ b/app/src/main/java/org/emstrack/hospital/LoginActivity.java @@ -118,7 +118,7 @@ public boolean onTouch(View v, MotionEvent event) { public void loginHospital(final String username, final String password) { // Retrieve client - final MqttProfileClient profileClient = ((HospitalApp) getApplication()).getProfileClient(); + final MqttProfileClient profileClient = ((AmbulanceApp) getApplication()).getProfileClient(); // Set callback to be called after profile is retrieved profileClient.setCallback(new MqttProfileCallback() { @@ -147,7 +147,7 @@ public void onSuccess() { editor.apply(); // Initiate new activity - Intent hospitalIntent = new Intent(getApplicationContext(), HospitalListActivity.class); + Intent hospitalIntent = new Intent(getApplicationContext(), AmbulanceListActivity.class); startActivity(hospitalIntent); // Clear the loading screen diff --git a/app/src/main/java/org/emstrack/hospital/adapters/ListAdapter.java b/app/src/main/java/org/emstrack/hospital/adapters/ListAdapter.java deleted file mode 100644 index 64082393..00000000 --- a/app/src/main/java/org/emstrack/hospital/adapters/ListAdapter.java +++ /dev/null @@ -1,156 +0,0 @@ -package org.emstrack.hospital.adapters; - -import android.content.Context; -import android.support.annotation.NonNull; -import android.support.v4.app.FragmentManager; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.ImageView; -import android.widget.TextView; - -//import org.emstrack.hospital.CustomDialog; -import org.emstrack.hospital.interfaces.DataListener; -import org.emstrack.hospital.R; -import org.emstrack.hospital.dialogs.EquipmentBooleanDialog; -import org.emstrack.hospital.dialogs.EquipmentValueDialog; -import org.emstrack.models.HospitalEquipment; - -import java.util.ArrayList; - -/** - * Created by Fabian Choi on 5/16/2017. - */ -public class ListAdapter extends ArrayAdapter { - - private final Context context; - private final ArrayList objects; - private final FragmentManager fragmentManager; - private DataListener dr; - - public ListAdapter(Context context, ArrayList objects, FragmentManager fm) { - super(context, -1, objects); - this.context = context; - this.objects = objects; - this.fragmentManager = fm; - } - - public void setOnDataChangedListener(DataListener dr) { - this.dr = dr; - } - - @Override - @NonNull - public View getView(int position, View convertView, ViewGroup parent) { - - // Get the object, and the type - // Inflate the correct view based on the type and update the parts of the layout -> set onClicks - - // TODO: This needs a revamp; the different equipment types should know how to convert to view - - System.out.println("GETVIEW - Position: " + position); - final HospitalEquipment equipmentItem = objects.get(position); - - LayoutInflater inflater = LayoutInflater.from(context); - - final View row; - - final Character equipmentEtype = equipmentItem.getEquipmentEtype(); - - try { - - // Integer type - if (equipmentEtype == 'I' || equipmentEtype == 'S') { - - System.out.println("Adding Value to List"); - row = inflater.inflate(R.layout.list_item_value, parent, false); - - // Grab the elements of the Value ListItem - System.out.println("Grabbing Elements from Row"); - TextView text = row.findViewById(R.id.valueTextView); - TextView value = row.findViewById(R.id.valueData); - - // Set the elements of the ListItem - System.out.println("Setting Elements in Row"); - text.setText(equipmentItem.getEquipmentName()); - if (equipmentEtype == 'I') - value.setText(equipmentItem.getValue()); - else - value.setText("..."); - // Store value in a tag - row.setTag(equipmentItem.getValue()); - - System.out.println("Setting row onClick Listener"); - row.setOnClickListener(new View.OnClickListener() { - - @Override - public void onClick(View v) { - - String title = ((TextView) row.findViewById(R.id.valueTextView)).getText().toString(); - String value = v.getTag().toString(); - Character equipmentType = - ((TextView) row.findViewById(R.id.valueData)).getText() - .equals("...") ? 'S' : 'I'; - String message; - if (equipmentEtype == 'I') - message = context.getResources().getString(R.string.equipment_integer_message); - else - message = context.getResources().getString(R.string.equipment_string_message); - - EquipmentValueDialog vd = EquipmentValueDialog.newInstance(title, message, value); - vd.setOnDataChangedListener(dr); - vd.show(fragmentManager, - "integer_dialog"); - } - - }); - - } else if (equipmentEtype == 'B') { - - System.out.println("Adding Toggle to List"); - row = inflater.inflate(R.layout.list_item_boolean, parent, false); - - // Grab the elements of the Toggle ListItem - TextView text = row.findViewById(R.id.toggleTextView); - ImageView image = row.findViewById(R.id.toggleImage); - - // Set the elements of the ListItem - text.setText(equipmentItem.getEquipmentName()); - row.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - - String title = ((TextView) row.findViewById(R.id.toggleTextView)).getText().toString(); - String message = context.getResources().getString(R.string.equipment_boolean_message); - String value = equipmentItem.getValue(); - boolean toggled = (value.equals("True")); - - EquipmentBooleanDialog td = EquipmentBooleanDialog.newInstance(title, message, toggled, value); - td.setOnDataChangedListener(dr); - - td.show(fragmentManager, - "boolean_dialog"); - } - }); - - // Check which image to set - if (equipmentItem.getValue().equals("True")) { - image.setImageResource(R.drawable.green_check); - } else { - image.setImageResource(R.drawable.redx); - } - - } else { - return new View(context); - } - - } catch (Exception e) { - System.out.println("Caught an Exception"); - return new View(context); - } - - return row; - } // end getView - -} diff --git a/app/src/main/java/org/emstrack/hospital/dialogs/EquipmentBooleanDialog.java b/app/src/main/java/org/emstrack/hospital/dialogs/EquipmentBooleanDialog.java deleted file mode 100644 index 4a5dc4c7..00000000 --- a/app/src/main/java/org/emstrack/hospital/dialogs/EquipmentBooleanDialog.java +++ /dev/null @@ -1,181 +0,0 @@ -package org.emstrack.hospital.dialogs; - -import android.app.Dialog; -import android.graphics.Typeface; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; -import android.content.DialogInterface; -import android.os.Bundle; -import android.support.v7.app.AlertDialog; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.Button; -import android.widget.CompoundButton; -import android.widget.Switch; -import android.widget.TextView; - -import org.emstrack.hospital.interfaces.DataListener; -import org.emstrack.hospital.R; - -/** - * Created by devinhickey on 6/5/17. - */ - -public class EquipmentBooleanDialog extends DialogFragment { - - private String title; - private String message; - private boolean isToggled; - private String updatedData = ""; - private String oldData = ""; - private DataListener dr; - - /** - * Empty Constructor - */ - public EquipmentBooleanDialog() { - - } - - /** - * - * @param title - * @param message - * @return - */ - public static EquipmentBooleanDialog newInstance(String title, String message, boolean isToggled, String data) { - - EquipmentBooleanDialog td = new EquipmentBooleanDialog(); - - Bundle args = new Bundle(); - args.putString("Title", title); - args.putString("Message", message); - args.putBoolean("Toggle", isToggled); - args.putString("Data", data); - - td.setArguments(args); - - return td; - - } - - @Override - @NonNull - public Dialog onCreateDialog(Bundle savedInstanceState) { - - title = getArguments().getString("Title"); - message = getArguments().getString("Message"); - isToggled = getArguments().getBoolean("Toggle"); - oldData = getArguments().getString("Data"); - - System.out.println("Title: " + title); - System.out.println("Message: " + message); - System.out.println("Toggle: " + isToggled); - System.out.println("Data: " + oldData); - - final AlertDialog.Builder alertBuilder = new AlertDialog.Builder(getActivity()); -// final LinearLayout ll = new LinearLayout(getActivity().getApplicationContext()); - final Button yesButton = new Button(getActivity().getApplicationContext()); - final Button noButton = new Button(getActivity().getApplicationContext()); - - // Set the data elements - // Check if the resource is available and set the title to account for it - System.out.println("Data = " + oldData); - if (oldData.equals("True")) { - alertBuilder.setTitle((title + " - " + getResources().getString(R.string.equipment_boolean_true))); - } else { - alertBuilder.setTitle((title + " - " + getResources().getString(R.string.equipment_boolean_false))); - } - alertBuilder.setMessage(message); - - LayoutInflater inflater = LayoutInflater.from(getContext()); - - View v = inflater.inflate(R.layout.toggle_dialog, null, false); - alertBuilder.setView(v.findViewById(R.id.toggleDialogLayout)); - - final Switch toggleSwitch = v.findViewById(R.id.availableSwitch); - final TextView availableText = v.findViewById(R.id.availableText); - final TextView unavailableText = v.findViewById(R.id.unavailableText); - - toggleSwitch.setChecked(!isToggled); - toggleText(!isToggled, availableText, unavailableText); - - /** - * OnClicks for the elements of the dialog - */ - - availableText.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - toggleSwitch.setChecked(false); - toggleText(false, availableText, unavailableText); - } - }); - - unavailableText.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - toggleSwitch.setChecked(true); - toggleText(true, availableText, unavailableText); - } - }); - - toggleSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - toggleText(isChecked, availableText, unavailableText); - } - }); - - alertBuilder.setNeutralButton(getResources().getString(R.string.equipment_bolean_button_positive_text), - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - if (!toggleSwitch.isChecked()) { - updatedData = "True"; - } else { - updatedData = "False"; - } - - // Update the data - onDataChanged(title, updatedData); - dialog.dismiss(); - } - }); - - alertBuilder.setNegativeButton(getResources().getString(R.string.equipment_bolean_button_negative_text), - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - updatedData = ""; - dialog.dismiss(); - } - }); - - return alertBuilder.create(); - - } - - private void toggleText (boolean toggle, final TextView availableText, final TextView unavailableText) { - if (!toggle) { - availableText.setTypeface(null, Typeface.BOLD); - availableText.setTextColor(getResources().getColor(R.color.colorGreen)); - unavailableText.setTextColor(getResources().getColor(R.color.colorGrey)); - unavailableText.setTypeface(null, Typeface.NORMAL); - } else { - availableText.setTypeface(null, Typeface.NORMAL); - unavailableText.setTextColor(getResources().getColor(R.color.colorPrimary)); - availableText.setTextColor(getResources().getColor(R.color.colorGrey)); - unavailableText.setTypeface(null, Typeface.BOLD); - } - } - - public void setOnDataChangedListener(DataListener dr) { - this.dr = dr; - } - - public void onDataChanged(String name, String data) { - dr.onDataChanged(name, data); - } - -} diff --git a/app/src/main/java/org/emstrack/hospital/dialogs/EquipmentValueDialog.java b/app/src/main/java/org/emstrack/hospital/dialogs/EquipmentValueDialog.java deleted file mode 100644 index b61b1092..00000000 --- a/app/src/main/java/org/emstrack/hospital/dialogs/EquipmentValueDialog.java +++ /dev/null @@ -1,129 +0,0 @@ -package org.emstrack.hospital.dialogs; - -import android.app.Dialog; -import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; -import android.content.DialogInterface; -import android.os.Bundle; -import android.support.v7.app.AlertDialog; -import android.text.InputType; -import android.view.Gravity; -import android.widget.EditText; -import android.widget.LinearLayout; - -import org.emstrack.hospital.interfaces.DataListener; -import org.emstrack.hospital.R; - -/** - * Created by devinhickey on 6/5/17. - */ - -public class EquipmentValueDialog extends DialogFragment { - - private String title; - private String message; - private String updatedData = ""; - private String oldData = ""; - private DataListener dr; - - /** - * Empty Constructor - */ - public EquipmentValueDialog() { - - } - - /** - * - * @param title - * @param message - * @return - */ - public static EquipmentValueDialog newInstance(String title, String message, String data) { - EquipmentValueDialog vd = new EquipmentValueDialog(); - - Bundle args = new Bundle(); - args.putString("Title", title); - args.putString("Message", message); - args.putString("Data", data); - - vd.setArguments(args); - - return vd; - - } - - @Override - @NonNull - public Dialog onCreateDialog(Bundle savedInstanceState) { - - title = getArguments().getString("Title"); - message = getArguments().getString("Message"); - oldData = getArguments().getString("Data"); - - System.out.println("Title: " + title); - System.out.println("Message: " + message); - System.out.println("Data: " + oldData); - - - final AlertDialog.Builder alertBuilder = new AlertDialog.Builder(getActivity()); - final EditText valueText = new EditText(getActivity().getApplicationContext()); - - System.out.println("Value Type, adding box"); - - // Set the data elements - alertBuilder.setTitle(title); - alertBuilder.setMessage(message); - - // Initialize the Value Text - valueText.setGravity(Gravity.CENTER_HORIZONTAL); - valueText.setRawInputType(InputType.TYPE_CLASS_NUMBER); - valueText.setTextColor(getResources().getColor(R.color.colorPrimaryDark)); - - // Set the current data and move the cursor to the end - valueText.setText(oldData); - valueText.setSelection(valueText.getText().length()); - - // Create the EditText LayoutParams - LinearLayout.LayoutParams params = new LinearLayout.LayoutParams - (LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.MATCH_PARENT); - valueText.setLayoutParams(params); - - alertBuilder.setView(valueText); - - alertBuilder.setNeutralButton(getResources().getString(R.string.equipment_integer_button_positive_text), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - System.out.println("Update Button Clicked"); - // Update the value - // Grab the new value - updatedData = valueText.getText().toString(); - - // Update the data - onDataChanged(title, updatedData); - dialog.dismiss(); - } - }); - - alertBuilder.setNegativeButton(getResources().getString(R.string.equipment_integer_button_negative_text), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - updatedData = ""; - dialog.dismiss(); - } - }); - - return alertBuilder.create(); - - } - - public void setOnDataChangedListener(DataListener dr) { - this.dr = dr; - } - - public void onDataChanged(String name, String data) { - dr.onDataChanged(name, data); - } - -} diff --git a/app/src/main/java/org/emstrack/hospital/dialogs/LogoutDialog.java b/app/src/main/java/org/emstrack/hospital/dialogs/LogoutDialog.java index 322c85d8..6b1279ff 100644 --- a/app/src/main/java/org/emstrack/hospital/dialogs/LogoutDialog.java +++ b/app/src/main/java/org/emstrack/hospital/dialogs/LogoutDialog.java @@ -10,7 +10,7 @@ import android.util.Log; import org.eclipse.paho.client.mqttv3.MqttException; -import org.emstrack.hospital.HospitalApp; +import org.emstrack.hospital.AmbulanceApp; import org.emstrack.hospital.LoginActivity; import org.emstrack.hospital.R; import org.emstrack.mqtt.MqttProfileClient; @@ -46,7 +46,7 @@ public void onClick(DialogInterface dialog, int which) { System.out.println("OK Button Clicked"); // Retrieve client - final MqttProfileClient profileClient = ((HospitalApp) getActivity().getApplication()).getProfileClient(); + final MqttProfileClient profileClient = ((AmbulanceApp) getActivity().getApplication()).getProfileClient(); try { profileClient.disconnect(); } catch (MqttException e) { diff --git a/app/src/main/res/layout/activity_dashboard.xml b/app/src/main/res/layout/activity_dashboard.xml deleted file mode 100644 index a89394cd..00000000 --- a/app/src/main/res/layout/activity_dashboard.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - diff --git a/app/src/main/res/layout/list_item_boolean.xml b/app/src/main/res/layout/list_item_boolean.xml deleted file mode 100644 index 2de52c76..00000000 --- a/app/src/main/res/layout/list_item_boolean.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/list_item_value.xml b/app/src/main/res/layout/list_item_value.xml deleted file mode 100644 index da78d0e8..00000000 --- a/app/src/main/res/layout/list_item_value.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/toggle_dialog.xml b/app/src/main/res/layout/toggle_dialog.xml deleted file mode 100644 index 7f503776..00000000 --- a/app/src/main/res/layout/toggle_dialog.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - \ No newline at end of file From 814a91007a874add3f15283fa89c6c3ec7e812fd Mon Sep 17 00:00:00 2001 From: Mauricio de Oliveira Date: Wed, 21 Feb 2018 14:03:37 -0800 Subject: [PATCH 002/129] Refactoring hospital into ambulance. --- .../ExampleInstrumentedTest.java | 2 +- app/src/main/AndroidManifest.xml | 8 ++++---- .../emstrack/{hospital => ambulance}/AmbulanceApp.java | 2 +- .../{hospital => ambulance}/AmbulanceListActivity.java | 4 ++-- .../{hospital => ambulance}/LoginActivity.java | 2 +- .../{hospital => ambulance}/dialogs/LogoutDialog.java | 8 ++++---- .../interfaces/DataListener.java | 2 +- app/src/main/res/layout/activity_login.xml | 2 +- .../{hospital => ambulance}/ExampleUnitTest.java | 2 +- models/build.gradle | 10 ++++------ 10 files changed, 20 insertions(+), 22 deletions(-) rename app/src/androidTest/java/org/emstrack/{hospital => ambulance}/ExampleInstrumentedTest.java (95%) rename app/src/main/java/org/emstrack/{hospital => ambulance}/AmbulanceApp.java (96%) rename app/src/main/java/org/emstrack/{hospital => ambulance}/AmbulanceListActivity.java (98%) rename app/src/main/java/org/emstrack/{hospital => ambulance}/LoginActivity.java (99%) rename app/src/main/java/org/emstrack/{hospital => ambulance}/dialogs/LogoutDialog.java (93%) rename app/src/main/java/org/emstrack/{hospital => ambulance}/interfaces/DataListener.java (75%) rename app/src/test/java/org/emstrack/{hospital => ambulance}/ExampleUnitTest.java (92%) diff --git a/app/src/androidTest/java/org/emstrack/hospital/ExampleInstrumentedTest.java b/app/src/androidTest/java/org/emstrack/ambulance/ExampleInstrumentedTest.java similarity index 95% rename from app/src/androidTest/java/org/emstrack/hospital/ExampleInstrumentedTest.java rename to app/src/androidTest/java/org/emstrack/ambulance/ExampleInstrumentedTest.java index 85a1a14e..d7e6d542 100644 --- a/app/src/androidTest/java/org/emstrack/hospital/ExampleInstrumentedTest.java +++ b/app/src/androidTest/java/org/emstrack/ambulance/ExampleInstrumentedTest.java @@ -1,4 +1,4 @@ -package org.emstrack.hospital; +package org.emstrack.ambulance; import android.content.Context; import android.support.test.InstrumentationRegistry; diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d1a686eb..f17fb692 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,12 +1,12 @@ + package="org.emstrack.ambulance"> - @@ -22,7 +22,7 @@ - diff --git a/app/src/main/java/org/emstrack/hospital/AmbulanceApp.java b/app/src/main/java/org/emstrack/ambulance/AmbulanceApp.java similarity index 96% rename from app/src/main/java/org/emstrack/hospital/AmbulanceApp.java rename to app/src/main/java/org/emstrack/ambulance/AmbulanceApp.java index 35cf3812..c5a24e56 100644 --- a/app/src/main/java/org/emstrack/hospital/AmbulanceApp.java +++ b/app/src/main/java/org/emstrack/ambulance/AmbulanceApp.java @@ -1,4 +1,4 @@ -package org.emstrack.hospital; +package org.emstrack.ambulance; import android.app.Application; diff --git a/app/src/main/java/org/emstrack/hospital/AmbulanceListActivity.java b/app/src/main/java/org/emstrack/ambulance/AmbulanceListActivity.java similarity index 98% rename from app/src/main/java/org/emstrack/hospital/AmbulanceListActivity.java rename to app/src/main/java/org/emstrack/ambulance/AmbulanceListActivity.java index cecbd6a3..58a83c29 100644 --- a/app/src/main/java/org/emstrack/hospital/AmbulanceListActivity.java +++ b/app/src/main/java/org/emstrack/ambulance/AmbulanceListActivity.java @@ -1,4 +1,4 @@ -package org.emstrack.hospital; +package org.emstrack.ambulance; import java.util.ArrayList; import java.util.List; @@ -17,7 +17,7 @@ import android.widget.Toast; import android.util.Log; -import org.emstrack.hospital.dialogs.LogoutDialog; +import org.emstrack.ambulance.dialogs.LogoutDialog; import org.emstrack.models.AmbulancePermission; import org.emstrack.mqtt.MqttProfileClient; diff --git a/app/src/main/java/org/emstrack/hospital/LoginActivity.java b/app/src/main/java/org/emstrack/ambulance/LoginActivity.java similarity index 99% rename from app/src/main/java/org/emstrack/hospital/LoginActivity.java rename to app/src/main/java/org/emstrack/ambulance/LoginActivity.java index 451a0b8a..5ca4dfe2 100644 --- a/app/src/main/java/org/emstrack/hospital/LoginActivity.java +++ b/app/src/main/java/org/emstrack/ambulance/LoginActivity.java @@ -1,4 +1,4 @@ -package org.emstrack.hospital; +package org.emstrack.ambulance; import android.app.Activity; import android.app.ProgressDialog; diff --git a/app/src/main/java/org/emstrack/hospital/dialogs/LogoutDialog.java b/app/src/main/java/org/emstrack/ambulance/dialogs/LogoutDialog.java similarity index 93% rename from app/src/main/java/org/emstrack/hospital/dialogs/LogoutDialog.java rename to app/src/main/java/org/emstrack/ambulance/dialogs/LogoutDialog.java index 6b1279ff..c4b785e2 100644 --- a/app/src/main/java/org/emstrack/hospital/dialogs/LogoutDialog.java +++ b/app/src/main/java/org/emstrack/ambulance/dialogs/LogoutDialog.java @@ -1,4 +1,4 @@ -package org.emstrack.hospital.dialogs; +package org.emstrack.ambulance.dialogs; import android.app.Dialog; import android.app.DialogFragment; @@ -10,9 +10,9 @@ import android.util.Log; import org.eclipse.paho.client.mqttv3.MqttException; -import org.emstrack.hospital.AmbulanceApp; -import org.emstrack.hospital.LoginActivity; -import org.emstrack.hospital.R; +import org.emstrack.ambulance.AmbulanceApp; +import org.emstrack.ambulance.LoginActivity; +import org.emstrack.ambulance.R; import org.emstrack.mqtt.MqttProfileClient; /** diff --git a/app/src/main/java/org/emstrack/hospital/interfaces/DataListener.java b/app/src/main/java/org/emstrack/ambulance/interfaces/DataListener.java similarity index 75% rename from app/src/main/java/org/emstrack/hospital/interfaces/DataListener.java rename to app/src/main/java/org/emstrack/ambulance/interfaces/DataListener.java index 518b6974..b06b93f2 100644 --- a/app/src/main/java/org/emstrack/hospital/interfaces/DataListener.java +++ b/app/src/main/java/org/emstrack/ambulance/interfaces/DataListener.java @@ -1,4 +1,4 @@ -package org.emstrack.hospital.interfaces; +package org.emstrack.ambulance.interfaces; /** * Created by Fabian Choi on 5/30/2017. diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index ef88110a..33aeafe3 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -10,7 +10,7 @@ android:focusableInTouchMode="true" - tools:context="org.emstrack.hospital.LoginActivity"> + tools:context="org.emstrack.ambulance.LoginActivity"> Date: Wed, 21 Feb 2018 15:53:07 -0800 Subject: [PATCH 003/129] Adding activities into CleanApp. --- app/build.gradle | 3 +- app/src/main/AndroidManifest.xml | 5 + .../ambulance/AmbulanceListActivity.java | 19 +- .../org/emstrack/ambulance/LoginActivity.java | 2 + .../org/emstrack/ambulance/MainActivity.java | 232 ++++++++++++++++++ .../java/org/emstrack/ambulance/Pager.java | 52 ++++ .../fragments/DispatcherActivity.java | 184 ++++++++++++++ .../ambulance/fragments/GPSActivity.java | 137 +++++++++++ .../ambulance/fragments/HospitalActivity.java | 61 +++++ .../main/res/drawable-xhdpi/button_states.xml | 9 + app/src/main/res/drawable-xhdpi/drawable.xml | 4 + .../main/res/drawable-xhdpi/imagebuttons.xml | 7 + app/src/main/res/drawable-xhdpi/nav_img.png | Bin 0 -> 3747 bytes .../main/res/drawable-xhdpi/panicbutton.png | Bin 0 -> 68882 bytes .../main/res/layout/activity_dispatcher.xml | 124 ++++++++++ app/src/main/res/layout/activity_gps.xml | 49 ++++ app/src/main/res/layout/activity_hospital.xml | 25 ++ app/src/main/res/layout/activity_main.xml | 96 ++++++++ app/src/main/res/layout/nav_header.xml | 18 ++ app/src/main/res/menu/drawer_view.xml | 14 ++ .../main/res/menu/menu_saved_locations.xml | 10 + app/src/main/res/values-b+es/strings.xml | 7 +- app/src/main/res/values/colors.xml | 4 + app/src/main/res/values/dimens.xml | 6 + app/src/main/res/values/strings.xml | 7 +- app/src/main/res/values/styles.xml | 22 +- 26 files changed, 1081 insertions(+), 16 deletions(-) create mode 100644 app/src/main/java/org/emstrack/ambulance/MainActivity.java create mode 100644 app/src/main/java/org/emstrack/ambulance/Pager.java create mode 100644 app/src/main/java/org/emstrack/ambulance/fragments/DispatcherActivity.java create mode 100644 app/src/main/java/org/emstrack/ambulance/fragments/GPSActivity.java create mode 100644 app/src/main/java/org/emstrack/ambulance/fragments/HospitalActivity.java create mode 100644 app/src/main/res/drawable-xhdpi/button_states.xml create mode 100644 app/src/main/res/drawable-xhdpi/drawable.xml create mode 100644 app/src/main/res/drawable-xhdpi/imagebuttons.xml create mode 100644 app/src/main/res/drawable-xhdpi/nav_img.png create mode 100644 app/src/main/res/drawable-xhdpi/panicbutton.png create mode 100644 app/src/main/res/layout/activity_dispatcher.xml create mode 100644 app/src/main/res/layout/activity_gps.xml create mode 100644 app/src/main/res/layout/activity_hospital.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/nav_header.xml create mode 100644 app/src/main/res/menu/drawer_view.xml create mode 100644 app/src/main/res/menu/menu_saved_locations.xml diff --git a/app/build.gradle b/app/build.gradle index f024ae8a..d66264ef 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,7 +4,7 @@ android { compileSdkVersion 27 buildToolsVersion '27.0.3' defaultConfig { - applicationId 'org.emstrack.hospital' + applicationId 'org.emstrack.ambulance' minSdkVersion 16 targetSdkVersion 27 versionCode 1 @@ -43,6 +43,7 @@ dependencies { compile 'com.android.support:recyclerview-v7:27.0.2' compile 'com.android.support:support-v4:27.0.2' compile 'com.daimajia.swipelayout:library:1.2.0@aar' + compile 'com.android.support:design:27.0.2' compile project(':models') compile project(':mqtt') diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f17fb692..27f16a82 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,6 +4,7 @@ + + + + diff --git a/app/src/main/java/org/emstrack/ambulance/AmbulanceListActivity.java b/app/src/main/java/org/emstrack/ambulance/AmbulanceListActivity.java index 58a83c29..83203344 100644 --- a/app/src/main/java/org/emstrack/ambulance/AmbulanceListActivity.java +++ b/app/src/main/java/org/emstrack/ambulance/AmbulanceListActivity.java @@ -4,6 +4,7 @@ import java.util.List; import android.content.DialogInterface; +import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; @@ -37,6 +38,7 @@ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_hospital_list); +/* // Action bar getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); getSupportActionBar().setDisplayShowCustomEnabled(true); @@ -52,6 +54,7 @@ public void onClick(View v) { ld.show(getFragmentManager(), "logout_dialog"); } }); +*/ // Retrieve ambulances final MqttProfileClient profileClient = ((AmbulanceApp) getApplication()).getProfileClient(); @@ -111,18 +114,10 @@ public void onClick(View v) { int ambulanceId = selectedAmbulance.getAmbulanceId(); - // START GPS - AlertDialog alertDialog = new AlertDialog.Builder(AmbulanceListActivity.this).create(); - alertDialog.setTitle("GPS"); - alertDialog.setMessage("Start GPS"); - alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, - getResources().getString(R.string.alert_button_positive_text), - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }); - alertDialog.show(); + // Set the static list of HospitalEquipment in Dashboard + Intent intent = new Intent(AmbulanceListActivity.this, MainActivity.class); + intent.putExtra("SELECTED_AMBULANCE_ID", Integer.toString(selectedAmbulance.getAmbulanceId())); + startActivity(intent); } }); diff --git a/app/src/main/java/org/emstrack/ambulance/LoginActivity.java b/app/src/main/java/org/emstrack/ambulance/LoginActivity.java index 5ca4dfe2..c1181259 100644 --- a/app/src/main/java/org/emstrack/ambulance/LoginActivity.java +++ b/app/src/main/java/org/emstrack/ambulance/LoginActivity.java @@ -40,6 +40,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); +/* // Action bar getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); getSupportActionBar().setDisplayShowCustomEnabled(true); @@ -47,6 +48,7 @@ protected void onCreate(Bundle savedInstanceState) { View view = getSupportActionBar().getCustomView(); ImageView imageButton= view.findViewById(R.id.LogoutBtn); imageButton.setVisibility(View.GONE); +*/ // Create progress dialog progressDialog = new ProgressDialog(LoginActivity.this); diff --git a/app/src/main/java/org/emstrack/ambulance/MainActivity.java b/app/src/main/java/org/emstrack/ambulance/MainActivity.java new file mode 100644 index 00000000..de311f51 --- /dev/null +++ b/app/src/main/java/org/emstrack/ambulance/MainActivity.java @@ -0,0 +1,232 @@ +package org.emstrack.ambulance; + +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.res.Configuration; +import android.os.Bundle; +import android.support.design.widget.NavigationView; +import android.support.design.widget.TabLayout; +import android.support.v4.view.ViewPager; +import android.support.v4.widget.DrawerLayout; +import android.support.v7.app.ActionBar; +import android.support.v7.app.ActionBarDrawerToggle; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.MenuItem; +import android.view.View; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.TextView; + +import org.emstrack.mqtt.MqttProfileClient; + +/** + * This is the main activity -- the default screen + */ +public class MainActivity extends AppCompatActivity { + + private static final String TAG = MainActivity.class.getSimpleName(); + private int ambulanceId = -1; + + private DrawerLayout mDrawer; + private NavigationView nvDrawer; + private ActionBarDrawerToggle drawerToggle; + private Toolbar toolbar; + static TextView statusText; + private ImageButton panicButton; + private String titleText; + + + /** + * @param savedInstanceState + */ + @Override + protected void onCreate(Bundle savedInstanceState) { + + super.onCreate(savedInstanceState); + + setContentView(R.layout.activity_main); + + // Get data from Login and place it into the ambulance + ambulanceId = Integer + .parseInt(getIntent().getStringExtra("SELECTED_AMBULANCE_ID")); + + statusText = (TextView) findViewById(R.id.statusText); + statusText.setText(titleText); + panicButton = (ImageButton) findViewById(R.id.panicButton); + panicButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + panicPopUp(); + } + }); + + // Set a Toolbar to replace the ActionBar. + toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + // getSupportActionBar().setDisplayShowTitleEnabled(false); + + // Find our drawer view + mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout); + drawerToggle = setupDrawerToggle(); + mDrawer.addDrawerListener(drawerToggle); + + // Find our drawer view + nvDrawer = (NavigationView) findViewById(R.id.nvView); + // Setup drawer view + setupDrawerContent(nvDrawer); + + //set up TabLayout Structure + TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout_home); + tabLayout.addTab(tabLayout.newTab().setText("Dispatcher")); + tabLayout.addTab(tabLayout.newTab().setText("Hospital")); +// tabLayout.addTab(tabLayout.newTab().setText("GPS")); + + //pager + final ViewPager viewPager = (ViewPager) findViewById(R.id.pager); + tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); + + //Setup Adapter for tabLayout + final Pager adapter = new Pager(getSupportFragmentManager(), tabLayout.getTabCount()); + viewPager.setAdapter(adapter); + + + viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); + tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + viewPager.setCurrentItem(tab.getPosition()); + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + } + }); + +// ambulanceApp.mqttMaster(); +// titleText = currAmbulance.getLicensePlate() + " - " + ambulanceApp.getCurrStatus(); +// statusText.setText(titleText); + +/* + + // Retrieve client + final MqttProfileClient profileClient = ((AmbulanceApp) getApplication()).getProfileClient(); + + // Subscribe to ambulance to retrieve data + + // Test that Ambulance class made it through + currAmbulance = (Ambulance) getIntent().getSerializableExtra("AmbulanceClass"); + + if(currAmbulance != null) { + Log.d("MAIN_ACTIVITY", "AmbulancePassed: " + currAmbulance.getLicensePlate() + " ID: " + currAmbulance.getId()); + + titleText = currAmbulance.getLicensePlate() + " - " + ambulanceApp.getCurrStatus(); + Log.d("MAIN_TITLE", titleText); + } +*/ + + } + + + //Hamburger Menu setup + private ActionBarDrawerToggle setupDrawerToggle(){ + return new ActionBarDrawerToggle(this, mDrawer, toolbar, R.string.drawer_open, R.string.drawer_close); + } + + //Hamburger Menu Listener + private void setupDrawerContent(NavigationView navigationView) { + navigationView.setNavigationItemSelectedListener( + new NavigationView.OnNavigationItemSelectedListener() { + @Override + public boolean onNavigationItemSelected(MenuItem menuItem) { + selectDrawerItem(menuItem); + return true; + } + }); + } + + //Start selected activity in Hamburger + public void selectDrawerItem(MenuItem menuItem) { + + Class activityClass; + switch(menuItem.getItemId()) { + case R.id.home: + activityClass = MainActivity.class; + break; + case R.id.logout: + //ambulanceApp.setUserLoggedIn(false); + //ambulanceApp.logout(); + activityClass = LoginActivity.class; + break; + default: + activityClass = MainActivity.class; + } + + // Highlight the selected item has been done by NavigationView + menuItem.setChecked(true); + + Intent i = new Intent(this, activityClass); + //i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + + if(menuItem.getItemId() == R.id.logout){ + finish(); + startActivity(i); + } + + menuItem.setChecked(false); + + // Close the navigation drawer + mDrawer.closeDrawers(); + } + + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + // Sync the toggle state after onRestoreInstanceState has occurred. + drawerToggle.syncState(); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + // Pass any configuration change to the drawer toggles + drawerToggle.onConfigurationChanged(newConfig); + } + + public void panicPopUp(){ + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setCancelable(true); + builder.setTitle("PANIC!"); + builder.setMessage("Message"); + builder.setPositiveButton("Confirm", + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + } + }); + builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + } + }); + + AlertDialog dialog = builder.create(); + dialog.show(); + } + + static void updateStatus(String newStatus){ + // statusText.setText(currAmbulance.getLicensePlate() + " - " + newStatus); + } + @Override + public void onBackPressed() { + finish(); + } + +} \ No newline at end of file diff --git a/app/src/main/java/org/emstrack/ambulance/Pager.java b/app/src/main/java/org/emstrack/ambulance/Pager.java new file mode 100644 index 00000000..df5ede21 --- /dev/null +++ b/app/src/main/java/org/emstrack/ambulance/Pager.java @@ -0,0 +1,52 @@ +package org.emstrack.ambulance; + +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentStatePagerAdapter; + +import org.emstrack.ambulance.fragments.DispatcherActivity; +import org.emstrack.ambulance.fragments.GPSActivity; +import org.emstrack.ambulance.fragments.HospitalActivity; + +/** + * Created by mauricio on 2/21/18. + */ + +public class Pager extends FragmentStatePagerAdapter { + + int numberOfTabs; + + public Pager(FragmentManager fm, int NumOfTabs) { + + super(fm); + + this.numberOfTabs = NumOfTabs; + + } + + @Override + public Fragment getItem(int position) { + + switch (position) { + + case 0: + return new DispatcherActivity(); + + case 1: + return new HospitalActivity(); + + case 2: + return new GPSActivity(); + + default: + return null; + + } + } + + @Override + public int getCount() { + return numberOfTabs; + } + +} \ No newline at end of file diff --git a/app/src/main/java/org/emstrack/ambulance/fragments/DispatcherActivity.java b/app/src/main/java/org/emstrack/ambulance/fragments/DispatcherActivity.java new file mode 100644 index 00000000..7b88178f --- /dev/null +++ b/app/src/main/java/org/emstrack/ambulance/fragments/DispatcherActivity.java @@ -0,0 +1,184 @@ +package org.emstrack.ambulance.fragments; + +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; + +import org.emstrack.ambulance.R; + +import static android.content.ContentValues.TAG; + +/** + * Created by justingil1748 on 4/26/17. + */ + +public class DispatcherActivity extends Fragment implements View.OnClickListener { + + View rootView; + Button mapButton; + static TextView addressText; + +/* + GPSTracker gps; + DispatcherCall dCall; +*/ + + //GoogleMap mGoogleMap; + //Button addressButton; + //EditText addressSearchText; + //Marker marker; + + + //Dispatcher page + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + + rootView = inflater.inflate(R.layout.activity_dispatcher, container, false); + + mapButton = (Button) rootView.findViewById(R.id.gmap); + mapButton.setOnClickListener(this); + + addressText = ((TextView) rootView.findViewById(R.id.address)); + // addressText.setText(AmbulanceApp.globalAddress); + + /* + addressButton = (Button) rootView.findViewById(R.id.addressButton); + addressButton.setOnClickListener(this); + addressSearchText = (EditText) rootView.findViewById(R.id.addressSearch); + marker = null; + + if (googleService()) { + SupportMapFragment fragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map); + fragment.getMapAsync(this); + } + */ + + return rootView; + + } + + public static void updateAddress(String msg) { + Log.d(TAG, "updateAddress: message re1"); + // addressText.setText(AmbulanceApp.globalAddress); + Log.d(TAG, "updateAddress: message re2"); + } + + /* + Functionality of google map button + */ + @Override + public void onClick(View v) { + + if(v == mapButton){ + +/* + gps = new GPSTracker(rootView.getContext(), 500, -1); + gps.getLastKnownLocationIfAllowed(); + gps.getLocation(); + + String dispatchLong = getLong(); + String dispatchLat = getLatitude(); + + double lat = gps.getLatitude(); // returns latitude + double lon = gps.getLongitude(); // returns longitude + + LocationPoint loc = new LocationPoint(lon, lat); + + String geoUri = "http://maps.google.com/maps?q=loc:" + dispatchLat + "," + dispatchLong + " (" + loc + ")"; + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(geoUri)); + startActivity(intent); +*/ + + } + /* + else if(v == addressButton){ + geoLocate(); + } + */ + } + + + /* + public boolean googleService(){ + GoogleApiAvailability api = GoogleApiAvailability.getInstance(); + int isAvailable = api.isGooglePlayServicesAvailable(getActivity()); + + if(isAvailable == ConnectionResult.SUCCESS){ + return true; + } + else{ + return false; + } + + } + */ + + +/* + @Override + public void onMapReady(GoogleMap googleMap) { + mGoogleMap = googleMap; + goToLocationZoom(32.8693185, -117.2130499, 15); + mGoogleMap.setMyLocationEnabled(true); + } + + private void goToLocation(double lat, double lon) { + LatLng location = new LatLng(lat, lon); + CameraUpdate update = CameraUpdateFactory.newLatLng(location); + mGoogleMap.moveCamera(update); + } + + private void goToLocationZoom(double lat, double lon, float zoom) { + LatLng location = new LatLng(lat, lon); + CameraUpdate update = CameraUpdateFactory.newLatLngZoom(location, zoom); + mGoogleMap.moveCamera(update); + + mGoogleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() { + @Override + public void onMapClick(LatLng point) { + if(marker != null) + marker.remove(); + else + marker = mGoogleMap.addMarker(new MarkerOptions().position(point)); + } + }); + + } + + public void geoLocate(){ + String location = addressSearchText.getText().toString(); + Geocoder gc = new Geocoder(getActivity()); + List list = null; + + try { + list = gc.getFromLocationName(location + ", Tijuana, Mexico", 5); + } catch (IOException e) { + e.printStackTrace(); + } + + if(list.size() > 0) { + Address address = list.get(0); + String locality = address.getLocality(); + //Toast.makeText(getActivity(), locality, Toast.LENGTH_SHORT).show(); + double lat = address.getLatitude(); + double lon = address.getLongitude(); + goToLocationZoom(lat, lon, 15); + + if (marker != null) { + marker.remove(); + } + + MarkerOptions options = new MarkerOptions().title(locality).position(new LatLng(lat, lon)); + marker = mGoogleMap.addMarker(options); + } + else{ + Toast.makeText(getActivity(), "Can't find the address", Toast.LENGTH_SHORT).show(); + } + */ +} diff --git a/app/src/main/java/org/emstrack/ambulance/fragments/GPSActivity.java b/app/src/main/java/org/emstrack/ambulance/fragments/GPSActivity.java new file mode 100644 index 00000000..8b53f505 --- /dev/null +++ b/app/src/main/java/org/emstrack/ambulance/fragments/GPSActivity.java @@ -0,0 +1,137 @@ +package org.emstrack.ambulance.fragments; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CompoundButton; +import android.widget.Switch; +import android.widget.TextView; + +import org.emstrack.ambulance.R; + + +/** + * Java Class AND ACTIVITY + * implements code for the GPSActivity Activity + * Methods for lists and buttons are here. + * + * TODO + * Location Point should probably be its own entity. + * + * Then when the LP is used to store data inside the phone, there + * might be a method specific to the I/O that will parse the + * LP Object. Or, LP might have the toString method modified + * so that when we print to the file, we can just call the + * toString method, and the save the time. + * + * The stack that will try to continually push most recent + * data to the server might use the LP's method that will + * return a new JSONObject. + */ +public class GPSActivity extends Fragment implements CompoundButton.OnCheckedChangeListener{ + + Switch trackByTime; // The switch for clock enable. + Switch trackByDistance; + View rootView; + + // GPSTracker gpsTracker; + + /* + * Default method + * Always called when an activity is created. + * @param savedInstanceState + */ @Override + + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + + rootView = inflater.inflate(R.layout.activity_gps, container, false); + + //checkLocationPermission(); //Might be needed, might not. + + // gpsTracker = new GPSTracker(rootView.getContext(), 500, -1); + // gpsTracker.setLatLongTextView((TextView) rootView.findViewById(R.id.LatLongText)); + + //Determine whether to listen by dist changed or time changed + trackByTime = (Switch) rootView.findViewById(R.id.trackByTimeSwitch); + trackByTime.setOnCheckedChangeListener(this); + + trackByDistance = (Switch) rootView.findViewById(R.id.trackByDistanceSwitch); + trackByDistance.setOnCheckedChangeListener(this); + + return rootView; + } + + + @Override + public void onPause() { + System.err.println("onPause: GPSActivity"); + super.onPause(); // This is required for some reason. + } + + @Override + public void onStop(){ + System.err.println("onStop: GPSActivity"); + trackByTime.setChecked(false); + super.onStop(); // Same. + } + + @Override + public void onDestroy() { + System.err.print("onDestroy: GPSActivity"); + trackByTime.setChecked(false); + super.onDestroy(); // Same. + } + + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + + if (isChecked) { + + //determine what was turned on + switch (buttonView.getId()) { + +/* + case R.id.trackByTimeSwitch: //turn on tracking by time + //gpsTracker.turnOff(); + long currDistanceTracking = gpsTracker.getMinDistanceChangeForUpdates(); + gpsTracker = new GPSTracker(rootView.getContext(), currDistanceTracking, -1); + gpsTracker.setLatLongTextView((TextView) rootView.findViewById(R.id.LatLongText)); + break; + case R.id.trackByDistanceSwitch: //turn on tracking by distance + //gpsTracker.turnOff(); + long currTimeTracking = gpsTracker.getMinTimeBWUpdates(); + gpsTracker = new GPSTracker(rootView.getContext(), -1, currTimeTracking); + gpsTracker.setLatLongTextView((TextView) rootView.findViewById(R.id.LatLongText)); + break; +*/ + default: + + } + + } else { // something was turned off + + switch (buttonView.getId()) { +/* + case R.id.trackByTimeSwitch: //turn off tracking by time + gpsTracker.turnOff(); + long currDistanceTracking = gpsTracker.getMinDistanceChangeForUpdates(); + //continue tracking by distance + gpsTracker = new GPSTracker(rootView.getContext(), 0, currDistanceTracking); + break; + case R.id.trackByDistanceSwitch: //turn off tracking by distance + gpsTracker.turnOff(); + long currTimeTracking = gpsTracker.getMinTimeBWUpdates(); + //continue tracking by time + gpsTracker = new GPSTracker(rootView.getContext(), currTimeTracking, 0); + break; +*/ + default: + } + } + + } +} + + diff --git a/app/src/main/java/org/emstrack/ambulance/fragments/HospitalActivity.java b/app/src/main/java/org/emstrack/ambulance/fragments/HospitalActivity.java new file mode 100644 index 00000000..e36f936c --- /dev/null +++ b/app/src/main/java/org/emstrack/ambulance/fragments/HospitalActivity.java @@ -0,0 +1,61 @@ +package org.emstrack.ambulance.fragments; + + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ExpandableListView; +import android.widget.ListView; +import android.widget.Toast; + +import org.emstrack.ambulance.R; +import org.emstrack.models.HospitalPermission; + +import java.util.ArrayList; + +/** + * This class is purely meant to demonstrate that the information is able to send + * to the server. The website is: + * + * http://cruzroja.ucsd.edu/ambulances/info/123456 + * + * + */ +public class HospitalActivity extends Fragment { + + View rootView; + ListView listView; + + private ArrayList hospitalList; + private ExpandableListView hospitalExpandableList; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + + rootView = inflater.inflate(R.layout.activity_hospital, container, false); + +/* + hospitalList = Hospital.getHospitals(); + + if (hospitalList == null) { + return rootView; + } + + HospitalAdapter adapter = new HospitalAdapter(rootView.getContext(), hospitalList); + hospitalExpandableList = (ExpandableListView) rootView.findViewById(R.id.equipment_listview); + hospitalExpandableList.setAdapter(adapter); +*/ + + return rootView; + } + + public void onClick(View v) { + if(v == listView){ + Toast.makeText(rootView.getContext(), + "Click ListItem Number " , Toast.LENGTH_LONG) + .show(); + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-xhdpi/button_states.xml b/app/src/main/res/drawable-xhdpi/button_states.xml new file mode 100644 index 00000000..a6c42136 --- /dev/null +++ b/app/src/main/res/drawable-xhdpi/button_states.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-xhdpi/drawable.xml b/app/src/main/res/drawable-xhdpi/drawable.xml new file mode 100644 index 00000000..a8b409b1 --- /dev/null +++ b/app/src/main/res/drawable-xhdpi/drawable.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-xhdpi/imagebuttons.xml b/app/src/main/res/drawable-xhdpi/imagebuttons.xml new file mode 100644 index 00000000..716793c6 --- /dev/null +++ b/app/src/main/res/drawable-xhdpi/imagebuttons.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-xhdpi/nav_img.png b/app/src/main/res/drawable-xhdpi/nav_img.png new file mode 100644 index 0000000000000000000000000000000000000000..5ae312a746c3b4907640f48669ca50fe36e03ed9 GIT binary patch literal 3747 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/panicbutton.png b/app/src/main/res/drawable-xhdpi/panicbutton.png new file mode 100644 index 0000000000000000000000000000000000000000..369347328c9c0579a65837790e43f64bb44e9dc3 GIT binary patch literal 68882 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≪JYQr_zNT){38qGVr#~OhrB9EG2--lX&Dj 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%0A}fcg9XDZu#wBf*P3C`>-C@jxxF)7 z`}N|aEs!s<=>kZS}QY2JEo#SFiTHBIQD`;>5`Kdg;w(mJE^hu6@xvx|23Lo zu`32h5$46@=ngc&eN$y4Xc%pE?Hbe3(NSwvRsX-+9;5{_6yTR{zXug`9IU=H42K3> zBzN7Lk!8r0lxAJ*{B$bv!^lb;!07O2haeVN>xNSx|>H2ab+))mAQ z|4X)0cv%HynhPP85~BrXdmOZwlWpUZXVIf$Y7}hHLWA7S-LTH*0CM@zXBzPC2yc^Z zuivWh>p1j}=-s}P`=8_H4XZ1k&K`TYrmbSfOU}PBh8nL}OA3+&XhGFFw*(nr2QZ{W zJX}p!^uQ7YfF(l!_nX8dc0DspxS5qgoM}^(n)vL;KdZtZoRAb~$U>2Q@T3yc*)|=d z;?=(QGbMC?bK&yk6W(8Rgylp|_{f%3N4O&3>0SUxI4VFwONQmskh$BqIdgLLawl+Z zl-@td*^tVm{VN(<^txg$+3?K4Rg&VI&p9o?x+=*5BUa5Zv$3Xq=SH@qL+Vn<&)81nO`ne9B2G^9IM-VsoAeSCZ>w7M4Jux9GjpC$*WBYy6m zy~7MBYTzQLEe!;@6>9ZWjDz^l{pIkm(f4oP*!#C63kuD40()aC8XL3TZFJZ;-2Hq_ z^!>1;t3t2}1yg@>QPn|L%W(msMRh8uL-Y@XQSYA*!rIjpOEMi_C2KZgP`YaP8~vl{ z9?%xC#?xMX07*UG3Z&RP?fIU9;0+REsG|EVE|VC}3Yq?k3@eyf-9_20#PL~;`H6i& z{pinGmiB#s?d4(81Tyt>X;k(+Cg@`W4;4L5yQlBqf zohpFEpLu&~~#f->Y~@oXOD8P#bY`ptYr?MO>@X6|T;@1y>1NrsI(F zrpQ2syixzv}aGutp#!x29ZLjI$sx3o?9UAtjEpX>)7II4_F$m zAKC|B9#^M_52ip$3Hb@C`-x_Q(bT5}Aq#GZIQ)g-hVrir7j|=GVwnlZ z-p0RU$2C*2dH7ehLumViV?>S$u%32*e-B;zQZ0lYD}-acd4rGsPQC;jSIHqdW)=J{*&Gp+KY%s&@P*?eF4Hfw5z8 z-s6iCVPBhk-h2su@&WuxF?9O{n9~if@%@@)=nU@3e+u<~2;bF6A>vY%iOt?)Mp2 z@to{^U{oL7YICkn7@&4+;QC3bdFngyYc7W;m!lG0t-m&1f)Y<3_V4C-ns&cAP2Sod z)2r7w_pYfx+%luzAt`pYw+Sp!e^?k35-tp|57mp@iKuXvq_jP?;d&Nqk8Ti0os{Zu zK>I!VxpCCN1o6MwTZ_gLrq-ATK^yLTUUyf!fH%8QYY zzI?V1KV2K$a8221Y-$1-S9o0K!OPBZP^f4?5Z$=IziVJ@eA~08eLL;Almb1v!v>JC zFwcJvm((wh`T+9fwZq7B)xRR`UXwL#w)_x<9^T~;?sPquKx^PXPL4WH?wxWoCZ?uB zU`RIxg9?u#GUQnZk$<^F{#*3(#Cut0Lh24SHXML`!sI~w$#U1rYi)VcLNwlIx`Br1 zb_tT&6m!KI$Ht`+{3z=1ZIt;va4(eT+$kqE*1`%OUd(C0%s+;N*vsKL)SgS4SKd_F zjsOZKb3kjT`A74e`M62Zi!XPd0XlU*Gt(dzZ`rZQ1p1h?0eEaQqw10Z&DF}vR62yh z*}GQ1EvPhphrZ*%l`R(_7Lr6I(Tq7&ZW2_&L?R*^!5@^jn|!8?ARQUd10zvL;j2H?0vvQO;J65z1Cm>fuOke5=I=xv zZxwSy?EVV5pEoNOz+8WNl(hqHutm-G^~(ho7y^}=cP}a{=V*`dwA(Asi-&=)tnZLy z z4+b<=P>co-^92B$GY!;(ky0uIEQ#V0?^#bkfE~1L=6rx0OeC=66yZ6Bf#QJehPkQr1G6?uwxoo6eqv;s)f4cjJ A{{R30 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_dispatcher.xml b/app/src/main/res/layout/activity_dispatcher.xml new file mode 100644 index 00000000..19a37a11 --- /dev/null +++ b/app/src/main/res/layout/activity_dispatcher.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + +