Use a service for TACNET Connection instead of an app thread

This commit is contained in:
2020-11-10 12:18:11 -06:00
parent 4a685cf9d9
commit 8f4bf8f7ae
5 changed files with 52 additions and 9 deletions

View File

@@ -7,6 +7,7 @@
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<application

View File

@@ -41,14 +41,21 @@ public class TACNETConnectionService extends Service {
@Override
public void onDestroy() {
disconnect();
stopForeground(true);
}
private void connect() {
if (!Backend.instance().tacnet().isConnected()) {
final String hostname = Backend.instance().getSettings().hostname;
final int port = Backend.instance().getSettings().port;
Backend.instance().tacnet().connect(hostname, port);
}
}
private void disconnect() {
Backend.instance().stopServer();
Backend.instance().tacnet().close();
}
private void foregroundify() {
@@ -57,7 +64,8 @@ public class TACNETConnectionService extends Service {
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("TACNET Connection is running")
.setContentTitle("TACNET Connection")
.setContentText("Connected to: " + Backend.instance().getSettings().hostname + ":" + Backend.instance().getSettings().port)
.setSmallIcon(R.drawable.tacnet)
.setContentIntent(pendingIntent);
Notification notification = builder.build();

View File

@@ -6,7 +6,8 @@ import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.net.DhcpInfo;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.IBinder;
import android.util.Log;
@@ -17,12 +18,19 @@ import org.timecrafters.TimeCraftersConfigurationTool.MainActivity;
import org.timecrafters.TimeCraftersConfigurationTool.R;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Backend;
import java.math.BigInteger;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.ByteOrder;
import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;
public class TACNETServerService extends Service {
private static final String CHANNEL_ID = "TACNET_SERVER_SERVICE";
private static final String TAG = "TACNETServerService";
private static final int ID = 8962_0;
private Intent intent;
private String address;
public TACNETServerService() {
}
@@ -34,10 +42,12 @@ public class TACNETServerService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
this.intent = intent;
createNotificationChannel();
foregroundify();
startServer();
foregroundify();
return START_REDELIVER_INTENT;
}
@@ -53,6 +63,8 @@ public class TACNETServerService extends Service {
if (Backend.instance().getServer() == null) {
Log.i(TAG, "Starting server...");
Backend.instance().startServer();
findAddress();
}
}
@@ -60,13 +72,34 @@ public class TACNETServerService extends Service {
Backend.instance().stopServer();
}
private void findAddress() {
final WifiManager manager = (WifiManager) super.getSystemService(WIFI_SERVICE);
final DhcpInfo dhcp = manager.getDhcpInfo();
int ipAddress = dhcp.ipAddress;
/* https://stackoverflow.com/a/54825244 */
ipAddress = (ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN)) ?
Integer.reverseBytes(ipAddress) : ipAddress;
byte[] ipAddressByte = BigInteger.valueOf(ipAddress).toByteArray();
try {
InetAddress myAddr = InetAddress.getByAddress(ipAddressByte);
address = myAddr.getHostAddress();
} catch (UnknownHostException e) {
e.printStackTrace();
}
Log.i(TAG, "" + address);
}
private void foregroundify() {
Intent notificationIntent = new Intent(this, MainActivity.class);
notificationIntent.putExtra("navigate_to_tacnet", true);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("TACNET server is running")
.setContentTitle("TACNET Server")
.setContentText("Running at: " + address + ":" + Backend.instance().getSettings().port)
.setSmallIcon(R.drawable.tacnet)
.setContentIntent(pendingIntent);
Notification notification = builder.build();

View File

@@ -20,6 +20,7 @@ import org.timecrafters.TimeCraftersConfigurationTool.R;
import org.timecrafters.TimeCraftersConfigurationTool.backend.Backend;
import org.timecrafters.TimeCraftersConfigurationTool.backend.TACNET;
import org.timecrafters.TimeCraftersConfigurationTool.library.TimeCraftersFragment;
import org.timecrafters.TimeCraftersConfigurationTool.tacnet.TACNETConnectionService;
import org.timecrafters.TimeCraftersConfigurationTool.tacnet.TACNETServerService;
import org.timecrafters.TimeCraftersConfigurationTool.tacnet.support.ConnectionStatsSyncHandler;
import org.timecrafters.TimeCraftersConfigurationTool.tacnet.support.ServerStatsSyncHandler;
@@ -95,7 +96,7 @@ public class TACNETHostFragment extends TimeCraftersFragment {
public void onClick(View v) {
Backend.instance().saveSettings();
Backend.instance().tacnet().connect(hostname.getText().toString(), Integer.parseInt(port.getText().toString()));
getActivity().startService(new Intent(getContext(), TACNETConnectionService.class));
root.removeAllViews();
inflateTACNETConnectionStatus(container);
@@ -125,7 +126,7 @@ public class TACNETHostFragment extends TimeCraftersFragment {
disconnect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Backend.instance().tacnet().close();
getActivity().stopService(new Intent(getContext(), TACNETConnectionService.class));
Backend.instance().stopErrorSound();
connectionStatsSyncHandler.stop();

View File

@@ -1,6 +1,6 @@
#Sun Oct 25 13:32:16 CDT 2020
#Tue Nov 10 11:51:46 CST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip