Fix another crash and some reformatting

This commit is contained in:
edr
2023-10-01 00:52:43 +02:00
parent d1e7c1b239
commit f98526b4fb
3 changed files with 118 additions and 230 deletions

View File

@@ -35,8 +35,7 @@ import android.widget.ListView;
import android.widget.Toast;
public class DiscoverActivity extends Activity
{
public class DiscoverActivity extends Activity {
private static final String PREF_KEY_CHILD_DEVICE_ADDRESS = "childDeviceAddress";
private static final String PREF_KEY_CHILD_DEVICE_PORT = "childDevicePort";
final String TAG = "ChildMonitor";
@@ -46,8 +45,7 @@ public class DiscoverActivity extends Activity
NsdManager.DiscoveryListener _discoveryListener;
@Override
protected void onCreate(Bundle savedInstanceState)
{
protected void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "ChildMonitor start");
_nsdManager = (NsdManager)this.getSystemService(Context.NSD_SERVICE);
@@ -56,34 +54,18 @@ public class DiscoverActivity extends Activity
setContentView(R.layout.activity_discover);
final Button discoverChildButton = (Button) findViewById(R.id.discoverChildButton);
discoverChildButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
loadDiscoveryViaMdns();
}
});
discoverChildButton.setOnClickListener(v -> loadDiscoveryViaMdns());
final Button enterChildAddressButton = (Button) findViewById(R.id.enterChildAddressButton);
enterChildAddressButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
loadDiscoveryViaAddress();
}
});
enterChildAddressButton.setOnClickListener(v -> loadDiscoveryViaAddress());
}
private void loadDiscoveryViaMdns()
{
private void loadDiscoveryViaMdns() {
setContentView(R.layout.activity_discover_mdns);
startServiceDiscovery("_childmonitor._tcp.");
}
private void loadDiscoveryViaAddress()
{
private void loadDiscoveryViaAddress() {
setContentView(R.layout.activity_discover_address);
final Button connectButton = (Button) findViewById(R.id.connectViaAddressButton);
@@ -98,48 +80,41 @@ public class DiscoverActivity extends Activity
portField.setText(String.valueOf(preferredPort));
}
connectButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
connectButton.setOnClickListener(v -> {
Log.i(TAG, "Connecting to child device via address");
final String addressString = addressField.getText().toString();
final String portString = portField.getText().toString();
if(addressString.length() == 0)
{
Log.i(TAG, "Connecting to child device via address");
final String addressString = addressField.getText().toString();
final String portString = portField.getText().toString();
if(addressString.length() == 0)
{
Toast.makeText(DiscoverActivity.this, R.string.invalidAddress, Toast.LENGTH_LONG).show();
return;
}
int port = 0;
try
{
port = Integer.parseInt(portString);
}
catch(NumberFormatException e)
{
Toast.makeText(DiscoverActivity.this, R.string.invalidPort, Toast.LENGTH_LONG).show();
return;
}
SharedPreferences.Editor preferencesEditor = getPreferences(MODE_PRIVATE).edit();
preferencesEditor.putString(PREF_KEY_CHILD_DEVICE_ADDRESS, addressString);
preferencesEditor.putInt(PREF_KEY_CHILD_DEVICE_PORT, port);
preferencesEditor.apply();
connectToChild(addressString, port, addressString);
Toast.makeText(DiscoverActivity.this, R.string.invalidAddress, Toast.LENGTH_LONG).show();
return;
}
int port = 0;
try
{
port = Integer.parseInt(portString);
}
catch(NumberFormatException e)
{
Toast.makeText(DiscoverActivity.this, R.string.invalidPort, Toast.LENGTH_LONG).show();
return;
}
SharedPreferences.Editor preferencesEditor = getPreferences(MODE_PRIVATE).edit();
preferencesEditor.putString(PREF_KEY_CHILD_DEVICE_ADDRESS, addressString);
preferencesEditor.putInt(PREF_KEY_CHILD_DEVICE_PORT, port);
preferencesEditor.apply();
connectToChild(addressString, port, addressString);
});
}
@Override
protected void onDestroy()
{
protected void onDestroy() {
Log.i(TAG, "ChildMonitoring stop");
if(_discoveryListener != null)
{
if(_discoveryListener != null) {
Log.i(TAG, "Unregistering monitoring service");
_nsdManager.stopServiceDiscovery(_discoveryListener);
@@ -149,8 +124,7 @@ public class DiscoverActivity extends Activity
super.onDestroy();
}
public void startServiceDiscovery(final String serviceType)
{
public void startServiceDiscovery(final String serviceType) {
final NsdManager nsdManager = (NsdManager)this.getSystemService(Context.NSD_SERVICE);
if (nsdManager == null) {
Log.e(TAG, "Could not obtain nsdManager");
@@ -163,17 +137,15 @@ public class DiscoverActivity extends Activity
final WifiManager.MulticastLock multicastLock = wifi.createMulticastLock("multicastLock");
multicastLock.setReferenceCounted(true);
multicastLock.acquire();
multicastReleaser = new Runnable() {
@Override
public void run() {
multicastReleaser = () -> {
try {
multicastLock.release();
} catch (Exception ignored) {
//dont really care
}
};
} else {
multicastReleaser = new Runnable() {
@Override
public void run() {
}
multicastReleaser = () -> {
};
}
@@ -184,20 +156,13 @@ public class DiscoverActivity extends Activity
R.layout.available_children_list);
serviceTable.setAdapter(availableServicesAdapter);
serviceTable.setOnItemClickListener(new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id)
{
final ServiceInfoWrapper info = (ServiceInfoWrapper) parent.getItemAtPosition(position);
connectToChild(info.getAddress(), info.getPort(), info.getName());
}
serviceTable.setOnItemClickListener((parent, view, position, id) -> {
final ServiceInfoWrapper info = (ServiceInfoWrapper) parent.getItemAtPosition(position);
connectToChild(info.getAddress(), info.getPort(), info.getName());
});
// Instantiate a new DiscoveryListener
_discoveryListener = new NsdManager.DiscoveryListener()
{
_discoveryListener = new NsdManager.DiscoveryListener() {
// Called as soon as service discovery begins.
@Override
public void onDiscoveryStarted(String regType)
@@ -210,50 +175,34 @@ public class DiscoverActivity extends Activity
// A service was found! Do something with it.
Log.d(TAG, "Service discovery success: " + service);
if (!service.getServiceType().equals(serviceType))
{
if (!service.getServiceType().equals(serviceType)) {
// Service type is the string containing the protocol and
// transport layer for this service.
Log.d(TAG, "Unknown Service Type: " + service.getServiceType());
}
else if (service.getServiceName().contains("ChildMonitor"))
{
NsdManager.ResolveListener resolver = new NsdManager.ResolveListener()
{
} else if (service.getServiceName().contains("ChildMonitor")) {
NsdManager.ResolveListener resolver = new NsdManager.ResolveListener() {
@Override
public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode)
{
public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
// Called when the resolve fails. Use the error code to debug.
Log.e(TAG, "Resolve failed: error " + errorCode + " for service: " + serviceInfo);
}
@Override
public void onServiceResolved(final NsdServiceInfo serviceInfo)
{
public void onServiceResolved(final NsdServiceInfo serviceInfo) {
Log.i(TAG, "Resolve Succeeded: " + serviceInfo);
DiscoverActivity.this.runOnUiThread(new Runnable()
{
@Override
public void run()
{
availableServicesAdapter.add(new ServiceInfoWrapper(serviceInfo));
}
});
DiscoverActivity.this.runOnUiThread(() -> availableServicesAdapter.add(new ServiceInfoWrapper(serviceInfo)));
}
};
_nsdManager.resolveService(service, resolver);
}
else
{
} else {
Log.d(TAG, "Unknown Service name: " + service.getServiceName());
}
}
@Override
public void onServiceLost(NsdServiceInfo service)
{
public void onServiceLost(NsdServiceInfo service) {
// When the network service is no longer available.
// Internal bookkeeping code goes here.
Log.e(TAG, "Service lost: " + service);
@@ -261,23 +210,20 @@ public class DiscoverActivity extends Activity
}
@Override
public void onDiscoveryStopped(String serviceType)
{
public void onDiscoveryStopped(String serviceType) {
Log.i(TAG, "Discovery stopped: " + serviceType);
multicastReleaser.run();
}
@Override
public void onStartDiscoveryFailed(String serviceType, int errorCode)
{
public void onStartDiscoveryFailed(String serviceType, int errorCode) {
Log.e(TAG, "Discovery failed: Error code: " + errorCode);
nsdManager.stopServiceDiscovery(this);
multicastReleaser.run();
}
@Override
public void onStopDiscoveryFailed(String serviceType, int errorCode)
{
public void onStopDiscoveryFailed(String serviceType, int errorCode) {
Log.e(TAG, "Discovery failed: Error code: " + errorCode);
nsdManager.stopServiceDiscovery(this);
multicastReleaser.run();
@@ -285,7 +231,8 @@ public class DiscoverActivity extends Activity
};
nsdManager.discoverServices(
serviceType, NsdManager.PROTOCOL_DNS_SD, _discoveryListener);
serviceType, NsdManager.PROTOCOL_DNS_SD, _discoveryListener
);
}
/**
@@ -295,8 +242,7 @@ public class DiscoverActivity extends Activity
* @param port
* @param name
*/
private void connectToChild(final String address, final int port, final String name)
{
private void connectToChild(final String address, final int port, final String name) {
final Intent i = new Intent(getApplicationContext(), ListenActivity.class);
final Bundle b = new Bundle();
b.putString("address", address);
@@ -307,8 +253,7 @@ public class DiscoverActivity extends Activity
}
}
class ServiceInfoWrapper
{
class ServiceInfoWrapper {
private NsdServiceInfo _info;
public ServiceInfoWrapper(NsdServiceInfo info)
{
@@ -325,8 +270,7 @@ class ServiceInfoWrapper
return _info.getPort();
}
public String getName()
{
public String getName() {
// If there is more than one service on the network, it will
// have a number at the end, but will appear as the following:
// "ChildMonitor\\032(number)

View File

@@ -33,8 +33,7 @@ import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class ListenActivity extends Activity
{
public class ListenActivity extends Activity {
final String TAG = "ChildMonitor";
// Sets an ID for the notification
final static int mNotificationId = 1;
@@ -51,8 +50,7 @@ public class ListenActivity extends Activity
private final int bufferSize = AudioTrack.getMinBufferSize(frequency, channelConfiguration, audioEncoding);
private final int byteBufferSize = bufferSize*2;
private void streamAudio(final Socket socket, AudioListener listener) throws IllegalArgumentException, IllegalStateException, IOException
{
private void streamAudio(final Socket socket, AudioListener listener) throws IllegalArgumentException, IllegalStateException, IOException {
Log.i(TAG, "Setting up stream");
final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
@@ -69,38 +67,31 @@ public class ListenActivity extends Activity
audioTrack.play();
try
{
try {
final byte [] readBuffer = new byte[byteBufferSize];
final short [] decodedBuffer = new short[byteBufferSize*2];
while(socket.isConnected() && read != -1 && Thread.currentThread().isInterrupted() == false)
{
while(socket.isConnected() && read != -1 && !Thread.currentThread().isInterrupted()) {
read = is.read(readBuffer);
int decoded = CODEC.decode(decodedBuffer, readBuffer, read, 0);
if(decoded > 0)
{
if(decoded > 0) {
audioTrack.write(decodedBuffer, 0, decoded);
short[] decodedBytes = new short[decoded];
System.arraycopy(decodedBuffer, 0, decodedBytes, 0, decoded);
listener.onAudio(decodedBytes);
}
}
}
catch (Exception e) {
} catch (Exception e) {
Log.e(TAG, "Connection failed", e);
}
finally
{
} finally {
audioTrack.stop();
socket.close();
}
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final Bundle b = getIntent().getExtras();
@@ -130,66 +121,38 @@ public class ListenActivity extends Activity
final VolumeView volumeView = (VolumeView) findViewById(R.id.volume);
final AudioListener listener = new AudioListener() {
@Override
public void onAudio(final short[] audioData) {
runOnUiThread(new Runnable() {
@Override
public void run() {
volumeView.onAudioData(audioData);
}
});
final AudioListener listener = audioData -> runOnUiThread(() -> volumeView.onAudioData(audioData));
_listenThread = new Thread(() -> {
try {
final Socket socket = new Socket(_address, _port);
streamAudio(socket, listener);
} catch (IOException e) {
Log.e(TAG, "Failed to stream audio", e);
}
};
if(!Thread.currentThread().isInterrupted()) {
// If this thread has not been interrupted, likely something
// bad happened with the connection to the child device. Play
// an alert to notify the user that the connection has been
// interrupted.
playAlert();
_listenThread = new Thread(new Runnable()
{
@Override
public void run()
{
try
{
final Socket socket = new Socket(_address, _port);
streamAudio(socket, listener);
}
catch (UnknownHostException e)
{
Log.e(TAG, "Failed to stream audio", e);
}
catch (IOException e)
{
Log.e(TAG, "Failed to stream audio", e);
}
ListenActivity.this.runOnUiThread(() -> {
final TextView connectedText1 = (TextView) findViewById(R.id.connectedTo);
connectedText1.setText("");
if(Thread.currentThread().isInterrupted() == false)
{
// If this thread has not been interrupted, likely something
// bad happened with the connection to the child device. Play
// an alert to notify the user that the connection has been
// interrupted.
playAlert();
ListenActivity.this.runOnUiThread(new Runnable()
{
@Override
public void run()
{
final TextView connectedText = (TextView) findViewById(R.id.connectedTo);
connectedText.setText("");
final TextView statusText = (TextView) findViewById(R.id.textStatus);
statusText.setText(R.string.disconnected);
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(ListenActivity.this)
.setOngoing(false)
.setSmallIcon(R.drawable.listening_notification)
.setContentTitle(getString(R.string.app_name))
.setContentText(getString(R.string.disconnected));
_mNotifyMgr.notify(mNotificationId, mBuilder.build());
}
});
}
final TextView statusText1 = (TextView) findViewById(R.id.textStatus);
statusText1.setText(R.string.disconnected);
NotificationCompat.Builder mBuilder1 =
new NotificationCompat.Builder(ListenActivity.this)
.setOngoing(false)
.setSmallIcon(R.drawable.listening_notification)
.setContentTitle(getString(R.string.app_name))
.setContentText(getString(R.string.disconnected));
_mNotifyMgr.notify(mNotificationId, mBuilder1.build());
});
}
});
@@ -197,32 +160,24 @@ public class ListenActivity extends Activity
}
@Override
public void onDestroy()
{
protected void onStop() {
_listenThread.interrupt();
_listenThread = null;
super.onStop();
}
@Override
public void onDestroy() {
super.onDestroy();
}
private void playAlert()
{
private void playAlert() {
final MediaPlayer mp = MediaPlayer.create(this, R.raw.upward_beep_chromatic_fifths);
if(mp != null)
{
if(mp != null) {
Log.i(TAG, "Playing alert");
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener()
{
@Override
public void onCompletion(MediaPlayer mp)
{
mp.release();
}
});
mp.setOnCompletionListener(mp1 -> mp1.release());
mp.start();
}
else
{
} else {
Log.e(TAG, "Failed to play alert");
}
}

View File

@@ -27,8 +27,7 @@ import android.util.Log;
import android.view.View;
import android.widget.Button;
public class StartActivity extends Activity
{
public class StartActivity extends Activity {
static final String TAG = "ChildMonitor";
private final static int PERMISSIONS_REQUEST_RECORD_AUDIO = 298349824;
private final static int PERMISSIONS_REQUEST_MULTICAST = 298349825;
@@ -41,34 +40,24 @@ public class StartActivity extends Activity
setContentView(R.layout.activity_start);
final Button monitorButton = (Button) findViewById(R.id.useChildDevice);
monitorButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Log.i(TAG, "Starting up monitor");
monitorButton.setOnClickListener(v -> {
Log.i(TAG, "Starting up monitor");
if (isAudioRecordingPermissionGranted()) {
startActivity(new Intent(getApplicationContext(), MonitorActivity.class));
} else {
requestAudioPermission();
}
if (isAudioRecordingPermissionGranted()) {
startActivity(new Intent(getApplicationContext(), MonitorActivity.class));
} else {
requestAudioPermission();
}
});
final Button connectButton = (Button) findViewById(R.id.useParentDevice);
connectButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Log.i(TAG, "Starting connection activity");
if (isMulticastPermissionGranted()) {
Intent i = new Intent(getApplicationContext(), DiscoverActivity.class);
startActivity(i);
} else {
requestMulticastPermission();
}
connectButton.setOnClickListener(v -> {
Log.i(TAG, "Starting connection activity");
if (isMulticastPermissionGranted()) {
Intent i = new Intent(getApplicationContext(), DiscoverActivity.class);
startActivity(i);
} else {
requestMulticastPermission();
}
});
}