[Libreoffice-commits] .: android/sdremote

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Mon Sep 17 06:05:02 PDT 2012


 android/sdremote/AndroidManifest.xml                                                       |    4 
 android/sdremote/src/org/libreoffice/impressremote/ActivityChangeBroadcastProcessor.java   |   50 ++++++++++
 android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java                    |    9 +
 android/sdremote/src/org/libreoffice/impressremote/PresentationActivity.java               |   32 ++++++
 android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java                   |    7 +
 android/sdremote/src/org/libreoffice/impressremote/StartPresentationActivity.java          |   22 +++-
 android/sdremote/src/org/libreoffice/impressremote/communication/BluetoothClient.java      |    4 
 android/sdremote/src/org/libreoffice/impressremote/communication/Client.java               |    9 -
 android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java |   20 +++-
 android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java        |    5 -
 android/sdremote/src/org/libreoffice/impressremote/communication/Receiver.java             |   30 +++---
 11 files changed, 156 insertions(+), 36 deletions(-)

New commits:
commit f38715f7a8033d2258acc0d49da1a74951c8f1ad
Author: Andrzej J.R. Hunt <andrzej at ahunt.org>
Date:   Mon Sep 17 15:02:38 2012 +0200

    Modify and simplify activity starting and backstack usage.
    
    Change-Id: Ic4c4806ea3e791d0d75621e678166d0ffbbfa96a

diff --git a/android/sdremote/AndroidManifest.xml b/android/sdremote/AndroidManifest.xml
index 613e7d9..e60bc67 100644
--- a/android/sdremote/AndroidManifest.xml
+++ b/android/sdremote/AndroidManifest.xml
@@ -19,6 +19,7 @@
             android:name=".SelectorActivity"
             android:icon="@drawable/actionbar_icon_computer"
             android:label="@string/selector_choose_a_computer"
+            android:title="@string/app_name"
             android:uiOptions="splitActionBarWhenNarrow" >
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -28,7 +29,8 @@
         </activity>
         <activity
             android:name=".PairingActivity"
-            android:icon="@drawable/actionbar_icon_computer" >
+            android:icon="@drawable/actionbar_icon_computer"
+            android:noHistory="true" >
         </activity>
 
         <service android:name=".communication.CommunicationService" >
diff --git a/android/sdremote/src/org/libreoffice/impressremote/ActivityChangeBroadcastProcessor.java b/android/sdremote/src/org/libreoffice/impressremote/ActivityChangeBroadcastProcessor.java
new file mode 100644
index 0000000..4e0eb91
--- /dev/null
+++ b/android/sdremote/src/org/libreoffice/impressremote/ActivityChangeBroadcastProcessor.java
@@ -0,0 +1,50 @@
+package org.libreoffice.impressremote;
+
+import org.libreoffice.impressremote.communication.CommunicationService;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+
+/**
+ * This class is used to centralise the processing of Broadcasts concerning
+ * presentation/connection status changes which result in a change of activity.
+ *
+ * I.e. this will switch to the correct activity and correctly set up the
+ * activity backstack when switching activity.
+ *
+ * To use create this on activity startup, and pass messages from your
+ * BroadcastReceiver's onReceive.
+ *
+ */
+public class ActivityChangeBroadcastProcessor {
+
+    private Activity mActivity;
+
+    public ActivityChangeBroadcastProcessor(Activity aActivity) {
+        mActivity = aActivity;
+    }
+
+    public void addToFilter(IntentFilter aFilter) {
+        aFilter.addAction(CommunicationService.STATUS_CONNECTED_NOSLIDESHOW);
+        aFilter.addAction(CommunicationService.STATUS_CONNECTED_SLIDESHOW_RUNNING);
+    }
+
+    public void onReceive(Context aContext, Intent aIntent) {
+        if (aIntent.getAction().equals(
+                        CommunicationService.STATUS_CONNECTED_NOSLIDESHOW)) {
+            Intent nIntent = new Intent(mActivity,
+                            StartPresentationActivity.class);
+            nIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
+            mActivity.startActivity(nIntent);
+        } else if (aIntent
+                        .getAction()
+                        .equals(CommunicationService.STATUS_CONNECTED_SLIDESHOW_RUNNING)) {
+            Intent nIntent = new Intent(mActivity, PresentationActivity.class);
+            nIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
+            mActivity.startActivity(nIntent);
+        }
+    }
+
+}
diff --git a/android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java b/android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java
index 495aad4..9fcd13e 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/PairingActivity.java
@@ -29,18 +29,23 @@ import com.actionbarsherlock.app.SherlockActivity;
 public class PairingActivity extends SherlockActivity {
     private CommunicationService mCommunicationService;
     private TextView mPinText;
+    private ActivityChangeBroadcastProcessor mBroadcastProcessor;
 
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-
+        mBroadcastProcessor = new ActivityChangeBroadcastProcessor(this);
         bindService(new Intent(this, CommunicationService.class), mConnection,
                         Context.BIND_IMPORTANT);
 
         IntentFilter aFilter = new IntentFilter(
                         CommunicationService.MSG_PAIRING_STARTED);
         aFilter.addAction(CommunicationService.MSG_PAIRING_SUCCESSFUL);
+
+        mBroadcastProcessor = new ActivityChangeBroadcastProcessor(this);
+        mBroadcastProcessor.addToFilter(aFilter);
+
         LocalBroadcastManager.getInstance(this).registerReceiver(mListener,
                         aFilter);
 
@@ -106,7 +111,7 @@ public class PairingActivity extends SherlockActivity {
                                 StartPresentationActivity.class);
                 startActivity(nIntent);
             }
-
+            mBroadcastProcessor.onReceive(aContext, aIntent);
         }
     };
 
diff --git a/android/sdremote/src/org/libreoffice/impressremote/PresentationActivity.java b/android/sdremote/src/org/libreoffice/impressremote/PresentationActivity.java
index e877c64..a2765e4 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/PresentationActivity.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/PresentationActivity.java
@@ -8,9 +8,11 @@ import org.libreoffice.impressremote.communication.CommunicationService;
 import org.libreoffice.impressremote.communication.SlideShow.Timer;
 
 import android.app.AlertDialog;
+import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.ServiceConnection;
 import android.content.SharedPreferences;
 import android.os.Bundle;
@@ -19,6 +21,7 @@ import android.os.IBinder;
 import android.preference.PreferenceManager;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentTransaction;
+import android.support.v4.content.LocalBroadcastManager;
 import android.text.format.DateFormat;
 import android.util.AttributeSet;
 import android.view.KeyEvent;
@@ -41,14 +44,23 @@ public class PresentationActivity extends SherlockFragmentActivity {
     private ThumbnailFragment mThumbnailFragment;
     private PresentationFragment mPresentationFragment;
     private static ActionBarManager mActionBarManager;
+    private ActivityChangeBroadcastProcessor mBroadcastProcessor;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
+        mBroadcastProcessor = new ActivityChangeBroadcastProcessor(this);
+
         bindService(new Intent(this, CommunicationService.class), mConnection,
                         Context.BIND_IMPORTANT);
 
+        IntentFilter aFilter = new IntentFilter();
+        mBroadcastProcessor = new ActivityChangeBroadcastProcessor(this);
+        mBroadcastProcessor.addToFilter(aFilter);
+        LocalBroadcastManager.getInstance(this).registerReceiver(mListener,
+                        aFilter);
+
         //((FrameLayout) findViewById(R.id.framelayout)).addView(mLayout);
         setContentView(R.layout.activity_presentation);
         if (savedInstanceState == null) {
@@ -67,6 +79,18 @@ public class PresentationActivity extends SherlockFragmentActivity {
     }
 
     @Override
+    public void onBackPressed() {
+        if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
+            super.onBackPressed();
+            return;
+        }
+        Intent aIntent = new Intent(this, SelectorActivity.class);
+        aIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+        startActivity(aIntent);
+        mCommunicationService.disconnect();
+    }
+
+    @Override
     protected void onDestroy() {
         mActionBarManager.stop();
         unbindService(mConnection);
@@ -501,4 +525,12 @@ public class PresentationActivity extends SherlockFragmentActivity {
         }
 
     }
+
+    private BroadcastReceiver mListener = new BroadcastReceiver() {
+
+        @Override
+        public void onReceive(Context aContext, Intent aIntent) {
+            mBroadcastProcessor.onReceive(aContext, aIntent);
+        }
+    };
 }
diff --git a/android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java b/android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java
index ba692c3..b26d9ee 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/SelectorActivity.java
@@ -49,6 +49,7 @@ public class SelectorActivity extends SherlockActivity {
     private View mNetworkContainer;
     private LinearLayout mNetworkList;
     private TextView mNoServerLabel;
+    private ActivityChangeBroadcastProcessor mBroadcastProcessor;
 
     /** Called when the activity is first created. */
     @Override
@@ -58,6 +59,10 @@ public class SelectorActivity extends SherlockActivity {
 
         IntentFilter aFilter = new IntentFilter(
                         CommunicationService.MSG_SERVERLIST_CHANGED);
+
+        mBroadcastProcessor = new ActivityChangeBroadcastProcessor(this);
+        mBroadcastProcessor.addToFilter(aFilter);
+
         LocalBroadcastManager.getInstance(this).registerReceiver(mListener,
                         aFilter);
 
@@ -191,7 +196,9 @@ public class SelectorActivity extends SherlockActivity {
             if (aIntent.getAction().equals(
                             CommunicationService.MSG_SERVERLIST_CHANGED)) {
                 refreshLists();
+                return;
             }
+            mBroadcastProcessor.onReceive(aContext, aIntent);
 
         }
     };
diff --git a/android/sdremote/src/org/libreoffice/impressremote/StartPresentationActivity.java b/android/sdremote/src/org/libreoffice/impressremote/StartPresentationActivity.java
index 98026fd..43f0d14 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/StartPresentationActivity.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/StartPresentationActivity.java
@@ -19,11 +19,13 @@ import com.actionbarsherlock.app.SherlockActivity;
 public class StartPresentationActivity extends SherlockActivity {
     private CommunicationService mCommunicationService = null;
     private boolean mIsBound = false;
+    private ActivityChangeBroadcastProcessor mBroadcastProcessor;
 
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+
         setContentView(R.layout.activity_startpresentation);
         bindService(new Intent(this, CommunicationService.class), mConnection,
                         Context.BIND_IMPORTANT);
@@ -31,6 +33,10 @@ public class StartPresentationActivity extends SherlockActivity {
 
         IntentFilter aFilter = new IntentFilter(
                         CommunicationService.MSG_SLIDESHOW_STARTED);
+
+        mBroadcastProcessor = new ActivityChangeBroadcastProcessor(this);
+        mBroadcastProcessor.addToFilter(aFilter);
+
         LocalBroadcastManager.getInstance(this).registerReceiver(mListener,
                         aFilter);
 
@@ -39,6 +45,14 @@ public class StartPresentationActivity extends SherlockActivity {
     }
 
     @Override
+    public void onBackPressed() {
+        Intent aIntent = new Intent(this, SelectorActivity.class);
+        aIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+        startActivity(aIntent);
+        mCommunicationService.disconnect();
+    }
+
+    @Override
     protected void onDestroy() {
         super.onDestroy();
         unbindService(mConnection);
@@ -81,13 +95,7 @@ public class StartPresentationActivity extends SherlockActivity {
 
         @Override
         public void onReceive(Context aContext, Intent aIntent) {
-            if (aIntent.getAction().equals(
-                            CommunicationService.MSG_SLIDESHOW_STARTED)) {
-                Intent nIntent = new Intent(StartPresentationActivity.this,
-                                PresentationActivity.class);
-                startActivity(nIntent);
-            }
-
+            mBroadcastProcessor.onReceive(aContext, aIntent);
         }
     };
 }
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/BluetoothClient.java b/android/sdremote/src/org/libreoffice/impressremote/communication/BluetoothClient.java
index c495e4c..7406022 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/BluetoothClient.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/BluetoothClient.java
@@ -30,8 +30,8 @@ public class BluetoothClient extends Client {
 
     public BluetoothClient(Server aServer,
                     CommunicationService aCommunicationService,
-                    boolean aBluetoothWasEnabled) {
-        super(aServer, aCommunicationService);
+                    Receiver aReceiver, boolean aBluetoothWasEnabled) {
+        super(aServer, aCommunicationService, aReceiver);
         try {
             mAdapter = BluetoothAdapter.getDefaultAdapter();
             mBluetoothWasEnabled = aBluetoothWasEnabled;
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/Client.java b/android/sdremote/src/org/libreoffice/impressremote/communication/Client.java
index 148da4a..5e6a50b 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/Client.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/Client.java
@@ -45,14 +45,13 @@ public abstract class Client {
 
     protected CommunicationService mCommunicationService;
 
-    protected Client(Server aServer, CommunicationService aCommunicationService) {
+    protected Client(Server aServer,
+                    CommunicationService aCommunicationService,
+                    Receiver aReceiver) {
         mServer = aServer;
         mCommunicationService = aCommunicationService;
-        latestInstance = this;
-    }
-
-    public void setReceiver(Receiver aReceiver) {
         mReceiver = aReceiver;
+        latestInstance = this;
     }
 
     protected void startListening() {
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java b/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java
index 982dc7a..ff46f26 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/CommunicationService.java
@@ -73,7 +73,6 @@ public class CommunicationService extends Service implements Runnable {
             while (true) {
                 // Condition
                 try {
-
                     wait();
                 } catch (InterruptedException e) {
                     // We have finished
@@ -84,21 +83,23 @@ public class CommunicationService extends Service implements Runnable {
                     if ((mStateDesired == State.CONNECTED && mState == State.CONNECTED)
                                     || (mStateDesired == State.DISCONNECTED && mState == State.CONNECTED)) {
                         mClient.closeConnection();
+                        mClient = null;
                         mState = State.DISCONNECTED;
                     }
                     if (mStateDesired == State.CONNECTED) {
                         mState = State.CONNECTING;
                         switch (mServerDesired.getProtocol()) {
                         case NETWORK:
-                            mClient = new NetworkClient(mServerDesired, this);
+                            mClient = new NetworkClient(mServerDesired, this,
+                                            mReceiver);
                             break;
                         case BLUETOOTH:
                             mClient = new BluetoothClient(mServerDesired, this,
+                                            mReceiver,
                                             mBluetoothPreviouslyEnabled);
                             break;
                         }
                         mTransmitter = new Transmitter(mClient);
-                        mClient.setReceiver(mReceiver);
                         mState = State.CONNECTED;
                     }
                 }
@@ -178,6 +179,19 @@ public class CommunicationService extends Service implements Runnable {
     public static final String MSG_PAIRING_STARTED = "PAIRING_STARTED";
     public static final String MSG_PAIRING_SUCCESSFUL = "PAIRING_SUCCESSFUL";
 
+    /**
+     * Notify the UI that the service has connected to a server AND a slideshow
+     * is running.
+     * In this case the PresentationActivity should be started.
+     */
+    public static final String STATUS_CONNECTED_SLIDESHOW_RUNNING = "STATUS_CONNECTED_SLIDESHOW_RUNNING";
+    /**
+     * Notify the UI that the service has connected to a server AND no slideshow
+     * is running.
+     * In this case the StartPresentationActivity should be started.
+     */
+    public static final String STATUS_CONNECTED_NOSLIDESHOW = "STATUS_CONNECTED_NOSLIDESHOW";
+
     private Transmitter mTransmitter;
 
     private Client mClient;
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java b/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java
index c939613..24b6277 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/NetworkClient.java
@@ -32,8 +32,9 @@ public class NetworkClient extends Client {
     private Socket mSocket;
 
     public NetworkClient(Server aServer,
-                    CommunicationService aCommunicationService) {
-        super(aServer, aCommunicationService);
+                    CommunicationService aCommunicationService,
+                    Receiver aReceiver) {
+        super(aServer, aCommunicationService, aReceiver);
         try {
             mName = aServer.getName();
             mSocket = new Socket(aServer.getAddress(), PORT);
diff --git a/android/sdremote/src/org/libreoffice/impressremote/communication/Receiver.java b/android/sdremote/src/org/libreoffice/impressremote/communication/Receiver.java
index 955459c..c4a097e 100644
--- a/android/sdremote/src/org/libreoffice/impressremote/communication/Receiver.java
+++ b/android/sdremote/src/org/libreoffice/impressremote/communication/Receiver.java
@@ -10,9 +10,6 @@ package org.libreoffice.impressremote.communication;
 
 import java.util.ArrayList;
 
-import org.libreoffice.impressremote.PresentationActivity;
-import org.libreoffice.impressremote.StartPresentationActivity;
-
 import android.content.Context;
 import android.content.Intent;
 import android.support.v4.content.LocalBroadcastManager;
@@ -46,19 +43,24 @@ public class Receiver {
             int aCurrentSlide = Integer.parseInt(aCommand.get(2));
             mSlideShow.setLength(aSlideShowlength);
             mSlideShow.setCurrentSlide(aCurrentSlide);
-            //            Intent aIntent = new Intent(
-            //                            CommunicationService.MSG_SLIDESHOW_STARTED);
-            //            LocalBroadcastManager.getInstance(mContext).sendBroadcast(aIntent);
-            Intent aIntent = new Intent(mContext.getApplicationContext(),
-                            PresentationActivity.class);
-            aIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-            mContext.getApplicationContext().startActivity(aIntent);
+            //            Intent aIntent = new Intent(mContext.getApplicationContext(),
+            //                            PresentationActivity.class);
+            //            aIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            //            aIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
+            //            mContext.getApplicationContext().startActivity(aIntent);
+            Intent aIntent = new Intent(
+                            CommunicationService.STATUS_CONNECTED_SLIDESHOW_RUNNING);
+            LocalBroadcastManager.getInstance(mContext).sendBroadcast(aIntent);
         } else if (aInstruction.equals("slideshow_finished")) {
             mSlideShow = new SlideShow(mContext);
-            Intent aIntent = new Intent(mContext.getApplicationContext(),
-                            StartPresentationActivity.class);
-            aIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-            mContext.getApplicationContext().startActivity(aIntent);
+            //            Intent aIntent = new Intent(mContext.getApplicationContext(),
+            //                            StartPresentationActivity.class);
+            //            aIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            //            aIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
+            //            mContext.getApplicationContext().startActivity(aIntent);
+            Intent aIntent = new Intent(
+                            CommunicationService.STATUS_CONNECTED_NOSLIDESHOW);
+            LocalBroadcastManager.getInstance(mContext).sendBroadcast(aIntent);
         } else {
             if (mSlideShow == null)
                 return;


More information about the Libreoffice-commits mailing list