Only hold weak reference to device listener, return explicit run mode.
This commit is contained in:
parent
78d2d09996
commit
69f134b5bf
1 changed files with 20 additions and 8 deletions
|
@ -5,13 +5,14 @@ import java.util.UUID
|
||||||
import android.app.Service
|
import android.app.Service
|
||||||
import android.bluetooth.{BluetoothAdapter, BluetoothDevice, BluetoothSocket}
|
import android.bluetooth.{BluetoothAdapter, BluetoothDevice, BluetoothSocket}
|
||||||
import android.content.{BroadcastReceiver, Context, Intent, IntentFilter}
|
import android.content.{BroadcastReceiver, Context, Intent, IntentFilter}
|
||||||
import android.os.IBinder
|
import android.os.{Handler, IBinder}
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
|
import com.nutomic.ensichat.bluetooth.Device.ID
|
||||||
import com.nutomic.ensichat.{Message, R}
|
import com.nutomic.ensichat.{Message, R}
|
||||||
import android.os.Handler
|
|
||||||
|
|
||||||
import scala.collection.immutable.{HashMap, Set}
|
import scala.collection.immutable.{HashMap, Set}
|
||||||
|
import scala.ref.WeakReference
|
||||||
|
|
||||||
object ChatService {
|
object ChatService {
|
||||||
|
|
||||||
|
@ -32,8 +33,8 @@ class ChatService extends Service {
|
||||||
|
|
||||||
private var bluetoothAdapter: BluetoothAdapter = _
|
private var bluetoothAdapter: BluetoothAdapter = _
|
||||||
|
|
||||||
private var deviceListener: Set[Map[Device.ID, Device] => Unit] =
|
private var deviceListener: Set[WeakReference[Map[Device.ID, Device] => Unit]] =
|
||||||
Set[Map[Device.ID, Device] => Unit]()
|
Set[WeakReference[Map[Device.ID, Device] => Unit]]()
|
||||||
|
|
||||||
private var devices: HashMap[Device.ID, Device] = new HashMap[Device.ID, Device]()
|
private var devices: HashMap[Device.ID, Device] = new HashMap[Device.ID, Device]()
|
||||||
|
|
||||||
|
@ -64,13 +65,19 @@ class ChatService extends Service {
|
||||||
ListenThread.start()
|
ListenThread.start()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override def onStartCommand(intent: Intent, flags: Int, startId: Int): Int = {
|
||||||
|
return Service.START_STICKY
|
||||||
|
}
|
||||||
|
|
||||||
override def onBind(intent: Intent): IBinder = {
|
override def onBind(intent: Intent): IBinder = {
|
||||||
return Binder
|
return Binder
|
||||||
}
|
}
|
||||||
|
|
||||||
override def onDestroy(): Unit = {
|
override def onDestroy(): Unit = {
|
||||||
|
super.onDestroy()
|
||||||
ListenThread.cancel()
|
ListenThread.cancel()
|
||||||
isDestroyed = true
|
isDestroyed = true
|
||||||
|
unregisterReceiver(mReceiver)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -101,7 +108,6 @@ class ChatService extends Service {
|
||||||
new Device(intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE), false)
|
new Device(intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE), false)
|
||||||
devices = devices + (device.id -> device)
|
devices = devices + (device.id -> device)
|
||||||
new ConnectThread(device, onConnected).start()
|
new ConnectThread(device, onConnected).start()
|
||||||
deviceListener.foreach(d => d(devices))
|
|
||||||
case _ =>
|
case _ =>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -111,7 +117,7 @@ class ChatService extends Service {
|
||||||
* Registers a listener that is called whenever a new device is connected.
|
* Registers a listener that is called whenever a new device is connected.
|
||||||
*/
|
*/
|
||||||
def registerDeviceListener(listener: Map[Device.ID, Device] => Unit): Unit = {
|
def registerDeviceListener(listener: Map[Device.ID, Device] => Unit): Unit = {
|
||||||
deviceListener = deviceListener + listener
|
deviceListener = deviceListener + new WeakReference[(Map[ID, Device]) => Unit](listener)
|
||||||
listener(devices)
|
listener(devices)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,7 +125,9 @@ class ChatService extends Service {
|
||||||
* Unregisters a device listener.
|
* Unregisters a device listener.
|
||||||
*/
|
*/
|
||||||
def unregisterDeviceListener(listener: Map[Device.ID, Device] => Unit): Unit = {
|
def unregisterDeviceListener(listener: Map[Device.ID, Device] => Unit): Unit = {
|
||||||
deviceListener = deviceListener - listener
|
deviceListener.foreach(l =>
|
||||||
|
if (l == listener)
|
||||||
|
deviceListener = deviceListener - l)
|
||||||
}
|
}
|
||||||
|
|
||||||
def onConnected(device: Device, socket: BluetoothSocket): Unit = {
|
def onConnected(device: Device, socket: BluetoothSocket): Unit = {
|
||||||
|
@ -127,7 +135,11 @@ class ChatService extends Service {
|
||||||
devices = devices + (device.id -> updatedDevice)
|
devices = devices + (device.id -> updatedDevice)
|
||||||
connections = connections + (device.id -> new TransferThread(updatedDevice, socket, onReceive))
|
connections = connections + (device.id -> new TransferThread(updatedDevice, socket, onReceive))
|
||||||
connections(device.id).start()
|
connections(device.id).start()
|
||||||
deviceListener.foreach(d => d(devices))
|
deviceListener.foreach(d =>
|
||||||
|
if (d != null)
|
||||||
|
d.apply()(devices)
|
||||||
|
else
|
||||||
|
deviceListener = deviceListener - d)
|
||||||
}
|
}
|
||||||
|
|
||||||
def send(device: Device.ID, message: Message): Unit = {
|
def send(device: Device.ID, message: Message): Unit = {
|
||||||
|
|
Reference in a new issue