2
0
mirror of https://github.com/KDE/kdeconnect-android synced 2025-09-01 06:35:09 +00:00

Compare commits

..

5 Commits

Author SHA1 Message Date
Albert Vaca Cintora
5225d0b200 Release 1.20.2 2022-12-28 19:29:55 +01:00
Albert Vaca Cintora
54e5224f20 Fix minifier deleting "unused" xml that were actually used 2022-12-28 19:29:23 +01:00
Albert Vaca Cintora
6ab846cbbd Fix NPE 2022-12-28 17:31:52 +01:00
Albert Vaca Cintora
ea66605ef0 Fix crash on Android 7 2022-12-28 17:31:42 +01:00
Albert Vaca Cintora
c903c5d3fd Release 1.20.1
Untagged because it's for the play store only.
2022-12-28 00:26:58 +01:00
16 changed files with 78 additions and 34 deletions

View File

@@ -2,8 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
package="org.kde.kdeconnect_tp" package="org.kde.kdeconnect_tp"
android:versionCode="12000" android:versionCode="12002"
android:versionName="1.20"> android:versionName="1.20.2">
<supports-screens <supports-screens
android:anyDensity="true" android:anyDensity="true"

View File

@@ -168,7 +168,7 @@ dependencies {
implementation 'com.klinkerapps:android-smsmms:5.2.6' //For SMS and MMS purposes implementation 'com.klinkerapps:android-smsmms:5.2.6' //For SMS and MMS purposes
implementation 'commons-io:commons-io:2.11.0' implementation 'commons-io:commons-io:2.8.0' // newer versions don't work on Android 7: https://stackoverflow.com/questions/73604534/no-static-method-threadlocal-withinitial-commons-io-dependency
implementation 'org.apache.commons:commons-collections4:4.4' implementation 'org.apache.commons:commons-collections4:4.4'
implementation 'org.apache.commons:commons-lang3:3.11' implementation 'org.apache.commons:commons-lang3:3.11'

View File

@@ -161,6 +161,9 @@ public class BackgroundService extends Service {
} }
public Device getDevice(String id) { public Device getDevice(String id) {
if (id == null) {
return null;
}
return devices.get(id); return devices.get(id);
} }
@@ -370,21 +373,24 @@ public class BackgroundService extends Service {
} }
if (connectedDeviceIds.size() == 1) { if (connectedDeviceIds.size() == 1) {
// Adding two action buttons only when there is a single device connected. String deviceId = connectedDeviceIds.get(0);
// Setting up Send File Intent. Device device = getDevice(deviceId);
Intent sendFile = new Intent(this, SendFileActivity.class); if (device != null) {
sendFile.putExtra("deviceId", connectedDeviceIds.get(0)); // Adding two action buttons only when there is a single device connected.
PendingIntent sendPendingFile = PendingIntent.getActivity(this, 1, sendFile, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE); // Setting up Send File Intent.
notification.addAction(0, getString(R.string.send_files), sendPendingFile); Intent sendFile = new Intent(this, SendFileActivity.class);
sendFile.putExtra("deviceId", deviceId);
PendingIntent sendPendingFile = PendingIntent.getActivity(this, 1, sendFile, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
notification.addAction(0, getString(R.string.send_files), sendPendingFile);
// Checking if there are registered commands and adding the button. // Checking if there are registered commands and adding the button.
Device device = getDevice(connectedDeviceIds.get(0)); RunCommandPlugin plugin = (RunCommandPlugin) device.getPlugin("RunCommandPlugin");
RunCommandPlugin plugin = (RunCommandPlugin) device.getPlugin("RunCommandPlugin"); if (plugin != null && !plugin.getCommandList().isEmpty()) {
if (plugin != null && !plugin.getCommandList().isEmpty()) { Intent runCommand = new Intent(this, RunCommandActivity.class);
Intent runCommand = new Intent(this, RunCommandActivity.class); runCommand.putExtra("deviceId", connectedDeviceIds.get(0));
runCommand.putExtra("deviceId", connectedDeviceIds.get(0)); PendingIntent runPendingCommand = PendingIntent.getActivity(this, 2, runCommand, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
PendingIntent runPendingCommand = PendingIntent.getActivity(this, 2, runCommand, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE); notification.addAction(0, getString(R.string.pref_plugin_runcommand), runPendingCommand);
notification.addAction(0, getString(R.string.pref_plugin_runcommand), runPendingCommand); }
} }
} }
} }

