legacy
sh123 2022-07-27 18:24:14 +03:00
rodzic 384be9fcc4
commit dcb6dedf80
7 zmienionych plików z 258 dodań i 17 usunięć

Wyświetl plik

@ -40,6 +40,9 @@
<activity
android:name=".settings.BluetoothSettingsActivity"
android:configChanges="orientation|screenSize" />
<activity
android:name=".settings.AprsSymbolSelectionActivity"
android:configChanges="orientation|screenSize" />
<activity
android:name=".recorder.RecorderActivity"
android:configChanges="orientation|screenSize" />

Wyświetl plik

@ -3,15 +3,16 @@ package com.radio.codec2talkie.protocol.aprs.tools;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.util.Log;
import android.util.DisplayMetrics;
import android.widget.ImageView;
import com.radio.codec2talkie.R;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Locale;
public class AprsSymbolTable {
@ -19,10 +20,22 @@ public class AprsSymbolTable {
private final ArrayList<Bitmap> _secondaryTableIcons;
private final ArrayList<Bitmap> _overlayTableIcons;
private final ArrayList<Bitmap> _primaryTableIconsLarge;
private final ArrayList<Bitmap> _secondaryTableIconsLarge;
private final ArrayList<Bitmap> _overlayTableIconsLarge;
private final int _cellWidth = 24;
private final int _cellHeight = 24;
private final int _cntWidth = 16;
private final int _cntHeight = 6;
private final int _cellWidthLarge = 64;
private final int _cellHeightLarge = 64;
private static final int _cntWidth = 16;
private static final int _cntHeight = 6;
private static final int _selectorIconDim = 64;
private static final double _selectionIconScale = 2.0;
private static AprsSymbolTable _symbolTable;
@ -47,32 +60,58 @@ public class AprsSymbolTable {
ImageView imageViewOverlay = new ImageView(context);
imageViewOverlay.setImageResource(R.drawable.aprs_symbols_24_2);
_overlayTableIcons = Load(imageViewOverlay, _cellWidth, _cellHeight, _cntWidth, _cntHeight);
ImageView imageViewPrimaryLarge = new ImageView(context);
imageViewPrimaryLarge.setImageResource(R.drawable.aprs_symbols_64_0);
_primaryTableIconsLarge = Load(imageViewPrimaryLarge, _cellWidthLarge, _cellHeightLarge, _cntWidth, _cntHeight);
ImageView imageViewSecondaryLarge = new ImageView(context);
imageViewSecondaryLarge.setImageResource(R.drawable.aprs_symbols_64_1);
_secondaryTableIconsLarge = Load(imageViewSecondaryLarge, _cellWidthLarge, _cellHeightLarge, _cntWidth, _cntHeight);
ImageView imageViewOverlayLarge = new ImageView(context);
imageViewOverlayLarge.setImageResource(R.drawable.aprs_symbols_64_2);
_overlayTableIconsLarge = Load(imageViewOverlayLarge, _cellWidthLarge, _cellHeightLarge, _cntWidth, _cntHeight);
}
public Bitmap bitmapFromSymbol(String symbolCode) {
public Bitmap bitmapFromSymbol(String symbolCode, boolean useLarge) {
if (symbolCode.length() != 2) return null;
ArrayList<Bitmap> _primaryTable = useLarge ? _primaryTableIconsLarge : _primaryTableIcons;
ArrayList<Bitmap> _secondaryTable = useLarge ? _secondaryTableIconsLarge : _secondaryTableIcons;
ArrayList<Bitmap> _overlayTable = useLarge ? _overlayTableIconsLarge : _overlayTableIcons;
char table = symbolCode.charAt(0);
char symbol = symbolCode.charAt(1);
int symbolIconIndex = (int)symbol - 33;
int overlayIconIndex = (int)table - 33;
if (symbolIconIndex < 0 || symbolIconIndex >= (_cntWidth * _cntHeight)) return null;
if (table == '/') {
return _primaryTableIcons.get(symbolIconIndex);
return _primaryTable.get(symbolIconIndex);
} else if (table == '\\') {
return _secondaryTableIcons.get(symbolIconIndex);
return _secondaryTable.get(symbolIconIndex);
}
if (overlayIconIndex < 0 || overlayIconIndex >= (_cntWidth * _cntHeight)) return null;
Bitmap icon = _secondaryTableIcons.get(symbolIconIndex);
Bitmap overlayIcon = _overlayTableIcons.get(overlayIconIndex);
Bitmap bmOverlay = Bitmap.createBitmap(icon.getWidth() * 2, icon.getHeight() * 2, icon.getConfig());
Bitmap icon = _secondaryTable.get(symbolIconIndex);
Bitmap overlayIcon = _overlayTable.get(overlayIconIndex);
Bitmap bmOverlay = Bitmap.createBitmap(icon.getWidth(), icon.getHeight(), null);
bmOverlay.setDensity(DisplayMetrics.DENSITY_DEFAULT);
Canvas canvas = new Canvas(bmOverlay);
Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG);
canvas.drawBitmap(icon, 0, 0, paint);
canvas.drawBitmap(overlayIcon, 0, 0, paint);
return bmOverlay;
}
private ArrayList<Bitmap> Load(ImageView imageView, int cellWidth, int cellHeight, int cntWidth, int cntHeight) {
private static ArrayList<Bitmap> Load(ImageView imageView, int cellWidth, int cellHeight, int cntWidth, int cntHeight) {
ArrayList<Bitmap> bitmaps = new ArrayList<>(cntWidth * cntHeight);
BitmapDrawable bitmapDrawable = (BitmapDrawable) imageView.getDrawable();
Bitmap bitmap = bitmapDrawable.getBitmap();
@ -85,4 +124,49 @@ public class AprsSymbolTable {
}
return bitmaps;
}
public static String getSymbolFromCoordinate(float x, float y, int parentWidth, int parentHeight) {
int cntX = (int) (parentWidth / (_selectorIconDim * _selectionIconScale));
int cntY = 2 * _cntWidth * _cntHeight / cntX;
int posX = (int) (x * cntX) / parentWidth;
int posY = (int) (y * cntY) / parentHeight;
int index = cntX * posY + posX;
int count = _cntHeight * _cntWidth;
char tbl = index < count ? '/' : '\\';
char sym = index < count ? (char)(index + 33) : (char)(index + 33 - count);
return String.format(Locale.US, "%c%c", tbl, sym);
}
public static Bitmap generateSelectionTable(Context context, int parentWidth) {
double cntXDouble = parentWidth / (_selectorIconDim * _selectionIconScale);
int cntX = (int)Math.floor(cntXDouble);
int cntY = _cntWidth * _cntHeight / cntX;
ImageView imageViewPrimary = new ImageView(context);
imageViewPrimary.setImageResource(R.drawable.aprs_symbols_64_0);
ArrayList<Bitmap> primaryTableIcons = Load(imageViewPrimary, _selectorIconDim, _selectorIconDim, _cntWidth, _cntHeight);
ImageView imageViewSecondary = new ImageView(context);
imageViewSecondary.setImageResource(R.drawable.aprs_symbols_64_1);
ArrayList<Bitmap> secondaryTableIcons = Load(imageViewSecondary, _selectorIconDim, _selectorIconDim, _cntWidth, _cntHeight);
primaryTableIcons.addAll(secondaryTableIcons);
Bitmap bmOverlay = Bitmap.createBitmap(_selectorIconDim*cntX, _selectorIconDim*cntY*2, null);
bmOverlay.setDensity(DisplayMetrics.DENSITY_DEFAULT);
Canvas canvas = new Canvas(bmOverlay);
Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG);
for (int y = 0; y < 2*cntY; y++) {
for (int x = 0; x < cntX; x++) {
int index = cntX * y + x;
if (index >= primaryTableIcons.size()) break;
Bitmap icon = primaryTableIcons.get(index);
canvas.drawBitmap(icon, x*_selectorIconDim, y*_selectorIconDim, paint);
}
}
return bmOverlay;
}
}

Wyświetl plik

@ -0,0 +1,89 @@
package com.radio.codec2talkie.settings;
import android.annotation.SuppressLint;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.PreferenceManager;
import com.radio.codec2talkie.R;
import com.radio.codec2talkie.protocol.aprs.tools.AprsSymbolTable;
public class AprsSymbolSelectionActivity extends AppCompatActivity {
private SharedPreferences _sharedPreferences;
private ImageView _currentSelectionView;
private TextView _currentSelectionText;
private String _currentSymbolCode;
@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle(R.string.aprs_symbol_title);
setContentView(R.layout.activity_aprs_symbol_selection);
_sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
ImageView selectionView = findViewById(R.id.settings_aprs_symbol_image_view);
selectionView.getViewTreeObserver().addOnGlobalLayoutListener(() -> selectionView.setImageBitmap(
AprsSymbolTable.generateSelectionTable(selectionView.getContext(), selectionView.getWidth())));
selectionView.setOnTouchListener(_onTouchListener);
_currentSelectionView = findViewById(R.id.settings_aprs_symbol_image_selected);
_currentSymbolCode = _sharedPreferences.getString(PreferenceKeys.APRS_SYMBOL, "/$");
Bitmap currentSymbolBitmap = AprsSymbolTable.getInstance(this).bitmapFromSymbol(_currentSymbolCode, true);
_currentSelectionView.setImageBitmap(currentSymbolBitmap);
_currentSelectionText = findViewById(R.id.settings_aprs_symbol_text);
_currentSelectionText.setText(_currentSymbolCode);
Button okBtn = findViewById(R.id.settings_aprs_symbol_button_ok);
okBtn.setOnClickListener(v -> {
SharedPreferences.Editor editor = _sharedPreferences.edit();
editor.putString(PreferenceKeys.APRS_SYMBOL, _currentSymbolCode);
editor.apply();
finish();
});
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) actionBar.setDisplayHomeAsUpEnabled(true);
}
private final View.OnTouchListener _onTouchListener = (v, event) -> {
if(event.getAction() == MotionEvent.ACTION_UP) {
float x = event.getX();
float y = event.getY();
_currentSymbolCode = AprsSymbolTable.getSymbolFromCoordinate(x, y, v.getWidth(), v.getHeight());
_currentSelectionText.setText(_currentSymbolCode);
Log.i("---", _currentSymbolCode);
Bitmap currentSymbolBitmap = AprsSymbolTable.getInstance(this).bitmapFromSymbol(_currentSymbolCode, true);
_currentSelectionView.setImageBitmap(currentSymbolBitmap);
v.performClick();
}
return true;
};
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId();
if (itemId == android.R.id.home) {
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
}

