Turn implicit RCS broadcast to startService instead

With background check enabled, RcsPresence.ACTION_PUBLISH_STATE_CHANGED
is no longer starting the PersistService in the RcsStackAdapter.
This change removes the receiver and instead launches the service
directly when the PersistService is needed.

Test: Manual
Bug: 35319937
Change-Id: I4395ce9b1baa2e23bb10208e0de4aedf11de5051
diff --git a/rcs/presencepolling/AndroidManifest.xml b/rcs/presencepolling/AndroidManifest.xml
index 8d69796..e4f5dfb 100644
--- a/rcs/presencepolling/AndroidManifest.xml
+++ b/rcs/presencepolling/AndroidManifest.xml
@@ -73,7 +73,6 @@
 
         <receiver android:name=".DeviceBoot" androidprv:systemUserOnly="true">
             <intent-filter android:priority="103">
-                 <action android:name="com.android.ims.ACTION_PUBLISH_STATUS_CHANGED"/>
                  <action android:name="android.intent.action.BOOT_COMPLETED"/>
             </intent-filter>
         </receiver>
@@ -94,14 +93,6 @@
             </intent-filter>
         </receiver>
 
-        <receiver android:name=".PresenceBroadcastReceiver"
-            androidprv:systemUserOnly="true"
-            android:permission="com.android.ims.permission.PRESENCE_ACCESS">
-             <intent-filter>
-                 <action android:name="com.android.ims.ACTION_PUBLISH_STATUS_CHANGED"/>
-             </intent-filter>
-        </receiver>
-
         <service android:name=".PersistService"
           android:exported="false"
           android:permission="com.android.ims.permission.PRESENCE_ACCESS">
diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/DeviceBoot.java b/rcs/presencepolling/src/com/android/service/ims/presence/DeviceBoot.java
index 7f7b438..ecab2e1 100644
--- a/rcs/presencepolling/src/com/android/service/ims/presence/DeviceBoot.java
+++ b/rcs/presencepolling/src/com/android/service/ims/presence/DeviceBoot.java
@@ -37,12 +37,11 @@
 import com.android.ims.internal.Logger;
 
 /**
- * Device boot event receiver: automatically starts the RCS service
+ * Device boot event receiver: automatically starts the RCS service. Registered
+ * to receive BOOT_COMPLETED actions.
  */
 public class DeviceBoot extends BroadcastReceiver {
-    /**
-     * The logger
-     */
+
     private Logger logger = Logger.getLogger("PresencePolling",
             this.getClass().getName());
 
@@ -54,14 +53,6 @@
         logger.debug("onReceive() in PresencePolling, intent: " +
                 intent + ", context: " + context);
 
-        String action = intent.getAction();
-        if (RcsPresence.ACTION_PUBLISH_STATE_CHANGED.equalsIgnoreCase(action)) {
-            int state = intent.getIntExtra(
-                    RcsPresence.EXTRA_PUBLISH_STATE,
-                    RcsPresence.PublishState.PUBLISH_STATE_NOT_PUBLISHED);
-            logger.debug("Publish state: " + state);
-        }
-
         if (!PollingService.isRcsSupported(context)) {
             return;
         }
diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/PresenceBroadcastReceiver.java b/rcs/presencepolling/src/com/android/service/ims/presence/PresenceBroadcastReceiver.java
deleted file mode 100644
index 6d716bd..0000000
--- a/rcs/presencepolling/src/com/android/service/ims/presence/PresenceBroadcastReceiver.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2015, Motorola Mobility LLC
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *     - Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     - Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in the
- *       documentation and/or other materials provided with the distribution.
- *     - Neither the name of Motorola Mobility nor the
- *       names of its contributors may be used to endorse or promote products
- *       derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MOTOROLA MOBILITY LLC BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-
-package com.android.service.ims.presence;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-
-import com.android.ims.RcsPresence;
-
-import com.android.ims.internal.Logger;
-
-public class PresenceBroadcastReceiver extends BroadcastReceiver {
-    private Logger logger = Logger.getLogger(this.getClass().getName());
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        logger.print("onReceive(), intent: " + intent +
-                ", context: " + context);
-
-        String action = intent.getAction();
-        if (RcsPresence.ACTION_PUBLISH_STATE_CHANGED.equals(action)) {
-            intent.setClass(context, PersistService.class);
-            context.startService(intent);
-        } else {
-            logger.debug("No interest in this intent: " + action);
-        }
-    }
-};
-
diff --git a/rcs/rcsservice/src/com/android/service/ims/RcsStackAdaptor.java b/rcs/rcsservice/src/com/android/service/ims/RcsStackAdaptor.java
index 450e692..151809f 100644
--- a/rcs/rcsservice/src/com/android/service/ims/RcsStackAdaptor.java
+++ b/rcs/rcsservice/src/com/android/service/ims/RcsStackAdaptor.java
@@ -85,6 +85,10 @@
 public class RcsStackAdaptor{
     private static final boolean DEBUG = true;
 
+    private static final String PERSIST_SERVICE_NAME =
+            "com.android.service.ims.presence.PersistService";
+    private static final String PERSIST_SERVICE_PACKAGE = "com.android.service.ims.presence";
+
     // The logger
     private Logger logger = Logger.getLogger(this.getClass().getName());
 
@@ -238,11 +242,12 @@
                 SystemProperties.set("rcs.publish.status",
                         String.valueOf(publishState));
 
-                // broadcast publish state change intent
                 Intent publishIntent = new Intent(RcsPresence.ACTION_PUBLISH_STATE_CHANGED);
-                publishIntent.putExtra(RcsPresence.EXTRA_PUBLISH_STATE,
-                        publishState);
+                publishIntent.putExtra(RcsPresence.EXTRA_PUBLISH_STATE, publishState);
+                // Start PersistService and broadcast to other receivers that are listening
+                // dynamically.
                 mContext.sendStickyBroadcast(publishIntent);
+                launchPersistService(publishIntent);
             }
 
             mPublishingState = publishState;
@@ -443,6 +448,13 @@
         return  ResultCode.SUCCESS;
     }
 
+    private void launchPersistService(Intent intent) {
+        ComponentName component = new ComponentName(PERSIST_SERVICE_PACKAGE,
+                PERSIST_SERVICE_NAME);
+        intent.setComponent(component);
+        mContext.startService(intent);
+    }
+
     private void createListeningThread() {
         HandlerThread listenerThread = new HandlerThread("Listener",
                 android.os.Process.THREAD_PRIORITY_BACKGROUND);