Show distance to station

legacy
sh123 2022-07-24 14:04:32 +03:00
rodzic 1d80b2f371
commit e2fccd300e
8 zmienionych plików z 70 dodań i 17 usunięć

Wyświetl plik

@ -60,6 +60,31 @@ public class Position {
return Math.sqrt(distance);
}
public static double distanceTo(double lat1, double lon1, double alt1, double lat2, double lon2, double alt2) {
Position pos1 = new Position();
pos1.latitude = lat1;
pos1.longitude = lon1;
pos1.altitudeMeters = alt1;
Position pos2 = new Position();
pos2.latitude = lat2;
pos2.longitude = lon2;
pos2.altitudeMeters = alt2;
return pos1.distanceTo(pos2);
}
public static String bearing(double lat1, double lon1, double lat2, double lon2) {
double radians = Math.atan2(lat2 - lat1, lon2 - lon1);
double degrees = radians * (180.0 / Math.PI);
String[] dirNames = {"N", "NE", "E", "SE", "S", "SW", "W", "NW", "N"};
int dirIndex = (int) Math.round(degrees / 45);
if (dirIndex < 0) {
dirIndex = dirIndex + 8;
};
return dirNames[dirIndex];
}
public PositionItem toPositionItem(boolean isTransmit) {
PositionItem positionItem = new PositionItem();
positionItem.setTimestampEpoch(System.currentTimeMillis());

Wyświetl plik

@ -41,6 +41,15 @@ public class LogItemActivity extends AppCompatActivity {
logItemRecyclerView.setHasFixedSize(true);
final LogItemAdapter adapter = new LogItemAdapter(new LogItemAdapter.LogItemDiff());
adapter.setClickListener(v -> {
if (_groupName == null) {
TextView itemView = v.findViewById(R.id.log_view_item_title);
_groupName = itemView.getText().toString();
Intent logItemIntent = new Intent(v.getContext(), LogItemActivity.class);
logItemIntent.putExtra("groupName", _groupName);
v.getContext().startActivity(logItemIntent);
}
});
logItemRecyclerView.setAdapter(adapter);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
logItemRecyclerView.setLayoutManager(linearLayoutManager);

Wyświetl plik

@ -1,5 +1,6 @@
package com.radio.codec2talkie.storage.log;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
@ -8,10 +9,16 @@ import androidx.recyclerview.widget.ListAdapter;
public class LogItemAdapter extends ListAdapter<LogItem, LogItemHolder> {
private View.OnClickListener _clickListener;
public LogItemAdapter(@NonNull DiffUtil.ItemCallback<LogItem> diffCallback) {
super(diffCallback);
}
public void setClickListener(View.OnClickListener clickListener) {
_clickListener = clickListener;
}
@NonNull
@Override
public LogItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@ -21,6 +28,7 @@ public class LogItemAdapter extends ListAdapter<LogItem, LogItemHolder> {
@Override
public void onBindViewHolder(LogItemHolder holder, int position) {
LogItem current = getItem(position);
holder.itemView.setOnClickListener(_clickListener);
holder.bind(current.getTimestampEpoch(), current.getSrcCallsign(), current.getLogLine(), current.getIsTransmit());
}

Wyświetl plik

@ -1,6 +1,5 @@
package com.radio.codec2talkie.storage.log;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -9,25 +8,21 @@ import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import com.radio.codec2talkie.R;
import com.radio.codec2talkie.storage.message.MessageItemActivity;
import com.radio.codec2talkie.tools.DateTools;
import com.radio.codec2talkie.tools.TextTools;
public class LogItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public class LogItemHolder extends RecyclerView.ViewHolder {
private final TextView _logItemViewTitle;
private final TextView _logItemViewMessage;
private String _srcCallsign;
private LogItemHolder(View itemView) {
super(itemView);
_logItemViewTitle = itemView.findViewById(R.id.log_view_item_title);
_logItemViewMessage = itemView.findViewById(R.id.log_view_item_message);
itemView.setOnClickListener(this);
}
public void bind(long timestamp, String srcCallsign, String text, boolean isTransmitting) {
_srcCallsign = srcCallsign;
_logItemViewTitle.setText(String.format("%s %s %s",
DateTools.epochToIso8601(timestamp),
isTransmitting ? "→" : "←",
@ -40,11 +35,4 @@ public class LogItemHolder extends RecyclerView.ViewHolder implements View.OnCli
R.layout.activity_log_view_item, parent, false);
return new LogItemHolder(view);
}
@Override
public void onClick(View v) {
Intent logItemIntent = new Intent(v.getContext(), LogItemActivity.class);
logItemIntent.putExtra("groupName", _srcCallsign);
v.getContext().startActivity(logItemIntent);
}
}

Wyświetl plik

@ -1,5 +1,9 @@
package com.radio.codec2talkie.storage.log.group;
import android.annotation.SuppressLint;
import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -8,6 +12,7 @@ import android.widget.TextView;
import androidx.recyclerview.widget.RecyclerView;
import com.radio.codec2talkie.R;
import com.radio.codec2talkie.protocol.position.Position;
import com.radio.codec2talkie.tools.UnitTools;
import java.util.Locale;
@ -15,18 +20,27 @@ import java.util.Locale;
public class LogItemGroupHolder extends RecyclerView.ViewHolder {
private final TextView _logItemViewTitle;
private final TextView _logItemViewDistance;
private final TextView _logItemViewMessage;
private final LocationManager _locationManager;
private LogItemGroupHolder(View itemView) {
super(itemView);
_logItemViewTitle = itemView.findViewById(R.id.log_view_group_item_title);
_logItemViewDistance = itemView.findViewById(R.id.log_view_group_item_distance);
_logItemViewMessage = itemView.findViewById(R.id.log_view_group_item_message);
_locationManager = (LocationManager) itemView.getContext().getSystemService(Context.LOCATION_SERVICE);
}
public void bind(LogItemGroup group) {
@SuppressLint("MissingPermission") Location loc = _locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
double distanceKm = Position.distanceTo(loc.getLatitude(), loc.getLongitude(), loc.getAltitude(),
group.getLatitude(), group.getLongitude(), group.getAltitudeMeters()) / 1000.0;
String bearing = Position.bearing(loc.getLatitude(), loc.getLongitude(), group.getLatitude(), group.getLongitude());
_logItemViewTitle.setText(String.format(Locale.US, "%s",
group.getSrcCallsign()));
_logItemViewMessage.setText(String.format(Locale.US, "%s %s %.4f %.4f %d° %dkm/h %dm %s %s",
_logItemViewDistance.setText(String.format(Locale.US, "%s %.1f km", bearing, distanceKm));
_logItemViewMessage.setText(String.format(Locale.US, "%s %s %.4f %.4f %03d° %03dkm/h %04dm %s %s",
group.getSymbolCode(),
group.getMaidenHead(),
group.getLatitude(),

Wyświetl plik

@ -45,7 +45,6 @@ public class Periodic implements Tracker {
Log.e(TAG, "No permissions for location access");
return;
}
_locationManager.requestSingleUpdate(
LocationManager.GPS_PROVIDER,
this::sendLocation,

Wyświetl plik

@ -9,18 +9,27 @@
<TextView
android:id="@+id/log_view_group_item_title"
style="@style/log_item_title"
android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:lines="1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/log_view_group_item_distance"
style="@style/log_item_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:lines="1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/log_view_group_item_message"
style="@style/log_item_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lines="2"
android:lines="3"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/log_view_group_item_title" />

Wyświetl plik

@ -13,6 +13,7 @@
<item name="android:layout_marginBottom">4dp</item>
<item name="android:paddingLeft">4dp</item>
<item name="android:background">@android:color/white</item>
<item name="android:fontFamily">monospace</item>
<item name="android:textColor">@color/grey</item>
<item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Small</item>
</style>