Wyświetl plik

@ -65,7 +65,7 @@ public class LogItemGroupHolder extends RecyclerView.ViewHolder {
group.getStatus(),
group.getComment()));
String symbol = group.getSymbolCode();
Bitmap iconBitmap = _symbolTable.bitmapFromSymbol(symbol);
Bitmap iconBitmap = _symbolTable.bitmapFromSymbol(symbol, false);
if (iconBitmap == null) {
Log.e(TAG, "Cannot load bitmap for " + symbol);
} else {

Wyświetl plik

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".settings.AprsSymbolSelectionActivity">
<ScrollView
android:id="@+id/settings_aprs_symbol_scroll_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:scrollbarAlwaysDrawVerticalTrack="true"
app:layout_constraintBottom_toTopOf="@+id/settings_aprs_symbol_button_ok"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/settings_aprs_symbol_image_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:contentDescription="@string/settings_aprs_symbol_image_view_description"
android:scaleType="centerCrop"
android:scrollbars="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</ScrollView>
<ImageView
android:id="@+id/settings_aprs_symbol_image_selected"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:contentDescription="@string/settings_aprs_symbol_image_view_description"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/settings_aprs_symbol_scroll_view" />
<TextView
android:id="@+id/settings_aprs_symbol_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/settings_aprs_symbol_button_ok"
app:layout_constraintTop_toBottomOf="@+id/settings_aprs_symbol_scroll_view" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/settings_aprs_symbol_button_ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/ok"
android:textAllCaps="false"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/settings_aprs_symbol_scroll_view" />
</androidx.constraintlayout.widget.ConstraintLayout>

Wyświetl plik

@ -290,4 +290,5 @@
<string name="log_view_station_history">Station history</string>
<string name="log_item_group_holder_unknown_km">\? km</string>
<string name="log_view_group_item_icon_description">APRS icon</string>
<string name="settings_aprs_symbol_image_view_description">APRS symbols</string>
</resources>

Wyświetl plik

@ -242,15 +242,17 @@
app:defaultValue="WIDE1-1">
</EditTextPreference>
<ListPreference
<Preference
app:key="aprs_symbol"
app:title="@string/aprs_symbol_title"
app:entries="@array/aprs_symbol_labels"
app:entryValues="@array/aprs_symbol_values"
app:summary="%s"
app:summary="@string/aprs_symbol_summary"
app:dependency="aprs_enable"
app:defaultValue="/$">
</ListPreference>
<intent
android:targetPackage="com.radio.codec2talkie"
android:targetClass="com.radio.codec2talkie.settings.AprsSymbolSelectionActivity">
</intent>
</Preference>
<EditTextPreference
app:key="aprs_comment"