altosdroid: Change tracker selection dialog
[fw/altos] / altosdroid / app / src / main / java / org / altusmetrum / AltosDroid / SelectTrackerActivity.java
diff --git a/altosdroid/app/src/main/java/org/altusmetrum/AltosDroid/SelectTrackerActivity.java b/altosdroid/app/src/main/java/org/altusmetrum/AltosDroid/SelectTrackerActivity.java
new file mode 100644 (file)
index 0000000..aa52756
--- /dev/null
@@ -0,0 +1,294 @@
+/*
+ * Copyright © 2020 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+package org.altusmetrum.AltosDroid;
+
+import java.util.*;
+import android.app.Activity;
+import android.content.*;
+import android.os.*;
+import android.util.*;
+import android.view.*;
+import android.view.View.*;
+import android.widget.*;
+import android.graphics.*;
+import android.graphics.drawable.*;
+import android.widget.CompoundButton.OnCheckedChangeListener;
+
+import org.altusmetrum.altoslib_13.*;
+
+class TrackerComparatorCall implements Comparator<Tracker> {
+       public int compare(Tracker a, Tracker b) {
+               int v;
+
+               v = a.compareCall(b);
+               if (v != 0)
+                       return v;
+               v = a.compareAge(b);
+               if (v != 0)
+                       return v;
+               v = a.compareSerial(b);
+               if (v != 0)
+                       return v;
+               return a.compareFrequency(b);
+       }
+       public boolean equals(Object o) {
+               return o instanceof TrackerComparatorCall;
+       }
+}
+
+class TrackerComparatorSerial implements Comparator<Tracker> {
+       public int compare(Tracker a, Tracker b) {
+               int v;
+
+               v = a.compareSerial(b);
+               if (v != 0)
+                       return v;
+               v = a.compareAge(b);
+               if (v != 0)
+                       return v;
+               v = a.compareCall(b);
+               if (v != 0)
+                       return v;
+               return a.compareFrequency(b);
+       }
+       public boolean equals(Object o) {
+               return o instanceof TrackerComparatorSerial;
+       }
+}
+
+class TrackerComparatorAge implements Comparator<Tracker> {
+       public int compare(Tracker a, Tracker b) {
+               int v;
+
+               v = a.compareAge(b);
+               if (v != 0)
+                       return v;
+               v = a.compareCall(b);
+               if (v != 0)
+                       return v;
+               v = a.compareSerial(b);
+               if (v != 0)
+                       return v;
+               return a.compareFrequency(b);
+       }
+       public boolean equals(Object o) {
+               return o instanceof TrackerComparatorAge;
+       }
+}
+
+class TrackerComparatorFrequency implements Comparator<Tracker> {
+       public int compare(Tracker a, Tracker b) {
+               int v;
+
+               v = a.compareFrequency(b);
+               if (v != 0)
+                       return v;
+               v = a.compareAge(b);
+               if (v != 0)
+                       return v;
+               v = a.compareCall(b);
+               if (v != 0)
+                       return v;
+               return a.compareSerial(b);
+       }
+       public boolean equals(Object o) {
+               return o instanceof TrackerComparatorFrequency;
+       }
+}
+
+public class SelectTrackerActivity extends Activity implements OnTouchListener {
+       // Return Intent extra
+       public static final String EXTRA_SERIAL_NUMBER = "serial_number";
+       public static final String EXTRA_FREQUENCY = "frequency";
+
+       private int button_ids[] = {
+               R.id.call_button,
+               R.id.serial_button,
+               R.id.frequency_button,
+               R.id.age_button
+       };
+
+       private static final int call_button = 0;
+       private static final int serial_button = 1;
+       private static final int freq_button = 2;
+       private static final int age_button = 3;
+       private RadioButton radio_buttons[] = new RadioButton[4];
+       private TableLayout table;
+
+       private Tracker[] trackers;
+
+       private void set_sort(int id) {
+               AltosDroidPreferences.set_tracker_sort(id);
+               resort();
+       }
+
+       private void resort() {
+               Comparator<Tracker> compare;
+               int tracker_sort = AltosDroidPreferences.tracker_sort();
+               AltosDebug.debug("sort %d", tracker_sort);
+               switch (tracker_sort) {
+               case call_button:
+               default:
+                       compare = new TrackerComparatorCall();
+                       break;
+               case serial_button:
+                       compare = new TrackerComparatorSerial();
+                       break;
+               case freq_button:
+                       compare = new TrackerComparatorFrequency();
+                       break;
+               case age_button:
+                       compare = new TrackerComparatorAge();
+                       break;
+               }
+               Arrays.sort(trackers, compare);
+               set_trackers();
+       }
+
+       void init_button_state() {
+               int tracker_sort = AltosDroidPreferences.tracker_sort();
+               for (int i = 0; i < 4; i++)
+                       radio_buttons[i].setChecked(i == tracker_sort);
+       }
+
+       OnCheckedChangeListener button_listener = new OnCheckedChangeListener() {
+                       @Override
+                       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+                               int id = buttonView.getId();
+                               if (isChecked) {
+                                       int sort_id = -1;
+                                       for (int i = 0; i < 4; i++) {
+                                               if (id == button_ids[i])
+                                                       sort_id = i;
+                                               else
+                                                       radio_buttons[i].setChecked(false);
+                                       }
+                                       if (sort_id != -1)
+                                               set_sort(sort_id);
+                               }
+                       }
+               };
+
+       long start_time;
+
+       private void
+       insert_tracker(Tracker tracker) {
+               TableRow row = (TableRow) getLayoutInflater().inflate(R.layout.tracker_ent, null);
+
+               ((TextView) row.findViewById(R.id.call_view)).setText(tracker.call);
+               if (tracker.serial == 0)
+                       ((TextView) row.findViewById(R.id.serial_view)).setText("");
+               else
+                       ((TextView) row.findViewById(R.id.serial_view)).setText(String.format("%d", tracker.serial));
+               if (tracker.frequency == 0.0)
+                       ((TextView) row.findViewById(R.id.frequency_view)).setText("");
+               else if (tracker.frequency == AltosLib.MISSING)
+                       ((TextView) row.findViewById(R.id.frequency_view)).setText("");
+               else
+                       ((TextView) row.findViewById(R.id.frequency_view)).setText(String.format("%7.3f", tracker.frequency));
+               if (tracker.received_time != 0) {
+                       int age = (int) ((start_time - tracker.received_time + 500) / 1000);
+                       ((TextView) row.findViewById(R.id.age_view)).setText(AltosDroid.age_string(age));
+               } else {
+                       ((TextView) row.findViewById(R.id.age_view)).setText("");
+               }
+               row.setClickable(true);
+               row.setOnTouchListener(this);
+               table.addView(row);
+       }
+
+       private void set_trackers() {
+               for (int i = table.getChildCount() - 1; i >= 1; i--)
+                       table.removeViewAt(i);
+               for (Tracker tracker : trackers)
+                       insert_tracker(tracker);
+       }
+
+       private void done(View v) {
+               int result = Activity.RESULT_CANCELED;
+               Intent intent = new Intent();
+               for (int i = 1; i < table.getChildCount(); i++) {
+                       View child = table.getChildAt(i);
+                       if (child == v) {
+                               Tracker tracker = trackers[i - 1];
+                               intent.putExtra(EXTRA_SERIAL_NUMBER, tracker.serial);
+                               intent.putExtra(EXTRA_FREQUENCY, tracker.frequency);
+                               result = Activity.RESULT_OK;
+                               break;
+                       }
+               }
+               setResult(Activity.RESULT_OK, intent);
+               finish();
+       }
+
+       @Override
+       protected void onCreate(Bundle savedInstanceState) {
+               setTheme(AltosDroid.dialog_themes[AltosDroidPreferences.font_size()]);
+               super.onCreate(savedInstanceState);
+
+               setContentView(R.layout.tracker_list);
+               // Set result CANCELED incase the user backs out
+               setResult(Activity.RESULT_CANCELED);
+
+               for (int i = 0; i < 4; i++) {
+                       radio_buttons[i] = (RadioButton) findViewById(button_ids[i]);
+                       radio_buttons[i].setOnCheckedChangeListener(button_listener);
+               }
+
+               ArrayList<Parcelable> tracker_array = (ArrayList<Parcelable>) getIntent().getParcelableArrayListExtra(AltosDroid.EXTRA_TRACKERS);
+               if (tracker_array != null) {
+                       Object[] array = tracker_array.toArray();
+                       trackers = new Tracker[array.length];
+                       for (int i = 0; i < array.length; i++)
+                               trackers[i] = (Tracker) array[i];
+               }
+
+               start_time = System.currentTimeMillis();
+
+               table = (TableLayout) findViewById(R.id.tracker_list);
+
+               init_button_state();
+
+               resort();
+
+               set_trackers();
+       }
+
+       @Override
+       public boolean onTouch(View v, MotionEvent event) {
+               int action = event.getAction() & MotionEvent.ACTION_MASK;
+               switch (action) {
+               case MotionEvent.ACTION_UP:
+               case MotionEvent.ACTION_CANCEL:
+               case MotionEvent.ACTION_OUTSIDE:
+                       v.setBackgroundColor(0);
+                       v.invalidate();
+                       break;
+               case MotionEvent.ACTION_DOWN:
+                       v.setBackgroundColor(Color.RED);
+                       v.invalidate();
+                       break;
+               }
+               if (action == MotionEvent.ACTION_UP) {
+                       done(v);
+                       return true;
+               }
+               return false;
+       }
+}