X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altosdroid%2Fapp%2Fsrc%2Fmain%2Fjava%2Forg%2Faltusmetrum%2FAltosDroid%2FSelectTrackerActivity.java;fp=altosdroid%2Fapp%2Fsrc%2Fmain%2Fjava%2Forg%2Faltusmetrum%2FAltosDroid%2FSelectTrackerActivity.java;h=aa527562238da34db5adcc28458ded08046d1df8;hp=0000000000000000000000000000000000000000;hb=79f2677143f85a2807b8d4e297f3617aafbd34da;hpb=6e3c4493cfa8d92d96808d14d1c12abb35ecb442 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 index 00000000..aa527562 --- /dev/null +++ b/altosdroid/app/src/main/java/org/altusmetrum/AltosDroid/SelectTrackerActivity.java @@ -0,0 +1,294 @@ +/* + * Copyright © 2020 Keith Packard + * + * 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 { + 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 { + 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 { + 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 { + 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 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 tracker_array = (ArrayList) 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; + } +}