diff --git a/build.gradle b/build.gradle --- a/build.gradle +++ b/build.gradle @@ -23,10 +23,8 @@ javaMaxHeapSize "2g" } compileOptions { - // Use Java 1.7, requires minSdk 8 - //SSHD requires mina when running on JDK < 7 - sourceCompatibility JavaVersion.VERSION_1_7 - targetCompatibility JavaVersion.VERSION_1_7 + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 } sourceSets { main { diff --git a/src/org/kde/kdeconnect/Backends/LanBackend/LanLink.java b/src/org/kde/kdeconnect/Backends/LanBackend/LanLink.java --- a/src/org/kde/kdeconnect/Backends/LanBackend/LanLink.java +++ b/src/org/kde/kdeconnect/Backends/LanBackend/LanLink.java @@ -89,34 +89,31 @@ //Log.e("LanLink", "Start listening"); //Create a thread to take care of incoming data for the new socket - new Thread(new Runnable() { - @Override - public void run() { - try { - BufferedReader reader = new BufferedReader(new InputStreamReader(newSocket.getInputStream(), StringsHelper.UTF8)); - while (true) { - String packet; - try { - packet = reader.readLine(); - } catch (SocketTimeoutException e) { - continue; - } - if (packet == null) { - throw new IOException("End of stream"); - } - if (packet.isEmpty()) { - continue; - } - NetworkPacket np = NetworkPacket.unserialize(packet); - receivedNetworkPacket(np); + new Thread(() -> { + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(newSocket.getInputStream(), StringsHelper.UTF8)); + while (true) { + String packet; + try { + packet = reader.readLine(); + } catch (SocketTimeoutException e) { + continue; + } + if (packet == null) { + throw new IOException("End of stream"); } - } catch (Exception e) { - Log.i("LanLink", "Socket closed: " + newSocket.hashCode() + ". Reason: " + e.getMessage()); - try { Thread.sleep(300); } catch (InterruptedException ignored) {} // Wait a bit because we might receive a new socket meanwhile - boolean thereIsaANewSocket = (newSocket != socket); - if (!thereIsaANewSocket) { - callback.linkDisconnected(LanLink.this); + if (packet.isEmpty()) { + continue; } + NetworkPacket np = NetworkPacket.unserialize(packet); + receivedNetworkPacket(np); + } + } catch (Exception e) { + Log.i("LanLink", "Socket closed: " + newSocket.hashCode() + ". Reason: " + e.getMessage()); + try { Thread.sleep(300); } catch (InterruptedException ignored) {} // Wait a bit because we might receive a new socket meanwhile + boolean thereIsaANewSocket = (newSocket != socket); + if (!thereIsaANewSocket) { + callback.linkDisconnected(LanLink.this); } } }).start(); diff --git a/src/org/kde/kdeconnect/Backends/LanBackend/LanLinkProvider.java b/src/org/kde/kdeconnect/Backends/LanBackend/LanLinkProvider.java --- a/src/org/kde/kdeconnect/Backends/LanBackend/LanLinkProvider.java +++ b/src/org/kde/kdeconnect/Backends/LanBackend/LanLinkProvider.java @@ -221,59 +221,47 @@ if (isDeviceTrusted && !SslHelper.isCertificateStored(context, deviceId)) { //Device paired with and old version, we can't use it as we lack the certificate - BackgroundService.RunCommand(context, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - Device device = service.getDevice(deviceId); - if (device == null) return; - device.unpair(); - //Retry as unpaired - identityPacketReceived(identityPacket, socket, connectionStarted); - } + BackgroundService.RunCommand(context, service -> { + Device device = service.getDevice(deviceId); + if (device == null) return; + device.unpair(); + //Retry as unpaired + identityPacketReceived(identityPacket, socket, connectionStarted); }); } Log.i("KDE/LanLinkProvider", "Starting SSL handshake with " + identityPacket.getString("deviceName") + " trusted:" + isDeviceTrusted); final SSLSocket sslsocket = SslHelper.convertToSslSocket(context, socket, deviceId, isDeviceTrusted, clientMode); - sslsocket.addHandshakeCompletedListener(new HandshakeCompletedListener() { - @Override - public void handshakeCompleted(HandshakeCompletedEvent event) { - String mode = clientMode ? "client" : "server"; - try { - Certificate certificate = event.getPeerCertificates()[0]; - identityPacket.set("certificate", Base64.encodeToString(certificate.getEncoded(), 0)); - Log.i("KDE/LanLinkProvider", "Handshake as " + mode + " successful with " + identityPacket.getString("deviceName") + " secured with " + event.getCipherSuite()); - addLink(identityPacket, sslsocket, connectionStarted); - } catch (Exception e) { - Log.e("KDE/LanLinkProvider", "Handshake as " + mode + " failed with " + identityPacket.getString("deviceName")); - e.printStackTrace(); - BackgroundService.RunCommand(context, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - Device device = service.getDevice(deviceId); - if (device == null) return; - device.unpair(); - } - }); - } + sslsocket.addHandshakeCompletedListener(event -> { + String mode = clientMode ? "client" : "server"; + try { + Certificate certificate = event.getPeerCertificates()[0]; + identityPacket.set("certificate", Base64.encodeToString(certificate.getEncoded(), 0)); + Log.i("KDE/LanLinkProvider", "Handshake as " + mode + " successful with " + identityPacket.getString("deviceName") + " secured with " + event.getCipherSuite()); + addLink(identityPacket, sslsocket, connectionStarted); + } catch (Exception e) { + Log.e("KDE/LanLinkProvider", "Handshake as " + mode + " failed with " + identityPacket.getString("deviceName")); + e.printStackTrace(); + BackgroundService.RunCommand(context, service -> { + Device device = service.getDevice(deviceId); + if (device == null) return; + device.unpair(); + }); } }); //Handshake is blocking, so do it on another thread and free this thread to keep receiving new connection - new Thread(new Runnable() { - @Override - public void run() { - try { - sslsocket.startHandshake(); - } catch (Exception e) { - Log.e("KDE/LanLinkProvider", "Handshake failed with " + identityPacket.getString("deviceName")); - e.printStackTrace(); - - //String[] ciphers = sslsocket.getSupportedCipherSuites(); - //for (String cipher : ciphers) { - // Log.i("SupportedCiphers","cipher: " + cipher); - //} - } + new Thread(() -> { + try { + sslsocket.startHandshake(); + } catch (Exception e) { + Log.e("KDE/LanLinkProvider", "Handshake failed with " + identityPacket.getString("deviceName")); + e.printStackTrace(); + + //String[] ciphers = sslsocket.getSupportedCipherSuites(); + //for (String cipher : ciphers) { + // Log.i("SupportedCiphers","cipher: " + cipher); + //} } }).start(); } else { @@ -331,46 +319,40 @@ e.printStackTrace(); return null; } - new Thread(new Runnable() { - @Override - public void run() { - while (listening) { - final int bufferSize = 1024 * 512; - byte[] data = new byte[bufferSize]; - DatagramPacket packet = new DatagramPacket(data, bufferSize); - try { - server.receive(packet); - udpPacketReceived(packet); - } catch (Exception e) { - e.printStackTrace(); - Log.e("LanLinkProvider", "UdpReceive exception"); - } + new Thread(() -> { + while (listening) { + final int bufferSize = 1024 * 512; + byte[] data = new byte[bufferSize]; + DatagramPacket packet = new DatagramPacket(data, bufferSize); + try { + server.receive(packet); + udpPacketReceived(packet); + } catch (Exception e) { + e.printStackTrace(); + Log.e("LanLinkProvider", "UdpReceive exception"); } - Log.w("UdpListener", "Stopping UDP listener"); } + Log.w("UdpListener", "Stopping UDP listener"); }).start(); return server; } private void setupTcpListener() { try { tcpServer = openServerSocketOnFreePort(MIN_PORT); - new Thread(new Runnable() { - @Override - public void run() { - while (listening) { - try { - Socket socket = tcpServer.accept(); - configureSocket(socket); - tcpPacketReceived(socket); - } catch (Exception e) { - e.printStackTrace(); - Log.e("LanLinkProvider", "TcpReceive exception"); - } + new Thread(() -> { + while (listening) { + try { + Socket socket = tcpServer.accept(); + configureSocket(socket); + tcpPacketReceived(socket); + } catch (Exception e) { + e.printStackTrace(); + Log.e("LanLinkProvider", "TcpReceive exception"); } - Log.w("TcpListener", "Stopping TCP listener"); } + Log.w("TcpListener", "Stopping TCP listener"); }).start(); } catch (Exception e) { @@ -401,51 +383,48 @@ return; } - new Thread(new Runnable() { - @Override - public void run() { + new Thread(() -> { - String deviceListPrefs = PreferenceManager.getDefaultSharedPreferences(context).getString(CustomDevicesActivity.KEY_CUSTOM_DEVLIST_PREFERENCE, ""); - ArrayList iplist = new ArrayList<>(); - if (!deviceListPrefs.isEmpty()) { - iplist = CustomDevicesActivity.deserializeIpList(deviceListPrefs); - } - iplist.add("255.255.255.255"); //Default: broadcast. + String deviceListPrefs = PreferenceManager.getDefaultSharedPreferences(context).getString(CustomDevicesActivity.KEY_CUSTOM_DEVLIST_PREFERENCE, ""); + ArrayList iplist = new ArrayList<>(); + if (!deviceListPrefs.isEmpty()) { + iplist = CustomDevicesActivity.deserializeIpList(deviceListPrefs); + } + iplist.add("255.255.255.255"); //Default: broadcast. - NetworkPacket identity = NetworkPacket.createIdentityPacket(context); - identity.set("tcpPort", MIN_PORT); - DatagramSocket socket = null; - byte[] bytes = null; - try { - socket = new DatagramSocket(); - socket.setReuseAddress(true); - socket.setBroadcast(true); - bytes = identity.serialize().getBytes(StringsHelper.UTF8); - } catch (Exception e) { - e.printStackTrace(); - Log.e("KDE/LanLinkProvider", "Failed to create DatagramSocket"); - } + NetworkPacket identity = NetworkPacket.createIdentityPacket(context); + identity.set("tcpPort", MIN_PORT); + DatagramSocket socket = null; + byte[] bytes = null; + try { + socket = new DatagramSocket(); + socket.setReuseAddress(true); + socket.setBroadcast(true); + bytes = identity.serialize().getBytes(StringsHelper.UTF8); + } catch (Exception e) { + e.printStackTrace(); + Log.e("KDE/LanLinkProvider", "Failed to create DatagramSocket"); + } - if (bytes != null) { - //Log.e("KDE/LanLinkProvider","Sending packet to "+iplist.size()+" ips"); - for (String ipstr : iplist) { - try { - InetAddress client = InetAddress.getByName(ipstr); - socket.send(new DatagramPacket(bytes, bytes.length, client, MIN_PORT)); - socket.send(new DatagramPacket(bytes, bytes.length, client, MIN_PORT_LEGACY)); - //Log.i("KDE/LanLinkProvider","Udp identity package sent to address "+client); - } catch (Exception e) { - e.printStackTrace(); - Log.e("KDE/LanLinkProvider", "Sending udp identity package failed. Invalid address? (" + ipstr + ")"); - } + if (bytes != null) { + //Log.e("KDE/LanLinkProvider","Sending packet to "+iplist.size()+" ips"); + for (String ipstr : iplist) { + try { + InetAddress client = InetAddress.getByName(ipstr); + socket.send(new DatagramPacket(bytes, bytes.length, client, MIN_PORT)); + socket.send(new DatagramPacket(bytes, bytes.length, client, MIN_PORT_LEGACY)); + //Log.i("KDE/LanLinkProvider","Udp identity package sent to address "+client); + } catch (Exception e) { + e.printStackTrace(); + Log.e("KDE/LanLinkProvider", "Sending udp identity package failed. Invalid address? (" + ipstr + ")"); } } + } - if (socket != null) { - socket.close(); - } - + if (socket != null) { + socket.close(); } + }).start(); } diff --git a/src/org/kde/kdeconnect/BackgroundService.java b/src/org/kde/kdeconnect/BackgroundService.java --- a/src/org/kde/kdeconnect/BackgroundService.java +++ b/src/org/kde/kdeconnect/BackgroundService.java @@ -87,24 +87,18 @@ } public static void addGuiInUseCounter(final Context activity, final boolean forceNetworkRefresh) { - BackgroundService.RunCommand(activity, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - boolean refreshed = service.acquireDiscoveryMode(activity); - if (!refreshed && forceNetworkRefresh) { - service.onNetworkChange(); - } + BackgroundService.RunCommand(activity, service -> { + boolean refreshed = service.acquireDiscoveryMode(activity); + if (!refreshed && forceNetworkRefresh) { + service.onNetworkChange(); } }); } public static void removeGuiInUseCounter(final Context activity) { - BackgroundService.RunCommand(activity, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - //If no user interface is open, close the connections open to other devices - service.releaseDiscoveryMode(activity); - } + BackgroundService.RunCommand(activity, service -> { + //If no user interface is open, close the connections open to other devices + service.releaseDiscoveryMode(activity); }); } @@ -167,13 +161,10 @@ } private void cleanDevices() { - new Thread(new Runnable() { - @Override - public void run() { - for (Device d : devices.values()) { - if (!d.isPaired() && !d.isPairRequested() && !d.isPairRequestedByPeer() && !d.deviceShouldBeKeptAlive()) { - d.disconnect(); - } + new Thread(() -> { + for (Device d : devices.values()) { + if (!d.isPaired() && !d.isPairRequested() && !d.isPairRequestedByPeer() && !d.deviceShouldBeKeptAlive()) { + d.disconnect(); } } }).start(); @@ -328,20 +319,17 @@ } public static void RunCommand(final Context c, final InstanceCallback callback) { - new Thread(new Runnable() { - @Override - public void run() { - if (callback != null) { - mutex.lock(); - try { - callbacks.add(callback); - } finally { - mutex.unlock(); - } + new Thread(() -> { + if (callback != null) { + mutex.lock(); + try { + callbacks.add(callback); + } finally { + mutex.unlock(); } - Intent serviceIntent = new Intent(c, BackgroundService.class); - c.startService(serviceIntent); } + Intent serviceIntent = new Intent(c, BackgroundService.class); + c.startService(serviceIntent); }).start(); } diff --git a/src/org/kde/kdeconnect/Device.java b/src/org/kde/kdeconnect/Device.java --- a/src/org/kde/kdeconnect/Device.java +++ b/src/org/kde/kdeconnect/Device.java @@ -638,12 +638,7 @@ //Async public void sendPacket(final NetworkPacket np, final SendPacketStatusCallback callback) { - new Thread(new Runnable() { - @Override - public void run() { - sendPacketBlocking(np, callback); - } - }).start(); + new Thread(() -> sendPacketBlocking(np, callback)).start(); } public boolean sendPacketBlocking(final NetworkPacket np, final SendPacketStatusCallback callback) { diff --git a/src/org/kde/kdeconnect/KdeConnectBroadcastReceiver.java b/src/org/kde/kdeconnect/KdeConnectBroadcastReceiver.java --- a/src/org/kde/kdeconnect/KdeConnectBroadcastReceiver.java +++ b/src/org/kde/kdeconnect/KdeConnectBroadcastReceiver.java @@ -43,41 +43,27 @@ Log.i("KdeConnect", "Ignoring, it's not me!"); return; } - BackgroundService.RunCommand(context, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { + BackgroundService.RunCommand(context, service -> { - } }); break; case Intent.ACTION_BOOT_COMPLETED: Log.i("KdeConnect", "KdeConnectBroadcastReceiver"); - BackgroundService.RunCommand(context, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { + BackgroundService.RunCommand(context, service -> { - } }); break; case WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION: case WifiManager.WIFI_STATE_CHANGED_ACTION: case ConnectivityManager.CONNECTIVITY_ACTION: Log.i("KdeConnect", "Connection state changed, trying to connect"); - BackgroundService.RunCommand(context, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - service.onDeviceListChanged(); - service.onNetworkChange(); - } + BackgroundService.RunCommand(context, service -> { + service.onDeviceListChanged(); + service.onNetworkChange(); }); break; case Intent.ACTION_SCREEN_ON: - BackgroundService.RunCommand(context, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - service.onNetworkChange(); - } - }); + BackgroundService.RunCommand(context, BackgroundService::onNetworkChange); break; default: Log.i("BroadcastReceiver", "Ignoring broadcast event: " + intent.getAction()); diff --git a/src/org/kde/kdeconnect/Plugins/ClibpoardPlugin/ClipboardListener.java b/src/org/kde/kdeconnect/Plugins/ClibpoardPlugin/ClipboardListener.java --- a/src/org/kde/kdeconnect/Plugins/ClibpoardPlugin/ClipboardListener.java +++ b/src/org/kde/kdeconnect/Plugins/ClibpoardPlugin/ClipboardListener.java @@ -69,35 +69,29 @@ return; } - new Handler(Looper.getMainLooper()).post(new Runnable() { - @Override - public void run() { - cm = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); - listener = new ClipboardManager.OnPrimaryClipChangedListener() { - @Override - public void onPrimaryClipChanged() { - try { - - ClipData.Item item = cm.getPrimaryClip().getItemAt(0); - String content = item.coerceToText(context).toString(); - - if (content.equals(currentContent)) { - return; - } - - currentContent = content; - - for (ClipboardObserver observer : observers) { - observer.clipboardChanged(content); - } - - } catch (Exception e) { - //Probably clipboard was not text - } + new Handler(Looper.getMainLooper()).post(() -> { + cm = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); + listener = () -> { + try { + + ClipData.Item item = cm.getPrimaryClip().getItemAt(0); + String content = item.coerceToText(context).toString(); + + if (content.equals(currentContent)) { + return; + } + + currentContent = content; + + for (ClipboardObserver observer : observers) { + observer.clipboardChanged(content); } - }; - cm.addPrimaryClipChangedListener(listener); - } + + } catch (Exception e) { + //Probably clipboard was not text + } + }; + cm.addPrimaryClipChangedListener(listener); }); } diff --git a/src/org/kde/kdeconnect/Plugins/ClibpoardPlugin/ClipboardPlugin.java b/src/org/kde/kdeconnect/Plugins/ClibpoardPlugin/ClipboardPlugin.java --- a/src/org/kde/kdeconnect/Plugins/ClibpoardPlugin/ClipboardPlugin.java +++ b/src/org/kde/kdeconnect/Plugins/ClibpoardPlugin/ClipboardPlugin.java @@ -53,13 +53,10 @@ return true; } - private ClipboardListener.ClipboardObserver observer = new ClipboardListener.ClipboardObserver() { - @Override - public void clipboardChanged(String content) { - NetworkPacket np = new NetworkPacket(ClipboardPlugin.PACKET_TYPE_CLIPBOARD); - np.set("content", content); - device.sendPacket(np); - } + private ClipboardListener.ClipboardObserver observer = content -> { + NetworkPacket np = new NetworkPacket(ClipboardPlugin.PACKET_TYPE_CLIPBOARD); + np.set("content", content); + device.sendPacket(np); }; @Override diff --git a/src/org/kde/kdeconnect/Plugins/FindMyPhonePlugin/FindMyPhoneActivity.java b/src/org/kde/kdeconnect/Plugins/FindMyPhonePlugin/FindMyPhoneActivity.java --- a/src/org/kde/kdeconnect/Plugins/FindMyPhonePlugin/FindMyPhoneActivity.java +++ b/src/org/kde/kdeconnect/Plugins/FindMyPhonePlugin/FindMyPhoneActivity.java @@ -67,12 +67,7 @@ WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); - findViewById(R.id.bFindMyPhone).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - finish(); - } - }); + findViewById(R.id.bFindMyPhone).setOnClickListener(view -> finish()); } @Override diff --git a/src/org/kde/kdeconnect/Plugins/MousePadPlugin/KeyListenerView.java b/src/org/kde/kdeconnect/Plugins/MousePadPlugin/KeyListenerView.java --- a/src/org/kde/kdeconnect/Plugins/MousePadPlugin/KeyListenerView.java +++ b/src/org/kde/kdeconnect/Plugins/MousePadPlugin/KeyListenerView.java @@ -109,14 +109,11 @@ } private void sendKeyPressPacket(final NetworkPacket np) { - BackgroundService.RunCommand(getContext(), new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - Device device = service.getDevice(deviceId); - MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class); - if (mousePadPlugin == null) return; - mousePadPlugin.sendKeyboardPacket(np); - } + BackgroundService.RunCommand(getContext(), service -> { + Device device = service.getDevice(deviceId); + MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class); + if (mousePadPlugin == null) return; + mousePadPlugin.sendKeyboardPacket(np); }); } diff --git a/src/org/kde/kdeconnect/Plugins/MousePadPlugin/MousePadActivity.java b/src/org/kde/kdeconnect/Plugins/MousePadPlugin/MousePadActivity.java --- a/src/org/kde/kdeconnect/Plugins/MousePadPlugin/MousePadActivity.java +++ b/src/org/kde/kdeconnect/Plugins/MousePadPlugin/MousePadActivity.java @@ -135,27 +135,24 @@ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { final View decorView = getWindow().getDecorView(); - decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { - @Override - public void onSystemUiVisibilityChange(int visibility) { - if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { + decorView.setOnSystemUiVisibilityChangeListener(visibility -> { + if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { - int fullscreenType = 0; + int fullscreenType = 0; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - fullscreenType |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; - } - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - fullscreenType |= View.SYSTEM_UI_FLAG_FULLSCREEN; - } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + fullscreenType |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; + } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - fullscreenType |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; - } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + fullscreenType |= View.SYSTEM_UI_FLAG_FULLSCREEN; + } - getWindow().getDecorView().setSystemUiVisibility(fullscreenType); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + fullscreenType |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; } + + getWindow().getDecorView().setSystemUiVisibility(fullscreenType); } }); } @@ -214,16 +211,13 @@ case MotionEvent.ACTION_MOVE: mCurrentX = event.getX(); mCurrentY = event.getY(); - BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - Device device = service.getDevice(deviceId); - MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class); - if (mousePadPlugin == null) return; - mousePadPlugin.sendMouseDelta(mCurrentX - mPrevX, mCurrentY - mPrevY, mCurrentSensitivity); - mPrevX = mCurrentX; - mPrevY = mCurrentY; - } + BackgroundService.RunCommand(this, service -> { + Device device = service.getDevice(deviceId); + MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class); + if (mousePadPlugin == null) return; + mousePadPlugin.sendMouseDelta(mCurrentX - mPrevX, mCurrentY - mPrevY, mCurrentSensitivity); + mPrevX = mCurrentX; + mPrevY = mCurrentY; }); break; } @@ -287,14 +281,11 @@ getWindow().getDecorView().performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); - BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - Device device = service.getDevice(deviceId); - MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class); - if (mousePadPlugin == null) return; - mousePadPlugin.sendSingleHold(); - } + BackgroundService.RunCommand(this, service -> { + Device device = service.getDevice(deviceId); + MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class); + if (mousePadPlugin == null) return; + mousePadPlugin.sendSingleHold(); }); } @@ -305,28 +296,22 @@ @Override public boolean onSingleTapConfirmed(MotionEvent e) { - BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - Device device = service.getDevice(deviceId); - MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class); - if (mousePadPlugin == null) return; - mousePadPlugin.sendSingleClick(); - } + BackgroundService.RunCommand(this, service -> { + Device device = service.getDevice(deviceId); + MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class); + if (mousePadPlugin == null) return; + mousePadPlugin.sendSingleClick(); }); return true; } @Override public boolean onDoubleTap(MotionEvent e) { - BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - Device device = service.getDevice(deviceId); - MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class); - if (mousePadPlugin == null) return; - mousePadPlugin.sendDoubleClick(); - } + BackgroundService.RunCommand(this, service -> { + Device device = service.getDevice(deviceId); + MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class); + if (mousePadPlugin == null) return; + mousePadPlugin.sendDoubleClick(); }); return true; } @@ -366,50 +351,38 @@ private void sendMiddleClick() { - BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - Device device = service.getDevice(deviceId); - MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class); - if (mousePadPlugin == null) return; - mousePadPlugin.sendMiddleClick(); - } + BackgroundService.RunCommand(this, service -> { + Device device = service.getDevice(deviceId); + MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class); + if (mousePadPlugin == null) return; + mousePadPlugin.sendMiddleClick(); }); } private void sendRightClick() { - BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - Device device = service.getDevice(deviceId); - MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class); - if (mousePadPlugin == null) return; - mousePadPlugin.sendRightClick(); - } + BackgroundService.RunCommand(this, service -> { + Device device = service.getDevice(deviceId); + MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class); + if (mousePadPlugin == null) return; + mousePadPlugin.sendRightClick(); }); } private void sendSingleHold() { - BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - Device device = service.getDevice(deviceId); - MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class); - if (mousePadPlugin == null) return; - mousePadPlugin.sendSingleHold(); - } + BackgroundService.RunCommand(this, service -> { + Device device = service.getDevice(deviceId); + MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class); + if (mousePadPlugin == null) return; + mousePadPlugin.sendSingleHold(); }); } private void sendScroll(final float y) { - BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - Device device = service.getDevice(deviceId); - MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class); - if (mousePadPlugin == null) return; - mousePadPlugin.sendScroll(0, y); - } + BackgroundService.RunCommand(this, service -> { + Device device = service.getDevice(deviceId); + MousePadPlugin mousePadPlugin = device.getPlugin(MousePadPlugin.class); + if (mousePadPlugin == null) return; + mousePadPlugin.sendScroll(0, y); }); } diff --git a/src/org/kde/kdeconnect/Plugins/MprisPlugin/MprisActivity.java b/src/org/kde/kdeconnect/Plugins/MprisPlugin/MprisActivity.java --- a/src/org/kde/kdeconnect/Plugins/MprisPlugin/MprisActivity.java +++ b/src/org/kde/kdeconnect/Plugins/MprisPlugin/MprisActivity.java @@ -78,105 +78,94 @@ protected void connectToPlugin(final String targetPlayerName) { - BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { + BackgroundService.RunCommand(this, service -> { + + final Device device = service.getDevice(deviceId); + final MprisPlugin mpris = device.getPlugin(MprisPlugin.class); + if (mpris == null) { + Log.e("MprisActivity", "device has no mpris plugin!"); + return; + } + targetPlayer = mpris.getPlayerStatus(targetPlayerName); - final Device device = service.getDevice(deviceId); - final MprisPlugin mpris = device.getPlugin(MprisPlugin.class); - if (mpris == null) { - Log.e("MprisActivity", "device has no mpris plugin!"); - return; + mpris.setPlayerStatusUpdatedHandler("activity", new Handler() { + @Override + public void handleMessage(Message msg) { + runOnUiThread(() -> updatePlayerStatus(mpris)); } - targetPlayer = mpris.getPlayerStatus(targetPlayerName); + }); + + mpris.setPlayerListUpdatedHandler("activity", new Handler() { + @Override + public void handleMessage(Message msg) { + final List playerList = mpris.getPlayerList(); + final ArrayAdapter adapter = new ArrayAdapter<>(MprisActivity.this, + android.R.layout.simple_spinner_item, + playerList.toArray(new String[playerList.size()]) + ); + + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + runOnUiThread(() -> { + Spinner spinner = (Spinner) findViewById(R.id.player_spinner); + //String prevPlayer = (String)spinner.getSelectedItem(); + spinner.setAdapter(adapter); + + if (playerList.isEmpty()) { + findViewById(R.id.no_players).setVisibility(View.VISIBLE); + spinner.setVisibility(View.GONE); + ((TextView) findViewById(R.id.now_playing_textview)).setText(""); + } else { + findViewById(R.id.no_players).setVisibility(View.GONE); + spinner.setVisibility(View.VISIBLE); + } - mpris.setPlayerStatusUpdatedHandler("activity", new Handler() { - @Override - public void handleMessage(Message msg) { - runOnUiThread(new Runnable() { + spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override - public void run() { - updatePlayerStatus(mpris); - } - }); - } - }); + public void onItemSelected(AdapterView arg0, View arg1, int pos, long id) { - mpris.setPlayerListUpdatedHandler("activity", new Handler() { - @Override - public void handleMessage(Message msg) { - final List playerList = mpris.getPlayerList(); - final ArrayAdapter adapter = new ArrayAdapter<>(MprisActivity.this, - android.R.layout.simple_spinner_item, - playerList.toArray(new String[playerList.size()]) - ); - - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - runOnUiThread(new Runnable() { - @Override - public void run() { - Spinner spinner = (Spinner) findViewById(R.id.player_spinner); - //String prevPlayer = (String)spinner.getSelectedItem(); - spinner.setAdapter(adapter); - - if (playerList.isEmpty()) { - findViewById(R.id.no_players).setVisibility(View.VISIBLE); - spinner.setVisibility(View.GONE); - ((TextView) findViewById(R.id.now_playing_textview)).setText(""); - } else { - findViewById(R.id.no_players).setVisibility(View.GONE); - spinner.setVisibility(View.VISIBLE); - } + if (pos >= playerList.size()) return; - spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView arg0, View arg1, int pos, long id) { - - if (pos >= playerList.size()) return; - - String player = playerList.get(pos); - if (targetPlayer != null && player.equals(targetPlayer.getPlayer())) { - return; //Player hasn't actually changed - } - targetPlayer = mpris.getPlayerStatus(player); - updatePlayerStatus(mpris); - - if (targetPlayer.isPlaying()) { - MprisMediaSession.getInstance().playerSelected(targetPlayer); - } - } - - @Override - public void onNothingSelected(AdapterView arg0) { - targetPlayer = null; - } - }); - - if (targetPlayer == null) { - //If no player is selected, try to select a playing player - targetPlayer = mpris.getPlayingPlayer(); - } - //Try to select the specified player - if (targetPlayer != null) { - int targetIndex = adapter.getPosition(targetPlayer.getPlayer()); - if (targetIndex >= 0) { - spinner.setSelection(targetIndex); - } else { - targetPlayer = null; - } - } - //If no player selected, select the first one (if any) - if (targetPlayer == null && !playerList.isEmpty()) { - targetPlayer = mpris.getPlayerStatus(playerList.get(0)); - spinner.setSelection(0); + String player = playerList.get(pos); + if (targetPlayer != null && player.equals(targetPlayer.getPlayer())) { + return; //Player hasn't actually changed } + targetPlayer = mpris.getPlayerStatus(player); updatePlayerStatus(mpris); + + if (targetPlayer.isPlaying()) { + MprisMediaSession.getInstance().playerSelected(targetPlayer); + } + } + + @Override + public void onNothingSelected(AdapterView arg0) { + targetPlayer = null; } }); - } - }); - } + if (targetPlayer == null) { + //If no player is selected, try to select a playing player + targetPlayer = mpris.getPlayingPlayer(); + } + //Try to select the specified player + if (targetPlayer != null) { + int targetIndex = adapter.getPosition(targetPlayer.getPlayer()); + if (targetIndex >= 0) { + spinner.setSelection(targetIndex); + } else { + targetPlayer = null; + } + } + //If no player selected, select the first one (if any) + if (targetPlayer == null && !playerList.isEmpty()) { + targetPlayer = mpris.getPlayerStatus(playerList.get(0)); + spinner.setSelection(0); + } + updatePlayerStatus(mpris); + }); + } + }); + }); } @@ -196,12 +185,7 @@ @Override protected void onDestroy() { super.onDestroy(); - BackgroundService.RunCommand(MprisActivity.this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - service.removeConnectionListener(connectionReceiver); - } - }); + BackgroundService.RunCommand(MprisActivity.this, service -> service.removeConnectionListener(connectionReceiver)); } private void updatePlayerStatus(MprisPlugin mpris) { @@ -327,78 +311,33 @@ getString(R.string.mpris_time_default)); final int interval_time = Integer.parseInt(interval_time_str); - BackgroundService.RunCommand(MprisActivity.this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - service.addConnectionListener(connectionReceiver); - } - }); + BackgroundService.RunCommand(MprisActivity.this, service -> service.addConnectionListener(connectionReceiver)); connectToPlugin(targetPlayerName); - findViewById(R.id.play_button).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - BackgroundService.RunCommand(MprisActivity.this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - if (targetPlayer == null) return; - targetPlayer.playPause(); - } - }); - } - }); + findViewById(R.id.play_button).setOnClickListener(view -> BackgroundService.RunCommand(MprisActivity.this, service -> { + if (targetPlayer == null) return; + targetPlayer.playPause(); + })); - findViewById(R.id.prev_button).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - BackgroundService.RunCommand(MprisActivity.this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - if (targetPlayer == null) return; - targetPlayer.previous(); - } - }); - } - }); + findViewById(R.id.prev_button).setOnClickListener(view -> BackgroundService.RunCommand(MprisActivity.this, service -> { + if (targetPlayer == null) return; + targetPlayer.previous(); + })); - findViewById(R.id.rew_button).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - BackgroundService.RunCommand(MprisActivity.this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - if (targetPlayer == null) return; - targetPlayer.seek(interval_time * -1); - } - }); - } - }); + findViewById(R.id.rew_button).setOnClickListener(view -> BackgroundService.RunCommand(MprisActivity.this, service -> { + if (targetPlayer == null) return; + targetPlayer.seek(interval_time * -1); + })); - findViewById(R.id.ff_button).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - BackgroundService.RunCommand(MprisActivity.this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - if (targetPlayer == null) return; - targetPlayer.seek(interval_time); - } - }); - } - }); + findViewById(R.id.ff_button).setOnClickListener(view -> BackgroundService.RunCommand(MprisActivity.this, service -> { + if (targetPlayer == null) return; + targetPlayer.seek(interval_time); + })); - findViewById(R.id.next_button).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - BackgroundService.RunCommand(MprisActivity.this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - if (targetPlayer == null) return; - targetPlayer.next(); - } - }); - } - }); + findViewById(R.id.next_button).setOnClickListener(view -> BackgroundService.RunCommand(MprisActivity.this, service -> { + if (targetPlayer == null) return; + targetPlayer.next(); + })); ((SeekBar) findViewById(R.id.volume_seek)).setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override @@ -411,33 +350,23 @@ @Override public void onStopTrackingTouch(final SeekBar seekBar) { - BackgroundService.RunCommand(MprisActivity.this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - if (targetPlayer == null) return; - targetPlayer.setVolume(seekBar.getProgress()); - } + BackgroundService.RunCommand(MprisActivity.this, service -> { + if (targetPlayer == null) return; + targetPlayer.setVolume(seekBar.getProgress()); }); } }); - positionSeekUpdateRunnable = new Runnable() { - @Override - public void run() { - final SeekBar positionSeek = (SeekBar) findViewById(R.id.positionSeek); - BackgroundService.RunCommand(MprisActivity.this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - if (targetPlayer != null) { - positionSeek.setProgress((int) (targetPlayer.getPosition())); - } - positionSeekUpdateHandler.removeCallbacks(positionSeekUpdateRunnable); - positionSeekUpdateHandler.postDelayed(positionSeekUpdateRunnable, 1000); - } - }); - } - + positionSeekUpdateRunnable = () -> { + final SeekBar positionSeek = (SeekBar) findViewById(R.id.positionSeek); + BackgroundService.RunCommand(MprisActivity.this, service -> { + if (targetPlayer != null) { + positionSeek.setProgress((int) (targetPlayer.getPosition())); + } + positionSeekUpdateHandler.removeCallbacks(positionSeekUpdateRunnable); + positionSeekUpdateHandler.postDelayed(positionSeekUpdateRunnable, 1000); + }); }; positionSeekUpdateHandler.postDelayed(positionSeekUpdateRunnable, 200); @@ -454,14 +383,11 @@ @Override public void onStopTrackingTouch(final SeekBar seekBar) { - BackgroundService.RunCommand(MprisActivity.this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - if (targetPlayer != null) { - targetPlayer.setPosition(seekBar.getProgress()); - } - positionSeekUpdateHandler.postDelayed(positionSeekUpdateRunnable, 200); + BackgroundService.RunCommand(MprisActivity.this, service -> { + if (targetPlayer != null) { + targetPlayer.setPosition(seekBar.getProgress()); } + positionSeekUpdateHandler.postDelayed(positionSeekUpdateRunnable, 200); }); } diff --git a/src/org/kde/kdeconnect/Plugins/MprisPlugin/MprisMediaSession.java b/src/org/kde/kdeconnect/Plugins/MprisPlugin/MprisMediaSession.java --- a/src/org/kde/kdeconnect/Plugins/MprisPlugin/MprisMediaSession.java +++ b/src/org/kde/kdeconnect/Plugins/MprisPlugin/MprisMediaSession.java @@ -211,190 +211,187 @@ * Update the media control notification */ private void updateMediaNotification() { - BackgroundService.RunCommand(context, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - //If the user disabled the media notification, do not show it - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - if (!prefs.getBoolean(context.getString(R.string.mpris_notification_key), true)) { - closeMediaNotification(); - return; - } - - //Make sure our information is up-to-date - updateCurrentPlayer(service); + BackgroundService.RunCommand(context, service -> { + //If the user disabled the media notification, do not show it + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + if (!prefs.getBoolean(context.getString(R.string.mpris_notification_key), true)) { + closeMediaNotification(); + return; + } - //If the player disappeared (and no other playing one found), just remove the notification - if (notificationPlayer == null) { - closeMediaNotification(); - return; - } + //Make sure our information is up-to-date + updateCurrentPlayer(service); - //Update the metadata and playback status - if (mediaSession == null) { - mediaSession = new MediaSessionCompat(context, MPRIS_MEDIA_SESSION_TAG); - mediaSession.setCallback(mediaSessionCallback); - mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); - } - MediaMetadataCompat.Builder metadata = new MediaMetadataCompat.Builder(); + //If the player disappeared (and no other playing one found), just remove the notification + if (notificationPlayer == null) { + closeMediaNotification(); + return; + } - //Fallback because older KDE connect versions do not support getTitle() - if (!notificationPlayer.getTitle().isEmpty()) { - metadata.putString(MediaMetadataCompat.METADATA_KEY_TITLE, notificationPlayer.getTitle()); - } else { - metadata.putString(MediaMetadataCompat.METADATA_KEY_TITLE, notificationPlayer.getCurrentSong()); - } - if (!notificationPlayer.getArtist().isEmpty()) { - metadata.putString(MediaMetadataCompat.METADATA_KEY_AUTHOR, notificationPlayer.getArtist()); - } - if (!notificationPlayer.getAlbum().isEmpty()) { - metadata.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, notificationPlayer.getAlbum()); - } - if (notificationPlayer.getLength() > 0) { - metadata.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, notificationPlayer.getLength()); - } + //Update the metadata and playback status + if (mediaSession == null) { + mediaSession = new MediaSessionCompat(context, MPRIS_MEDIA_SESSION_TAG); + mediaSession.setCallback(mediaSessionCallback); + mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); + } + MediaMetadataCompat.Builder metadata = new MediaMetadataCompat.Builder(); - Bitmap albumArt = notificationPlayer.getAlbumArt(); - if (albumArt != null) { - metadata.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, albumArt); - } + //Fallback because older KDE connect versions do not support getTitle() + if (!notificationPlayer.getTitle().isEmpty()) { + metadata.putString(MediaMetadataCompat.METADATA_KEY_TITLE, notificationPlayer.getTitle()); + } else { + metadata.putString(MediaMetadataCompat.METADATA_KEY_TITLE, notificationPlayer.getCurrentSong()); + } + if (!notificationPlayer.getArtist().isEmpty()) { + metadata.putString(MediaMetadataCompat.METADATA_KEY_AUTHOR, notificationPlayer.getArtist()); + } + if (!notificationPlayer.getAlbum().isEmpty()) { + metadata.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, notificationPlayer.getAlbum()); + } + if (notificationPlayer.getLength() > 0) { + metadata.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, notificationPlayer.getLength()); + } - mediaSession.setMetadata(metadata.build()); - PlaybackStateCompat.Builder playbackState = new PlaybackStateCompat.Builder(); + Bitmap albumArt = notificationPlayer.getAlbumArt(); + if (albumArt != null) { + metadata.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, albumArt); + } - if (notificationPlayer.isPlaying()) { - playbackState.setState(PlaybackStateCompat.STATE_PLAYING, notificationPlayer.getPosition(), 1.0f); - } else { - playbackState.setState(PlaybackStateCompat.STATE_PAUSED, notificationPlayer.getPosition(), 0.0f); - } + mediaSession.setMetadata(metadata.build()); + PlaybackStateCompat.Builder playbackState = new PlaybackStateCompat.Builder(); - //Create all actions (previous/play/pause/next) - Intent iPlay = new Intent(service, MprisMediaNotificationReceiver.class); - iPlay.setAction(MprisMediaNotificationReceiver.ACTION_PLAY); - iPlay.putExtra(MprisMediaNotificationReceiver.EXTRA_DEVICE_ID, notificationDevice); - iPlay.putExtra(MprisMediaNotificationReceiver.EXTRA_MPRIS_PLAYER, notificationPlayer.getPlayer()); - PendingIntent piPlay = PendingIntent.getBroadcast(service, 0, iPlay, PendingIntent.FLAG_UPDATE_CURRENT); - NotificationCompat.Action.Builder aPlay = new NotificationCompat.Action.Builder( - R.drawable.ic_play_white, service.getString(R.string.mpris_play), piPlay); - - Intent iPause = new Intent(service, MprisMediaNotificationReceiver.class); - iPause.setAction(MprisMediaNotificationReceiver.ACTION_PAUSE); - iPause.putExtra(MprisMediaNotificationReceiver.EXTRA_DEVICE_ID, notificationDevice); - iPause.putExtra(MprisMediaNotificationReceiver.EXTRA_MPRIS_PLAYER, notificationPlayer.getPlayer()); - PendingIntent piPause = PendingIntent.getBroadcast(service, 0, iPause, PendingIntent.FLAG_UPDATE_CURRENT); - NotificationCompat.Action.Builder aPause = new NotificationCompat.Action.Builder( - R.drawable.ic_pause_white, service.getString(R.string.mpris_pause), piPause); - - Intent iPrevious = new Intent(service, MprisMediaNotificationReceiver.class); - iPrevious.setAction(MprisMediaNotificationReceiver.ACTION_PREVIOUS); - iPrevious.putExtra(MprisMediaNotificationReceiver.EXTRA_DEVICE_ID, notificationDevice); - iPrevious.putExtra(MprisMediaNotificationReceiver.EXTRA_MPRIS_PLAYER, notificationPlayer.getPlayer()); - PendingIntent piPrevious = PendingIntent.getBroadcast(service, 0, iPrevious, PendingIntent.FLAG_UPDATE_CURRENT); - NotificationCompat.Action.Builder aPrevious = new NotificationCompat.Action.Builder( - R.drawable.ic_previous_white, service.getString(R.string.mpris_previous), piPrevious); - - Intent iNext = new Intent(service, MprisMediaNotificationReceiver.class); - iNext.setAction(MprisMediaNotificationReceiver.ACTION_NEXT); - iNext.putExtra(MprisMediaNotificationReceiver.EXTRA_DEVICE_ID, notificationDevice); - iNext.putExtra(MprisMediaNotificationReceiver.EXTRA_MPRIS_PLAYER, notificationPlayer.getPlayer()); - PendingIntent piNext = PendingIntent.getBroadcast(service, 0, iNext, PendingIntent.FLAG_UPDATE_CURRENT); - NotificationCompat.Action.Builder aNext = new NotificationCompat.Action.Builder( - R.drawable.ic_next_white, service.getString(R.string.mpris_next), piNext); - - Intent iOpenActivity = new Intent(service, MprisActivity.class); - iOpenActivity.putExtra("deviceId", notificationDevice); - iOpenActivity.putExtra("player", notificationPlayer.getPlayer()); - PendingIntent piOpenActivity = PendingIntent.getActivity(service, 0, iOpenActivity, PendingIntent.FLAG_UPDATE_CURRENT); - - //Create the notification - final NotificationCompat.Builder notification = new NotificationCompat.Builder(service); - notification - .setAutoCancel(false) - .setContentIntent(piOpenActivity) - .setSmallIcon(R.drawable.ic_play_white) - .setShowWhen(false) - .setColor(service.getResources().getColor(R.color.primary)) - .setVisibility(android.support.v4.app.NotificationCompat.VISIBILITY_PUBLIC); - - if (!notificationPlayer.getTitle().isEmpty()) { - notification.setContentTitle(notificationPlayer.getTitle()); - } else { - notification.setContentTitle(notificationPlayer.getCurrentSong()); - } - //Only set the notification body text if we have an author and/or album - if (!notificationPlayer.getArtist().isEmpty() && !notificationPlayer.getAlbum().isEmpty()) { - notification.setContentText(notificationPlayer.getArtist() + " - " + notificationPlayer.getAlbum() + " (" + notificationPlayer.getPlayer() + ")"); - } else if (!notificationPlayer.getArtist().isEmpty()) { - notification.setContentText(notificationPlayer.getArtist() + " (" + notificationPlayer.getPlayer() + ")"); - } else if (!notificationPlayer.getAlbum().isEmpty()) { - notification.setContentText(notificationPlayer.getAlbum() + " (" + notificationPlayer.getPlayer() + ")"); - } else { - notification.setContentText(notificationPlayer.getPlayer()); - } + if (notificationPlayer.isPlaying()) { + playbackState.setState(PlaybackStateCompat.STATE_PLAYING, notificationPlayer.getPosition(), 1.0f); + } else { + playbackState.setState(PlaybackStateCompat.STATE_PAUSED, notificationPlayer.getPosition(), 0.0f); + } - if (albumArt != null) { - notification.setLargeIcon(albumArt); - } + //Create all actions (previous/play/pause/next) + Intent iPlay = new Intent(service, MprisMediaNotificationReceiver.class); + iPlay.setAction(MprisMediaNotificationReceiver.ACTION_PLAY); + iPlay.putExtra(MprisMediaNotificationReceiver.EXTRA_DEVICE_ID, notificationDevice); + iPlay.putExtra(MprisMediaNotificationReceiver.EXTRA_MPRIS_PLAYER, notificationPlayer.getPlayer()); + PendingIntent piPlay = PendingIntent.getBroadcast(service, 0, iPlay, PendingIntent.FLAG_UPDATE_CURRENT); + NotificationCompat.Action.Builder aPlay = new NotificationCompat.Action.Builder( + R.drawable.ic_play_white, service.getString(R.string.mpris_play), piPlay); + + Intent iPause = new Intent(service, MprisMediaNotificationReceiver.class); + iPause.setAction(MprisMediaNotificationReceiver.ACTION_PAUSE); + iPause.putExtra(MprisMediaNotificationReceiver.EXTRA_DEVICE_ID, notificationDevice); + iPause.putExtra(MprisMediaNotificationReceiver.EXTRA_MPRIS_PLAYER, notificationPlayer.getPlayer()); + PendingIntent piPause = PendingIntent.getBroadcast(service, 0, iPause, PendingIntent.FLAG_UPDATE_CURRENT); + NotificationCompat.Action.Builder aPause = new NotificationCompat.Action.Builder( + R.drawable.ic_pause_white, service.getString(R.string.mpris_pause), piPause); + + Intent iPrevious = new Intent(service, MprisMediaNotificationReceiver.class); + iPrevious.setAction(MprisMediaNotificationReceiver.ACTION_PREVIOUS); + iPrevious.putExtra(MprisMediaNotificationReceiver.EXTRA_DEVICE_ID, notificationDevice); + iPrevious.putExtra(MprisMediaNotificationReceiver.EXTRA_MPRIS_PLAYER, notificationPlayer.getPlayer()); + PendingIntent piPrevious = PendingIntent.getBroadcast(service, 0, iPrevious, PendingIntent.FLAG_UPDATE_CURRENT); + NotificationCompat.Action.Builder aPrevious = new NotificationCompat.Action.Builder( + R.drawable.ic_previous_white, service.getString(R.string.mpris_previous), piPrevious); + + Intent iNext = new Intent(service, MprisMediaNotificationReceiver.class); + iNext.setAction(MprisMediaNotificationReceiver.ACTION_NEXT); + iNext.putExtra(MprisMediaNotificationReceiver.EXTRA_DEVICE_ID, notificationDevice); + iNext.putExtra(MprisMediaNotificationReceiver.EXTRA_MPRIS_PLAYER, notificationPlayer.getPlayer()); + PendingIntent piNext = PendingIntent.getBroadcast(service, 0, iNext, PendingIntent.FLAG_UPDATE_CURRENT); + NotificationCompat.Action.Builder aNext = new NotificationCompat.Action.Builder( + R.drawable.ic_next_white, service.getString(R.string.mpris_next), piNext); + + Intent iOpenActivity = new Intent(service, MprisActivity.class); + iOpenActivity.putExtra("deviceId", notificationDevice); + iOpenActivity.putExtra("player", notificationPlayer.getPlayer()); + PendingIntent piOpenActivity = PendingIntent.getActivity(service, 0, iOpenActivity, PendingIntent.FLAG_UPDATE_CURRENT); + + //Create the notification + final NotificationCompat.Builder notification = new NotificationCompat.Builder(service); + notification + .setAutoCancel(false) + .setContentIntent(piOpenActivity) + .setSmallIcon(R.drawable.ic_play_white) + .setShowWhen(false) + .setColor(service.getResources().getColor(R.color.primary)) + .setVisibility(android.support.v4.app.NotificationCompat.VISIBILITY_PUBLIC); + + if (!notificationPlayer.getTitle().isEmpty()) { + notification.setContentTitle(notificationPlayer.getTitle()); + } else { + notification.setContentTitle(notificationPlayer.getCurrentSong()); + } + //Only set the notification body text if we have an author and/or album + if (!notificationPlayer.getArtist().isEmpty() && !notificationPlayer.getAlbum().isEmpty()) { + notification.setContentText(notificationPlayer.getArtist() + " - " + notificationPlayer.getAlbum() + " (" + notificationPlayer.getPlayer() + ")"); + } else if (!notificationPlayer.getArtist().isEmpty()) { + notification.setContentText(notificationPlayer.getArtist() + " (" + notificationPlayer.getPlayer() + ")"); + } else if (!notificationPlayer.getAlbum().isEmpty()) { + notification.setContentText(notificationPlayer.getAlbum() + " (" + notificationPlayer.getPlayer() + ")"); + } else { + notification.setContentText(notificationPlayer.getPlayer()); + } - if (!notificationPlayer.isPlaying()) { - Intent iCloseNotification = new Intent(service, MprisMediaNotificationReceiver.class); - iCloseNotification.setAction(MprisMediaNotificationReceiver.ACTION_CLOSE_NOTIFICATION); - iCloseNotification.putExtra(MprisMediaNotificationReceiver.EXTRA_DEVICE_ID, notificationDevice); - iCloseNotification.putExtra(MprisMediaNotificationReceiver.EXTRA_MPRIS_PLAYER, notificationPlayer.getPlayer()); - PendingIntent piCloseNotification = PendingIntent.getActivity(service, 0, iCloseNotification, PendingIntent.FLAG_UPDATE_CURRENT); - notification.setDeleteIntent(piCloseNotification); - } + if (albumArt != null) { + notification.setLargeIcon(albumArt); + } - //Add media control actions - int numActions = 0; - long playbackActions = 0; - if (notificationPlayer.isGoPreviousAllowed()) { - notification.addAction(aPrevious.build()); - playbackActions |= PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS; - ++numActions; - } - if (notificationPlayer.isPlaying() && notificationPlayer.isPauseAllowed()) { - notification.addAction(aPause.build()); - playbackActions |= PlaybackStateCompat.ACTION_PAUSE; - ++numActions; - } - if (!notificationPlayer.isPlaying() && notificationPlayer.isPlayAllowed()) { - notification.addAction(aPlay.build()); - playbackActions |= PlaybackStateCompat.ACTION_PLAY; - ++numActions; - } - if (notificationPlayer.isGoNextAllowed()) { - notification.addAction(aNext.build()); - playbackActions |= PlaybackStateCompat.ACTION_SKIP_TO_NEXT; - ++numActions; - } - playbackState.setActions(playbackActions); - mediaSession.setPlaybackState(playbackState.build()); - - //Only allow deletion if no music is notificationPlayer - if (notificationPlayer.isPlaying()) { - notification.setOngoing(true); - } else { - notification.setOngoing(false); - } + if (!notificationPlayer.isPlaying()) { + Intent iCloseNotification = new Intent(service, MprisMediaNotificationReceiver.class); + iCloseNotification.setAction(MprisMediaNotificationReceiver.ACTION_CLOSE_NOTIFICATION); + iCloseNotification.putExtra(MprisMediaNotificationReceiver.EXTRA_DEVICE_ID, notificationDevice); + iCloseNotification.putExtra(MprisMediaNotificationReceiver.EXTRA_MPRIS_PLAYER, notificationPlayer.getPlayer()); + PendingIntent piCloseNotification = PendingIntent.getActivity(service, 0, iCloseNotification, PendingIntent.FLAG_UPDATE_CURRENT); + notification.setDeleteIntent(piCloseNotification); + } - //Use the MediaStyle notification, so it feels like other media players. That also allows adding actions - NotificationCompat.MediaStyle mediaStyle = new NotificationCompat.MediaStyle(); - if (numActions == 1) { - mediaStyle.setShowActionsInCompactView(0); - } else if (numActions == 2) { - mediaStyle.setShowActionsInCompactView(0, 1); - } else if (numActions >= 3) { - mediaStyle.setShowActionsInCompactView(0, 1, 2); - } - mediaStyle.setMediaSession(mediaSession.getSessionToken()); - notification.setStyle(mediaStyle); + //Add media control actions + int numActions = 0; + long playbackActions = 0; + if (notificationPlayer.isGoPreviousAllowed()) { + notification.addAction(aPrevious.build()); + playbackActions |= PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS; + ++numActions; + } + if (notificationPlayer.isPlaying() && notificationPlayer.isPauseAllowed()) { + notification.addAction(aPause.build()); + playbackActions |= PlaybackStateCompat.ACTION_PAUSE; + ++numActions; + } + if (!notificationPlayer.isPlaying() && notificationPlayer.isPlayAllowed()) { + notification.addAction(aPlay.build()); + playbackActions |= PlaybackStateCompat.ACTION_PLAY; + ++numActions; + } + if (notificationPlayer.isGoNextAllowed()) { + notification.addAction(aNext.build()); + playbackActions |= PlaybackStateCompat.ACTION_SKIP_TO_NEXT; + ++numActions; + } + playbackState.setActions(playbackActions); + mediaSession.setPlaybackState(playbackState.build()); + + //Only allow deletion if no music is notificationPlayer + if (notificationPlayer.isPlaying()) { + notification.setOngoing(true); + } else { + notification.setOngoing(false); + } - //Display the notification - mediaSession.setActive(true); - final NotificationManager nm = (NotificationManager) service.getSystemService(Context.NOTIFICATION_SERVICE); - nm.notify(MPRIS_MEDIA_NOTIFICATION_ID, notification.build()); + //Use the MediaStyle notification, so it feels like other media players. That also allows adding actions + NotificationCompat.MediaStyle mediaStyle = new NotificationCompat.MediaStyle(); + if (numActions == 1) { + mediaStyle.setShowActionsInCompactView(0); + } else if (numActions == 2) { + mediaStyle.setShowActionsInCompactView(0, 1); + } else if (numActions >= 3) { + mediaStyle.setShowActionsInCompactView(0, 1, 2); } + mediaStyle.setMediaSession(mediaSession.getSessionToken()); + notification.setStyle(mediaStyle); + + //Display the notification + mediaSession.setActive(true); + final NotificationManager nm = (NotificationManager) service.getSystemService(Context.NOTIFICATION_SERVICE); + nm.notify(MPRIS_MEDIA_NOTIFICATION_ID, notification.build()); }); } diff --git a/src/org/kde/kdeconnect/Plugins/NotificationsPlugin/NotificationFilterActivity.java b/src/org/kde/kdeconnect/Plugins/NotificationsPlugin/NotificationFilterActivity.java --- a/src/org/kde/kdeconnect/Plugins/NotificationsPlugin/NotificationFilterActivity.java +++ b/src/org/kde/kdeconnect/Plugins/NotificationsPlugin/NotificationFilterActivity.java @@ -98,38 +98,25 @@ setContentView(R.layout.activity_notification_filter); appDatabase = new AppDatabase(NotificationFilterActivity.this, false); - new Thread(new Runnable() { - @Override - public void run() { - - PackageManager packageManager = getPackageManager(); - List appList = packageManager.getInstalledApplications(0); - int count = appList.size(); - - apps = new AppListInfo[count]; - for (int i = 0; i < count; i++) { - ApplicationInfo appInfo = appList.get(i); - apps[i] = new AppListInfo(); - apps[i].pkg = appInfo.packageName; - apps[i].name = appInfo.loadLabel(packageManager).toString(); - apps[i].icon = resizeIcon(appInfo.loadIcon(packageManager), 48); - apps[i].isEnabled = appDatabase.isEnabled(appInfo.packageName); - } - - Arrays.sort(apps, new Comparator() { - @Override - public int compare(AppListInfo lhs, AppListInfo rhs) { - return StringsHelper.compare(lhs.name, rhs.name); - } - }); - - runOnUiThread(new Runnable() { - @Override - public void run() { - displayAppList(); - } - }); + new Thread(() -> { + + PackageManager packageManager = getPackageManager(); + List appList = packageManager.getInstalledApplications(0); + int count = appList.size(); + + apps = new AppListInfo[count]; + for (int i = 0; i < count; i++) { + ApplicationInfo appInfo = appList.get(i); + apps[i] = new AppListInfo(); + apps[i].pkg = appInfo.packageName; + apps[i].name = appInfo.loadLabel(packageManager).toString(); + apps[i].icon = resizeIcon(appInfo.loadIcon(packageManager), 48); + apps[i].isEnabled = appDatabase.isEnabled(appInfo.packageName); } + + Arrays.sort(apps, (lhs, rhs) -> StringsHelper.compare(lhs.name, rhs.name)); + + runOnUiThread(this::displayAppList); }).start(); } @@ -140,13 +127,10 @@ AppListAdapter adapter = new AppListAdapter(); listView.setAdapter(adapter); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, int i, long l) { - boolean checked = listView.isItemChecked(i); - appDatabase.setEnabled(apps[i].pkg, checked); - apps[i].isEnabled = checked; - } + listView.setOnItemClickListener((adapterView, view, i, l) -> { + boolean checked = listView.isItemChecked(i); + appDatabase.setEnabled(apps[i].pkg, checked); + apps[i].isEnabled = checked; }); for (int i = 0; i < apps.length; i++) { diff --git a/src/org/kde/kdeconnect/Plugins/NotificationsPlugin/NotificationsPlugin.java b/src/org/kde/kdeconnect/Plugins/NotificationsPlugin/NotificationsPlugin.java --- a/src/org/kde/kdeconnect/Plugins/NotificationsPlugin/NotificationsPlugin.java +++ b/src/org/kde/kdeconnect/Plugins/NotificationsPlugin/NotificationsPlugin.java @@ -108,17 +108,14 @@ appDatabase = new AppDatabase(context, true); - NotificationReceiver.RunCommand(context, new NotificationReceiver.InstanceCallback() { - @Override - public void onServiceStart(NotificationReceiver service) { + NotificationReceiver.RunCommand(context, service -> { - service.addListener(NotificationsPlugin.this); + service.addListener(NotificationsPlugin.this); - serviceReady = service.isConnected(); + serviceReady = service.isConnected(); - if (serviceReady) { - sendCurrentNotifications(service); - } + if (serviceReady) { + sendCurrentNotifications(service); } }); @@ -128,12 +125,7 @@ @Override public void onDestroy() { - NotificationReceiver.RunCommand(context, new NotificationReceiver.InstanceCallback() { - @Override - public void onServiceStart(NotificationReceiver service) { - service.removeListener(NotificationsPlugin.this); - } - }); + NotificationReceiver.RunCommand(context, service -> service.removeListener(NotificationsPlugin.this)); } @Override @@ -461,22 +453,14 @@ if (np.getBoolean("request")) { if (serviceReady) { - NotificationReceiver.RunCommand(context, new NotificationReceiver.InstanceCallback() { - @Override - public void onServiceStart(NotificationReceiver service) { - sendCurrentNotifications(service); - } - }); + NotificationReceiver.RunCommand(context, this::sendCurrentNotifications); } } else if (np.has("cancel")) { - NotificationReceiver.RunCommand(context, new NotificationReceiver.InstanceCallback() { - @Override - public void onServiceStart(NotificationReceiver service) { - String dismissedId = np.getString("cancel"); - cancelNotificationCompat(service, dismissedId); - } + NotificationReceiver.RunCommand(context, service -> { + String dismissedId = np.getString("cancel"); + cancelNotificationCompat(service, dismissedId); }); } else if (np.has("requestReplyId") && np.has("message")) { @@ -497,18 +481,12 @@ return new AlertDialog.Builder(deviceActivity) .setTitle(R.string.pref_plugin_notifications) .setMessage(R.string.no_permissions) - .setPositiveButton(R.string.open_settings, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - Intent intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"); - deviceActivity.startActivityForResult(intent, MainActivity.RESULT_NEEDS_RELOAD); - } + .setPositiveButton(R.string.open_settings, (dialogInterface, i) -> { + Intent intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"); + deviceActivity.startActivityForResult(intent, MainActivity.RESULT_NEEDS_RELOAD); }) - .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - //Do nothing - } + .setNegativeButton(R.string.cancel, (dialogInterface, i) -> { + //Do nothing }) .create(); diff --git a/src/org/kde/kdeconnect/Plugins/Plugin.java b/src/org/kde/kdeconnect/Plugins/Plugin.java --- a/src/org/kde/kdeconnect/Plugins/Plugin.java +++ b/src/org/kde/kdeconnect/Plugins/Plugin.java @@ -202,12 +202,7 @@ if (!hasMainActivity()) return null; Button b = new Button(activity); b.setText(getActionName()); - b.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - startMainActivity(activity); - } - }); + b.setOnClickListener(view -> startMainActivity(activity)); return b; } @@ -242,17 +237,9 @@ return new AlertDialog.Builder(activity) .setTitle(getDisplayName()) .setMessage(reason) - .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - ActivityCompat.requestPermissions(activity, permissions, 0); - } - }) - .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - //Do nothing - } + .setPositiveButton(R.string.ok, (dialogInterface, i) -> ActivityCompat.requestPermissions(activity, permissions, 0)) + .setNegativeButton(R.string.cancel, (dialogInterface, i) -> { + //Do nothing }) .create(); } diff --git a/src/org/kde/kdeconnect/Plugins/RemoteKeyboardPlugin/RemoteKeyboardPlugin.java b/src/org/kde/kdeconnect/Plugins/RemoteKeyboardPlugin/RemoteKeyboardPlugin.java --- a/src/org/kde/kdeconnect/Plugins/RemoteKeyboardPlugin/RemoteKeyboardPlugin.java +++ b/src/org/kde/kdeconnect/Plugins/RemoteKeyboardPlugin/RemoteKeyboardPlugin.java @@ -121,12 +121,7 @@ releaseInstances(); } if (RemoteKeyboardService.instance != null) - RemoteKeyboardService.instance.handler.post(new Runnable() { - @Override - public void run() { - RemoteKeyboardService.instance.updateInputView(); - } - }); + RemoteKeyboardService.instance.handler.post(() -> RemoteKeyboardService.instance.updateInputView()); return true; } @@ -137,12 +132,7 @@ if (instances.contains(this)) { instances.remove(this); if (instances.size() < 1 && RemoteKeyboardService.instance != null) - RemoteKeyboardService.instance.handler.post(new Runnable() { - @Override - public void run() { - RemoteKeyboardService.instance.updateInputView(); - } - }); + RemoteKeyboardService.instance.handler.post(() -> RemoteKeyboardService.instance.updateInputView()); } } finally { releaseInstances(); diff --git a/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/AddCommandDialog.java b/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/AddCommandDialog.java --- a/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/AddCommandDialog.java +++ b/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/AddCommandDialog.java @@ -35,21 +35,17 @@ builder.setView(view); - builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { + builder.setPositiveButton(R.string.ok, (dialog, id) -> { - if (getActivity() instanceof RunCommandActivity) { + if (getActivity() instanceof RunCommandActivity) { - String name = nameField.getText().toString(); - String command = commandField.getText().toString(); + String name = nameField.getText().toString(); + String command = commandField.getText().toString(); - ((RunCommandActivity) getActivity()).dialogResult(name, command); - } + ((RunCommandActivity) getActivity()).dialogResult(name, command); } }); - builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - } + builder.setNegativeButton(R.string.cancel, (dialog, id) -> { }); return builder.create(); diff --git a/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/RunCommandActivity.java b/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/RunCommandActivity.java --- a/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/RunCommandActivity.java +++ b/src/org/kde/kdeconnect/Plugins/RunCommandPlugin/RunCommandActivity.java @@ -45,71 +45,54 @@ public class RunCommandActivity extends AppCompatActivity { private String deviceId; - private final RunCommandPlugin.CommandsChangedCallback commandsChangedCallback = new RunCommandPlugin.CommandsChangedCallback() { - @Override - public void update() { - updateView(); - } - }; + private final RunCommandPlugin.CommandsChangedCallback commandsChangedCallback = this::updateView; private void updateView() { - BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(final BackgroundService service) { - - final Device device = service.getDevice(deviceId); - final RunCommandPlugin plugin = device.getPlugin(RunCommandPlugin.class); - if (plugin == null) { - Log.e("RunCommandActivity", "device has no runcommand plugin!"); - return; - } + BackgroundService.RunCommand(this, service -> { + + final Device device = service.getDevice(deviceId); + final RunCommandPlugin plugin = device.getPlugin(RunCommandPlugin.class); + if (plugin == null) { + Log.e("RunCommandActivity", "device has no runcommand plugin!"); + return; + } - runOnUiThread(new Runnable() { - @Override - public void run() { - ListView view = (ListView) findViewById(R.id.runcommandslist); - - final ArrayList commandItems = new ArrayList<>(); - for (JSONObject obj : plugin.getCommandList()) { - try { - commandItems.add(new CommandEntry(obj.getString("name"), - obj.getString("command"), obj.getString("key"))); - } catch (JSONException e) { - e.printStackTrace(); - } - } - - Collections.sort(commandItems, new Comparator() { - @Override - public int compare(ListAdapter.Item lhs, ListAdapter.Item rhs) { - String lName = ((CommandEntry) lhs).getName(); - String rName = ((CommandEntry) rhs).getName(); - return lName.compareTo(rName); - } - }); - - ListAdapter adapter = new ListAdapter(RunCommandActivity.this, commandItems); - - view.setAdapter(adapter); - view.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, int i, long l) { - CommandEntry entry = (CommandEntry) commandItems.get(i); - plugin.runCommand(entry.getKey()); - } - }); - - - TextView explanation = (TextView) findViewById(R.id.addcomand_explanation); - String text = getString(R.string.addcommand_explanation); - if (!plugin.canAddCommand()) { - text += "\n" + getString(R.string.addcommand_explanation2); - } - explanation.setText(text); - explanation.setVisibility(commandItems.isEmpty() ? View.VISIBLE : View.GONE); + runOnUiThread(() -> { + ListView view = (ListView) findViewById(R.id.runcommandslist); + + final ArrayList commandItems = new ArrayList<>(); + for (JSONObject obj : plugin.getCommandList()) { + try { + commandItems.add(new CommandEntry(obj.getString("name"), + obj.getString("command"), obj.getString("key"))); + } catch (JSONException e) { + e.printStackTrace(); } + } + + Collections.sort(commandItems, (lhs, rhs) -> { + String lName = ((CommandEntry) lhs).getName(); + String rName = ((CommandEntry) rhs).getName(); + return lName.compareTo(rName); }); - } + + ListAdapter adapter = new ListAdapter(RunCommandActivity.this, commandItems); + + view.setAdapter(adapter); + view.setOnItemClickListener((adapterView, view1, i, l) -> { + CommandEntry entry = (CommandEntry) commandItems.get(i); + plugin.runCommand(entry.getKey()); + }); + + + TextView explanation = (TextView) findViewById(R.id.addcomand_explanation); + String text = getString(R.string.addcommand_explanation); + if (!plugin.canAddCommand()) { + text += "\n" + getString(R.string.addcommand_explanation2); + } + explanation.setText(text); + explanation.setVisibility(commandItems.isEmpty() ? View.VISIBLE : View.GONE); + }); }); } @@ -125,63 +108,49 @@ FloatingActionButton addCommandButton = (FloatingActionButton) findViewById(R.id.add_command_button); addCommandButton.setVisibility(canAddCommands ? View.VISIBLE : View.GONE); - addCommandButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - new AddCommandDialog().show(getSupportFragmentManager(), "addcommanddialog"); - } - }); + addCommandButton.setOnClickListener(view -> new AddCommandDialog().show(getSupportFragmentManager(), "addcommanddialog")); updateView(); } @Override protected void onResume() { super.onResume(); - BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(final BackgroundService service) { + BackgroundService.RunCommand(this, service -> { - final Device device = service.getDevice(deviceId); - final RunCommandPlugin plugin = device.getPlugin(RunCommandPlugin.class); - if (plugin == null) { - Log.e("RunCommandActivity", "device has no runcommand plugin!"); - return; - } - plugin.addCommandsUpdatedCallback(commandsChangedCallback); + final Device device = service.getDevice(deviceId); + final RunCommandPlugin plugin = device.getPlugin(RunCommandPlugin.class); + if (plugin == null) { + Log.e("RunCommandActivity", "device has no runcommand plugin!"); + return; } + plugin.addCommandsUpdatedCallback(commandsChangedCallback); }); } @Override protected void onPause() { super.onPause(); - BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(final BackgroundService service) { + BackgroundService.RunCommand(this, service -> { - final Device device = service.getDevice(deviceId); - final RunCommandPlugin plugin = device.getPlugin(RunCommandPlugin.class); - if (plugin == null) { - Log.e("RunCommandActivity", "device has no runcommand plugin!"); - return; - } - plugin.removeCommandsUpdatedCallback(commandsChangedCallback); + final Device device = service.getDevice(deviceId); + final RunCommandPlugin plugin = device.getPlugin(RunCommandPlugin.class); + if (plugin == null) { + Log.e("RunCommandActivity", "device has no runcommand plugin!"); + return; } + plugin.removeCommandsUpdatedCallback(commandsChangedCallback); }); } public void dialogResult(final String cmdName, final String cmdCmd) { - BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - Device device = service.getDevice(deviceId); - RunCommandPlugin plugin = device.getPlugin(RunCommandPlugin.class); - if(!cmdName.isEmpty() && !cmdCmd.isEmpty()) { - plugin.addCommand(cmdName, cmdCmd); - } + BackgroundService.RunCommand(this, service -> { + Device device = service.getDevice(deviceId); + RunCommandPlugin plugin = device.getPlugin(RunCommandPlugin.class); + if(!cmdName.isEmpty() && !cmdCmd.isEmpty()) { + plugin.addCommand(cmdName, cmdCmd); } }); } diff --git a/src/org/kde/kdeconnect/Plugins/SharePlugin/SendFileActivity.java b/src/org/kde/kdeconnect/Plugins/SharePlugin/SendFileActivity.java --- a/src/org/kde/kdeconnect/Plugins/SharePlugin/SendFileActivity.java +++ b/src/org/kde/kdeconnect/Plugins/SharePlugin/SendFileActivity.java @@ -89,17 +89,14 @@ if (uris.isEmpty()) { Log.w("SendFileActivity", "No files to send?"); } else { - BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - Device device = service.getDevice(mDeviceId); - if (device == null) { - Log.e("SendFileActivity", "Device is null"); - finish(); - return; - } - SharePlugin.queuedSendUriList(getApplicationContext(), device, uris); + BackgroundService.RunCommand(this, service -> { + Device device = service.getDevice(mDeviceId); + if (device == null) { + Log.e("SendFileActivity", "Device is null"); + finish(); + return; } + SharePlugin.queuedSendUriList(getApplicationContext(), device, uris); }); } } diff --git a/src/org/kde/kdeconnect/Plugins/SharePlugin/ShareActivity.java b/src/org/kde/kdeconnect/Plugins/SharePlugin/ShareActivity.java --- a/src/org/kde/kdeconnect/Plugins/SharePlugin/ShareActivity.java +++ b/src/org/kde/kdeconnect/Plugins/SharePlugin/ShareActivity.java @@ -15,8 +15,8 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . -*/ + * along with this program. If not, see . + */ package org.kde.kdeconnect.Plugins.SharePlugin; @@ -70,28 +70,15 @@ private void updateComputerListAction() { updateComputerList(); - BackgroundService.RunCommand(ShareActivity.this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - service.onNetworkChange(); - } - }); + BackgroundService.RunCommand(ShareActivity.this, BackgroundService::onNetworkChange); mSwipeRefreshLayout.setRefreshing(true); - new Thread(new Runnable() { - @Override - public void run() { - try { - Thread.sleep(1500); - } catch (InterruptedException ignored) { - } - runOnUiThread(new Runnable() { - @Override - public void run() { - mSwipeRefreshLayout.setRefreshing(false); - } - }); + new Thread(() -> { + try { + Thread.sleep(1500); + } catch (InterruptedException ignored) { } + runOnUiThread(() -> mSwipeRefreshLayout.setRefreshing(false)); }).start(); } @@ -105,41 +92,32 @@ return; } - BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(final BackgroundService service) { + BackgroundService.RunCommand(this, service -> { - Collection devices = service.getDevices().values(); - final ArrayList devicesList = new ArrayList<>(); - final ArrayList items = new ArrayList<>(); + Collection devices = service.getDevices().values(); + final ArrayList devicesList = new ArrayList<>(); + final ArrayList items = new ArrayList<>(); - items.add(new SectionItem(getString(R.string.share_to))); + items.add(new SectionItem(getString(R.string.share_to))); - for (Device d : devices) { - if (d.isReachable() && d.isPaired()) { - devicesList.add(d); - items.add(new EntryItem(d.getName())); - } + for (Device d : devices) { + if (d.isReachable() && d.isPaired()) { + devicesList.add(d); + items.add(new EntryItem(d.getName())); } + } + + runOnUiThread(() -> { + ListView list = (ListView) findViewById(R.id.devices_list); + list.setAdapter(new ListAdapter(ShareActivity.this, items)); + list.setOnItemClickListener((adapterView, view, i, l) -> { - runOnUiThread(new Runnable() { - @Override - public void run() { - ListView list = (ListView) findViewById(R.id.devices_list); - list.setAdapter(new ListAdapter(ShareActivity.this, items)); - list.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView adapterView, View view, int i, long l) { - - Device device = devicesList.get(i - 1); //NOTE: -1 because of the title! - SharePlugin.share(intent, device); - finish(); - } - }); - } + Device device = devicesList.get(i - 1); //NOTE: -1 because of the title! + SharePlugin.share(intent, device); + finish(); }); + }); - } }); } @@ -154,12 +132,7 @@ ActionBar actionBar = getSupportActionBar(); mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.refresh_list_layout); mSwipeRefreshLayout.setOnRefreshListener( - new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - updateComputerListAction(); - } - } + this::updateComputerListAction ); if (actionBar != null) { actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_CUSTOM); @@ -176,46 +149,29 @@ if (deviceId != null) { - BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { - - @Override - public void onServiceStart(BackgroundService service) { - Log.d("DirectShare", "sharing to " + service.getDevice(deviceId).getName()); - Device device = service.getDevice(deviceId); - if (device.isReachable() && device.isPaired()) { - SharePlugin.share(intent, device); - } - finish(); + BackgroundService.RunCommand(this, service -> { + Log.d("DirectShare", "sharing to " + service.getDevice(deviceId).getName()); + Device device = service.getDevice(deviceId); + if (device.isReachable() && device.isPaired()) { + SharePlugin.share(intent, device); } + finish(); }); } else { BackgroundService.addGuiInUseCounter(this); - BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - service.onNetworkChange(); - service.addDeviceListChangedCallback("ShareActivity", new BackgroundService.DeviceListChangedCallback() { - @Override - public void onDeviceListChanged() { - updateComputerList(); - } - }); - } + BackgroundService.RunCommand(this, service -> { + service.onNetworkChange(); + service.addDeviceListChangedCallback("ShareActivity", this::updateComputerList); }); updateComputerList(); } } @Override protected void onStop() { - BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - service.removeDeviceListChangedCallback("ShareActivity"); - } - }); + BackgroundService.RunCommand(this, service -> service.removeDeviceListChangedCallback("ShareActivity")); BackgroundService.removeGuiInUseCounter(this); super.onStop(); } diff --git a/src/org/kde/kdeconnect/Plugins/SharePlugin/SharePlugin.java b/src/org/kde/kdeconnect/Plugins/SharePlugin/SharePlugin.java --- a/src/org/kde/kdeconnect/Plugins/SharePlugin/SharePlugin.java +++ b/src/org/kde/kdeconnect/Plugins/SharePlugin/SharePlugin.java @@ -219,64 +219,61 @@ final ShareNotification notification = new ShareNotification(device, filename); notification.show(); - new Thread(new Runnable() { - @Override - public void run() { - try { - byte data[] = new byte[4096]; - long progress = 0, prevProgressPercentage = -1; - int count; - long lastUpdate = 0; - while ((count = input.read(data)) >= 0) { - progress += count; - destinationOutput.write(data, 0, count); - if (fileLength > 0) { - if (progress >= fileLength) break; - long progressPercentage = (progress * 100 / fileLength); - if (progressPercentage != prevProgressPercentage && - System.currentTimeMillis() - lastUpdate > 100) { - prevProgressPercentage = progressPercentage; - lastUpdate = System.currentTimeMillis(); - - notification.setProgress((int) progressPercentage); - notification.show(); - } + new Thread(() -> { + try { + byte data[] = new byte[4096]; + long progress = 0, prevProgressPercentage = -1; + int count; + long lastUpdate = 0; + while ((count = input.read(data)) >= 0) { + progress += count; + destinationOutput.write(data, 0, count); + if (fileLength > 0) { + if (progress >= fileLength) break; + long progressPercentage = (progress * 100 / fileLength); + if (progressPercentage != prevProgressPercentage && + System.currentTimeMillis() - lastUpdate > 100) { + prevProgressPercentage = progressPercentage; + lastUpdate = System.currentTimeMillis(); + + notification.setProgress((int) progressPercentage); + notification.show(); } - //else Log.e("SharePlugin", "Infinite loop? :D"); } + //else Log.e("SharePlugin", "Infinite loop? :D"); + } - destinationOutput.flush(); + destinationOutput.flush(); - Log.i("SharePlugin", "Transfer finished: " + destinationUri.getPath()); + Log.i("SharePlugin", "Transfer finished: " + destinationUri.getPath()); - //Update the notification and allow to open the file from it - notification.setFinished(true); - notification.setURI(destinationUri, mimeType); - notification.show(); + //Update the notification and allow to open the file from it + notification.setFinished(true); + notification.setURI(destinationUri, mimeType); + notification.show(); - if (!customDestination && Build.VERSION.SDK_INT >= 12) { - Log.i("SharePlugin", "Adding to downloads"); - DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); - manager.addCompletedDownload(destinationUri.getLastPathSegment(), device.getName(), true, mimeType, destinationUri.getPath(), fileLength, false); - } else { - //Make sure it is added to the Android Gallery anyway - MediaStoreHelper.indexFile(context, destinationUri); - } + if (!customDestination && Build.VERSION.SDK_INT >= 12) { + Log.i("SharePlugin", "Adding to downloads"); + DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); + manager.addCompletedDownload(destinationUri.getLastPathSegment(), device.getName(), true, mimeType, destinationUri.getPath(), fileLength, false); + } else { + //Make sure it is added to the Android Gallery anyway + MediaStoreHelper.indexFile(context, destinationUri); + } + } catch (Exception e) { + Log.e("SharePlugin", "Receiver thread exception"); + e.printStackTrace(); + notification.setFinished(false); + notification.show(); + } finally { + try { + destinationOutput.close(); + } catch (Exception e) { + } + try { + input.close(); } catch (Exception e) { - Log.e("SharePlugin", "Receiver thread exception"); - e.printStackTrace(); - notification.setFinished(false); - notification.show(); - } finally { - try { - destinationOutput.close(); - } catch (Exception e) { - } - try { - input.close(); - } catch (Exception e) { - } } } }).start(); @@ -302,21 +299,18 @@ final NotificationUpdateCallback notificationUpdateCallback = new NotificationUpdateCallback(context, device, toSend); //Do the sending in background - new Thread(new Runnable() { - @Override - public void run() { - //Actually send the files - try { - for (NetworkPacket np : toSend) { - boolean success = device.sendPacketBlocking(np, notificationUpdateCallback); - if (!success) { - Log.e("SharePlugin", "Error sending files"); - return; - } + new Thread(() -> { + //Actually send the files + try { + for (NetworkPacket np : toSend) { + boolean success = device.sendPacketBlocking(np, notificationUpdateCallback); + if (!success) { + Log.e("SharePlugin", "Error sending files"); + return; } - } catch (Exception e) { - e.printStackTrace(); } + } catch (Exception e) { + e.printStackTrace(); } }).start(); diff --git a/src/org/kde/kdeconnect/Plugins/SharePlugin/ShareSettingsActivity.java b/src/org/kde/kdeconnect/Plugins/SharePlugin/ShareSettingsActivity.java --- a/src/org/kde/kdeconnect/Plugins/SharePlugin/ShareSettingsActivity.java +++ b/src/org/kde/kdeconnect/Plugins/SharePlugin/ShareSettingsActivity.java @@ -36,20 +36,14 @@ filePicker = findPreference("share_destination_folder_preference"); if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)) { - customDownloads.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - updateFilePickerStatus((Boolean) newValue); - return true; - } + customDownloads.setOnPreferenceChangeListener((preference, newValue) -> { + updateFilePickerStatus((Boolean) newValue); + return true; }); - filePicker.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { - @Override - public boolean onPreferenceClick(Preference preference) { - Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); - startActivityForResult(intent, RESULT_PICKER); - return true; - } + filePicker.setOnPreferenceClickListener(preference -> { + Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); + startActivityForResult(intent, RESULT_PICKER); + return true; }); } else { customDownloads.setEnabled(false); diff --git a/src/org/kde/kdeconnect/UserInterface/CustomDevicesActivity.java b/src/org/kde/kdeconnect/UserInterface/CustomDevicesActivity.java --- a/src/org/kde/kdeconnect/UserInterface/CustomDevicesActivity.java +++ b/src/org/kde/kdeconnect/UserInterface/CustomDevicesActivity.java @@ -65,66 +65,48 @@ list.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, ipAddressList)); - findViewById(android.R.id.button1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - addNewDevice(); - } - }); + findViewById(android.R.id.button1).setOnClickListener(v -> addNewDevice()); EditText ipEntryBox = (EditText) findViewById(R.id.ip_edittext); - ipEntryBox.setOnEditorActionListener(new TextView.OnEditorActionListener() { - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if (actionId == EditorInfo.IME_ACTION_SEND) { - addNewDevice(); - return true; - } - return false; + ipEntryBox.setOnEditorActionListener((v, actionId, event) -> { + if (actionId == EditorInfo.IME_ACTION_SEND) { + addNewDevice(); + return true; } + return false; }); } boolean dialogAlreadyShown = false; - private AdapterView.OnItemClickListener onClickListener = new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, View view, final int position, final long id) { + private AdapterView.OnItemClickListener onClickListener = (parent, view, position, id) -> { - if (dialogAlreadyShown) { - return; - } + if (dialogAlreadyShown) { + return; + } - // remove touched item after confirmation - DialogInterface.OnClickListener confirmationListener = new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - switch (which) { - case DialogInterface.BUTTON_POSITIVE: - ipAddressList.remove(position); - saveList(); - break; - case DialogInterface.BUTTON_NEGATIVE: - break; - } - } - }; - - AlertDialog.Builder builder = new AlertDialog.Builder(CustomDevicesActivity.this); - builder.setMessage("Delete " + ipAddressList.get(position) + " ?"); - builder.setPositiveButton("Yes", confirmationListener); - builder.setNegativeButton("No", confirmationListener); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { //DismissListener - dialogAlreadyShown = true; - builder.setOnDismissListener(new DialogInterface.OnDismissListener() { - @Override - public void onDismiss(DialogInterface dialog) { - dialogAlreadyShown = false; - } - }); + // remove touched item after confirmation + DialogInterface.OnClickListener confirmationListener = (dialog, which) -> { + switch (which) { + case DialogInterface.BUTTON_POSITIVE: + ipAddressList.remove(position); + saveList(); + break; + case DialogInterface.BUTTON_NEGATIVE: + break; } + }; - builder.show(); + AlertDialog.Builder builder = new AlertDialog.Builder(CustomDevicesActivity.this); + builder.setMessage("Delete " + ipAddressList.get(position) + " ?"); + builder.setPositiveButton("Yes", confirmationListener); + builder.setNegativeButton("No", confirmationListener); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { //DismissListener + dialogAlreadyShown = true; + builder.setOnDismissListener(dialog -> dialogAlreadyShown = false); } + + builder.show(); }; private void addNewDevice() { diff --git a/src/org/kde/kdeconnect/UserInterface/DeviceFragment.java b/src/org/kde/kdeconnect/UserInterface/DeviceFragment.java --- a/src/org/kde/kdeconnect/UserInterface/DeviceFragment.java +++ b/src/org/kde/kdeconnect/UserInterface/DeviceFragment.java @@ -110,97 +110,64 @@ //Log.e("DeviceFragment", "device: " + deviceId); - BackgroundService.RunCommand(mActivity, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - device = service.getDevice(mDeviceId); - if (device == null) { - Log.e("DeviceFragment", "Trying to display a device fragment but the device is not present"); - mActivity.onDeviceSelected(null); - return; - } + BackgroundService.RunCommand(mActivity, service -> { + device = service.getDevice(mDeviceId); + if (device == null) { + Log.e("DeviceFragment", "Trying to display a device fragment but the device is not present"); + mActivity.onDeviceSelected(null); + return; + } - mActivity.getSupportActionBar().setTitle(device.getName()); + mActivity.getSupportActionBar().setTitle(device.getName()); - device.addPairingCallback(pairingCallback); - device.addPluginsChangedListener(pluginsChangedListener); + device.addPairingCallback(pairingCallback); + device.addPluginsChangedListener(pluginsChangedListener); - refreshUI(); + refreshUI(); - } }); final Button pairButton = (Button) rootView.findViewById(R.id.pair_button); - pairButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - pairButton.setVisibility(View.GONE); - ((TextView) rootView.findViewById(R.id.pair_message)).setText(""); - rootView.findViewById(R.id.pair_progress).setVisibility(View.VISIBLE); - BackgroundService.RunCommand(mActivity, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - device = service.getDevice(deviceId); - if (device == null) return; - device.requestPairing(); - } - }); - } + pairButton.setOnClickListener(view -> { + pairButton.setVisibility(View.GONE); + ((TextView) rootView.findViewById(R.id.pair_message)).setText(""); + rootView.findViewById(R.id.pair_progress).setVisibility(View.VISIBLE); + BackgroundService.RunCommand(mActivity, service -> { + device = service.getDevice(deviceId); + if (device == null) return; + device.requestPairing(); + }); }); - rootView.findViewById(R.id.accept_button).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - BackgroundService.RunCommand(mActivity, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - if (device != null) { - device.acceptPairing(); - rootView.findViewById(R.id.pairing_buttons).setVisibility(View.GONE); - } - } - }); + rootView.findViewById(R.id.accept_button).setOnClickListener(view -> BackgroundService.RunCommand(mActivity, service -> { + if (device != null) { + device.acceptPairing(); + rootView.findViewById(R.id.pairing_buttons).setVisibility(View.GONE); } - }); + })); - rootView.findViewById(R.id.reject_button).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - BackgroundService.RunCommand(mActivity, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - if (device != null) { - //Remove listener so buttons don't show for a while before changing the view - device.removePluginsChangedListener(pluginsChangedListener); - device.removePairingCallback(pairingCallback); - device.rejectPairing(); - } - mActivity.onDeviceSelected(null); - } - }); + rootView.findViewById(R.id.reject_button).setOnClickListener(view -> BackgroundService.RunCommand(mActivity, service -> { + if (device != null) { + //Remove listener so buttons don't show for a while before changing the view + device.removePluginsChangedListener(pluginsChangedListener); + device.removePairingCallback(pairingCallback); + device.rejectPairing(); } - }); + mActivity.onDeviceSelected(null); + })); return rootView; } - final Device.PluginsChangedListener pluginsChangedListener = new Device.PluginsChangedListener() { - @Override - public void onPluginsChanged(final Device device) { - refreshUI(); - } - }; + final Device.PluginsChangedListener pluginsChangedListener = device -> refreshUI(); @Override public void onDestroyView() { - BackgroundService.RunCommand(mActivity, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - Device device = service.getDevice(mDeviceId); - if (device == null) return; - device.removePluginsChangedListener(pluginsChangedListener); - device.removePairingCallback(pairingCallback); - } + BackgroundService.RunCommand(mActivity, service -> { + Device device = service.getDevice(mDeviceId); + if (device == null) return; + device.removePluginsChangedListener(pluginsChangedListener); + device.removePairingCallback(pairingCallback); }); super.onDestroyView(); } @@ -223,63 +190,47 @@ if (!p.displayInContextMenu()) { continue; } - menu.add(p.getActionName()).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - p.startMainActivity(mActivity); - return true; - } + menu.add(p.getActionName()).setOnMenuItemClickListener(item -> { + p.startMainActivity(mActivity); + return true; }); } - menu.add(R.string.device_menu_plugins).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem menuItem) { - Intent intent = new Intent(mActivity, SettingsActivity.class); - intent.putExtra("deviceId", mDeviceId); - startActivity(intent); - return true; - } + menu.add(R.string.device_menu_plugins).setOnMenuItemClickListener(menuItem -> { + Intent intent = new Intent(mActivity, SettingsActivity.class); + intent.putExtra("deviceId", mDeviceId); + startActivity(intent); + return true; }); if (device.isReachable()) { - menu.add(R.string.encryption_info_title).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem menuItem) { - Context context = mActivity; - AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(context.getResources().getString(R.string.encryption_info_title)); - builder.setPositiveButton(context.getResources().getString(R.string.ok), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - dialog.dismiss(); - } - }); + menu.add(R.string.encryption_info_title).setOnMenuItemClickListener(menuItem -> { + Context context = mActivity; + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(context.getResources().getString(R.string.encryption_info_title)); + builder.setPositiveButton(context.getResources().getString(R.string.ok), (dialog, id) -> dialog.dismiss()); - if (device.certificate == null) { - builder.setMessage(R.string.encryption_info_msg_no_ssl); - } else { - builder.setMessage(context.getResources().getString(R.string.my_device_fingerprint) + "\n" + SslHelper.getCertificateHash(SslHelper.certificate) + "\n\n" - + context.getResources().getString(R.string.remote_device_fingerprint) + "\n" + SslHelper.getCertificateHash(device.certificate)); - } - builder.create().show(); - return true; + if (device.certificate == null) { + builder.setMessage(R.string.encryption_info_msg_no_ssl); + } else { + builder.setMessage(context.getResources().getString(R.string.my_device_fingerprint) + "\n" + SslHelper.getCertificateHash(SslHelper.certificate) + "\n\n" + + context.getResources().getString(R.string.remote_device_fingerprint) + "\n" + SslHelper.getCertificateHash(device.certificate)); } + builder.create().show(); + return true; }); } if (device.isPaired()) { - menu.add(R.string.device_menu_unpair).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem menuItem) { - //Remove listener so buttons don't show for a while before changing the view - device.removePluginsChangedListener(pluginsChangedListener); - device.removePairingCallback(pairingCallback); - device.unpair(); - mActivity.onDeviceSelected(null); - return true; - } + menu.add(R.string.device_menu_unpair).setOnMenuItemClickListener(menuItem -> { + //Remove listener so buttons don't show for a while before changing the view + device.removePluginsChangedListener(pluginsChangedListener); + device.removePairingCallback(pairingCallback); + device.unpair(); + mActivity.onDeviceSelected(null); + return true; }); } @@ -291,19 +242,16 @@ getView().setFocusableInTouchMode(true); getView().requestFocus(); - getView().setOnKeyListener(new View.OnKeyListener() { - @Override - public boolean onKey(View v, int keyCode, KeyEvent event) { - if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { - boolean fromDeviceList = getArguments().getBoolean(ARG_FROM_DEVICE_LIST, false); - // Handle back button so we go to the list of devices in case we came from there - if (fromDeviceList) { - mActivity.onDeviceSelected(null); - return true; - } + getView().setOnKeyListener((v, keyCode, event) -> { + if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { + boolean fromDeviceList = getArguments().getBoolean(ARG_FROM_DEVICE_LIST, false); + // Handle back button so we go to the list of devices in case we came from there + if (fromDeviceList) { + mActivity.onDeviceSelected(null); + return true; } - return false; } + return false; }); } @@ -347,12 +295,7 @@ if (!p.hasMainActivity()) continue; if (p.displayInContextMenu()) continue; - pluginListItems.add(new PluginItem(p, new View.OnClickListener() { - @Override - public void onClick(View v) { - p.startMainActivity(mActivity); - } - })); + pluginListItems.add(new PluginItem(p, v -> p.startMainActivity(mActivity))); } createPluginsList(device.getFailedPlugins(), R.string.plugins_failed_to_load, new PluginClickListener() { @@ -408,83 +351,73 @@ @Override public void pairingFailed(final String error) { - mActivity.runOnUiThread(new Runnable() { - @Override - public void run() { - if (rootView == null) return; - ((TextView) rootView.findViewById(R.id.pair_message)).setText(error); - rootView.findViewById(R.id.pair_progress).setVisibility(View.GONE); - rootView.findViewById(R.id.pair_button).setVisibility(View.VISIBLE); - rootView.findViewById(R.id.pair_request).setVisibility(View.GONE); - refreshUI(); - } + mActivity.runOnUiThread(() -> { + if (rootView == null) return; + ((TextView) rootView.findViewById(R.id.pair_message)).setText(error); + rootView.findViewById(R.id.pair_progress).setVisibility(View.GONE); + rootView.findViewById(R.id.pair_button).setVisibility(View.VISIBLE); + rootView.findViewById(R.id.pair_request).setVisibility(View.GONE); + refreshUI(); }); } @Override public void unpaired() { - mActivity.runOnUiThread(new Runnable() { - @Override - public void run() { - if (rootView == null) return; - ((TextView) rootView.findViewById(R.id.pair_message)).setText(R.string.device_not_paired); - rootView.findViewById(R.id.pair_progress).setVisibility(View.GONE); - rootView.findViewById(R.id.pair_button).setVisibility(View.VISIBLE); - rootView.findViewById(R.id.pair_request).setVisibility(View.GONE); - refreshUI(); - } + mActivity.runOnUiThread(() -> { + if (rootView == null) return; + ((TextView) rootView.findViewById(R.id.pair_message)).setText(R.string.device_not_paired); + rootView.findViewById(R.id.pair_progress).setVisibility(View.GONE); + rootView.findViewById(R.id.pair_button).setVisibility(View.VISIBLE); + rootView.findViewById(R.id.pair_request).setVisibility(View.GONE); + refreshUI(); }); } }; public static void acceptPairing(final String devId, final MainActivity activity) { final DeviceFragment frag = new DeviceFragment(devId, activity); - BackgroundService.RunCommand(activity, new BackgroundService.InstanceCallback() { - public void onServiceStart(BackgroundService service) { - Device dev = service.getDevice(devId); - if (dev == null) { - Log.w("rejectPairing", "Device no longer exists: " + devId); - return; - } - activity.getSupportActionBar().setTitle(dev.getName()); + BackgroundService.RunCommand(activity, service -> { + Device dev = service.getDevice(devId); + if (dev == null) { + Log.w("rejectPairing", "Device no longer exists: " + devId); + return; + } + activity.getSupportActionBar().setTitle(dev.getName()); - dev.addPairingCallback(frag.pairingCallback); - dev.addPluginsChangedListener(frag.pluginsChangedListener); + dev.addPairingCallback(frag.pairingCallback); + dev.addPluginsChangedListener(frag.pluginsChangedListener); - frag.device = dev; - frag.device.acceptPairing(); + frag.device = dev; + frag.device.acceptPairing(); - frag.refreshUI(); + frag.refreshUI(); - } }); } public static void rejectPairing(final String devId, final MainActivity activity) { final DeviceFragment frag = new DeviceFragment(devId, activity); - BackgroundService.RunCommand(activity, new BackgroundService.InstanceCallback() { - public void onServiceStart(BackgroundService service) { - Device dev = service.getDevice(devId); - if (dev == null) { - Log.w("rejectPairing", "Device no longer exists: " + devId); - return; - } - activity.getSupportActionBar().setTitle(dev.getName()); + BackgroundService.RunCommand(activity, service -> { + Device dev = service.getDevice(devId); + if (dev == null) { + Log.w("rejectPairing", "Device no longer exists: " + devId); + return; + } + activity.getSupportActionBar().setTitle(dev.getName()); - dev.addPairingCallback(frag.pairingCallback); - dev.addPluginsChangedListener(frag.pluginsChangedListener); + dev.addPairingCallback(frag.pairingCallback); + dev.addPluginsChangedListener(frag.pluginsChangedListener); - frag.device = dev; + frag.device = dev; - //Remove listener so buttons don't show for a while before changing the view - frag.device.removePluginsChangedListener(frag.pluginsChangedListener); - frag.device.removePairingCallback(frag.pairingCallback); - frag.device.rejectPairing(); - activity.onDeviceSelected(null); + //Remove listener so buttons don't show for a while before changing the view + frag.device.removePluginsChangedListener(frag.pluginsChangedListener); + frag.device.removePairingCallback(frag.pairingCallback); + frag.device.rejectPairing(); + activity.onDeviceSelected(null); - frag.refreshUI(); - } + frag.refreshUI(); }); } diff --git a/src/org/kde/kdeconnect/UserInterface/List/PairingDeviceItem.java b/src/org/kde/kdeconnect/UserInterface/List/PairingDeviceItem.java --- a/src/org/kde/kdeconnect/UserInterface/List/PairingDeviceItem.java +++ b/src/org/kde/kdeconnect/UserInterface/List/PairingDeviceItem.java @@ -74,12 +74,7 @@ v.findViewById(R.id.list_item_entry_summary).setVisibility(View.GONE); } - v.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - callback.pairingClicked(device); - } - }); + v.setOnClickListener(v1 -> callback.pairingClicked(device)); return v; } diff --git a/src/org/kde/kdeconnect/UserInterface/MainActivity.java b/src/org/kde/kdeconnect/UserInterface/MainActivity.java --- a/src/org/kde/kdeconnect/UserInterface/MainActivity.java +++ b/src/org/kde/kdeconnect/UserInterface/MainActivity.java @@ -92,30 +92,22 @@ TextView nameView = (TextView) mDrawerHeader.findViewById(R.id.device_name); nameView.setText(deviceName); - View.OnClickListener renameListener = new View.OnClickListener() { - @Override - public void onClick(View v) { - renameDevice(); - } - }; + View.OnClickListener renameListener = v -> renameDevice(); mDrawerHeader.findViewById(R.id.kdeconnect_label).setOnClickListener(renameListener); mDrawerHeader.findViewById(R.id.device_name).setOnClickListener(renameListener); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { addDarkModeSwitch((ViewGroup) mDrawerHeader); } - mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { - @Override - public boolean onNavigationItemSelected(MenuItem menuItem) { + mNavigationView.setNavigationItemSelectedListener(menuItem -> { - String deviceId = mMapMenuToDeviceId.get(menuItem); - onDeviceSelected(deviceId); + String deviceId = mMapMenuToDeviceId.get(menuItem); + onDeviceSelected(deviceId); - mDrawerLayout.closeDrawer(mNavigationView); + mDrawerLayout.closeDrawer(mNavigationView); - return true; - } + return true; }); preferences = getSharedPreferences(STATE_SELECTED_DEVICE, Context.MODE_PRIVATE); @@ -150,8 +142,8 @@ * Adds a {@link SwitchCompat} to the bottom of the navigation header for * toggling dark mode on and off. Call from {@link #onCreate(Bundle)}. *

- * Only supports android ICS and higher because {@link SwitchCompat} - * requires that. + * Only supports android ICS and higher because {@link SwitchCompat} + * requires that. *

* * @param drawerHeader the layout which should contain the switch @@ -218,63 +210,45 @@ //Log.e("MainActivity", "UpdateComputerList"); - BackgroundService.RunCommand(MainActivity.this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(final BackgroundService service) { - - Menu menu = mNavigationView.getMenu(); - - menu.clear(); - mMapMenuToDeviceId.clear(); - - int id = 0; - Collection devices = service.getDevices().values(); - for (Device device : devices) { - if (device.isReachable() && device.isPaired()) { - MenuItem item = menu.add(0, id++, 0, device.getName()); - item.setIcon(device.getIcon()); - item.setCheckable(true); - item.setChecked(device.getDeviceId().equals(mCurrentDevice)); - mMapMenuToDeviceId.put(item, device.getDeviceId()); - } - } + BackgroundService.RunCommand(MainActivity.this, service -> { + + Menu menu = mNavigationView.getMenu(); + + menu.clear(); + mMapMenuToDeviceId.clear(); - MenuItem item = menu.add(99, id++, 0, R.string.pair_new_device); - item.setIcon(R.drawable.ic_action_content_add_circle_outline); - item.setCheckable(true); - item.setChecked(mCurrentDevice == null); - mMapMenuToDeviceId.put(item, null); + int id = 0; + Collection devices = service.getDevices().values(); + for (Device device : devices) { + if (device.isReachable() && device.isPaired()) { + MenuItem item = menu.add(0, id++, 0, device.getName()); + item.setIcon(device.getIcon()); + item.setCheckable(true); + item.setChecked(device.getDeviceId().equals(mCurrentDevice)); + mMapMenuToDeviceId.put(item, device.getDeviceId()); + } } + + MenuItem item = menu.add(99, id++, 0, R.string.pair_new_device); + item.setIcon(R.drawable.ic_action_content_add_circle_outline); + item.setCheckable(true); + item.setChecked(mCurrentDevice == null); + mMapMenuToDeviceId.put(item, null); }); } @Override protected void onStart() { super.onStart(); BackgroundService.addGuiInUseCounter(this, true); - BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - service.addDeviceListChangedCallback("MainActivity", new BackgroundService.DeviceListChangedCallback() { - @Override - public void onDeviceListChanged() { - updateComputerList(); - } - }); - } - }); + BackgroundService.RunCommand(this, service -> service.addDeviceListChangedCallback("MainActivity", this::updateComputerList)); updateComputerList(); } @Override protected void onStop() { BackgroundService.removeGuiInUseCounter(this); - BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - service.removeDeviceListChangedCallback("MainActivity"); - } - }); + BackgroundService.RunCommand(this, service -> service.removeDeviceListChangedCallback("MainActivity")); super.onStop(); } @@ -326,12 +300,9 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case RESULT_NEEDS_RELOAD: - BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - Device device = service.getDevice(mCurrentDevice); - device.reloadPluginsFromSettings(); - } + BackgroundService.RunCommand(this, service -> { + Device device = service.getDevice(mCurrentDevice); + device.reloadPluginsFromSettings(); }); break; default: @@ -344,12 +315,9 @@ for (int result : grantResults) { if (result == PackageManager.PERMISSION_GRANTED) { //New permission granted, reload plugins - BackgroundService.RunCommand(this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - Device device = service.getDevice(mCurrentDevice); - device.reloadPluginsFromSettings(); - } + BackgroundService.RunCommand(this, service -> { + Device device = service.getDevice(mCurrentDevice); + device.reloadPluginsFromSettings(); }); } } @@ -368,24 +336,13 @@ ); new AlertDialog.Builder(MainActivity.this) .setView(deviceNameEdit) - .setPositiveButton(R.string.device_rename_confirm, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - String deviceName = deviceNameEdit.getText().toString(); - DeviceHelper.setDeviceName(MainActivity.this, deviceName); - nameView.setText(deviceName); - BackgroundService.RunCommand(MainActivity.this, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(final BackgroundService service) { - service.onNetworkChange(); - } - }); - } + .setPositiveButton(R.string.device_rename_confirm, (dialog, which) -> { + String deviceName1 = deviceNameEdit.getText().toString(); + DeviceHelper.setDeviceName(MainActivity.this, deviceName1); + nameView.setText(deviceName1); + BackgroundService.RunCommand(MainActivity.this, BackgroundService::onNetworkChange); }) - .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - } + .setNegativeButton(R.string.cancel, (dialog, which) -> { }) .setTitle(R.string.device_rename_title) .show(); diff --git a/src/org/kde/kdeconnect/UserInterface/PairingFragment.java b/src/org/kde/kdeconnect/UserInterface/PairingFragment.java --- a/src/org/kde/kdeconnect/UserInterface/PairingFragment.java +++ b/src/org/kde/kdeconnect/UserInterface/PairingFragment.java @@ -15,8 +15,8 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . -*/ + * along with this program. If not, see . + */ package org.kde.kdeconnect.UserInterface; @@ -79,12 +79,7 @@ View listRootView = rootView.findViewById(R.id.devices_list); mSwipeRefreshLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.refresh_list_layout); mSwipeRefreshLayout.setOnRefreshListener( - new SwipeRefreshLayout.OnRefreshListener() { - @Override - public void onRefresh() { - updateComputerListAction(); - } - } + this::updateComputerListAction ); headerText = new TextView(inflater.getContext()); headerText.setText(getString(R.string.pairing_description)); @@ -102,151 +97,114 @@ private void updateComputerListAction() { updateComputerList(); - BackgroundService.RunCommand(mActivity, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - service.onNetworkChange(); - } - }); + BackgroundService.RunCommand(mActivity, BackgroundService::onNetworkChange); mSwipeRefreshLayout.setRefreshing(true); - new Thread(new Runnable() { - @Override - public void run() { - try { - Thread.sleep(1500); - } catch (InterruptedException ignored) { - } - mActivity.runOnUiThread(new Runnable() { - @Override - public void run() { - mSwipeRefreshLayout.setRefreshing(false); - } - }); + new Thread(() -> { + try { + Thread.sleep(1500); + } catch (InterruptedException ignored) { } + mActivity.runOnUiThread(() -> mSwipeRefreshLayout.setRefreshing(false)); }).start(); } private void updateComputerList() { - BackgroundService.RunCommand(mActivity, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(final BackgroundService service) { - mActivity.runOnUiThread(new Runnable() { - @Override - public void run() { - - if (!isAdded()) { - //Fragment is not attached to an activity. We will crash if we try to do anything here. - return; - } - - if (listRefreshCalledThisFrame) { - // This makes sure we don't try to call list.getFirstVisiblePosition() - // twice per frame, because the second time the list hasn't been drawn - // yet and it would always return 0. - return; - } - listRefreshCalledThisFrame = true; - - headerText.setText(getString(NetworkHelper.isOnMobileNetwork(getContext()) ? R.string.on_data_message : R.string.pairing_description)); - //Disable tap animation - headerText.setOnClickListener(null); - headerText.setOnLongClickListener(null); - - try { - Collection devices = service.getDevices().values(); - final ArrayList items = new ArrayList<>(); - - SectionItem connectedSection; - Resources res = getResources(); - - connectedSection = new SectionItem(res.getString(R.string.category_connected_devices)); - items.add(connectedSection); - for (Device device : devices) { - if (device.isReachable() && device.isPaired()) { - items.add(new PairingDeviceItem(device, PairingFragment.this)); - connectedSection.isEmpty = false; - } - } - if (connectedSection.isEmpty) { - items.remove(items.size() - 1); //Remove connected devices section if empty - } - - SectionItem availableSection = new SectionItem(res.getString(R.string.category_not_paired_devices)); - items.add(availableSection); - for (Device device : devices) { - if (device.isReachable() && !device.isPaired()) { - items.add(new PairingDeviceItem(device, PairingFragment.this)); - availableSection.isEmpty = false; - } - } - if (availableSection.isEmpty && !connectedSection.isEmpty) { - items.remove(items.size() - 1); //Remove remembered devices section if empty - } - - SectionItem rememberedSection = new SectionItem(res.getString(R.string.category_remembered_devices)); - items.add(rememberedSection); - for (Device device : devices) { - if (!device.isReachable() && device.isPaired()) { - items.add(new PairingDeviceItem(device, PairingFragment.this)); - rememberedSection.isEmpty = false; - } - } - if (rememberedSection.isEmpty) { - items.remove(items.size() - 1); //Remove remembered devices section if empty - } - - final ListView list = (ListView) rootView.findViewById(R.id.devices_list); - - //Store current scroll - int index = list.getFirstVisiblePosition(); - View v = list.getChildAt(0); - int top = (v == null) ? 0 : (v.getTop() - list.getPaddingTop()); - - list.setAdapter(new ListAdapter(mActivity, items)); - - //Restore scroll - list.setSelectionFromTop(index, top); - } catch (IllegalStateException e) { - e.printStackTrace(); - //Ignore: The activity was closed while we were trying to update it - } finally { - listRefreshCalledThisFrame = false; - } + BackgroundService.RunCommand(mActivity, service -> mActivity.runOnUiThread(() -> { + + if (!isAdded()) { + //Fragment is not attached to an activity. We will crash if we try to do anything here. + return; + } + + if (listRefreshCalledThisFrame) { + // This makes sure we don't try to call list.getFirstVisiblePosition() + // twice per frame, because the second time the list hasn't been drawn + // yet and it would always return 0. + return; + } + listRefreshCalledThisFrame = true; + + headerText.setText(getString(NetworkHelper.isOnMobileNetwork(getContext()) ? R.string.on_data_message : R.string.pairing_description)); + //Disable tap animation + headerText.setOnClickListener(null); + headerText.setOnLongClickListener(null); + + try { + Collection devices = service.getDevices().values(); + final ArrayList items = new ArrayList<>(); + + SectionItem connectedSection; + Resources res = getResources(); + + connectedSection = new SectionItem(res.getString(R.string.category_connected_devices)); + items.add(connectedSection); + for (Device device : devices) { + if (device.isReachable() && device.isPaired()) { + items.add(new PairingDeviceItem(device, PairingFragment.this)); + connectedSection.isEmpty = false; + } + } + if (connectedSection.isEmpty) { + items.remove(items.size() - 1); //Remove connected devices section if empty + } + + SectionItem availableSection = new SectionItem(res.getString(R.string.category_not_paired_devices)); + items.add(availableSection); + for (Device device : devices) { + if (device.isReachable() && !device.isPaired()) { + items.add(new PairingDeviceItem(device, PairingFragment.this)); + availableSection.isEmpty = false; } - }); + } + if (availableSection.isEmpty && !connectedSection.isEmpty) { + items.remove(items.size() - 1); //Remove remembered devices section if empty + } + + SectionItem rememberedSection = new SectionItem(res.getString(R.string.category_remembered_devices)); + items.add(rememberedSection); + for (Device device : devices) { + if (!device.isReachable() && device.isPaired()) { + items.add(new PairingDeviceItem(device, PairingFragment.this)); + rememberedSection.isEmpty = false; + } + } + if (rememberedSection.isEmpty) { + items.remove(items.size() - 1); //Remove remembered devices section if empty + } + + final ListView list = (ListView) rootView.findViewById(R.id.devices_list); + //Store current scroll + int index = list.getFirstVisiblePosition(); + View v = list.getChildAt(0); + int top = (v == null) ? 0 : (v.getTop() - list.getPaddingTop()); + + list.setAdapter(new ListAdapter(mActivity, items)); + + //Restore scroll + list.setSelectionFromTop(index, top); + } catch (IllegalStateException e) { + e.printStackTrace(); + //Ignore: The activity was closed while we were trying to update it + } finally { + listRefreshCalledThisFrame = false; } - }); - } + })); +} @Override public void onStart() { super.onStart(); - BackgroundService.RunCommand(mActivity, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - service.addDeviceListChangedCallback("PairingFragment", new BackgroundService.DeviceListChangedCallback() { - @Override - public void onDeviceListChanged() { - updateComputerList(); - } - }); - } - }); + BackgroundService.RunCommand(mActivity, service -> service.addDeviceListChangedCallback("PairingFragment", this::updateComputerList)); updateComputerList(); } @Override public void onStop() { super.onStop(); mSwipeRefreshLayout.setEnabled(false); - BackgroundService.RunCommand(mActivity, new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - service.removeDeviceListChangedCallback("PairingFragment"); - } - }); + BackgroundService.RunCommand(mActivity, service -> service.removeDeviceListChangedCallback("PairingFragment")); } @Override diff --git a/src/org/kde/kdeconnect/UserInterface/PluginPreference.java b/src/org/kde/kdeconnect/UserInterface/PluginPreference.java --- a/src/org/kde/kdeconnect/UserInterface/PluginPreference.java +++ b/src/org/kde/kdeconnect/UserInterface/PluginPreference.java @@ -29,15 +29,12 @@ Plugin plugin = device.getPlugin(pluginKey, true); if (info.hasSettings() && plugin != null) { - this.listener = new View.OnClickListener() { - @Override - public void onClick(View v) { - Plugin plugin = device.getPlugin(pluginKey, true); - if (plugin != null) { - plugin.startPreferencesActivity(activity); - } else { //Could happen if the device is not connected anymore - activity.finish(); //End this activity so we go to the "device not reachable" screen - } + this.listener = v -> { + Plugin plugin1 = device.getPlugin(pluginKey, true); + if (plugin1 != null) { + plugin1.startPreferencesActivity(activity); + } else { //Could happen if the device is not connected anymore + activity.finish(); //End this activity so we go to the "device not reachable" screen } }; } else { @@ -58,14 +55,11 @@ button.setOnClickListener(listener); } - root.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - boolean newState = !device.isPluginEnabled(pluginKey); - setChecked(newState); //It actually works on API<14 - button.setEnabled(newState); - device.setPluginEnabled(pluginKey, newState); - } + root.setOnClickListener(v -> { + boolean newState = !device.isPluginEnabled(pluginKey); + setChecked(newState); //It actually works on API<14 + button.setEnabled(newState); + device.setPluginEnabled(pluginKey, newState); }); } diff --git a/src/org/kde/kdeconnect/UserInterface/SettingsActivity.java b/src/org/kde/kdeconnect/UserInterface/SettingsActivity.java --- a/src/org/kde/kdeconnect/UserInterface/SettingsActivity.java +++ b/src/org/kde/kdeconnect/UserInterface/SettingsActivity.java @@ -44,24 +44,16 @@ deviceId = getIntent().getStringExtra("deviceId"); } - BackgroundService.RunCommand(getApplicationContext(), new BackgroundService.InstanceCallback() { - @Override - public void onServiceStart(BackgroundService service) { - final Device device = service.getDevice(deviceId); - if (device == null) { - SettingsActivity.this.runOnUiThread(new Runnable() { - @Override - public void run() { - SettingsActivity.this.finish(); - } - }); - return; - } - List plugins = device.getSupportedPlugins(); - for (final String pluginKey : plugins) { - PluginPreference pref = new PluginPreference(SettingsActivity.this, pluginKey, device); - preferenceScreen.addPreference(pref); - } + BackgroundService.RunCommand(getApplicationContext(), service -> { + final Device device = service.getDevice(deviceId); + if (device == null) { + SettingsActivity.this.runOnUiThread(SettingsActivity.this::finish); + return; + } + List plugins = device.getSupportedPlugins(); + for (final String pluginKey : plugins) { + PluginPreference pref = new PluginPreference(SettingsActivity.this, pluginKey, device); + preferenceScreen.addPreference(pref); } }); } diff --git a/tests/org/kde/kdeconnect/LanLinkTest.java b/tests/org/kde/kdeconnect/LanLinkTest.java --- a/tests/org/kde/kdeconnect/LanLinkTest.java +++ b/tests/org/kde/kdeconnect/LanLinkTest.java @@ -204,43 +204,27 @@ Mockito.when(sharePacket.getType()).thenReturn("kdeconnect.share"); Mockito.when(sharePacket.hasPayload()).thenReturn(true); Mockito.when(sharePacket.hasPayloadTransferInfo()).thenReturn(true); - Mockito.doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocationOnMock) throws Throwable { - return sharePacketJson.toString(); - } - }).when(sharePacket).serialize(); + Mockito.doAnswer(invocationOnMock -> sharePacketJson.toString()).when(sharePacket).serialize(); Mockito.when(sharePacket.getPayload()).thenReturn(new ByteArrayInputStream(data)); Mockito.when(sharePacket.getPayloadSize()).thenReturn((long) data.length); - Mockito.doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocationOnMock) throws Throwable { - return sharePacketJson.getJSONObject("payloadTransferInfo"); - } - }).when(sharePacket).getPayloadTransferInfo(); - Mockito.doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocationOnMock) throws Throwable { - JSONObject object = (JSONObject) invocationOnMock.getArguments()[0]; + Mockito.doAnswer(invocationOnMock -> sharePacketJson.getJSONObject("payloadTransferInfo")).when(sharePacket).getPayloadTransferInfo(); + Mockito.doAnswer(invocationOnMock -> { + JSONObject object = (JSONObject) invocationOnMock.getArguments()[0]; - sharePacketJson.put("payloadTransferInfo", object); - return null; - } + sharePacketJson.put("payloadTransferInfo", object); + return null; }).when(sharePacket).setPayloadTransferInfo(Mockito.any(JSONObject.class)); - Mockito.doAnswer(new Answer() { - @Override - public Object answer(InvocationOnMock invocationOnMock) throws Throwable { + Mockito.doAnswer(invocationOnMock -> { - Log.e("LanLinkTest", "Write to stream"); - String stringNetworkPacket = new String((byte[]) invocationOnMock.getArguments()[0]); - final NetworkPacket np = NetworkPacket.unserialize(stringNetworkPacket); + Log.e("LanLinkTest", "Write to stream"); + String stringNetworkPacket = new String((byte[]) invocationOnMock.getArguments()[0]); + final NetworkPacket np = NetworkPacket.unserialize(stringNetworkPacket); - downloader.setNetworkPacket(np); - downloader.start(); + downloader.setNetworkPacket(np); + downloader.start(); - return stringNetworkPacket.length(); - } + return stringNetworkPacket.length(); }).when(goodOutputStream).write(Mockito.any(byte[].class)); goodLanLink.sendPacket(sharePacket, callback);