blob: 256f6af7e94e538ca6d44e251dd548a028a58543 [file] [log] [blame]
/*
* 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.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.telephony.CarrierConfigManager;
import android.os.IBinder;
import android.os.PersistableBundle;
import android.os.ServiceManager;
import android.os.SystemProperties;
import com.android.ims.internal.Logger;
/**
* Manages the CapabilityPolling class. Starts capability polling when a SIM card is inserted that
* supports RCS Presence Capability Polling and stops the service otherwise.
*/
public class PollingService extends Service {
private Logger logger = Logger.getLogger(this.getClass().getName());
private CapabilityPolling mCapabilityPolling = null;
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
switch (intent.getAction()) {
case CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED: {
checkAndUpdateCapabilityPollStatus();
break;
}
}
}
};
/**
* Constructor
*/
public PollingService() {
logger.debug("PollingService()");
}
@Override
public void onCreate() {
logger.debug("onCreate()");
registerBroadcastReceiver();
// Check when the service starts in case the SIM info has already been loaded.
checkAndUpdateCapabilityPollStatus();
}
/**
* Cleans up when the service is destroyed
*/
@Override
public void onDestroy() {
logger.debug("onDestroy()");
if (mCapabilityPolling != null) {
mCapabilityPolling.stop();
mCapabilityPolling = null;
}
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
logger.debug("onBind(), intent: " + intent);
if (!isRcsSupported(this)) {
return null;
}
logger.debug("onBind add services here");
return null;
}
private void registerBroadcastReceiver() {
IntentFilter filter = new IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
registerReceiver(mReceiver, filter);
}
private void checkAndUpdateCapabilityPollStatus() {
// If the carrier doesn't support RCS Presence, stop polling.
if (!isRcsSupportedByCarrier(this)) {
logger.info("RCS not supported by carrier. Stopping CapabilityPolling");
if (mCapabilityPolling != null) {
mCapabilityPolling.stop();
mCapabilityPolling = null;
}
return;
}
// Carrier supports, so start the service if it hasn't already been started.
if (mCapabilityPolling == null) {
logger.info("Starting CapabilityPolling...");
mCapabilityPolling = CapabilityPolling.getInstance(this);
mCapabilityPolling.start();
}
}
static boolean isRcsSupported(Context context) {
return isRcsSupportedByDevice() && isRcsSupportedByCarrier(context);
}
private static boolean isRcsSupportedByCarrier(Context context) {
CarrierConfigManager configManager = context.getSystemService(CarrierConfigManager.class);
if (configManager != null) {
PersistableBundle b = configManager.getConfig();
if (b != null) {
return b.getBoolean(CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL, false);
}
}
return true;
}
public static boolean isRcsSupportedByDevice() {
String rcsSupported = SystemProperties.get("persist.rcs.supported");
return "1".equals(rcsSupported);
}
}