Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 0 additions & 11 deletions .idea/deploymentTargetSelector.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import com.team3663.scouting_app.config.Constants;
import com.team3663.scouting_app.config.Globals;
import com.team3663.scouting_app.databinding.AppLaunchBinding;
import com.team3663.scouting_app.utility.CPR_Network;
import com.team3663.scouting_app.utility.dataFile.*;

import java.util.List;
Expand Down Expand Up @@ -92,6 +93,10 @@ protected void onCreate(Bundle in_savedInstanceState) {
return insets;
});

// Default to NO internet
appLaunchBinding.imageInternet.setVisibility(View.INVISIBLE);
Globals.network = new CPR_Network(this);

// Display app version
PackageInfo pInfo;
try {
Expand All @@ -118,7 +123,7 @@ protected void onCreate(Bundle in_savedInstanceState) {
boolean havePerms = !perm_list.isEmpty();

// If we have storage permissions go ahead and load the data.
// Otherwise, initiate getting permissions (which will then load the data afterwards)
// Otherwise, initiate getting permissions (which will then load the data afterward)
if (havePerms) {
Globals.baseStorageURI = Uri.parse(Globals.sp.getString(Constants.Prefs.STORAGE_URI, null));
initDataFiles();
Expand All @@ -128,7 +133,13 @@ protected void onCreate(Bundle in_savedInstanceState) {

// While loading Matches, we messed with Globals.CurrentMatchType, so reset it
Globals.CurrentMatchType = Constants.PreMatch.DEFAULT_MATCH_TYPE;
}

// check if we have access to the internet
if (Globals.network.hasActiveInternet())
appLaunchBinding.imageInternet.setVisibility(View.VISIBLE);
else
appLaunchBinding.imageInternet.setVisibility(View.INVISIBLE);
}

// =============================================================================================
// Function: initSettings
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
Expand All @@ -14,9 +15,7 @@
import com.team3663.scouting_app.R;
import com.team3663.scouting_app.config.*;
import com.team3663.scouting_app.databinding.SettingsBinding;
import com.team3663.scouting_app.fragments.SettingsPagerAdapter;
import com.team3663.scouting_app.fragments.SettingsPage1;
import com.team3663.scouting_app.fragments.SettingsPage2;
import com.team3663.scouting_app.fragments.*;
import com.google.android.material.tabs.TabLayoutMediator;

public class Settings extends AppCompatActivity {
Expand Down Expand Up @@ -70,8 +69,9 @@ private void SaveSettings() {
Intent intent = new Intent();
SettingsPage1 fragmentPage1 = adapter.getFragmentPage1();
SettingsPage2 fragmentPage2 = adapter.getFragmentPage2();
SettingsPage3 fragmentPage3 = adapter.getFragmentPage3();

// Page1 & Page2 Settings
// Page1 Settings
if (fragmentPage1 != null && fragmentPage1.binding != null) {
int CompetitionId = Globals.CompetitionList.getCompetitionId(fragmentPage1.binding.spinnerCompetition.getSelectedItem().toString());

Expand All @@ -97,7 +97,7 @@ private void SaveSettings() {
Globals.spe.putInt(Constants.Prefs.NUM_MATCHES, NumMatches);
}

// UI Settings
// Page2 Settings
if (fragmentPage2 != null && fragmentPage2.binding != null) {
int ColorId = Globals.ColorList.getColorId(fragmentPage2.binding.spinnerColor.getSelectedItem().toString());
if (ColorId > 0) {
Expand All @@ -114,6 +114,26 @@ private void SaveSettings() {
Globals.spe.putInt(Constants.Prefs.PREF_ORIENTATION, Globals.CurrentFieldOrientationPos);
}

// Page3 Settings
if (fragmentPage3 != null && fragmentPage3.binding != null) {
Editable userField;

userField = fragmentPage3.binding.editGoogleDrive.getText();
Globals.spe.putString(Constants.Prefs.GOOGLE_DRIVE, (userField != null) ? userField.toString() : "");

userField = fragmentPage3.binding.editServer.getText();
Globals.spe.putString(Constants.Prefs.SQL_SERVER, (userField != null) ? userField.toString() : "");

userField = fragmentPage3.binding.editDatabase.getText();
Globals.spe.putString(Constants.Prefs.SQL_DATABASE, (userField != null) ? userField.toString() : "");

userField = fragmentPage3.binding.editUser.getText();
Globals.spe.putString(Constants.Prefs.SQL_USER, (userField != null) ? userField.toString() : "");

userField = fragmentPage3.binding.editPassword.getText();
Globals.spe.putString(Constants.Prefs.SQL_PASSWORD, (userField != null) ? userField.toString() : "");
}

Globals.spe.apply();
setResult(RESULT_OK, intent);
finish();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,22 @@

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
Expand All @@ -35,6 +44,8 @@ public class SubmitData extends AppCompatActivity {
private SubmitDataBinding submitDataBinding;
private static final Timer achievement_timer = new Timer();
private static MediaPlayer media;
private ConnectivityManager connectivityManager;
private ConnectivityManager.NetworkCallback networkCallback;

@SuppressLint({"SetTextI18n", "MissingInflatedId"})
@Override
Expand All @@ -61,6 +72,7 @@ protected void onCreate(Bundle in_savedInstanceState) {
}

// Initialize activity components that don't log anything
initNetwork();
initMatchType();
initMatch();
initQR();
Expand All @@ -70,6 +82,15 @@ protected void onCreate(Bundle in_savedInstanceState) {
initOverride();
}

@Override
protected void onDestroy() {
super.onDestroy();
// Important: Unregister to avoid memory leaks
if (connectivityManager != null && networkCallback != null) {
connectivityManager.unregisterNetworkCallback(networkCallback);
}
}

// =============================================================================================
// Function: initMatchType
// Description: Initialize the Match Type field
Expand Down Expand Up @@ -258,6 +279,35 @@ private void closeAchievements() {
media.release();
}

// =============================================================================================
// Function: updateWifiIcon
// Description: Update the Wi-Fi signal icon with the correct signal strength level
// Parameters: in_level signal strength level
// Output: void
// =============================================================================================
private void updateWifiIcon(int in_level) {
// You would typically swap icons here based on level
// 0: No signal, 1-4: Signal bars
switch (in_level) {
case 4: submitDataBinding.imageWifiSignal.setImageResource(R.drawable.wifi_bar_4); break;
case 3: submitDataBinding.imageWifiSignal.setImageResource(R.drawable.wifi_bar_3); break;
case 2: submitDataBinding.imageWifiSignal.setImageResource(R.drawable.wifi_bar_2); break;
case 1: submitDataBinding.imageWifiSignal.setImageResource(R.drawable.wifi_bar_1); break;
default: submitDataBinding.imageWifiSignal.setImageResource(R.drawable.wifi_bar_0); break;
}

// check if we have access to the internet
if (Globals.network.hasActiveInternet()) {
submitDataBinding.imageInternet.setVisibility(View.VISIBLE);
submitDataBinding.butSendGoogle.setEnabled(true);
submitDataBinding.butSendDatabase.setEnabled(true);
} else {
submitDataBinding.imageInternet.setVisibility(View.INVISIBLE);
submitDataBinding.butSendGoogle.setEnabled(false);
submitDataBinding.butSendDatabase.setEnabled(false);
}
}

// =============================================================================================
// Function: initOverride
// Description: Override team number reset for next match
Expand Down Expand Up @@ -320,6 +370,52 @@ private void initMatch() {
if (adp_Match.getCount() > 0) submitDataBinding.spinnerMatch.setSelection(adp_Match.getCount() - 1, true);
}

// =============================================================================================
// Function: initNetwork
// Description: Initialize the network related fields and process
// Parameters: void
// Output: void
// =============================================================================================
private void initNetwork() {
// setup Wi-Fi monitoring
connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkRequest networkRequest = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.build();

networkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onCapabilitiesChanged(@NonNull Network in_network, @NonNull NetworkCapabilities in_capabilities) {
int rssi = 0;

// On API 31+, WifiInfo is part of the capabilities (requires location permission)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
WifiInfo wifiInfo = (WifiInfo) in_capabilities.getTransportInfo();
if (wifiInfo != null) rssi = wifiInfo.getRssi();
} else {
// Fallback for API 30
WifiManager wm = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
rssi = wm.getConnectionInfo().getRssi();
}

// Convert RSSI to a signal level (0 to 4)
int level = WifiManager.calculateSignalLevel(rssi, 5);

// Update UI on the main thread
runOnUiThread(() -> updateWifiIcon(level));
}

@Override
public void onLost(@NonNull Network in_network) {
// Signal lost or Wi-Fi turned off
runOnUiThread(() -> updateWifiIcon(-1));
}
};

connectivityManager.registerNetworkCallback(networkRequest, networkCallback);
}

// =============================================================================================
// Function: initQR
// Description: Initialize the QR Code field
Expand Down Expand Up @@ -347,6 +443,9 @@ private void initQR() {
// Output: void
// =============================================================================================
private void initBluetooth() {
// Until we have BT working...
submitDataBinding.butSendBT.setEnabled(false);

submitDataBinding.butSendBT.setOnClickListener(view -> {
// Reset pre-Match settings for next time
Globals.numStartingGamePiece = Constants.PreMatch.STARTING_GAME_PIECES;
Expand Down Expand Up @@ -377,6 +476,7 @@ private void initQuit() {
.setPositiveButton(getString(R.string.submit_alert_quit_positive), (dialog, which) -> {
SubmitData.this.finishAffinity();
stopLockTask();
Globals.network.shutdown();
System.exit(0);
})

Expand All @@ -403,7 +503,7 @@ private void initNext() {
Globals.affectedByDefenseValue = Constants.PostMatch.AFFECTED_BY_DEFENSE_NOT_SELECTED;
Globals.isPractice = false;

// Increases the team number so that it auto fills for the next match correctly
// Increases the team number so that it will autofill for the next match correctly
Globals.CurrentMatchNumber++;

Intent GoToPreMatch = new Intent(SubmitData.this, PreMatch.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,11 @@ public static class Prefs {
public static final String STORAGE_URI = "StorageURI";
public static final String PREF_ORIENTATION = "PreferredFieldOrientation";
public static final String QR_SIZE = "PreferredQRSize";
public static final String GOOGLE_DRIVE = "PreferredGoogleDrive";
public static final String SQL_SERVER = "PreferredSqlServer";
public static final String SQL_DATABASE = "PreferredSqlDatabase";
public static final String SQL_USER = "PreferredSqlUser";
public static final String SQL_PASSWORD = "PreferredSqlPassword";
}

public static class Settings {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.team3663.scouting_app.data.Accuracy;
import com.team3663.scouting_app.data.ClimbLevel;
import com.team3663.scouting_app.data.ClimbPosition;
import com.team3663.scouting_app.utility.CPR_Network;
import com.team3663.scouting_app.utility.Logger;
import com.team3663.scouting_app.utility.achievements.Achievements;
import com.team3663.scouting_app.utility.dataFile.*;
Expand Down Expand Up @@ -73,4 +74,6 @@ public class Globals {

public static int TransmitMatchNum;
public static String TransmitMatchType;

public static CPR_Network network;
}
Loading