kopia lustrzana https://github.com/sh123/codec2_talkie
Show distance to station
rodzic
1d80b2f371
commit
e2fccd300e
|
@ -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());
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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" />
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
Ładowanie…
Reference in New Issue