[Libreoffice-commits] core.git: android/sdremote

Christian Lohmaier lohmaier+LibreOffice at googlemail.com
Thu Jan 16 07:46:26 PST 2014


 android/sdremote/res/drawable-hdpi/ic_action_bluetooth_searching.png                         |binary
 android/sdremote/res/drawable-mdpi/ic_action_bluetooth_searching.png                         |binary
 android/sdremote/res/drawable-xhdpi/ic_action_bluetooth_searching.png                        |binary
 android/sdremote/res/drawable-xxhdpi/ic_action_bluetooth_searching.png                       |binary
 android/sdremote/res/layout/progress.xml                                                     |    5 
 android/sdremote/res/menu/menu_action_bar_computers.xml                                      |    5 
 android/sdremote/res/values/strings.xml                                                      |    1 
 android/sdremote/src/org/libreoffice/impressremote/activity/ComputersActivity.java           |    8 +
 android/sdremote/src/org/libreoffice/impressremote/communication/BluetoothServersFinder.java |   62 +++-------
 android/sdremote/src/org/libreoffice/impressremote/fragment/ComputersFragment.java           |   17 ++
 android/sdremote/src/org/libreoffice/impressremote/util/Intents.java                         |    1 
 11 files changed, 57 insertions(+), 42 deletions(-)

New commits:
commit f5d14e0234effd16a570ec3f32349f53c1b469f0
Author: Christian Lohmaier <lohmaier+LibreOffice at googlemail.com>
Date:   Sun Dec 15 17:19:24 2013 +0100

    only autostart discovery when there are no known devices
    
    and don't loop autodiscovery, provide a manual trigger button instead.
    
    Bluetooth discovery is a hefty process and thus should not be done
    lightheartedly. Moreover discovery won't even list devices that
    are already bonded, but not set to visible. As you will be more likely
    using the remote with the same devices, it makes sense to list the
    known devices and only do discovery on explicit request/when there are
    no bonded devices yet.
    
    Fix a lifecycle problem (as the service would be quit on
    screen-rotation as the only bound client is destroyed/restarted - start
    the service instead to let it keep running, and only stop/release it
    when finishing)
    
    icons from Android's ActionBar Icon Pack, shrinked using optipng
    
    Change-Id: Ie8467f942df1aab2d64b337fc7a6f816b9d658a6
    Reviewed-on: https://gerrit.libreoffice.org/7091
    Reviewed-by: Andrzej Hunt <andrzej.hunt at collabora.com>
    Tested-by: Andrzej Hunt <andrzej.hunt at collabora.com>

diff --git a/android/sdremote/res/drawable-hdpi/ic_action_bluetooth_searching.png b/android/sdremote/res/drawable-hdpi/ic_action_bluetooth_searching.png
new file mode 100644
index 0000000..0203ea4
Binary files /dev/null and b/android/sdremote/res/drawable-hdpi/ic_action_bluetooth_searching.png differ
diff --git a/android/sdremote/res/drawable-mdpi/ic_action_bluetooth_searching.png b/android/sdremote/res/drawable-mdpi/ic_action_bluetooth_searching.png
new file mode 100644
index 0000000..22dccb1
Binary files /dev/null and b/android/sdremote/res/drawable-mdpi/ic_action_bluetooth_searching.png differ
diff --git a/android/sdremote/res/drawable-xhdpi/ic_action_bluetooth_searching.png b/android/sdremote/res/drawable-xhdpi/ic_action_bluetooth_searching.png
new file mode 100644
index 0000000..97252d4
Binary files /dev/null and b/android/sdremote/res/drawable-xhdpi/ic_action_bluetooth_searching.png differ
diff --git a/android/sdremote/res/drawable-xxhdpi/ic_action_bluetooth_searching.png b/android/sdremote/res/drawable-xxhdpi/ic_action_bluetooth_searching.png
new file mode 100644
index 0000000..8e827e9
Binary files /dev/null and b/android/sdremote/res/drawable-xxhdpi/ic_action_bluetooth_searching.png differ
diff --git a/android/sdremote/res/layout/progress.xml b/android/sdremote/res/layout/progress.xml
new file mode 100644
index 0000000..f768ec4
--- /dev/null
+++ b/android/sdremote/res/layout/progress.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ProgressBar xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" >
+</ProgressBar>
diff --git a/android/sdremote/res/menu/menu_action_bar_computers.xml b/android/sdremote/res/menu/menu_action_bar_computers.xml
index 7cbffc6..27ddf8a 100644
--- a/android/sdremote/res/menu/menu_action_bar_computers.xml
+++ b/android/sdremote/res/menu/menu_action_bar_computers.xml
@@ -24,6 +24,11 @@
         android:title="@string/menu_add_computer"
         android:icon="@drawable/ic_action_add_computer"
         compat:showAsAction="always"/>
+    <item
+        android:id="@+id/menu_start_discovery"
+        android:title="@string/menu_start_discovery"
+        android:icon="@drawable/ic_action_bluetooth_searching"
+        compat:showAsAction="always"/>
 
     <item
         android:id="@+id/menu_settings"
diff --git a/android/sdremote/res/values/strings.xml b/android/sdremote/res/values/strings.xml
index 4ec816a..deca93b 100644
--- a/android/sdremote/res/values/strings.xml
+++ b/android/sdremote/res/values/strings.xml
@@ -37,6 +37,7 @@
     <string name="menu_requirements">Requirements</string>
     <string name="menu_reconnect">Reconnect</string>
     <string name="menu_add_computer">Add computer</string>
+    <string name="menu_start_discovery">Start Discovery</string>
     <string name="menu_remove_computer">Remove</string>
     <string name="menu_slides_grid">Slides grid</string>
     <string name="menu_slides_pager">Slides pager</string>
diff --git a/android/sdremote/src/org/libreoffice/impressremote/activity/ComputersActivity.java b/android/sdremote/src/org/libreoffice/impressremote/activity/ComputersActivity.java
index 9329cd9..00d66be 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/activity/ComputersActivity.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/activity/ComputersActivity.java
@@ -14,6 +14,7 @@ import android.content.Intent;
 import android.content.SharedPreferences;
 import android.os.Bundle;
 import android.support.v4.app.FragmentTransaction;
+import android.support.v4.view.MenuItemCompat;
 import android.support.v4.view.ViewPager;
 import android.support.v7.app.ActionBar;
 import android.support.v7.app.ActionBar.Tab;
@@ -128,6 +129,13 @@ public class ComputersActivity extends ActionBarActivity implements ActionBar.Ta
         aMenu.findItem(R.id.menu_add_computer)
             .setVisible(getSupportActionBar().getSelectedTab().equals(wifiTab));
 
+        MenuItem btDiscovery = aMenu.findItem(R.id.menu_start_discovery);
+        if( btAdapter != null && btAdapter.isDiscovering()) {
+            btDiscovery.setEnabled(false);
+            MenuItemCompat.setActionView(btDiscovery, R.layout.progress);
+        }
+        btDiscovery.setVisible(getSupportActionBar().getSelectedTab().equals(btTab));
+
         return super.onPrepareOptionsMenu(aMenu);
     }
 
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/BluetoothServersFinder.java b/android/sdremote/src/org/libreoffice/impressremote/communication/BluetoothServersFinder.java
index ac6cdc3..7ae1725 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/BluetoothServersFinder.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/BluetoothServersFinder.java
@@ -12,7 +12,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.TimeUnit;
+import java.util.Set;
 
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothClass;
@@ -21,14 +21,12 @@ import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
-import android.os.Handler;
 import android.support.v4.content.LocalBroadcastManager;
 
-import org.libreoffice.impressremote.util.BluetoothOperator;
 import org.libreoffice.impressremote.util.Intents;
 
-class BluetoothServersFinder extends BroadcastReceiver implements ServersFinder, Runnable {
-    private static final int SEARCH_DELAY_IN_SECONDS = 5;
+class BluetoothServersFinder extends BroadcastReceiver implements ServersFinder {
+    private static final BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
 
     private final Context mContext;
 
@@ -42,30 +40,26 @@ class BluetoothServersFinder extends BroadcastReceiver implements ServersFinder,
 
     @Override
     public void startSearch() {
-        if (!BluetoothOperator.isAvailable()) {
+        if (btAdapter == null) {
             return;
         }
-
-        if (BluetoothOperator.getAdapter().isDiscovering()) {
-            return;
-        }
-
-        setUpBluetoothActionsReceiver();
-
-        if (!BluetoothOperator.getAdapter().isEnabled()) {
-            return;
-        }
-
-        BluetoothOperator.getAdapter().startDiscovery();
-    }
-
-    private void setUpBluetoothActionsReceiver() {
         IntentFilter aBluetoothActionsFilter = new IntentFilter();
         aBluetoothActionsFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
         aBluetoothActionsFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
         aBluetoothActionsFilter.addAction(BluetoothDevice.ACTION_FOUND);
 
         mContext.registerReceiver(this, aBluetoothActionsFilter);
+        Set<BluetoothDevice> pairedDevices = btAdapter.getBondedDevices();
+        if (pairedDevices.size() > 0) {
+            for (BluetoothDevice device : pairedDevices) {
+                addServer(device);
+            }
+        } else {
+            if (btAdapter.isDiscovering()) {
+                return;
+            }
+            btAdapter.startDiscovery();
+        }
     }
 
     @Override
@@ -73,7 +67,7 @@ class BluetoothServersFinder extends BroadcastReceiver implements ServersFinder,
         if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(aIntent.getAction())) {
             switch (aIntent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) {
                 case BluetoothAdapter.STATE_ON:
-                    BluetoothOperator.getAdapter().startDiscovery();
+                    startSearch();
                     return;
 
                 default:
@@ -82,7 +76,8 @@ class BluetoothServersFinder extends BroadcastReceiver implements ServersFinder,
         }
 
         if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(aIntent.getAction())) {
-            startDiscoveryDelayed();
+            LocalBroadcastManager.getInstance(mContext)
+                .sendBroadcast(new Intent(Intents.Actions.BT_DISCOVERY_CHANGED));
             return;
         }
 
@@ -93,23 +88,6 @@ class BluetoothServersFinder extends BroadcastReceiver implements ServersFinder,
         }
     }
 
-    private void startDiscoveryDelayed() {
-        // Start discovery again after a small delay.
-        // Check whether device is on in case the user manually
-        // disabled Bluetooth.
-
-        if (!BluetoothOperator.getAdapter().isEnabled()) {
-            return;
-        }
-
-        Handler aDiscoveryHandler = new Handler();
-        aDiscoveryHandler.postDelayed(this, TimeUnit.SECONDS.toMillis(SEARCH_DELAY_IN_SECONDS));
-    }
-
-    @Override
-    public void run() {
-        BluetoothOperator.getAdapter().startDiscovery();
-    }
     private void addServer(BluetoothDevice aBluetoothDevice) {
         Server.Type aServerType = buildServerType(aBluetoothDevice);
         String aServerAddress = aBluetoothDevice.getAddress();
@@ -139,7 +117,7 @@ class BluetoothServersFinder extends BroadcastReceiver implements ServersFinder,
 
     @Override
     public void stopSearch() {
-        if (!BluetoothOperator.isAvailable()) {
+        if (btAdapter == null) {
             return;
         }
 
@@ -150,7 +128,7 @@ class BluetoothServersFinder extends BroadcastReceiver implements ServersFinder,
             // Fixed in Honeycomb: Android’s issue #6191.
         }
 
-        BluetoothOperator.getAdapter().cancelDiscovery();
+        btAdapter.cancelDiscovery();
     }
 
     @Override
diff --git a/android/sdremote/src/org/libreoffice/impressremote/fragment/ComputersFragment.java b/android/sdremote/src/org/libreoffice/impressremote/fragment/ComputersFragment.java
index ff061e6..7f35e67 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/fragment/ComputersFragment.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/fragment/ComputersFragment.java
@@ -13,6 +13,7 @@ import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 import android.app.Activity;
+import android.bluetooth.BluetoothAdapter;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
@@ -22,8 +23,10 @@ import android.content.ServiceConnection;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.IBinder;
+import android.support.v4.app.ActivityCompat;
 import android.support.v4.app.ListFragment;
 import android.support.v4.content.LocalBroadcastManager;
+import android.support.v4.view.MenuItemCompat;
 import android.text.TextUtils;
 import android.text.method.LinkMovementMethod;
 import android.view.ContextMenu;
@@ -141,6 +144,8 @@ public class ComputersFragment extends ListFragment implements ServiceConnection
         super.onActivityCreated(aSavedInstanceState);
 
         Intent aServiceIntent = Intents.buildCommunicationServiceIntent(getActivity());
+        // use startService to not kill it on config changes like rotating the screen
+        getActivity().startService(aServiceIntent);
         getActivity().bindService(aServiceIntent, this, Context.BIND_AUTO_CREATE);
     }
 
@@ -267,6 +272,7 @@ public class ComputersFragment extends ListFragment implements ServiceConnection
         mIntentsReceiver = new IntentsReceiver(this);
         IntentFilter aIntentFilter = new IntentFilter();
         aIntentFilter.addAction(Intents.Actions.SERVERS_LIST_CHANGED);
+        aIntentFilter.addAction(Intents.Actions.BT_DISCOVERY_CHANGED);
 
         getBroadcastManager().registerReceiver(mIntentsReceiver, aIntentFilter);
     }
@@ -282,6 +288,8 @@ public class ComputersFragment extends ListFragment implements ServiceConnection
         public void onReceive(Context aContext, Intent aIntent) {
             if (Intents.Actions.SERVERS_LIST_CHANGED.equals(aIntent.getAction())) {
                 mComputersFragment.loadComputers();
+            } else if (Intents.Actions.BT_DISCOVERY_CHANGED.equals(aIntent.getAction())) {
+                ActivityCompat.invalidateOptionsMenu(mComputersFragment.getActivity());
             }
         }
     }
@@ -344,6 +352,12 @@ public class ComputersFragment extends ListFragment implements ServiceConnection
                 callComputerCreationActivity();
                 return true;
 
+            case R.id.menu_start_discovery:
+                if (BluetoothAdapter.getDefaultAdapter().startDiscovery()) {
+                    MenuItemCompat.setActionView(aMenuItem, R.layout.progress);
+                }
+                return true;
+
             default:
                 return super.onOptionsItemSelected(aMenuItem);
         }
@@ -415,6 +429,9 @@ public class ComputersFragment extends ListFragment implements ServiceConnection
     public void onDestroy() {
         super.onDestroy();
 
+        if(getActivity().isFinishing()) {
+            getActivity().stopService(Intents.buildCommunicationServiceIntent(getActivity()));
+        }
         getActivity().unbindService(this);
     }
 }
diff --git a/android/sdremote/src/org/libreoffice/impressremote/util/Intents.java b/android/sdremote/src/org/libreoffice/impressremote/util/Intents.java
index beab7ae..25f3c47 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/util/Intents.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/util/Intents.java
@@ -29,6 +29,7 @@ public final class Intents {
         }
 
         public static final String SERVERS_LIST_CHANGED = "SERVERS_LIST_CHANGED";
+        public static final String BT_DISCOVERY_CHANGED = "BT_DISCOVERY_CHANGED";
 
         public static final String PAIRING_SUCCESSFUL = "PAIRING_SUCCESSFUL";
         public static final String PAIRING_VALIDATION = "PAIRING_VALIDATION";


More information about the Libreoffice-commits mailing list