diff --git a/AndroidManifest.xml b/AndroidManifest.xml
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -15,6 +15,7 @@
android:name="android.hardware.telephony"
android:required="false" />
+
@@ -28,11 +29,12 @@
-
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/trusted_network_list.xml b/res/layout/trusted_network_list.xml
new file mode 100644
--- /dev/null
+++ b/res/layout/trusted_network_list.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/menu/pairing.xml b/res/menu/pairing.xml
--- a/res/menu/pairing.xml
+++ b/res/menu/pairing.xml
@@ -14,4 +14,10 @@
android:title="@string/custom_device_list"
kdeconnect:showAsAction="never" />
+
+
diff --git a/res/values/strings.xml b/res/values/strings.xml
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -337,8 +337,14 @@
Launch the camera app to ease taking and transferring pictures
findmyphone_ringtone
+
No suitable app found to open this file
KDE Connect Remote Keyboard
Pointer
+ Trusted networks
+ Add %1$s
+ You haven\'t added any trusted network yet
+ Allow all
+
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
@@ -33,6 +33,7 @@
import org.kde.kdeconnect.Helpers.DeviceHelper;
import org.kde.kdeconnect.Helpers.SecurityHelpers.SslHelper;
import org.kde.kdeconnect.Helpers.StringsHelper;
+import org.kde.kdeconnect.Helpers.TrustedNetworkHelper;
import org.kde.kdeconnect.NetworkPacket;
import org.kde.kdeconnect.UserInterface.CustomDevicesActivity;
@@ -117,6 +118,11 @@
//I've received their broadcast and should connect to their TCP socket and send my identity.
private void udpPacketReceived(DatagramPacket packet) {
+ if (TrustedNetworkHelper.isNotTrustedNetwork(context)) {
+ Log.w("LanLinkProvider", "Current WiFi isn't a Trusted Network");
+ return;
+ }
+
final InetAddress address = packet.getAddress();
try {
@@ -364,6 +370,11 @@
}
lastBroadcast = System.currentTimeMillis();
+ if (TrustedNetworkHelper.isNotTrustedNetwork(context)) {
+ Log.w("LanLinkProvider", "Current WiFi isn't a Trusted Network");
+ return;
+ }
+
new Thread(() -> {
ArrayList iplist = CustomDevicesActivity
.getCustomDeviceList(PreferenceManager.getDefaultSharedPreferences(context));
diff --git a/src/org/kde/kdeconnect/Helpers/TrustedNetworkHelper.java b/src/org/kde/kdeconnect/Helpers/TrustedNetworkHelper.java
new file mode 100644
--- /dev/null
+++ b/src/org/kde/kdeconnect/Helpers/TrustedNetworkHelper.java
@@ -0,0 +1,82 @@
+package org.kde.kdeconnect.Helpers;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import android.content.Context;
+import android.net.wifi.SupplicantState;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.preference.PreferenceManager;
+import android.text.TextUtils;
+import android.util.Log;
+
+public class TrustedNetworkHelper {
+
+ private static final String KEY_CUSTOM_TRUSTED_NETWORKS = "trusted_network_preference";
+ private static final String KEY_CUSTOM_TRUST_ALL_NETWORKS = "trust_all_network_preference";
+ private static final String NETWORK_SSID_DELIMITER = "#_#";
+ private static final String NOT_AVAILABLE_SSID_RESULT = "";
+
+
+ private final Context context;
+
+ public TrustedNetworkHelper(Context context) {
+ this.context = context;
+ }
+
+ public List read() {
+ String serializeTrustedNetwork = PreferenceManager.getDefaultSharedPreferences(context).getString(
+ KEY_CUSTOM_TRUSTED_NETWORKS, "");
+ if (serializeTrustedNetwork.isEmpty())
+ return Collections.emptyList();
+ return Arrays.asList(serializeTrustedNetwork.split(NETWORK_SSID_DELIMITER));
+ }
+
+ public void update(List trustedNetworks) {
+ String serialized = TextUtils.join(NETWORK_SSID_DELIMITER, trustedNetworks);
+ PreferenceManager.getDefaultSharedPreferences(context).edit().putString(
+ KEY_CUSTOM_TRUSTED_NETWORKS, serialized).apply();
+ }
+
+ public Boolean allAllowed() {
+ return PreferenceManager
+ .getDefaultSharedPreferences(context)
+ .getBoolean(KEY_CUSTOM_TRUST_ALL_NETWORKS, Boolean.TRUE);
+ }
+
+ public void allAllowed(boolean isChecked) {
+ PreferenceManager
+ .getDefaultSharedPreferences(context)
+ .edit()
+ .putBoolean(KEY_CUSTOM_TRUST_ALL_NETWORKS, isChecked)
+ .apply();
+ }
+
+ public String currentSSID() {
+ WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
+ Log.d("Fou", "get");
+ if (wifiManager == null) return "";
+ WifiInfo wifiInfo = wifiManager.getConnectionInfo();
+ if (wifiInfo.getSupplicantState() != SupplicantState.COMPLETED) {
+ Log.d("Fou", "fooo");
+ return "";
+ }
+ String ssid = wifiInfo.getSSID();
+ if (ssid.equalsIgnoreCase(NOT_AVAILABLE_SSID_RESULT)){
+ Log.d("Fou", "navail");
+ return "";
+ }
+ Log.d("Fou", "retn");
+ return ssid;
+ }
+
+ public static boolean isNotTrustedNetwork(Context context) {
+ TrustedNetworkHelper trustedNetworkHelper = new TrustedNetworkHelper(context);
+ if (trustedNetworkHelper.allAllowed()){
+ return false;
+ }
+ return trustedNetworkHelper.read().indexOf(trustedNetworkHelper.currentSSID()) == -1;
+ }
+}
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
@@ -299,6 +299,10 @@
case R.id.menu_custom_device_list:
startActivity(new Intent(mActivity, CustomDevicesActivity.class));
break;
+ case R.id.menu_trusted_networks:
+ startActivity(new Intent(mActivity, TrustedNetworksActivity.class));
+ break;
+
default:
break;
}
diff --git a/src/org/kde/kdeconnect/UserInterface/TrustedNetworksActivity.java b/src/org/kde/kdeconnect/UserInterface/TrustedNetworksActivity.java
new file mode 100644
--- /dev/null
+++ b/src/org/kde/kdeconnect/UserInterface/TrustedNetworksActivity.java
@@ -0,0 +1,148 @@
+package org.kde.kdeconnect.UserInterface;
+
+import static android.view.View.GONE;
+import static android.view.View.VISIBLE;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.kde.kdeconnect.BackgroundService;
+import org.kde.kdeconnect.Helpers.TrustedNetworkHelper;
+import org.kde.kdeconnect_tp.R;
+
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.os.Build;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.*;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AppCompatActivity;
+
+public class TrustedNetworksActivity extends AppCompatActivity {
+
+ private ListView trustedNetworksView;
+ private List trustedNetworks;
+
+ private boolean dialogAlreadyShown = false;
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+
+ TrustedNetworkHelper trustedNetworkHelper = new TrustedNetworkHelper(getApplicationContext());
+ super.onCreate(savedInstanceState);
+ trustedNetworks = new ArrayList<>(trustedNetworkHelper.read());
+ ThemeUtil.setUserPreferredTheme(this);
+ setContentView(R.layout.trusted_network_list);
+ trustedNetworksView = findViewById(android.R.id.list);
+ emptyListMessage(trustedNetworkHelper);
+
+ trustedNetworkListView(trustedNetworkHelper);
+
+ CheckBox allowAllCheckBox = findViewById(R.id.trust_all_networks_checkBox);
+ allowAllCheckBox.setChecked(trustedNetworkHelper.allAllowed());
+ allowAllCheckBox.setOnCheckedChangeListener((v, isChecked) -> {
+ trustedNetworkHelper.allAllowed(isChecked);
+ trustedNetworkListView(trustedNetworkHelper);
+ });
+
+ }
+
+ private void emptyListMessage(TrustedNetworkHelper trustedNetworkHelper) {
+ boolean isVisible = trustedNetworks.isEmpty() && !trustedNetworkHelper.allAllowed();
+ findViewById(R.id.trusted_network_list_empty)
+ .setVisibility(isVisible ? VISIBLE : GONE );
+ }
+
+ private void trustedNetworkListView(TrustedNetworkHelper trustedNetworkHelper) {
+ Boolean allAllowed = trustedNetworkHelper.allAllowed();
+ emptyListMessage(trustedNetworkHelper);
+// trustedNetworksView.setVisibility(allAllowed ? GONE : VISIBLE);
+ trustedNetworksView.setVisibility(allAllowed ? VISIBLE : VISIBLE);
+// if (allAllowed){
+// return;
+// }
+ trustedNetworksView.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, trustedNetworks));
+ trustedNetworksView.setOnItemClickListener(onItemClickGenerator(trustedNetworkHelper));
+ addNetworkButton(trustedNetworkHelper);
+ }
+
+ @NonNull
+ private AdapterView.OnItemClickListener onItemClickGenerator(TrustedNetworkHelper trustedNetworkHelper) {
+ return (parent, view, position, id) -> {
+ if (dialogAlreadyShown) {
+ return;
+ }
+ String targetItem = trustedNetworks.get(position);
+
+ // remove touched item after confirmation
+ DialogInterface.OnClickListener confirmationListener = (dialog, which) -> {
+ switch (which) {
+ case DialogInterface.BUTTON_POSITIVE:
+ trustedNetworks.remove(position);
+ trustedNetworkHelper.update(trustedNetworks);
+ ((ArrayAdapter) trustedNetworksView.getAdapter()).notifyDataSetChanged();
+ addNetworkButton(trustedNetworkHelper);
+ emptyListMessage(trustedNetworkHelper);
+ break;
+ case DialogInterface.BUTTON_NEGATIVE:
+ break;
+ }
+ };
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setMessage("Delete " + targetItem + " ?");
+ 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 addNetworkButton(TrustedNetworkHelper trustedNetworkHelper) {
+ String currentSSID = trustedNetworkHelper.currentSSID();
+ if (!currentSSID.isEmpty() && trustedNetworks.indexOf(currentSSID) == -1) {
+ Button addButton = (Button) findViewById(android.R.id.button1);
+ String buttonText = getString(R.string.add_trusted_network, currentSSID);
+ addButton.setText(buttonText);
+ addButton.setOnClickListener(saveCurrentSSIDAsTrustedNetwork(currentSSID, trustedNetworkHelper));
+ addButton.setVisibility(VISIBLE);
+ }
+ }
+
+
+ @NonNull
+ private View.OnClickListener saveCurrentSSIDAsTrustedNetwork(String ssid, TrustedNetworkHelper trustedNetworkHelper) {
+ return v -> {
+ if (trustedNetworks.indexOf(ssid) != -1){
+ return;
+ }
+ trustedNetworks.add(ssid);
+ trustedNetworkHelper.update(trustedNetworks);
+ ((ArrayAdapter) trustedNetworksView.getAdapter()).notifyDataSetChanged();
+ v.setVisibility(GONE);
+ };
+ }
+
+
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ BackgroundService.addGuiInUseCounter(this);
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ BackgroundService.removeGuiInUseCounter(this);
+ }
+
+}