From 16cffda2e2bb1b5600de65b0bc32cc5d8f9cad00 Mon Sep 17 00:00:00 2001 From: Albert Vaca Date: Fri, 11 Sep 2015 07:10:38 -0700 Subject: [PATCH 1/3] Increased version number to beta-release --- AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index a947a3bf..71c5596b 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,7 +1,7 @@ Date: Sat, 12 Sep 2015 11:53:06 -0700 Subject: [PATCH 2/3] Top margin should be in the title, not in the view --- res/layout/activity_list.xml | 3 ++- src/org/kde/kdeconnect/UserInterface/PairingFragment.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/res/layout/activity_list.xml b/res/layout/activity_list.xml index 5e9ee5c1..88188a28 100644 --- a/res/layout/activity_list.xml +++ b/res/layout/activity_list.xml @@ -2,7 +2,8 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:padding="16dip" + android:paddingLeft="16dip" + android:paddingRight="16dip" tools:context=".MainActivity" android:id="@+id/listView1" android:addStatesFromChildren="true" diff --git a/src/org/kde/kdeconnect/UserInterface/PairingFragment.java b/src/org/kde/kdeconnect/UserInterface/PairingFragment.java index 995b112e..4cb92751 100644 --- a/src/org/kde/kdeconnect/UserInterface/PairingFragment.java +++ b/src/org/kde/kdeconnect/UserInterface/PairingFragment.java @@ -77,7 +77,7 @@ public class PairingFragment extends Fragment implements PairingDeviceItem.Callb TextView text = new TextView(inflater.getContext()); text.setText(getString(R.string.pairing_description)); - text.setPadding(0, 0, 0, (int) (12 * getResources().getDisplayMetrics().density)); + text.setPadding(0, (int) (16 * getResources().getDisplayMetrics().density), 0, (int) (12 * getResources().getDisplayMetrics().density)); ((ListView) rootView).addHeaderView(text); return rootView; From 24ca5f706ab37713529cfcc73889587d6740797b Mon Sep 17 00:00:00 2001 From: Albert Vaca Date: Sat, 12 Sep 2015 13:21:06 -0700 Subject: [PATCH 3/3] Fixed pairing requests not being displayed after clicking the notification --- src/org/kde/kdeconnect/BackgroundService.java | 17 ++- src/org/kde/kdeconnect/Device.java | 51 ++++--- .../UserInterface/DeviceFragment.java | 132 +++++++++--------- 3 files changed, 112 insertions(+), 88 deletions(-) diff --git a/src/org/kde/kdeconnect/BackgroundService.java b/src/org/kde/kdeconnect/BackgroundService.java index aeaf376e..bb357961 100644 --- a/src/org/kde/kdeconnect/BackgroundService.java +++ b/src/org/kde/kdeconnect/BackgroundService.java @@ -77,11 +77,11 @@ public class BackgroundService extends Service { } } - public static void addGuiInUseCounter(Activity activity) { + public static void addGuiInUseCounter(Context activity) { addGuiInUseCounter(activity, false); } - public static void addGuiInUseCounter(final Activity activity, final boolean forceNetworkRefresh) { + public static void addGuiInUseCounter(final Context activity, final boolean forceNetworkRefresh) { BackgroundService.RunCommand(activity, new BackgroundService.InstanceCallback() { @Override public void onServiceStart(BackgroundService service) { @@ -93,7 +93,7 @@ public class BackgroundService extends Service { }); } - public static void removeGuiInUseCounter(final Activity activity) { + public static void removeGuiInUseCounter(final Context activity) { BackgroundService.RunCommand(activity, new BackgroundService.InstanceCallback() { @Override public void onServiceStart(BackgroundService service) { @@ -162,7 +162,7 @@ public class BackgroundService extends Service { private void cleanDevices() { for(Device d : devices.values()) { - if (!d.isPaired()) { + if (!d.isPaired() && !d.isPairRequested() && !d.isPairRequestedByOtherEnd() && d.getConnectionSource() == BaseLink.ConnectionStarted.Remotely) { d.disconnect(); } } @@ -182,9 +182,14 @@ public class BackgroundService extends Service { } else { Log.i("KDE/BackgroundService", "addLink,unknown device: " + deviceId); device = new Device(BackgroundService.this, identityPackage, link); - if (device.isPaired() || !discoveryModeAcquisitions.isEmpty()) { + if (device.isPaired() || device.isPairRequested() || device.isPairRequestedByOtherEnd() + || link.getConnectionSource() == BaseLink.ConnectionStarted.Locally + ||!discoveryModeAcquisitions.isEmpty() ) + { devices.put(deviceId, device); device.addPairingCallback(devicePairingCallback); + } else { + device.disconnect(); } } @@ -197,7 +202,7 @@ public class BackgroundService extends Service { Log.i("KDE/onConnectionLost", "removeLink, deviceId: " + link.getDeviceId()); if (d != null) { d.removeLink(link); - if (!d.isReachable() && !d.isPaired() && (link.getConnectionSource() == BaseLink.ConnectionStarted.Locally)) { + if (!d.isReachable() && !d.isPaired()) { //Log.e("onConnectionLost","Removing connection device because it was not paired"); devices.remove(link.getDeviceId()); d.removePairingCallback(devicePairingCallback); diff --git a/src/org/kde/kdeconnect/Device.java b/src/org/kde/kdeconnect/Device.java index 765daf54..909818ae 100644 --- a/src/org/kde/kdeconnect/Device.java +++ b/src/org/kde/kdeconnect/Device.java @@ -203,11 +203,12 @@ public class Device implements BaseLink.PackageReceiver { return pairStatus == PairStatus.Requested; } + public boolean isPairRequestedByOtherEnd() { + return pairStatus == PairStatus.RequestedByPeer; + } + public void addPairingCallback(PairingCallback callback) { pairingCallback.add(callback); - if (pairStatus == PairStatus.RequestedByPeer) { - callback.incomingRequest(); - } } public void removePairingCallback(PairingCallback callback) { pairingCallback.remove(callback); @@ -245,10 +246,10 @@ public class Device implements BaseLink.PackageReceiver { //Send our own public key NetworkPackage np = NetworkPackage.createPublicKeyPackage(context); - sendPackage(np, new SendPackageStatusCallback(){ + sendPackage(np, new SendPackageStatusCallback() { @Override public void onSuccess() { - if (pairingTimer != null) pairingTimer.cancel(); + hidePairingNotification(); //Will stop the pairingTimer if it was running pairingTimer = new Timer(); pairingTimer.schedule(new TimerTask() { @Override @@ -256,10 +257,10 @@ public class Device implements BaseLink.PackageReceiver { for (PairingCallback cb : pairingCallback) { cb.pairingFailed(context.getString(R.string.error_timed_out)); } - Log.e("KDE/Device","Unpairing (timeout A)"); + Log.e("KDE/Device", "Unpairing (timeout A)"); pairStatus = PairStatus.NotPaired; } - }, 30*1000); //Time to wait for the other to accept + }, 30 * 1000); //Time to wait for the other to accept pairStatus = PairStatus.Requested; } @@ -268,7 +269,7 @@ public class Device implements BaseLink.PackageReceiver { for (PairingCallback cb : pairingCallback) { cb.pairingFailed(context.getString(R.string.error_could_not_send_package)); } - Log.e("KDE/Device","Unpairing (sendFailed A)"); + Log.e("KDE/Device", "Unpairing (sendFailed A)"); pairStatus = PairStatus.NotPaired; } @@ -276,8 +277,13 @@ public class Device implements BaseLink.PackageReceiver { } - public int getNotificationId() { - return notificationId; + public void hidePairingNotification() { + NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + notificationManager.cancel(notificationId); + if (pairingTimer != null) { + pairingTimer.cancel(); + } + BackgroundService.removeGuiInUseCounter(context); } public void unpair() { @@ -302,7 +308,7 @@ public class Device implements BaseLink.PackageReceiver { //Log.e("Device", "Storing as trusted, deviceId: "+deviceId); - if (pairingTimer != null) pairingTimer.cancel(); + hidePairingNotification(); pairStatus = PairStatus.Paired; @@ -448,7 +454,7 @@ public class Device implements BaseLink.PackageReceiver { if (pairStatus == PairStatus.Requested) { //Log.e("Device","Unpairing (pair rejected)"); pairStatus = PairStatus.NotPaired; - if (pairingTimer != null) pairingTimer.cancel(); + hidePairingNotification(); for (PairingCallback cb : pairingCallback) { cb.pairingFailed(context.getString(R.string.error_canceled_by_other_peer)); } @@ -476,7 +482,7 @@ public class Device implements BaseLink.PackageReceiver { Log.i("KDE/Pairing","Pair answer"); - if (pairingTimer != null) pairingTimer.cancel(); + hidePairingNotification(); pairingDone(); @@ -490,6 +496,8 @@ public class Device implements BaseLink.PackageReceiver { Resources res = context.getResources(); + hidePairingNotification(); + Notification noti = new NotificationCompat.Builder(context) .setContentTitle(res.getString(R.string.pairing_request_from, getName())) .setContentText(res.getString(R.string.tap_to_answer)) @@ -504,21 +512,20 @@ public class Device implements BaseLink.PackageReceiver { final NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); notificationId = (int)System.currentTimeMillis(); try { + BackgroundService.addGuiInUseCounter(context); notificationManager.notify(notificationId, noti); } catch(Exception e) { //4.1 will throw an exception about not having the VIBRATE permission, ignore it. //https://android.googlesource.com/platform/frameworks/base/+/android-4.2.1_r1.2%5E%5E!/ } - if (pairingTimer != null) pairingTimer.cancel(); pairingTimer = new Timer(); - pairingTimer.schedule(new TimerTask() { @Override public void run() { Log.e("KDE/Device","Unpairing (timeout B)"); + hidePairingNotification(); pairStatus = PairStatus.NotPaired; - notificationManager.cancel(notificationId); } }, 25*1000); //Time to show notification, waiting for user to accept (peer will timeout in 30 seconds) pairStatus = PairStatus.RequestedByPeer; @@ -529,7 +536,7 @@ public class Device implements BaseLink.PackageReceiver { Log.i("KDE/Pairing","Unpair request"); if (pairStatus == PairStatus.Requested) { - pairingTimer.cancel(); + hidePairingNotification(); for (PairingCallback cb : pairingCallback) { cb.pairingFailed(context.getString(R.string.error_canceled_by_other_peer)); } @@ -805,4 +812,14 @@ public class Device implements BaseLink.PackageReceiver { link.disconnect(); } } + + public BaseLink.ConnectionStarted getConnectionSource() { + for(BaseLink l : links) { + if (l.getConnectionSource() == BaseLink.ConnectionStarted.Locally) { + return BaseLink.ConnectionStarted.Locally; + } + } + return BaseLink.ConnectionStarted.Remotely; + } + } diff --git a/src/org/kde/kdeconnect/UserInterface/DeviceFragment.java b/src/org/kde/kdeconnect/UserInterface/DeviceFragment.java index 561e65aa..f1784a6c 100644 --- a/src/org/kde/kdeconnect/UserInterface/DeviceFragment.java +++ b/src/org/kde/kdeconnect/UserInterface/DeviceFragment.java @@ -293,73 +293,85 @@ public class DeviceFragment extends Fragment { return; } + //Once in-app, there is no point in keep displaying the notification if any + device.hidePairingNotification(); + mActivity.runOnUiThread(new Runnable() { @Override public void run() { - boolean paired = device.isPaired(); - boolean reachable = device.isReachable(); + Log.e("DEVICE",device.getName() + device.isPairRequestedByOtherEnd() + device.isPairRequested()); + if (device.isPairRequestedByOtherEnd()) { + ((TextView) rootView.findViewById(R.id.pair_message)).setText(R.string.pair_requested); + rootView.findViewById(R.id.pair_progress).setVisibility(View.GONE); + rootView.findViewById(R.id.pair_button).setVisibility(View.GONE); + rootView.findViewById(R.id.pair_request).setVisibility(View.VISIBLE); + } else { - rootView.findViewById(R.id.pairing_buttons).setVisibility(paired ? View.GONE : View.VISIBLE); - rootView.findViewById(R.id.unpair_message).setVisibility((paired && !reachable) ? View.VISIBLE : View.GONE); + boolean paired = device.isPaired(); + boolean reachable = device.isReachable(); - try { - ArrayList items = new ArrayList<>(); + rootView.findViewById(R.id.pairing_buttons).setVisibility(paired ? View.GONE : View.VISIBLE); + rootView.findViewById(R.id.unpair_message).setVisibility((paired && !reachable) ? View.VISIBLE : View.GONE); - //Plugins button list - final Collection plugins = device.getLoadedPlugins().values(); - for (final Plugin p : plugins) { - if (!p.hasMainActivity()) continue; - if (p.displayInContextMenu()) continue; + try { + ArrayList items = new ArrayList<>(); - items.add(new PluginItem(p, new View.OnClickListener() { - @Override - public void onClick(View v) { - p.startMainActivity(mActivity); + //Plugins button list + final Collection plugins = device.getLoadedPlugins().values(); + for (final Plugin p : plugins) { + if (!p.hasMainActivity()) continue; + if (p.displayInContextMenu()) continue; + + items.add(new PluginItem(p, new View.OnClickListener() { + @Override + public void onClick(View v) { + p.startMainActivity(mActivity); + } + })); } - })); - } - //Failed plugins List - final Collection failed = device.getFailedPlugins().values(); - if (!failed.isEmpty()) { - if (errorHeader == null) { - errorHeader = new TextView(mActivity); - errorHeader.setPadding( - 0, - ((int) (28 * getResources().getDisplayMetrics().density)), - 0, - ((int) (8 * getResources().getDisplayMetrics().density)) - ); - errorHeader.setOnClickListener(null); - errorHeader.setOnLongClickListener(null); - errorHeader.setText(getResources().getString(R.string.plugins_failed_to_load)); - } - items.add(new CustomItem(errorHeader)); - for (final Plugin p : failed) { - items.add(new SmallEntryItem(p.getDisplayName(), new View.OnClickListener() { - @Override - public void onClick(View v) { - p.getErrorDialog(mActivity).show(); + //Failed plugins List + final Collection failed = device.getFailedPlugins().values(); + if (!failed.isEmpty()) { + if (errorHeader == null) { + errorHeader = new TextView(mActivity); + errorHeader.setPadding( + 0, + ((int) (28 * getResources().getDisplayMetrics().density)), + 0, + ((int) (8 * getResources().getDisplayMetrics().density)) + ); + errorHeader.setOnClickListener(null); + errorHeader.setOnLongClickListener(null); + errorHeader.setText(getResources().getString(R.string.plugins_failed_to_load)); } - })); + items.add(new CustomItem(errorHeader)); + for (final Plugin p : failed) { + items.add(new SmallEntryItem(p.getDisplayName(), new View.OnClickListener() { + @Override + public void onClick(View v) { + p.getErrorDialog(mActivity).show(); + } + })); + } + } + + ListView buttonsList = (ListView) rootView.findViewById(R.id.buttons_list); + ListAdapter adapter = new ListAdapter(mActivity, items); + buttonsList.setAdapter(adapter); + + mActivity.invalidateOptionsMenu(); + + } catch (IllegalStateException e) { + e.printStackTrace(); + //Ignore: The activity was closed while we were trying to update it + } catch (ConcurrentModificationException e) { + Log.e("DeviceActivity", "ConcurrentModificationException"); + this.run(); //Try again } + } - - ListView buttonsList = (ListView) rootView.findViewById(R.id.buttons_list); - ListAdapter adapter = new ListAdapter(mActivity, items); - buttonsList.setAdapter(adapter); - - mActivity.invalidateOptionsMenu(); - - } catch (IllegalStateException e) { - e.printStackTrace(); - //Ignore: The activity was closed while we were trying to update it - } catch (ConcurrentModificationException e) { - Log.e("DeviceActivity", "ConcurrentModificationException"); - this.run(); //Try again - } - } }); @@ -369,17 +381,7 @@ public class DeviceFragment extends Fragment { @Override public void incomingRequest() { - mActivity.runOnUiThread(new Runnable() { - @Override - public void run() { - ((TextView) rootView.findViewById(R.id.pair_message)).setText(R.string.pair_requested); - rootView.findViewById(R.id.pair_progress).setVisibility(View.GONE); - rootView.findViewById(R.id.pair_button).setVisibility(View.GONE); - rootView.findViewById(R.id.pair_request).setVisibility(View.VISIBLE); - } - }); - NotificationManager notificationManager = (NotificationManager) mActivity.getSystemService(Context.NOTIFICATION_SERVICE); - notificationManager.cancel(device.getNotificationId()); + refreshUI(); } @Override