2
0
mirror of https://github.com/KDE/kdeconnect-android synced 2025-08-28 12:47:43 +00:00

Use ClassIndex to create a list of plugins in compile time

Instead of manually initializing a map statically.
This commit is contained in:
Albert Vaca Cintora 2019-02-11 20:04:40 +01:00
parent 33c9f70cb5
commit 78b38b5a00
27 changed files with 89 additions and 101 deletions

View File

@ -83,6 +83,9 @@ dependencies {
implementation 'com.jakewharton:butterknife:10.0.0' implementation 'com.jakewharton:butterknife:10.0.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.0.0' annotationProcessor 'com.jakewharton:butterknife-compiler:10.0.0'
implementation 'org.atteo.classindex:classindex:3.6'
annotationProcessor 'org.atteo.classindex:classindex:3.6'
// Testing // Testing
androidTestImplementation 'org.mockito:mockito-core:1.10.19' androidTestImplementation 'org.mockito:mockito-core:1.10.19'
androidTestImplementation 'com.google.dexmaker:dexmaker-mockito:1.1'// Because mockito has some problems with dex environment androidTestImplementation 'com.google.dexmaker:dexmaker-mockito:1.1'// Because mockito has some problems with dex environment

1
proguard-rules.pro vendored
View File

@ -43,3 +43,4 @@
-dontwarn sun.reflect.** -dontwarn sun.reflect.**
-dontwarn android.test.** -dontwarn android.test.**
-dontwarn java.lang.management.** -dontwarn java.lang.management.**
-dontwarn javax.**

View File

@ -42,6 +42,7 @@ import org.kde.kdeconnect.Helpers.NotificationHelper;
import org.kde.kdeconnect.Helpers.SecurityHelpers.RsaHelper; import org.kde.kdeconnect.Helpers.SecurityHelpers.RsaHelper;
import org.kde.kdeconnect.Helpers.SecurityHelpers.SslHelper; import org.kde.kdeconnect.Helpers.SecurityHelpers.SslHelper;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect.UserInterface.MainActivity; import org.kde.kdeconnect.UserInterface.MainActivity;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
@ -284,6 +285,7 @@ public class BackgroundService extends Service {
Log.i("KDE/BackgroundService", "Service not started yet, initializing..."); Log.i("KDE/BackgroundService", "Service not started yet, initializing...");
PluginFactory.initPluginInfo(getBaseContext());
initializeSecurityParameters(); initializeSecurityParameters();
NotificationHelper.initializeChannels(this); NotificationHelper.initializeChannels(this);
loadRememberedDevicesFromSettings(); loadRememberedDevicesFromSettings();

View File

@ -513,7 +513,7 @@ public class Device implements BaseLink.PacketReceiver {
Set<String> outgoingCapabilities = identityPacket.getStringSet("outgoingCapabilities", null); Set<String> outgoingCapabilities = identityPacket.getStringSet("outgoingCapabilities", null);
Set<String> incomingCapabilities = identityPacket.getStringSet("incomingCapabilities", null); Set<String> incomingCapabilities = identityPacket.getStringSet("incomingCapabilities", null);
if (incomingCapabilities != null && outgoingCapabilities != null) { if (incomingCapabilities != null && outgoingCapabilities != null) {
m_supportedPlugins = new Vector<>(PluginFactory.pluginsForCapabilities(context, incomingCapabilities, outgoingCapabilities)); m_supportedPlugins = new Vector<>(PluginFactory.pluginsForCapabilities(incomingCapabilities, outgoingCapabilities));
} else { } else {
m_supportedPlugins = new Vector<>(PluginFactory.getAvailablePlugins()); m_supportedPlugins = new Vector<>(PluginFactory.getAvailablePlugins());
} }
@ -808,7 +808,7 @@ public class Device implements BaseLink.PacketReceiver {
} }
public boolean isPluginEnabled(String pluginKey) { public boolean isPluginEnabled(String pluginKey) {
boolean enabledByDefault = PluginFactory.getPluginInfo(context, pluginKey).isEnabledByDefault(); boolean enabledByDefault = PluginFactory.getPluginInfo(pluginKey).isEnabledByDefault();
return settings.getBoolean(pluginKey, enabledByDefault); return settings.getBoolean(pluginKey, enabledByDefault);
} }
@ -820,7 +820,7 @@ public class Device implements BaseLink.PacketReceiver {
for (String pluginKey : m_supportedPlugins) { for (String pluginKey : m_supportedPlugins) {
PluginFactory.PluginInfo pluginInfo = PluginFactory.getPluginInfo(context, pluginKey); PluginFactory.PluginInfo pluginInfo = PluginFactory.getPluginInfo(pluginKey);
boolean pluginEnabled = false; boolean pluginEnabled = false;
boolean listenToUnpaired = pluginInfo.listenToUnpaired(); boolean listenToUnpaired = pluginInfo.listenToUnpaired();

View File

@ -276,8 +276,8 @@ public class NetworkPacket {
np.mBody.put("deviceName", DeviceHelper.getDeviceName(context)); np.mBody.put("deviceName", DeviceHelper.getDeviceName(context));
np.mBody.put("protocolVersion", NetworkPacket.ProtocolVersion); np.mBody.put("protocolVersion", NetworkPacket.ProtocolVersion);
np.mBody.put("deviceType", DeviceHelper.getDeviceType(context).toString()); np.mBody.put("deviceType", DeviceHelper.getDeviceType(context).toString());
np.mBody.put("incomingCapabilities", new JSONArray(PluginFactory.getIncomingCapabilities(context))); np.mBody.put("incomingCapabilities", new JSONArray(PluginFactory.getIncomingCapabilities()));
np.mBody.put("outgoingCapabilities", new JSONArray(PluginFactory.getOutgoingCapabilities(context))); np.mBody.put("outgoingCapabilities", new JSONArray(PluginFactory.getOutgoingCapabilities()));
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Log.e("NetworkPacakge", "Exception on createIdentityPacket"); Log.e("NetworkPacakge", "Exception on createIdentityPacket");

View File

@ -28,9 +28,10 @@ import android.os.BatteryManager;
import org.kde.kdeconnect.NetworkPacket; import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
@PluginFactory.LoadablePlugin
public class BatteryPlugin extends Plugin { public class BatteryPlugin extends Plugin {
private final static String PACKET_TYPE_BATTERY = "kdeconnect.battery"; private final static String PACKET_TYPE_BATTERY = "kdeconnect.battery";

View File

@ -22,8 +22,10 @@ package org.kde.kdeconnect.Plugins.ClibpoardPlugin;
import org.kde.kdeconnect.NetworkPacket; import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
@PluginFactory.LoadablePlugin
public class ClipboardPlugin extends Plugin { public class ClipboardPlugin extends Plugin {
private final static String PACKET_TYPE_CLIPBOARD = "kdeconnect.clipboard"; private final static String PACKET_TYPE_CLIPBOARD = "kdeconnect.clipboard";

View File

@ -34,6 +34,7 @@ import org.kde.kdeconnect.Helpers.ContactsHelper.VCardBuilder;
import org.kde.kdeconnect.Helpers.ContactsHelper.uID; import org.kde.kdeconnect.Helpers.ContactsHelper.uID;
import org.kde.kdeconnect.NetworkPacket; import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
import java.util.ArrayList; import java.util.ArrayList;
@ -43,6 +44,7 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
@PluginFactory.LoadablePlugin
public class ContactsPlugin extends Plugin { public class ContactsPlugin extends Plugin {
/** /**

View File

@ -25,9 +25,11 @@ import android.content.Intent;
import org.kde.kdeconnect.Helpers.DeviceHelper; import org.kde.kdeconnect.Helpers.DeviceHelper;
import org.kde.kdeconnect.NetworkPacket; import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect.UserInterface.PluginSettingsFragment; import org.kde.kdeconnect.UserInterface.PluginSettingsFragment;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
@PluginFactory.LoadablePlugin
public class FindMyPhonePlugin extends Plugin { public class FindMyPhonePlugin extends Plugin {
public final static String PACKET_TYPE_FINDMYPHONE_REQUEST = "kdeconnect.findmyphone.request"; public final static String PACKET_TYPE_FINDMYPHONE_REQUEST = "kdeconnect.findmyphone.request";

View File

@ -25,9 +25,10 @@ import android.app.Activity;
import org.kde.kdeconnect.NetworkPacket; import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.Plugins.FindMyPhonePlugin.FindMyPhonePlugin; import org.kde.kdeconnect.Plugins.FindMyPhonePlugin.FindMyPhonePlugin;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
@PluginFactory.LoadablePlugin
public class FindRemoteDevicePlugin extends Plugin { public class FindRemoteDevicePlugin extends Plugin {
@Override @Override

View File

@ -26,10 +26,12 @@ import android.graphics.drawable.Drawable;
import org.kde.kdeconnect.NetworkPacket; import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
@PluginFactory.LoadablePlugin
public class MousePadPlugin extends Plugin { public class MousePadPlugin extends Plugin {
//public final static String PACKET_TYPE_MOUSEPAD = "kdeconnect.mousepad"; //public final static String PACKET_TYPE_MOUSEPAD = "kdeconnect.mousepad";

View File

@ -30,6 +30,7 @@ import android.util.Log;
import org.kde.kdeconnect.NetworkPacket; import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
import java.net.MalformedURLException; import java.net.MalformedURLException;
@ -42,6 +43,7 @@ import java.util.List;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
@PluginFactory.LoadablePlugin
public class MprisPlugin extends Plugin { public class MprisPlugin extends Plugin {
public class MprisPlayer { public class MprisPlayer {
private String player = ""; private String player = "";

View File

@ -46,6 +46,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
//@PluginFactory.LoadablePlugin
public class MprisReceiverPlugin extends Plugin implements MediaSessionManager.OnActiveSessionsChangedListener { public class MprisReceiverPlugin extends Plugin implements MediaSessionManager.OnActiveSessionsChangedListener {
private final static String PACKET_TYPE_MPRIS = "kdeconnect.mpris"; private final static String PACKET_TYPE_MPRIS = "kdeconnect.mpris";

View File

@ -42,6 +42,7 @@ import android.util.Log;
import org.kde.kdeconnect.Helpers.AppsHelper; import org.kde.kdeconnect.Helpers.AppsHelper;
import org.kde.kdeconnect.NetworkPacket; import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect.UserInterface.AlertDialogFragment; import org.kde.kdeconnect.UserInterface.AlertDialogFragment;
import org.kde.kdeconnect.UserInterface.MainActivity; import org.kde.kdeconnect.UserInterface.MainActivity;
import org.kde.kdeconnect.UserInterface.PluginSettingsFragment; import org.kde.kdeconnect.UserInterface.PluginSettingsFragment;
@ -61,6 +62,7 @@ import androidx.annotation.RequiresApi;
import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationCompat;
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
@PluginFactory.LoadablePlugin
public class NotificationsPlugin extends Plugin implements NotificationReceiver.NotificationListener { public class NotificationsPlugin extends Plugin implements NotificationReceiver.NotificationListener {
private final static String PACKET_TYPE_NOTIFICATION = "kdeconnect.notification"; private final static String PACKET_TYPE_NOTIFICATION = "kdeconnect.notification";

View File

@ -31,12 +31,13 @@ import android.util.Log;
import org.kde.kdeconnect.Helpers.NotificationHelper; import org.kde.kdeconnect.Helpers.NotificationHelper;
import org.kde.kdeconnect.NetworkPacket; import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect.UserInterface.MainActivity; import org.kde.kdeconnect.UserInterface.MainActivity;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationCompat;
@PluginFactory.LoadablePlugin
public class PingPlugin extends Plugin { public class PingPlugin extends Plugin {
private final static String PACKET_TYPE_PING = "kdeconnect.ping"; private final static String PACKET_TYPE_PING = "kdeconnect.ping";

View File

@ -24,25 +24,9 @@ import android.content.Context;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.util.Log; import android.util.Log;
import org.atteo.classindex.ClassIndex;
import org.atteo.classindex.IndexAnnotated;
import org.kde.kdeconnect.Device; import org.kde.kdeconnect.Device;
import org.kde.kdeconnect.Plugins.BatteryPlugin.BatteryPlugin;
import org.kde.kdeconnect.Plugins.ClibpoardPlugin.ClipboardPlugin;
import org.kde.kdeconnect.Plugins.ContactsPlugin.ContactsPlugin;
import org.kde.kdeconnect.Plugins.FindMyPhonePlugin.FindMyPhonePlugin;
import org.kde.kdeconnect.Plugins.FindRemoteDevicePlugin.FindRemoteDevicePlugin;
import org.kde.kdeconnect.Plugins.MousePadPlugin.MousePadPlugin;
import org.kde.kdeconnect.Plugins.MprisPlugin.MprisPlugin;
import org.kde.kdeconnect.Plugins.NotificationsPlugin.NotificationsPlugin;
import org.kde.kdeconnect.Plugins.PingPlugin.PingPlugin;
import org.kde.kdeconnect.Plugins.PresenterPlugin.PresenterPlugin;
import org.kde.kdeconnect.Plugins.ReceiveNotificationsPlugin.ReceiveNotificationsPlugin;
import org.kde.kdeconnect.Plugins.RemoteKeyboardPlugin.RemoteKeyboardPlugin;
import org.kde.kdeconnect.Plugins.RunCommandPlugin.RunCommandPlugin;
import org.kde.kdeconnect.Plugins.SftpPlugin.SftpPlugin;
import org.kde.kdeconnect.Plugins.SharePlugin.SharePlugin;
import org.kde.kdeconnect.Plugins.SystemvolumePlugin.SystemvolumePlugin;
import org.kde.kdeconnect.Plugins.SMSPlugin.SMSPlugin;
import org.kde.kdeconnect.Plugins.TelephonyPlugin.TelephonyPlugin;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
@ -52,11 +36,15 @@ import java.util.concurrent.ConcurrentHashMap;
public class PluginFactory { public class PluginFactory {
@IndexAnnotated
public @interface LoadablePlugin { } //Annotate plugins with this so PluginFactory finds them
public static class PluginInfo { public static class PluginInfo {
PluginInfo(String displayName, String description, Drawable icon, PluginInfo(String displayName, String description, Drawable icon,
boolean enabledByDefault, boolean hasSettings, boolean listenToUnpaired, boolean enabledByDefault, boolean hasSettings, boolean listenToUnpaired,
String[] supportedPacketTypes, String[] outgoingPacketTypes) { String[] supportedPacketTypes, String[] outgoingPacketTypes,
Class<? extends Plugin> instantiableClass) {
this.displayName = displayName; this.displayName = displayName;
this.description = description; this.description = description;
this.icon = icon; this.icon = icon;
@ -69,6 +57,7 @@ public class PluginFactory {
HashSet<String> outgoing = new HashSet<>(); HashSet<String> outgoing = new HashSet<>();
if (outgoingPacketTypes != null) Collections.addAll(outgoing, outgoingPacketTypes); if (outgoingPacketTypes != null) Collections.addAll(outgoing, outgoingPacketTypes);
this.outgoingPacketTypes = Collections.unmodifiableSet(outgoing); this.outgoingPacketTypes = Collections.unmodifiableSet(outgoing);
this.instantiableClass = instantiableClass;
} }
public String getDisplayName() { public String getDisplayName() {
@ -103,6 +92,10 @@ public class PluginFactory {
return supportedPacketTypes; return supportedPacketTypes;
} }
Class<? extends Plugin> getInstantiableClass() {
return instantiableClass;
}
private final String displayName; private final String displayName;
private final String description; private final String description;
private final Drawable icon; private final Drawable icon;
@ -111,70 +104,40 @@ public class PluginFactory {
private final boolean listenToUnpaired; private final boolean listenToUnpaired;
private final Set<String> supportedPacketTypes; private final Set<String> supportedPacketTypes;
private final Set<String> outgoingPacketTypes; private final Set<String> outgoingPacketTypes;
private final Class<? extends Plugin> instantiableClass;
} }
private static final Map<String, Class> availablePlugins = new ConcurrentHashMap<>(); private static final Map<String, PluginInfo> pluginInfo = new ConcurrentHashMap<>();
private static final Map<String, PluginInfo> pluginInfoCache = new ConcurrentHashMap<>();
static { public static PluginInfo getPluginInfo(String pluginKey) {
PluginFactory.registerPlugin(TelephonyPlugin.class); return pluginInfo.get(pluginKey);
PluginFactory.registerPlugin(PingPlugin.class);
PluginFactory.registerPlugin(MprisPlugin.class);
PluginFactory.registerPlugin(ClipboardPlugin.class);
PluginFactory.registerPlugin(BatteryPlugin.class);
PluginFactory.registerPlugin(SftpPlugin.class);
PluginFactory.registerPlugin(NotificationsPlugin.class);
PluginFactory.registerPlugin(ReceiveNotificationsPlugin.class);
PluginFactory.registerPlugin(MousePadPlugin.class);
PluginFactory.registerPlugin(PresenterPlugin.class);
PluginFactory.registerPlugin(SharePlugin.class);
PluginFactory.registerPlugin(SMSPlugin.class);
PluginFactory.registerPlugin(FindMyPhonePlugin.class);
PluginFactory.registerPlugin(RunCommandPlugin.class);
PluginFactory.registerPlugin(ContactsPlugin.class);
PluginFactory.registerPlugin(RemoteKeyboardPlugin.class);
PluginFactory.registerPlugin(SystemvolumePlugin.class);
//PluginFactory.registerPlugin(MprisReceiverPlugin.class);
PluginFactory.registerPlugin(FindRemoteDevicePlugin.class);
} }
public static PluginInfo getPluginInfo(Context context, String pluginKey) { public static void initPluginInfo(Context context) {
PluginInfo info = pluginInfoCache.get(pluginKey); //Is it cached?
if (info != null) {
return info;
}
try { try {
Plugin p = ((Plugin) availablePlugins.get(pluginKey).newInstance()); for (Class<?> pluginClass : ClassIndex.getAnnotated(LoadablePlugin.class)) {
p.setContext(context, null); Plugin p = ((Plugin) pluginClass.newInstance());
info = new PluginInfo(p.getDisplayName(), p.getDescription(), p.getIcon(), p.setContext(context, null);
p.isEnabledByDefault(), p.hasSettings(), p.listensToUnpairedDevices(), PluginInfo info = new PluginInfo(p.getDisplayName(), p.getDescription(), p.getIcon(),
p.getSupportedPacketTypes(), p.getOutgoingPacketTypes()); p.isEnabledByDefault(), p.hasSettings(), p.listensToUnpairedDevices(),
pluginInfoCache.put(pluginKey, info); //Cache it p.getSupportedPacketTypes(), p.getOutgoingPacketTypes(), p.getClass());
return info; pluginInfo.put(p.getPluginKey(), info);
}
} catch (Exception e) { } catch (Exception e) {
Log.e("PluginFactory", "getPluginInfo exception");
e.printStackTrace();
throw new RuntimeException(e); throw new RuntimeException(e);
} }
Log.i("PluginFactory","Loaded "+pluginInfo.size()+" plugins");
} }
public static Set<String> getAvailablePlugins() { public static Set<String> getAvailablePlugins() {
return availablePlugins.keySet(); return pluginInfo.keySet();
} }
public static Plugin instantiatePluginForDevice(Context context, String pluginKey, Device device) { public static Plugin instantiatePluginForDevice(Context context, String pluginKey, Device device) {
Class c = availablePlugins.get(pluginKey); PluginInfo info = pluginInfo.get(pluginKey);
if (c == null) {
Log.e("PluginFactory", "Plugin not found: " + pluginKey);
return null;
}
try { try {
Plugin plugin = (Plugin) c.newInstance(); Plugin plugin = info.getInstantiableClass().newInstance();
plugin.setContext(context, device); plugin.setContext(context, device);
return plugin; return plugin;
} catch (Exception e) { } catch (Exception e) {
@ -182,46 +145,32 @@ public class PluginFactory {
e.printStackTrace(); e.printStackTrace();
return null; return null;
} }
} }
private static void registerPlugin(Class<? extends Plugin> pluginClass) { public static Set<String> getIncomingCapabilities() {
try {
String pluginKey = Plugin.getPluginKey(pluginClass);
availablePlugins.put(pluginKey, pluginClass);
} catch (Exception e) {
Log.e("PluginFactory", "addPlugin exception");
e.printStackTrace();
}
}
public static Set<String> getIncomingCapabilities(Context context) {
HashSet<String> capabilities = new HashSet<>(); HashSet<String> capabilities = new HashSet<>();
for (String pluginId : availablePlugins.keySet()) { for (PluginInfo plugin : pluginInfo.values()) {
PluginInfo plugin = getPluginInfo(context, pluginId);
capabilities.addAll(plugin.getSupportedPacketTypes()); capabilities.addAll(plugin.getSupportedPacketTypes());
} }
return capabilities; return capabilities;
} }
public static Set<String> getOutgoingCapabilities(Context context) { public static Set<String> getOutgoingCapabilities() {
HashSet<String> capabilities = new HashSet<>(); HashSet<String> capabilities = new HashSet<>();
for (String pluginId : availablePlugins.keySet()) { for (PluginInfo plugin : pluginInfo.values()) {
PluginInfo plugin = getPluginInfo(context, pluginId);
capabilities.addAll(plugin.getOutgoingPacketTypes()); capabilities.addAll(plugin.getOutgoingPacketTypes());
} }
return capabilities; return capabilities;
} }
public static Set<String> pluginsForCapabilities(Context context, Set<String> incoming, Set<String> outgoing) { public static Set<String> pluginsForCapabilities(Set<String> incoming, Set<String> outgoing) {
HashSet<String> plugins = new HashSet<>(); HashSet<String> plugins = new HashSet<>();
for (String pluginId : availablePlugins.keySet()) { for (Map.Entry<String, PluginInfo> entry : pluginInfo.entrySet()) {
PluginInfo plugin = getPluginInfo(context, pluginId); String pluginId = entry.getKey();
PluginInfo info = entry.getValue();
//Check incoming against outgoing //Check incoming against outgoing
if (Collections.disjoint(outgoing, plugin.getSupportedPacketTypes()) if (Collections.disjoint(outgoing, info.getSupportedPacketTypes())
&& Collections.disjoint(incoming, plugin.getOutgoingPacketTypes())) { && Collections.disjoint(incoming, info.getOutgoingPacketTypes())) {
Log.i("PluginFactory", "Won't load " + pluginId + " because of unmatched capabilities"); Log.i("PluginFactory", "Won't load " + pluginId + " because of unmatched capabilities");
continue; //No capabilities in common, do not load this plugin continue; //No capabilities in common, do not load this plugin
} }

View File

@ -28,12 +28,14 @@ import android.view.KeyEvent;
import org.kde.kdeconnect.NetworkPacket; import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import static org.kde.kdeconnect.Plugins.MousePadPlugin.KeyListenerView.SpecialKeysMap; import static org.kde.kdeconnect.Plugins.MousePadPlugin.KeyListenerView.SpecialKeysMap;
@PluginFactory.LoadablePlugin
public class PresenterPlugin extends Plugin { public class PresenterPlugin extends Plugin {
private final static String PACKET_TYPE_MOUSEPAD_REQUEST = "kdeconnect.mousepad.request"; private final static String PACKET_TYPE_MOUSEPAD_REQUEST = "kdeconnect.mousepad.request";

View File

@ -32,6 +32,7 @@ import android.util.Log;
import org.kde.kdeconnect.Helpers.NotificationHelper; import org.kde.kdeconnect.Helpers.NotificationHelper;
import org.kde.kdeconnect.NetworkPacket; import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect.UserInterface.MainActivity; import org.kde.kdeconnect.UserInterface.MainActivity;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
@ -39,6 +40,7 @@ import java.io.InputStream;
import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationCompat;
@PluginFactory.LoadablePlugin
public class ReceiveNotificationsPlugin extends Plugin { public class ReceiveNotificationsPlugin extends Plugin {
private final static String PACKET_TYPE_NOTIFICATION = "kdeconnect.notification"; private final static String PACKET_TYPE_NOTIFICATION = "kdeconnect.notification";

View File

@ -33,6 +33,7 @@ import android.view.inputmethod.InputConnection;
import org.kde.kdeconnect.NetworkPacket; import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
import java.util.ArrayList; import java.util.ArrayList;
@ -41,6 +42,7 @@ import java.util.concurrent.locks.ReentrantLock;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.core.util.Pair; import androidx.core.util.Pair;
@PluginFactory.LoadablePlugin
public class RemoteKeyboardPlugin extends Plugin { public class RemoteKeyboardPlugin extends Plugin {
private final static String PACKET_TYPE_MOUSEPAD_REQUEST = "kdeconnect.mousepad.request"; private final static String PACKET_TYPE_MOUSEPAD_REQUEST = "kdeconnect.mousepad.request";

View File

@ -29,6 +29,7 @@ import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import org.kde.kdeconnect.NetworkPacket; import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
import java.util.ArrayList; import java.util.ArrayList;
@ -37,6 +38,7 @@ import java.util.Iterator;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
@PluginFactory.LoadablePlugin
public class RunCommandPlugin extends Plugin { public class RunCommandPlugin extends Plugin {
private final static String PACKET_TYPE_RUNCOMMAND = "kdeconnect.runcommand"; private final static String PACKET_TYPE_RUNCOMMAND = "kdeconnect.runcommand";

View File

@ -44,6 +44,7 @@ import org.kde.kdeconnect.Helpers.ContactsHelper;
import org.kde.kdeconnect.Helpers.SMSHelper; import org.kde.kdeconnect.Helpers.SMSHelper;
import org.kde.kdeconnect.NetworkPacket; import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect.Plugins.TelephonyPlugin.TelephonyPlugin; import org.kde.kdeconnect.Plugins.TelephonyPlugin.TelephonyPlugin;
import org.kde.kdeconnect_tp.BuildConfig; import org.kde.kdeconnect_tp.BuildConfig;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
@ -59,6 +60,7 @@ import androidx.core.content.ContextCompat;
import static org.kde.kdeconnect.Plugins.TelephonyPlugin.TelephonyPlugin.PACKET_TYPE_TELEPHONY; import static org.kde.kdeconnect.Plugins.TelephonyPlugin.TelephonyPlugin.PACKET_TYPE_TELEPHONY;
@PluginFactory.LoadablePlugin
public class SMSPlugin extends Plugin { public class SMSPlugin extends Plugin {
/** /**

View File

@ -27,12 +27,14 @@ import android.os.Environment;
import org.kde.kdeconnect.Helpers.StorageHelper; import org.kde.kdeconnect.Helpers.StorageHelper;
import org.kde.kdeconnect.NetworkPacket; import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@PluginFactory.LoadablePlugin
public class SftpPlugin extends Plugin { public class SftpPlugin extends Plugin {
private final static String PACKET_TYPE_SFTP = "kdeconnect.sftp"; private final static String PACKET_TYPE_SFTP = "kdeconnect.sftp";

View File

@ -43,6 +43,7 @@ import android.widget.Toast;
import org.kde.kdeconnect.Helpers.NotificationHelper; import org.kde.kdeconnect.Helpers.NotificationHelper;
import org.kde.kdeconnect.NetworkPacket; import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect.UserInterface.PluginSettingsFragment; import org.kde.kdeconnect.UserInterface.PluginSettingsFragment;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
@ -57,6 +58,7 @@ import androidx.annotation.WorkerThread;
import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationCompat;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
@PluginFactory.LoadablePlugin
public class SharePlugin extends Plugin { public class SharePlugin extends Plugin {
private final static String PACKET_TYPE_SHARE_REQUEST = "kdeconnect.share.request"; private final static String PACKET_TYPE_SHARE_REQUEST = "kdeconnect.share.request";
final static String PACKET_TYPE_SHARE_REQUEST_UPDATE = "kdeconnect.share.request.update"; final static String PACKET_TYPE_SHARE_REQUEST_UPDATE = "kdeconnect.share.request.update";

View File

@ -25,13 +25,14 @@ import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import org.kde.kdeconnect.NetworkPacket; import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
@PluginFactory.LoadablePlugin
public class SystemvolumePlugin extends Plugin { public class SystemvolumePlugin extends Plugin {
private final static String PACKET_TYPE_SYSTEMVOLUME = "kdeconnect.systemvolume"; private final static String PACKET_TYPE_SYSTEMVOLUME = "kdeconnect.systemvolume";

View File

@ -37,6 +37,7 @@ import android.util.Log;
import org.kde.kdeconnect.Helpers.ContactsHelper; import org.kde.kdeconnect.Helpers.ContactsHelper;
import org.kde.kdeconnect.NetworkPacket; import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
import java.util.Map; import java.util.Map;
@ -45,6 +46,7 @@ import java.util.TimerTask;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
@PluginFactory.LoadablePlugin
public class TelephonyPlugin extends Plugin { public class TelephonyPlugin extends Plugin {

View File

@ -26,7 +26,7 @@ class PluginPreference extends CheckBoxPreference {
this.device = device; this.device = device;
this.pluginKey = pluginKey; this.pluginKey = pluginKey;
PluginFactory.PluginInfo info = PluginFactory.getPluginInfo(context, pluginKey); PluginFactory.PluginInfo info = PluginFactory.getPluginInfo(pluginKey);
setTitle(info.getDisplayName()); setTitle(info.getDisplayName());
setSummary(info.getDescription()); setSummary(info.getDescription());
setIcon(android.R.color.transparent); setIcon(android.R.color.transparent);

View File

@ -75,7 +75,7 @@ public class PluginSettingsFragment extends PreferenceFragmentCompat {
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
PluginFactory.PluginInfo info = PluginFactory.getPluginInfo(requireContext(), pluginKey); PluginFactory.PluginInfo info = PluginFactory.getPluginInfo(pluginKey);
requireActivity().setTitle(getString(R.string.plugin_settings_with_name, info.getDisplayName())); requireActivity().setTitle(getString(R.string.plugin_settings_with_name, info.getDisplayName()));
} }
} }