View File

@@ -211,6 +211,6 @@ public class FindMyPhonePlugin extends Plugin {
@Override @Override
public PluginSettingsFragment getSettingsFragment(Activity activity) { public PluginSettingsFragment getSettingsFragment(Activity activity) {
return FindMyPhoneSettingsFragment.newInstance(getPluginKey()); return FindMyPhoneSettingsFragment.newInstance(getPluginKey(), R.xml.findmyphoneplugin_preferences);
} }
} }

View File

@@ -28,9 +28,9 @@ public class FindMyPhoneSettingsFragment extends PluginSettingsFragment {
private SharedPreferences sharedPreferences; private SharedPreferences sharedPreferences;
private Preference ringtonePreference; private Preference ringtonePreference;
public static FindMyPhoneSettingsFragment newInstance(@NonNull String pluginKey) { public static FindMyPhoneSettingsFragment newInstance(@NonNull String pluginKey, int layout) {
FindMyPhoneSettingsFragment fragment = new FindMyPhoneSettingsFragment(); FindMyPhoneSettingsFragment fragment = new FindMyPhoneSettingsFragment();
fragment.setArguments(pluginKey); fragment.setArguments(pluginKey, layout);
return fragment; return fragment;
} }

View File

@@ -13,6 +13,7 @@ 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.Plugins.PluginFactory;
import org.kde.kdeconnect.UserInterface.PluginSettingsFragment;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
@@ -54,6 +55,11 @@ public class MousePadPlugin extends Plugin {
return true; return true;
} }
@Override
public PluginSettingsFragment getSettingsFragment(Activity activity) {
return PluginSettingsFragment.newInstance(getPluginKey(), R.xml.mousepadplugin_preferences);
}
@Override @Override
public boolean hasMainActivity() { public boolean hasMainActivity() {
return true; return true;

View File

@@ -19,6 +19,7 @@ import androidx.core.content.ContextCompat;
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.PluginFactory;
import org.kde.kdeconnect.UserInterface.PluginSettingsFragment;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
import java.net.MalformedURLException; import java.net.MalformedURLException;
@@ -254,6 +255,11 @@ public class MprisPlugin extends Plugin {
return true; return true;
} }
@Override
public PluginSettingsFragment getSettingsFragment(Activity activity) {
return PluginSettingsFragment.newInstance(getPluginKey(), R.xml.mprisplugin_preferences);
}
@Override @Override
public boolean onCreate() { public boolean onCreate() {
MprisMediaSession.getInstance().onCreate(context.getApplicationContext(), this, device.getDeviceId()); MprisMediaSession.getInstance().onCreate(context.getApplicationContext(), this, device.getDeviceId());

View File

@@ -166,7 +166,8 @@ public abstract class Plugin {
* @return The PluginSettingsFragment used to display this plugins settings * @return The PluginSettingsFragment used to display this plugins settings
*/ */
public PluginSettingsFragment getSettingsFragment(Activity activity) { public PluginSettingsFragment getSettingsFragment(Activity activity) {
return PluginSettingsFragment.newInstance(getPluginKey()); throw new RuntimeException("Plugin doesn't reimplement getSettingsFragment: " + getPluginKey());
} }
/** /**

View File

@@ -6,6 +6,7 @@
package org.kde.kdeconnect.Plugins.RemoteKeyboardPlugin; package org.kde.kdeconnect.Plugins.RemoteKeyboardPlugin;
import android.app.Activity;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.SystemClock; import android.os.SystemClock;
@@ -24,6 +25,7 @@ import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory; import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect.UserInterface.MainActivity; import org.kde.kdeconnect.UserInterface.MainActivity;
import org.kde.kdeconnect.UserInterface.StartActivityAlertDialogFragment; import org.kde.kdeconnect.UserInterface.StartActivityAlertDialogFragment;
import org.kde.kdeconnect.UserInterface.PluginSettingsFragment;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
import java.util.ArrayList; import java.util.ArrayList;
@@ -159,6 +161,11 @@ public class RemoteKeyboardPlugin extends Plugin implements SharedPreferences.On
return true; return true;
} }
@Override
public PluginSettingsFragment getSettingsFragment(Activity activity) {
return PluginSettingsFragment.newInstance(getPluginKey(), R.xml.remotekeyboardplugin_preferences);
}
@Override @Override
public boolean hasMainActivity() { public boolean hasMainActivity() {
return false; return false;

View File

@@ -8,6 +8,7 @@
package org.kde.kdeconnect.Plugins.SMSPlugin; package org.kde.kdeconnect.Plugins.SMSPlugin;
import android.app.Activity;
import android.Manifest; import android.Manifest;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
@@ -36,6 +37,7 @@ 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.PluginFactory;
import org.kde.kdeconnect.Plugins.TelephonyPlugin.TelephonyPlugin; import org.kde.kdeconnect.Plugins.TelephonyPlugin.TelephonyPlugin;
import org.kde.kdeconnect.UserInterface.PluginSettingsFragment;
import org.kde.kdeconnect_tp.BuildConfig; import org.kde.kdeconnect_tp.BuildConfig;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
@@ -557,6 +559,11 @@ public class SMSPlugin extends Plugin {
return true; return true;
} }
@Override
public PluginSettingsFragment getSettingsFragment(Activity activity) {
return PluginSettingsFragment.newInstance(getPluginKey(), R.xml.smsplugin_preferences);
}
@Override @Override
public String[] getSupportedPacketTypes() { public String[] getSupportedPacketTypes() {
return new String[]{ return new String[]{

View File

@@ -263,7 +263,7 @@ public class SftpPlugin extends Plugin implements SharedPreferences.OnSharedPref
@Override @Override
public PluginSettingsFragment getSettingsFragment(Activity activity) { public PluginSettingsFragment getSettingsFragment(Activity activity) {
return SftpSettingsFragment.newInstance(getPluginKey()); return SftpSettingsFragment.newInstance(getPluginKey(), R.xml.sftpplugin_preferences);
} }
@Override @Override

View File

@@ -64,9 +64,9 @@ public class SftpSettingsFragment
private ActionMode actionMode; private ActionMode actionMode;
private JSONObject savedActionModeState; private JSONObject savedActionModeState;
public static SftpSettingsFragment newInstance(@NonNull String pluginKey) { public static SftpSettingsFragment newInstance(@NonNull String pluginKey, int layout) {
SftpSettingsFragment fragment = new SftpSettingsFragment(); SftpSettingsFragment fragment = new SftpSettingsFragment();
fragment.setArguments(pluginKey); fragment.setArguments(pluginKey, layout);
return fragment; return fragment;
} }

View File

@@ -197,7 +197,7 @@ public class SharePlugin extends Plugin {
@Override @Override
public PluginSettingsFragment getSettingsFragment(Activity activity) { public PluginSettingsFragment getSettingsFragment(Activity activity) {
return ShareSettingsFragment.newInstance(getPluginKey()); return ShareSettingsFragment.newInstance(getPluginKey(), R.xml.shareplugin_preferences);
} }
void sendUriList(final ArrayList<Uri> uriList) { void sendUriList(final ArrayList<Uri> uriList) {

View File

@@ -37,9 +37,9 @@ public class ShareSettingsFragment extends PluginSettingsFragment {
private Preference filePicker; private Preference filePicker;
public static ShareSettingsFragment newInstance(@NonNull String pluginKey) { public static ShareSettingsFragment newInstance(@NonNull String pluginKey, int layout) {
ShareSettingsFragment fragment = new ShareSettingsFragment(); ShareSettingsFragment fragment = new ShareSettingsFragment();
fragment.setArguments(pluginKey); fragment.setArguments(pluginKey, layout);
return fragment; return fragment;
} }

View File

@@ -6,6 +6,7 @@
package org.kde.kdeconnect.Plugins.TelephonyPlugin; package org.kde.kdeconnect.Plugins.TelephonyPlugin;
import android.app.Activity;
import android.Manifest; import android.Manifest;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
@@ -26,6 +27,7 @@ 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.Plugins.PluginFactory;
import org.kde.kdeconnect.UserInterface.PluginSettingsFragment;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
import java.util.Map; import java.util.Map;
@@ -318,4 +320,9 @@ public class TelephonyPlugin extends Plugin {
public boolean hasSettings() { public boolean hasSettings() {
return true; return true;
} }
@Override
public PluginSettingsFragment getSettingsFragment(Activity activity) {
return PluginSettingsFragment.newInstance(getPluginKey(), R.xml.telephonyplugin_preferences);
}
} }

View File

@@ -18,28 +18,33 @@ import org.kde.kdeconnect.Device;
import org.kde.kdeconnect.Plugins.Plugin; import org.kde.kdeconnect.Plugins.Plugin;
import org.kde.kdeconnect.Plugins.PluginFactory; import org.kde.kdeconnect.Plugins.PluginFactory;
import org.kde.kdeconnect_tp.R; import org.kde.kdeconnect_tp.R;
import android.util.Log;
import java.util.Locale; import java.util.Locale;
public class PluginSettingsFragment extends PreferenceFragmentCompat { public class PluginSettingsFragment extends PreferenceFragmentCompat {
private static final String ARG_PLUGIN_KEY = "plugin_key"; private static final String ARG_PLUGIN_KEY = "plugin_key";
private static final String ARG_LAYOUT = "layout";
private String pluginKey; private String pluginKey;
private int layout;
protected Device device; protected Device device;
protected Plugin plugin; protected Plugin plugin;
public static PluginSettingsFragment newInstance(@NonNull String pluginKey) { public static PluginSettingsFragment newInstance(@NonNull String pluginKey, int settingsLayout) {
PluginSettingsFragment fragment = new PluginSettingsFragment(); PluginSettingsFragment fragment = new PluginSettingsFragment();
fragment.setArguments(pluginKey); fragment.setArguments(pluginKey, settingsLayout);
return fragment; return fragment;
} }
public PluginSettingsFragment() {} public PluginSettingsFragment() {}
protected Bundle setArguments(@NonNull String pluginKey) { protected Bundle setArguments(@NonNull String pluginKey, int settingsLayout) {
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putString(ARG_PLUGIN_KEY, pluginKey); args.putString(ARG_PLUGIN_KEY, pluginKey);
args.putInt(ARG_LAYOUT, settingsLayout);
setArguments(args); setArguments(args);
@@ -52,7 +57,8 @@ public class PluginSettingsFragment extends PreferenceFragmentCompat {
throw new RuntimeException("You must provide a pluginKey by calling setArguments(@NonNull String pluginKey)"); throw new RuntimeException("You must provide a pluginKey by calling setArguments(@NonNull String pluginKey)");
} }
pluginKey = getArguments().getString(ARG_PLUGIN_KEY); this.pluginKey = getArguments().getString(ARG_PLUGIN_KEY);
this.layout = getArguments().getInt(ARG_LAYOUT);
this.device = getDeviceOrThrow(getDeviceId()); this.device = getDeviceOrThrow(getDeviceId());
this.plugin = device.getPlugin(pluginKey); this.plugin = device.getPlugin(pluginKey);
@@ -67,9 +73,7 @@ public class PluginSettingsFragment extends PreferenceFragmentCompat {
prefsManager.setSharedPreferencesMode(Context.MODE_PRIVATE); prefsManager.setSharedPreferencesMode(Context.MODE_PRIVATE);
} }
int resFile = getResources().getIdentifier(pluginKey.toLowerCase(Locale.ENGLISH) + "_preferences", "xml", addPreferencesFromResource(layout);
requireContext().getPackageName());
addPreferencesFromResource(resFile);
} }
@Override @Override