diff options
author | Pavel Zhamaitsiak <pavelz@google.com> | 2016-05-02 13:50:12 -0700 |
---|---|---|
committer | Pavel Zhamaitsiak <pavelz@google.com> | 2016-05-02 13:50:12 -0700 |
commit | 25a0b43d56dcd00711e41d06427eed2bc0ed3764 (patch) | |
tree | ca24934384450b7ea33da47ccfba9ea129d4aaf7 | |
parent | 26915f571175c8d84db6d1f2fdf54b5cb3f6926e (diff) | |
download | ims-25a0b43d56dcd00711e41d06427eed2bc0ed3764.tar.gz |
Move rcs from frameworks/opt/net/ims to external/imsnougat-dev
Bug: 27811089
Change-Id: Ie7f356121e97eaeef1b3951f3c8a3c9115f97eaa
67 files changed, 0 insertions, 15386 deletions
diff --git a/rcs/Android.mk b/rcs/Android.mk deleted file mode 100644 index 7f1f7eb9..00000000 --- a/rcs/Android.mk +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright 2013 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -LOCAL_PATH := $(call my-dir) - -include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/rcs/presencepolling/Android.mk b/rcs/presencepolling/Android.mk deleted file mode 100644 index f1f14713..00000000 --- a/rcs/presencepolling/Android.mk +++ /dev/null @@ -1,44 +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. - -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := $(call all-java-files-under, src) -LOCAL_SRC_FILES += $(call all-java-files-under, ../../provider/java) - -LOCAL_JAVA_LIBRARIES := com.android.ims.rcsmanager \ - ims-common \ - telephony-common - -LOCAL_REQUIRED_MODULES := com.android.ims.rcsmanager - -LOCAL_PACKAGE_NAME := PresencePolling -LOCAL_CERTIFICATE := platform -#LOCAL_MODULE_TAGS := optional - -include $(BUILD_PACKAGE) - diff --git a/rcs/presencepolling/AndroidManifest.xml b/rcs/presencepolling/AndroidManifest.xml deleted file mode 100644 index 12db21af..00000000 --- a/rcs/presencepolling/AndroidManifest.xml +++ /dev/null @@ -1,118 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="no"?> -<!-- - * 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. ---> - -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" - package="com.android.service.ims.presence" - android:sharedUserId="android.uid.phone" - coreApp="true"> - - <uses-sdk android:minSdkVersion="19"/> - - <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> - <uses-permission android:name="android.permission.BROADCAST_STICKY"/> - <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS"/> - <uses-permission android:name="android.permission.READ_CONTACTS"/> - <uses-permission android:name="android.permission.WRITE_CONTACTS"/> - <uses-permission android:name="android.permission.READ_PHONE_STATE"/> - <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"/> - <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> - <uses-permission android:name="android.permission.GET_ACCOUNTS" /> - <uses-permission android:name="com.android.rcs.eab.permission.READ_WRITE_EAB"/> - <uses-permission android:name="android.permission.READ_PROFILE"/> - <uses-permission android:name="com.android.ims.rcs.permission.STATUS_CHANGED"/> - <uses-permission android:name="com.android.ims.permission.PRESENCE_ACCESS"/> - - <application - android:label="@string/app_label" - android:singleUser="true" - android:process="com.android.ims.rcsservice"> - - <uses-library android:name="com.android.ims.rcsmanager" - android:required="true"/> - - <service - android:name=".PollingService" - android:excludeFromRecents="true" - android:singleUser="true" - android:permission="com.android.ims.permission.PRESENCE_ACCESS"> - </service> - - <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> - - <receiver android:name=".DeviceShutdown" androidprv:systemUserOnly="true"> - <intent-filter> - <action android:name="android.intent.action.ACTION_SHUTDOWN"/> - </intent-filter> - </receiver> - - <receiver android:name=".AlarmBroadcastReceiver" - androidprv:systemUserOnly="true" - android:permission="com.android.ims.permission.PRESENCE_ACCESS"> - <intent-filter> - <action android:name="com.android.service.ims.presence.periodical_capability_discovery"/> - <action android:name="com.android.service.ims.presence.capability_polling_retry"/> - <action android:name="android.provider.rcs.eab.EAB_NEW_CONTACT_INSERTED" /> - </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"> - <intent-filter> - <action android:name="com.android.ims.ACTION_PRESENCE_CHANGED"/> - </intent-filter> - </service> - - <service - android:name="com.android.service.ims.presence.EABService" - android:enabled="true"> - </service> - - <provider - android:name=".EABProvider" - android:permission="com.android.rcs.eab.permission.READ_WRITE_EAB" - android:exported="true" - android:enabled="true" - android:authorities="com.android.rcs.eab" /> - </application> -</manifest> diff --git a/rcs/presencepolling/res/values/config.xml b/rcs/presencepolling/res/values/config.xml deleted file mode 100644 index 5d083a7c..00000000 --- a/rcs/presencepolling/res/values/config.xml +++ /dev/null @@ -1,37 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - * 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. ---> - -<resources> - <!-- Capability cache expiration in x seconds, default is 90 days. --> - <integer name="capability_cache_expiration">7776000</integer> - - <!-- Periodical capability poll in x seconds, default is 7 days. --> - <integer name="capability_poll_interval">604800</integer> - -</resources> diff --git a/rcs/presencepolling/res/values/strings.xml b/rcs/presencepolling/res/values/strings.xml deleted file mode 100644 index 053aca0d..00000000 --- a/rcs/presencepolling/res/values/strings.xml +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - * 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. ---> - -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -<string name="app_label">Presence</string> -<string name="ims_presence_permission">Presence</string> -<string name="ims_ims_permission_desc">Allow the application to poll presence information.</string> - -<string translatable="false" name="video_calling_contact_group">Video calling</string> -<string translatable="false" name="account_pretty_name">Video calling</string> - -</resources> - diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/AccountUtil.java b/rcs/presencepolling/src/com/android/service/ims/presence/AccountUtil.java deleted file mode 100644 index 0139f861..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/AccountUtil.java +++ /dev/null @@ -1,105 +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.accounts.Account; -import android.accounts.AccountManager; -import android.content.ContentResolver; -import android.content.Context; -import android.os.Bundle; -import android.provider.ContactsContract; -import com.android.ims.internal.Logger; - -public class AccountUtil { - private static Logger logger = Logger.getLogger("AccountUtil"); - - public static final String ACCOUNT_SETTING = "accountSetting"; - public static final String VTCALL_SETTING = "vtcall_enable"; // "vtCallSetting"; - public static final String PRESENCE_SETTING = "presence_enable";// "presenceSetting"; - public static final String ACCOUNT_TYPE = "com.android.rcs.eab.account"; - public static final String AUTHTOKEN_TYPE = "com.android.rcs.eab.account"; - public static final String ACCOUNT_NAME = " "; - - public static Account addRcsAccount(Context context) { - AccountManager mAccountManager = null; - mAccountManager = AccountManager.get(context); - Account[] vCallingAccounts = mAccountManager - .getAccountsByType(ACCOUNT_TYPE); - - if (vCallingAccounts.length == 0) { - logger.debug("Creating Video Calling Account"); - - Bundle bundle = new Bundle(); - bundle.putString("pretty_name", - context.getString(R.string.account_pretty_name)); - - Account vCallingAccount = new Account(ACCOUNT_NAME, ACCOUNT_TYPE); - if (!mAccountManager.addAccountExplicitly(vCallingAccount, null, - null)) { - logger.error("addRcsAccount() failed!"); - return null; - } - - ContentResolver.setIsSyncable(vCallingAccount, - ContactsContract.AUTHORITY, 0); - ContentResolver.setSyncAutomatically(vCallingAccount, - ContactsContract.AUTHORITY, false); - - logger.debug("Video Calling account created succesfuly"); - return vCallingAccount; - } else { - Account vCallingAccount = new Account(ACCOUNT_NAME, ACCOUNT_TYPE); - ContentResolver.setIsSyncable(vCallingAccount, - ContactsContract.AUTHORITY, 0); - - ContentResolver.setSyncAutomatically(vCallingAccount, - ContactsContract.AUTHORITY, false); - logger.debug("Video Calling Account already exists"); - return vCallingAccount; - } - } - - public static boolean removeRcsAccount(Context context) { - logger.debug("removeRcsAccount()"); - AccountManager mAccountManager = null; - boolean result = false; - mAccountManager = AccountManager.get(context); - Account[] vCallingAccounts = mAccountManager - .getAccountsByType(ACCOUNT_TYPE); - - if (vCallingAccounts.length == 0) { - logger.debug("Video Calling Account is not present. Do nothing."); - } else { - Account vCallingAccount = new Account(ACCOUNT_NAME, ACCOUNT_TYPE); - mAccountManager.removeAccount(vCallingAccount, null, null); - logger.debug("Video Calling Account removed."); - } - return result; - } -} diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/AlarmBroadcastReceiver.java b/rcs/presencepolling/src/com/android/service/ims/presence/AlarmBroadcastReceiver.java deleted file mode 100644 index 1e5c0ef9..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/AlarmBroadcastReceiver.java +++ /dev/null @@ -1,78 +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.internal.Logger; -import com.android.service.ims.presence.Contacts; - -public class AlarmBroadcastReceiver extends BroadcastReceiver { - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private static final String ACTION_PERIODICAL_DISCOVERY_ALARM = - CapabilityPolling.ACTION_PERIODICAL_DISCOVERY_ALARM; - private static final String ACTION_POLLING_RETRY_ALARM = - PollingTask.ACTION_POLLING_RETRY_ALARM; - private static final String ACTION_EAB_NEW_CONTACT_INSERTED = - Contacts.ACTION_NEW_CONTACT_INSERTED; - - @Override - public void onReceive(Context context, Intent intent) { - logger.info("onReceive(), intent: " + intent + - ", context: " + context); - - String action = intent.getAction(); - if (ACTION_PERIODICAL_DISCOVERY_ALARM.equals(action)) { - CapabilityPolling capabilityPolling = CapabilityPolling.getInstance(null); - if (capabilityPolling != null) { - int pollingType = intent.getIntExtra("pollingType", - CapabilityPolling.ACTION_POLLING_NORMAL); - capabilityPolling.enqueueDiscovery(pollingType); - } - } else if (ACTION_POLLING_RETRY_ALARM.equals(action)) { - PollingsQueue queue = PollingsQueue.getInstance(null); - if (queue != null) { - long id = intent.getLongExtra("pollingTaskId", -1); - queue.retry(id); - } - } else if (ACTION_EAB_NEW_CONTACT_INSERTED.equals(action)) { - CapabilityPolling capabilityPolling = CapabilityPolling.getInstance(null); - if (capabilityPolling != null) { - String number = intent.getStringExtra(Contacts.NEW_PHONE_NUMBER); - capabilityPolling.enqueueNewContact(number); - } - } else { - logger.debug("No interest in this intent: " + action); - } - } -}; - diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/CapabilityPolling.java b/rcs/presencepolling/src/com/android/service/ims/presence/CapabilityPolling.java deleted file mode 100644 index 5d3e12f5..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/CapabilityPolling.java +++ /dev/null @@ -1,845 +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.app.AlarmManager; -import android.app.PendingIntent; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.database.Cursor; -import android.net.Uri; -import android.os.Handler; -import android.os.HandlerThread; -import android.os.Message; -import android.os.Process; -import android.os.SystemClock; -import android.telephony.PhoneNumberUtils; -import android.telephony.SubscriptionManager; -import android.telephony.TelephonyManager; -import android.text.format.Time; -import android.text.TextUtils; -import android.content.ComponentName; - -import com.android.ims.ImsConfig; -import com.android.ims.ImsException; -import com.android.ims.ImsManager; -import com.android.internal.telephony.IccCardConstants; -import com.android.internal.telephony.TelephonyIntents; - -import com.android.ims.RcsException; -import com.android.ims.RcsManager; -import com.android.ims.RcsManager.ResultCode; -import com.android.ims.RcsPresence; -import com.android.ims.RcsPresence.PublishState; -import com.android.ims.RcsPresenceInfo; -import com.android.ims.internal.ContactNumberUtils; -import com.android.ims.internal.Logger; - -import java.util.ArrayList; -import java.util.List; - -public class CapabilityPolling { - private Logger logger = Logger.getLogger(this.getClass().getName()); - private final Context mContext; - - public static final String ACTION_PERIODICAL_DISCOVERY_ALARM = - "com.android.service.ims.presence.periodical_capability_discovery"; - private PendingIntent mDiscoveryAlarmIntent = null; - - public static final int ACTION_POLLING_NORMAL = 0; - public static final int ACTION_POLLING_NEW_CONTACTS = 1; - - private long mCapabilityPollInterval = 604800000L; - private long mMinCapabilityPollInterval = 60480000L; - private long mCapabilityCacheExpiration = 7776000000L; - private long mNextPollingTimeStamp = 0L; - private final Object mScheduleSyncObj = new Object(); - - private boolean mInitialized = false; - private AlarmManager mAlarmManager = null; - private EABContactManager mEABContactManager = null; - private boolean mStackAvailable = false; - private int mPublished = -1; - private int mProvisioned = -1; - - private HandlerThread mDiscoveryThread; - private Handler mDiscoveryHandler; - - private final BroadcastReceiver mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - logger.info("onReceive(), intent: " + intent + - ", context: " + context); - - String action = intent.getAction(); - if (RcsManager.ACTION_RCS_SERVICE_AVAILABLE.equals(action)) { - enqueueServiceStatusChanged(true); - } else if (RcsManager.ACTION_RCS_SERVICE_UNAVAILABLE.equals(action)) { - enqueueServiceStatusChanged(false); - } else if (RcsManager.ACTION_RCS_SERVICE_DIED.equals(action)) { - logger.warn("No handler for this intent: " + action); - } else if (RcsPresence.ACTION_PUBLISH_STATE_CHANGED.equals(action)) { - int state = intent.getIntExtra( - RcsPresence.EXTRA_PUBLISH_STATE, - RcsPresence.PublishState.PUBLISH_STATE_NOT_PUBLISHED); - enqueuePublishStateChanged(state); - } else if (ImsConfig.ACTION_IMS_CONFIG_CHANGED.equals(action)) { - int item = intent.getIntExtra(ImsConfig.EXTRA_CHANGED_ITEM, -1); - if ((ImsConfig.ConfigConstants.CAPABILITIES_POLL_INTERVAL == item) || - (ImsConfig.ConfigConstants.CAPABILITIES_CACHE_EXPIRATION == item)) { - enqueueSettingsChanged(); - } - } else if(TelephonyIntents.ACTION_SIM_STATE_CHANGED.equalsIgnoreCase(action)) { - String stateExtra = intent.getStringExtra( - IccCardConstants.INTENT_KEY_ICC_STATE); - logger.print("SIM_STATE_CHANGED: " + stateExtra); - if (IccCardConstants.INTENT_VALUE_ICC_LOADED.equalsIgnoreCase(stateExtra)) { - enqueueSimLoaded(); - } - } else { - logger.debug("No interest in this intent: " + action); - } - } - }; - - private static CapabilityPolling sInstance = null; - public static synchronized CapabilityPolling getInstance(Context context) { - if ((sInstance == null) && (context != null)) { - sInstance = new CapabilityPolling(context); - } - - return sInstance; - } - - private CapabilityPolling(Context context) { - mContext = context; - - ContactNumberUtils.getDefault().setContext(mContext); - PresencePreferences.getInstance().setContext(mContext); - - mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); - mEABContactManager = new EABContactManager(mContext.getContentResolver(), - mContext.getPackageName()); - - setRcsTestMode(PresencePreferences.getInstance().getRcsTestMode()); - logger.debug("CapabilityPolling is created."); - } - - public void setRcsTestMode(boolean test) { - logger.setRcsTestMode(test); - - PresencePreferences pref = PresencePreferences.getInstance(); - if (pref != null) { - if (pref.getRcsTestMode() != test) { - pref.setRcsTestMode(test); - } - } - } - - private void initialise() { - if (mInitialized) { - return; - } - - PresenceSetting.init(mContext); - long capabilityPollInterval = PresenceSetting.getCapabilityPollInterval(); - logger.print("getCapabilityPollInterval: " + capabilityPollInterval); - if (capabilityPollInterval == -1) { - capabilityPollInterval = mContext.getResources().getInteger( - R.integer.capability_poll_interval); - } - if (capabilityPollInterval < 10) { - capabilityPollInterval = 10; - } - - long capabilityCacheExpiration = PresenceSetting.getCapabilityCacheExpiration(); - logger.print("getCapabilityCacheExpiration: " + capabilityCacheExpiration); - if (capabilityCacheExpiration == -1) { - capabilityCacheExpiration = mContext.getResources().getInteger( - R.integer.capability_cache_expiration); - } - if (capabilityCacheExpiration < 10) { - capabilityCacheExpiration = 10; - } - - int publishTimer = PresenceSetting.getPublishTimer(); - logger.print("getPublishTimer: " + publishTimer); - int publishTimerExtended = PresenceSetting.getPublishTimerExtended(); - logger.print("getPublishTimerExtended: " + publishTimerExtended); - int maxEntriesInRequest = PresenceSetting.getMaxNumberOfEntriesInRequestContainedList(); - logger.print("getMaxNumberOfEntriesInRequestContainedList: " + maxEntriesInRequest); - if ((capabilityPollInterval <= 30 * 60) || // default: 7 days - (capabilityCacheExpiration <= 60 * 60) || // default: 90 days - (maxEntriesInRequest <= 20) || // default: 100 - (publishTimer <= 10 * 60) || // default: 20 minutes - (publishTimerExtended <= 20 * 60)) { // default: 1 day - setRcsTestMode(true); - } - - if (capabilityCacheExpiration < capabilityPollInterval) { - capabilityPollInterval = capabilityCacheExpiration; - } - - mCapabilityPollInterval = capabilityPollInterval * 1000; - mMinCapabilityPollInterval = mCapabilityPollInterval / 10; - logger.info("mCapabilityPollInterval: " + mCapabilityPollInterval + - ", mMinCapabilityPollInterval: " + mMinCapabilityPollInterval); - - mCapabilityCacheExpiration = capabilityCacheExpiration * 1000; - logger.info("mCapabilityCacheExpiration: " + mCapabilityCacheExpiration); - - mInitialized = true; - } - - public void start() { - mDiscoveryThread = new HandlerThread("Presence-DiscoveryThread"); - mDiscoveryThread.start(); - mDiscoveryHandler = new Handler(mDiscoveryThread.getLooper(), mDiscoveryCallback); - - registerForBroadcasts(); - - if (isPollingReady()) { - schedulePolling(5 * 1000, ACTION_POLLING_NORMAL); - } - } - - public void stop() { - cancelDiscoveryAlarm(); - clearPollingTasks(); - mContext.unregisterReceiver(mReceiver); - mDiscoveryThread.quit(); - } - - private void registerForBroadcasts() { - IntentFilter intentFilter = new IntentFilter(); - intentFilter.addAction(RcsManager.ACTION_RCS_SERVICE_AVAILABLE); - intentFilter.addAction(RcsManager.ACTION_RCS_SERVICE_UNAVAILABLE); - intentFilter.addAction(RcsManager.ACTION_RCS_SERVICE_DIED); - intentFilter.addAction(RcsPresence.ACTION_PUBLISH_STATE_CHANGED); - intentFilter.addAction(ImsConfig.ACTION_IMS_CONFIG_CHANGED); - intentFilter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED); - mContext.registerReceiver(mReceiver, intentFilter); - } - - private boolean isPollingReady() { - if (mPublished == -1) { - RcsManager rcsManager = RcsManager.getInstance(mContext, 0); - if (rcsManager != null) { - mStackAvailable = rcsManager.isRcsServiceAvailable(); - logger.print("isPollingReady, mStackAvailable: " + mStackAvailable); - try { - RcsPresence rcsPresence = rcsManager.getRcsPresenceInterface(); - if (rcsPresence != null) { - int state = rcsPresence.getPublishState(); - mPublished = (PublishState.PUBLISH_STATE_200_OK == state) ? 1 : 0; - logger.print("isPollingReady, mPublished: " + mPublished); - } - } catch (RcsException ex) { - logger.warn("RcsPresence.getPublishState failed, exception: " + ex); - mPublished = -1; - } - } - } - - if (mProvisioned == -1) { - ImsManager imsManager = ImsManager.getInstance(mContext, - SubscriptionManager.getDefaultVoicePhoneId()); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - mProvisioned = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.EAB_SETTING_ENABLED); - logger.print("isPollingReady, mProvisioned: " + mProvisioned); - } - } catch (ImsException ex) { - logger.warn("ImsConfig.getEabProvisioned failed, exception: " + ex); - mProvisioned = -1; - } - } - } - - return mStackAvailable && (mPublished == 1) && (mProvisioned == 1); - } - - private void serviceStatusChanged(boolean enabled) { - logger.print("Enter serviceStatusChanged: " + enabled); - mStackAvailable = enabled; - - if (isPollingReady()) { - schedulePolling(0, ACTION_POLLING_NORMAL); - } else { - cancelDiscoveryAlarm(); - clearPollingTasks(); - } - } - - private void publishStateChanged(int state) { - logger.print("Enter publishStateChanged: " + state); - mPublished = (PublishState.PUBLISH_STATE_200_OK == state) ? 1 : 0; - if (mPublished == 1) { - PresencePreferences pref = PresencePreferences.getInstance(); - if (pref != null) { - String mdn_old = pref.getLine1Number(); - String subscriberId_old = pref.getSubscriberId(); - if (TextUtils.isEmpty(mdn_old) && TextUtils.isEmpty(subscriberId_old)) { - String mdn = getLine1Number(); - pref.setLine1Number(mdn); - String subscriberId = getSubscriberId(); - pref.setSubscriberId(subscriberId); - } - } - } - - if (isPollingReady()) { - schedulePolling(0, ACTION_POLLING_NORMAL); - } else { - cancelDiscoveryAlarm(); - clearPollingTasks(); - } - } - - private void provisionStateChanged() { - ImsManager imsManager = ImsManager.getInstance(mContext, - SubscriptionManager.getDefaultVoicePhoneId()); - if (imsManager == null) { - return; - } - - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig == null) { - return; - } - boolean volteProvision = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.VLT_SETTING_ENABLED) - == ImsConfig.FeatureValueConstants.ON; - boolean vtProvision = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.LVC_SETTING_ENABLED) - == ImsConfig.FeatureValueConstants.ON; - boolean eabProvision = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.EAB_SETTING_ENABLED) - == ImsConfig.FeatureValueConstants.ON; - logger.print("Provision state changed, VolteProvision: " - + volteProvision + ", vtProvision: " + vtProvision - + ", eabProvision: " + eabProvision); - - if ((mProvisioned == 1) && !eabProvision) { - logger.print("EAB Provision is disabled, clear all capabilities!"); - if (mEABContactManager != null) { - mEABContactManager.updateAllCapabilityToUnknown(); - } - } - mProvisioned = eabProvision ? 1 : 0; - } catch (ImsException ex) { - logger.warn("ImsConfig.getEabProvisioned failed, exception: " + ex); - mProvisioned = -1; - return; - } - - if (isPollingReady()) { - schedulePolling(0, ACTION_POLLING_NORMAL); - } else { - cancelDiscoveryAlarm(); - clearPollingTasks(); - } - } - - private void settingsChanged() { - logger.print("Enter settingsChanged."); - cancelDiscoveryAlarm(); - clearPollingTasks(); - mInitialized = false; - - if (isPollingReady()) { - schedulePolling(0, ACTION_POLLING_NORMAL); - } - } - - private void newContactAdded(String number) { - logger.print("Enter newContactAdded: " + number); - if (TextUtils.isEmpty(number)) { - return; - } - - EABContactManager.Request request = new EABContactManager.Request(number) - .setLastUpdatedTimeStamp(0); - int result = mEABContactManager.update(request); - if (result <= 0) { - return; - } - - if (isPollingReady()) { - schedulePolling(5 * 1000, ACTION_POLLING_NEW_CONTACTS); - } - } - - private void verifyPollingResult(int counts) { - if (isPollingReady()) { - PresencePreferences pref = PresencePreferences.getInstance(); - if ((pref != null) && pref.getRcsTestMode()) { - counts = 1; - } - long lm = (long)(1 << (counts - 1)); - schedulePolling(30 * 1000 * lm, ACTION_POLLING_NORMAL); - } - } - - public synchronized void schedulePolling(long msec, int type) { - logger.print("schedulePolling msec=" + msec + " type=" + type); - if (!isPollingReady()) { - logger.debug("Cancel the polling since the network is not ready"); - return; - } - - if (type == ACTION_POLLING_NEW_CONTACTS) { - cancelDiscoveryAlarm(); - } - - if (mNextPollingTimeStamp != 0L) { - long scheduled = mNextPollingTimeStamp - System.currentTimeMillis(); - if ((scheduled > 0) && (scheduled < msec)) { - logger.print("There has been a discovery scheduled at " - + getTimeString(mNextPollingTimeStamp)); - return; - } - } - - long nextTime = System.currentTimeMillis() + msec; - logger.print("A new discovery needs to be started in " + - (msec / 1000) + " seconds at " - + getTimeString(nextTime)); - - cancelDiscoveryAlarm(); - - if (msec <= 0) { - enqueueDiscovery(type); - return; - } - - Intent intent = new Intent(ACTION_PERIODICAL_DISCOVERY_ALARM); - intent.setClass(mContext, AlarmBroadcastReceiver.class); - intent.putExtra("pollingType", type); - - mDiscoveryAlarmIntent = PendingIntent.getBroadcast(mContext, 0, intent, - PendingIntent.FLAG_UPDATE_CURRENT); - mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, - SystemClock.elapsedRealtime() + msec, mDiscoveryAlarmIntent); - - mNextPollingTimeStamp = nextTime; - } - - private synchronized void doCapabilityDiscovery(int type) { - logger.print("doCapabilityDiscovery type=" + type); - if (!isPollingReady()) { - logger.debug("doCapabilityDiscovery isPollingReady=false"); - return; - } - - long delay = 0; - List<Contacts.Item> list = null; - - initialise(); - - mNextPollingTimeStamp = 0L; - Cursor cursor = null; - EABContactManager.Query baseQuery = new EABContactManager.Query() - .orderBy(EABContactManager.COLUMN_LAST_UPDATED_TIMESTAMP, - EABContactManager.Query.ORDER_ASCENDING); - try { - logger.debug("doCapabilityDiscovery.query:\n" + baseQuery); - cursor = mEABContactManager.query(baseQuery); - if (cursor == null) { - logger.print("Cursor is null, there is no database found."); - return; - } - int count = cursor.getCount(); - if (count == 0) { - logger.print("Cursor.getCount() is 0, there is no items found in db."); - return; - } - - list = new ArrayList<Contacts.Item>(); - list.clear(); - - long current = System.currentTimeMillis(); - for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { - long id = cursor.getLong(cursor.getColumnIndex(Contacts.Impl._ID)); - long last = cursor.getLong(cursor.getColumnIndex( - Contacts.Impl.CONTACT_LAST_UPDATED_TIMESTAMP)); - - Contacts.Item item = new Contacts.Item(id); - item.setLastUpdateTime(last); - item.setNumber(cursor.getString( - cursor.getColumnIndex(Contacts.Impl.CONTACT_NUMBER))); - item.setName(cursor.getString( - cursor.getColumnIndex(Contacts.Impl.CONTACT_NAME))); - item.setVolteTimestamp(cursor.getLong( - cursor.getColumnIndex(Contacts.Impl.VOLTE_CALL_CAPABILITY_TIMESTAMP))); - item.setVideoTimestamp(cursor.getLong( - cursor.getColumnIndex(Contacts.Impl.VIDEO_CALL_CAPABILITY_TIMESTAMP))); - - if ((current - last < 0) || - (current - last >= mCapabilityPollInterval - mMinCapabilityPollInterval)) { - logger.print("This item will be updated:\n" - + item); - if (item.isValid()) { - list.add(item); - } - } else { - logger.print("The first item which will be updated next time:\n" + item); - delay = randomCapabilityPollInterval() - (current - last); - if (delay > 0) { - break; - } - } - } - } catch (Exception ex) { - logger.warn("Exception in doCapabilityDiscovery: " + ex); - if (delay <= 0) { - delay = 5 * 60 * 1000; - } - } finally { - if (cursor != null) { - cursor.close(); - } - } - - if (delay <= 0) { - delay = randomCapabilityPollInterval(); - } - logger.print("Polling delay: " + delay); - schedulePolling(delay, ACTION_POLLING_NORMAL); - - updateObsoleteItems(); - - if ((list != null) && (list.size() > 0)) { - PollingsQueue queue = PollingsQueue.getInstance(mContext); - if (queue != null) { - queue.setCapabilityPolling(this); - queue.add(type, list); - } - } - } - - private long randomCapabilityPollInterval() { - double random = Math.random() * 0.2 + 0.9; - logger.print("The random for this time polling is: " + random); - random = random * mCapabilityPollInterval; - return (long)random; - } - - private void updateObsoleteItems() { - long current = System.currentTimeMillis(); - long last = current - mCapabilityCacheExpiration; - long last3year = current - 3 * 365 * 24 * 3600000L; - StringBuilder sb = new StringBuilder(); - sb.append("(("); - sb.append(Contacts.Impl.VOLTE_CALL_CAPABILITY_TIMESTAMP + "<='" + last + "'"); - sb.append(" OR "); - sb.append(Contacts.Impl.VIDEO_CALL_CAPABILITY_TIMESTAMP + "<='" + last + "'"); - sb.append(") AND "); - sb.append(Contacts.Impl.CONTACT_LAST_UPDATED_TIMESTAMP + ">='" + last3year + "'"); - sb.append(")"); - EABContactManager.Query baseQuery = new EABContactManager.Query() - .setFilterByTime(sb.toString()) - .orderBy(EABContactManager.COLUMN_ID, - EABContactManager.Query.ORDER_ASCENDING); - - Cursor cursor = null; - List<Contacts.Item> list = null; - try { - logger.debug("updateObsoleteItems.query:\n" + baseQuery); - cursor = mEABContactManager.query(baseQuery); - if (cursor == null) { - logger.print("Cursor is null, there is no database found."); - return; - } - int count = cursor.getCount(); - if (count == 0) { - logger.print("Cursor.getCount() is 0, there is no obsolete items found."); - return; - } - - list = new ArrayList<Contacts.Item>(); - list.clear(); - - for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { - long id = cursor.getLong(cursor.getColumnIndex(Contacts.Impl._ID)); - - Contacts.Item item = new Contacts.Item(id); - item.setLastUpdateTime(cursor.getLong( - cursor.getColumnIndex(Contacts.Impl.CONTACT_LAST_UPDATED_TIMESTAMP))); - item.setNumber(cursor.getString( - cursor.getColumnIndex(Contacts.Impl.CONTACT_NUMBER))); - item.setName(cursor.getString( - cursor.getColumnIndex(Contacts.Impl.CONTACT_NAME))); - item.setVolteTimestamp(cursor.getLong( - cursor.getColumnIndex(Contacts.Impl.VOLTE_CALL_CAPABILITY_TIMESTAMP))); - item.setVideoTimestamp(cursor.getLong( - cursor.getColumnIndex(Contacts.Impl.VIDEO_CALL_CAPABILITY_TIMESTAMP))); - logger.print("updateObsoleteItems, the obsolete item:\n" + item); - - if ((item.lastUpdateTime() > 0) && item.isValid()) { - list.add(item); - } - } - } catch (Exception ex) { - logger.warn("Exception in updateObsoleteItems: " + ex); - } finally { - if (cursor != null) { - cursor.close(); - } - } - - if ((list == null) || (list.size() <= 0)) { - return; - } - - for (Contacts.Item item : list) { - EABContactManager.Request request = new EABContactManager.Request(item.id()); - if (item.volteTimestamp() <= last) { - request.setVolteCallCapability(false); - request.setVolteCallCapabilityTimeStamp(current); - } - if (item.videoTimestamp() <= last) { - request.setVideoCallCapability(false); - request.setVideoCallCapabilityTimeStamp(current); - } - int result = mEABContactManager.update(request); - if (result <= 0) { - logger.print("Failed to update this request: " + request); - } - } - } - - private void cancelDiscoveryAlarm() { - if (mDiscoveryAlarmIntent != null) { - mAlarmManager.cancel(mDiscoveryAlarmIntent); - mDiscoveryAlarmIntent = null; - mNextPollingTimeStamp = 0L; - } - } - - private void clearPollingTasks() { - PollingsQueue queue = PollingsQueue.getInstance(null); - if (queue != null) { - queue.clear(); - } - } - - private String getTimeString(long time) { - if (time <= 0) { - time = System.currentTimeMillis(); - } - - Time tobj = new Time(); - tobj.set(time); - return String.format("%s.%s", tobj.format("%m-%d %H:%M:%S"), time % 1000); - } - - private static final int MSG_CHECK_DISCOVERY = 1; - private static final int MSG_NEW_CONTACT_ADDED = 2; - private static final int MSG_SERVICE_STATUS_CHANGED = 3; - private static final int MSG_SETTINGS_CHANGED = 4; - private static final int MSG_PUBLISH_STATE_CHANGED = 5; - private static final int MSG_SIM_LOADED = 6; - private static final int MSG_PROVISION_STATE_CHANGED = 7; - private static final int MSG_VERIFY_POLLING_RESULT = 8; - - public void enqueueDiscovery(int type) { - mDiscoveryHandler.removeMessages(MSG_CHECK_DISCOVERY); - mDiscoveryHandler.obtainMessage(MSG_CHECK_DISCOVERY, type, -1).sendToTarget(); - } - - public void enqueueNewContact(String number) { - mDiscoveryHandler.obtainMessage(MSG_NEW_CONTACT_ADDED, number).sendToTarget(); - } - - private void enqueueServiceStatusChanged(boolean enabled) { - mDiscoveryHandler.removeMessages(MSG_SERVICE_STATUS_CHANGED); - mDiscoveryHandler.obtainMessage(MSG_SERVICE_STATUS_CHANGED, - enabled ? 1 : 0, -1).sendToTarget(); - } - - private void enqueuePublishStateChanged(int state) { - mDiscoveryHandler.removeMessages(MSG_PUBLISH_STATE_CHANGED); - mDiscoveryHandler.obtainMessage(MSG_PUBLISH_STATE_CHANGED, - state, -1).sendToTarget(); - } - - public void enqueueSettingsChanged() { - mDiscoveryHandler.removeMessages(MSG_SETTINGS_CHANGED); - mDiscoveryHandler.obtainMessage(MSG_SETTINGS_CHANGED).sendToTarget(); - } - - private void enqueueSimLoaded() { - mDiscoveryHandler.removeMessages(MSG_SIM_LOADED); - mDiscoveryHandler.obtainMessage(MSG_SIM_LOADED).sendToTarget(); - } - - private void enqueueProvisionStateChanged() { - mDiscoveryHandler.removeMessages(MSG_PROVISION_STATE_CHANGED); - mDiscoveryHandler.obtainMessage(MSG_PROVISION_STATE_CHANGED).sendToTarget(); - } - - public void enqueueVerifyPollingResult(int counts) { - mDiscoveryHandler.removeMessages(MSG_VERIFY_POLLING_RESULT); - mDiscoveryHandler.obtainMessage(MSG_VERIFY_POLLING_RESULT, counts, -1).sendToTarget(); - } - - private Handler.Callback mDiscoveryCallback = new Handler.Callback() { - @Override - public boolean handleMessage(Message msg) { - Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); - - if (msg.what == MSG_CHECK_DISCOVERY) { - doCapabilityDiscovery(msg.arg1); - } else if (msg.what == MSG_NEW_CONTACT_ADDED) { - newContactAdded((String)msg.obj); - } else if (msg.what == MSG_SERVICE_STATUS_CHANGED) { - serviceStatusChanged(msg.arg1 == 1); - } else if (msg.what == MSG_PUBLISH_STATE_CHANGED) { - publishStateChanged(msg.arg1); - } else if (msg.what == MSG_SETTINGS_CHANGED) { - settingsChanged(); - } else if(msg.what == MSG_SIM_LOADED) { - onSimLoaded(); - } else if(msg.what == MSG_PROVISION_STATE_CHANGED) { - provisionStateChanged(); - } else if(msg.what == MSG_VERIFY_POLLING_RESULT) { - verifyPollingResult(msg.arg1); - } else { - } - - return true; - } - }; - - private void onSimLoaded() { - PresencePreferences pref = PresencePreferences.getInstance(); - if (pref == null) { - return; - } - - String mdn_old = pref.getLine1Number(); - if (TextUtils.isEmpty(mdn_old)) { - return; - } - String subscriberId_old = pref.getSubscriberId(); - if (TextUtils.isEmpty(subscriberId_old)) { - return; - } - - String mdn = getLine1Number(); - String subscriberId = getSubscriberId(); - if (TextUtils.isEmpty(mdn) && TextUtils.isEmpty(subscriberId)) { - return; - } - - boolean mdnMatched = false; - if (TextUtils.isEmpty(mdn) || PhoneNumberUtils.compare(mdn_old, mdn)) { - mdnMatched = true; - } - boolean subscriberIdMatched = false; - if (TextUtils.isEmpty(subscriberId) || subscriberId.equals(subscriberId_old)) { - subscriberIdMatched = true; - } - if (mdnMatched && subscriberIdMatched) { - return; - } - - logger.print("Remove presence cache for Sim card changed!"); - pref.setLine1Number(""); - pref.setSubscriberId(""); - - if (mEABContactManager != null) { - mEABContactManager.updateAllCapabilityToUnknown(); - } - } - - private static final int DEFAULT_SUBSCRIPTION = 1; - private String getLine1Number() { - if (mContext == null) { - return null; - } - - TelephonyManager telephony = (TelephonyManager) - mContext.getSystemService(Context.TELEPHONY_SERVICE); - if (telephony == null) { - return null; - } - - String mdn = null; - if (TelephonyManager.getDefault().isMultiSimEnabled()) { - int subId = SubscriptionManager.getDefaultDataSubscriptionId(); - if (!SubscriptionManager.isValidSubscriptionId(subId)) { - subId = DEFAULT_SUBSCRIPTION; - } - mdn = telephony.getLine1Number(subId); - } else { - mdn = telephony.getLine1Number(); - } - - if ((mdn == null) || (mdn.length() == 0) || mdn.startsWith("00000")) { - return null; - } - - logger.print("getLine1Number: " + mdn); - return mdn; - } - - private String getSubscriberId() { - if (mContext == null) { - return null; - } - - TelephonyManager telephony = (TelephonyManager) - mContext.getSystemService(Context.TELEPHONY_SERVICE); - if (telephony == null) { - return null; - } - - String subscriberId = null; - if (TelephonyManager.getDefault().isMultiSimEnabled()) { - int subId = SubscriptionManager.getDefaultDataSubscriptionId(); - if (!SubscriptionManager.isValidSubscriptionId(subId)) { - subId = DEFAULT_SUBSCRIPTION; - } - subscriberId = telephony.getSubscriberId(subId); - } else { - subscriberId = telephony.getSubscriberId(); - } - - logger.print("getSubscriberId: " + subscriberId); - return subscriberId; - } -} diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/ContactDbUtil.java b/rcs/presencepolling/src/com/android/service/ims/presence/ContactDbUtil.java deleted file mode 100644 index e4f4a218..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/ContactDbUtil.java +++ /dev/null @@ -1,220 +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.accounts.Account; -import android.content.ContentResolver; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.provider.ContactsContract.Groups; - -import android.provider.ContactsContract; -import android.provider.ContactsContract.CommonDataKinds.Phone; - -import com.android.ims.internal.EABContract; -import com.android.ims.internal.Logger; - -public class ContactDbUtil { - private static Logger logger = Logger.getLogger("ContactDbUtil"); - - public static void addVideoCallingContactGroup(Context context, Account vCallingAccount) { - logger.info("addVideoCallingContactGroup"); - ContentResolver contentResolver = context.getContentResolver(); - if (vCallingAccount == null) { - logger.error("vCallingAccount == null"); - return; - } - long videoCallingGroupId = 0; - final Cursor cursor = contentResolver.query(Groups.CONTENT_URI, - new String[] { Groups._ID }, - Groups.ACCOUNT_NAME + "=? AND " + Groups.ACCOUNT_TYPE + "=? AND " + - Groups.TITLE + "=?", - new String[] { AccountUtil.ACCOUNT_NAME, AccountUtil.ACCOUNT_TYPE, - context.getString(R.string.video_calling_contact_group) }, null); - if (cursor != null) { - try { - if (cursor.moveToFirst()) { - videoCallingGroupId = cursor.getLong(0); - } - } finally { - cursor.close(); - } - } - if (videoCallingGroupId == 0) { - logger.debug("addVideoCallingContactGroup, creating group"); - - // Video Calling group doesn't exist yet, so create it - final ContentValues contentValues = new ContentValues(); - contentValues.put(Groups.ACCOUNT_NAME, AccountUtil.ACCOUNT_NAME); - contentValues.put(Groups.ACCOUNT_TYPE, AccountUtil.ACCOUNT_TYPE); - contentValues.put(Groups.TITLE, context.getString(R.string.video_calling_contact_group)); - contentValues.put(Groups.GROUP_IS_READ_ONLY, 1); - contentValues.put(Groups.GROUP_VISIBLE, 1); - contentValues.put(Groups.SYSTEM_ID, "com.android.vt.eab"); - - final Uri newGroupUri = contentResolver.insert(Groups.CONTENT_URI, contentValues); - if (null != newGroupUri) { - videoCallingGroupId = ContentUris.parseId(newGroupUri); - } else { - logger.error("newGroupUri is null."); - } - } else { - logger.debug("addVideoCallingContactGroup, Video Calling Group, already exists!!!"); - - } - - logger.debug("videoCallingGroupId: " + videoCallingGroupId); - SharedPrefUtil.setVideoCallingGroupId(context, videoCallingGroupId); - } - - public static void removeVideoCallingContactGroup(Context context) { - logger.debug("removeVideoCallingContactGroup"); - long storedVideoCallingGroupId = SharedPrefUtil.getVideoCallingGroupId(context); - long videoCallingGroupId = 0; - ContentResolver contentResolver = context.getContentResolver(); - final Cursor cursor = contentResolver.query(Groups.CONTENT_URI, - new String[] { Groups._ID }, - Groups.ACCOUNT_NAME + "=? AND " + Groups.ACCOUNT_TYPE + "=? AND " + - Groups.TITLE + "=?", - new String[] { AccountUtil.ACCOUNT_NAME, AccountUtil.ACCOUNT_TYPE, - context.getString(R.string.video_calling_contact_group) }, null); - if (cursor != null) { - try { - if (cursor.moveToFirst()) { - videoCallingGroupId = cursor.getLong(0); - } - } finally { - cursor.close(); - } - } - logger.debug("videoCallingGroupId : " + videoCallingGroupId); - logger.debug("storedVideoCallingGroupId : " + storedVideoCallingGroupId); - if (videoCallingGroupId == 0) { - logger.debug("videoCallingGroupId : " + videoCallingGroupId + - " not present. Do nothing. "); - } else { - if (storedVideoCallingGroupId == videoCallingGroupId) { - String deleteWhereClause = Groups._ID + "='" + videoCallingGroupId + "'"; - contentResolver.delete(Groups.CONTENT_URI, deleteWhereClause, null); - logger.debug("Removing Video Calling Group."); - } - SharedPrefUtil.setVideoCallingGroupId(context, 0); - } - logger.debug("videoCallingGroupId: " + videoCallingGroupId); - } - - public static int resetVtCapability(ContentResolver resolver) { - if(resolver == null) { - logger.error("resetVtCapability, resolver = null"); - return 0; - } - - String selection = ContactsContract.Data.MIMETYPE + " = '" + Phone.CONTENT_ITEM_TYPE + "'"; - - ContentValues values = new ContentValues(); - values.put(ContactsContract.Data.CARRIER_PRESENCE, 0); // reset all. - int count = resolver.update(ContactsContract.Data.CONTENT_URI, values, selection, null); - logger.debug("resetVtCapability count=" + count); - return count; - } - - public static int updateVtCapability(ContentResolver resolver, String number, boolean enable) { - String[] projection = new String[] {EABContract.EABColumns.DATA_ID}; - - int updatedCount = 0; - Cursor cursor = null; - try { - cursor = resolver.query(Contacts.Impl.CONTENT_URI, - projection, "PHONE_NUMBERS_EQUAL(contact_number, ?, 0)", - new String[] {number}, null); - if(null != cursor) { - int count = cursor.getCount(); - logger.debug("updateVtCapability to Contact DB, count=" + count); - if(count <= 0) { - logger.error("updateVtCapability, no number to be updated"); - cursor.close(); - cursor = null; - return updatedCount; - } - - while(cursor.moveToNext()) { - long dataId = cursor.getLong(cursor.getColumnIndex( - EABContract.EABColumns.DATA_ID)); - // update one by one to avoid loosing matching error. - updatedCount += updateVtCapability(resolver, dataId, enable); - } - } - } catch (Exception e) { - logger.error("updateVtCapability exception", e); - } finally { - if(cursor != null) { - cursor.close(); - } - } - - logger.debug("updateVtCapability updatedCount=" + updatedCount); - return updatedCount; - } - - public static int updateVtCapability(ContentResolver resolver, long dataId, boolean enable) { - if(resolver == null) { - logger.error("resetVtCapability, resolver = null"); - return 0; - } - - String selection = ContactsContract.Data.MIMETYPE + " = '" + Phone.CONTENT_ITEM_TYPE - + "' and " + ContactsContract.Data._ID + "= '" + dataId + "'"; - - int oldValue = 0; - final Cursor cursor = resolver.query(ContactsContract.Data.CONTENT_URI, - new String[] { ContactsContract.Data._ID, ContactsContract.Data.CARRIER_PRESENCE }, - selection, null, null); - if (cursor != null) { - try { - if (cursor.moveToFirst()) { - oldValue = cursor.getInt(1); - } - } finally { - cursor.close(); - } - } - - - ContentValues values = new ContentValues(); - values.put(ContactsContract.Data.CARRIER_PRESENCE, - enable?(oldValue | ContactsContract.Data.CARRIER_PRESENCE_VT_CAPABLE): - (oldValue & ~ContactsContract.Data.CARRIER_PRESENCE_VT_CAPABLE)); - int count = resolver.update(ContactsContract.Data.CONTENT_URI, values, selection, null); - logger.debug("resetVtCapability count=" + count); - return count; - } -} diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/Contacts.java b/rcs/presencepolling/src/com/android/service/ims/presence/Contacts.java deleted file mode 100644 index cbad25ad..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/Contacts.java +++ /dev/null @@ -1,297 +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.net.Uri; -import android.os.SystemClock; -import android.provider.BaseColumns; -import android.text.format.Time; -import com.android.ims.internal.EABContract; - -import com.android.ims.internal.ContactNumberUtils; - -public final class Contacts { - private Contacts() {} - - /** - * Intent that a new contact is inserted in EAB Provider. - * This intent will have a extra parameter with key NEW_PHONE_NUMBER. - */ - public static final String ACTION_NEW_CONTACT_INSERTED = - "android.provider.rcs.eab.EAB_NEW_CONTACT_INSERTED"; - - /** - * Key to bundle the new phone number inserted in EAB Provider. - */ - public static final String NEW_PHONE_NUMBER = "newPhoneNumber"; - - - public static final String AUTHORITY = EABContract.AUTHORITY; - - public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY); - - public static final class Impl implements BaseColumns { - private Impl() {} - - public static final String TABLE_NAME = - EABContract.EABColumns.TABLE_NAME; - - /** - * CONTENT_URI - * <P> - * "content://com.android.vt.eab/EABPresence" - * </P> - */ - public static final Uri CONTENT_URI = - Uri.withAppendedPath(Contacts.CONTENT_URI, TABLE_NAME); - - /** - * Key defining the contact number. - * <P> - * Type: TEXT - * </P> - */ - public static final String CONTACT_NUMBER = - EABContract.EABColumns.CONTACT_NUMBER; - - /** - * Key defining the contact name. - * <P> - * Type: TEXT - * </P> - */ - public static final String CONTACT_NAME = - EABContract.EABColumns.CONTACT_NAME; - - /** - * <p> - * Type: INT - * </p> - */ - public static final String VOLTE_STATUS = - EABContract.EABColumns.VOLTE_STATUS; - - /** - * Key defining the last updated timestamp. - * <P> - * Type: LONG - * </P> - */ - public static final String CONTACT_LAST_UPDATED_TIMESTAMP = - EABContract.EABColumns.CONTACT_LAST_UPDATED_TIMESTAMP; - - /** - * Key defining the VoLTE call service contact address. - * <P> - * Type: TEXT - * </P> - */ - public static final String VOLTE_CALL_SERVICE_CONTACT_ADDRESS = - EABContract.EABColumns.VOLTE_CALL_SERVICE_CONTACT_ADDRESS; - - /** - * Key defining the VoLTE call capability. - * <P> - * Type: TEXT - * </P> - */ - public static final String VOLTE_CALL_CAPABILITY = - EABContract.EABColumns.VOLTE_CALL_CAPABILITY; - - /** - * Key defining the VoLTE call capability timestamp. - * <P> - * Type: LONG - * </P> - */ - public static final String VOLTE_CALL_CAPABILITY_TIMESTAMP = - EABContract.EABColumns.VOLTE_CALL_CAPABILITY_TIMESTAMP; - - /** - * Key defining the VoLTE call availability. - * <P> - * Type: TEXT - * </P> - */ - public static final String VOLTE_CALL_AVAILABILITY = - EABContract.EABColumns.VOLTE_CALL_AVAILABILITY; - - /** - * Key defining the VoLTE call availability timestamp. - * <P> - * Type: LONG - * </P> - */ - public static final String VOLTE_CALL_AVAILABILITY_TIMESTAMP = - EABContract.EABColumns.VOLTE_CALL_AVAILABILITY_TIMESTAMP; - - /** - * Key defining the Video call service contact address. - * <P> - * Type: TEXT - * </P> - */ - public static final String VIDEO_CALL_SERVICE_CONTACT_ADDRESS = - EABContract.EABColumns.VIDEO_CALL_SERVICE_CONTACT_ADDRESS; - - /** - * Key defining the Video call capability. - * <P> - * Type: TEXT - * </P> - */ - public static final String VIDEO_CALL_CAPABILITY = - EABContract.EABColumns.VIDEO_CALL_CAPABILITY; - - /** - * Key defining the Video call capability timestamp. - * <P> - * Type: LONG - * </P> - */ - public static final String VIDEO_CALL_CAPABILITY_TIMESTAMP = - EABContract.EABColumns.VIDEO_CALL_CAPABILITY_TIMESTAMP; - - /** - * Key defining the Video call availability. - * <P> - * Type: TEXT - * </P> - */ - public static final String VIDEO_CALL_AVAILABILITY = - EABContract.EABColumns.VIDEO_CALL_AVAILABILITY; - - /** - * Key defining the Video call availability timestamp. - * <P> - * Type: LONG - * </P> - */ - public static final String VIDEO_CALL_AVAILABILITY_TIMESTAMP = - EABContract.EABColumns.VIDEO_CALL_AVAILABILITY_TIMESTAMP; - } - - public static class Item { - public Item(long id) { - mId = id; - } - - public long id() { - return mId; - } - - public String number() { - return mNumber; - } - - public void setNumber(String number) { - mNumber = ContactNumberUtils.getDefault().format(number); - } - - public boolean isValid() { - int res = ContactNumberUtils.getDefault().validate(mNumber); - return (res == ContactNumberUtils.NUMBER_VALID); - } - - public String name() { - return mName; - } - - public void setName(String name) { - mName = name; - } - - public long lastUpdateTime() { - return mLastUpdateTime; - } - - public void setLastUpdateTime(long time) { - mLastUpdateTime = time; - } - - public long volteTimestamp() { - return mVolteTimeStamp; - } - - public void setVolteTimestamp(long time) { - mVolteTimeStamp = time; - } - - public long videoTimestamp() { - return mVideoTimeStamp; - } - - public void setVideoTimestamp(long time) { - mVideoTimeStamp = time; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof Contacts.Item)) return false; - - Contacts.Item that = (Contacts.Item) o; - return this.number().equalsIgnoreCase(that.number()); - } - - @Override - public String toString() { - return new StringBuilder(256) - .append("Contacts.Item { ") - .append("\nId: " + mId) - .append("\nNumber: " + mNumber) - .append("\nLast update time: " + mLastUpdateTime + "(" + - getTimeString(mLastUpdateTime) + ")") - .append("\nVolte capability timestamp: " + mVolteTimeStamp + "(" + - getTimeString(mVolteTimeStamp) + ")") - .append("\nVideo capability timestamp: " + mVideoTimeStamp + "(" + - getTimeString(mVideoTimeStamp) + ")") - .append("\nisValid: " + isValid()) - .append(" }") - .toString(); - } - - private String getTimeString(long time) { - if (time <= 0) { - time = System.currentTimeMillis(); - } - - Time tobj = new Time(); - tobj.set(time); - return String.format("%s.%s", tobj.format("%m-%d %H:%M:%S"), time % 1000); - } - - private long mId; - private String mNumber; - private String mName; - private long mLastUpdateTime; - private long mVolteTimeStamp; - private long mVideoTimeStamp; - } -} diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/DatabaseContentProvider.java b/rcs/presencepolling/src/com/android/service/ims/presence/DatabaseContentProvider.java deleted file mode 100644 index 0ae9bc96..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/DatabaseContentProvider.java +++ /dev/null @@ -1,434 +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 java.io.File; - -import android.content.ContentProvider; -import android.content.ContentValues; -import android.content.Context; -import android.content.Intent; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteException; -import android.database.sqlite.SQLiteFullException; -import android.database.sqlite.SQLiteOpenHelper; -import android.net.Uri; - -import com.android.ims.internal.Logger; - -public abstract class DatabaseContentProvider extends ContentProvider { - static private Logger logger = Logger.getLogger("DatabaseContentProvider"); - - //Constants - public static final String ACTION_DEVICE_STORAGE_FULL = "com.android.vmm.DEVICE_STORAGE_FULL"; - - //Fields - protected SQLiteOpenHelper mDbHelper; - /*package*/final int mDbVersion; - private final String mDbName; - - /** - * Initializes the DatabaseContentProvider - * @param dbName the filename of the database - * @param dbVersion the current version of the database schema - * @param contentUri The base Uri of the syncable content in this provider - */ - public DatabaseContentProvider(String dbName, int dbVersion) { - super(); - mDbName = dbName; - mDbVersion = dbVersion; - } - - /** - * bootstrapDatabase() allows the implementer to set up their database - * after it is opened for the first time. this is a perfect place - * to create tables and triggers :) - * @param db - */ - protected void bootstrapDatabase(SQLiteDatabase db) { - } - - /** - * updgradeDatabase() allows the user to do whatever they like - * when the database is upgraded between versions. - * @param db - the SQLiteDatabase that will be upgraded - * @param oldVersion - the old version number as an int - * @param newVersion - the new version number as an int - * @return - */ - protected abstract boolean upgradeDatabase(SQLiteDatabase db, int oldVersion, int newVersion); - - /** - * downgradeDatabase() allows the user to do whatever they like when the - * database is downgraded between versions. - * - * @param db - the SQLiteDatabase that will be downgraded - * @param oldVersion - the old version number as an int - * @param newVersion - the new version number as an int - * @return - */ - protected abstract boolean downgradeDatabase(SQLiteDatabase db, int oldVersion, int newVersion); - - /** - * Safely wraps an ALTER TABLE table ADD COLUMN columnName columnType - * If columnType == null then it's set to INTEGER DEFAULT 0 - * @param db - db to alter - * @param table - table to alter - * @param columnDef - * @return - */ - protected static boolean addColumn(SQLiteDatabase db, String table, String columnName, - String columnType) { - StringBuilder sb = new StringBuilder(); - sb.append("ALTER TABLE ").append(table).append(" ADD COLUMN ").append(columnName).append( - ' ').append(columnType == null ? "INTEGER DEFAULT 0" : columnType).append(';'); - try { - db.execSQL(sb.toString()); - } catch (SQLiteException e) { - logger.debug("Alter table failed : "+ e.getMessage()); - return false; - } - return true; - } - - /** - * onDatabaseOpened() allows the user to do whatever they might - * need to do whenever the database is opened - * @param db - SQLiteDatabase that was just opened - */ - protected void onDatabaseOpened(SQLiteDatabase db) { - } - - private class DatabaseHelper extends SQLiteOpenHelper { - private File mDatabaseFile = null; - - DatabaseHelper(Context context, String name) { - // Note: context and name may be null for temp providers - super(context, name, null, mDbVersion); - mDatabaseFile = context.getDatabasePath(name); - } - - @Override - public void onCreate(SQLiteDatabase db) { - bootstrapDatabase(db); - } - - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - upgradeDatabase(db, oldVersion, newVersion); - } - - @Override - public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { - logger.debug("Enter: onDowngrade() - oldVersion = " + oldVersion + " newVersion = " - + newVersion); - downgradeDatabase(db, oldVersion, newVersion); - } - - @Override - public void onOpen(SQLiteDatabase db) { - onDatabaseOpened(db); - } - - @Override - public synchronized SQLiteDatabase getWritableDatabase() { - try { - return super.getWritableDatabase(); - } catch (InvalidDBException e) { - logger.error("getWritableDatabase - caught InvalidDBException "); - } - - // try to delete the database file - if (null != mDatabaseFile) { - logger.error("deleting mDatabaseFile."); - mDatabaseFile.delete(); - } - - // Return a freshly created database. - return super.getWritableDatabase(); - } - - @Override - public synchronized SQLiteDatabase getReadableDatabase() { - try { - return super.getReadableDatabase(); - } catch (InvalidDBException e) { - logger.error("getReadableDatabase - caught InvalidDBException "); - } - - // try to delete the database file - if (null != mDatabaseFile) { - logger.error("deleting mDatabaseFile."); - mDatabaseFile.delete(); - } - - // Return a freshly created database. - return super.getReadableDatabase(); - } - } - - /** - * deleteInternal allows getContentResolver().delete() to occur atomically - * via transactions and notify the uri automatically upon completion (provided - * rows were deleted) - otherwise, it functions exactly as getContentResolver.delete() - * would on a regular ContentProvider - * @param uri - uri to delete from - * @param selection - selection used for the uri - * @param selectionArgs - selection args replacing ?'s in the selection - * @return returns the number of rows deleted - */ - protected abstract int deleteInternal(final SQLiteDatabase db, Uri uri, String selection, - String[] selectionArgs); - - @Override - public int delete(Uri uri, String selection, String[] selectionArgs) { - int result = 0; - SQLiteDatabase db = mDbHelper.getWritableDatabase(); - if (isClosed(db)) { - return result; - } - try { - //acquire reference to prevent from garbage collection - db.acquireReference(); - //beginTransaction can throw a runtime exception - //so it needs to be moved into the try - db.beginTransaction(); - result = deleteInternal(db, uri, selection, selectionArgs); - db.setTransactionSuccessful(); - } catch (SQLiteFullException fullEx) { - logger.error("" + fullEx); - sendStorageFullIntent(getContext()); - } catch (Exception e) { - logger.error("" + e); - } finally { - try { - db.endTransaction(); - } catch (SQLiteFullException fullEx) { - logger.error("" + fullEx); - sendStorageFullIntent(getContext()); - } catch (Exception e) { - logger.error("" + e); - } - //release reference - db.releaseReference(); - } - // don't check return value because it may be 0 if all rows deleted - getContext().getContentResolver().notifyChange(uri, null); - return result; - } - - /** - * insertInternal allows getContentResolver().insert() to occur atomically - * via transactions and notify the uri automatically upon completion (provided - * rows were added to the db) - otherwise, it functions exactly as getContentResolver().insert() - * would on a regular ContentProvider - * @param uri - uri on which to insert - * @param values - values to insert - * @return returns the uri of the row added - */ - protected abstract Uri insertInternal(final SQLiteDatabase db, Uri uri, ContentValues values); - - @Override - public Uri insert(Uri uri, ContentValues values) { - Uri result = null; - SQLiteDatabase db = mDbHelper.getWritableDatabase(); - if (isClosed(db)) { - return result; - } - try { - db.acquireReference(); - //beginTransaction can throw a runtime exception - //so it needs to be moved into the try - db.beginTransaction(); - result = insertInternal(db, uri, values); - db.setTransactionSuccessful(); - } catch (SQLiteFullException fullEx) { - logger.warn("" + fullEx); - sendStorageFullIntent(getContext()); - } catch (Exception e) { - logger.warn("" + e); - } finally { - try { - db.endTransaction(); - } catch (SQLiteFullException fullEx) { - logger.warn("" + fullEx); - sendStorageFullIntent(getContext()); - } catch (Exception e) { - logger.warn("" + e); - } - db.releaseReference(); - } - if (result != null) { - getContext().getContentResolver().notifyChange(uri, null); - } - return result; - } - - @Override - public boolean onCreate() { - mDbHelper = new DatabaseHelper(getContext(), mDbName); - return onCreateInternal(); - } - - /** - * Called by onCreate. Should be overridden by any subclasses - * to handle the onCreate lifecycle event. - * - * @return - */ - protected boolean onCreateInternal() { - return true; - } - - /** - * queryInternal allows getContentResolver().query() to occur - * @param uri - * @param projection - * @param selection - * @param selectionArgs - * @param sortOrder - * @return Cursor holding the contents of the requested query - */ - protected abstract Cursor queryInternal(final SQLiteDatabase db, Uri uri, String[] projection, - String selection, String[] selectionArgs, String sortOrder); - - @Override - public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, - String sortOrder) { - SQLiteDatabase db = mDbHelper.getReadableDatabase(); - if (isClosed(db)) { - return null; - } - - try { - db.acquireReference(); - return queryInternal(db, uri, projection, selection, selectionArgs, sortOrder); - } finally { - db.releaseReference(); - } - } - - protected abstract int updateInternal(final SQLiteDatabase db, Uri uri, ContentValues values, - String selection, String[] selectionArgs); - - @Override - public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { - int result = 0; - SQLiteDatabase db = mDbHelper.getWritableDatabase(); - if (isClosed(db)) { - return result; - } - try { - db.acquireReference(); - //beginTransaction can throw a runtime exception - //so it needs to be moved into the try - db.beginTransaction(); - result = updateInternal(db, uri, values, selection, selectionArgs); - db.setTransactionSuccessful(); - } catch (SQLiteFullException fullEx) { - logger.error("" + fullEx); - sendStorageFullIntent(getContext()); - } catch (Exception e) { - logger.error("" + e); - } finally { - try { - db.endTransaction(); - } catch (SQLiteFullException fullEx) { - logger.error("" + fullEx); - sendStorageFullIntent(getContext()); - } catch (Exception e) { - logger.error("" + e); - } - db.releaseReference(); - } - if (result > 0) { - getContext().getContentResolver().notifyChange(uri, null); - } - return result; - } - - @Override - public int bulkInsert(Uri uri, ContentValues[] values) { - int added = 0; - if (values != null) { - int numRows = values.length; - SQLiteDatabase db = mDbHelper.getWritableDatabase(); - if (isClosed(db)) { - return added; - } - try { - db.acquireReference(); - //beginTransaction can throw a runtime exception - //so it needs to be moved into the try - db.beginTransaction(); - - for (int i = 0; i < numRows; i++) { - if (insertInternal(db, uri, values[i]) != null) { - added++; - } - } - db.setTransactionSuccessful(); - if (added > 0) { - getContext().getContentResolver().notifyChange(uri, null); - } - } catch (SQLiteFullException fullEx) { - logger.error("" + fullEx); - sendStorageFullIntent(getContext()); - } catch (Exception e) { - logger.error("" + e); - } finally { - try { - db.endTransaction(); - } catch (SQLiteFullException fullEx) { - logger.error("" + fullEx); - sendStorageFullIntent(getContext()); - } catch (Exception e) { - logger.error("" + e); - } - db.releaseReference(); - } - } - return added; - } - - private void sendStorageFullIntent(Context context) { - Intent fullStorageIntent = new Intent(ACTION_DEVICE_STORAGE_FULL); - context.sendBroadcast(fullStorageIntent); - } - - private boolean isClosed(SQLiteDatabase db) { - if (db == null || !db.isOpen()) { - logger.warn("Null DB returned from DBHelper for a writable/readable database."); - return true; - } - return false; - } - -} diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/DeviceBoot.java b/rcs/presencepolling/src/com/android/service/ims/presence/DeviceBoot.java deleted file mode 100644 index 096d3428..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/DeviceBoot.java +++ /dev/null @@ -1,81 +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 android.os.SystemProperties; - -import com.android.ims.RcsPresence; -import com.android.ims.RcsPresence.PublishState; -import com.android.ims.internal.Logger; - -/** - * Device boot event receiver: automatically starts the RCS service - */ -public class DeviceBoot extends BroadcastReceiver { - /** - * The logger - */ - private Logger logger = Logger.getLogger("PresencePolling", - this.getClass().getName()); - - private static boolean sServiceStarted = false; - private static boolean sEabServiceStarted = false; - - @Override - public void onReceive(Context context, Intent intent) { - 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); - } - - String rcsSupported = SystemProperties.get("persist.rcs.supported"); - logger.info("persist.rcs.supported: " + rcsSupported); - if (! "1".equals(rcsSupported)) { - return; - } - - if (! sServiceStarted) { - sServiceStarted = LauncherUtils.launchPollingService(context); - } - - if(!sEabServiceStarted) { - sEabServiceStarted = LauncherUtils.launchEabService(context); - } - } -} - diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/DeviceShutdown.java b/rcs/presencepolling/src/com/android/service/ims/presence/DeviceShutdown.java deleted file mode 100644 index 193fd092..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/DeviceShutdown.java +++ /dev/null @@ -1,54 +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.internal.Logger; - -/** - * Device shutdown event receiver: automatically stops the RCS service - */ -public class DeviceShutdown extends BroadcastReceiver { - /** - * The logger - */ - private Logger logger = Logger.getLogger(this.getClass().getName()); - - @Override - public void onReceive(Context context, Intent intent) { - logger.debug("onReceive() in PresencePolling, intent: " + - intent + ", context: " + context); - - LauncherUtils.stopPollingService(context); - } -} - diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/EABContactManager.java b/rcs/presencepolling/src/com/android/service/ims/presence/EABContactManager.java deleted file mode 100644 index cefe50b4..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/EABContactManager.java +++ /dev/null @@ -1,932 +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.Context; -import android.content.ContentResolver; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.database.CursorWrapper; -import android.database.Cursor; -import android.database.DatabaseUtils; -import android.net.Uri; -import android.text.format.Time; -import android.text.TextUtils; - -import com.android.ims.RcsPresenceInfo; -import com.android.ims.internal.Logger; - -import java.util.ArrayList; -import java.util.List; - -public class EABContactManager { - private Logger logger = Logger.getLogger(this.getClass().getName()); - - /** - * An identifier for a particular EAB contact number, unique across the system. - * Clients use this ID to make subsequent calls related to the contact. - */ - public final static String COLUMN_ID = Contacts.Impl._ID; - - /** - * Timestamp when the presence was last updated, in {@link System#currentTimeMillis - * System.currentTimeMillis()} (wall clock time in UTC). - */ - public final static String COLUMN_LAST_UPDATED_TIMESTAMP = - Contacts.Impl.CONTACT_LAST_UPDATED_TIMESTAMP; - - /** - * columns to request from EABProvider. - * @hide - */ - public static final String[] CONTACT_COLUMNS = new String[] { - Contacts.Impl._ID, - Contacts.Impl.CONTACT_NUMBER, - Contacts.Impl.CONTACT_NAME, - Contacts.Impl.CONTACT_LAST_UPDATED_TIMESTAMP, - Contacts.Impl.VOLTE_CALL_SERVICE_CONTACT_ADDRESS, - Contacts.Impl.VOLTE_CALL_CAPABILITY, - Contacts.Impl.VOLTE_CALL_CAPABILITY_TIMESTAMP, - Contacts.Impl.VOLTE_CALL_AVAILABILITY, - Contacts.Impl.VOLTE_CALL_AVAILABILITY_TIMESTAMP, - Contacts.Impl.VIDEO_CALL_SERVICE_CONTACT_ADDRESS, - Contacts.Impl.VIDEO_CALL_CAPABILITY, - Contacts.Impl.VIDEO_CALL_CAPABILITY_TIMESTAMP, - Contacts.Impl.VIDEO_CALL_AVAILABILITY, - Contacts.Impl.VIDEO_CALL_AVAILABILITY_TIMESTAMP, - Contacts.Impl.VOLTE_STATUS - }; - - /** - * This class contains all the information necessary to request a new contact. - */ - public static class Request { - private long mId = -1; - private String mContactNumber = null; - private String mContactName = null; - - private int mVolteCallCapability = -1; - private long mVolteCallCapabilityTimeStamp = -1; - private int mVolteCallAvailability = -1; - private long mVolteCallAvailabilityTimeStamp = -1; - private String mVolteCallServiceContactAddress = null; - - private int mVideoCallCapability = -1; - private long mVideoCallCapabilityTimeStamp = -1; - private int mVideoCallAvailability = -1; - private long mVideoCallAvailabilityTimeStamp = -1; - private String mVideoCallServiceContactAddress = null; - - private long mContactLastUpdatedTimeStamp = -1; - private int mFieldUpdatedFlags = 0; - - private static int sVolteCallCapabilityFlag = 0x0001; - private static int sVolteCallCapabilityTimeStampFlag = 0x0002; - private static int sVolteCallAvailabilityFlag = 0x0004; - private static int sVolteCallAvailabilityTimeStampFlag = 0x0008; - private static int sVolteCallServiceContactAddressFlag = 0x0010; - private static int sVideoCallCapabilityFlag = 0x0020; - private static int sVideoCallCapabilityTimeStampFlag = 0x0040; - private static int sVideoCallAvailabilityFlag = 0x0080; - private static int sVideoCallAvailabilityTimeStampFlag = 0x0100; - private static int sVideoCallServiceContactAddressFlag = 0x0200; - private static int sContactLastUpdatedTimeStampFlag = 0x0400; - - /** - * @param id the contact id. - */ - public Request(long id) { - if (id < 0) { - throw new IllegalArgumentException( - "Can't update EAB presence item with id: " + id); - } - - mId = id; - } - - public Request(String number) { - if (TextUtils.isEmpty(number)) { - throw new IllegalArgumentException( - "Can't update EAB presence item with number: " + number); - } - - mContactNumber = number; - } - - public long getContactId() { - return mId; - } - - public String getContactNumber() { - return mContactNumber; - } - - /** - * Set Volte call service contact address. - * @param address contact from NOTIFY - * @return this object - */ - public Request setVolteCallServiceContactAddress(String address) { - mVolteCallServiceContactAddress = address; - mFieldUpdatedFlags |= sVolteCallServiceContactAddressFlag; - return this; - } - - /** - * Set Volte call capability. - * @param b wheter volte call is supported or not - * @return this object - */ - public Request setVolteCallCapability(boolean b) { - mVolteCallCapability = b ? 1 : 0; - mFieldUpdatedFlags |= sVolteCallCapabilityFlag; - return this; - } - - public Request setVolteCallCapability(int val) { - mVolteCallCapability = val; - mFieldUpdatedFlags |= sVolteCallCapabilityFlag; - return this; - } - - /** - * Set Volte call availability. - * @param b wheter volte call is available or not - * @return this object - */ - public Request setVolteCallAvailability(boolean b) { - mVolteCallAvailability = b ? 1 : 0; - mFieldUpdatedFlags |= sVolteCallAvailabilityFlag; - return this; - } - - public Request setVolteCallAvailability(int val) { - mVolteCallAvailability = val; - mFieldUpdatedFlags |= sVolteCallAvailabilityFlag; - return this; - } - - /** - * Set Video call service contact address. - * @param address contact from NOTIFY. - * @return this object - */ - public Request setVideoCallServiceContactAddress(String address) { - mVideoCallServiceContactAddress = address; - mFieldUpdatedFlags |= sVideoCallServiceContactAddressFlag; - return this; - } - - /** - * Set Video call capability. - * @param b wheter volte call is supported or not - * @return this object - */ - public Request setVideoCallCapability(boolean b) { - mVideoCallCapability = b ? 1 : 0; - mFieldUpdatedFlags |= sVideoCallCapabilityFlag; - return this; - } - - public Request setVideoCallCapability(int val) { - mVideoCallCapability = val; - mFieldUpdatedFlags |= sVideoCallCapabilityFlag; - return this; - } - - /** - * Set Video call availability. - * @param b wheter volte call is available or not - * @return this object - */ - public Request setVideoCallAvailability(boolean b) { - mVideoCallAvailability = b ? 1 : 0; - mFieldUpdatedFlags |= sVideoCallAvailabilityFlag; - return this; - } - - public Request setVideoCallAvailability(int val) { - mVideoCallAvailability = val; - mFieldUpdatedFlags |= sVideoCallAvailabilityFlag; - return this; - } - - /** - * Set the update timestamp. - * @param long timestamp the last update timestamp - * @return this object - */ - public Request setLastUpdatedTimeStamp(long timestamp) { - mContactLastUpdatedTimeStamp = timestamp; - mFieldUpdatedFlags |= sContactLastUpdatedTimeStampFlag; - return this; - } - - public Request setVolteCallCapabilityTimeStamp(long timestamp) { - mVolteCallCapabilityTimeStamp = timestamp; - mFieldUpdatedFlags |= sVolteCallCapabilityTimeStampFlag; - return this; - } - - public Request setVolteCallAvailabilityTimeStamp(long timestamp) { - mVolteCallAvailabilityTimeStamp = timestamp; - mFieldUpdatedFlags |= sVolteCallAvailabilityTimeStampFlag; - return this; - } - - public Request setVideoCallCapabilityTimeStamp(long timestamp) { - mVideoCallCapabilityTimeStamp = timestamp; - mFieldUpdatedFlags |= sVideoCallCapabilityTimeStampFlag; - return this; - } - - public Request setVideoCallAvailabilityTimeStamp(long timestamp) { - mVideoCallAvailabilityTimeStamp = timestamp; - mFieldUpdatedFlags |= sVideoCallAvailabilityTimeStampFlag; - return this; - } - - public Request reset() { - mVolteCallCapability = -1; - mVolteCallCapabilityTimeStamp = -1; - mVolteCallAvailability = -1; - mVolteCallAvailabilityTimeStamp = -1; - mVolteCallServiceContactAddress = null; - - mVideoCallCapability = -1; - mVideoCallCapabilityTimeStamp = -1; - mVideoCallAvailability = -1; - mVideoCallAvailabilityTimeStamp = -1; - mVideoCallServiceContactAddress = null; - - mContactLastUpdatedTimeStamp = -1; - mFieldUpdatedFlags = 0; - return this; - } - - /** - * @return ContentValues to be passed to EABProvider.update() - */ - ContentValues toContentValues() { - ContentValues values = new ContentValues(); - - if ((mFieldUpdatedFlags & sVolteCallCapabilityFlag) > 0) { - values.put(Contacts.Impl.VOLTE_CALL_CAPABILITY, - mVolteCallCapability); - } - if ((mFieldUpdatedFlags & sVolteCallCapabilityTimeStampFlag) > 0) { - values.put(Contacts.Impl.VOLTE_CALL_CAPABILITY_TIMESTAMP, - mVolteCallCapabilityTimeStamp); - } - if ((mFieldUpdatedFlags & sVolteCallAvailabilityFlag) > 0) { - values.put(Contacts.Impl.VOLTE_CALL_AVAILABILITY, - mVolteCallAvailability); - } - if ((mFieldUpdatedFlags & sVolteCallAvailabilityTimeStampFlag) > 0) { - values.put(Contacts.Impl.VOLTE_CALL_AVAILABILITY_TIMESTAMP, - mVolteCallAvailabilityTimeStamp); - } - if ((mFieldUpdatedFlags & sVolteCallServiceContactAddressFlag) > 0) { - values.put(Contacts.Impl.VOLTE_CALL_SERVICE_CONTACT_ADDRESS, - mVolteCallServiceContactAddress); - } - - if ((mFieldUpdatedFlags & sVideoCallCapabilityFlag) > 0) { - values.put(Contacts.Impl.VIDEO_CALL_CAPABILITY, - mVideoCallCapability); - } - if ((mFieldUpdatedFlags & sVideoCallCapabilityTimeStampFlag) > 0) { - values.put(Contacts.Impl.VIDEO_CALL_CAPABILITY_TIMESTAMP, - mVideoCallCapabilityTimeStamp); - } - if ((mFieldUpdatedFlags & sVideoCallAvailabilityFlag) > 0) { - values.put(Contacts.Impl.VIDEO_CALL_AVAILABILITY, - mVideoCallAvailability); - } - if ((mFieldUpdatedFlags & sVideoCallAvailabilityTimeStampFlag) > 0) { - values.put(Contacts.Impl.VIDEO_CALL_AVAILABILITY_TIMESTAMP, - mVideoCallAvailabilityTimeStamp); - } - if ((mFieldUpdatedFlags & sVideoCallServiceContactAddressFlag) > 0) { - values.put(Contacts.Impl.VIDEO_CALL_SERVICE_CONTACT_ADDRESS, - mVideoCallServiceContactAddress); - } - - if ((mFieldUpdatedFlags & sContactLastUpdatedTimeStampFlag) > 0 ) { - values.put(Contacts.Impl.CONTACT_LAST_UPDATED_TIMESTAMP, - mContactLastUpdatedTimeStamp); - } - - return values; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(512); - sb.append("EABContactManager.Request { "); - if (mId != -1) { - sb.append("\nId: " + mId); - } - if (!TextUtils.isEmpty(mContactNumber)) { - sb.append("\nContact Number: " + mContactNumber); - } - if (!TextUtils.isEmpty(mContactName)) { - sb.append("\nContact Name: " + mContactName); - } - - if ((mFieldUpdatedFlags & sVolteCallCapabilityFlag) > 0) { - sb.append("\nVolte call capability: " + mVolteCallCapability); - } - if ((mFieldUpdatedFlags & sVolteCallCapabilityTimeStampFlag) > 0) { - sb.append("\nVolte call capability timestamp: " + mVolteCallCapabilityTimeStamp - + "(" + getTimeString(mVolteCallCapabilityTimeStamp) + ")"); - } - if ((mFieldUpdatedFlags & sVolteCallAvailabilityFlag) > 0) { - sb.append("\nVolte call availability: " + mVolteCallAvailability); - } - if ((mFieldUpdatedFlags & sVolteCallAvailabilityTimeStampFlag) > 0) { - sb.append("\nVolte call availablity timestamp: " + mVolteCallAvailabilityTimeStamp - + "(" + getTimeString(mVolteCallAvailabilityTimeStamp) + ")"); - } - if ((mFieldUpdatedFlags & sVolteCallServiceContactAddressFlag) > 0) { - sb.append("\nVolte Call Service address: " + mVolteCallServiceContactAddress); - } - - if ((mFieldUpdatedFlags & sVideoCallCapabilityFlag) > 0) { - sb.append("\nVideo call capability: " + mVideoCallCapability); - } - if ((mFieldUpdatedFlags & sVideoCallCapabilityTimeStampFlag) > 0) { - sb.append("\nVideo call capability timestamp: " + mVideoCallCapabilityTimeStamp - + "(" + getTimeString(mVideoCallCapabilityTimeStamp) + ")"); - } - if ((mFieldUpdatedFlags & sVideoCallAvailabilityFlag) > 0) { - sb.append("\nVideo call availability: " + mVideoCallAvailability); - } - if ((mFieldUpdatedFlags & sVideoCallAvailabilityTimeStampFlag) > 0) { - sb.append("\nVideo call availablity timestamp: " + mVideoCallAvailabilityTimeStamp - + "(" + getTimeString(mVideoCallAvailabilityTimeStamp) + ")"); - } - if ((mFieldUpdatedFlags & sVideoCallServiceContactAddressFlag) > 0) { - sb.append("\nVideo Call Service address: " + mVideoCallServiceContactAddress); - } - - if ((mFieldUpdatedFlags & sContactLastUpdatedTimeStampFlag) > 0 ) { - sb.append("\nContact last update time: " + mContactLastUpdatedTimeStamp - + "(" + getTimeString(mContactLastUpdatedTimeStamp) + ")"); - } - - sb.append(" }"); - return sb.toString(); - } - } - - /** - * This class may be used to filter EABProvider queries. - */ - public static class Query { - /** - * Constant for use with {@link #orderBy} - * @hide - */ - public static final int ORDER_ASCENDING = 1; - - /** - * Constant for use with {@link #orderBy} - * @hide - */ - public static final int ORDER_DESCENDING = 2; - - private long[] mIds = null; - private String mContactNumber = null; - private List<String> mTimeFilters = null; - private String mOrderByColumn = COLUMN_LAST_UPDATED_TIMESTAMP; - private int mOrderDirection = ORDER_ASCENDING; - - /** - * Include only the contacts with the given IDs. - * @return this object - */ - public Query setFilterById(long... ids) { - mIds = ids; - return this; - } - - /** - * Include only the contacts with the given number. - * @return this object - */ - public Query setFilterByNumber(String number) { - mContactNumber = number; - return this; - } - - /** - * Include the contacts that meet the specified time condition. - * @return this object - */ - public Query setFilterByTime(String selection) { - if (mTimeFilters == null) { - mTimeFilters = new ArrayList<String>(); - } - - mTimeFilters.add(selection); - return this; - } - - /** - * Include only the contacts that has not been updated before the last time. - * @return this object - */ - public Query setFilterByTime(String column, long last) { - if (mTimeFilters == null) { - mTimeFilters = new ArrayList<String>(); - } - - mTimeFilters.add(column + "<='" + last + "'"); - return this; - } - - /** - * Include only the contacts that has not been updated after the eariest time. - * @return this object - */ - public Query setFilterByEarliestTime(String column, long earliest) { - if (mTimeFilters == null) { - mTimeFilters = new ArrayList<String>(); - } - - mTimeFilters.add(column + ">='" + earliest + "'"); - return this; - } - - /** - * Change the sort order of the returned Cursor. - * - * @param column one of the COLUMN_* constants; currently, only - * {@link #COLUMN_LAST_MODIFIED_TIMESTAMP} and {@link #COLUMN_TOTAL_SIZE_BYTES} are - * supported. - * @param direction either {@link #ORDER_ASCENDING} or {@link #ORDER_DESCENDING} - * @return this object - * @hide - */ - public Query orderBy(String column, int direction) { - if (direction != ORDER_ASCENDING && direction != ORDER_DESCENDING) { - throw new IllegalArgumentException("Invalid direction: " + direction); - } - - if (column.equals(COLUMN_ID)) { - mOrderByColumn = Contacts.Impl._ID; - } else if (column.equals(COLUMN_LAST_UPDATED_TIMESTAMP)) { - mOrderByColumn = Contacts.Impl.CONTACT_LAST_UPDATED_TIMESTAMP; - } else { - throw new IllegalArgumentException("Cannot order by " + column); - } - mOrderDirection = direction; - return this; - } - - /** - * Run this query using the given ContentResolver. - * @param projection the projection to pass to ContentResolver.query() - * @return the Cursor returned by ContentResolver.query() - */ - Cursor runQuery(ContentResolver resolver, String[] projection, Uri baseUri) { - Uri uri = baseUri; - List<String> selectionParts = new ArrayList<String>(); - String[] selectionArgs = null; - - if (mIds != null) { - selectionParts.add(getWhereClauseForIds(mIds)); - selectionArgs = getWhereArgsForIds(mIds); - } - - if (!TextUtils.isEmpty(mContactNumber)) { - String number = mContactNumber; - if (number.startsWith("tel:")) { - number = number.substring(4); - } - String escapedPhoneNumber = DatabaseUtils.sqlEscapeString(number); - String cselection = "(" + Contacts.Impl.CONTACT_NUMBER + "=" + escapedPhoneNumber; - cselection += " OR PHONE_NUMBERS_EQUAL(" + Contacts.Impl.CONTACT_NUMBER + ", "; - cselection += escapedPhoneNumber + ", 0))"; - - selectionParts.add(cselection); - } - - if (mTimeFilters != null) { - String cselection = joinStrings(" OR ", mTimeFilters); - int size = mTimeFilters.size(); - if (size > 1) { - cselection = "(" + cselection + ")"; - } - selectionParts.add(cselection); - } - - String selection = joinStrings(" AND ", selectionParts); - String orderDirection = (mOrderDirection == ORDER_ASCENDING ? "ASC" : "DESC"); - String orderBy = mOrderByColumn + " " + orderDirection; - - return resolver.query(uri, projection, selection, selectionArgs, orderBy); - } - - private String joinStrings(String joiner, Iterable<String> parts) { - StringBuilder builder = new StringBuilder(); - boolean first = true; - for (String part : parts) { - if (!first) { - builder.append(joiner); - } - builder.append(part); - first = false; - } - return builder.toString(); - } - - @Override - public String toString() { - List<String> selectionParts = new ArrayList<String>(); - String[] selectionArgs = null; - - if (mIds != null) { - selectionParts.add(getWhereClauseForIds(mIds)); - selectionArgs = getWhereArgsForIds(mIds); - } - - if (!TextUtils.isEmpty(mContactNumber)) { - String number = mContactNumber; - if (number.startsWith("tel:")) { - number = number.substring(4); - } - String escapedPhoneNumber = DatabaseUtils.sqlEscapeString(number); - String cselection = "(" + Contacts.Impl.CONTACT_NUMBER + "=" + escapedPhoneNumber; - cselection += " OR PHONE_NUMBERS_EQUAL(" + Contacts.Impl.CONTACT_NUMBER + ", "; - cselection += escapedPhoneNumber + ", 0))"; - - selectionParts.add(cselection); - } - - if (mTimeFilters != null) { - String cselection = joinStrings(" OR ", mTimeFilters); - int size = mTimeFilters.size(); - if (size > 1) { - cselection = "(" + cselection + ")"; - } - selectionParts.add(cselection); - } - - String selection = joinStrings(" AND ", selectionParts); - String orderDirection = (mOrderDirection == ORDER_ASCENDING ? "ASC" : "DESC"); - String orderBy = mOrderByColumn + " " + orderDirection; - - StringBuilder sb = new StringBuilder(512); - sb.append("EABContactManager.Query { "); - sb.append("\nSelection: " + selection); - sb.append("\nSelectionArgs: " + selectionArgs); - sb.append("\nOrderBy: " + orderBy); - sb.append(" }"); - return sb.toString(); - } - } - - private ContentResolver mResolver; - private String mPackageName; - private Uri mBaseUri = Contacts.Impl.CONTENT_URI; - - /** - * @hide - */ - public EABContactManager(ContentResolver resolver, String packageName) { - mResolver = resolver; - mPackageName = packageName; - } - - /** - * Query the presence manager about contacts that have been requested. - * @param query parameters specifying filters for this query - * @return a Cursor over the result set of contacts, with columns consisting of all the - * COLUMN_* constants. - */ - public Cursor query(Query query) { - Cursor underlyingCursor = query.runQuery(mResolver, CONTACT_COLUMNS, mBaseUri); - if (underlyingCursor == null) { - return null; - } - - return new CursorTranslator(underlyingCursor, mBaseUri); - } - - /** - * Update a contact presence status. - * - * @param request the parameters specifying this contact presence - * @return an ID for the contact, unique across the system. This ID is used to make future - * calls related to this contact. - */ - public int update(Request request) { - if (request == null) { - return 0; - } - - long id = request.getContactId(); - String number = request.getContactNumber(); - if ((id == -1) && TextUtils.isEmpty(number)) { - throw new IllegalArgumentException("invalid request for contact update."); - } - - ContentValues values = request.toContentValues(); - if (id != -1) { - logger.debug("Update contact " + id + " with request: " + values); - return mResolver.update(ContentUris.withAppendedId(mBaseUri, id), values, - null, null); - } else { - Query query = new Query().setFilterByNumber(number) - .orderBy(COLUMN_ID, Query.ORDER_ASCENDING); - long[] ids = null; - Cursor cursor = null; - try { - cursor = query(query); - if (cursor == null) { - return 0; - } - int count = cursor.getCount(); - if (count == 0) { - return 0; - } - - ids = new long[count]; - int idx = 0; - for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { - id = cursor.getLong(cursor.getColumnIndex(Contacts.Impl._ID)); - ids[idx++] = id; - if (idx >= count) { - break; - } - } - } finally { - if (cursor != null) { - cursor.close(); - } - } - - if ((ids == null) || (ids.length == 0)) { - return 0; - } - - if (ids.length == 1) { - logger.debug("Update contact " + ids[0] + " with request: " + values); - return mResolver.update(ContentUris.withAppendedId(mBaseUri, ids[0]), values, - null, null); - } - - logger.debug("Update contact " + number + " with request: " + values); - return mResolver.update(mBaseUri, values, getWhereClauseForIds(ids), - getWhereArgsForIds(ids)); - } - } - - /** - * Get the EABProvider URI for the contact with the given ID. - * - * @hide - */ - public Uri getContactUri(long id) { - return ContentUris.withAppendedId(mBaseUri, id); - } - - /** - * Get a parameterized SQL WHERE clause to select a bunch of IDs. - */ - static String getWhereClauseForIds(long[] ids) { - StringBuilder whereClause = new StringBuilder(); - whereClause.append("("); - for (int i = 0; i < ids.length; i++) { - if (i > 0) { - whereClause.append("OR "); - } - whereClause.append(COLUMN_ID); - whereClause.append(" = ? "); - } - whereClause.append(")"); - return whereClause.toString(); - } - - /** - * Get the selection args for a clause returned by {@link #getWhereClauseForIds(long[])}. - */ - static String[] getWhereArgsForIds(long[] ids) { - String[] whereArgs = new String[ids.length]; - for (int i = 0; i < ids.length; i++) { - whereArgs[i] = Long.toString(ids[i]); - } - return whereArgs; - } - - static String getTimeString(long time) { - if (time <= 0) { - time = System.currentTimeMillis(); - } - - Time tobj = new Time(); - tobj.set(time); - return String.format("%s.%s", tobj.format("%m-%d %H:%M:%S"), time % 1000); - } - - /** - * This class wraps a cursor returned by EABProvider -- the "underlying cursor" -- and - * presents a different set of columns, those defined in the COLUMN_* constants. - * Some columns correspond directly to underlying values while others are computed from - * underlying data. - */ - private static class CursorTranslator extends CursorWrapper { - private Uri mBaseUri; - - public CursorTranslator(Cursor cursor, Uri baseUri) { - super(cursor); - mBaseUri = baseUri; - } - - @Override - public int getInt(int columnIndex) { - return (int) getLong(columnIndex); - } - - @Override - public long getLong(int columnIndex) { - return super.getLong(columnIndex); - } - - @Override - public String getString(int columnIndex) { - return super.getString(columnIndex); - } - } - - public void updateAllCapabilityToUnknown() { - if (mResolver == null) { - logger.error("updateAllCapabilityToUnknown, mResolver=null"); - return; - } - - ContentValues values = new ContentValues(); - values.put(Contacts.Impl.CONTACT_LAST_UPDATED_TIMESTAMP, (String)null); - values.put(Contacts.Impl.VOLTE_CALL_SERVICE_CONTACT_ADDRESS, (String)null); - values.put(Contacts.Impl.VOLTE_CALL_CAPABILITY, (String)null); - values.put(Contacts.Impl.VOLTE_CALL_CAPABILITY_TIMESTAMP, (String)null); - values.put(Contacts.Impl.VOLTE_CALL_AVAILABILITY, (String)null); - values.put(Contacts.Impl.VOLTE_CALL_AVAILABILITY_TIMESTAMP, (String)null); - - values.put(Contacts.Impl.VIDEO_CALL_SERVICE_CONTACT_ADDRESS, (String)null); - values.put(Contacts.Impl.VIDEO_CALL_CAPABILITY, (String)null); - values.put(Contacts.Impl.VIDEO_CALL_CAPABILITY_TIMESTAMP, (String)null); - values.put(Contacts.Impl.VIDEO_CALL_AVAILABILITY, (String)null); - values.put(Contacts.Impl.VIDEO_CALL_AVAILABILITY_TIMESTAMP, (String)null); - - try { - int count = ContactDbUtil.resetVtCapability(mResolver); - logger.print("update Contact DB: updateAllCapabilityToUnknown count=" + count); - - count = mResolver.update(Contacts.Impl.CONTENT_URI, - values, null, null); - logger.print("update EAB DB: updateAllCapabilityToUnknown count=" + count); - } catch (Exception ex) { - logger.error("updateAllCapabilityToUnknown exception: " + ex); - } - } - - public void updateAllVtCapabilityToUnknown() { - if (mResolver == null) { - logger.error("updateAllVtCapabilityToUnknown mResolver=null"); - return; - } - - ContentValues values = new ContentValues(); - values.put(Contacts.Impl.CONTACT_LAST_UPDATED_TIMESTAMP, (String)null); - values.put(Contacts.Impl.VIDEO_CALL_SERVICE_CONTACT_ADDRESS, (String)null); - values.put(Contacts.Impl.VIDEO_CALL_CAPABILITY, (String)null); - values.put(Contacts.Impl.VIDEO_CALL_CAPABILITY_TIMESTAMP, (String)null); - values.put(Contacts.Impl.VIDEO_CALL_AVAILABILITY, (String)null); - values.put(Contacts.Impl.VIDEO_CALL_AVAILABILITY_TIMESTAMP, (String)null); - - try { - int count = ContactDbUtil.resetVtCapability(mResolver); - logger.print("update Contact DB: updateAllVtCapabilityToUnknown count=" + count); - - count = mResolver.update(Contacts.Impl.CONTENT_URI, - values, null, null); - logger.print("update EAB DB: updateAllVtCapabilityToUnknown count=" + count); - } catch (Exception ex) { - logger.error("updateAllVtCapabilityToUnknown exception: " + ex); - } - } - - // if updateLastTimestamp is true, the rcsPresenceInfo is from network. - // if the updateLastTimestamp is false, It is used to update the availabilty to unknown only. - // And the availability will be updated only when it has expired, so we don't update the - // timestamp to make sure the availablity still in expired status and will be subscribed from - // network afterwards. - public int update(RcsPresenceInfo rcsPresenceInfo, boolean updateLastTimestamp) { - if (rcsPresenceInfo == null) { - return 0; - } - - String number = rcsPresenceInfo.getContactNumber(); - if (TextUtils.isEmpty(number)) { - logger.error("Failed to update for the contact number is empty."); - return 0; - } - - ContentValues values = new ContentValues(); - - int volteStatus = rcsPresenceInfo.getVolteStatus(); - if(volteStatus != RcsPresenceInfo.VolteStatus.VOLTE_UNKNOWN) { - values.put(Contacts.Impl.VOLTE_STATUS, volteStatus); - } - - if(updateLastTimestamp){ - values.put(Contacts.Impl.CONTACT_LAST_UPDATED_TIMESTAMP, - (long)System.currentTimeMillis()); - } - - int lteCallCapability = rcsPresenceInfo.getServiceState( - RcsPresenceInfo.ServiceType.VOLTE_CALL); - long lteCallTimestamp = rcsPresenceInfo.getTimeStamp( - RcsPresenceInfo.ServiceType.VOLTE_CALL); - values.put(Contacts.Impl.VOLTE_CALL_AVAILABILITY, lteCallCapability); - values.put(Contacts.Impl.VOLTE_CALL_AVAILABILITY_TIMESTAMP, (long)lteCallTimestamp); - if(rcsPresenceInfo.getServiceState(RcsPresenceInfo.ServiceType.VOLTE_CALL) - != RcsPresenceInfo.ServiceState.UNKNOWN){ - String lteCallContactAddress = - rcsPresenceInfo.getServiceContact(RcsPresenceInfo.ServiceType.VOLTE_CALL); - if (!TextUtils.isEmpty(lteCallContactAddress)) { - values.put(Contacts.Impl.VOLTE_CALL_SERVICE_CONTACT_ADDRESS, lteCallContactAddress); - } - - values.put(Contacts.Impl.VOLTE_CALL_CAPABILITY, lteCallCapability); - values.put(Contacts.Impl.VOLTE_CALL_CAPABILITY_TIMESTAMP, lteCallTimestamp); - } - - int videoCallCapability = rcsPresenceInfo.getServiceState( - RcsPresenceInfo.ServiceType.VT_CALL); - long videoCallTimestamp = rcsPresenceInfo.getTimeStamp( - RcsPresenceInfo.ServiceType.VT_CALL); - values.put(Contacts.Impl.VIDEO_CALL_AVAILABILITY, videoCallCapability); - values.put(Contacts.Impl.VIDEO_CALL_AVAILABILITY_TIMESTAMP, (long)videoCallTimestamp); - if(rcsPresenceInfo.getServiceState(RcsPresenceInfo.ServiceType.VT_CALL) - != RcsPresenceInfo.ServiceState.UNKNOWN){ - String videoCallContactAddress = - rcsPresenceInfo.getServiceContact(RcsPresenceInfo.ServiceType.VT_CALL); - if (!TextUtils.isEmpty(videoCallContactAddress)) { - values.put(Contacts.Impl.VIDEO_CALL_SERVICE_CONTACT_ADDRESS, - videoCallContactAddress); - } - - values.put(Contacts.Impl.VIDEO_CALL_CAPABILITY, videoCallCapability); - values.put(Contacts.Impl.VIDEO_CALL_CAPABILITY_TIMESTAMP, videoCallTimestamp); - } - - int count = 0; - try{ - count = ContactDbUtil.updateVtCapability(mResolver, number, - (videoCallCapability == RcsPresenceInfo.ServiceState.ONLINE)); - logger.print("update rcsPresenceInfo to Contact DB, count=" + count); - - count = mResolver.update(Contacts.Impl.CONTENT_URI, values, - "PHONE_NUMBERS_EQUAL(contact_number, ?, 0)", new String[] {number}); - logger.print("update rcsPresenceInfo to EAB: update count=" + count + - " rcsPresenceInfo=" + rcsPresenceInfo); - }catch(Exception e){ - logger.error("updateCapability exception", e); - } - - return count; - } -} - diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/EABDbUtil.java b/rcs/presencepolling/src/com/android/service/ims/presence/EABDbUtil.java deleted file mode 100644 index 8e851dc4..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/EABDbUtil.java +++ /dev/null @@ -1,428 +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 static com.android.service.ims.presence.AccountUtil.ACCOUNT_TYPE; - -import java.util.ArrayList; -import java.util.List; - -import android.content.ContentProviderOperation; -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Context; -import android.content.OperationApplicationException; -import android.database.Cursor; -import android.database.sqlite.SQLiteException; -import android.os.RemoteException; -import android.provider.ContactsContract; -import android.provider.ContactsContract.Contacts; -import android.provider.ContactsContract.Data; -import android.provider.ContactsContract.CommonDataKinds.Phone; - -import com.android.ims.internal.ContactNumberUtils; -import com.android.ims.internal.EABContract; -import com.android.ims.internal.Logger; - -public class EABDbUtil { - static private Logger logger = Logger.getLogger("EABDbUtil"); - - public static boolean validateAndSyncFromContactsDb(Context context) { - logger.debug("Enter validateAndSyncFromContactsDb"); - boolean response = true; - // Get the last stored contact changed timestamp and sync only delta contacts. - long contactLastChange = SharedPrefUtil.getLastContactChangedTimestamp(context, 0); - logger.debug("contact last updated time before init :" + contactLastChange); - ContentResolver contentResolver = context.getContentResolver(); - String[] projection = new String[] { ContactsContract.Contacts._ID, - ContactsContract.Contacts.HAS_PHONE_NUMBER, - ContactsContract.Contacts.DISPLAY_NAME, - ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP }; - String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + "> '0' AND " - + ContactsContract.Contacts.CONTACT_LAST_UPDATED_TIMESTAMP - + " >'" + contactLastChange + "'"; - String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " asc"; - Cursor cursor = contentResolver.query(Contacts.CONTENT_URI, projection, selection, - null, sortOrder); - ArrayList<PresenceContact> allEligibleContacts = new ArrayList<PresenceContact>(); - - logger.debug("cursor count : " + cursor.getCount()); - if (cursor.moveToFirst()) { - do { - String id = cursor.getString(cursor.getColumnIndex(Contacts._ID)); - Long time = cursor.getLong(cursor.getColumnIndex( - Contacts.CONTACT_LAST_UPDATED_TIMESTAMP)); - // Update the latest contact last modified timestamp. - if (contactLastChange < time) { - contactLastChange = time; - } - String[] commonDataKindsProjection = new String[] { - ContactsContract.CommonDataKinds.Phone.NUMBER, - ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, - ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID, - ContactsContract.CommonDataKinds.Phone.CONTACT_ID }; - Cursor pCur = contentResolver.query( - ContactsContract.CommonDataKinds.Phone.CONTENT_URI, - commonDataKindsProjection, - ContactsContract.CommonDataKinds.Phone.CONTACT_ID - + " = ?", new String[] { id }, null); - ArrayList<String> phoneNumList = new ArrayList<String>(); - - if (pCur.moveToFirst()) { - do { - String contactNumber = pCur.getString(pCur.getColumnIndex( - ContactsContract.CommonDataKinds.Phone.NUMBER)); - //contactNumber = filterEligibleContact(context, pContactNumber); - if (validateEligibleContact(context, contactNumber)) { - String contactName = pCur.getString(pCur.getColumnIndex( - ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); - String rawContactId = pCur.getString(pCur.getColumnIndex( - ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID)); - String contactId = pCur.getString(pCur.getColumnIndex( - ContactsContract.CommonDataKinds.Phone.CONTACT_ID)); - // TODO: HACK - To be resolved as part of EAB Provider rework. - if (phoneNumList.contains(contactNumber)) continue; - phoneNumList.add(contactNumber); - - String dataId = getDataId(contentResolver,rawContactId, contactNumber); - if (null != dataId) { - allEligibleContacts.add(new PresenceContact(contactName, - contactNumber, rawContactId, contactId, dataId)); - logger.debug("Eligible List Name: " + contactName + - " Number:" + contactNumber + - " RawContactID: " + rawContactId + - " contactId: " + contactId + " Data.ID : " + dataId); - } else { - logger.debug("dataId is null. Don't add contact to " + - "allEligibleContacts."); - } - } - } while (pCur.moveToNext()); - } - pCur.close(); - } while (cursor.moveToNext()); - } - if (null != cursor) { - cursor.close(); - } - if (allEligibleContacts.size() > 0) { - logger.debug("Adding : " + allEligibleContacts.size() + - " new contact numbers to EAB db."); - addContactsToEabDb(context, allEligibleContacts); - logger.debug("contact last updated time after init :" + contactLastChange); - SharedPrefUtil.saveLastContactChangedTimestamp(context, contactLastChange); - SharedPrefUtil.saveLastContactDeletedTimestamp(context, contactLastChange); - } - logger.debug("Exit validateAndSyncFromContactsDb contact numbers synced : " + - allEligibleContacts.size()); - return response; - } - - private static String getDataId(ContentResolver contentResolver, - String rawContactId, String pContactNumber) { - String dataId = null; - String where = Data.RAW_CONTACT_ID + " = '" + rawContactId + "' AND " - + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'" - + " AND " + Data.DATA1 + "='" + pContactNumber + "'"; - Cursor cur = null; - try { - cur = contentResolver.query(Data.CONTENT_URI, - new String[] { Data._ID }, where, null, null); - if (cur.moveToFirst()) { - dataId = cur.getString(cur.getColumnIndex(Data._ID)); - } - } catch (SQLiteException e) { - logger.debug("SQLiteException while querying for dataId : " + e.toString()); - } catch (Exception e) { - logger.debug("Exception while querying for dataId : " + e); - } finally { - if (null != cur) { - cur.close(); - } - } - return dataId; - } - - public static void addContactsToEabDb(Context context, - ArrayList<PresenceContact> contactList) { - ArrayList<ContentProviderOperation> operation = new ArrayList<ContentProviderOperation>(); - - logger.debug("Adding Contacts to EAB DB"); - // To avoid the following exception - Too many content provider operations - // between yield points. The maximum number of operations per yield point is - // 500 for exceuteDB() - int yieldPoint = 300; - for (int j = 0; j < contactList.size(); j++) { - addContactToEabDb(context, operation, contactList.get(j).getDisplayName(), - contactList.get(j).getPhoneNumber(), contactList.get(j).getRawContactId(), - contactList.get(j).getContactId(), contactList.get(j).getDataId()); - if (yieldPoint == j) { - exceuteDB(context, operation); - operation = null; - operation = new ArrayList<ContentProviderOperation>(); - yieldPoint += 300; - } - } - exceuteDB(context, operation); - } - - private static void addContactToEabDb( - Context context, ArrayList<ContentProviderOperation> ops, String displayName, - String phoneNumber, String rawContactId, String contactId, - String dataId) { - ops.add(ContentProviderOperation - .newInsert(EABContract.EABColumns.CONTENT_URI) - .withValue(EABContract.EABColumns.CONTACT_NAME, displayName) - .withValue(EABContract.EABColumns.CONTACT_NUMBER, phoneNumber) - .withValue(EABContract.EABColumns.ACCOUNT_TYPE, ACCOUNT_TYPE) - .withValue(EABContract.EABColumns.RAW_CONTACT_ID, rawContactId) - .withValue(EABContract.EABColumns.CONTACT_ID, contactId) - .withValue(EABContract.EABColumns.DATA_ID, dataId).build()); - } - - public static void deleteContactsFromEabDb(Context context, - ArrayList<PresenceContact> contactList) { - ArrayList<ContentProviderOperation> operation = new ArrayList<ContentProviderOperation>(); - - logger.debug("Deleting Contacts from EAB DB"); - String[] contactIdList = new String[contactList.size()]; - // To avoid the following exception - Too many content provider operations - // between yield points. The maximum number of operations per yield point is - // 500 for exceuteDB() - int yieldPoint = 300; - for (int j = 0; j < contactList.size(); j++) { - contactIdList[j] = contactList.get(j).getContactId().toString(); - deleteContactFromEabDb(context, operation, contactIdList[j]); - if (yieldPoint == j) { - exceuteDB(context, operation); - operation = null; - operation = new ArrayList<ContentProviderOperation>(); - yieldPoint += 300; - } - } - exceuteDB(context, operation); - } - - private static void deleteContactFromEabDb(Context context, - ArrayList<ContentProviderOperation> ops, String contactId) { - // Add operation only if there is an entry in EABProvider table. - String[] eabProjection = new String[] { - EABContract.EABColumns.CONTACT_NUMBER, - EABContract.EABColumns.CONTACT_ID }; - String eabWhereClause = null; - if (ContactsContract.Profile.MIN_ID == Long.valueOf(contactId)) { - eabWhereClause = EABContract.EABColumns.CONTACT_ID + " >='" + contactId + "'"; - } else { - eabWhereClause = EABContract.EABColumns.CONTACT_ID + " ='" + contactId + "'"; - } - Cursor eabDeleteCursor = context.getContentResolver().query( - EABContract.EABColumns.CONTENT_URI, eabProjection, - eabWhereClause, null, null); - if (null != eabDeleteCursor) { - int count = eabDeleteCursor.getCount(); - logger.debug("cursor count : " + count); - if (count > 0) { - eabDeleteCursor.moveToNext(); - long eabDeleteContactId = eabDeleteCursor. - getLong(eabDeleteCursor.getColumnIndex(EABContract.EABColumns.CONTACT_ID)); - logger.debug("eabDeleteContactId : " + eabDeleteContactId); - if (ContactsContract.Profile.MIN_ID == Long.valueOf(contactId)) { - if (ContactsContract.isProfileId(eabDeleteContactId)) { - logger.debug("Deleting Profile contact."); - ops.add(ContentProviderOperation - .newDelete(EABContract.EABColumns.CONTENT_URI) - .withSelection(EABContract.EABColumns.CONTACT_ID + " >= ?", - new String[] { contactId }).build()); - } else { - logger.debug("Not a Profile contact. Do nothing."); - } - } else { - ops.add(ContentProviderOperation - .newDelete(EABContract.EABColumns.CONTENT_URI) - .withSelection(EABContract.EABColumns.CONTACT_ID + " = ?", - new String[] { contactId }).build()); - } - } - eabDeleteCursor.close(); - } - - } - - public static void deleteNumbersFromEabDb(Context context, - ArrayList<PresenceContact> contactList) { - ArrayList<ContentProviderOperation> operation = new ArrayList<ContentProviderOperation>(); - - logger.debug("Deleting Number from EAB DB"); - String[] rawContactIdList = new String [contactList.size()]; - String[] DataIdList = new String [contactList.size()]; - // To avoid the following exception - Too many content provider operations - // between yield points. The maximum number of operations per yield point is - // 500 for exceuteDB() - int yieldPoint = 300; - for (int j = 0; j < contactList.size(); j++) { - rawContactIdList[j] = contactList.get(j).getRawContactId(); - DataIdList[j] = contactList.get(j).getDataId(); - deleteNumberFromEabDb(context, operation, rawContactIdList[j], DataIdList[j]); - if (yieldPoint == j) { - exceuteDB(context, operation); - operation = null; - operation = new ArrayList<ContentProviderOperation>(); - yieldPoint += 300; - } - } - exceuteDB(context, operation); - } - - private static void deleteNumberFromEabDb(Context context, - ArrayList<ContentProviderOperation> ops, String rawContactId, String dataId) { - // Add operation only if there is an entry in EABProvider table. - String[] eabProjection = new String[] { - EABContract.EABColumns.CONTACT_NUMBER }; - String eabWhereClause = EABContract.EABColumns.RAW_CONTACT_ID + " ='" + rawContactId - + "' AND " + EABContract.EABColumns.DATA_ID + " ='" + dataId + "'"; - Cursor eabDeleteCursor = context.getContentResolver().query( - EABContract.EABColumns.CONTENT_URI, eabProjection, - eabWhereClause, null, null); - if (null != eabDeleteCursor) { - int count = eabDeleteCursor.getCount(); - logger.debug("Delete number cursor count : " + count); - if (count > 0) { - ops.add(ContentProviderOperation.newDelete(EABContract.EABColumns.CONTENT_URI) - .withSelection(EABContract.EABColumns.RAW_CONTACT_ID + " = ? AND " - + EABContract.EABColumns.DATA_ID + " = ?", - new String[] { rawContactId, dataId }).build()); - } - eabDeleteCursor.close(); - } - } - - public static void updateNamesInEabDb(Context context, - ArrayList<PresenceContact> contactList) { - ArrayList<ContentProviderOperation> operation = new ArrayList<ContentProviderOperation>(); - - logger.debug("Update name in EAB DB"); - String[] phoneNameList = new String[contactList.size()]; - String[] phoneNumberList = new String[contactList.size()]; - String[] rawContactIdList = new String [contactList.size()]; - String[] dataIdList = new String [contactList.size()]; - // To avoid the following exception - Too many content provider operations - // between yield points. The maximum number of operations per yield point is - // 500 for exceuteDB() - int yieldPoint = 300; - for (int j = 0; j < contactList.size(); j++) { - phoneNameList[j] = contactList.get(j).getDisplayName(); - phoneNumberList[j] = contactList.get(j).getPhoneNumber(); - rawContactIdList[j] = contactList.get(j).getRawContactId(); - dataIdList[j] = contactList.get(j).getDataId(); - updateNameInEabDb(context, operation, phoneNameList[j], - phoneNumberList[j], rawContactIdList[j], dataIdList[j]); - if (yieldPoint == j) { - exceuteDB(context, operation); - operation = null; - operation = new ArrayList<ContentProviderOperation>(); - yieldPoint += 300; - } - } - exceuteDB(context, operation); - } - - private static void updateNameInEabDb(Context context, - ArrayList<ContentProviderOperation> ops, String phoneName, - String phoneNumber, String rawContactId, String dataId) { - ContentValues values = new ContentValues(); - values.put(EABContract.EABColumns.CONTACT_NAME, phoneName); - - String where = EABContract.EABColumns.CONTACT_NUMBER + " = ? AND " - + EABContract.EABColumns.RAW_CONTACT_ID + " = ? AND " - + EABContract.EABColumns.DATA_ID + " = ?"; - ops.add(ContentProviderOperation - .newUpdate(EABContract.EABColumns.CONTENT_URI) - .withValues(values) - .withSelection(where, new String[] { phoneNumber, rawContactId, dataId }).build()); - } - - private static void exceuteDB(Context context, ArrayList<ContentProviderOperation> ops) { - if (ops.size() == 0) { - logger.debug("exceuteDB return as operation size is 0."); - return; - } - try { - context.getContentResolver().applyBatch(EABContract.AUTHORITY, ops); - } catch (RemoteException e) { - e.printStackTrace(); - } catch (OperationApplicationException e) { - e.printStackTrace(); - } - ops.clear(); - logger.debug("exceuteDB return with successful operation."); - return; - } - - public static boolean validateEligibleContact(Context context, String mdn) { - boolean number = false; - if (null == mdn) { - logger.debug("validateEligibleContact - mdn is null."); - return number; - } - List<String> mdbList = new ArrayList<String>(); - mdbList.add(mdn); - ContactNumberUtils mNumberUtils = ContactNumberUtils.getDefault(); - mNumberUtils.setContext(context); - int numberType = mNumberUtils.validate(mdbList); - logger.debug("ContactNumberUtils.validate response : " + numberType); - if ( ContactNumberUtils.NUMBER_VALID == numberType) { - number = true; - } - logger.debug("Exiting validateEligibleContact with value : " + number); - return number; - } - - public static String filterEligibleContact(Context context, String mdn) { - String number = null; - if (null == mdn) { - logger.debug("filterEligibleContact - mdn is null."); - return number; - } - logger.debug("Before filterEligibleContact validation : " + mdn); - List<String> mdbList = new ArrayList<String>(); - mdbList.add(mdn); - ContactNumberUtils mNumberUtils = ContactNumberUtils.getDefault(); - mNumberUtils.setContext(context); - int numberType = mNumberUtils.validate(mdbList); - logger.debug("ContactNumberUtils.validate response : " + numberType); - if ( ContactNumberUtils.NUMBER_VALID == numberType) { - String[] mdnFormatted = mNumberUtils.format(mdbList); - if (mdnFormatted.length > 0 ){ - number = mdnFormatted[0]; - } - } - logger.debug("After filterEligibleContact validation / formatting : " + number); - return number; - } -} diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/EABProvider.java b/rcs/presencepolling/src/com/android/service/ims/presence/EABProvider.java deleted file mode 100644 index 651b1cd6..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/EABProvider.java +++ /dev/null @@ -1,453 +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 java.io.FileNotFoundException; - -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Intent; -import android.content.UriMatcher; -import android.database.Cursor; -import android.database.SQLException; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteQueryBuilder; -import android.net.Uri; -import android.os.ParcelFileDescriptor; -import android.provider.BaseColumns; -import android.provider.ContactsContract.Contacts; -import android.content.ComponentName; - -import com.android.ims.RcsPresenceInfo; -import com.android.ims.internal.EABContract; -import com.android.ims.internal.Logger; - -/** - * @author Vishal Patil (A22809) - */ - -public class EABProvider extends DatabaseContentProvider{ - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private static final String EAB_DB_NAME = "rcseab.db"; - - private static final int EAB_DB_VERSION = 2; - - private static final int EAB_TABLE = 1; - - private static final int EAB_TABLE_ID = 2; - - private static final int EAB_GROUPITEMS_TABLE = 3; - - private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH) { - { - addURI(EABContract.AUTHORITY, EABContract.EABColumns.TABLE_NAME, EAB_TABLE); - addURI(EABContract.AUTHORITY, EABContract.EABColumns.TABLE_NAME + "/#", EAB_TABLE_ID); - addURI(EABContract.AUTHORITY, EABContract.EABColumns.GROUPITEMS_NAME, - EAB_GROUPITEMS_TABLE); - } - }; - - /* Statement to create VMM Album table. */ - private static final String EAB_CREATE_STATEMENT = "create table if not exists " - + EABContract.EABColumns.TABLE_NAME - + "(" - + EABContract.EABColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " - + EABContract.EABColumns.CONTACT_NAME + " TEXT, " - + EABContract.EABColumns.CONTACT_NUMBER + " TEXT, " - + EABContract.EABColumns.RAW_CONTACT_ID + " TEXT, " - + EABContract.EABColumns.CONTACT_ID + " TEXT, " - + EABContract.EABColumns.DATA_ID + " TEXT, " - + EABContract.EABColumns.ACCOUNT_TYPE + " TEXT, " - + EABContract.EABColumns.VOLTE_CALL_SERVICE_CONTACT_ADDRESS + " TEXT, " - + EABContract.EABColumns.VOLTE_CALL_CAPABILITY + " INTEGER, " - + EABContract.EABColumns.VOLTE_CALL_CAPABILITY_TIMESTAMP + " LONG, " - + EABContract.EABColumns.VOLTE_CALL_AVAILABILITY + " INTEGER, " - + EABContract.EABColumns.VOLTE_CALL_AVAILABILITY_TIMESTAMP + " LONG, " - + EABContract.EABColumns.VIDEO_CALL_SERVICE_CONTACT_ADDRESS + " TEXT, " - + EABContract.EABColumns.VIDEO_CALL_CAPABILITY + " INTEGER, " - + EABContract.EABColumns.VIDEO_CALL_CAPABILITY_TIMESTAMP + " LONG, " - + EABContract.EABColumns.VIDEO_CALL_AVAILABILITY + " INTEGER, " - + EABContract.EABColumns.VIDEO_CALL_AVAILABILITY_TIMESTAMP + " LONG, " - + EABContract.EABColumns.CONTACT_LAST_UPDATED_TIMESTAMP + " LONG " - + ");"; - - private static final String EAB_DROP_STATEMENT = "drop table if exists " - + EABContract.EABColumns.TABLE_NAME + ";"; - - public EABProvider() { - super(EAB_DB_NAME, EAB_DB_VERSION); - } - - @Override - public void bootstrapDatabase(SQLiteDatabase db) { - logger.info("Enter: bootstrapDatabase() Creating new EAB database"); - upgradeDatabase(db, 0, EAB_DB_VERSION); - logger.info("Exit: bootstrapDatabase()"); - } - - /* - * In upgradeDatabase, - * oldVersion - the current version of Provider on the phone. - * newVersion - the version of Provider where the phone will be upgraded to. - */ - @Override - public boolean upgradeDatabase(SQLiteDatabase db, int oldVersion, int newVersion) { - logger.debug("Enter: upgradeDatabase() - oldVersion = " + oldVersion + - " newVersion = " + newVersion); - - if (oldVersion == newVersion) { - logger.debug("upgradeDatabase oldVersion == newVersion, No Upgrade Required"); - return true; - } - - try { - if (oldVersion == 0) { - db.execSQL(EAB_CREATE_STATEMENT); - - oldVersion++; - logger.debug("upgradeDatabase : DB has been upgraded to " + oldVersion); - } - if (oldVersion == 1) { - addColumn(db, EABContract.EABColumns.TABLE_NAME, - EABContract.EABColumns.VOLTE_STATUS, "INTEGER NOT NULL DEFAULT -1"); - - oldVersion++; - logger.debug("upgradeDatabase : DB has been upgraded to " + oldVersion); - } - } catch (SQLException exception) { - logger.error("Exception during upgradeDatabase. " + exception.getMessage()); - // DB file had problem - throw new InvalidDBException(); - } - - // add further upgrade code above this - if (oldVersion == newVersion) { - logger.debug("DB upgrade complete : to " + newVersion); - } - - logger.debug("Exit: upgradeDatabase()"); - return true; - } - - @Override - protected boolean downgradeDatabase(SQLiteDatabase db, int oldVersion, int newVersion) { - // throwing the custom created Exception to catch it in - // getWritableDatabase or getReadableDatabase - throw new InvalidDBException(); - } - - @Override - protected int deleteInternal(SQLiteDatabase db, Uri uri, String selection, - String[] selectionArgs) { - logger.info("Enter: deleteInternal()"); - final int match = URI_MATCHER.match(uri); - String table = null; - switch (match) { - case EAB_TABLE_ID: - if (selection == null) { - selection = "_id=?"; - selectionArgs = new String[] {uri.getPathSegments().get(1)}; - } - case EAB_TABLE: - table = EABContract.EABColumns.TABLE_NAME; - break; - default: - logger.info("No match for " + uri); - logger.info("Exit: deleteInternal()"); - return 0; - } - logger.debug("Deleting from the table" + table + " selection= " + selection); - printDeletingValues(uri, selection, selectionArgs); - logger.info("Exit: deleteInternal()"); - return db.delete(table, selection, selectionArgs); - } - - @Override - protected Uri insertInternal(SQLiteDatabase db, Uri uri, ContentValues values) { - logger.info("Enter: insertInternal()"); - final int match = URI_MATCHER.match(uri); - String table = null; - String nullColumnHack = null; - switch (match) { - case EAB_TABLE: - table = EABContract.EABColumns.TABLE_NAME; - break; - default: - logger.warn("No match for " + uri); - logger.info("Exit: insertInternal() with null"); - return null; - } - values = verifyIfMdnExists(values); - // Do the insert. - logger.debug("Inserting to the table" + table + " values=" + values.toString()); - - final long id = db.insert(table, nullColumnHack, values); - if (id > 0) { - String contactNumber = values.getAsString(EABContract.EABColumns.CONTACT_NUMBER); - sendInsertBroadcast(contactNumber); - logger.info("Exit: insertInternal()"); - return ContentUris.withAppendedId(uri, id); - } else { - logger.info("Exit: insertInternal() with null"); - return null; - } - } - - @Override - protected Cursor queryInternal(SQLiteDatabase db, Uri uri, String[] projection, - String selection, String[] selectionArgs, String sortOrder) { - logger.info("Enter: queryInternal()"); - final int match = URI_MATCHER.match(uri); - - switch (match) { - case EAB_TABLE_ID: - long id = ContentUris.parseId(uri); - logger.debug("queryInternal id=" + id); - String idSelection = BaseColumns._ID + "=" + id; - if(null != selection) { - selection = "((" + idSelection + ") AND (" + selection + "))"; - } else { - selection = idSelection; - } - break; - case EAB_GROUPITEMS_TABLE: - SQLiteQueryBuilder sqb = new SQLiteQueryBuilder(); - sqb.setTables(EABContract.EABColumns.TABLE_NAME); - String rawquery = "select DISTINCT " + EABContract.EABColumns.CONTACT_ID - + " from " + EABContract.EABColumns.TABLE_NAME - + " where " + EABContract.EABColumns.VOLTE_CALL_CAPABILITY + " >'" + - RcsPresenceInfo.ServiceState.OFFLINE+"' AND " - + EABContract.EABColumns.VIDEO_CALL_CAPABILITY + " >'" - + RcsPresenceInfo.ServiceState.OFFLINE + "'"; - StringBuffer sb = new StringBuffer(); - Cursor cursor = db.rawQuery(rawquery, null); - if (cursor != null && cursor.moveToFirst()) { - do { - if (sb.length() != 0) sb.append(","); - String contactId = cursor.getString(cursor - .getColumnIndex(EABContract.EABColumns.CONTACT_ID)); - sb.append(contactId); - } while (cursor.moveToNext()); - } - if (cursor != null) cursor.close(); - String contactSel = Contacts._ID + " IN ( " + sb.toString() + ")"; - return getContext().getContentResolver().query(Contacts.CONTENT_URI, projection, - contactSel, null, sortOrder); - } - - SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); - - String groupBy = uri.getQueryParameter("groupby"); - String having = null; - - switch (match) { - case EAB_TABLE: - case EAB_TABLE_ID: - qb.setTables(EABContract.EABColumns.TABLE_NAME); - break; - default: - logger.warn("No match for " + uri); - logger.info("Exit: queryInternal()"); - return null; - } - logger.info("Exit: queryInternal()"); - return qb.query(db, projection, selection, selectionArgs, groupBy, having, sortOrder); - } - - @Override - protected int updateInternal(SQLiteDatabase db, Uri uri, ContentValues values, - String selection, String[] selectionArgs) { - logger.info("Enter: updateInternal()"); - int result = 0; - final int match = URI_MATCHER.match(uri); - - switch (match) { - case EAB_TABLE_ID: - long id = ContentUris.parseId(uri); - logger.debug("updateInternal id=" + id); - String idSelection = BaseColumns._ID + "=" + id; - if(null != selection){ - selection = "((" + idSelection + ") AND (" + selection + "))"; - } else { - selection = idSelection; - } - break; - } - - String table = null; - switch (match) { - case EAB_TABLE: - case EAB_TABLE_ID: - table = EABContract.EABColumns.TABLE_NAME; - break; - default: - logger.warn("No match for " + uri); - break; - } - - if (table != null && values != null) { - logger.debug("Updating the table " + table + " values= " + values.toString()); - result = db.update(table, values, selection, selectionArgs); - } - logger.info("Exit: updateInternal()"); - return result; - } - - @Override - public String getType(Uri uri) { - logger.info("Enter: getType()"); - final int match = URI_MATCHER.match(uri); - switch (match) { - case EAB_TABLE: - return EABContract.EABColumns.CONTENT_TYPE; - case EAB_TABLE_ID: - return EABContract.EABColumns.CONTENT_ITEM_TYPE; - default: - throw (new IllegalArgumentException("EABProvider URI: " + uri)); - } - } - - @Override - public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { - return null; - } - - private void sendInsertBroadcast(String contactNumber) { - Intent intent = new Intent(com.android.service.ims.presence.Contacts - .ACTION_NEW_CONTACT_INSERTED); - ComponentName component = new ComponentName("com.android.service.ims.presence", - "com.android.service.ims.presence.AlarmBroadcastReceiver"); - intent.setComponent(component); - - intent.putExtra(com.android.service.ims.presence.Contacts.NEW_PHONE_NUMBER, contactNumber); - getContext().sendBroadcast(intent); - } - - private ContentValues verifyIfMdnExists(ContentValues cvalues) { - String phoneNumber = null; - if (cvalues.containsKey(EABContract.EABColumns.CONTACT_NUMBER)) { - phoneNumber = cvalues.getAsString(EABContract.EABColumns.CONTACT_NUMBER); - } else { - return cvalues; - } - if (null == phoneNumber) { - return cvalues; - } - String[] projection = new String[] { - EABContract.EABColumns.VOLTE_CALL_SERVICE_CONTACT_ADDRESS, - EABContract.EABColumns.VOLTE_CALL_CAPABILITY, - EABContract.EABColumns.VOLTE_CALL_CAPABILITY_TIMESTAMP, - EABContract.EABColumns.VOLTE_CALL_AVAILABILITY, - EABContract.EABColumns.VOLTE_CALL_AVAILABILITY_TIMESTAMP, - EABContract.EABColumns.VIDEO_CALL_SERVICE_CONTACT_ADDRESS, - EABContract.EABColumns.VIDEO_CALL_CAPABILITY, - EABContract.EABColumns.VIDEO_CALL_CAPABILITY_TIMESTAMP, - EABContract.EABColumns.VIDEO_CALL_AVAILABILITY, - EABContract.EABColumns.VIDEO_CALL_AVAILABILITY_TIMESTAMP}; - String whereClause = "PHONE_NUMBERS_EQUAL(" + - EABContract.EABColumns.CONTACT_NUMBER + ", ?, 0)"; - String[] selectionArgs = new String[] { phoneNumber }; - Cursor cursor = getContext().getContentResolver().query(EABContract.EABColumns.CONTENT_URI, - projection, whereClause, selectionArgs, null); - if ((null != cursor) && (cursor.getCount() > 0)) { - logger.debug("Number : " + phoneNumber + - " is already stored in EAB DB - cursor count is " + cursor.getCount()); - logger.error("Inserting another copy of MDN to EAB DB."); - // Update data only from first cursor element. - cursor.moveToNext(); - cvalues.put(EABContract.EABColumns.VOLTE_CALL_SERVICE_CONTACT_ADDRESS, - cursor.getString(cursor. - getColumnIndex(EABContract.EABColumns.VOLTE_CALL_SERVICE_CONTACT_ADDRESS))); - cvalues.put(EABContract.EABColumns.VOLTE_CALL_CAPABILITY, cursor.getString(cursor - .getColumnIndex(EABContract.EABColumns.VOLTE_CALL_CAPABILITY))); - cvalues.put(EABContract.EABColumns.VOLTE_CALL_CAPABILITY_TIMESTAMP, - cursor.getLong(cursor - .getColumnIndex(EABContract.EABColumns.VOLTE_CALL_CAPABILITY_TIMESTAMP))); - cvalues.put(EABContract.EABColumns.VOLTE_CALL_AVAILABILITY, cursor.getString(cursor - .getColumnIndex(EABContract.EABColumns.VOLTE_CALL_AVAILABILITY))); - cvalues.put(EABContract.EABColumns.VOLTE_CALL_AVAILABILITY_TIMESTAMP, - cursor.getLong(cursor - .getColumnIndex(EABContract.EABColumns.VOLTE_CALL_AVAILABILITY_TIMESTAMP))); - cvalues.put(EABContract.EABColumns.VIDEO_CALL_SERVICE_CONTACT_ADDRESS, - cursor.getString(cursor - .getColumnIndex(EABContract.EABColumns.VIDEO_CALL_SERVICE_CONTACT_ADDRESS))); - cvalues.put(EABContract.EABColumns.VIDEO_CALL_CAPABILITY, cursor.getString(cursor - .getColumnIndex(EABContract.EABColumns.VIDEO_CALL_CAPABILITY))); - cvalues.put(EABContract.EABColumns.VIDEO_CALL_CAPABILITY_TIMESTAMP, - cursor.getLong(cursor - .getColumnIndex(EABContract.EABColumns.VIDEO_CALL_CAPABILITY_TIMESTAMP))); - cvalues.put(EABContract.EABColumns.VIDEO_CALL_AVAILABILITY, cursor.getString(cursor - .getColumnIndex(EABContract.EABColumns.VIDEO_CALL_AVAILABILITY))); - cvalues.put(EABContract.EABColumns.VIDEO_CALL_AVAILABILITY_TIMESTAMP, - cursor.getLong(cursor - .getColumnIndex(EABContract.EABColumns.VIDEO_CALL_AVAILABILITY_TIMESTAMP))); - cvalues.put(EABContract.EABColumns.CONTACT_LAST_UPDATED_TIMESTAMP, 0); - } - if (null != cursor) { - cursor.close(); - } - return cvalues; - } - - private void printDeletingValues(Uri uri, String selection, String[] selectionArgs) { - String[] projection = new String[] { - EABContract.EABColumns.CONTACT_NUMBER, - EABContract.EABColumns.CONTACT_NAME, - EABContract.EABColumns.RAW_CONTACT_ID, - EABContract.EABColumns.CONTACT_ID, - EABContract.EABColumns.DATA_ID}; - Cursor cursor = getContext().getContentResolver().query(EABContract.EABColumns.CONTENT_URI, - projection, selection, selectionArgs, null); - if ((null != cursor) && (cursor.getCount() > 0)) { - logger.debug("Before deleting the cursor count is " + cursor.getCount()); - // Update data only from first cursor element. - while (cursor.moveToNext()) { - long dataId = cursor.getLong(cursor.getColumnIndex( - EABContract.EABColumns.DATA_ID)); - long contactId = cursor.getLong(cursor.getColumnIndex( - EABContract.EABColumns.CONTACT_ID)); - long rawContactId = cursor.getLong(cursor.getColumnIndex( - EABContract.EABColumns.RAW_CONTACT_ID)); - String phoneNumber = cursor.getString(cursor.getColumnIndex( - EABContract.EABColumns.CONTACT_NUMBER)); - String displayName = cursor.getString(cursor.getColumnIndex( - EABContract.EABColumns.CONTACT_NAME)); - logger.debug("Deleting : dataId : " + dataId + " contactId :" + contactId + - " rawContactId :" + rawContactId + " phoneNumber :" + phoneNumber + - " displayName :" + displayName); - } - } else { - logger.error("cursor is null!"); - } - if (null != cursor) { - cursor.close(); - } - } -} diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/EABService.java b/rcs/presencepolling/src/com/android/service/ims/presence/EABService.java deleted file mode 100644 index e79293c5..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/EABService.java +++ /dev/null @@ -1,1142 +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 java.util.ArrayList; -import java.util.List; -import java.util.Calendar; - -import android.accounts.Account; -import android.app.Service; -import android.app.AlarmManager; -import android.app.PendingIntent; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.ComponentName; -import android.content.ServiceConnection; -import android.database.ContentObserver; -import android.database.Cursor; -import android.net.Uri; -import android.os.Bundle; -import android.os.Handler; -import android.os.HandlerThread; -import android.os.IBinder; -import android.os.Looper; -import android.os.Message; -import android.os.SystemProperties; -import android.provider.ContactsContract; -import android.provider.ContactsContract.CommonDataKinds.Phone; -import android.telephony.PhoneNumberUtils; -import android.text.TextUtils; - -import android.telephony.SubscriptionManager; -import com.android.ims.internal.EABContract; - -import com.android.ims.ImsConfig; -import com.android.ims.ImsManager; -import com.android.ims.ImsException; - -import com.android.ims.RcsManager; -import com.android.ims.RcsManager.ResultCode; -import com.android.ims.RcsPresence; -import com.android.ims.RcsException; -import com.android.ims.RcsPresenceInfo; -import com.android.ims.IRcsPresenceListener; -import com.android.ims.internal.Logger; - -public class EABService extends Service { - - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private Context mContext; - private Looper mServiceLooper = null; - private ServiceHandler mServiceHandler = null; - // Used to avoid any content observer processing during EABService - // initialisation as anyways it will check for Contact db changes as part of boot-up. - private boolean isEABServiceInitializing = true; - - private static final int BOOT_COMPLETED = 0; - private static final int CONTACT_TABLE_MODIFIED = 1; - private static final int CONTACT_PROFILE_TABLE_MODIFIED = 2; - private static final int EAB_RESET_CONTENT_OBSERVERS = 3; - - private static final int SYNC_COMPLETE_DELAY_TIMER = 3 * 1000; // 3 seconds. - private static final String VOLTE_NUMBER = "volte_number"; - private static final String VOLTE_NUMBER_STATE = "state"; - private static final String ACTION_EAB_RESET_CONTENT_OBSERVERS = - "com.android.rcs.eab.ACTION_EAB_RESET_CONTENT_OBSERVERS"; - - // Framework interface files. - private RcsManager mRcsManager = null; - private RcsPresence mRcsPresence = null; - - public EABService() { - super(); - logger.info("EAB Service constructed"); - } - - @Override - public IBinder onBind(Intent arg0) { - return null; - } - - /** - * When "clear data" is done for contact storage in system settings, EAB - * Provider must me cleared and PREF_KEY_CHANGE and PREF_KEY_DELETE keys - * should not cleared. - */ - private BroadcastReceiver mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - logger.debug("onReceive intent: " + action); - - if(ContactsContract.Intents.CONTACTS_DATABASE_CREATED.equals(action)) { - logger.debug("Contacts database created."); - // Delete all entries from EAB Provider as it has to be re-synced with Contact db. - mContext.getContentResolver().delete( - EABContract.EABColumns.CONTENT_URI, null, null); - // Initialise EABProvider. - logger.debug("Resetting timestamp values in shared pref."); - SharedPrefUtil.resetEABSharedPref(mContext); - // init the EAB db after re-setting. - ensureInitDone(); - } else if(Intent.ACTION_TIME_CHANGED.equals(action) || - Intent.ACTION_TIMEZONE_CHANGED.equals(action)) { - Calendar cal = Calendar.getInstance(); - long currentTimestamp = cal.getTimeInMillis(); - long lastChangedTimestamp = SharedPrefUtil.getLastContactChangedTimestamp( - mContext, currentTimestamp); - logger.debug("lastChangedTimestamp=" + lastChangedTimestamp + - " currentTimestamp=" + currentTimestamp); - // Changed time backwards. - if(lastChangedTimestamp > currentTimestamp) { - logger.debug("Resetting timestamp values in shared pref."); - SharedPrefUtil.resetEABSharedPref(mContext); - CapabilityPolling capabilityPolling = CapabilityPolling.getInstance(null); - if (capabilityPolling != null) { - capabilityPolling.enqueueDiscovery(CapabilityPolling.ACTION_POLLING_NORMAL); - } - } - } - } - }; - - private ContentObserver mContactChangedListener = null; - private class ContactChangedListener extends ContentObserver { - public ContactChangedListener() { - super(null); - } - - @Override - public boolean deliverSelfNotifications() { - return false; - } - - @Override - public void onChange(boolean selfChange) { - logger.debug("onChange for ContactChangedListener"); - sendDelayedContactChangeMsg(); - } - } - - private ContentObserver mContactProfileListener = null; - private class ContactProfileListener extends ContentObserver { - public ContactProfileListener() { - super(null); - } - - @Override - public boolean deliverSelfNotifications() { - return false; - } - - @Override - public void onChange(boolean selfChange) { - logger.debug("onChange for ContactProfileListener"); - sendDelayedContactProfileMsg(); - } - } - - @Override - public void onCreate() { - logger.debug("Enter : onCreate"); - mContext = getApplicationContext(); - HandlerThread thread = new HandlerThread("EABServiceHandler"); - thread.start(); - - mServiceLooper = thread.getLooper(); - if (mServiceLooper != null) { - mServiceHandler = new ServiceHandler(mServiceLooper); - } else { - logger.debug("mServiceHandler could not be initialized since looper is null"); - } - - IntentFilter filter = new IntentFilter(); - filter.addAction(ContactsContract.Intents.CONTACTS_DATABASE_CREATED); - filter.addAction(Intent.ACTION_TIME_CHANGED); - filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); - registerReceiver(mReceiver, filter); - - initializeRcsInterfacer(); - - initResetContentObserverAlarm(); - super.onCreate(); - } - - @Override - public void onDestroy() { - cancelResetContentObserverAlarm(); - unregisterContentObservers(); - if (null != mReceiver) { - unregisterReceiver(mReceiver); - } - if (null != mServiceHandler) { - mServiceHandler = null; - } - } - - private void initializeRcsInterfacer() { - // Get instance of mRcsManagr. - if (null == mRcsManager) { - mRcsManager = RcsManager.getInstance(this, 0); - } - try{ - if (null == mRcsPresence) { - mRcsPresence = mRcsManager.getRcsPresenceInterface(); - logger.debug("mRcsManager : " + mRcsManager + " mRcsPresence : " + mRcsPresence); - } - }catch (RcsException e){ - logger.error("getRcsPresenceInterface() exception : ", e); - mRcsPresence = null; - } catch (Exception e) { - logger.error("getRcsPresenceInterface() exception : ", e); - mRcsPresence = null; - mRcsManager = null; - } - } - - private void registerContentObservers() { - logger.debug("Registering for Contact and Profile Change Listener."); - mContactChangedListener = new ContactChangedListener(); - getContentResolver().registerContentObserver( - ContactsContract.Contacts.CONTENT_URI, true, - mContactChangedListener); - - mContactProfileListener = new ContactProfileListener(); - getContentResolver().registerContentObserver( - ContactsContract.Profile.CONTENT_URI, true, - mContactProfileListener); - } - - private void unregisterContentObservers() { - logger.debug("Un-registering for Contact and Profile Change Listener."); - if (null != mContactChangedListener) { - getContentResolver().unregisterContentObserver( - mContactChangedListener); - mContactChangedListener = null; - } - if (null != mContactProfileListener) { - getContentResolver().unregisterContentObserver( - mContactProfileListener); - mContactProfileListener = null; - } - } - - private void resetContentObservers() { - unregisterContentObservers(); - registerContentObservers(); - } - - private void initResetContentObserverAlarm() { - logger.debug("initResetAlarm, content Observers rest every 12 hours"); - long startInterval = System.currentTimeMillis() + AlarmManager.INTERVAL_HALF_DAY; - - Intent intent = new Intent(ACTION_EAB_RESET_CONTENT_OBSERVERS); - ((AlarmManager) getSystemService(Context.ALARM_SERVICE)).setInexactRepeating( - AlarmManager.RTC_WAKEUP, - startInterval, - AlarmManager.INTERVAL_HALF_DAY, - PendingIntent.getBroadcast(mContext, - 0, - intent, - PendingIntent.FLAG_UPDATE_CURRENT)); - - IntentFilter filter = new IntentFilter(); - filter.addAction(ACTION_EAB_RESET_CONTENT_OBSERVERS); - registerReceiver(mResetContentObserverReceiver, filter); - } - - private BroadcastReceiver mResetContentObserverReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - logger.debug("Received, ACTION_EAB_RESET_CONTENT_OBSERVERS"); - mServiceHandler.sendMessage(mServiceHandler.obtainMessage( -EAB_RESET_CONTENT_OBSERVERS)); - } - }; - - private void cancelResetContentObserverAlarm() { - Intent intent = new Intent(ACTION_EAB_RESET_CONTENT_OBSERVERS); - PendingIntent pi = PendingIntent.getBroadcast(mContext, 0, intent, - PendingIntent.FLAG_UPDATE_CURRENT); - ((AlarmManager) getSystemService(Context.ALARM_SERVICE)).cancel(pi); - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - // As the return type is START_STICKY, check for null intent is not - // needed as if this service's process is killed while it is started, - // system will try to re-create the service with a null intent object if - // there are not any pending start commands - if (intent != null) { - logger.debug("Enter : onStartCommand for intent : " + intent.getAction()); - } - registerContentObservers(); - Message msg = mServiceHandler.obtainMessage(BOOT_COMPLETED); - mServiceHandler.sendMessage(msg); - // This service should be a always-on service. - return START_STICKY; - } - - private final class ServiceHandler extends Handler { - public ServiceHandler(Looper looper) { - super(looper); - } - - @Override - public void handleMessage(Message msg) { - logger.debug("Enter: handleMessage"); - ArrayList<RcsPresenceInfo> dataInfoList = null; - - switch (msg.what) { - case BOOT_COMPLETED: - logger.debug("case BOOT_COMPLETED"); - ensureInitDone(); - isEABServiceInitializing = false; - break; - case EAB_RESET_CONTENT_OBSERVERS: - logger.debug("case EAB_RESET_CONTENT_OBSERVERS"); - resetContentObservers(); - break; - case CONTACT_TABLE_MODIFIED: - logger.debug("case CONTACT_TABLE_MODIFIED"); - ensureVideoCallingGroupCreation(); - validateAndSyncFromContactsDb(); - break; - case CONTACT_PROFILE_TABLE_MODIFIED: - logger.debug("case CONTACT_PROFILE_TABLE_MODIFIED"); - validateAndSyncFromProfileDb(); - break; - default: - logger.debug("default usecase hit! Do nothing"); - break; - } - logger.debug("Exit: handleMessage"); - } - } - - // synchronized is used to prevent sync happening in parallel due to - // multiple content change notifys from contacts observer. - private synchronized void validateAndSyncFromContactsDb() { - logger.debug("Enter : validateAndSyncFromContactsDb()"); - checkForContactNumberChanges(); - checkForDeletedContact(); - logger.debug("Exit : validateAndSyncFromContactsDb()"); - } - - // synchronized is used to prevent sync happening in parallel due to - // multiple content change notify from contacts observer. - private synchronized void validateAndSyncFromProfileDb() { - logger.debug("Enter : validateAndSyncFromProfileDb()"); - checkForProfileNumberChanges(); - checkForDeletedProfileContacts(); - logger.debug("Exit : validateAndSyncFromProfileDb()"); - } - - private void ensureInitDone() { - logger.debug("Enter : ensureInitDone()"); - ensureVideoCallingGroupCreation(); - if(SharedPrefUtil.isInitDone(mContext)) { - logger.debug("EAB initialized already!!! Just Sync with Contacts db."); - validateAndSyncFromContactsDb(); - validateAndSyncFromProfileDb(); - return; - } else { - logger.debug("Initializing EAB Provider."); - // This API will sync the numbers from Contacts db to EAB db based on - // contact last updated timestamp. - EABDbUtil.validateAndSyncFromContactsDb(mContext); - // This API's will sync the profile numbers from Contacts db to EAB db based on - // contact last updated timestamp. - validateAndSyncFromProfileDb(); - SharedPrefUtil.setInitDone(mContext, true); - } - } - - private void ensureVideoCallingGroupCreation() { - logger.debug("TODO: ensureVideoCallingGroupCreation"); - /* - if (!isRcsProvisioned()) { - logger.debug("Device is not provisioned. Remove Video calling group and account."); - ContactDbUtil.removeVideoCallingContactGroup(mContext); - AccountUtil.removeRcsAccount(mContext); - } else { - logger.debug("Device is provisioned. Create Video calling group and account."); - Account vCallingAccount = AccountUtil.addRcsAccount(mContext); - ContactDbUtil.addVideoCallingContactGroup(mContext, vCallingAccount); - }*/ - } - - private void sendDelayedContactChangeMsg() { - logger.debug("Enter: sendDelayedContactChangeMsg()"); - if (null != mServiceHandler && !isEABServiceInitializing) { - // Remove any previous message for CONTACT_TABLE_MODIFIED. - if (mServiceHandler.hasMessages(CONTACT_TABLE_MODIFIED)) { - mServiceHandler.removeMessages(CONTACT_TABLE_MODIFIED); - logger.debug("Removed previous CONTACT_TABLE_MODIFIED msg."); - } - - logger.debug("Sending new CONTACT_TABLE_MODIFIED msg."); - // Send a new delayed message for CONTACT_TABLE_MODIFIED. - Message msg = mServiceHandler.obtainMessage(CONTACT_TABLE_MODIFIED); - mServiceHandler.sendMessageDelayed(msg, SYNC_COMPLETE_DELAY_TIMER); - } - } - - private void sendDelayedContactProfileMsg() { - logger.debug("Enter: sendDelayedContactProfileMsg()"); - if (null != mServiceHandler && !isEABServiceInitializing) { - // Remove any previous message for CONTACT_PROFILE_TABLE_MODIFIED. - if (mServiceHandler.hasMessages(CONTACT_PROFILE_TABLE_MODIFIED)) { - mServiceHandler.removeMessages(CONTACT_PROFILE_TABLE_MODIFIED); - logger.debug("Removed previous CONTACT_PROFILE_TABLE_MODIFIED msg."); - } - - logger.debug("Sending new CONTACT_PROFILE_TABLE_MODIFIED msg."); - // Send a new delayed message for CONTACT_PROFILE_TABLE_MODIFIED. - Message msg = mServiceHandler.obtainMessage(CONTACT_PROFILE_TABLE_MODIFIED); - mServiceHandler.sendMessageDelayed(msg, SYNC_COMPLETE_DELAY_TIMER); - } - } - - private void checkForContactNumberChanges() { - logger.debug("Enter: checkForContactNumberChanges()"); - String[] projection = new String[] { - ContactsContract.Data._ID, - ContactsContract.Data.CONTACT_ID, - ContactsContract.Data.RAW_CONTACT_ID, - ContactsContract.Data.MIMETYPE, - ContactsContract.Data.DATA1, - ContactsContract.Data.DISPLAY_NAME, - ContactsContract.Data.CONTACT_LAST_UPDATED_TIMESTAMP }; - - long contactLastChange = SharedPrefUtil.getLastContactChangedTimestamp(mContext, 0); - logger.debug("contactLastChange : " + contactLastChange); - - String selection = ContactsContract.Data.MIMETYPE + " = '" + Phone.CONTENT_ITEM_TYPE + - "' AND " + ContactsContract.Data.CONTACT_LAST_UPDATED_TIMESTAMP + " > '" + - contactLastChange + "'"; - String sortOrder = ContactsContract.Data.CONTACT_LAST_UPDATED_TIMESTAMP + " desc"; - - Cursor cursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, - projection, selection, null, sortOrder); - - if (null != cursor) { - int count = cursor.getCount(); - logger.debug("cursor count : " + count); - if (count > 0) { - ArrayList<Long> uniqueRawContactIds = new ArrayList<Long>(); - while (cursor.moveToNext()) { - Long dataId = Long.valueOf(cursor.getLong(cursor.getColumnIndex( - ContactsContract.Data._ID))); - Long contactId = Long.valueOf(cursor.getLong(cursor.getColumnIndex( - ContactsContract.Data.CONTACT_ID))); - Long rawContactId = Long.valueOf(cursor.getLong(cursor.getColumnIndex( - ContactsContract.Data.RAW_CONTACT_ID))); - String phoneNumber = cursor.getString(cursor.getColumnIndex( - ContactsContract.Data.DATA1)); - String displayName = cursor.getString(cursor.getColumnIndex( - ContactsContract.Data.DISPLAY_NAME)); - logger.debug("dataId : " + dataId + " rawContactId :" + rawContactId + - " contactId : " + contactId - + " phoneNumber :" + phoneNumber + " displayName :" + displayName); - verifyInsertOrUpdateAction(dataId, contactId, rawContactId, phoneNumber, - displayName); - if (uniqueRawContactIds.isEmpty()) { - uniqueRawContactIds.add(rawContactId); - } else if (!uniqueRawContactIds.contains(rawContactId)) { - uniqueRawContactIds.add(rawContactId); - } else { - // Do nothing. - logger.debug("uniqueRawContactIds already contains rawContactId : " + - rawContactId); - } - } - checkForPhoneNumberDelete(uniqueRawContactIds); - // Save the largest timestamp returned. Only need the first one due to - // the sort order. - cursor.moveToFirst(); - long timestamp = cursor.getLong(cursor - .getColumnIndex(ContactsContract.Data.CONTACT_LAST_UPDATED_TIMESTAMP)); - if (timestamp > 0) { - SharedPrefUtil.saveLastContactChangedTimestamp(mContext, timestamp); - } - } - } else { - logger.error("cursor is null!"); - } - if (null != cursor) { - cursor.close(); - } - logger.debug("Exit: checkForContactNumberChanges()"); - } - - private void verifyInsertOrUpdateAction(Long dataId, Long contactId, - Long rawContactId, String phoneNumber, String displayName) { - logger.debug("Enter: verifyInsertOrUpdateAction() phoneNumber : " + phoneNumber); - if (null == phoneNumber){ - logger.error("Error: return as phoneNumber is null"); - return; - } - // Check if the contact is already available in EAB Provider. - String[] eabProjection = new String[] { - EABContract.EABColumns.CONTACT_NUMBER, - EABContract.EABColumns.CONTACT_NAME }; - String eabWhereClause = EABContract.EABColumns.DATA_ID + " ='" + dataId.toString() - + "' AND " + EABContract.EABColumns.RAW_CONTACT_ID + " ='" - + rawContactId.toString() + "'"; - logger.debug("eabWhereClause : " + eabWhereClause); - - Cursor eabCursor = getContentResolver().query(EABContract.EABColumns.CONTENT_URI, - eabProjection, eabWhereClause, null, null); - if (null != eabCursor) { - int eabCursorCount = eabCursor.getCount(); - logger.debug("EAB cursor count : " + eabCursorCount); - if (eabCursorCount > 0) { - while (eabCursor.moveToNext()) { - // EABProvider has entry for dataId & rawContactId. Try to - // match the contact number. - String eabPhoneNumber = eabCursor.getString(eabCursor - .getColumnIndex(EABContract.EABColumns.CONTACT_NUMBER)); - String eabDisplayName = eabCursor.getString(eabCursor - .getColumnIndex(EABContract.EABColumns.CONTACT_NAME)); - logger.debug("phoneNumber : " + phoneNumber - + " eabPhoneNumber :" + eabPhoneNumber); - // Contact names should match and both numbers should not be - // null & should not match. - if ((null != eabPhoneNumber) - && !PhoneNumberUtils.compare(mContext, phoneNumber, eabPhoneNumber)) { - // Update use-case. - handlePhoneNumberChanged(dataId, contactId, rawContactId, - eabPhoneNumber, phoneNumber, displayName); - } else { - if ((null != eabPhoneNumber) - && PhoneNumberUtils.compare(mContext, phoneNumber, eabPhoneNumber) - && !TextUtils.equals(displayName, eabDisplayName)) { - handlePhoneNameUpdate(dataId, contactId, rawContactId, - phoneNumber, displayName); - } else { - // Do nothing. - logger.debug("The contact name and number is already available " + - "in EAB Provider."); - } - } - } - } else { - // insert use-case. - handlePhoneNumberInsertion(dataId, contactId, rawContactId, phoneNumber, - displayName); - } - } - if (null != eabCursor) { - eabCursor.close(); - } - logger.debug("Exit: verifyInsertOrUpdateAction()"); - } - - private void checkForPhoneNumberDelete(ArrayList<Long> uniqueRawContactIds) { - logger.debug("Enter: checkForPhoneNumberDelete() "); - if (null != uniqueRawContactIds && uniqueRawContactIds.size() > 0) { - for (int i = 0; i < uniqueRawContactIds.size(); i++) { - Long rawContactId = uniqueRawContactIds.get(i); - int contactsDbCount = 0; - int eabDbCursorCount = 0; - - // Find the total number of dataIds under the rawContactId in - // Contacts Provider DB. - String[] projection = new String[] { ContactsContract.Data._ID, - ContactsContract.Data.CONTACT_ID, - ContactsContract.Data.RAW_CONTACT_ID, - ContactsContract.Data.MIMETYPE, - ContactsContract.Data.DATA1, - ContactsContract.Data.DISPLAY_NAME }; - - // Get LastContactChangedTimestamp for knowing which contact - // number deleted from the contact id. - long contactLastChange = SharedPrefUtil.getLastContactChangedTimestamp( - mContext, 0); - - String selection = ContactsContract.Data.MIMETYPE + " = '" - + Phone.CONTENT_ITEM_TYPE + "' AND " + - ContactsContract.Data.CONTACT_LAST_UPDATED_TIMESTAMP - + " > '" + contactLastChange + "' AND " + - ContactsContract.Data.RAW_CONTACT_ID + " = '" - + rawContactId + "'"; - - String sortOrder = ContactsContract.Data.RAW_CONTACT_ID + " desc"; - - Cursor contactDbCursor = getContentResolver().query( - ContactsContract.Data.CONTENT_URI, projection, - selection, null, sortOrder); - - if (null != contactDbCursor) { - contactsDbCount = contactDbCursor.getCount(); - logger.debug("contactDbCursor count : " + contactsDbCount); - } - - // Find the total number of dataIds under the rawContactId in - // EAB Provider DB. - String[] eabProjection = new String[] { - EABContract.EABColumns.CONTACT_ID, - EABContract.EABColumns.RAW_CONTACT_ID, - EABContract.EABColumns.DATA_ID, - EABContract.EABColumns.CONTACT_NUMBER, - EABContract.EABColumns.CONTACT_NAME }; - - String eabWhereClause = EABContract.EABColumns.RAW_CONTACT_ID - + " ='" + rawContactId.toString() + "'"; - - Cursor eabDbCursor = getContentResolver().query( - EABContract.EABColumns.CONTENT_URI, eabProjection, - eabWhereClause, null, null); - if (null != eabDbCursor) { - eabDbCursorCount = eabDbCursor.getCount(); - logger.debug("eabDbCursor count : " + eabDbCursorCount); - } - if (0 == contactsDbCount && 0 == eabDbCursorCount) { - // Error scenario. Continue for checking the next rawContactId. - logger.error("Both cursor counts are 0. move to next rawContactId"); - } else { - if (contactsDbCount == eabDbCursorCount) { - // Do nothing as both DB have the same number of contacts. - logger.debug("Both the databases have the same number of contacts." + - " Do nothing."); - } else if (contactsDbCount > eabDbCursorCount) { - logger.error("EAB DB has less contacts then Contacts DB. Do nothing!"); - } else if (contactsDbCount < eabDbCursorCount) { - // find and number and delete it from EAB Provider. - logger.debug("Delete usecase hit. Find and delete contact from EAB DB."); - ArrayList <Long> eabDataIdList = new ArrayList <Long>(); - while (eabDbCursor.moveToNext()) { - String eabPhoneNumber = eabDbCursor.getString(eabDbCursor - .getColumnIndex(EABContract.EABColumns.CONTACT_NUMBER)); - logger.debug("eabPhoneNumber :" + eabPhoneNumber); - Long eabDataId = Long.valueOf(eabDbCursor.getLong(eabDbCursor - .getColumnIndex(EABContract.EABColumns.DATA_ID))); - logger.debug("eabDataId :" + eabDataId); - if (eabDataIdList.isEmpty()) { - eabDataIdList.add(eabDataId); - } else if (!eabDataIdList.contains(eabDataId) ) { - eabDataIdList.add(eabDataId); - } else { - // Something is wrong. There can not be duplicate numbers. - logger.error("Duplicate entry for PhoneNumber :" + eabPhoneNumber - + " with DataId : " + eabDataId + " found in EABProvider."); - } - } - logger.debug("Before computation eabDataIdList size :" + - eabDataIdList.size()); - while (contactDbCursor.moveToNext()) { - String contactPhoneNumber = contactDbCursor.getString(contactDbCursor - .getColumnIndex(ContactsContract.Data.DATA1)); - Long contactDataId = Long.valueOf(contactDbCursor.getLong( - contactDbCursor - .getColumnIndex(ContactsContract.Data._ID))); - logger.debug("contactPhoneNumber : " + contactPhoneNumber + - " dataId : " + contactDataId); - if (eabDataIdList.contains(contactDataId) ) { - eabDataIdList.remove(contactDataId); - logger.debug("Number removed from eabDataIdList"); - } else { - // Something is wrong. There can not be new number in Contacts DB. - logger.error("Number :" + contactPhoneNumber - + " with DataId : " + contactDataId + - " not found in EABProvider."); - } - } - logger.debug("After computation eabPhoneNumberList size :" + - eabDataIdList.size()); - if (eabDataIdList.size() > 0) { - handlePhoneNumbersDeleted(rawContactId, eabDataIdList); - } - } - } - if (null != contactDbCursor) { - contactDbCursor.close(); - } - if (null != eabDbCursor) { - eabDbCursor.close(); - } - } - } else { - // Do nothing. - logger.debug("uniqueRawContactIds is null or empty. Do nothing. "); - } - logger.debug("Exit: checkForPhoneNumberDelete() "); - } - - private void checkForDeletedContact() { - logger.debug("Enter: checkForDeletedContact()"); - String[] projection = new String[] { - ContactsContract.DeletedContacts.CONTACT_ID, - ContactsContract.DeletedContacts.CONTACT_DELETED_TIMESTAMP }; - - long contactLastDeleted = SharedPrefUtil.getLastContactDeletedTimestamp(mContext, 0); - logger.debug("contactLastDeleted : " + contactLastDeleted); - - String selection = ContactsContract.DeletedContacts.CONTACT_DELETED_TIMESTAMP - + " > '" + contactLastDeleted + "'"; - - String sortOrder = ContactsContract.DeletedContacts.CONTACT_DELETED_TIMESTAMP + " desc"; - - Cursor cursor = getContentResolver().query( - ContactsContract.DeletedContacts.CONTENT_URI, projection, - selection, null, sortOrder); - if (null != cursor) { - int count = cursor.getCount(); - logger.debug("cursor count : " + count); - if (count > 0) { - while (cursor.moveToNext()) { - Long contactId = Long.valueOf(cursor.getLong(cursor - .getColumnIndex(ContactsContract.DeletedContacts.CONTACT_ID))); - logger.debug("contactId : " + contactId); - handleContactDeleted(contactId); - } - // Save the largest returned timestamp. Only need the first - // cursor element due to the sort order. - cursor.moveToFirst(); - long timestamp = cursor.getLong(cursor - .getColumnIndex( - ContactsContract.DeletedContacts.CONTACT_DELETED_TIMESTAMP)); - if (timestamp > 0) { - SharedPrefUtil.saveLastContactDeletedTimestamp(mContext, timestamp); - } - } - } - if (null != cursor) { - cursor.close(); - } - logger.debug("Exit: checkForDeletedContact()"); - } - - private void checkForProfileNumberChanges() { - logger.debug("Enter: checkForProfileNumberChanges()"); - String[] projection = new String[] { - ContactsContract.Contacts.Entity.CONTACT_ID, - ContactsContract.Contacts.Entity.RAW_CONTACT_ID, - ContactsContract.Contacts.Entity.DATA_ID, - ContactsContract.Contacts.Entity.MIMETYPE, - ContactsContract.Contacts.Entity.DATA1, - ContactsContract.Contacts.Entity.DISPLAY_NAME, - ContactsContract.Contacts.Entity.CONTACT_LAST_UPDATED_TIMESTAMP}; - - long profileContactLastChange = SharedPrefUtil.getLastProfileContactChangedTimestamp( - mContext, 0); - logger.debug("profileContactLastChange : " + profileContactLastChange); - - String selection = ContactsContract.Contacts.Entity.MIMETYPE + " ='" + - Phone.CONTENT_ITEM_TYPE + "' AND " - + ContactsContract.Contacts.Entity.CONTACT_LAST_UPDATED_TIMESTAMP + " > '" + - profileContactLastChange + "'"; - String sortOrder = ContactsContract.Contacts.Entity.CONTACT_LAST_UPDATED_TIMESTAMP + - " desc"; - // Construct the Uri to access Profile's Entity view. - Uri profileUri = ContactsContract.Profile.CONTENT_URI; - Uri entiryUri = Uri.withAppendedPath(profileUri, - ContactsContract.Contacts.Entity.CONTENT_DIRECTORY); - - Cursor cursor = getContentResolver().query(entiryUri, projection, selection, null, - sortOrder); - if (null != cursor) { - int count = cursor.getCount(); - logger.debug("cursor count : " + count); - if (count > 0) { - ArrayList <String> profileNumberList = new ArrayList <String>(); - ArrayList <Long> profileDataIdList = new ArrayList <Long>(); - Long contactId = null; - Long rawContactId = null; - while (cursor.moveToNext()) { - contactId = Long.valueOf(cursor.getLong(cursor.getColumnIndex( - ContactsContract.Contacts.Entity.CONTACT_ID))); - rawContactId = Long.valueOf(cursor.getLong(cursor.getColumnIndex( - ContactsContract.Contacts.Entity.RAW_CONTACT_ID))); - Long dataId = Long.valueOf(cursor.getLong(cursor.getColumnIndex( - ContactsContract.Contacts.Entity.DATA_ID))); - String contactNumber = cursor.getString(cursor.getColumnIndex( - ContactsContract.Contacts.Entity.DATA1)); - String profileName = cursor.getString(cursor.getColumnIndex( - ContactsContract.Contacts.Entity.DISPLAY_NAME)); - logger.debug("Profile Name : " + profileName - + " Profile Number : " + contactNumber - + " profile dataId : " + dataId - + " profile rawContactId : " + rawContactId - + " profile contactId : " + contactId); - if (profileDataIdList.isEmpty()) { - profileDataIdList.add(dataId); - profileNumberList.clear(); - profileNumberList.add(contactNumber); - } else if (!profileDataIdList.contains(dataId)) { - profileDataIdList.add(dataId); - profileNumberList.add(contactNumber); - } else { - // There are duplicate entries in Profile's Table - logger.error("Duplicate entry in Profile's Table for contact :" + - contactNumber + " dataId : " + dataId); - } - verifyInsertOrUpdateAction(dataId, contactId, rawContactId, contactNumber, - profileName); - } - checkForProfilePhoneNumberDelete(contactId, rawContactId, profileDataIdList); - // Save the largest timestamp returned. Only need the first cursor element - // due to sort order. - cursor.moveToFirst(); - long timestamp = cursor.getLong(cursor.getColumnIndex( - ContactsContract.Contacts.Entity.CONTACT_LAST_UPDATED_TIMESTAMP)); - if (timestamp > 0) { - SharedPrefUtil.saveLastProfileContactChangedTimestamp(mContext, timestamp); - } - } else { - logger.error("cursor is zero. Do nothing."); - } - } else { - logger.error("ContactsContract.Profile.CONTENT_URI cursor is null!"); - } - if (null != cursor) { - cursor.close(); - } - logger.debug("Exit: checkForProfileNumberChanges()"); - } - - private void checkForProfilePhoneNumberDelete(Long profileContactId, - Long profileRawContactId, ArrayList<Long> profileDataIdList) { - logger.debug("Enter: checkForProfilePhoneNumberDelete()"); - if (!ContactsContract.isProfileId(profileContactId)) { - logger.error("Not a Profile Contact Id : " + profileContactId); - return; - } - int eabDbCursorCount = 0; - int profileContactsDbCount = profileDataIdList.size(); - logger.error("profileContactsDbCount size : " + profileContactsDbCount); - // Find the total number of dataIds under the rawContactId in EAB Provider DB. - String[] eabProjection = new String[] { - EABContract.EABColumns.CONTACT_ID, - EABContract.EABColumns.DATA_ID, - EABContract.EABColumns.CONTACT_NUMBER}; - String eabWhereClause = EABContract.EABColumns.CONTACT_ID + " ='" + - profileContactId.toString() + "'"; - - Cursor eabDbCursor = getContentResolver().query( EABContract.EABColumns.CONTENT_URI, - eabProjection, - eabWhereClause, null, null); - if (null != eabDbCursor) { - eabDbCursorCount = eabDbCursor.getCount(); - logger.debug("eabDbCursor count : " + eabDbCursorCount); - } - if (0 == profileContactsDbCount && 0 == eabDbCursorCount) { - // Error scenario. Continue for checking the next rawContactId. - logger.error("Both cursor counts are 0. Do nothing"); - } else { - if (profileContactsDbCount == eabDbCursorCount) { - // Do nothing as both DB have the same number of contacts. - logger.debug("Both the databases have the same number of contacts. Do nothing."); - } else if (profileContactsDbCount > eabDbCursorCount) { - logger.error("EAB DB has less contacts then Contacts DB. Do nothing!"); - } else if (profileContactsDbCount < eabDbCursorCount) { - // find and number and delete it from EAB Provider. - logger.debug("Delete usecase hit. Find and delete contact from EAB DB."); - ArrayList <Long> eabDataIdList = new ArrayList <Long>(); - while (eabDbCursor.moveToNext()) { - Long eabDataId = Long.valueOf(eabDbCursor.getLong(eabDbCursor - .getColumnIndex(EABContract.EABColumns.DATA_ID))); - logger.debug("eabDataId : " + eabDataId); - if (eabDataIdList.isEmpty()) { - eabDataIdList.add(eabDataId); - } else if (!eabDataIdList.contains(eabDataId) ) { - eabDataIdList.add(eabDataId); - } else { - // Something is wrong. There can not be duplicate numbers. - logger.error("Duplicate entry for eabDataId in EABProvider : " + - eabDataId); - } - } - logger.debug("Before computation eabDataIdList size : " + eabDataIdList.size()); - for (int i = 0; i < profileDataIdList.size(); i++) { - Long contactDataId = profileDataIdList.get(i); - logger.debug("Profile contactDataId : " + contactDataId); - if (eabDataIdList.contains(contactDataId) ) { - eabDataIdList.remove(contactDataId); - logger.debug("Number removed from eabDataIdList"); - } else { - // Something is wrong. There can not be new number in Contacts DB. - logger.error("DataId : " + contactDataId + - " not found in EAB Provider DB."); - } - } - logger.debug("After computation eabDataIdList size : " + eabDataIdList.size()); - if (eabDataIdList.size() > 0) { - handlePhoneNumbersDeleted(profileRawContactId, eabDataIdList); - } - } - } - if (null != eabDbCursor) { - eabDbCursor.close(); - } - logger.debug("Exit: checkForProfilePhoneNumberDelete() "); - } - - private void checkForDeletedProfileContacts() { - logger.debug("Enter: checkForDeletedProfileContacts()"); - String[] projection = new String[] { - ContactsContract.Contacts.Entity.DATA1, - ContactsContract.Contacts.Entity.DISPLAY_NAME, - ContactsContract.Contacts.Entity.CONTACT_LAST_UPDATED_TIMESTAMP}; - - String selection = ContactsContract.Contacts.Entity.MIMETYPE + " ='" + - Phone.CONTENT_ITEM_TYPE + "'"; - // Construct the Uri to access Profile's Entity view. - Uri profileUri = ContactsContract.Profile.CONTENT_URI; - Uri entiryUri = Uri.withAppendedPath(profileUri, - ContactsContract.Contacts.Entity.CONTENT_DIRECTORY); - - // Due to issue in AOSP contact profile db, table - // ContactsContract.Profile.CONTENT_URI can not be checked for - // selection = ContactsContract.Profile.HAS_PHONE_NUMBER + " = '" + 1 + "'". - // This is resulting in 0 cursor count even when there are valid - // contact numbers under contacts profile db. - Cursor cursor = getContentResolver().query(entiryUri, projection, selection, null, null); - if (null != cursor) { - int count = cursor.getCount(); - logger.debug("Profile contact cursor count : " + count); - if (count == 0) { - logger.debug("cursor count is Zero. There are no contacts in Contact Profile db."); - handleContactProfileDeleted(); - } else { - logger.debug("Profile is available. Do nothing"); - } - cursor.close(); - } - logger.debug("Exit: checkForDeletedProfileContacts()"); - } - - private void handlePhoneNumberInsertion(Long dataId, Long contactId, - Long rawContactId, String phoneNumber, String contactName) { - - logger.debug("handlePhoneNumberInsertion() rawContactId : " - + rawContactId + " dataId :" + dataId + " contactId :" - + contactId + " phoneNumber :" + phoneNumber + " contactName :" - + contactName); - if (!EABDbUtil.validateEligibleContact(mContext, phoneNumber)) { - logger.debug("Return as number is not elegible for VT."); - return; - } - String sRawContactId = null; - String sDataId = null; - String sContactId = null; - if (null != rawContactId) { - sRawContactId = rawContactId.toString(); - } - if (null != dataId) { - sDataId = dataId.toString(); - } - if (null != contactId) { - sContactId = contactId.toString(); - } - ArrayList<PresenceContact> contactListToInsert = new ArrayList<PresenceContact>(); - contactListToInsert.add(new PresenceContact(contactName, phoneNumber, - sRawContactId, sContactId, sDataId)); - - EABDbUtil.addContactsToEabDb(getApplicationContext(), - contactListToInsert); - } - - private void handlePhoneNumberChanged(Long dataId, Long contactId, - Long rawContactId, String oldPhoneNumber, String newPhoneNumber, - String contactName) { - - logger.debug("handlePhoneNumberChanged() rawContactId : " + rawContactId - + " dataId :" + dataId + " oldPhoneNumber :" + oldPhoneNumber - + " newPhoneNumber :" + newPhoneNumber + " contactName :" - + contactName); - - if (null == oldPhoneNumber && null == newPhoneNumber) { - logger.debug("Both old and new numbers are null."); - return; - } - - ArrayList<PresenceContact> contactListToInsert = new ArrayList<PresenceContact>(); - ArrayList<PresenceContact> contactListToDelete = new ArrayList<PresenceContact>(); - String sRawContactId = null; - String sDataId = null; - String sContactId = null; - if (null != rawContactId) { - sRawContactId = rawContactId.toString(); - } - if (null != dataId) { - sDataId = dataId.toString(); - } - if (null != contactId) { - sContactId = contactId.toString(); - } - logger.debug("Removing old number and inserting new number in EABProvider."); - if (null != oldPhoneNumber) { - contactListToDelete.add(new PresenceContact(contactName, - oldPhoneNumber, sRawContactId, sContactId, sDataId)); - // Delete old number from EAB Presence Table - EABDbUtil.deleteNumbersFromEabDb(getApplicationContext(), contactListToDelete); - } - if (null != newPhoneNumber) { - if (EABDbUtil.validateEligibleContact(mContext, newPhoneNumber)) { - contactListToInsert.add(new PresenceContact(contactName, - newPhoneNumber, sRawContactId, sContactId, sDataId)); - // Insert new number from EAB Presence Table - EABDbUtil.addContactsToEabDb(getApplicationContext(), contactListToInsert); - } else { - logger.debug("Return as number is not elegible for VT."); - } - } - } - - private void handlePhoneNumbersDeleted(Long rawContactId, ArrayList <Long> contactDataIdList) { - ArrayList<PresenceContact> phoneNumberToDeleteList = new ArrayList<PresenceContact>(); - for (int v = 0; v < contactDataIdList.size(); v++) { - Long staleDataId = contactDataIdList.get(v); - if (null != staleDataId) { - logger.debug("calling delete for staleNumber :" + staleDataId); - String sRawContactId = null; - if (null != rawContactId) { - sRawContactId = rawContactId.toString(); - } - phoneNumberToDeleteList.add(new PresenceContact(null, null, - sRawContactId, null, staleDataId.toString())); - } - } - // Delete number from EAB Provider table. - EABDbUtil.deleteNumbersFromEabDb(getApplicationContext(), phoneNumberToDeleteList); - } - - private void handlePhoneNameUpdate(Long dataId, Long contactId, - Long rawContactId, String phoneNumber, String newDisplayName) { - logger.debug("handlePhoneNameUpdate() rawContactId : " + rawContactId - + " dataId :" + dataId + " newDisplayName :" + newDisplayName); - String sRawContactId = null; - String sDataId = null; - String sContactId = null; - if (null != rawContactId) { - sRawContactId = rawContactId.toString(); - } - if (null != dataId) { - sDataId = dataId.toString(); - } - if (null != contactId) { - sContactId = contactId.toString(); - } - ArrayList<PresenceContact> contactNameToUpdate = new ArrayList<PresenceContact>(); - contactNameToUpdate.add(new PresenceContact(newDisplayName, - phoneNumber, sRawContactId, sContactId, sDataId)); - - EABDbUtil.updateNamesInEabDb(getApplicationContext(), contactNameToUpdate); - } - - private void handleContactDeleted(Long contactId) { - - if (null == contactId) { - logger.debug("handleContactDeleted : contactId is null"); - } - ArrayList<PresenceContact> contactListToDelete = new ArrayList<PresenceContact>(); - contactListToDelete.add(new PresenceContact(null, null, null, contactId.toString(), null)); - - //ContactDbUtil.deleteRawContact(getApplicationContext(), contactListToDelete); - EABDbUtil.deleteContactsFromEabDb(mContext, contactListToDelete); - } - - private void handleContactProfileDeleted() { - Long contactProfileMinId = Long.valueOf(ContactsContract.Profile.MIN_ID); - logger.debug("contactProfileMinId : " + contactProfileMinId); - - ArrayList<PresenceContact> contactListToDelete = new ArrayList<PresenceContact>(); - contactListToDelete.add(new PresenceContact(null, null, null, - contactProfileMinId.toString(), null)); - - EABDbUtil.deleteContactsFromEabDb(mContext, contactListToDelete); - } - - private boolean isRcsProvisioned(){ - boolean isVoLTEProvisioned = false; - boolean isLvcProvisioned = false; - boolean isEabProvisioned = false; - ImsManager imsManager = null; - ImsConfig imsConfig = null; - - // Get instance of imsManagr. - imsManager = ImsManager.getInstance(mContext, - SubscriptionManager.getDefaultVoiceSubscriptionId()); - try { - imsConfig = imsManager.getConfigInterface(); - logger.debug("imsConfig initialized."); - } catch (Exception e) { - logger.error("getConfigInterface() exception:", e); - imsConfig = null; - } - - if (null != imsConfig) { - try { - isVoLTEProvisioned = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.VLT_SETTING_ENABLED) - == ImsConfig.FeatureValueConstants.ON; - isLvcProvisioned = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.LVC_SETTING_ENABLED) - == ImsConfig.FeatureValueConstants.ON; - isEabProvisioned = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.EAB_SETTING_ENABLED) - == ImsConfig.FeatureValueConstants.ON; - } catch (ImsException e) { - logger.error("ImsException in isRcsProvisioned() : ", e); - } - } else { - logger.debug("isRcsProvisioned - imsConfig is null"); - } - logger.debug("isVoLTEProvisioned : " + isVoLTEProvisioned + " isLvcProvisioned : " + - isLvcProvisioned - + " isEabProvisioned : " + isEabProvisioned); - return (isVoLTEProvisioned && isLvcProvisioned && isEabProvisioned); - } -} diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/InvalidDBException.java b/rcs/presencepolling/src/com/android/service/ims/presence/InvalidDBException.java deleted file mode 100644 index 1e7fdeb5..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/InvalidDBException.java +++ /dev/null @@ -1,41 +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.database.sqlite.SQLiteException; - -//A custom exception for onDowngrade() -public class InvalidDBException extends SQLiteException { - public InvalidDBException() { - } - - public InvalidDBException(String error) { - super(error); - } -} diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/LauncherUtils.java b/rcs/presencepolling/src/com/android/service/ims/presence/LauncherUtils.java deleted file mode 100644 index 83621428..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/LauncherUtils.java +++ /dev/null @@ -1,82 +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.Context; -import android.content.Intent; - -import com.android.ims.internal.Logger; - -/** - * Launcher utility functions - * - */ -public class LauncherUtils { - private static Logger logger = Logger.getLogger(LauncherUtils.class.getName()); - - /** - * Launch the Presence service. - * - * @param context application context - * @param boot Boot flag - */ - public static boolean launchPollingService(Context context) { - logger.debug("Launch polling service"); - - Intent intent = new Intent(context, PollingService.class); - return (context.startService(intent) != null); - } - - /** - * Stop the Presence service. - * - * @param context application context - */ - public static boolean stopPollingService(Context context) { - logger.debug("Stop polling service"); - - Intent intent = new Intent(context, PollingService.class); - return context.stopService(intent); - } - - public static boolean launchEabService(Context context) { - logger.debug("Launch Eab Service"); - - Intent intent = new Intent(context, EABService.class); - return (context.startService(intent) != null); - } - - public static boolean stopEabService(Context context) { - logger.debug("Stop EAB service"); - - Intent intent = new Intent(context, EABService.class); - return context.stopService(intent); - } -} - diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/PersistService.java b/rcs/presencepolling/src/com/android/service/ims/presence/PersistService.java deleted file mode 100644 index bbd9cee3..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/PersistService.java +++ /dev/null @@ -1,215 +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.Intent; -import android.os.IBinder; -import android.os.RemoteException; -import android.app.Service; -import android.os.SystemProperties; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.os.HandlerThread; -import android.os.Process; -import java.util.ArrayList; -import android.content.ContentValues; -import android.text.TextUtils; - -import com.android.ims.internal.Logger; -import com.android.ims.RcsManager.ResultCode; -import com.android.ims.RcsPresence; -import com.android.ims.RcsPresenceInfo; - -/** - * This service essentially plays the role of a "worker thread", allowing us to store - * presence information. - */ -public class PersistService extends Service { - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private static final int MESSAGE_PRESENCE_CHANGED = 1; - private static final int MESSAGE_PUBLISH_STATE_CHANGED = 2; - - private int mVltProvisionErrorCount = 0; - private Looper mServiceLooper = null; - private ServiceHandler mServiceHandler = null; - private EABContactManager mEABContactManager = null; - - @Override - public void onCreate() { - mEABContactManager = new EABContactManager(getContentResolver(), getPackageName()); - - // separate thread because the service normally runs in the process's - // main thread, which we don't want to block. - HandlerThread thread = new HandlerThread("PersistServiceThread", - Process.THREAD_PRIORITY_BACKGROUND); - thread.start(); - - mServiceLooper = thread.getLooper(); - mServiceHandler = new ServiceHandler(mServiceLooper); - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - if(intent == null) { - return Service.START_NOT_STICKY; - } - - if(RcsPresence.ACTION_PRESENCE_CHANGED.equals(intent.getAction())) { - Message msg = mServiceHandler.obtainMessage(MESSAGE_PRESENCE_CHANGED); - msg.arg1 = startId; - msg.obj = intent; - mServiceHandler.sendMessage(msg); - return Service.START_NOT_STICKY; - } else if(RcsPresence.ACTION_PUBLISH_STATE_CHANGED.equals(intent.getAction())) { - Message msg = mServiceHandler.obtainMessage(MESSAGE_PUBLISH_STATE_CHANGED); - msg.arg1 = startId; - msg.obj = intent; - mServiceHandler.sendMessage(msg); - return Service.START_NOT_STICKY; - } else { - logger.debug("unknown intent=" + intent); - } - - return Service.START_NOT_STICKY; - } - - @Override - public void onDestroy() { - mServiceLooper.quit(); - } - - @Override - public IBinder onBind(Intent intent) { - return null; - } - - private final class ServiceHandler extends Handler { - public ServiceHandler(Looper looper) { - super(looper); - } - - /** - * Handler to save the presence information. - */ - @Override - public void handleMessage(Message msg) { - super.handleMessage(msg); - logger.print( "Thread=" + Thread.currentThread().getName() + " received " - + msg); - if(msg == null){ - logger.error("msg=null"); - return; - } - - int serviceId = msg.arg1; - Intent intent = (Intent)msg.obj; - logger.print("handleMessage serviceId: " + serviceId + " intent: " + intent); - switch (msg.what) { - case MESSAGE_PRESENCE_CHANGED: - if (intent != null) { - if (RcsPresence.ACTION_PRESENCE_CHANGED.equals(intent.getAction())) { - handlePresence(intent); - } else { - logger.debug("I don't care about intent: " + intent); - } - intent.setComponent(null); - sendBroadcast(intent); - } - break; - - case MESSAGE_PUBLISH_STATE_CHANGED: - if (intent != null) { - if (RcsPresence.ACTION_PUBLISH_STATE_CHANGED.equals(intent.getAction())) { - int publishState = intent.getIntExtra(RcsPresence.EXTRA_PUBLISH_STATE, - RcsPresence.PublishState.PUBLISH_STATE_200_OK); - handlePublishState(publishState); - } else { - logger.debug("I don't care about intent: " + intent); - } - } - break; - - default: - logger.debug("unknown message:" + msg); - } - } - } - - private void handlePublishState(int publishState) { - if(publishState == RcsPresence.PublishState.PUBLISH_STATE_VOLTE_PROVISION_ERROR) { - mVltProvisionErrorCount += 1; - if(mVltProvisionErrorCount >= 3){ - if(mEABContactManager != null) { - mEABContactManager.updateAllCapabilityToUnknown(); - logger.print("updateAllCapabilityToUnknown for publish 403 error"); - Intent intent = new Intent(RcsPresence.ACTION_PRESENCE_CHANGED); - sendBroadcast(intent); - } else { - logger.error("mEABContactManager is null"); - } - } - } else if(publishState == RcsPresence.PublishState.PUBLISH_STATE_RCS_PROVISION_ERROR){ - mVltProvisionErrorCount = 0; - if(mEABContactManager != null) { - mEABContactManager.updateAllVtCapabilityToUnknown(); - logger.print("updateAllVtCapabilityToUnknown for publish 404 error"); - Intent intent = new Intent(RcsPresence.ACTION_PRESENCE_CHANGED); - sendBroadcast(intent); - } else { - logger.error("mEABContactManager is null"); - } - } else { - mVltProvisionErrorCount = 0; - } - } - - private void handlePresence(Intent intent) { - if(intent == null) { - return; - } - - // save the presence information. - ArrayList<RcsPresenceInfo> rcsPresenceInfoList = intent.getParcelableArrayListExtra( - RcsPresence.EXTRA_PRESENCE_INFO_LIST); - boolean updateLastTimestamp = intent.getBooleanExtra("updateLastTimestamp", true); - logger.print("updateLastTimestamp=" + updateLastTimestamp + - " RcsPresenceInfoList=" + rcsPresenceInfoList); - for(int i=0; i< rcsPresenceInfoList.size(); i++){ - RcsPresenceInfo rcsPresenceInfoTmp = rcsPresenceInfoList.get(i); - if((rcsPresenceInfoTmp != null) && !TextUtils.isEmpty( - rcsPresenceInfoTmp.getContactNumber())){ - mEABContactManager.update(rcsPresenceInfoTmp, updateLastTimestamp); - } - } - } -} - - diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/PollingAction.java b/rcs/presencepolling/src/com/android/service/ims/presence/PollingAction.java deleted file mode 100644 index fc297aeb..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/PollingAction.java +++ /dev/null @@ -1,209 +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.Context; -import android.os.AsyncTask; -import android.os.Looper; - -import com.android.ims.IRcsPresenceListener; -import com.android.ims.RcsManager; -import com.android.ims.RcsPresence; -import com.android.ims.RcsException; -import com.android.ims.RcsManager.ResultCode; -import com.android.ims.internal.Logger; - -import java.util.ArrayList; -import java.util.List; - -public class PollingAction extends AsyncTask<Void, Integer, Integer> { - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private Context mContext; - private PollingTask mPollingTask; - private int mResult; - private int mRequestId = -1; - - private final Object mPollingSyncObj = new Object(); - private boolean mIsPolling = false; - private boolean mFullUpdated = false; - - private IRcsPresenceListener mClientListener = new IRcsPresenceListener.Stub() { - public void onSuccess(int reqId) { - logger.print("onSuccess() is called. reqId=" + reqId); - } - - public void onError(int reqId, int code) { - logger.print("onError() is called, reqId=" + reqId + " error code: " + code); - synchronized(mPollingSyncObj) { - mResult = code; - mIsPolling = false; - mPollingSyncObj.notifyAll(); - } - } - - public void onFinish(int reqId) { - logger.print("onFinish() is called, reqId=" + reqId); - if (reqId == mRequestId) { - synchronized(mPollingSyncObj) { - mFullUpdated = true; - mIsPolling = false; - mPollingSyncObj.notifyAll(); - } - } - } - - public void onTimeout(int reqId) { - logger.print("onTimeout() is called, reqId=" + reqId); - if (reqId == mRequestId) { - synchronized(mPollingSyncObj) { - mIsPolling = false; - mPollingSyncObj.notifyAll(); - } - } - } - }; - - public PollingAction(Context context, PollingTask task) { - mContext = context; - mPollingTask = task; - logger.info("PollingAction(), task=" + mPollingTask); - } - - @Override - protected void onPreExecute() { - super.onPreExecute(); - mPollingTask.onPreExecute(); - } - - @Override - protected Integer doInBackground(Void... params) { - logger.debug("doInBackground(), Thread = " + Thread.currentThread().getName()); - - if (Looper.myLooper() == null) { - Looper.prepare(); - } - - int requestExpiration = PresenceSetting.getCapabilityPollListSubscriptionExpiration(); - logger.print("getCapabilityPollListSubscriptionExpiration: " + requestExpiration); - if (requestExpiration == -1) { - requestExpiration = 30; - } - requestExpiration += 30; - - mResult = ResultCode.SUBSCRIBE_NOT_FOUND; - ArrayList<String> uriList = new ArrayList<String>(); - uriList.clear(); - - List<Contacts.Item> contacts = mPollingTask.mContacts; - for (int i = 0; i < contacts.size(); i++) { - Contacts.Item item = contacts.get(i); - uriList.add(getCompleteUri(item.number())); - } - int size = uriList.size(); - if (size <= 0) { - logger.debug("No contacts in polling task, no action."); - } else { - mResult = ResultCode.ERROR_SERVICE_NOT_AVAILABLE; - synchronized(mPollingSyncObj) { - RcsManager rcsManager = RcsManager.getInstance(mContext, 0); - if (rcsManager == null) { - logger.debug("rcsManager == null"); - } else { - try { - RcsPresence rcsPresence = rcsManager.getRcsPresenceInterface(); - if (rcsPresence == null) { - logger.debug("rcsPresence == null"); - } else { - logger.print("call requestCapability: " + size); - // If ret > 0 then it is the request Id, or it is result code. - int ret = rcsPresence.requestCapability(uriList, mClientListener); - if (ret > 0) { - mRequestId = ret; - mResult = ResultCode.SUCCESS; - } else { - mRequestId = -1; - mResult = ret; - } - } - } catch (RcsException ex) { - logger.print("RcsException", ex); - } - } - - if (mResult == ResultCode.SUCCESS) { - logger.print("Capability discovery success, RequestId = " + mRequestId); - mIsPolling = true; - } else { - logger.info("Capability discovery failure result = " + mResult); - mIsPolling = false; - } - - final long endTime = System.currentTimeMillis() + requestExpiration * 1000; - while(true) { - if (!mIsPolling) { - break; - } - - long delay = endTime - System.currentTimeMillis(); - if (delay <= 0) { - break; - } - - try { - mPollingSyncObj.wait(delay); - } catch (InterruptedException ex) { - } - } - } - } - - logger.print("The action final result = " + mResult); - mPollingTask.onPostExecute(mResult); - if (ResultCode.SUBSCRIBE_TEMPORARY_ERROR == mResult) { - mPollingTask.retry(); - } else { - mPollingTask.finish(mFullUpdated); - } - - return mResult; - } - - private String getCompleteUri(String phone) { - phone = "tel:" + phone; - return phone; - } - - @Override - protected void onPostExecute(Integer result) { - super.onPostExecute(result); - logger.print("onPostExecute(), result = " + result); - } -} - diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/PollingService.java b/rcs/presencepolling/src/com/android/service/ims/presence/PollingService.java deleted file mode 100644 index d6e4410f..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/PollingService.java +++ /dev/null @@ -1,118 +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.app.Service; -import android.content.Intent; -import android.os.Handler; -import android.os.IBinder; -import android.os.RemoteException; -import android.os.ServiceManager; -import android.os.SystemProperties; - -import com.android.ims.internal.Logger; - -public class PollingService extends Service { - /** - * The logger - */ - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private CapabilityPolling mCapabilityPolling = null; - - /** - * Constructor - */ - public PollingService() { - logger.debug("PollingService()"); - } - - @Override - public void onCreate() { - logger.debug("onCreate()"); - - if (isEabSupported()) { - mCapabilityPolling = CapabilityPolling.getInstance(this); - mCapabilityPolling.start(); - } - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - logger.debug("onStartCommand(), intent: " + intent + - ", flags: " + flags + ", startId: " + startId); - - if (!isRcsSupported()) { - stopSelf(); - return START_NOT_STICKY; - } - - return super.onStartCommand(intent, flags, startId); - } - - /** - * 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()) { - return null; - } - - logger.debug("onBind add services here"); - return null; - } - - private boolean isRcsSupported() { - String rcsSupported = SystemProperties.get("persist.rcs.supported"); - logger.info("persist.rcs.supported: " + rcsSupported); - return "1".equals(rcsSupported); - } - - private boolean isEabSupported() { - String eabSupported = SystemProperties.get("persist.eab.supported"); - logger.info("persist.eab.supported: " + eabSupported); - return ("0".equals(eabSupported)) ? false : true; - } -} - diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/PollingTask.java b/rcs/presencepolling/src/com/android/service/ims/presence/PollingTask.java deleted file mode 100644 index 69c40188..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/PollingTask.java +++ /dev/null @@ -1,256 +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.app.AlarmManager; -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.os.SystemClock; -import android.text.format.Time; - -import com.android.ims.internal.Logger; - -import java.util.ArrayList; -import java.util.List; - -public class PollingTask { - private Logger logger = Logger.getLogger(this.getClass().getName()); - private Context mContext = null; - - private static long sMaxId = 0; - public static final String ACTION_POLLING_RETRY_ALARM = - "com.android.service.ims.presence.capability_polling_retry"; - private PendingIntent mRetryAlarmIntent = null; - - public long mId; - public int mType; - public List<Contacts.Item> mContacts = new ArrayList<Contacts.Item>(); - - private long mTimeUnit; - private int mTotalRetry; - private int mCurrentRetry; - private long mLastUpdateTime; - - private boolean mCancelled = false; - private boolean mCompleted = false; - - public PollingTask(int type, List<Contacts.Item> list) { - mId = sMaxId++; - mType = type; - - mContacts.clear(); - for(int i = 0; i < list.size(); i++) { - Contacts.Item item = list.get(i); - mContacts.add(item); - } - - mCurrentRetry = 0; - mTotalRetry = 5; - mTimeUnit = 1800; // 1800s = 30 minutes - if (CapabilityPolling.ACTION_POLLING_NEW_CONTACTS == mType) { - mTotalRetry = 4; - mTimeUnit = 60; // 60s = 1 minute - } - mLastUpdateTime = 0; - } - - public void execute() { - PollingsQueue queue = PollingsQueue.getInstance(null); - if (queue == null) { - return; - } - - PollingAction action = new PollingAction(queue.getContext(), this); - action.execute(); - } - - public void finish(boolean fullUpdated) { - cancelRetryAlarm(); - - PollingsQueue queue = PollingsQueue.getInstance(null); - if (queue == null) { - return; - } - - mCompleted = fullUpdated ? true : false; - queue.remove(this); - } - - public void retry() { - mCurrentRetry += 1; - logger.print("retry mCurrentRetry=" + mCurrentRetry); - if (mCurrentRetry > mTotalRetry) { - logger.print("Retry finished for task: " + this); - updateTimeStampToCurrent(); - finish(false); - return; - } - - if (mCancelled) { - logger.print("Task is cancelled: " + this); - finish(false); - return; - } - - long delay = mTimeUnit; - for (int i = 0; i < mCurrentRetry - 1; i++) { - delay *= 2; - } - - logger.print("retry delay=" + delay); - - scheduleRetry(delay * 1000); - } - - public void cancel() { - mCancelled = true; - logger.print("Cancel this task: " + this); - - if (mRetryAlarmIntent != null) { - cancelRetryAlarm(); - finish(false); - } - } - - public void onPreExecute() { - logger.print("onPreExecute(), id = " + mId); - cancelRetryAlarm(); - } - - public void onPostExecute(int result) { - logger.print("onPostExecute(), result = " + result); - mLastUpdateTime = System.currentTimeMillis(); - } - - private void updateTimeStampToCurrent() { - if (mContext == null) { - return; - } - - EABContactManager contactManager = new EABContactManager( - mContext.getContentResolver(), mContext.getPackageName()); - for (int i = 0; i < mContacts.size(); i++) { - Contacts.Item item = mContacts.get(i); - - String number = item.number(); - long current = System.currentTimeMillis(); - EABContactManager.Request request = new EABContactManager.Request(number) - .setLastUpdatedTimeStamp(current); - int result = contactManager.update(request); - if (result <= 0) { - logger.debug("failed to update timestamp for contact: " + number); - } - } - } - - private void cancelRetryAlarm() { - if (mRetryAlarmIntent != null) { - if (mContext != null) { - AlarmManager alarmManager = (AlarmManager) - mContext.getSystemService(Context.ALARM_SERVICE); - alarmManager.cancel(mRetryAlarmIntent); - } - mRetryAlarmIntent = null; - } - } - - private void scheduleRetry(long msec) { - logger.print("scheduleRetry msec=" + msec); - - cancelRetryAlarm(); - - if (mContext == null) { - PollingsQueue queue = PollingsQueue.getInstance(null); - if (queue != null) { - mContext = queue.getContext(); - } - } - - if (mContext != null) { - Intent intent = new Intent(ACTION_POLLING_RETRY_ALARM); - intent.setClass(mContext, AlarmBroadcastReceiver.class); - intent.putExtra("pollingTaskId", mId); - - mRetryAlarmIntent = PendingIntent.getBroadcast(mContext, 0, intent, - PendingIntent.FLAG_UPDATE_CURRENT); - - AlarmManager alarmManager = (AlarmManager) - mContext.getSystemService(Context.ALARM_SERVICE); - alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, - SystemClock.elapsedRealtime() + msec, mRetryAlarmIntent); - } - } - - private String getTimeString(long time) { - if (time <= 0) { - time = System.currentTimeMillis(); - } - - Time tobj = new Time(); - tobj.set(time); - return String.format("%s.%s", tobj.format("%m-%d %H:%M:%S"), time % 1000); - } - - public boolean isCompleted() { - return mCompleted; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof PollingTask)) return false; - - PollingTask that = (PollingTask)o; - return (this.mId == that.mId) && (this.mType == that.mType); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("PollingTask { "); - sb.append("\nId: " + mId); - sb.append("\nType: " + mType); - sb.append("\nCurrentRetry: " + mCurrentRetry); - sb.append("\nTotalRetry: " + mTotalRetry); - sb.append("\nTimeUnit: " + mTimeUnit); - sb.append("\nLast update time: " + mLastUpdateTime + "(" + - getTimeString(mLastUpdateTime) + ")"); - sb.append("\nContacts: " + mContacts.size()); - for (int i = 0; i < mContacts.size(); i++) { - sb.append("\n"); - Contacts.Item item = mContacts.get(i); - sb.append("Number " + i + ": " + item.number()); - } - sb.append("\nCompleted: " + mCompleted); - sb.append(" }"); - return sb.toString(); - } -} - diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/PollingsQueue.java b/rcs/presencepolling/src/com/android/service/ims/presence/PollingsQueue.java deleted file mode 100644 index b833de76..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/PollingsQueue.java +++ /dev/null @@ -1,246 +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.Context; - -import com.android.ims.internal.Logger; - -import java.util.ArrayList; -import java.util.List; - -public class PollingsQueue { - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private Context mContext; - private CapabilityPolling mCapabilityPolling; - private List<PollingTask> mPollingTasks = new ArrayList<PollingTask>(); - private boolean mAskVerifyResult = false; - private int mVerifyCounts = 0; - - private static PollingsQueue sInstance = null; - public static synchronized PollingsQueue getInstance(Context context) { - if ((sInstance == null) && (context != null)) { - sInstance = new PollingsQueue(context); - } - - return sInstance; - } - - private PollingsQueue(Context context) { - mContext = context; - mPollingTasks.clear(); - } - - public synchronized void setCapabilityPolling(CapabilityPolling cp) { - mCapabilityPolling = cp; - } - - public CapabilityPolling getCapabilityPolling() { - return mCapabilityPolling; - } - - public Context getContext() { - return mContext; - } - - public synchronized void clear() { - mPollingTasks.clear(); - } - - public synchronized void add(int type, List<Contacts.Item> list) { - if (list.size() <= 0) { - return; - } - - List<Contacts.Item> contacts = new ArrayList<Contacts.Item>(); - contacts.clear(); - for(int i = 0; i < list.size(); i++) { - Contacts.Item item = list.get(i); - - boolean bExist = false; - for(int j = 0; j < contacts.size(); j++) { - Contacts.Item item0 = contacts.get(j); - if (item.equals(item0)) { - bExist = true; - break; - } - } - - for (int j = 0; j < mPollingTasks.size(); j++) { - if (bExist) { - break; - } - PollingTask task = mPollingTasks.get(j); - for(int k = 0; k < task.mContacts.size(); k++) { - Contacts.Item item0 = task.mContacts.get(k); - if (item.equals(item0)) { - bExist = true; - break; - } - } - } - if (bExist) { - continue; - } - - contacts.add(item); - if (type == CapabilityPolling.ACTION_POLLING_NORMAL) { - if (item.lastUpdateTime() == 0) { - type = CapabilityPolling.ACTION_POLLING_NEW_CONTACTS; - } - } - } - - PollingTask taskCancelled = null; - int nTasks = mPollingTasks.size(); - logger.print("Before add(), the existing tasks number: " + nTasks); - - if (contacts.size() <= 0) { - logger.debug("Empty/duplicated list, no request added."); - return; - } - - int maxEntriesInRequest = PresenceSetting.getMaxNumberOfEntriesInRequestContainedList(); - logger.print("getMaxNumberOfEntriesInRequestContainedList: " + maxEntriesInRequest); - if (maxEntriesInRequest == -1) { - maxEntriesInRequest = 100; - } - - int noOfIterations = contacts.size() / maxEntriesInRequest; - for (int loop = 0; loop <= noOfIterations; loop++) { - int entriesInRequest = maxEntriesInRequest; - if (loop == noOfIterations) { - entriesInRequest = contacts.size() % maxEntriesInRequest; - } - - List<Contacts.Item> cl = new ArrayList<Contacts.Item>(); - cl.clear(); - int pos = loop * maxEntriesInRequest; - for (int i = 0; i < entriesInRequest; i++) { - Contacts.Item item = contacts.get(pos); - cl.add(item); - pos++; - } - - if (cl.size() > 0) { - PollingTask task = new PollingTask(type, cl); - logger.debug("One new polling task added: " + task); - - boolean bInserted = false; - for (int i = 0; i < mPollingTasks.size(); i++) { - PollingTask task0 = mPollingTasks.get(i); - if (task.mType > task0.mType) { - bInserted = true; - mPollingTasks.add(i, task); - if ((i == 0) && (taskCancelled == null)) { - taskCancelled = task0; - } - break; - } - } - if (!bInserted) { - mPollingTasks.add(task); - } - } - } - - logger.print("After add(), the total tasks number: " + mPollingTasks.size()); - if (nTasks <= 0) { - if (mPollingTasks.size() > 0) { - PollingTask task = mPollingTasks.get(0); - task.execute(); - } - } else { - if (taskCancelled != null) { - taskCancelled.cancel(); - } - } - } - - public synchronized void remove(PollingTask task) { - int nTasks = mPollingTasks.size(); - if (nTasks <= 0) { - return; - } - - logger.print("Remove polling task: " + task); - if (task != null) { - for (int i = 0; i < nTasks; i++) { - PollingTask task0 = mPollingTasks.get(i); - if (task0.equals(task)) { - if (task.isCompleted()) { - mVerifyCounts = 0; - } else { - mAskVerifyResult = true; - } - mPollingTasks.remove(i); - break; - } - } - } - - if (mPollingTasks.size() > 0) { - PollingTask task0 = mPollingTasks.get(0); - task0.execute(); - } else { - if (mAskVerifyResult) { - mAskVerifyResult = false; - mVerifyCounts++; - if (mCapabilityPolling != null) { - mCapabilityPolling.enqueueVerifyPollingResult(mVerifyCounts); - } - } - } - } - - public synchronized void retry(long id) { - int nTasks = mPollingTasks.size(); - if (nTasks <= 0) { - return; - } - - PollingTask task0 = null; - for (int i = 0; i < nTasks; i++) { - PollingTask task = mPollingTasks.get(i); - if (task.mId == id) { - task0 = task; - break; - } - } - - if (task0 == null) { - logger.debug("Trigger wrong retry: " + id); - task0 = mPollingTasks.get(0); - } - - task0.execute(); - } -} - 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 6d716bd4..00000000 --- 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/presencepolling/src/com/android/service/ims/presence/PresenceContact.java b/rcs/presencepolling/src/com/android/service/ims/presence/PresenceContact.java deleted file mode 100644 index a9bd8a51..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/PresenceContact.java +++ /dev/null @@ -1,106 +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; - -public class PresenceContact { - public static final int VIDEO_CALLING_NOT_AVAILABLE = 0; - public static final int VIDEO_CALLING_AVAILABLE = 1; - - String mDisplayName = null; - String mPhoneNumber = null; - String mRawContactId = null; - String mContactId = null; - String mDataId = null; - boolean mIsVolteCapable = false; - boolean mIsVtCapable = false; - int mVtStatus = VIDEO_CALLING_NOT_AVAILABLE; - - String mVtUri = null; - - public PresenceContact(String name, String number, String rawContactId, - String contactId, String dataId) { - mDisplayName = name; - mPhoneNumber = number; - mRawContactId = rawContactId; - mContactId = contactId; - mDataId = dataId; - } - - public String getDisplayName() { - return mDisplayName; - } - - public String getPhoneNumber() { - return mPhoneNumber; - } - - public String getRawContactId() { - return mRawContactId; - } - - public String getContactId() { - return mContactId; - } - - public String getDataId() { - return mDataId; - } - - public boolean isVolteCapable() { - return mIsVolteCapable; - } - - public void setIsVolteCapable(boolean isVolteCapable) { - mIsVolteCapable = isVolteCapable; - } - - public boolean isVtCapable() { - return mIsVtCapable; - } - - public void setIsVtCapable(boolean isVtCapable) { - mIsVtCapable = isVtCapable; - } - - public int getVtStatus() { - return mVtStatus; - } - - public void setVtStatus(int vtAvailable) { - mVtStatus = vtAvailable; - } - - public String getVtUri() { - return mVtUri; - } - - public void setVtUri(String vtUri) { - mVtUri = vtUri; - } -} diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/PresencePreferences.java b/rcs/presencepolling/src/com/android/service/ims/presence/PresencePreferences.java deleted file mode 100644 index b777c5c8..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/PresencePreferences.java +++ /dev/null @@ -1,136 +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.Context; -import android.content.SharedPreferences; -import android.content.SharedPreferences.Editor; - -public class PresencePreferences { - private static final String PREFERENCES = "PresencePolling"; - private static PresencePreferences sInstance; - - private Context mContext = null; - private SharedPreferences mCommonPref = null; - - private PresencePreferences() { - } - - public void setContext(Context context) { - if (mContext == null) { - mContext = context; - mCommonPref = mContext.getSharedPreferences(PREFERENCES, Context.MODE_PRIVATE); - } - } - - public static PresencePreferences getInstance(){ - if (null == sInstance) { - sInstance = new PresencePreferences(); - } - return sInstance; - } - - private static final String CAPABILITY_DISCOVERY_TIME = "CapabilityDiscoveryTime"; - - public long lastCapabilityDiscoveryTime() { - if (mCommonPref == null) { - return 0; - } - - return mCommonPref.getLong(CAPABILITY_DISCOVERY_TIME, 0); - } - - public void updateCapabilityDiscoveryTime() { - if (mCommonPref == null) { - return; - } - - Editor editor = mCommonPref.edit(); - long time = System.currentTimeMillis(); - editor.putLong(CAPABILITY_DISCOVERY_TIME, time); - editor.commit(); - } - - private static final String PHONE_SUBSCRIBER_ID = "PhoneSubscriberId"; - public String getSubscriberId() { - if (mCommonPref == null) { - return null; - } - - return mCommonPref.getString(PHONE_SUBSCRIBER_ID, null); - } - - public void setSubscriberId(String id) { - if (mCommonPref == null) { - return; - } - - Editor editor = mCommonPref.edit(); - editor.putString(PHONE_SUBSCRIBER_ID, id); - editor.commit(); - } - - private static final String PHONE_LINE1_NUMBER = "PhoneLine1Number"; - public String getLine1Number() { - if (mCommonPref == null) { - return null; - } - - return mCommonPref.getString(PHONE_LINE1_NUMBER, null); - } - - public void setLine1Number(String number) { - if (mCommonPref == null) { - return; - } - - Editor editor = mCommonPref.edit(); - editor.putString(PHONE_LINE1_NUMBER, number); - editor.commit(); - } - - private static final String RCS_TEST_MODE = "RcsTestMode"; - public boolean getRcsTestMode() { - if (mCommonPref == null) { - return false; - } - - return mCommonPref.getInt(RCS_TEST_MODE, 0) == 1; - } - - public void setRcsTestMode(boolean test) { - if (mCommonPref == null) { - return; - } - - Editor editor = mCommonPref.edit(); - editor.putInt(RCS_TEST_MODE, test ? 1 : 0); - editor.commit(); - } -} diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/PresenceSetting.java b/rcs/presencepolling/src/com/android/service/ims/presence/PresenceSetting.java deleted file mode 100644 index 9452237b..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/PresenceSetting.java +++ /dev/null @@ -1,185 +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.Context; - -import com.android.ims.ImsConfig; -import com.android.ims.ImsException; -import com.android.ims.ImsManager; - -import com.android.ims.internal.Logger; - -public class PresenceSetting { - private static Logger logger = Logger.getLogger("PresenceSetting"); - private static Context sContext = null; - - public static void init(Context context) { - sContext = context; - } - - public static long getCapabilityPollInterval() { - long value = -1; - if (sContext != null) { - ImsManager imsManager = ImsManager.getInstance(sContext, 0); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - value = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.CAPABILITIES_POLL_INTERVAL); - logger.debug("Read ImsConfig_CapabilityPollInterval: " + value); - } - } catch (ImsException ex) { - } - } - } - if (value <= 0) { - value = 604800L; - logger.error("Failed to get CapabilityPollInterval, the default: " + value); - } - return value; - } - - public static long getCapabilityCacheExpiration() { - long value = -1; - if (sContext != null) { - ImsManager imsManager = ImsManager.getInstance(sContext, 0); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - value = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.CAPABILITIES_CACHE_EXPIRATION); - logger.debug("Read ImsConfig_CapabilityCacheExpiration: " + value); - } - } catch (ImsException ex) { - } - } - } - if (value <= 0) { - value = 7776000L; - logger.error("Failed to get CapabilityCacheExpiration, the default: " + value); - } - return value; - } - - public static int getPublishTimer() { - int value = -1; - if (sContext != null) { - ImsManager imsManager = ImsManager.getInstance(sContext, 0); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - value = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.PUBLISH_TIMER); - logger.debug("Read ImsConfig_PublishTimer: " + value); - } - } catch (ImsException ex) { - } - } - } - if (value <= 0) { - value = (int)1200; - logger.error("Failed to get PublishTimer, the default: " + value); - } - return value; - } - - public static int getPublishTimerExtended() { - int value = -1; - if (sContext != null) { - ImsManager imsManager = ImsManager.getInstance(sContext, 0); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - value = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.PUBLISH_TIMER_EXTENDED); - logger.debug("Read ImsConfig_PublishTimerExtended: " + value); - } - } catch (ImsException ex) { - } - } - } - if (value <= 0) { - value = (int)86400; - logger.error("Failed to get PublishTimerExtended, the default: " + value); - } - return value; - } - - public static int getMaxNumberOfEntriesInRequestContainedList() { - int value = -1; - if (sContext != null) { - ImsManager imsManager = ImsManager.getInstance(sContext, 0); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - value = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.MAX_NUMENTRIES_IN_RCL); - logger.debug("Read ImsConfig_MaxNumEntriesInRCL: " + value); - } - } catch (ImsException ex) { - } - } - } - if (value <= 0) { - value = (int)100; - logger.error("Failed to get MaxNumEntriesInRCL, the default: " + value); - } - return value; - } - - public static int getCapabilityPollListSubscriptionExpiration() { - int value = -1; - if (sContext != null) { - ImsManager imsManager = ImsManager.getInstance(sContext, 0); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - value = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.CAPAB_POLL_LIST_SUB_EXP); - logger.debug("Read ImsConfig_CapabPollListSubExp: " + value); - } - } catch (ImsException ex) { - } - } - } - if (value <= 0) { - value = (int)30; - logger.error("Failed to get CapabPollListSubExp, the default: " + value); - } - return value; - } -} - diff --git a/rcs/presencepolling/src/com/android/service/ims/presence/SharedPrefUtil.java b/rcs/presencepolling/src/com/android/service/ims/presence/SharedPrefUtil.java deleted file mode 100644 index 9e9a31e6..00000000 --- a/rcs/presencepolling/src/com/android/service/ims/presence/SharedPrefUtil.java +++ /dev/null @@ -1,197 +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.Context; -import android.content.SharedPreferences; - -public class SharedPrefUtil { - public static final String EAB_SHARED_PREF = "com.android.vt.eab"; - public static final String INIT_DONE = "init_done"; - private static final String CONTACT_CHANGED_PREF_KEY = "timestamp_change"; - private static final String CONTACT_DELETE_PREF_KEY = "timestamp_delete"; - private static final String CONTACT_PROFILE_CHANGED_PREF_KEY = "profile_timestamp_change"; - public static final String VIDEO_CALLING_GROUP_ID = "video_calling_group_id"; - public static final String VIDEO_CALLING_WARN_SHOW = "video_calling_warning_alert_show"; - public static final String VIDEO_CALL_OFF_WARN_SHOW = "video_call_off_alert_show"; - public static final String MOBILE_DATA_ON_WARN_SHOW = "mobile_data_on_alert_show"; - public static final String VOLTE_ON_WARN_SHOW = "volte_on_alert_show"; - public static final String TTY_OFF_WARN_SHOW = "tty_off_alert_show"; - public static final String VT_ON_WARN_SHOW = "vt_on_alert_show"; - - public static boolean isInitDone(Context context) { - SharedPreferences eabPref = context.getSharedPreferences( - EAB_SHARED_PREF, Context.MODE_PRIVATE); - return eabPref.getBoolean(INIT_DONE, false); - } - - public static void setInitDone(Context context, boolean initDone){ - SharedPreferences.Editor eabPref = context.getSharedPreferences( - EAB_SHARED_PREF, Context.MODE_PRIVATE).edit(); - eabPref.putBoolean(INIT_DONE, initDone).commit(); - } - - public static long getLastContactChangedTimestamp(Context context, long time) { - SharedPreferences pref = context.getSharedPreferences(EAB_SHARED_PREF, - Context.MODE_PRIVATE); - return pref.getLong(CONTACT_CHANGED_PREF_KEY, time); - } - - public static void saveLastContactChangedTimestamp(Context context, long time) { - SharedPreferences.Editor eabPref = context.getSharedPreferences( - EAB_SHARED_PREF, Context.MODE_PRIVATE).edit(); - eabPref.putLong(CONTACT_CHANGED_PREF_KEY, time).commit(); - } - - public static long getLastProfileContactChangedTimestamp(Context context, long time) { - SharedPreferences pref = context.getSharedPreferences(EAB_SHARED_PREF, - Context.MODE_PRIVATE); - return pref.getLong(CONTACT_PROFILE_CHANGED_PREF_KEY, time); - } - - public static void saveLastProfileContactChangedTimestamp(Context context, long time) { - SharedPreferences.Editor eabPref = context.getSharedPreferences( - EAB_SHARED_PREF, Context.MODE_PRIVATE).edit(); - eabPref.putLong(CONTACT_PROFILE_CHANGED_PREF_KEY, time).commit(); - } - - public static long getLastContactDeletedTimestamp(Context context, long time) { - SharedPreferences pref = context.getSharedPreferences(EAB_SHARED_PREF, - Context.MODE_PRIVATE); - return pref.getLong(CONTACT_DELETE_PREF_KEY, time); - } - - public static void saveLastContactDeletedTimestamp(Context context, long time) { - SharedPreferences.Editor eabPref = context.getSharedPreferences( - EAB_SHARED_PREF, Context.MODE_PRIVATE).edit(); - eabPref.putLong(CONTACT_DELETE_PREF_KEY, time).commit(); - } - - public static void setVideoCallingGroupId(Context context, - long videoCallingGroupId) { - SharedPreferences.Editor eabPref = context.getSharedPreferences( - EAB_SHARED_PREF, Context.MODE_PRIVATE).edit(); - eabPref.putLong(VIDEO_CALLING_GROUP_ID, videoCallingGroupId).commit(); - } - - public static long getVideoCallingGroupId(Context context){ - SharedPreferences eabPref = context.getSharedPreferences( - EAB_SHARED_PREF, Context.MODE_PRIVATE); - return eabPref.getLong(VIDEO_CALLING_GROUP_ID, 0L); - } - - public static void setVideoCallingWarnDisable(Context context, - boolean enable) { - SharedPreferences.Editor eabPref = context.getSharedPreferences( - EAB_SHARED_PREF, Context.MODE_PRIVATE).edit(); - eabPref.putBoolean(VIDEO_CALLING_WARN_SHOW, enable).apply(); - } - - public static boolean isVideoCallingWarnDisabled(Context context){ - SharedPreferences eabPref = context.getSharedPreferences( - EAB_SHARED_PREF, Context.MODE_PRIVATE); - return eabPref.getBoolean(VIDEO_CALLING_WARN_SHOW, false); - } - - public static void setVideoCallOffWarnDisable(Context context, boolean enable){ - SharedPreferences.Editor eabPref = context.getSharedPreferences(EAB_SHARED_PREF, - Context.MODE_PRIVATE).edit(); - eabPref.putBoolean(VIDEO_CALL_OFF_WARN_SHOW, enable).apply(); - } - - public static boolean isVideoCallOffWarnDisabled(Context context){ - SharedPreferences eabPref = context.getSharedPreferences(EAB_SHARED_PREF, - Context.MODE_PRIVATE); - return eabPref.getBoolean(VIDEO_CALL_OFF_WARN_SHOW, false); - } - - public static void setMobileDataOnWarnDisable(Context context, boolean enable){ - SharedPreferences.Editor eabPref = context.getSharedPreferences(EAB_SHARED_PREF, - Context.MODE_PRIVATE).edit(); - eabPref.putBoolean(MOBILE_DATA_ON_WARN_SHOW, enable).apply(); - } - - public static boolean isMobileDataOnWarnDisabled(Context context){ - SharedPreferences eabPref = context.getSharedPreferences(EAB_SHARED_PREF, - Context.MODE_PRIVATE); - return eabPref.getBoolean(MOBILE_DATA_ON_WARN_SHOW, false); - } - - public static void setVolteOnWarnDisable(Context context, boolean enable){ - SharedPreferences.Editor eabPref = context.getSharedPreferences(EAB_SHARED_PREF, - Context.MODE_PRIVATE).edit(); - eabPref.putBoolean(VOLTE_ON_WARN_SHOW, enable).apply(); - } - - public static boolean isVolteOnWarnDisabled(Context context){ - SharedPreferences eabPref = context.getSharedPreferences(EAB_SHARED_PREF, - Context.MODE_PRIVATE); - return eabPref.getBoolean(VOLTE_ON_WARN_SHOW, false); - } - - public static void setTtyOffWarnDisable(Context context, boolean enable){ - SharedPreferences.Editor eabPref = context.getSharedPreferences(EAB_SHARED_PREF, - Context.MODE_PRIVATE).edit(); - eabPref.putBoolean(TTY_OFF_WARN_SHOW, enable).apply(); - } - - public static boolean isTtyOffWarnDisabled(Context context){ - SharedPreferences eabPref = context.getSharedPreferences(EAB_SHARED_PREF, - Context.MODE_PRIVATE); - return eabPref.getBoolean(TTY_OFF_WARN_SHOW, false); - } - - public static void setVTOnWarnDisable(Context context, boolean enable){ - SharedPreferences.Editor eabPref = context.getSharedPreferences(EAB_SHARED_PREF, - Context.MODE_PRIVATE).edit(); - eabPref.putBoolean(VT_ON_WARN_SHOW, enable).apply(); - } - - public static boolean isVTOnWarnDisabled(Context context){ - SharedPreferences eabPref = context.getSharedPreferences(EAB_SHARED_PREF, - Context.MODE_PRIVATE); - return eabPref.getBoolean(VT_ON_WARN_SHOW, false); - } - - public static void resetEABSharedPref(Context context) { - SharedPreferences.Editor eabPref = context.getSharedPreferences( - EAB_SHARED_PREF, Context.MODE_PRIVATE).edit(); - eabPref.putBoolean(INIT_DONE, false); - eabPref.putLong(CONTACT_CHANGED_PREF_KEY, 0); - eabPref.putLong(CONTACT_DELETE_PREF_KEY, 0); - eabPref.putLong(CONTACT_PROFILE_CHANGED_PREF_KEY, 0); - eabPref.putBoolean(VIDEO_CALLING_WARN_SHOW, false); - eabPref.putBoolean(VIDEO_CALL_OFF_WARN_SHOW, false); - eabPref.putBoolean(MOBILE_DATA_ON_WARN_SHOW, false); - eabPref.putBoolean(VOLTE_ON_WARN_SHOW, false); - eabPref.putBoolean(TTY_OFF_WARN_SHOW, false); - eabPref.putBoolean(VT_ON_WARN_SHOW, false); - eabPref.commit(); - } -} diff --git a/rcs/rcsmanager/Android.mk b/rcs/rcsmanager/Android.mk deleted file mode 100644 index 93452c55..00000000 --- a/rcs/rcsmanager/Android.mk +++ /dev/null @@ -1,54 +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. - -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/src/java -LOCAL_SRC_FILES := \ - $(call all-java-files-under, src/java) -LOCAL_SRC_FILES += src/java/com/android/ims/internal/IRcsService.aidl \ - src/java/com/android/ims/internal/IRcsPresence.aidl \ - src/java/com/android/ims/IRcsPresenceListener.aidl - -LOCAL_JAVA_LIBRARIES += ims-common - -#LOCAL_MODULE_TAGS := optional -LOCAL_MODULE := com.android.ims.rcsmanager -LOCAL_REQUIRED_MODULES := com.android.ims.rcsmanager.xml -include $(BUILD_JAVA_LIBRARY) - -# We need to put the permissions XML file into /system/etc/permissions/ so the -# JAR can be dynamically loaded. -include $(CLEAR_VARS) -LOCAL_MODULE := com.android.ims.rcsmanager.xml -#LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_CLASS := ETC -LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions -LOCAL_SRC_FILES := $(LOCAL_MODULE) -include $(BUILD_PREBUILT) - - diff --git a/rcs/rcsmanager/AndroidManifest.xml b/rcs/rcsmanager/AndroidManifest.xml deleted file mode 100644 index 630c1705..00000000 --- a/rcs/rcsmanager/AndroidManifest.xml +++ /dev/null @@ -1,37 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - * 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. ---> - -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.ims.rcsmanager" - android:versionCode="1" - android:versionName="1.0" > - - <uses-sdk android:minSdkVersion="18" /> - -</manifest> diff --git a/rcs/rcsmanager/CleanSpec.mk b/rcs/rcsmanager/CleanSpec.mk deleted file mode 100644 index c104bc47..00000000 --- a/rcs/rcsmanager/CleanSpec.mk +++ /dev/null @@ -1,60 +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. ---> - -# If you don't need to do a full clean build but would like to touch -# a file or delete some intermediate files, add a clean step to the end -# of the list. These steps will only be run once, if they haven't been -# run before. -# -# E.g.: -# $(call add-clean-step, touch -c external/sqlite/sqlite3.h) -# $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates) -# -# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with -# files that are missing or have been moved. -# -# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory. -# Use $(OUT_DIR) to refer to the "out" directory. -# -# If you need to re-do something that's already mentioned, just copy -# the command and add it to the bottom of the list. E.g., if a change -# that you made last week required touching a file and a change you -# made today requires touching the same file, just copy the old -# touch step and add it to the end of the list. -# -# ************************************************ -# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST -# ************************************************ - -$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/com.android.ims.rcsmanager_intermediates) -$(call add-clean-step, rm -rf $(OUT_DIR)/target/product/*/obj/JAVA_LIBRARIES/com.android.ims.rcsmanager_intermediates) -$(call add-clean-step, rm -rf $(OUT_DIR)/target/product/*/obj/ETC/com.android.ims.rcsmanager.xml_intermediates) - -# ************************************************ -# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST -# ************************************************ diff --git a/rcs/rcsmanager/com.android.ims.rcsmanager.xml b/rcs/rcsmanager/com.android.ims.rcsmanager.xml deleted file mode 100644 index 0737f5dd..00000000 --- a/rcs/rcsmanager/com.android.ims.rcsmanager.xml +++ /dev/null @@ -1,33 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - * 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. ---> - -<permissions> - <library name="com.android.ims.rcsmanager" - file="/system/framework/com.android.ims.rcsmanager.jar"/> -</permissions> diff --git a/rcs/rcsmanager/src/java/com/android/ims/IRcsPresenceListener.aidl b/rcs/rcsmanager/src/java/com/android/ims/IRcsPresenceListener.aidl deleted file mode 100644 index fbffe73d..00000000 --- a/rcs/rcsmanager/src/java/com/android/ims/IRcsPresenceListener.aidl +++ /dev/null @@ -1,97 +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.ims; - -/** - * RcsPresenceListener is used by requestCapability and requestAvailability to return the - * status. The reqId which returned by requestCapability and requestAvailability can be - * used to match the result with request when share the implementation of IRcsPresenceListener. - * - * There are following normal cases: - * 1> The presence service got terminated notify after submitted the SUBSCRIBE request. - * onSuccess() ---> onFinish() - * 2> The presence service submitted the request to network and got "200 OK" for SIP response. - * but it didn't get "terminated notify" in expries + T1 timer. - * onSuccess() ---> onTimeout() - * 3> The presence service got error from SIP response for SUBSCRIBE request. - * onError() - * - * @hide - */ -interface IRcsPresenceListener { - /** - * It is called when it gets "200 OK" from network for SIP request or - * it gets "404 xxxx" for SIP request of single contact number (means not capable). - * - * @param reqId the request ID which returned by requestCapability or - * requestAvailability - * - * @see RcsPresence#requestCapability - * @see RcsPresence#requestAvailability - */ - void onSuccess(in int reqId); - - /** - * It is called when it gets local error or gets SIP error from network. - * - * @param reqId the request ID which returned by requestCapability or - * requestAvailability - * @param resultCode the result code which defined in RcsManager.ResultCode. - * - * @see RcsPresence#requestCapability - * @see RcsPresence#requestAvailability - * @see RcsManager.ResultCode - */ - void onError(in int reqId, in int resultCode); - - /** - * It is called when it gets the "terminated notify" from network. - * The presence service will not receive notify for the request any more after it got - * "terminated notify" from network. So onFinish means the requestCapability or - * requestAvailability had been finished completely. - * - * @param reqId the request ID which returned by requestCapability or - * requestAvailability - * - * @see RcsPresence#requestCapability - * @see RcsPresence#requestAvailability - */ - void onFinish(in int reqId); - - /** - * It is called when it is timeout to wait for the "terminated notify" from network. - * - * @param reqId the request ID which returned by requestCapability or - * requestAvailability - * - * @see RcsPresence#requestCapability - * @see RcsPresence#requestAvailability - */ - void onTimeout(in int reqId); -} diff --git a/rcs/rcsmanager/src/java/com/android/ims/RcsException.java b/rcs/rcsmanager/src/java/com/android/ims/RcsException.java deleted file mode 100644 index 0d5f36e5..00000000 --- a/rcs/rcsmanager/src/java/com/android/ims/RcsException.java +++ /dev/null @@ -1,64 +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.ims; - -/** - * This class defines a general RCS-related exception. - * - * @hide - */ -public class RcsException extends Exception { - - /** - * Refer to {@link RcsManager.ResultCode} - */ - private int mCode; - - public RcsException() { - } - - public RcsException(String message, int code) { - super(message); - mCode = code; - } - - public RcsException(String message, Throwable cause, int code) { - super(message, cause); - mCode = code; - } - - /** - * Gets the detailed exception code when RcsException is throwed - * - * @return the exception code in {@link RcsManager.ResultCode} - */ - public int getCode() { - return mCode; - } -} diff --git a/rcs/rcsmanager/src/java/com/android/ims/RcsManager.java b/rcs/rcsmanager/src/java/com/android/ims/RcsManager.java deleted file mode 100644 index 644d5672..00000000 --- a/rcs/rcsmanager/src/java/com/android/ims/RcsManager.java +++ /dev/null @@ -1,384 +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.ims; - -import android.content.Context; -import android.content.Intent; -import android.os.IBinder; -import android.os.IBinder.DeathRecipient; -import android.os.RemoteException; -import android.os.ServiceManager; -import android.telephony.Rlog; - -import com.android.ims.internal.IRcsService; -import com.android.ims.internal.IRcsPresence; - -import java.util.HashMap; - -/** - * Provides APIs for Rcs services, currently it supports presence only. - * This class is the starting point for any RCS actions. - * You can acquire an instance of it with {@link #getInstance getInstance()}. - * - * @hide - */ -public class RcsManager { - /** - * For accessing the RCS related service. - * Internal use only. - * - * @hide - */ - private static final String RCS_SERVICE = "rcs"; - - /** - * Part of the ACTION_RCS_SERVICE_AVAILABLE and ACTION_RCS_SERVICE_UNAVAILABLE intents. - * A long value; the subId corresponding to the RCS service. For MSIM implementation. - * - * @see #ACTION_RCS_SERVICE_AVAILABLE - * @see #ACTION_RCS_SERVICE_UNAVAILABLE - */ - public static final String EXTRA_SUBID = "android:subid"; - - /** - * Action to broadcast when RcsService is available. - * - * @see #EXTRA_SUBID - */ - public static final String ACTION_RCS_SERVICE_AVAILABLE = - "com.android.ims.ACTION_RCS_SERVICE_AVAILABLE"; - - /** - * Action to broadcast when RcsService is unavailable (such as ims is not registered). - * - * @see #EXTRA_SUBID - */ - public static final String ACTION_RCS_SERVICE_UNAVAILABLE = - "com.android.ims.ACTION_RCS_SERVICE_UNAVAILABLE"; - - /** - * Action to broadcast when RcsService is died. - * The caller can listen to the intent to clean the pending request. - * - * It takes the extra parameter subid as well since it depends on OEM implementation for - * RcsService. It will not send broadcast for ACTION_RCS_SERVICE_UNAVAILABLE under the case. - * - * @see #EXTRA_SUBID - */ - public static final String ACTION_RCS_SERVICE_DIED = - "com.android.ims.ACTION_RCS_SERVICE_DIED"; - - public static class ResultCode { - /** - * The code is used when the request is success. - */ - public static final int SUCCESS =0; - - /** - * Return this code if the service doesn't be enabled on the phone. - * As per the requirement the feature can be enabled/disabled by DM. - */ - public static final int ERROR_SERVICE_NOT_ENABLED = -1; - - /** - * Return this code if the service didn't publish yet. - */ - public static final int ERROR_SERVICE_NOT_PUBLISHED = -2; - - /** - * The service is not available, for example it is 1x only - */ - public static final int ERROR_SERVICE_NOT_AVAILABLE = -3; - - /** - * SUBSCRIBE Error base - */ - public static final int SUBSCRIBER_ERROR_CODE_START = ERROR_SERVICE_NOT_AVAILABLE; - - /** - * Temporary error and need retry later. - * such as: - * 503 Service Unavailable - * Device shall retry with exponential back-off - * - * 408 Request Timeout - * Device shall retry with exponential back-off - * - * 423 Interval Too Short. Requested expiry interval too short and server rejects it - * Device shall re-attempt subscription after changing the expiration interval in - * the Expires header field to be equal to or greater than the expiration interval - * within the Min-Expires header field of the 423 response - */ - public static final int SUBSCRIBE_TEMPORARY_ERROR = SUBSCRIBER_ERROR_CODE_START - 1; - - /** - * receives 403 (reason="User Not Registered"). - * Re-Register to IMS then retry the single resource subscription if capability polling. - * availability fetch: no retry. - */ - public static final int SUBSCRIBE_NOT_REGISTERED = SUBSCRIBER_ERROR_CODE_START - 2; - - /** - * Responding for 403 - not authorized (Requestor) - * No retry. - */ - public static final int SUBSCRIBE_NOT_AUTHORIZED_FOR_PRESENCE = - SUBSCRIBER_ERROR_CODE_START - 3; - - /** - * Responding for "403 Forbidden" or "403" - * Handle it as same as 404 Not found. - * No retry. - */ - public static final int SUBSCRIBE_FORBIDDEN = SUBSCRIBER_ERROR_CODE_START - 4; - - /** - * Responding for 404 (target number) - * No retry. - */ - public static final int SUBSCRIBE_NOT_FOUND = SUBSCRIBER_ERROR_CODE_START - 5; - - /** - * Responding for 413 - Too Large. Top app need shrink the size - * of request contact list and resend the request - */ - public static final int SUBSCRIBE_TOO_LARGE = SUBSCRIBER_ERROR_CODE_START - 6; - - /** - * All subscribe errors not covered by specific errors - * Other 4xx/5xx/6xx - * - * Device shall not retry - */ - public static final int SUBSCRIBE_GENIRIC_FAILURE = SUBSCRIBER_ERROR_CODE_START - 7; - - /** - * Invalid parameter - The caller should check the parameter. - */ - public static final int SUBSCRIBE_INVALID_PARAM = SUBSCRIBER_ERROR_CODE_START - 8; - - /** - * Fetch error - The RCS statck failed to fetch the presence information. - */ - public static final int SUBSCRIBE_FETCH_ERROR = SUBSCRIBER_ERROR_CODE_START - 9; - - /** - * Request timeout - The RCS statck returns timeout error. - */ - public static final int SUBSCRIBE_REQUEST_TIMEOUT = SUBSCRIBER_ERROR_CODE_START - 10; - - /** - * Insufficient memory - The RCS statck returns the insufficient memory error. - */ - public static final int SUBSCRIBE_INSUFFICIENT_MEMORY = SUBSCRIBER_ERROR_CODE_START - 11; - - /** - * Lost network error - The RCS statck returns the lost network error. - */ - public static final int SUBSCRIBE_LOST_NETWORK = SUBSCRIBER_ERROR_CODE_START - 12; - - /** - * Not supported error - The RCS statck returns the not supported error. - */ - public static final int SUBSCRIBE_NOT_SUPPORTED = SUBSCRIBER_ERROR_CODE_START - 13; - - /** - * Generic error - RCS Presence stack returns generic error - */ - public static final int SUBSCRIBE_GENERIC = SUBSCRIBER_ERROR_CODE_START - 14; - - /** - * There is a request for the same number in queue. - */ - public static final int SUBSCRIBE_ALREADY_IN_QUEUE = SUBSCRIBER_ERROR_CODE_START - 16; - - /** - * Request too frequently. - */ - public static final int SUBSCRIBE_TOO_FREQUENTLY = SUBSCRIBER_ERROR_CODE_START - 17; - - /** - * The last Subscriber error code - */ - public static final int SUBSCRIBER_ERROR_CODE_END = SUBSCRIBER_ERROR_CODE_START - 17; - }; - - private static final String TAG = "RcsManager"; - private static final boolean DBG = true; - - private static HashMap<Integer, RcsManager> sRcsManagerInstances = - new HashMap<Integer, RcsManager>(); - - private Context mContext; - private int mSubId; - private IRcsService mRcsService = null; - private RcsServiceDeathRecipient mDeathRecipient = new RcsServiceDeathRecipient(); - - // Interface for presence - // TODO: Could add other RCS service such RcsChat, RcsFt later. - private RcsPresence mRcsPresence = null; - - /** - * Gets a manager instance. - * - * @param context application context for creating the manager object - * @param subId the subscription ID for the RCS Service - * @return the manager instance corresponding to the subId - */ - public static RcsManager getInstance(Context context, int subId) { - synchronized (sRcsManagerInstances) { - if (sRcsManagerInstances.containsKey(subId)){ - return sRcsManagerInstances.get(subId); - } - - RcsManager mgr = new RcsManager(context, subId); - sRcsManagerInstances.put(subId, mgr); - - return mgr; - } - } - - private RcsManager(Context context, int subId) { - mContext = context; - mSubId = subId; - createRcsService(true); - } - - /** - * return true if the rcs service is ready for use. - */ - public boolean isRcsServiceAvailable() { - if (DBG) Rlog.d(TAG, "call isRcsServiceAvailable ..."); - - boolean ret = false; - - try { - checkAndThrowExceptionIfServiceUnavailable(); - - ret = mRcsService.isRcsServiceAvailable(); - } catch (RemoteException e) { - // return false under the case. - Rlog.e(TAG, "isRcsServiceAvailable RemoteException", e); - }catch (RcsException e){ - // return false under the case. - Rlog.e(TAG, "isRcsServiceAvailable RcsException", e); - } - - if (DBG) Rlog.d(TAG, "isRcsServiceAvailable ret =" + ret); - return ret; - } - - /** - * Gets the presence interface - * - * @return the RcsPresence instance. - * @throws if getting the RcsPresence interface results in an error. - */ - public RcsPresence getRcsPresenceInterface() throws RcsException { - - if (mRcsPresence == null) { - checkAndThrowExceptionIfServiceUnavailable(); - - try { - IRcsPresence rcsPresence = mRcsService.getRcsPresenceInterface(); - if (rcsPresence == null) { - throw new RcsException("getRcsPresenceInterface()", - ResultCode.ERROR_SERVICE_NOT_AVAILABLE); - } - mRcsPresence = new RcsPresence(rcsPresence); - } catch (RemoteException e) { - throw new RcsException("getRcsPresenceInterface()", e, - ResultCode.ERROR_SERVICE_NOT_AVAILABLE); - } - } - if (DBG) Rlog.d(TAG, "getRcsPresenceInterface(), mRcsPresence= " + mRcsPresence); - return mRcsPresence; - } - - /** - * Binds the RCS service only if the service is not created. - */ - private void checkAndThrowExceptionIfServiceUnavailable() - throws RcsException { - if (mRcsService == null) { - createRcsService(true); - - if (mRcsService == null) { - throw new RcsException("Service is unavailable", - ResultCode.ERROR_SERVICE_NOT_AVAILABLE); - } - } - } - - private static String getRcsServiceName(int subId) { - // use the same mechanism as IMS_SERVICE? - return RCS_SERVICE; - } - - /** - * Binds the RCS service. - */ - private void createRcsService(boolean checkService) { - if (checkService) { - IBinder binder = ServiceManager.checkService(getRcsServiceName(mSubId)); - - if (binder == null) { - return; - } - } - - IBinder b = ServiceManager.getService(getRcsServiceName(mSubId)); - - if (b != null) { - try { - b.linkToDeath(mDeathRecipient, 0); - } catch (RemoteException e) { - } - } - - mRcsService = IRcsService.Stub.asInterface(b); - } - - /** - * Death recipient class for monitoring RCS service. - */ - private class RcsServiceDeathRecipient implements IBinder.DeathRecipient { - @Override - public void binderDied() { - mRcsService = null; - mRcsPresence = null; - - if (mContext != null) { - Intent intent = new Intent(ACTION_RCS_SERVICE_DIED); - intent.putExtra(EXTRA_SUBID, mSubId); - mContext.sendBroadcast(new Intent(intent)); - } - } - } -} diff --git a/rcs/rcsmanager/src/java/com/android/ims/RcsPresence.java b/rcs/rcsmanager/src/java/com/android/ims/RcsPresence.java deleted file mode 100644 index c52e7e99..00000000 --- a/rcs/rcsmanager/src/java/com/android/ims/RcsPresence.java +++ /dev/null @@ -1,305 +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.ims; - -import java.util.List; -import java.util.ArrayList; -import android.content.Intent; -import android.os.RemoteException; -import android.util.Log; - -import com.android.ims.internal.IRcsPresence; -import com.android.ims.RcsManager.ResultCode; - -/** - * - * @hide - */ -public class RcsPresence { - static final String TAG = "RcsPresence"; - private boolean DBG = true; - private IRcsPresence mIRcsPresence = null; - - /** - * Key to retrieve the RcsPresenceInfo list from intent ACTION_PRESENCE_CHANGED - * The RcsPresenceInfo list can be got by the following function call: - * ArrayList<RcsPresenceInfo> rcsPresenceInfoList = intent.getParcelableArrayListExtra( - * RcsPresence.EXTRA_PRESENCE_INFO_LIST); - * - * @see RcsPresenceInfo - */ - public static final String EXTRA_PRESENCE_INFO_LIST = "presence_info_list"; - - /** - * Key to retrieve the subscription ID. This is for muliti-SIM implementation. - */ - public static final String EXTRA_SUBID = "android:subid"; - - /** - * The intent will be broadcasted when the presence changed. - * It happens on the following cases: - * 1. When the phone gets a NOTIFY from network. - * 2. When the phone gets some SUBSCRIBE error from network for some case (such as 404). - * It takes two extra parameters: - * 1. EXTRA_PRESENCE_INFO_LIST - * need to get it by the following statement: - * ArrayList<RcsPresenceInfo> rcsPresenceInfoList = intent.getParcelableArrayListExtra( - * RcsPresence.EXTRA_PRESENCE_INFO_LIST); - * 2. EXTRA_SUBID - * - * @see RcsPresenceInfO - * @see EXTRA_PRESENCE_INFO_LIST - * @see EXTRA_SUBID - */ - public static final String ACTION_PRESENCE_CHANGED = "com.android.ims.ACTION_PRESENCE_CHANGED"; - - /** - * Key to retrieve "publish_state" for - * intent ACTION_PUBLISH_STATE_CHANGED. - * - * @See PublishState. - * @see ACTION_PUBLISH_STATE_CHANGED - */ - public static final String EXTRA_PUBLISH_STATE = "publish_state"; - - /** - * The intent will be broadcasted when latest publish status changed - * It takes two extra parameters: - * 1. EXTRA_PUBLISH_STATE - * 2. EXTRA_SUBID - * - * @see #EXTRA_PUBLISH_STATE - * @see #EXTRA_SUBID - * @see PublishState - */ - public static final String ACTION_PUBLISH_STATE_CHANGED = - "com.android.ims.ACTION_PUBLISH_STATUS_CHANGED"; - - /** - * The last publish state - */ - public static class PublishState { - /** - * The phone is PUBLISH_STATE_200_OK when - * the response of the last publish is "200 OK" - */ - public static final int PUBLISH_STATE_200_OK = 0; - - /** - * The phone didn't publish after power on. - * the phone didn't get any publish response yet. - */ - public static final int PUBLISH_STATE_NOT_PUBLISHED = 1; - - /** - * The phone is PUBLISH_STATE_VOLTE_PROVISION_ERROR when the response is one of items - * in config_volte_provision_error_on_publish_response for PUBLISH or - * in config_volte_provision_error_on_subscribe_response for SUBSCRIBE. - */ - public static final int PUBLISH_STATE_VOLTE_PROVISION_ERROR = 2; - - /** - * The phone is PUBLISH_STATE_RCS_PROVISION_ERROR when the response is one of items - * in config_rcs_provision_error_on_publish_response for PUBLISH or - * in config_rcs_provision_error_on_subscribe_response for SUBSCRIBE. - */ - public static final int PUBLISH_STATE_RCS_PROVISION_ERROR = 3; - - /** - * The phone is PUBLISH_STATE_REQUEST_TIMEOUT when - * The response of the last publish is "408 Request Timeout". - */ - public static final int PUBLISH_STATE_REQUEST_TIMEOUT = 4; - - /** - * The phone is PUBLISH_STATE_OTHER_ERROR when - * the response of the last publish is other temp error. Such as - * 503 Service Unavailable - * Device shall retry with exponential back-off - * - * 423 Interval Too Short. Requested expiry interval too short and server rejects it - * Device shall re-attempt subscription after changing the expiration interval in - * the Expires header field to be equal to or greater than the expiration interval - * within the Min-Expires header field of the 423 response - * - * ... - */ - public static final int PUBLISH_STATE_OTHER_ERROR = 5; - }; - - /** - * Constructor. - * @param presenceService the IRcsPresence which get by RcsManager.getRcsPresenceInterface. - * - * @see RcsManager#getRcsPresenceInterface - */ - public RcsPresence(IRcsPresence presenceService) { - if (DBG) Log.d(TAG, "IRcsPresence creates"); - - mIRcsPresence = presenceService; - } - - /** - * Send the request to the server to get the capability. - * 1. If the presence service sent the request to network successfully - * then it will return the request ID (>0). It will not wait for the response from - * network. The response from network will be returned by callback onSuccess() or onError(). - * 2. If the presence service failed to send the request to network then it will return error - * code which is defined by RcsManager.ResultCode (<0). - * 3. If the network returns "200 OK" for a request then the listener.onSuccess() will be - * called by presence service. - * 4. If the network resturns "404" for a single target number then it means the target - * number is not VoLte capable, so the listener.onSuccess() will be called and intent - * ACTION_PRESENCE_CHANGED will be broadcasted by presence service. - * 5. If the network returns other error then the listener.onError() will be called by - * presence service. - * 6. If the network returns "200 OK" then we can expect the presence service receives notify - * from network. If the presence service receives notify then it will broadcast the - * intent ACTION_PRESENCE_CHANGED. If the notify state is "terminated" then the - * listener.onFinish() will be called by presence service as well. - * 7. If the presence service doesn't get response after "Subscribe Expiration + T1" then the - * listener.onTimeout() will be called by presence service. - * - * @param contactsNumber the contact number list which will be requested. - * @param listener the IRcsPresenceListener which will return the status and response. - * - * @return the request ID if it is >0. Or it is RcsManager.ResultCode for error. - * - * @see IRcsPresenceListener - * @see RcsManager.ResultCode - */ - public int requestCapability(List<String> contactsNumber, - IRcsPresenceListener listener) throws RcsException { - if (DBG) Log.d(TAG, "call requestCapability, contactsNumber=" + contactsNumber); - int ret = ResultCode.ERROR_SERVICE_NOT_AVAILABLE; - - try { - ret = mIRcsPresence.requestCapability(contactsNumber, listener); - } catch (RemoteException e) { - throw new RcsException("requestCapability", e, - ResultCode.ERROR_SERVICE_NOT_AVAILABLE); - } - - if (DBG) Log.d(TAG, "requestCapability ret =" + ret); - return ret; - } - - /** - * Send the request to the server to get the availability. - * 1. If the presence service sent the request to network successfully then it will return - * the request ID (>0). - * 2. If the presence serive failed to send the request to network then it will return error - * code which is defined by RcsManager.ResultCode (<0). - * 3. If the network returns "200 OK" for a request then the listener.onSuccess() will be - * called by presence service. - * 4. If the network resturns "404" then it means the target number is not VoLte capable, - * so the listener.onSuccess() will be called and intent ACTION_PRESENCE_CHANGED will be - * broadcasted by presence service. - * 5. If the network returns other error code then the listener.onError() will be called by - * presence service. - * 6. If the network returns "200 OK" then we can expect the presence service receives notify - * from network. If the presence service receives notify then it will broadcast the intent - * ACTION_PRESENCE_CHANGED. If the notify state is "terminated" then the listener.onFinish() - * will be called by presence service as well. - * 7. If the presence service doesn't get response after "Subscribe Expiration + T1" then it - * will call listener.onTimeout(). - * - * @param contactNumber the contact which will request the availability. - * Only support phone number at present. - * @param listener the IRcsPresenceListener to get the response. - * - * @return the request ID if it is >0. Or it is RcsManager.ResultCode for error. - * - * @see IRcsPresenceListener - * @see RcsManager.ResultCode - * @see RcsPresence.ACTION_PRESENCE_CHANGED - */ - public int requestAvailability(String contactNumber, IRcsPresenceListener listener) - throws RcsException { - if (DBG) Log.d(TAG, "call requestAvailability, contactNumber=" + contactNumber); - int ret = ResultCode.ERROR_SERVICE_NOT_AVAILABLE; - - try { - ret = mIRcsPresence.requestAvailability(contactNumber, listener); - } catch (RemoteException e) { - throw new RcsException("requestAvailability", e, - ResultCode.ERROR_SERVICE_NOT_AVAILABLE); - } - - if (DBG) Log.d(TAG, "requestAvailability ret =" + ret); - return ret; - } - - /** - * Same as requestAvailability. but requestAvailability will consider throttle to avoid too - * fast call. Which means it will not send the request to network in next 60s for the same - * request. - * The error code SUBSCRIBE_TOO_FREQUENTLY will be returned under the case. - * But for this funcation it will always send the request to network. - * - * @see IRcsPresenceListener - * @see RcsManager.ResultCode - * @see RcsPresence.ACTION_PRESENCE_CHANGED - * @see ResultCode.SUBSCRIBE_TOO_FREQUENTLY - */ - public int requestAvailabilityNoThrottle(String contactNumber, IRcsPresenceListener listener) - throws RcsException { - if (DBG) Log.d(TAG, "call requestAvailabilityNoThrottle, contactNumber=" + contactNumber); - int ret = ResultCode.ERROR_SERVICE_NOT_AVAILABLE; - - try { - ret = mIRcsPresence.requestAvailabilityNoThrottle(contactNumber, listener); - } catch (RemoteException e) { - throw new RcsException("requestAvailabilityNoThrottle", e, - ResultCode.ERROR_SERVICE_NOT_AVAILABLE); - } - - if (DBG) Log.d(TAG, "requestAvailabilityNoThrottle ret =" + ret); - return ret; - } - - /** - * Get the latest publish state. - * - * @see PublishState - */ - public int getPublishState() throws RcsException { - int ret = PublishState.PUBLISH_STATE_NOT_PUBLISHED; - try { - ret = mIRcsPresence.getPublishState(); - } catch (RemoteException e) { - throw new RcsException("getPublishState", e, - ResultCode.ERROR_SERVICE_NOT_AVAILABLE); - } - - if (DBG) Log.d(TAG, "getPublishState ret =" + ret); - return ret; - } -} - diff --git a/rcs/rcsmanager/src/java/com/android/ims/RcsPresenceInfo.aidl b/rcs/rcsmanager/src/java/com/android/ims/RcsPresenceInfo.aidl deleted file mode 100644 index 58b61309..00000000 --- a/rcs/rcsmanager/src/java/com/android/ims/RcsPresenceInfo.aidl +++ /dev/null @@ -1,34 +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.ims; - -/** - * @hide - */ -parcelable RcsPresenceInfo; diff --git a/rcs/rcsmanager/src/java/com/android/ims/RcsPresenceInfo.java b/rcs/rcsmanager/src/java/com/android/ims/RcsPresenceInfo.java deleted file mode 100644 index 8a5b913e..00000000 --- a/rcs/rcsmanager/src/java/com/android/ims/RcsPresenceInfo.java +++ /dev/null @@ -1,354 +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.ims; - -import android.os.Bundle; -import android.os.Parcel; -import android.os.Parcelable; -import android.net.Uri; - -/** - * RcsPresenceInfo is the class for presence information. - * It is used to pass information to application for inent ACTION_PRESENCE_CHANGED - * need to get it by the following statement: - * ArrayList<RcsPresenceInfo> rcsPresenceInfoList = intent.getParcelableArrayListExtra( - * RcsPresence.EXTRA_PRESENCE_INFO_LIST); - * - * @see RcsPresence#ACTION_PRESENCE_CHANGED - * - * @hide - */ -public class RcsPresenceInfo implements Parcelable { - /** - * Key for save contact_number. - * It is passed by getCapabilityByContacts or getAvailability - * - * @see #getContactNumber - */ - private static final String CONTACT_NUMBER = "contact_number"; - - /** - * Key for the flag to indicate if the number is volte enabled. - * - * @see #getVolteStatus - */ - public static final String VOLTE_STATUS = "volte_status"; - - /** - * The Volte status: - * If the contact got the 404 for single contact fetch. - * or it got "rejected", "noresource" and "giveup", then it is - * VOLTE_DISABLED. Or it is VOLTE_ENBLED. - * If we didn't get a success polling yet then it is VOLTE_UNKNOWN. - */ - public static class VolteStatus{ - /** - * Didn't poll yet. - */ - public static final int VOLTE_UNKNOWN = -1; - - /** - * Volte disabled for 404 response for single contact fetch - * or get "rejected", "noresource" and "giveup" notification. - */ - public static final int VOLTE_DISABLED = 0; - - /** - * Volte enabled for get proper notification. - */ - public static final int VOLTE_ENABLED = 1; - } - - /** - * For extension consideration we deinfed the sercice type here. - * Currently we only support the VoLte call and VT call. - * - * The service type for RCS - */ - public static interface ServiceType { - /** - * For VoLte call. - */ - public static final int VOLTE_CALL = 1; - - /** - * For VT call. - */ - public static final int VT_CALL = 2; - } - - /** - * Service state - * - * @see #getServiceState - */ - public static class ServiceState { - /** - * ONLINE means the servie is available. - */ - public static final int ONLINE = 1; - - /** - * OFFLINE means the service is not available. - */ - public static final int OFFLINE = 0; - - /** - * UNKNOWN means the presence service information didn't be got yet. - */ - public static final int UNKNOWN = -1; - } - - /** - * The presence information is maintained by key and value pair. - * ServiceInfoKey defines the key of the current supported information. - */ - public static class ServiceInfoKey { - /** - * Service type. It is defined by ServiceType. - * - * @see ServiceType - */ - public static final String SERVICE_TYPE = "service_type"; // VOLTE_CALL,etc - - /** - * Service state. It is defined by ServiceState. - * - * @see ServiceState - * @see #getServiceState - */ - public static final String STATE = "state"; // ONLINE, etc. - - /** - * The service contact. For example, the phone requests presence information for number - * "12345678", the service responses the presence with "987654321" as the service number - * of video call. Then the phone should start the video call with "987654321". - * The "987654321" is the service number. - * - * @see #getServiceContact - */ - public static final String SERVICE_CONTACT = "service_contact"; - - /** - * The timestamp which got from network. - * - * @see #getTimeStamp - */ - public static final String TIMESTAMP = "timestamp"; - } - - /** - * Return the contact number. - * It is passed by getCapabilityByContacts or getAvailability - * - * @return the contact number which has been passed in. - * - * @see #CONTACT_NUMBER - */ - public String getContactNumber() { - return mServiceInfo.getString(CONTACT_NUMBER); - } - - /** - * @Return the VolteStatus. - */ - public int getVolteStatus(){ - return mServiceInfo.getInt(VOLTE_STATUS); - } - - /** - * Return the ServiceState of the specific serviceType. - * - * @param serviceType it is defined by ServiceType. - * - * @return the service presence state which has been described in ServiceInfoKey. - * - * @see ServiceType - * @see ServiceState - * @see ServiceInfoKey#STATE - */ - public int getServiceState(int serviceType) { - return getServiceInfo(serviceType, ServiceInfoKey.STATE, ServiceState.UNKNOWN); - } - - /** - * Return the service contact of the specific serviceType. - * - * @param serviceType It is defined by ServiceType. - * - * @return the service contact which is described in ServiceInfoKey. - * - * @see ServiceType - * @see ServiceInfoKey#SERVICE_CONTACT - */ - public String getServiceContact(int serviceType) { - return getServiceInfo(serviceType, ServiceInfoKey.SERVICE_CONTACT, ""); - } - - /** - * Return the timestamp. - * - * @param serviceType It is defined by ServiceType. - * - * @return the timestamp which has been got from server. - * - * @see ServiceType - * @see ServiceInfoKey#TIMESTAMP - */ - public long getTimeStamp(int serviceType) { - return getServiceInfo(serviceType, ServiceInfoKey.TIMESTAMP, 0L); - } - - /** - * @hide - */ - public RcsPresenceInfo() { - } - - /** - * @hide - */ - public RcsPresenceInfo(Parcel source) { - mServiceInfo.readFromParcel(source); - } - - /** - * @hide - */ - private Bundle getBundle() { - return mServiceInfo; - } - - /** - * @hide - */ - public RcsPresenceInfo(String contactNumber,int volteStatus, - int ipVoiceCallState, String ipVoiceCallServiceNumber, long ipVoiceCallTimestamp, - int ipVideoCallState, String ipVideoCallServiceNumber, long ipVideoCallTimestamp) { - mServiceInfo.putString(CONTACT_NUMBER, contactNumber); - mServiceInfo.putInt(VOLTE_STATUS, volteStatus); - - set(ServiceType.VOLTE_CALL, ipVoiceCallState, ipVoiceCallServiceNumber, - ipVoiceCallTimestamp); - - set(ServiceType.VT_CALL, ipVideoCallState, ipVideoCallServiceNumber, - ipVideoCallTimestamp); - } - - private void set(int serviceType, int state, String serviceNumber, long timestamp) { - Bundle capability = new Bundle(); - - capability.putInt(ServiceInfoKey.SERVICE_TYPE, serviceType); - capability.putInt(ServiceInfoKey.STATE, state); - capability.putString(ServiceInfoKey.SERVICE_CONTACT, serviceNumber); - capability.putLong(ServiceInfoKey.TIMESTAMP, timestamp); - - mServiceInfo.putBundle(String.valueOf(serviceType), capability); - } - - /** - * Overload - * @hide - */ - public static final Parcelable.Creator<RcsPresenceInfo> CREATOR = new - Parcelable.Creator<RcsPresenceInfo>() { - public RcsPresenceInfo createFromParcel(Parcel in) { - return new RcsPresenceInfo(in); - } - - public RcsPresenceInfo[] newArray(int size) { - return new RcsPresenceInfo[size]; - } - }; - - /** - * Overload - * @hide - */ - public void writeToParcel(Parcel dest, int flags) { - mServiceInfo.writeToParcel(dest, flags); - } - - /** - * Overload - * @hide - */ - public int describeContents() { - return 0; - } - - private Bundle mServiceInfo = new Bundle(); - - private String getServiceInfo(int serviceType, String infoKey, String defaultValue) { - Bundle serviceInfo = mServiceInfo.getBundle(String.valueOf(serviceType)); - - if (serviceInfo != null) { - return serviceInfo.getString(infoKey); - } - return defaultValue; - } - - private long getServiceInfo(int serviceType, String infoKey, long defaultValue) { - Bundle serviceInfo = mServiceInfo.getBundle(String.valueOf(serviceType)); - if (serviceInfo != null) { - return serviceInfo.getLong(infoKey); - } - - return defaultValue; - } - - private int getServiceInfo(int serviceType, String infoType, int defaultValue) { - Bundle serviceInfo = mServiceInfo.getBundle(String.valueOf(serviceType)); - if (serviceInfo != null) { - return serviceInfo.getInt(infoType); - } - return defaultValue; - } - - private Uri getServiceInfo(int serviceType, String infoKey, Uri defaultValue) { - Bundle serviceInfo = mServiceInfo.getBundle(String.valueOf(serviceType)); - if (serviceInfo != null) { - return (Uri)serviceInfo.getParcelable(infoKey); - } - - return defaultValue; - } - - public String toString() { - return" contactNumber=" + getContactNumber() + - " volteStatus=" + getVolteStatus() + - " ipVoiceCallSate=" + getServiceState(ServiceType.VOLTE_CALL) + - " ipVoiceCallServiceNumber=" + getServiceContact(ServiceType.VOLTE_CALL) + - " ipVoiceCallTimestamp=" + getTimeStamp(ServiceType.VOLTE_CALL) + - " ipVideoCallSate=" + getServiceState(ServiceType.VT_CALL) + - " ipVideoCallServiceNumber=" + getServiceContact(ServiceType.VT_CALL) + - " ipVideoCallTimestamp=" + getTimeStamp(ServiceType.VT_CALL); - } -} - diff --git a/rcs/rcsmanager/src/java/com/android/ims/internal/ContactNumberUtils.java b/rcs/rcsmanager/src/java/com/android/ims/internal/ContactNumberUtils.java deleted file mode 100644 index b69b42c3..00000000 --- a/rcs/rcsmanager/src/java/com/android/ims/internal/ContactNumberUtils.java +++ /dev/null @@ -1,343 +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.ims.internal; - -import android.content.Context; -import android.os.Build; -import android.telephony.PhoneNumberUtils; -import android.telephony.TelephonyManager; -import android.text.TextUtils; -import android.util.Log; - -import java.util.List; -import java.util.ArrayList; - -/** - * @hide - */ -public class ContactNumberUtils { - /** - * Sample code: - * - * ContactNumberUtils mNumberUtils = ContactNumberUtils.getDefault(); - * mNumberUtils.setContext(this); - * - * number = mNumberUtils.format(number); - * int result = mNumberUtils.validate(number); - * if (ContactNumberUtils.NUMBER_VALID == result) { - * } - */ - public static ContactNumberUtils getDefault() { - if(sInstance == null) { - sInstance = new ContactNumberUtils(); - } - - return sInstance; - } - - public void setContext(Context context) { - mContext = context; - } - - /** - * Format contact number to the common format - * - * @param phoneNumber read from contact db. - * @return formatted contact number. - */ - public String format(final String phoneNumber) { - String number = phoneNumber; - if (TextUtils.isEmpty(number)) { - return null; - } - - number = PhoneNumberUtils.stripSeparators(number); - - int len = number.length(); - if (len == NUMBER_LENGTH_NO_AREA_CODE) { - number = addAreaCode(number); - } - - number = PhoneNumberUtils.normalizeNumber(number); - - len = number.length(); - if (len == NUMBER_LENGTH_NORMAL) { - if (!number.startsWith("+1")) { - number = "+1" + number; - } - } else if (len == NUMBER_LENGTH_NORMAL + 1) { - if (number.startsWith("1")) { - number = "+" + number; - } - } else if (len >= NUMBER_LENGTH_NORMAL + 4) { - if (number.startsWith("011")) { - number = "+" + number.substring(3); - } - } - - return number; - } - - /** - * Contact nubmer error code. - */ - public static int NUMBER_VALID = 0; - public static int NUMBER_EMERGENCY = 1; - public static int NUMBER_SHORT_CODE = 2; - public static int NUMBER_PRELOADED_ENTRY = 3; - public static int NUMBER_FREE_PHONE = 4; - public static int NUMBER_INVALID = 5; - - /** - * Check if it is a valid contact number for presence - * - * @param phoneNumber read from contact db. - * @return contact number error code. - */ - public int validate(final String phoneNumber) { - String number = phoneNumber; - if (TextUtils.isEmpty(number)) { - return NUMBER_INVALID; - } - - if(number.contains("*")) { - return NUMBER_PRELOADED_ENTRY; - } - - number = PhoneNumberUtils.stripSeparators(number); - if (!number.equals(PhoneNumberUtils.convertKeypadLettersToDigits(number))) { - return NUMBER_INVALID; - } - - if (PhoneNumberUtils.isEmergencyNumber(number)) { - return NUMBER_EMERGENCY; - // TODO: To handle short code - //} else if ((mContext != null) && PhoneNumberUtils.isN11Number(mContext, number)) { - // return NUMBER_SHORT_CODE; - } else if (number.startsWith("#")) { - return NUMBER_PRELOADED_ENTRY; - } else if (isInExcludedList(number)) { - return NUMBER_FREE_PHONE; - } - - int len = number.length(); - if (len > "+1-nnn-nnn-nnnn".length()) { - return NUMBER_INVALID; - } else if (len < NUMBER_LENGTH_NO_AREA_CODE) { - return NUMBER_INVALID; - } - - number = format(number); - if (number.startsWith("+1")) { - len = number.length(); - if (len == NUMBER_LENGTH_NORMAL + 2) { - return NUMBER_VALID; - } - } - - return NUMBER_INVALID; - } - - - /** - * Some utility functions for presence service only. - * @hide - */ - public String[] format(List<String> numbers) { - if ((numbers == null) || (numbers.size() == 0)) { - return null; - } - - int size = numbers.size(); - String[] outContactsArray = new String[size]; - for (int i = 0; i < size; i++) { - String number = numbers.get(i); - outContactsArray[i] = format(number); - if (DEBUG) { - Log.d(TAG, "outContactsArray[" + i + "] = " + outContactsArray[i]); - } - } - - return outContactsArray; - } - - public String[] format(String[] numbers) { - if ((numbers == null) || (numbers.length == 0)) { - return null; - } - - int length = numbers.length; - String[] outContactsArray = new String[length]; - for (int i = 0; i < length; i++) { - String number = numbers[i]; - outContactsArray[i] = format(number); - if (DEBUG) { - Log.d(TAG, "outContactsArray[" + i + "] = " + outContactsArray[i]); - } - } - - return outContactsArray; - } - public int validate(List<String> numbers) { - if ((numbers == null) || (numbers.size() == 0)) { - return NUMBER_INVALID; - } - - int size = numbers.size(); - for (int i = 0; i < size; i++) { - String number = numbers.get(i); - int result = validate(number); - if (result != NUMBER_VALID) { - return result; - } - } - - return NUMBER_VALID; - } - - public int validate(String[] numbers) { - if ((numbers == null) || (numbers.length == 0)) { - return NUMBER_INVALID; - } - - int length = numbers.length; - for (int i = 0; i < length; i++) { - String number = numbers[i]; - int result = validate(number); - if (result != NUMBER_VALID) { - return result; - } - } - - return NUMBER_VALID; - } - - /** - * The logger related. - */ - private static final boolean DEBUG = Build.IS_DEBUGGABLE; - private static final String TAG = "ContactNumberUtils"; - - /** - * Contact number length. - */ - private static final int NUMBER_LENGTH_NORMAL = 10; - private static final int NUMBER_LENGTH_NO_AREA_CODE = 7; - - /** - * Save the singleton instance. - */ - private static ContactNumberUtils sInstance = null; - private Context mContext = null; - - /** - * Constructor - */ - private ContactNumberUtils() { - if (DEBUG) { - Log.d(TAG, "ContactNumberUtils constructor"); - } - } - - /** - * Add device's own area code to the number which length is 7. - */ - private String addAreaCode(String number) { - if (mContext == null) { - if (DEBUG) { - Log.e(TAG, "mContext is null, please update context."); - } - return number; - } - - String mdn = null; - TelephonyManager tm = (TelephonyManager) - mContext.getSystemService(Context.TELEPHONY_SERVICE); - mdn = tm.getLine1Number(); - - if ((mdn == null) || (mdn.length() == 0) || mdn.startsWith("00000")) { - return number; - } - - mdn = PhoneNumberUtils.stripSeparators(mdn); - if (mdn.length() >= NUMBER_LENGTH_NORMAL) { - mdn = mdn.substring(mdn.length() - NUMBER_LENGTH_NORMAL); - } - mdn = mdn.substring(0, 3); - - number = mdn + number; - return number; - } - - /** - * The excluded number list. - */ - private static ArrayList<String> sExcludes = null; - - private boolean isInExcludedList(String number){ - if (sExcludes == null) { - sExcludes = new ArrayList<String>(); - sExcludes.add("800"); - sExcludes.add("822"); - sExcludes.add("833"); - sExcludes.add("844"); - sExcludes.add("855"); - sExcludes.add("866"); - sExcludes.add("877"); - sExcludes.add("880882"); - sExcludes.add("888"); - sExcludes.add("900"); - sExcludes.add("911"); - } - - String tempNumber = format(number); - if(TextUtils.isEmpty(tempNumber)) { - return true; //exclude empty/null string. - } - - if(tempNumber.startsWith("1")) { - tempNumber = tempNumber.substring(1); - } else if(tempNumber.startsWith("+1")) { - tempNumber = tempNumber.substring(2); - } - - if(TextUtils.isEmpty(tempNumber)) { - return true; //exclude empty/null string. - } - - for (String num : sExcludes) { - if(tempNumber.startsWith(num)) { - return true; - } - } - - return false; - } -} - diff --git a/rcs/rcsmanager/src/java/com/android/ims/internal/EABContract.java b/rcs/rcsmanager/src/java/com/android/ims/internal/EABContract.java deleted file mode 100644 index 77960717..00000000 --- a/rcs/rcsmanager/src/java/com/android/ims/internal/EABContract.java +++ /dev/null @@ -1,254 +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.ims.internal; - -import android.net.Uri; -import android.provider.BaseColumns; - -/** - * <p> - * The contract between the EAB provider and applications. Contains - * definitions for the supported URIs and data columns. - * </p> - * <h3>Overview</h3> - * <p> - * EABContract defines the data model of EAB related information. - * This data is stored in a table EABPresence. - * </p> - * - * @hide - * - */ -public final class EABContract { - /** - * This authority is used for writing to or querying from the EAB provider. - */ - public static final String AUTHORITY = "com.android.rcs.eab"; - - /** - * The content:// style URL for the top-level EAB authority - */ - public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY); - - /** - * Class for EABProviderItem - */ - public static class EABColumns implements BaseColumns { - public static final String TABLE_NAME = "EABPresence"; - public static final String GROUPITEMS_NAME = "EABGroupDetails"; - - /** - * CONTENT_URI - * <P> - * "content://com.android.vt.eab/EABPresence" - * </P> - */ - public static final Uri CONTENT_URI = Uri.withAppendedPath(EABContract.CONTENT_URI, - TABLE_NAME); - - public static final String CONTENT_TYPE = - "vnd.android.cursor.dir/vnd.android.rcs.eab.provider.eabprovider"; - - public static final String CONTENT_ITEM_TYPE = - "vnd.android.cursor.item/vnd.android.rcs.eab.provider.eabprovider"; - - /** - * Key defining the contact number. - * <P> - * Type: TEXT - * </P> - */ - public static final String CONTACT_NUMBER = "contact_number"; - - /** - * Key defining the contact name. - * <P> - * Type: TEXT - * </P> - */ - public static final String CONTACT_NAME = "contact_name"; - - /** - * Key defining the reference to ContactContract raw_contact_id of the number. - * <P> - * Type: TEXT - * </P> - */ - public static final String RAW_CONTACT_ID = "raw_contact_id"; - - /** - * Key defining the reference to ContactContract contact_id of the number. - * <P> - * Type: TEXT - * </P> - */ - public static final String CONTACT_ID = "contact_id"; - - /** - * Key defining the reference to ContactContract data_id of the number. - * <P> - * Type: TEXT - * </P> - */ - public static final String DATA_ID = "data_id"; - - /** - * Key defining the account type. - * <P> - * Type: TEXT - * </P> - */ - public static final String ACCOUNT_TYPE = "account_type"; - - /** - * Key defining the VoLTE call service contact address. - * <P> - * Type: TEXT - * </P> - */ - public static final String VOLTE_CALL_SERVICE_CONTACT_ADDRESS = "volte_contact_address"; - - /** - * Key defining the VoLTE call capability. - * <P> - * Type: TEXT - * </P> - */ - public static final String VOLTE_CALL_CAPABILITY = "volte_call_capability"; - - /** - * Key defining the VoLTE call capability timestamp. - * <P> - * Type: TEXT - * </P> - */ - public static final String VOLTE_CALL_CAPABILITY_TIMESTAMP = "volte_capability_timestamp"; - - /** - * Key defining the VoLTE call availability. - * <P> - * Type: LONG - * </P> - */ - public static final String VOLTE_CALL_AVAILABILITY = "volte_call_avalibility"; - - /** - * Key defining the VoLTE call availability timestamp. - * <P> - * Type: TEXT - * </P> - */ - public static final String VOLTE_CALL_AVAILABILITY_TIMESTAMP = - "volte_availability_timestamp"; - - /** - * Key defining the Video call service contact address. - * <P> - * Type: LONG - * </P> - */ - public static final String VIDEO_CALL_SERVICE_CONTACT_ADDRESS = "video_contact_address"; - - /** - * Key defining the Video call capability. - * <P> - * Type: TEXT - * </P> - */ - public static final String VIDEO_CALL_CAPABILITY = "video_call_capability"; - - /** - * Key defining the Video call capability timestamp. - * <P> - * Type: TEXT - * </P> - */ - public static final String VIDEO_CALL_CAPABILITY_TIMESTAMP = "video_capability_timestamp"; - - /** - * Key defining the Video call availability. - * <P> - * Type: LONG - * </P> - */ - public static final String VIDEO_CALL_AVAILABILITY = "video_call_availability"; - - /** - * Key defining the Video call availability timestamp. - * <P> - * Type: TEXT - * </P> - */ - public static final String VIDEO_CALL_AVAILABILITY_TIMESTAMP = - "video_availability_timestamp"; - - /** - * Key defining the Video call availability timestamp. - * <P> - * Type: LONG - * </P> - */ - public static final String CONTACT_LAST_UPDATED_TIMESTAMP = - "contact_last_updated_timestamp"; - - /** - * Key defining the volte status. - * <p> - * Type: INT - * </p> - */ - public static final String VOLTE_STATUS = "volte_status"; - - /** - * @hide - */ - public static final String[] PROJECTION = new String[] { - _ID, - CONTACT_NAME, - CONTACT_NUMBER, - RAW_CONTACT_ID, - CONTACT_ID, - DATA_ID, - ACCOUNT_TYPE, - VOLTE_CALL_SERVICE_CONTACT_ADDRESS, - VOLTE_CALL_CAPABILITY, - VOLTE_CALL_AVAILABILITY_TIMESTAMP, - VOLTE_CALL_AVAILABILITY, - VOLTE_CALL_CAPABILITY_TIMESTAMP, - VIDEO_CALL_SERVICE_CONTACT_ADDRESS, - VIDEO_CALL_CAPABILITY, - VIDEO_CALL_CAPABILITY_TIMESTAMP, - VIDEO_CALL_AVAILABILITY, - VIDEO_CALL_AVAILABILITY_TIMESTAMP, - CONTACT_LAST_UPDATED_TIMESTAMP, - VOLTE_STATUS - }; - } -} - diff --git a/rcs/rcsmanager/src/java/com/android/ims/internal/IRcsPresence.aidl b/rcs/rcsmanager/src/java/com/android/ims/internal/IRcsPresence.aidl deleted file mode 100644 index c0c67c02..00000000 --- a/rcs/rcsmanager/src/java/com/android/ims/internal/IRcsPresence.aidl +++ /dev/null @@ -1,123 +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.ims.internal; - -import com.android.ims.IRcsPresenceListener; - -import java.util.List; - -/** - * @hide - */ -interface IRcsPresence { - /** - * Send the request to the server to get the capability. - * 1. If the presence service sent the request to network successfully - * then it will return the request ID (>0). It will not wait for the response from - * network. The response from network will be returned by callback onSuccess() or onError(). - * 2. If the presence service failed to send the request to network then it will return error - * code which is defined by RcsManager.ResultCode (<0). - * 3. If the network returns "200 OK" for a request then the listener.onSuccess() will be - * called by presence service. - * 4. If the network resturns "404" for a single target number then it means the target - * number is not VoLte capable, so the listener.onSuccess() will be called and intent - * ACTION_PRESENCE_CHANGED will be broadcasted by presence service. - * 5. If the network returns other error then the listener.onError() will be called by - * presence service. - * 6. If the network returns "200 OK" then we can expect the presence service receives notify - * from network. If the presence service receives notify then it will broadcast the - * intent ACTION_PRESENCE_CHANGED. If the notify state is "terminated" then the - * listener.onFinish() will be called by presence service as well. - * 7. If the presence service doesn't get response after "Subscribe Expiration + T1" then the - * listener.onTimeout() will be called by presence service. - * - * @param contactsNumber the contact number list which will be requested. - * @param listener the IRcsPresenceListener which will return the status and response. - * - * @return the request ID if it is >0. Or it is RcsManager.ResultCode for error. - * - * @see IRcsPresenceListener - * @see RcsManager.ResultCode - */ - int requestCapability(in List<String> contactsNumber, - in IRcsPresenceListener listener); - - /** - * Send the request to the server to get the availability. - * 1. If the presence service sent the request to network successfully then it will return - * the request ID (>0). - * 2. If the presence serive failed to send the request to network then it will return error - * code which is defined by RcsManager.ResultCode (<0). - * 3. If the network returns "200 OK" for a request then the listener.onSuccess() will be - * called by presence service. - * 4. If the network resturns "404" then it means the target number is not VoLte capable, - * so the listener.onSuccess() will be called and intent ACTION_PRESENCE_CHANGED will be - * broadcasted by presence service. - * 5. If the network returns other error code then the listener.onError() will be called by - * presence service. - * 6. If the network returns "200 OK" then we can expect the presence service receives notify - * from network. If the presence service receives notify then it will broadcast the intent - * ACTION_PRESENCE_CHANGED. If the notify state is "terminated" then the listener.onFinish() - * will be called by presence service as well. - * 7. If the presence service doesn't get response after "Subscribe Expiration + T1" then it - * will call listener.onTimeout(). - * - * @param contactNumber the contact which will request the availability. - * Only support phone number at present. - * @param listener the IRcsPresenceListener to get the response. - * - * @return the request ID if it is >0. Or it is RcsManager.ResultCode for error. - * - * @see IRcsPresenceListener - * @see RcsManager.ResultCode - * @see RcsPresence.ACTION_PRESENCE_CHANGED - */ - int requestAvailability(in String contactNumber, in IRcsPresenceListener listener); - - /** - * Same as requestAvailability. but requestAvailability will consider throttle to avoid too - * fast call. Which means it will not send the request to network in next 60s for the same - * request. - * The error code SUBSCRIBE_TOO_FREQUENTLY will be returned under the case. - * But for this funcation it will always send the request to network. - * - * @see IRcsPresenceListener - * @see RcsManager.ResultCode - * @see RcsPresence.ACTION_PRESENCE_CHANGED - * @see ResultCode.SUBSCRIBE_TOO_FREQUENTLY - */ - int requestAvailabilityNoThrottle(in String contactNumber, in IRcsPresenceListener listener); - - /** - * Get the latest publish state. - * - * @see RcsPresence.PublishState - */ - int getPublishState(); -} diff --git a/rcs/rcsmanager/src/java/com/android/ims/internal/IRcsService.aidl b/rcs/rcsmanager/src/java/com/android/ims/internal/IRcsService.aidl deleted file mode 100644 index 34ad1b32..00000000 --- a/rcs/rcsmanager/src/java/com/android/ims/internal/IRcsService.aidl +++ /dev/null @@ -1,48 +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.ims.internal; - -import com.android.ims.internal.IRcsPresence; - -/** - * @hide - */ -interface IRcsService { - /** - * Detect if the rcs service is available. - */ - boolean isRcsServiceAvailable(); - - /** - * RcsPresence interface to get the presence information. - * - * @see IRcsPresence - */ - IRcsPresence getRcsPresenceInterface(); -} diff --git a/rcs/rcsmanager/src/java/com/android/ims/internal/Logger.java b/rcs/rcsmanager/src/java/com/android/ims/internal/Logger.java deleted file mode 100644 index 9e6c6a87..00000000 --- a/rcs/rcsmanager/src/java/com/android/ims/internal/Logger.java +++ /dev/null @@ -1,239 +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.ims.internal; - -import java.lang.String; -import android.util.Log; - -import android.os.Build; -import android.text.TextUtils; - -/** - * Logger - * - * @hide - */ -public class Logger { - /** - * DEBUG level - */ - public static int DEBUG_LEVEL = 0; - - /** - * INFO level - */ - public static int INFO_LEVEL = 1; - - /** - * WARN level - */ - public static int WARN_LEVEL = 2; - - /** - * ERROR level - */ - public static int ERROR_LEVEL = 3; - - /** - * FATAL level - */ - public static int FATAL_LEVEL = 4; - - /** - * RCS test mode flag - */ - public static boolean rcsTestMode = false; - - /** - * Trace level - */ - public static int traceLevel = DEBUG_LEVEL; - - /** - * Log tag name - */ - private static String tagname = "rcs"; - - /** - * Classname - */ - private String classname; - - /** - * Constructor - * - * @param classname Classname - */ - private Logger(String tagName, String classname) { - if(!TextUtils.isEmpty(tagName)) { - this.tagname = tagName; - } - - int index = classname.lastIndexOf('.'); - if (index != -1) { - this.classname = classname.substring(index+1); - } else { - this.classname = classname; - } - - if(Build.IS_DEBUGGABLE || rcsTestMode){ - traceLevel = DEBUG_LEVEL; - }else{ - traceLevel = ERROR_LEVEL; - } - } - - public static void setRcsTestMode(boolean test) { - rcsTestMode = test; - - if (Build.IS_DEBUGGABLE || rcsTestMode) { - traceLevel = DEBUG_LEVEL; - } else { - traceLevel = ERROR_LEVEL; - } - } - - /** - * Is logger activated. Reserved for future debug tool to turn on/off the log only. - * - * @return boolean - */ - public boolean isActivated() { - return true; - } - - /** - * Debug trace - * - * @param trace Trace - */ - public void debug(String trace) { - if (isActivated() && (traceLevel <= DEBUG_LEVEL)) { - Log.d(tagname, "[" + classname +"] " + trace); - } - } - - /** - * Debug trace - * - * @param trace Trace - * @param e the exception which need to be printed. - */ - public void debug(String trace, Throwable e) { - if (isActivated() && (traceLevel <= DEBUG_LEVEL)) { - Log.d(tagname, "[" + classname +"] " + trace, e); - } - } - - /** - * Info trace - * - * @param trace Trace - */ - public void info(String trace) { - if (isActivated() && (traceLevel <= INFO_LEVEL)) { - Log.i(tagname, "[" + classname +"] " + trace); - } - } - - /** - * Warning trace - * - * @param trace Trace - */ - public void warn(String trace) { - if (isActivated() && (traceLevel <= WARN_LEVEL)) { - Log.w(tagname, "[" + classname +"] " + trace); - } - } - - /** - * Error trace - * - * @param trace Trace - */ - public void error(String trace) { - if (isActivated() && (traceLevel <= ERROR_LEVEL)) { - Log.e(tagname, "[" + classname +"] " + trace); - } - } - - /** - * Error trace - * - * @param trace Trace - * @param e Exception - */ - public void error(String trace, Throwable e) { - if (isActivated() && (traceLevel <= ERROR_LEVEL)) { - Log.e(tagname, "[" + classname +"] " + trace, e); - } - } - - /* - * Print the debug log and don't consider the traceLevel - * - * @param trace Trace - * @param e Exception - */ - public void print(String trace) { - Log.i(tagname, "[" + classname +"] " + trace); - } - - /** - * Print the debug log and don't consider the traceLevel - * - * @param trace Trace - * @param e Exception - */ - public void print(String trace, Throwable e) { - Log.i(tagname, "[" + classname +"] " + trace, e); - } - - /** - * Create a static instance - * - * @param classname Classname - * @return Instance - */ - public static synchronized Logger getLogger(String tagName, String classname) { - return new Logger(tagName, classname); - } - - /** - * Create a static instance - * - * @param classname Classname - * @return Instance - */ - public static synchronized Logger getLogger(String classname) { - return new Logger(tagname, classname); - } -} - diff --git a/rcs/rcsservice/Android.mk b/rcs/rcsservice/Android.mk deleted file mode 100644 index 281f178f..00000000 --- a/rcs/rcsservice/Android.mk +++ /dev/null @@ -1,47 +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. - -LOCAL_PATH := $(call my-dir) - -########################################################################## -# Build the application : Presence.apk -########################################################################## - -include $(CLEAR_VARS) -# This is the target being built. (Name of APK) -LOCAL_PACKAGE_NAME := RcsService -# Only compile source java files in this apk. -LOCAL_SRC_FILES := \ - $(call all-java-files-under, src) - -LOCAL_JAVA_LIBRARIES := telephony-common ims-common com.android.ims.rcsmanager - -#LOCAL_MODULE_TAGS := optional -LOCAL_CERTIFICATE := platform - -# Tell it to build an APK -include $(BUILD_PACKAGE) - diff --git a/rcs/rcsservice/AndroidManifest.xml b/rcs/rcsservice/AndroidManifest.xml deleted file mode 100644 index 2c445187..00000000 --- a/rcs/rcsservice/AndroidManifest.xml +++ /dev/null @@ -1,90 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="no"?> -<!-- - * 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. ---> - -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" - android:versionCode="1" - android:versionName="2.4.6" - coreApp="true" - android:sharedUserId="android.uid.phone" - package="com.android.service.ims"> - - <uses-sdk android:minSdkVersion="19"/> - - <protected-broadcast android:name="com.android.ims.ACTION_RCS_SERVICE_AVAILABLE" /> - <protected-broadcast android:name="com.android.ims.ACTION_RCS_SERVICE_UNAVAILABLE" /> - <protected-broadcast android:name="com.android.ims.ACTION_RCS_SERVICE_DIED" /> - <protected-broadcast android:name="com.android.ims.ACTION_PRESENCE_CHANGED" /> - <protected-broadcast android:name="com.android.ims.ACTION_PUBLISH_STATUS_CHANGED" /> - - <permission - android:name="com.android.ims.rcs.permission.STATUS_CHANGED" - android:protectionLevel="signatureOrSystem" /> - - <permission android:name="com.android.ims.permission.PRESENCE_ACCESS" - android:label="@string/ims_presence_permission" - android:description="@string/ims_ims_permission_desc" - android:protectionLevel="signatureOrSystem" /> - - <uses-permission android:name="android.permission.READ_PHONE_STATE"/> - <uses-permission android:name="android.permission.BROADCAST_STICKY"/> - <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> - <uses-permission android:name="com.android.ims.rcs.permission.STATUS_CHANGED"/> - <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"/> - <uses-permission android:name="android.permission.ACCESS_UCE_PRESENCE_SERVICE"/> - <uses-permission android:name="com.android.ims.permission.PRESENCE_ACCESS"/> - <uses-permission android:name="com.android.rcs.eab.permission.READ_WRITE_EAB"/> - - <application android:name="RcsServiceApp" android:persistent="true" - android:process="com.android.ims.rcsservice"> - <uses-library android:name="com.android.ims.rcsmanager" - android:required="true"/> - - <service android:name="com.android.service.ims.RcsService" - android:exported="true" - android:enabled="true" - android:permission="com.android.ims.permission.PRESENCE_ACCESS"> - </service> - - <receiver android:name="com.android.service.ims.DeviceShutdown" - androidprv:systemUserOnly="true"> - <intent-filter> - <action android:name="android.intent.action.ACTION_SHUTDOWN"/> - </intent-filter> - </receiver> - - <receiver android:name="com.android.service.ims.presence.AlarmBroadcastReceiver" - android:permission="com.android.ims.permission.PRESENCE_ACCESS" - androidprv:systemUserOnly="true"> - <intent-filter> - <action android:name="com.android.service.ims.presence.retry" /> - </intent-filter> - </receiver> - </application> -</manifest> diff --git a/rcs/rcsservice/res/values/config.xml b/rcs/rcsservice/res/values/config.xml deleted file mode 100644 index c62c09ef..00000000 --- a/rcs/rcsservice/res/values/config.xml +++ /dev/null @@ -1,48 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - * 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. ---> - -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string-array translatable="false" name="config_volte_provision_error_on_publish_response"> - <item>403 not authorized for presence</item> - </string-array> - - <string-array translatable="false" name="config_rcs_provision_error_on_publish_response"> - <item>404 not found</item> - </string-array> - - <string-array translatable="false" name="config_volte_provision_error_on_subscribe_response"> - <item>403 not authorized for presence</item> - </string-array> - - <string-array translatable="false" name="config_rcs_provision_error_on_subscribe_response"> - <item>403 forbidden</item> - </string-array> - -</resources> - diff --git a/rcs/rcsservice/res/values/strings.xml b/rcs/rcsservice/res/values/strings.xml deleted file mode 100644 index cb4bbc38..00000000 --- a/rcs/rcsservice/res/values/strings.xml +++ /dev/null @@ -1,34 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - * 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. ---> - -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> -<string name="ims_presence_permission">Presence</string> -<string name="ims_ims_permission_desc">Allow the application to publish and subscribe the presence information.</string> -</resources> - diff --git a/rcs/rcsservice/src/com/android/service/ims/DeviceShutdown.java b/rcs/rcsservice/src/com/android/service/ims/DeviceShutdown.java deleted file mode 100644 index ffc10fc2..00000000 --- a/rcs/rcsservice/src/com/android/service/ims/DeviceShutdown.java +++ /dev/null @@ -1,54 +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; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; - -import com.android.ims.internal.Logger; - -/** - * Device shutdown event receiver: automatically stops the RCS service - */ -public class DeviceShutdown extends BroadcastReceiver { - /** - * The logger - */ - private Logger logger = Logger.getLogger(this.getClass().getName()); - - @Override - public void onReceive(Context context, Intent intent) { - logger.debug("Device shutdown"); - - // Need wait RCS stack become unavailable before close RCS service. - RcsStackAdaptor.setInPowerDown(true); - } -} - diff --git a/rcs/rcsservice/src/com/android/service/ims/LauncherUtils.java b/rcs/rcsservice/src/com/android/service/ims/LauncherUtils.java deleted file mode 100644 index 407a5a7b..00000000 --- a/rcs/rcsservice/src/com/android/service/ims/LauncherUtils.java +++ /dev/null @@ -1,75 +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; - -import android.content.Context; -import android.content.Intent; -import android.content.ComponentName; - -import com.android.ims.internal.Logger; -import com.android.service.ims.RcsService; - -/** - * Launcher utility functions - * - */ -public class LauncherUtils { - private static Logger logger = Logger.getLogger(LauncherUtils.class.getName()); - - /** - * Launch the Presence service. - * - * @param context application context - * @param boot Boot flag - */ - public static void launchRcsService(Context context) { - logger.debug("Launch RCS service"); - - ComponentName comp = new ComponentName(context.getPackageName(), - RcsService.class.getName()); - ComponentName service = context.startService(new Intent().setComponent(comp)); - if (service == null) { - logger.error("Could Not Start Service " + comp.toString()); - } else { - logger.debug("ImsService Auto Boot Started Successfully"); - } - } - - /** - * Stop the Presence service. - * - * @param context application context - */ - public static void stopRcsService(Context context) { - logger.debug("Stop RCS service"); - - context.stopService(new Intent(context, RcsService.class)); - } -} - diff --git a/rcs/rcsservice/src/com/android/service/ims/RcsService.java b/rcs/rcsservice/src/com/android/service/ims/RcsService.java deleted file mode 100644 index fa23603a..00000000 --- a/rcs/rcsservice/src/com/android/service/ims/RcsService.java +++ /dev/null @@ -1,446 +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; - -import android.net.Uri; - -import java.util.List; - -import android.content.Intent; -import android.app.PendingIntent; -import android.content.IntentFilter; -import android.os.IBinder; -import android.os.RemoteException; -import android.content.Context; -import android.app.Service; -import android.os.ServiceManager; -import android.os.Handler; -import android.database.ContentObserver; -import android.content.BroadcastReceiver; -import android.provider.Settings; -import android.net.ConnectivityManager; -import com.android.ims.ImsConfig.FeatureValueConstants; -import com.android.ims.ImsManager; -import com.android.ims.ImsConfig; -import com.android.ims.ImsReasonInfo; -import com.android.ims.ImsConnectionStateListener; -import com.android.ims.ImsServiceClass; -import com.android.ims.ImsException; -import android.telephony.SubscriptionManager; - -import com.android.ims.RcsManager.ResultCode; -import com.android.ims.internal.IRcsService; -import com.android.ims.IRcsPresenceListener; -import com.android.ims.internal.IRcsPresence; -import com.android.ims.RcsPresence.PublishState; - -import com.android.ims.internal.Logger; -import com.android.service.ims.RcsStackAdaptor; - -import com.android.service.ims.presence.PresencePublication; -import com.android.service.ims.presence.PresenceSubscriber; - -public class RcsService extends Service{ - /** - * The logger - */ - private Logger logger = Logger.getLogger(this.getClass().getName()); - - final static String ACTION_IMS_FEATURE_STATUS_CHANGED = - "com.android.service.ims.presence.ims-feature-changed"; - private static final int INVALID_SERVICE_ID = -1; - int mServiceId = INVALID_SERVICE_ID; - - private RcsStackAdaptor mRcsStackAdaptor = null; - private PresencePublication mPublication = null; - private PresenceSubscriber mSubscriber = null; - - private BroadcastReceiver mReceiver = null; - - @Override - public void onCreate() { - super.onCreate(); - - logger.debug("RcsService onCreate"); - - mRcsStackAdaptor = RcsStackAdaptor.getInstance(this); - - mPublication = new PresencePublication(mRcsStackAdaptor, this); - mRcsStackAdaptor.getListener().setPresencePublication(mPublication); - - mSubscriber = new PresenceSubscriber(mRcsStackAdaptor, this); - mRcsStackAdaptor.getListener().setPresenceSubscriber(mSubscriber); - mPublication.setSubscriber(mSubscriber); - - ConnectivityManager cm = ConnectivityManager.from(this); - if (cm != null) { - boolean enabled = Settings.Global.getInt(getContentResolver(), - Settings.Global.MOBILE_DATA, 1) == 1; - logger.debug("Mobile data enabled status: " + (enabled ? "ON" : "OFF")); - - onMobileDataEnabled(enabled); - } - - // TODO: support MSIM - ServiceManager.addService("rcs", mBinder); - - mObserver = new MobileDataContentObserver(); - getContentResolver().registerContentObserver( - Settings.Global.getUriFor(Settings.Global.MOBILE_DATA), - false, mObserver); - - mVtSettingObserver = new VtSettingContentObserver(); - getContentResolver().registerContentObserver( - Settings.Global.getUriFor(Settings.Global.VT_IMS_ENABLED), - false, mVtSettingObserver); - - registerImsConnectionStateListener(); - - mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - logger.print("onReceive intent=" + intent); - if(ImsManager.ACTION_IMS_SERVICE_UP.equalsIgnoreCase( - intent.getAction())){ - handleImsServiceUp(); - } else if(ImsManager.ACTION_IMS_SERVICE_DOWN.equalsIgnoreCase( - intent.getAction())){ - handleImsServiceDown(); - } - } - }; - - IntentFilter statusFilter = new IntentFilter(); - statusFilter.addAction(ImsManager.ACTION_IMS_SERVICE_UP); - statusFilter.addAction(ImsManager.ACTION_IMS_SERVICE_DOWN); - registerReceiver(mReceiver, statusFilter); - } - - public void handleImsServiceUp() { - // Don't check mServiceId since it wasn't reset to INVALID_SERVICE_ID when - // got ACTION_IMS_SERVICE_DOWN - // This is phone crash case. Reset mServiceId to INVALID_SERVICE_ID - mServiceId = INVALID_SERVICE_ID; - if(mPublication != null) { - mPublication.handleImsServiceUp(); - } - - registerImsConnectionStateListener(); - } - - public void handleImsServiceDown() { - // Don't close since it could close the wrong one when phone crashed and restarted. - //if((mImsManager != null) && (mServiceId != INVALID_SERVICE_ID)) { - // mImsManager.close(mServiceId); - // mServiceId = INVALID_SERVICE_ID; - //} - if(mPublication != null) { - mPublication.handleImsServiceDown(); - } - } - - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - logger.debug("RcsService onStartCommand"); - - return super.onStartCommand(intent, flags, startId); - } - - /** - * Cleans up when the service is destroyed - */ - @Override - public void onDestroy() { - getContentResolver().unregisterContentObserver(mObserver); - getContentResolver().unregisterContentObserver(mVtSettingObserver); - if (mReceiver != null) { - unregisterReceiver(mReceiver); - mReceiver = null; - } - - mRcsStackAdaptor.finish(); - mPublication.finish(); - mPublication = null; - mSubscriber = null; - - logger.debug("RcsService onDestroy"); - super.onDestroy(); - } - - public PresencePublication getPublication() { - return mPublication; - } - - public PresenceSubscriber getPresenceSubscriber(){ - return mSubscriber; - } - - IRcsPresence.Stub mIRcsPresenceImpl = new IRcsPresence.Stub(){ - /** - * Asyncrhonously request the latest capability for a given contact list. - * The result will be saved to DB directly if the contactNumber can be found in DB. - * And then send intent com.android.ims.presence.CAPABILITY_STATE_CHANGED to notify it. - * @param contactsNumber the contact list which will request capability. - * Currently only support phone number. - * @param listener the listener to get the response. - * @return the resultCode which is defined by ResultCode. - * @note framework uses only. - * @hide - */ - public int requestCapability(List<String> contactsNumber, - IRcsPresenceListener listener){ - logger.debug("calling requestCapability"); - if(mSubscriber == null){ - logger.debug("requestCapability, mPresenceSubscriber == null"); - return ResultCode.ERROR_SERVICE_NOT_AVAILABLE; - } - - return mSubscriber.requestCapability(contactsNumber, listener); - } - - /** - * Asyncrhonously request the latest presence for a given contact. - * The result will be saved to DB directly if it can be found in DB. And then send intent - * com.android.ims.presence.AVAILABILITY_STATE_CHANGED to notify it. - * @param contactNumber the contact which will request available. - * Currently only support phone number. - * @param listener the listener to get the response. - * @return the resultCode which is defined by ResultCode. - * @note framework uses only. - * @hide - */ - public int requestAvailability(String contactNumber, IRcsPresenceListener listener){ - logger.debug("calling requestAvailability, contactNumber=" + contactNumber); - if(mSubscriber == null){ - logger.error("requestAvailability, mPresenceSubscriber is null"); - return ResultCode.ERROR_SERVICE_NOT_AVAILABLE; - } - - // check availability cache (in RAM). - return mSubscriber.requestAvailability(contactNumber, listener, false); - } - - /** - * Same as requestAvailability. but requestAvailability will consider throttle to avoid too - * fast call. Which means it will not send the request to network in next 60s for the same - * request. - * The error code SUBSCRIBE_TOO_FREQUENTLY will be returned under the case. - * But for this funcation it will always send the request to network. - * - * @see IRcsPresenceListener - * @see RcsManager.ResultCode - * @see ResultCode.SUBSCRIBE_TOO_FREQUENTLY - */ - public int requestAvailabilityNoThrottle(String contactNumber, - IRcsPresenceListener listener) { - logger.debug("calling requestAvailabilityNoThrottle, contactNumber=" + contactNumber); - if(mSubscriber == null){ - logger.error("requestAvailabilityNoThrottle, mPresenceSubscriber is null"); - return ResultCode.ERROR_SERVICE_NOT_AVAILABLE; - } - - // check availability cache (in RAM). - return mSubscriber.requestAvailability(contactNumber, listener, true); - } - - public int getPublishState() throws RemoteException { - return mPublication.getPublishState(); - } - }; - - @Override - public IBinder onBind(Intent arg0) { - return mBinder; - } - - /** - * Receives notifications when Mobile data is enabled or disabled. - */ - private class MobileDataContentObserver extends ContentObserver { - public MobileDataContentObserver() { - super(new Handler()); - } - - @Override - public void onChange(final boolean selfChange) { - boolean enabled = Settings.Global.getInt(getContentResolver(), - Settings.Global.MOBILE_DATA, 1) == 1; - logger.debug("Mobile data enabled status: " + (enabled ? "ON" : "OFF")); - onMobileDataEnabled(enabled); - } - } - - /** Observer to get notified when Mobile data enabled status changes */ - private MobileDataContentObserver mObserver; - - private void onMobileDataEnabled(final boolean enabled) { - logger.debug("Enter onMobileDataEnabled: " + enabled); - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - try{ - if(mPublication != null){ - mPublication.onMobileDataChanged(enabled); - return; - } - }catch(Exception e){ - logger.error("Exception onMobileDataEnabled:", e); - } - } - }, "onMobileDataEnabled thread"); - - thread.start(); - } - - - private VtSettingContentObserver mVtSettingObserver; - - /** - * Receives notifications when Mobile data is enabled or disabled. - */ - private class VtSettingContentObserver extends ContentObserver { - public VtSettingContentObserver() { - super(new Handler()); - } - - @Override - public void onChange(final boolean selfChange) { - boolean enabled = Settings.Global.getInt(getContentResolver(), - Settings.Global.VT_IMS_ENABLED, 1) == 1; - logger.debug("vt enabled status: " + (enabled ? "ON" : "OFF")); - - onVtEnabled(enabled); - } - } - - private void onVtEnabled(boolean enabled) { - if(mPublication != null){ - mPublication.onVtEnabled(enabled); - } - } - - private final IRcsService.Stub mBinder = new IRcsService.Stub() { - /** - * return true if the rcs service is ready for use. - */ - public boolean isRcsServiceAvailable(){ - logger.debug("calling isRcsServiceAvailable"); - if(mRcsStackAdaptor == null){ - return false; - } - - return mRcsStackAdaptor.isImsEnableState(); - } - - /** - * Gets the presence interface. - * - * @see IRcsPresence - */ - public IRcsPresence getRcsPresenceInterface(){ - return mIRcsPresenceImpl; - } - }; - - void registerImsConnectionStateListener() { - final Context context = this; - Thread t = new Thread() { - @Override - public void run() { - while (mServiceId == INVALID_SERVICE_ID) { - try { - ImsManager imsManager = ImsManager.getInstance(context, - SubscriptionManager.getDefaultVoicePhoneId()); - if (imsManager != null) { - mServiceId = imsManager.open(ImsServiceClass.RCS, - createIncomingCallPendingIntent(), - mImsConnectionStateListener); - } - } catch (ImsException e) { - logger.error("register exception=", e); - } - - if (mServiceId == INVALID_SERVICE_ID) { - try { - logger.print("register wait for imsservice"); - sleep(300); - } catch (InterruptedException e) { - logger.error("register exception=", e); - } - } else { - logger.print("register imsservice ready mServiceId="+mServiceId); - } - } - } - }; - - t.start(); - } - - private PendingIntent createIncomingCallPendingIntent() { - Intent intent = new Intent(ACTION_IMS_FEATURE_STATUS_CHANGED); - intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); - return PendingIntent.getBroadcast(this, 0, intent, - PendingIntent.FLAG_UPDATE_CURRENT); - } - - private ImsConnectionStateListener mImsConnectionStateListener = - new ImsConnectionStateListener() { - @Override - public void onImsConnected() { - logger.debug("onImsConnected"); - if(mRcsStackAdaptor != null) { - mRcsStackAdaptor.checkSubService(); - } - - if(mPublication != null) { - mPublication.onImsConnected(); - } - } - - @Override - public void onImsDisconnected(ImsReasonInfo imsReasonInfo) { - logger.debug("onImsDisconnected"); - if(mPublication != null) { - mPublication.onImsDisconnected(); - } - } - - @Override - public void onFeatureCapabilityChanged(final int serviceClass, - final int[] enabledFeatures, final int[] disabledFeatures) { - logger.debug("onFeatureCapabilityChanged"); - if(mPublication != null) { - mPublication.onFeatureCapabilityChanged(serviceClass, enabledFeatures, disabledFeatures); - } - } - }; -} - diff --git a/rcs/rcsservice/src/com/android/service/ims/RcsServiceApp.java b/rcs/rcsservice/src/com/android/service/ims/RcsServiceApp.java deleted file mode 100644 index c1f683de..00000000 --- a/rcs/rcsservice/src/com/android/service/ims/RcsServiceApp.java +++ /dev/null @@ -1,46 +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; - -import android.app.Application; -import android.content.Context; -import com.android.ims.internal.Logger; -import android.os.SystemProperties; - -public class RcsServiceApp extends Application { - private Logger logger = Logger.getLogger(this.getClass().getName()); - - public void onCreate() { - super.onCreate(); - logger.debug("in onCreate() of RcsServiceApp"); - - LauncherUtils.launchRcsService(this); - } -} - diff --git a/rcs/rcsservice/src/com/android/service/ims/RcsSettingUtils.java b/rcs/rcsservice/src/com/android/service/ims/RcsSettingUtils.java deleted file mode 100644 index eb415cf6..00000000 --- a/rcs/rcsservice/src/com/android/service/ims/RcsSettingUtils.java +++ /dev/null @@ -1,255 +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; - -import java.lang.String; -import android.telephony.TelephonyManager; -import android.content.Context; -import com.android.ims.ImsConfig; -import com.android.ims.ImsManager; -import com.android.ims.ImsException; -import android.os.SystemProperties; - -import com.android.ims.RcsManager.ResultCode; - -import com.android.ims.internal.Logger; - -public class RcsSettingUtils{ - /* - * The logger - */ - static private Logger logger = Logger.getLogger("RcsSettingUtils"); - - public RcsSettingUtils() { - } - - public static boolean isFeatureProvisioned(Context context, - int featureId, boolean defaultValue) { - // Don't need provision. - if (!context.getResources().getBoolean( - com.android.internal.R.bool.config_carrier_volte_provisioned)) { - return true; - } - - boolean provisioned = defaultValue; - ImsManager imsManager = ImsManager.getInstance(context, 0); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - provisioned = imsConfig.getProvisionedValue(featureId) - == ImsConfig.FeatureValueConstants.ON; - } - } catch (ImsException ex) { - } - } - - logger.debug("featureId=" + featureId + " provisioned=" + provisioned); - return provisioned; - } - - public static boolean isVowifiProvisioned(Context context) { - return isFeatureProvisioned(context, - ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED, false); - } - - public static boolean isLvcProvisioned(Context context) { - return isFeatureProvisioned(context, - ImsConfig.ConfigConstants.LVC_SETTING_ENABLED, false); - } - - public static boolean isEabProvisioned(Context context) { - return isFeatureProvisioned(context, - ImsConfig.ConfigConstants.EAB_SETTING_ENABLED, false); - } - - public static int getSIPT1Timer(Context context) { - int sipT1Timer = 0; - - ImsManager imsManager = ImsManager.getInstance(context, 0); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - sipT1Timer = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.SIP_T1_TIMER); - } - } catch (ImsException ex) { - } - } - - logger.debug("sipT1Timer=" + sipT1Timer); - return sipT1Timer; - } - - /** - * Capability discovery status of Enabled (1), or Disabled (0). - */ - public static boolean getCapabilityDiscoveryEnabled(Context context) { - boolean capabilityDiscoveryEnabled = false; - - ImsManager imsManager = ImsManager.getInstance(context, 0); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - capabilityDiscoveryEnabled = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.CAPABILITY_DISCOVERY_ENABLED) - == ImsConfig.FeatureValueConstants.ON; - } - } catch (ImsException ex) { - } - } - - logger.debug("capabilityDiscoveryEnabled=" + capabilityDiscoveryEnabled); - return capabilityDiscoveryEnabled; - } - - /** - * The Maximum number of MDNs contained in one Request Contained List. - */ - public static int getMaxNumbersInRCL(Context context) { - int maxNumbersInRCL = 100; - - ImsManager imsManager = ImsManager.getInstance(context, 0); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - maxNumbersInRCL = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.MAX_NUMENTRIES_IN_RCL); - } - } catch (ImsException ex) { - } - } - - logger.debug("maxNumbersInRCL=" + maxNumbersInRCL); - return maxNumbersInRCL; - } - - /** - * Expiration timer for subscription of a Request Contained List, used in capability polling. - */ - public static int getCapabPollListSubExp(Context context) { - int capabPollListSubExp = 30; - - ImsManager imsManager = ImsManager.getInstance(context, 0); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - capabPollListSubExp = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.CAPAB_POLL_LIST_SUB_EXP); - } - } catch (ImsException ex) { - } - } - - logger.debug("capabPollListSubExp=" + capabPollListSubExp); - return capabPollListSubExp; - } - - /** - * Peiod of time the availability information of a contact is cached on device. - */ - public static int getAvailabilityCacheExpiration(Context context) { - int availabilityCacheExpiration = 30; - - ImsManager imsManager = ImsManager.getInstance(context, 0); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - availabilityCacheExpiration = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.AVAILABILITY_CACHE_EXPIRATION); - } - } catch (ImsException ex) { - } - } - - logger.debug("availabilityCacheExpiration=" + availabilityCacheExpiration); - return availabilityCacheExpiration; - } - - public static boolean isMobileDataEnabled(Context context) { - boolean mobileDataEnabled = false; - ImsManager imsManager = ImsManager.getInstance(context, 0); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - mobileDataEnabled = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.MOBILE_DATA_ENABLED) - == ImsConfig.FeatureValueConstants.ON; - } - } catch (ImsException ex) { - } - } - - logger.debug("mobileDataEnabled=" + mobileDataEnabled); - return mobileDataEnabled; - } - - public static void setMobileDataEnabled(Context context, boolean mobileDataEnabled) { - logger.debug("mobileDataEnabled=" + mobileDataEnabled); - ImsManager imsManager = ImsManager.getInstance(context, 0); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - imsConfig.setProvisionedValue( - ImsConfig.ConfigConstants.MOBILE_DATA_ENABLED, mobileDataEnabled? - ImsConfig.FeatureValueConstants.ON:ImsConfig.FeatureValueConstants.OFF); - } - } catch (ImsException ex) { - logger.debug("ImsException", ex); - } - } - } - - public static int getPublishThrottle(Context context) { - int publishThrottle = 60000; - - ImsManager imsManager = ImsManager.getInstance(context, 0); - if (imsManager != null) { - try { - ImsConfig imsConfig = imsManager.getConfigInterface(); - if (imsConfig != null) { - publishThrottle = imsConfig.getProvisionedValue( - ImsConfig.ConfigConstants.SOURCE_THROTTLE_PUBLISH); - } - } catch (ImsException ex) { - } - } - - logger.debug("publishThrottle=" + publishThrottle); - return publishThrottle; - } -} - diff --git a/rcs/rcsservice/src/com/android/service/ims/RcsStackAdaptor.java b/rcs/rcsservice/src/com/android/service/ims/RcsStackAdaptor.java deleted file mode 100644 index ebf93704..00000000 --- a/rcs/rcsservice/src/com/android/service/ims/RcsStackAdaptor.java +++ /dev/null @@ -1,710 +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; - -import java.util.List; -import java.util.concurrent.Semaphore; -import java.util.concurrent.TimeUnit; - -import android.content.BroadcastReceiver; -import android.content.ComponentName; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.content.pm.ServiceInfo; -import android.content.Context; -import android.content.Intent; -import android.app.PendingIntent; -import android.content.IntentFilter; -import android.content.ServiceConnection; -import android.os.Handler; -import android.os.HandlerThread; -import android.os.IBinder; -import android.os.Looper; -import android.os.Message; -import android.os.RemoteException; -import android.telephony.TelephonyManager; -import android.app.AlarmManager; -import android.os.SystemClock; -import android.os.SystemProperties; -import com.android.ims.ImsConfig; -import com.android.ims.ImsManager; -import com.android.ims.ImsException; -import android.telephony.SubscriptionManager; - -import com.android.ims.IRcsPresenceListener; -import com.android.ims.RcsPresence; -import com.android.ims.RcsManager.ResultCode; -import com.android.ims.RcsPresence.PublishState; - -import com.android.ims.internal.Logger; -import com.android.ims.internal.ContactNumberUtils; -import com.android.service.ims.presence.PresencePublication; -import com.android.service.ims.R; - -import com.android.ims.internal.uce.presence.IPresenceService; -import com.android.ims.internal.uce.presence.PresCapInfo; -import com.android.ims.internal.uce.common.CapInfo; -import com.android.ims.internal.uce.uceservice.IUceService; -import com.android.ims.internal.uce.uceservice.ImsUceManager; -import com.android.ims.internal.uce.common.UceLong; -import com.android.ims.internal.uce.common.StatusCode; - -import com.android.ims.IRcsPresenceListener; -import com.android.ims.RcsPresenceInfo; - -import com.android.service.ims.presence.StackListener; -import com.android.service.ims.presence.PresenceInfoParser; -import com.android.service.ims.presence.AlarmBroadcastReceiver; - -public class RcsStackAdaptor{ - private static final boolean DEBUG = true; - - // The logger - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private static final int PRESENCE_INIT_IMS_UCE_SERVICE = 1; - - private Context mContext = null; - - // true when the stack presence service got available. (Called IQPresListener_ServiceAvailable) - private volatile boolean mImsEnableState = false; - - // provision status can be set by both subscribe and pubilish - // for unprovisioned for 403 or 404 - private volatile int mPublishingState = PublishState.PUBLISH_STATE_NOT_PUBLISHED; - - // It is initializing the stack presence service. - private volatile boolean mIsIniting = false; - - // The time which the stack presence service got initialized. - private volatile long mLastInitSubService = -1; //last time which inited the sub service - - // Used for synchronizing - private final Object mSyncObj = new Object(); - - // We need wait RCS stack become unavailable before close RCS service. - static private boolean sInPowerDown = false; - - // This could happen when the stack first launch or modem panic. - private static final int PRESENCE_INIT_TYPE_RCS_SERVICE_AVAILABLE =1; - - // The initialization was triggered by retry. - private static final int PRESENCE_INIT_TYPE_RETRY = 2; - - // The initialization was triggered by retry. - private static final int PRESENCE_INIT_TYPE_IMS_REGISTERED = 3; - - // The maximum retry count for initializing the stack service. - private static final int MAX_RETRY_COUNT = 6;//Maximum time is 64s - - public boolean isImsEnableState() { - return mImsEnableState; - } - - synchronized public void setImsEnableState(boolean imsEnableState) { - logger.debug("imsEnableState=" + imsEnableState); - - mImsEnableState = imsEnableState; - } - - // The UCE manager for RCS stack. - private ImsUceManager mImsUceManager = null; - - // The stack RCS Service instance. - private IUceService mStackService = null; - - // The stack presence service - private IPresenceService mStackPresService = null; - - // The stack Presence Service handle. - private int mStackPresenceServiceHandle; - - // The listener which listen to the response for presence service. - private StackListener mListenerHandler = null; - - // The handler of the listener. - private UceLong mListenerHandle = new UceLong(); - - // The singleton. - private static RcsStackAdaptor sInstance = null; - - // Constructor - private RcsStackAdaptor(Context context) { - mContext = context; - - init(); - } - - public static synchronized RcsStackAdaptor getInstance(Context context) { - if ((sInstance == null) && (context != null)) { - sInstance = new RcsStackAdaptor(context); - } - - return sInstance; - } - - private Handler mMsgHandler = new Handler() { - @Override - public void handleMessage(Message msg) { - super.handleMessage(msg); - - logger.debug( "Thread=" + Thread.currentThread().getName() + " received " - + msg); - if(msg == null){ - logger.error("msg=null"); - return; - } - - switch (msg.what) { - case PRESENCE_INIT_IMS_UCE_SERVICE: - logger.debug("handleMessage msg=PRESENCE_INIT_IMS_UCE_SERVICE" ); - doInitImsUceService(); - break; - - default: - logger.debug("handleMessage unknown msg=" + msg.what); - } - } - }; - - public StackListener getListener(){ - return mListenerHandler; - } - - public int checkStackAndPublish(){ - if(!RcsSettingUtils.getCapabilityDiscoveryEnabled(mContext)){ - logger.error("getCapabilityDiscoveryEnabled = false"); - return ResultCode.ERROR_SERVICE_NOT_ENABLED; - } - - int ret = checkStackStatus(); - if(ret !=ResultCode.SUCCESS){ - logger.error("checkStackAndPublish ret=" + ret); - return ret; - } - - if(!isPublished()){ - logger.error( - "checkStackAndPublish ERROR_SERVICE_NOT_PUBLISHED"); - return ResultCode.ERROR_SERVICE_NOT_PUBLISHED; - } - - return ResultCode.SUCCESS; - } - - private boolean isPublished(){ - if(getPublishState() != PublishState.PUBLISH_STATE_200_OK){ - logger.error("Didnt' publish properly"); - return false; - } - - return true; - } - - public void setPublishState(int publishState) { - logger.print("mPublishingState=" + mPublishingState + " publishState=" + publishState); - if(mPublishingState != publishState) { - // save it for recovery when PresenceService crash. - 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); - mContext.sendStickyBroadcast(publishIntent); - } - - mPublishingState = publishState; - } - - public int getPublishState(){ - return mPublishingState; - } - - public int checkStackStatus(){ - if(!RcsSettingUtils.isEabProvisioned(mContext)) { - logger.error("Didn't get EAB provisioned by DM"); - return ResultCode.ERROR_SERVICE_NOT_ENABLED; - } - - // Don't send request to RCS stack when it is under powering off. - // RCS stack is sending UNPUBLISH. It could get race PUBLISH trigger under the case. - if(sInPowerDown) { - logger.error("checkStackStatus: under powering off"); - return ResultCode.ERROR_SERVICE_NOT_AVAILABLE; - } - - if(mStackService == null){ - logger.error("checkStackStatus: mStackService == null"); - return ResultCode.ERROR_SERVICE_NOT_AVAILABLE; - } - - if(mStackPresService == null){ - logger.error("Didn't init sub rcs service."); - return ResultCode.ERROR_SERVICE_NOT_AVAILABLE; - } - - if(!mImsEnableState){ - logger.error("mImsEnableState = false"); - return ResultCode.ERROR_SERVICE_NOT_AVAILABLE; - } - - return ResultCode.SUCCESS; - } - - public int requestCapability(String[] formatedContacts, int taskId){ - logger.print("requestCapability formatedContacts=" + formatedContacts); - - int ret = ResultCode.SUCCESS; - try{ - StatusCode retCode; - if(formatedContacts.length == 1){ - retCode = mStackPresService.getContactCap( - mStackPresenceServiceHandle, formatedContacts[0], taskId); - }else{ - retCode = mStackPresService.getContactListCap( - mStackPresenceServiceHandle, formatedContacts, taskId); - } - logger.print("GetContactListCap retCode=" + retCode); - - ret = RcsUtils.statusCodeToResultCode(retCode.getStatusCode()); - logger.debug("requestCapability ret=" + ret); - }catch(Exception e){ - logger.error("requestCapability exception", e); - ret = ResultCode.ERROR_SERVICE_NOT_AVAILABLE; - } - - return ret; - } - - public int requestAvailability(String formatedContact, int taskId){ - logger.debug("requestAvailability ..."); - - int ret = ResultCode.SUCCESS; - try{ - StatusCode retCode = mStackPresService.getContactCap( - mStackPresenceServiceHandle, formatedContact, taskId); - logger.print("getContactCap retCode=" + retCode); - - ret = RcsUtils.statusCodeToResultCode(retCode.getStatusCode()); - - logger.debug("requestAvailability ret=" + ret); - }catch(Exception e){ - logger.error("requestAvailability exception", e); - ret = ResultCode.ERROR_SERVICE_NOT_AVAILABLE; - } - - return ret; - } - - public int requestPublication(RcsPresenceInfo presenceInfo, IRcsPresenceListener listener) { - logger.debug("requestPublication ..."); - - // Don't use checkStackAndPublish() - // since it will check publish status which in dead loop. - int ret = checkStackStatus(); - if(ret != ResultCode.SUCCESS){ - logger.error("requestPublication ret=" + ret); - return ret; - } - - TelephonyManager teleMgr = (TelephonyManager) mContext.getSystemService( - Context.TELEPHONY_SERVICE); - if(teleMgr == null){ - logger.error("teleMgr = null"); - return PresencePublication.PUBLISH_GENIRIC_FAILURE; - } - - String myNumUri = null; - String myDomain = teleMgr.getIsimDomain(); - logger.debug("myDomain=" + myDomain); - if(myDomain != null && myDomain.length() !=0){ - String[] impu = teleMgr.getIsimImpu(); - - if(impu !=null){ - for(int i=0; i<impu.length; i++){ - logger.debug("impu[" + i + "]=" + impu[i]); - if(impu[i] != null && impu[i].startsWith("sip:") && - impu[i].endsWith(myDomain)){ - myNumUri = impu[i]; - break; - } - } - } - } - - String myNumber = PresenceInfoParser.getPhoneFromUri(myNumUri); - - if(myNumber == null){ - myNumber = ContactNumberUtils.getDefault().format(teleMgr.getLine1Number()); - if(myDomain != null && myDomain.length() !=0){ - myNumUri = "sip:" + myNumber + "@" + myDomain; - }else{ - myNumUri = "tel:" + myNumber; - } - } - - logger.print("myNumUri=" + myNumUri + " myNumber=" + myNumber); - if(myNumUri == null || myNumber == null){ - logger.error("Didn't find number or impu."); - return PresencePublication.PUBLISH_GENIRIC_FAILURE; - } - - int taskId = TaskManager.getDefault().addPublishTask(myNumber, listener); - try{ - PresCapInfo pMyCapInfo = new PresCapInfo(); - // Fill cap info - pMyCapInfo.setContactUri(myNumUri); - - CapInfo capInfo = new CapInfo(); - capInfo.setIpVoiceSupported(presenceInfo.getServiceState( - RcsPresenceInfo.ServiceType.VOLTE_CALL) - == RcsPresenceInfo.ServiceState.ONLINE); - capInfo.setIpVideoSupported(presenceInfo.getServiceState( - RcsPresenceInfo.ServiceType.VT_CALL) - == RcsPresenceInfo.ServiceState.ONLINE); - capInfo.setCdViaPresenceSupported(true); - - capInfo.setFtSupported(false); // TODO: support FT - capInfo.setImSupported(false);//TODO: support chat - capInfo.setFullSnFGroupChatSupported(false); //TODO: support chat - - pMyCapInfo.setCapInfo(capInfo); - - logger.print( "myNumUri = " + myNumUri - + " audioSupported = " + capInfo.isIpVoiceSupported() - + " videoSupported= " + capInfo.isIpVideoSupported() - ); - - - StatusCode status = mStackPresService.publishMyCap( - mStackPresenceServiceHandle, pMyCapInfo, taskId); - logger.print("PublishMyCap status=" + status.getStatusCode()); - - ret = RcsUtils.statusCodeToResultCode(status.getStatusCode()); - - logger.debug("requestPublication ret=" + ret); - if(ret != ResultCode.SUCCESS){ - logger.error("requestPublication remove taskId=" + taskId); - TaskManager.getDefault().removeTask(taskId); - return ret; - } - }catch(RemoteException e){ - e.printStackTrace(); - logger.error("Exception when call mStackPresService.getContactCap"); - logger.error("requestPublication remove taskId=" + taskId); - TaskManager.getDefault().removeTask(taskId); - - return ResultCode.ERROR_SERVICE_NOT_AVAILABLE; - } - - return ResultCode.SUCCESS; - } - - private void createListeningThread() { - HandlerThread listenerThread = new HandlerThread("Listener", - android.os.Process.THREAD_PRIORITY_BACKGROUND); - - listenerThread.start(); - Looper listenerLooper = listenerThread.getLooper(); - mListenerHandler = new StackListener(mContext, listenerLooper); - } - - private void initImsUceService(){ - // Send message to avoid ANR - Message reinitMessage = mMsgHandler.obtainMessage( - PRESENCE_INIT_IMS_UCE_SERVICE, null); - mMsgHandler.sendMessage(reinitMessage); - } - - synchronized private void doInitImsUceService(){ - logger.debug("doInitImsUceService"); - - if(mStackService != null){ - logger.debug("doInitImsUceService mStackService != null"); - return; - } - - IntentFilter filter = new IntentFilter(); - filter.addAction(ImsUceManager.ACTION_UCE_SERVICE_UP); - filter.addAction(ImsUceManager.ACTION_UCE_SERVICE_DOWN); - - mRcsServiceReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - // do something based on the intent's action - logger.print("onReceive intent " + intent); - String action = intent.getAction(); - if(ImsUceManager.ACTION_UCE_SERVICE_UP.equals(action)) { - synchronized(mSyncObj){ - startInitPresenceTimer(0, PRESENCE_INIT_TYPE_RCS_SERVICE_AVAILABLE); - } - } else if(ImsUceManager.ACTION_UCE_SERVICE_DOWN.equals(action)) { - synchronized(mSyncObj){ - clearImsUceService(); - } - } else { - logger.debug("unknown intent " + intent); - } - } - }; - - mContext.registerReceiver(mRcsServiceReceiver, filter); - - if(mImsUceManager == null) { - mImsUceManager = ImsUceManager.getInstance(mContext, - SubscriptionManager.from(mContext).getDefaultDataPhoneId()); - if(mImsUceManager == null) { - logger.error("Can't init mImsUceManager"); - return; - } - } - - mImsUceManager.createUceService(false); - mStackService = mImsUceManager.getUceServiceInstance(); - logger.debug("doInitImsUceService mStackService=" + mStackService); - - if(mStackService != null) { - startInitPresenceTimer(0, PRESENCE_INIT_TYPE_RCS_SERVICE_AVAILABLE); - } - } - - private PendingIntent mRetryAlarmIntent = null; - public static final String ACTION_RETRY_ALARM = "com.android.service.ims.presence.retry"; - private AlarmManager mAlarmManager = null; - private BroadcastReceiver mRcsServiceReceiver = null; - - /* - * Init All Sub service of RCS - */ - int initAllSubRcsServices(IUceService uceService, int currentRetry) { - int ret = -1; - synchronized (mSyncObj){ - // we could receive useless retry since we could fail to cancel the retry timer. - // We need to ignore such retry if the sub service had been initialized already. - if(mStackPresService != null && currentRetry>0){ - logger.debug("mStackPresService != null and currentRetry=" + currentRetry + - " ignore it"); - return 0; - } - - logger.debug("Init All Services Under RCS uceService=" + uceService); - if(uceService == null){ - logger.error("initAllServices : uceService is NULL "); - mIsIniting = false; - mLastInitSubService = -1; - return ret; - } - - try { - if(mStackPresService != null){ - logger.print("RemoveListener and QRCSDestroyPresService"); - mStackPresService.removeListener(mStackPresenceServiceHandle, - mListenerHandle); - uceService.destroyPresenceService(mStackPresenceServiceHandle); - - mStackPresService = null; - } - - boolean serviceStatus = false; - serviceStatus = uceService.getServiceStatus(); - if (true == serviceStatus && mStackPresService == null) {//init only once. - logger.print("initAllService : serviceStatus = true "); - logger.debug("Create PresService"); - mStackPresenceServiceHandle = mStackService.createPresenceService( - mListenerHandler.mPresenceListener, mListenerHandle); - mStackPresService = mStackService.getPresenceService(); - ret = 0; - } else { - logger.error("initAllService : serviceStatus = false "); - } - } catch (RemoteException e) { - logger.error("initAllServices : DeadObjectException dialog "); - e.printStackTrace(); - } - mIsIniting = false; - } - return ret; - } - - // Init sub service when IMS get registered. - public void checkSubService() { - logger.debug("checkSubService"); - if(mStackPresService == null) { - // Cancel the retry timer. - if(mIsIniting){ - if(mRetryAlarmIntent != null){ - mAlarmManager.cancel(mRetryAlarmIntent); - mRetryAlarmIntent = null; - } - mIsIniting = false; - } - - // force to init imediately. - startInitPresenceTimer(0, PRESENCE_INIT_TYPE_IMS_REGISTERED); - } - } - - public void startInitThread(int times){ - final int currentRetry = times; - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - if (currentRetry >=0 && currentRetry <= MAX_RETRY_COUNT) { - refreshUceService(); - - if (initAllSubRcsServices(mStackService, currentRetry) >=0){ - logger.debug("init sub rcs service successfully."); - mAlarmManager.cancel(mRetryAlarmIntent); - } else { - startInitPresenceTimer(currentRetry + 1, PRESENCE_INIT_TYPE_RETRY); - } - } else { - logger.debug("Retry times=" + currentRetry); - mAlarmManager.cancel(mRetryAlarmIntent); - } - } - }, "initAllSubRcsServices thread"); - - thread.start(); - } - - private void init() { - createListeningThread(); - logger.debug("after createListeningThread"); - - if(mAlarmManager == null){ - mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); - } - - initImsUceService(); - - setInPowerDown(false); - logger.debug("init finished"); - } - - private void startInitPresenceTimer(int times, int initType){ - synchronized (mSyncObj){ - logger.print("set the retry alarm, times=" + times + " initType=" + initType + - " mIsIniting=" + mIsIniting); - if(mIsIniting){ - //initing is on going in 5 seconds, discard this one. - if(mLastInitSubService != -1 && - System.currentTimeMillis() - mLastInitSubService < 5000){ - logger.print("already in initing. ignore it"); - return; - }//else suppose the init has problem. so continue - } - - mIsIniting = true; - - Intent intent = new Intent(ACTION_RETRY_ALARM); - intent.putExtra("times", times); - intent.setClass(mContext, AlarmBroadcastReceiver.class); - mRetryAlarmIntent = PendingIntent.getBroadcast(mContext, 0, intent, - PendingIntent.FLAG_UPDATE_CURRENT); - - // Wait for 1s to ignore duplicate init request as possible as we can. - long timeSkip = 1000; - if(times < 0 || times >= MAX_RETRY_COUNT){ - times = MAX_RETRY_COUNT; - } - - //Could failed to cancel a timer in 1s. So use exponential retry to make sure it - //will be stopped for non-VoLte SIM. - timeSkip = (timeSkip << times); - logger.debug("timeSkip = " + timeSkip); - - mLastInitSubService = System.currentTimeMillis(); - - //the timer intent could have a longer delay. call directly at first time - if(times == 0) { - startInitThread(0); - } else { - mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, - SystemClock.elapsedRealtime() + timeSkip, mRetryAlarmIntent); - } - } - } - - private void refreshUceService() { - logger.debug("refreshUceService mImsUceManager=" + mImsUceManager + - " mStackService=" + mStackService); - - if(mImsUceManager == null) { - mImsUceManager = ImsUceManager.getInstance(mContext, - SubscriptionManager.from(mContext).getDefaultDataPhoneId()); - if(mImsUceManager == null) { - logger.error("Can't init mImsUceManager"); - return; - } - } - - if(mStackService == null) { - mImsUceManager.createUceService(false); - mStackService = mImsUceManager.getUceServiceInstance(); - } - - logger.debug("refreshUceService mStackService=" + mStackService); - } - - private void clearImsUceService() { - mImsUceManager = null; - mStackService = null; - mStackPresService = null; - } - - public void finish() { - if(mRetryAlarmIntent != null){ - mAlarmManager.cancel(mRetryAlarmIntent); - mRetryAlarmIntent = null; - } - - if (mRcsServiceReceiver != null) { - mContext.unregisterReceiver(mRcsServiceReceiver); - mRcsServiceReceiver = null; - } - - clearImsUceService(); - } - - protected void finalize() throws Throwable { - finish(); - } - - static public boolean isInPowerDown() { - return sInPowerDown; - } - - static void setInPowerDown(boolean inPowerDown) { - sInPowerDown = inPowerDown; - } -} - diff --git a/rcs/rcsservice/src/com/android/service/ims/RcsUtils.java b/rcs/rcsservice/src/com/android/service/ims/RcsUtils.java deleted file mode 100644 index bbfacd22..00000000 --- a/rcs/rcsservice/src/com/android/service/ims/RcsUtils.java +++ /dev/null @@ -1,109 +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; - -import java.lang.String; -import android.telephony.TelephonyManager; -import android.content.Context; - -import com.android.ims.internal.uce.common.StatusCode; - -import com.android.ims.RcsManager.ResultCode; - -import com.android.ims.internal.Logger; - -public class RcsUtils{ - /* - * The logger - */ - static private Logger logger = Logger.getLogger("RcsUtils"); - - public RcsUtils() { - } - - static public int statusCodeToResultCode(int sipStatusCode){ - if(sipStatusCode == StatusCode.UCE_SUCCESS || - sipStatusCode == StatusCode.UCE_SUCCESS_ASYC_UPDATE){ - return ResultCode.SUCCESS; - } - - if(sipStatusCode == StatusCode.UCE_INVALID_PARAM) { - return ResultCode.SUBSCRIBE_INVALID_PARAM; - } - - if(sipStatusCode == StatusCode.UCE_FETCH_ERROR) { - return ResultCode.SUBSCRIBE_FETCH_ERROR; - } - - if(sipStatusCode == StatusCode.UCE_REQUEST_TIMEOUT) { - return ResultCode.SUBSCRIBE_REQUEST_TIMEOUT; - } - - if(sipStatusCode == StatusCode.UCE_INSUFFICIENT_MEMORY) { - return ResultCode.SUBSCRIBE_INSUFFICIENT_MEMORY; - } - - if(sipStatusCode == StatusCode.UCE_LOST_NET) { - return ResultCode.SUBSCRIBE_LOST_NETWORK; - } - - if(sipStatusCode == StatusCode.UCE_NOT_SUPPORTED){ - return ResultCode.SUBSCRIBE_NOT_SUPPORTED; - } - - if(sipStatusCode == StatusCode.UCE_NOT_FOUND){ - return ResultCode.SUBSCRIBE_NOT_FOUND; - } - - if(sipStatusCode == StatusCode.UCE_FAILURE || - sipStatusCode == StatusCode.UCE_INVALID_SERVICE_HANDLE || - sipStatusCode == StatusCode.UCE_INVALID_LISTENER_HANDLE){ - return ResultCode.SUBSCRIBE_GENERIC; - } - - return ResultCode.SUBSCRIBE_GENERIC; - } - - static public String toContactString(String[] contacts) { - if(contacts == null) { - return null; - } - - String result = ""; - for(int i=0; i<contacts.length; i++) { - result += contacts[i]; - if(i != contacts.length -1) { - result += ";"; - } - } - - return result; - } -} - diff --git a/rcs/rcsservice/src/com/android/service/ims/Task.java b/rcs/rcsservice/src/com/android/service/ims/Task.java deleted file mode 100644 index a58aebfe..00000000 --- a/rcs/rcsservice/src/com/android/service/ims/Task.java +++ /dev/null @@ -1,104 +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; - -import java.util.Set; -import java.util.HashMap; -import java.util.List; -import java.util.ArrayList; -import android.os.RemoteException; - -import com.android.ims.internal.Logger; -import com.android.ims.IRcsPresenceListener; - -/** - * Task - */ -public class Task{ - /* - * The logger - */ - private Logger logger = Logger.getLogger(this.getClass().getName()); - - // filled before send the reques - public int mTaskId; - - // filled before send the request - // map to QRCS_PRES_CMD_ID - // QRCS_PRES_CMD_PUBLISHMYCAP - // QRCS_PRES_CMD_GETCONTACTCAP, we use it for capability - // QRCS_PRES_CMD_GETCONTACTLISTCAP, we use it for availability - // QRCS_PRES_CMD_SETNEWFEATURETAG - public int mCmdId; - - // filled after IQPresListener_CMDStatus - // QRCS_STATUSCODE, possible values are: - // QRCS_SUCCESS - // QRCS_FAILURE - // QRCS_SUCCESS_ASYC_UPDATE - // QRCS_INVALID_SERVICE_HANDLE - // QRCS_INVALID_LISTENER_HANDLE - // QRCS_INVALID_PARAM - // QRCS_FETCH_ERROR - // QRCS_REQUEST_TIMEOUT - // QRCS_INSUFFICIENT_MEMORY - // QRCS_LOST_NET - // QRCS_NOT_SUPPORTED - // QRCS_NOT_FOUND - // Note: have converted it to ResultCode. - public int mCmdStatus; - - //filled after IQPresListener_CMDStatus - public int mSipRequestId; - - // filled after IQPresListener_SipResponseReceived - public int mSipResponseCode; - - // filled after IQPresListener_SipResponseReceived - public String mSipReasonPhrase; - - // filled before send the request - public IRcsPresenceListener mListener; - - public Task(int taskId, int cmdId, IRcsPresenceListener listener){ - mTaskId = taskId; - mCmdId = cmdId; - mListener = listener; - } - - public String toString(){ - return "Task: mTaskId=" + mTaskId + - " mCmdId=" + mCmdId + - " mCmdStatus=" + mCmdStatus + - " mSipRequestId=" + mSipRequestId + - " mSipResponseCode=" + mSipResponseCode + - " mSipReasonPhrase=" + mSipReasonPhrase; - } -}; - diff --git a/rcs/rcsservice/src/com/android/service/ims/TaskManager.java b/rcs/rcsservice/src/com/android/service/ims/TaskManager.java deleted file mode 100644 index 4e931ac0..00000000 --- a/rcs/rcsservice/src/com/android/service/ims/TaskManager.java +++ /dev/null @@ -1,394 +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; - -import java.util.Set; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.List; -import java.util.ArrayList; -import android.os.RemoteException; -import android.content.Context; -import android.os.Handler; -import android.os.Message; -import android.os.HandlerThread; -import android.os.Looper; -import android.telephony.PhoneNumberUtils; - -import com.android.ims.internal.uce.presence.PresCmdStatus; - -import com.android.ims.internal.Logger; -import com.android.ims.RcsManager.ResultCode; -import com.android.ims.RcsPresenceInfo; -import com.android.ims.IRcsPresenceListener; - -import com.android.service.ims.presence.PresenceTask; -import com.android.service.ims.presence.PresenceCapabilityTask; -import com.android.service.ims.presence.PresenceAvailabilityTask; - -/** - * TaskManager - */ -public class TaskManager{ - /* - * The logger - */ - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private static TaskManager sTaskManager = null; - - private int mTaskId = 0; - - public final static int TASK_TYPE_GET_CAPABILITY = 1; - public final static int TASK_TYPE_GET_AVAILABILITY = 2; - public final static int TASK_TYPE_PUBLISH = 3; - - private Map<String, Task> mTaskMap; - - private final Object mSyncObj = new Object(); - - private static final int TASK_MANAGER_ON_TERMINATED = 1; - private static final int TASK_MANAGER_ON_TIMEOUT = 2; - - private static MessageHandler sMsgHandler; - - public TaskManager(){ - logger.debug("TaskManager created."); - mTaskMap = new HashMap<String, Task>(); - - HandlerThread messageHandlerThread = new HandlerThread("MessageHandler", - android.os.Process.THREAD_PRIORITY_BACKGROUND); - - messageHandlerThread.start(); - Looper messageHandlerLooper = messageHandlerThread.getLooper(); - sMsgHandler = new MessageHandler(messageHandlerLooper); - } - - public static synchronized TaskManager getDefault(){ - if(sTaskManager == null){ - sTaskManager = new TaskManager(); - } - - return sTaskManager; - } - - public synchronized int generateTaskId(){ - return mTaskId++; - } - - public void putTask(int taskId, Task task){ - synchronized (mSyncObj){ - putTaskInternal(taskId, task); - } - } - - private synchronized void putTaskInternal(int taskId, Task task){ - Task sameKeyTask = mTaskMap.put(String.valueOf(taskId), task); - - logger.debug("Added Task: " + task + "Original same key task:" + sameKeyTask); - } - - public int addCapabilityTask(Context context, String[] contacts, - IRcsPresenceListener listener, long timeout){ - int taskId = TaskManager.getDefault().generateTaskId(); - synchronized (mSyncObj){ - Task task = new PresenceCapabilityTask(context, taskId, TASK_TYPE_GET_CAPABILITY, - listener, contacts, timeout); - putTaskInternal(taskId, task); - } - - return taskId; - } - - public int addAvailabilityTask(String contact, IRcsPresenceListener listener){ - int taskId = TaskManager.getDefault().generateTaskId(); - synchronized (mSyncObj){ - String[] contacts = new String[1]; - contacts[0] = contact; - Task task = new PresenceAvailabilityTask(taskId, TASK_TYPE_GET_AVAILABILITY, - listener, contacts); - putTaskInternal(taskId, task); - } - - return taskId; - } - - public int addPublishTask(String contact, IRcsPresenceListener listener){ - int taskId = TaskManager.getDefault().generateTaskId(); - synchronized (mSyncObj){ - String[] contacts = new String[1]; - contacts[0] = contact; - Task task = new PresenceTask(taskId, TASK_TYPE_PUBLISH, listener, contacts); - putTaskInternal(taskId, task); - } - - return taskId; - } - - // If need to call getTask in this class please add another one getTaskInternal - public Task getTask(int taskId){ - synchronized (mSyncObj){ - return mTaskMap.get(String.valueOf(taskId)); - } - } - - public void removeTask(int taskId){ - synchronized (mSyncObj){ - Task task = mTaskMap.remove(String.valueOf(taskId)); - if(task instanceof PresenceCapabilityTask){ - ((PresenceCapabilityTask)task).cancelTimer(); - } - logger.debug("Removed Task: " + task); - } - } - - public Task getTaskByRequestId(int sipRequestId){ - synchronized (mSyncObj){ - Set<String> keys= mTaskMap.keySet(); - if(keys == null){ - logger.debug("getTaskByRequestId keys=null"); - return null; - } - - for(String key:keys){ - if(mTaskMap.get(key).mSipRequestId == sipRequestId){ - logger.debug("getTaskByRequestId, sipRequestId=" + sipRequestId + - " task=" + mTaskMap.get(key)); - return mTaskMap.get(key); - } - } - } - - logger.debug("getTaskByRequestId, sipRequestId=" + sipRequestId + " task=null"); - return null; - } - - public void onTerminated(String contact){ // for single number capability polling - logger.debug("onTerminated contact=" + contact); - if(contact == null){ - return; - } - - synchronized (mSyncObj){ - Set<String> keys= mTaskMap.keySet(); - if(keys == null){ - logger.debug("onTerminated keys is null"); - return; - } - - for(String key:keys){ - Task task = mTaskMap.get(key); - if(task == null){ - continue; - } - - if(task instanceof PresenceCapabilityTask){ - PresenceCapabilityTask capabilityTask = (PresenceCapabilityTask)task; - if(capabilityTask.mContacts != null && capabilityTask.mContacts[0] != null && - PhoneNumberUtils.compare(contact, capabilityTask.mContacts[0])){ - if(!capabilityTask.isWaitingForNotify()){ - logger.debug("onTerminated the tesk is not waiting for NOTIFY yet"); - continue; - } - - MessageData messageData = new MessageData(); - messageData.mTask = capabilityTask; - messageData.mReason = null; - - Message notifyMessage = sMsgHandler.obtainMessage( - TASK_MANAGER_ON_TERMINATED, - messageData); - sMsgHandler.sendMessage(notifyMessage); - } - } - } - } - } - - public void onTerminated(int requestId, String reason){ - logger.debug("onTerminated requestId=" + requestId + " reason=" + reason); - - Task task = getTaskByRequestId(requestId); - if(task == null){ - logger.debug("onTerminated Can't find request " + requestId); - return; - } - - synchronized (mSyncObj){ - if(task instanceof PresenceCapabilityTask){ - MessageData messageData = new MessageData(); - messageData.mTask = (PresenceCapabilityTask)task; - messageData.mReason = reason; - - Message notifyMessage = sMsgHandler.obtainMessage(TASK_MANAGER_ON_TERMINATED, - messageData); - sMsgHandler.sendMessage(notifyMessage); - } - } - } - - public void onTimeout(int taskId){ - logger.debug("onTimeout taskId=" + taskId); - - Task task = getTask(taskId); - if(task == null){ - logger.debug("onTimeout task = null"); - return; - } - synchronized (mSyncObj){ - if(task instanceof PresenceCapabilityTask){ - MessageData messageData = new MessageData(); - messageData.mTask = (PresenceCapabilityTask)task; - messageData.mReason = null; - - Message timeoutMessage = sMsgHandler.obtainMessage(TASK_MANAGER_ON_TIMEOUT, - messageData); - sMsgHandler.sendMessage(timeoutMessage); - }else{ - logger.debug("not PresenceCapabilityTask, taskId=" + taskId); - } - } - } - - public class MessageData{ - public PresenceCapabilityTask mTask; - public String mReason; - } - - public class MessageHandler extends Handler{ - MessageHandler(Looper looper){ - super(looper); - } - - @Override - public void handleMessage(Message msg) { - super.handleMessage(msg); - - logger.debug( "Thread=" + Thread.currentThread().getName() + " received " - + msg); - - - - if(msg == null){ - logger.error("msg=null"); - return; - } - - switch (msg.what) { - case TASK_MANAGER_ON_TERMINATED: - { - MessageData messageData = (MessageData) msg.obj; - if(messageData != null && messageData.mTask != null){ - messageData.mTask.onTerminated(messageData.mReason); - } - break; - } - - case TASK_MANAGER_ON_TIMEOUT: - { - MessageData messageData = (MessageData) msg.obj; - if(messageData != null && messageData.mTask != null){ - messageData.mTask.onTimeout(); - } - break; - } - - default: - logger.debug("handleMessage unknown msg=" + msg.what); - } - } - } - - public void clearTimeoutAvailabilityTask(long availabilityExpire) { - logger.debug("clearTimeoutAvailabilityTask"); - - synchronized (mSyncObj) { - long currentTime = System.currentTimeMillis(); - - Iterator<Map.Entry<String, Task>> iterator = mTaskMap.entrySet().iterator(); - while (iterator.hasNext()) { - Map.Entry<String, Task> entry = iterator.next(); - - Task task = (Task) entry.getValue(); - logger.debug("Currently existing Availability task, key: " + entry.getKey() - + ", Task: " + task); - - if ((task != null) && (task instanceof PresenceAvailabilityTask)) { - PresenceAvailabilityTask presenceTask = (PresenceAvailabilityTask)task; - - long notifyTimestamp = presenceTask.getNotifyTimestamp(); - long createTimestamp = presenceTask.getCreateTimestamp(); - logger.debug("createTimestamp=" + createTimestamp + " notifyTimestamp=" + - notifyTimestamp + " currentTime=" + currentTime); - - // remove it if it didn't get notify in 60s. - // or get notify for 60s - if(((notifyTimestamp != 0) && - (notifyTimestamp + availabilityExpire < currentTime)) || - (notifyTimestamp == 0) && - (createTimestamp + availabilityExpire < currentTime)) { - logger.debug("remove expired availability task:" + presenceTask); - iterator.remove(); - } - } - } - } - } - - public PresenceAvailabilityTask getAvailabilityTaskByContact(String contact){ - synchronized (mSyncObj){ - Set<String> keys= mTaskMap.keySet(); - if(keys == null){ - logger.debug("getTaskByContact keys=null"); - return null; - } - - for(String key:keys){ - Task task = mTaskMap.get(key); - if(task == null){ - continue; - } - - if(task instanceof PresenceAvailabilityTask){ - PresenceAvailabilityTask availabilityTask = (PresenceAvailabilityTask)task; - if(PhoneNumberUtils.compare(contact, availabilityTask.mContacts[0])){ - logger.debug("getTaskByContact contact=" + contact + - " task=" + availabilityTask); - return availabilityTask; - } - } - } - } - - logger.debug("getTaskByContact, contact=" + contact + " task=null"); - return null; - } -} - diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/AlarmBroadcastReceiver.java b/rcs/rcsservice/src/com/android/service/ims/presence/AlarmBroadcastReceiver.java deleted file mode 100644 index f02f9ce3..00000000 --- a/rcs/rcsservice/src/com/android/service/ims/presence/AlarmBroadcastReceiver.java +++ /dev/null @@ -1,82 +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.internal.Logger; - -import com.android.service.ims.RcsStackAdaptor; -import com.android.service.ims.TaskManager; - -public class AlarmBroadcastReceiver extends BroadcastReceiver{ - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private static final String ACTION_RETRY_ALARM = - RcsStackAdaptor.ACTION_RETRY_ALARM; - private static final String ACTION_TASK_TIMEOUT_ALARM = - PresenceCapabilityTask.ACTION_TASK_TIMEOUT_ALARM; - private static final String ACTION_RETRY_PUBLISH_ALARM = - PresencePublication.ACTION_RETRY_PUBLISH_ALARM; - - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - logger.info("onReceive intent: " + action); - - // this could happen when there is a crash and the previous broadcasted intent - // coming when the PresenceService is launching. - RcsStackAdaptor rcsStackAdaptor = RcsStackAdaptor.getInstance(null); - if(rcsStackAdaptor == null){ - logger.debug("rcsStackAdaptor=null"); - return; - } - - if(ACTION_RETRY_ALARM.equals(action)) { - int times = intent.getIntExtra("times", -1); - rcsStackAdaptor.startInitThread(times); - }else if(ACTION_TASK_TIMEOUT_ALARM.equals(action)){ - int taskId = intent.getIntExtra("taskId", -1); - TaskManager.getDefault().onTimeout(taskId); - } else if(ACTION_RETRY_PUBLISH_ALARM.equals(action)) { - // default retry is for 888 - int sipCode = intent.getIntExtra("sipCode", 888); - PresencePublication publication = PresencePublication.getPresencePublication(); - if(publication != null) { - publication.retryPublish(); - } - } - else{ - logger.debug("not interest in intent=" + intent); - } - } -}; - diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceAvailabilityTask.java b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceAvailabilityTask.java deleted file mode 100644 index 99c698f3..00000000 --- a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceAvailabilityTask.java +++ /dev/null @@ -1,92 +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 java.util.Set; -import java.util.HashMap; -import java.util.List; -import java.util.ArrayList; -import android.content.Context; -import android.content.Intent; -import android.app.PendingIntent; -import android.content.IntentFilter; -import android.os.RemoteException; -import android.app.AlarmManager; -import android.os.SystemClock; - -import com.android.ims.internal.uce.presence.PresCmdStatus; - -import com.android.ims.internal.Logger; -import com.android.ims.RcsManager.ResultCode; -import com.android.ims.RcsPresenceInfo; -import com.android.ims.IRcsPresenceListener; - -import com.android.service.ims.TaskManager; - -/** - * PresenceAvailabilityTask - */ -public class PresenceAvailabilityTask extends PresenceTask{ - /* - * The logger - */ - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private long mCreateTimestamp = 0; - - // Time when get the notify. Used to check the 60s expires. - private long mNotifyTimeStamp = 0; - - public PresenceAvailabilityTask(int taskId, int cmdId, IRcsPresenceListener listener, - String[] contacts){ - super(taskId, cmdId, listener, contacts); - - mCreateTimestamp = System.currentTimeMillis(); - mNotifyTimeStamp = 0; - } - - public void updateNotifyTimestamp() { - mNotifyTimeStamp = System.currentTimeMillis(); - logger.debug("updateNotifyTimestamp mNotifyTimeStamp=" + mNotifyTimeStamp); - } - - public long getNotifyTimestamp() { - return mNotifyTimeStamp; - } - - public long getCreateTimestamp() { - return mCreateTimestamp; - } - - public String toString(){ - return super.toString() + - " mNotifyTimeStamp=" + mNotifyTimeStamp; - } -}; - diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceBase.java b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceBase.java deleted file mode 100644 index 5f1dfe5a..00000000 --- a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceBase.java +++ /dev/null @@ -1,184 +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 java.lang.String; -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Context; -import android.os.RemoteException; -import android.content.Intent; -import com.android.internal.telephony.TelephonyIntents; -import android.content.ComponentName; - -import com.android.ims.internal.uce.common.StatusCode; -import com.android.ims.internal.uce.common.StatusCode; -import com.android.ims.internal.uce.presence.PresCmdStatus; -import com.android.ims.internal.uce.presence.PresResInfo; -import com.android.ims.internal.uce.presence.PresSipResponse; - -import com.android.ims.RcsManager.ResultCode; -import com.android.ims.RcsPresence.PublishState; -import com.android.ims.RcsPresenceInfo; - -import com.android.ims.internal.Logger; -import com.android.service.ims.Task; -import com.android.service.ims.RcsUtils; -import com.android.service.ims.TaskManager; - -public abstract class PresenceBase{ - /* - * The logger - */ - static private Logger logger = Logger.getLogger("PresenceBase"); - - protected Context mContext = null; - - public PresenceBase() { - } - - protected void handleCallback(Task task, int resultCode, boolean forCmdStatus){ - if(task == null){ - logger.debug("task == null"); - return; - } - - if(task.mListener != null){ - try{ - if(resultCode >= ResultCode.SUCCESS){ - if(!forCmdStatus){ - task.mListener.onSuccess(task.mTaskId); - } - }else{ - task.mListener.onError(task.mTaskId, resultCode); - } - }catch(RemoteException e){ - logger.debug("Failed to send the status to client."); - } - } - - // remove task when error - // remove task when SIP response success. - // For list capability polling we will waiting for the terminated notify or timeout. - if(resultCode != ResultCode.SUCCESS){ - if(task instanceof PresencePublishTask){ - PresencePublishTask publishTask = (PresencePublishTask) task; - logger.debug("handleCallback for publishTask=" + publishTask); - if(resultCode == PublishState.PUBLISH_STATE_VOLTE_PROVISION_ERROR) { - // retry 3 times for "403 Not Authorized for Presence". - if(publishTask.getRetryCount() >= 3) { - //remove capability after try 3 times by PresencePolling - logger.debug("handleCallback remove task=" + task); - TaskManager.getDefault().removeTask(task.mTaskId); - } else { - // Continue retry - publishTask.setRetryCount(publishTask.getRetryCount() + 1); - } - } else { - logger.debug("handleCallback remove task=" + task); - TaskManager.getDefault().removeTask(task.mTaskId); - } - } else { - logger.debug("handleCallback remove task=" + task); - TaskManager.getDefault().removeTask(task.mTaskId); - } - }else{ - if(forCmdStatus || !forCmdStatus && (task instanceof PresenceCapabilityTask)){ - logger.debug("handleCallback remove task later"); - - //waiting for Notify from network - if(!forCmdStatus){ - ((PresenceCapabilityTask)task).setWaitingForNotify(true); - } - }else{ - if(!forCmdStatus && (task instanceof PresenceAvailabilityTask) && - (resultCode == ResultCode.SUCCESS)){ - // Availiablity, cache for 60s, remove it later. - logger.debug("handleCallback PresenceAvailabilityTask cache for 60s task=" - + task); - return; - } - - logger.debug("handleCallback remove task=" + task); - TaskManager.getDefault().removeTask(task.mTaskId); - } - } - } - - public void handleCmdStatus(PresCmdStatus pCmdStatus){ - if(pCmdStatus == null){ - logger.error("handleCallbackForCmdStatus pCmdStatus=null"); - return; - } - - Task task = TaskManager.getDefault().getTask(pCmdStatus.getUserData()); - int resultCode = RcsUtils.statusCodeToResultCode(pCmdStatus.getStatus().getStatusCode()); - if(task != null){ - task.mSipRequestId = pCmdStatus.getRequestId(); - task.mCmdStatus = resultCode; - TaskManager.getDefault().putTask(task.mTaskId, task); - } - - handleCallback(task, resultCode, true); - } - - protected void notifyDm() { - logger.debug("notifyDm"); - Intent intent = new Intent( - TelephonyIntents.ACTION_FORBIDDEN_NO_SERVICE_AUTHORIZATION); - intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); - - mContext.sendBroadcast(intent); - } - - protected boolean isInConfigList(int errorNo, String phrase, int configId) { - String inErrorString = ("" + errorNo).trim(); - - String[] errorArray = mContext.getResources().getStringArray(configId); - logger.debug("errorArray length=" + errorArray.length + " errorArray=" + errorArray); - for (String errorStr : errorArray) { - if (errorStr != null && errorStr.startsWith(inErrorString)) { - String errorPhrase = errorStr.substring(inErrorString.length()); - if(errorPhrase == null || errorPhrase.isEmpty()) { - return true; - } - - if(phrase == null || phrase.isEmpty()) { - return false; - } - - return phrase.toLowerCase().contains(errorPhrase.toLowerCase()); - } - } - return false; - } - - abstract public void handleSipResponse(PresSipResponse pSipResponse); -} - diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceCapabilityTask.java b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceCapabilityTask.java deleted file mode 100644 index 8dbc120c..00000000 --- a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceCapabilityTask.java +++ /dev/null @@ -1,183 +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 java.util.Set; -import java.util.HashMap; -import java.util.List; -import java.util.ArrayList; -import android.content.Context; -import android.content.Intent; -import android.app.PendingIntent; -import android.content.IntentFilter; -import android.os.RemoteException; -import android.app.AlarmManager; -import android.os.SystemClock; - -import com.android.ims.internal.uce.presence.PresCmdStatus; - -import com.android.ims.RcsManager.ResultCode; -import com.android.ims.RcsPresenceInfo; -import com.android.ims.IRcsPresenceListener; - -import com.android.ims.internal.Logger; -import com.android.service.ims.TaskManager; - -/** - * PresenceCapabilityTask - */ -public class PresenceCapabilityTask extends PresenceTask{ - /* - * The logger - */ - private Logger logger = Logger.getLogger(this.getClass().getName()); - - public static final String ACTION_TASK_TIMEOUT_ALARM = - "com.android.service.ims.presence.task.timeout"; - - private Context mContext = null; - - // The result code will be used for retry. - public int mResultCode; - - // The alarm manager. - static AlarmManager sAlarmManager = null; - PendingIntent mAlarmIntent = null; - boolean mTimerStarted = false; - - // it will be set to true after got sip response. - public boolean mWaitingForNotify; - - // The time when created the task. - private long mCreatedTimeStamp; - - private long mTimeout; - - public PresenceCapabilityTask(Context context, int taskId, int cmdId, - IRcsPresenceListener listener, String[] contacts, - long timeout){ - super(taskId, cmdId, listener, contacts); - mContext = context; - mWaitingForNotify = false; - - mCreatedTimeStamp = System.currentTimeMillis(); - mTimeout = timeout; - - if(mTimeout <=0){ - // The terminal notification may be received shortly after the time limit of - // the subscription due to network delays or retransmissions. - // Device shall wait for 3sec after the end of the subscription period in order to - // accept such notifications without returning spurious errors (e.g. SIP 481). - mTimeout = 36000; - } - - if(listener != null){ - startTimer(); - } //else it will be removed after got sip response. - } - - public String toString(){ - return super.toString() + - " mCreatedTimeStamp=" + mCreatedTimeStamp + - " mTimeout=" + mTimeout; - } - - private void startTimer(){ - if(mContext == null){ - logger.error("startTimer mContext is null"); - return; - } - - Intent intent = new Intent(ACTION_TASK_TIMEOUT_ALARM); - intent.setClass(mContext, AlarmBroadcastReceiver.class); - intent.putExtra("taskId", mTaskId); - PendingIntent mAlarmIntent = PendingIntent.getBroadcast(mContext, 0, intent, - PendingIntent.FLAG_ONE_SHOT); - - if(sAlarmManager == null){ - sAlarmManager = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE); - } - - long triggerAt = SystemClock.elapsedRealtime() + mTimeout; - logger.debug("startTimer taskId=" + mTaskId + " mTimeout=" + mTimeout + - " triggerAt=" + triggerAt + " mAlarmIntent=" + mAlarmIntent); - sAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAt, mAlarmIntent); - mTimerStarted = true; - } - - public void cancelTimer(){ - if(mTimerStarted){ - logger.debug("cancelTimer, taskId=" + mTaskId); - if(mAlarmIntent != null && sAlarmManager != null) { - sAlarmManager.cancel(mAlarmIntent); - } - mTimerStarted = false; - } - } - - public void onTimeout(){ - logger.debug("onTimeout, taskId=" + mTaskId); - try{ - if(mListener != null){ - mListener.onTimeout(mTaskId); - } - }catch (RemoteException e){ - logger.error("RemoteException", e); - } - - TaskManager.getDefault().removeTask(mTaskId); - } - - public void setWaitingForNotify(boolean waitingForNotify){ - mWaitingForNotify = waitingForNotify; - } - - public boolean isWaitingForNotify(){ - return mWaitingForNotify; - } - - public void onTerminated(String reason){ - if(!mWaitingForNotify){ - logger.debug("onTerminated mWaitingForNotify is false. task=" + this); - return; - } - - cancelTimer(); - try{ - if(mListener != null){ - mListener.onFinish(mTaskId); - } - }catch (RemoteException e){ - logger.error("RemoteException", e); - } - - TaskManager.getDefault().removeTask(mTaskId); - } -}; - diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceInfoParser.java b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceInfoParser.java deleted file mode 100644 index 0e8f2d3e..00000000 --- a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceInfoParser.java +++ /dev/null @@ -1,277 +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 java.lang.String; -import java.util.ArrayList; -import java.util.List; -import android.text.TextUtils; - -import com.android.ims.internal.uce.presence.PresTupleInfo; -import com.android.ims.internal.uce.presence.PresRlmiInfo; -import com.android.ims.internal.uce.presence.PresResInfo; -import com.android.ims.internal.uce.presence.PresResInstanceInfo; - -import com.android.ims.RcsManager.ResultCode; -import com.android.ims.RcsPresenceInfo; -import com.android.ims.RcsPresenceInfo.ServiceType; -import com.android.ims.RcsPresenceInfo.ServiceState; - -import com.android.ims.internal.Logger; - -public class PresenceInfoParser{ - /* - * The logger - */ - static private Logger logger = Logger.getLogger("PresenceInfoParser"); - - public PresenceInfoParser() { - } - - static public RcsPresenceInfo getPresenceInfoFromTuple(String pPresentityURI, - PresTupleInfo[] pTupleInfo){ - logger.debug("getPresenceInfoFromTuple: pPresentityURI=" + pPresentityURI + - " pTupleInfo=" + pTupleInfo); - - if(pPresentityURI == null){ - logger.error("pPresentityURI=" + pPresentityURI); - return null; - } - - String contactNumber = getPhoneFromUri(pPresentityURI); - // Now that we got notification if the content didn't indicate it is not Volte - // then it should be Volte enabled. So default to Volte enabled. - int volteStatus = RcsPresenceInfo.VolteStatus.VOLTE_ENABLED; - - int ipVoiceCallState = RcsPresenceInfo.ServiceState.UNKNOWN; - String ipVoiceCallServiceNumber = null; - // We use the timestamp which when we received it instead of the one in PDU - long ipVoiceCallTimestamp = System.currentTimeMillis(); - - int ipVideoCallState = RcsPresenceInfo.ServiceState.UNKNOWN; - String ipVideoCallServiceNumber = null; - long ipVideoCallTimestamp = System.currentTimeMillis(); - - if( pTupleInfo == null){ - logger.debug("pTupleInfo=null"); - return (new RcsPresenceInfo(contactNumber, volteStatus, - ipVoiceCallState, ipVoiceCallServiceNumber, ipVoiceCallTimestamp, - ipVideoCallState, ipVideoCallServiceNumber, ipVideoCallTimestamp)); - } - - for(int i = 0; i < pTupleInfo.length; i++){ - // Video call has high priority. If it supports video call it will support voice call. - String featureTag = pTupleInfo[i].getFeatureTag(); - logger.debug("getFeatureTag " + i + ": " + featureTag); - if(featureTag.equals( - "+g.3gpp.icsi-ref=\"urn%3Aurn-7%3A3gpp-service.ims.icsi.mmtel\";video") || - featureTag.equals("+g.gsma.rcs.telephony=\"cs,volte\";video")) { - logger.debug("Got Volte and VT enabled tuple"); - ipVoiceCallState = RcsPresenceInfo.ServiceState.ONLINE; - ipVideoCallState = RcsPresenceInfo.ServiceState.ONLINE; - - if(pTupleInfo[i].getContactUri() != null){ - ipVideoCallServiceNumber = getPhoneFromUri( - pTupleInfo[i].getContactUri().toString()); - } - } else if(featureTag.equals("+g.gsma.rcs.telephony=\"cs\";video")) { - logger.debug("Got Volte disabled but VT enabled tuple"); - ipVoiceCallState = RcsPresenceInfo.ServiceState.OFFLINE; - ipVideoCallState = RcsPresenceInfo.ServiceState.ONLINE; - - if(pTupleInfo[i].getContactUri() != null){ - ipVideoCallServiceNumber = getPhoneFromUri( - pTupleInfo[i].getContactUri().toString()); - } - }else{ - if(featureTag.equals( - "+g.3gpp.icsi-ref=\"urn%3Aurn-7%3A3gpp-service.ims.icsi.mmtel\"") || - featureTag.equals("+g.gsma.rcs.telephony=\"cs,volte\"")) { - - logger.debug("Got Volte only tuple"); - ipVoiceCallState = RcsPresenceInfo.ServiceState.ONLINE; - // "OR" for multiple tuples. - if(RcsPresenceInfo.ServiceState.UNKNOWN == ipVideoCallState) { - ipVideoCallState = RcsPresenceInfo.ServiceState.OFFLINE; - } - - if(pTupleInfo[i].getContactUri() != null){ - ipVoiceCallServiceNumber = getPhoneFromUri( - pTupleInfo[i].getContactUri().toString()); - } - }else{ - logger.debug("Ignoring feature tag: " + pTupleInfo[i].getFeatureTag()); - } - } - } - - RcsPresenceInfo retPresenceInfo = new RcsPresenceInfo(contactNumber,volteStatus, - ipVoiceCallState, ipVoiceCallServiceNumber, ipVoiceCallTimestamp, - ipVideoCallState, ipVideoCallServiceNumber, ipVideoCallTimestamp); - - logger.debug("getPresenceInfoFromTuple: " + retPresenceInfo); - - return retPresenceInfo; - } - - static private void addPresenceInfo(ArrayList<RcsPresenceInfo> presenceInfoList, - RcsPresenceInfo presenceInfo){ - logger.debug("addPresenceInfo presenceInfoList=" + presenceInfoList + - " presenceInfo=" + presenceInfo); - - if(presenceInfoList == null || presenceInfo == null){ - logger.debug("addPresenceInfo presenceInfoList=" + presenceInfoList + - " presenceInfo=" + presenceInfo); - return; - } - - for(int i=0; i< presenceInfoList.size(); i++){ - RcsPresenceInfo presenceInfoTmp = presenceInfoList.get(i); - if((presenceInfoTmp != null) && (presenceInfoTmp.getContactNumber() != null) && - presenceInfoTmp.getContactNumber().equalsIgnoreCase( - presenceInfo.getContactNumber())){ - // merge the information - presenceInfoList.set(i, new RcsPresenceInfo(presenceInfoTmp.getContactNumber(), - presenceInfoTmp.getVolteStatus(), - ((ServiceState.ONLINE == presenceInfo.getServiceState( - ServiceType.VOLTE_CALL)) || - (ServiceState.ONLINE == presenceInfoTmp.getServiceState( - ServiceType.VOLTE_CALL)))?ServiceState.ONLINE: - presenceInfoTmp.getServiceState(ServiceType.VOLTE_CALL), - presenceInfoTmp.getServiceContact(ServiceType.VOLTE_CALL), - presenceInfoTmp.getTimeStamp(ServiceType.VOLTE_CALL), - ((ServiceState.ONLINE == presenceInfo.getServiceState( - ServiceType.VT_CALL)) || - (ServiceState.ONLINE == presenceInfoTmp.getServiceState( - ServiceType.VT_CALL)))?ServiceState.ONLINE: - presenceInfoTmp.getServiceState(ServiceType.VT_CALL), - presenceInfoTmp.getServiceContact(ServiceType.VOLTE_CALL), - presenceInfoTmp.getTimeStamp(ServiceType.VOLTE_CALL))); - return; - } - } - - // didn't merge, so add the new one. - presenceInfoList.add(presenceInfo); - } - - static public RcsPresenceInfo[] getPresenceInfosFromPresenceRes( - PresRlmiInfo pRlmiInfo, PresResInfo[] pRcsPresenceInfo) { - if(pRcsPresenceInfo == null){ - logger.debug("getPresenceInfosFromPresenceRes pRcsPresenceInfo=null"); - return null; - } - - ArrayList<RcsPresenceInfo> presenceInfoList = new ArrayList<RcsPresenceInfo>(); - for(int i=0; i < pRcsPresenceInfo.length; i++ ) { - if(pRcsPresenceInfo[i].getInstanceInfo() == null){ - logger.error("invalid data getInstanceInfo = null"); - continue; - } - - String resUri = pRcsPresenceInfo[i].getResUri(); - if(resUri == null){ - logger.error("invalid data getResUri = null"); - continue; - } - - String contactNumber = getPhoneFromUri(resUri); - if(contactNumber == null){ - logger.error("invalid data contactNumber=null"); - continue; - } - - if(pRcsPresenceInfo[i].getInstanceInfo().getResInstanceState() == - PresResInstanceInfo.UCE_PRES_RES_INSTANCE_STATE_TERMINATED){ - logger.debug("instatance state is terminated"); - String reason = pRcsPresenceInfo[i].getInstanceInfo().getReason(); - if(reason != null){ - reason = reason.toLowerCase(); - // Noresource: 404. Device shall consider the resource as non-EAB capable - // Rejected: 403. Device shall consider the resource as non-EAB capable - // Deactivated: 408, 481, 603, other 4xx, 5xx 6xx. Ignore. - // Give Up: 480. Ignore. - // Probation: 503. Ignore. - if(reason.equals("rejected") || reason.equals("noresource")){ - RcsPresenceInfo presenceInfo = new RcsPresenceInfo(contactNumber, - RcsPresenceInfo.VolteStatus.VOLTE_DISABLED, - RcsPresenceInfo.ServiceState.OFFLINE, null, - System.currentTimeMillis(), - RcsPresenceInfo.ServiceState.OFFLINE, null, - System.currentTimeMillis()); - addPresenceInfo(presenceInfoList, presenceInfo); - logger.debug("reason=" + reason + " presenceInfo=" + presenceInfo); - continue; - } - } - } - - RcsPresenceInfo presenceInfo = getPresenceInfoFromTuple(resUri, - pRcsPresenceInfo[i].getInstanceInfo().getTupleInfo()); - if(presenceInfo != null){ - addPresenceInfo(presenceInfoList, presenceInfo); - }else{ - logger.debug("presenceInfo["+ i + "] = null"); - addPresenceInfo(presenceInfoList, getPresenceInfoFromTuple(resUri, null)); - } - } - - logger.debug("getPresenceInfoFromPresenceRes, presenceInfos:" + presenceInfoList); - if(presenceInfoList.size() == 0){ - return null; - } - - RcsPresenceInfo[] theArray = new RcsPresenceInfo[presenceInfoList.size()]; - return (RcsPresenceInfo[])presenceInfoList.toArray(theArray); - } - - static public String getPhoneFromUri(String uriValue) { - if(uriValue == null){ - return null; - } - - int startIndex = uriValue.indexOf(":", 0); - int endIndex = uriValue.indexOf("@", startIndex); - - logger.debug("getPhoneFromUri uriValue=" + uriValue + - " startIndex=" + startIndex + " endIndex=" + endIndex); - - String number = uriValue; - if(endIndex != -1){ - number = uriValue.substring(0, endIndex); - } - - if (startIndex != -1) { - return number = number.substring(startIndex + 1); - } - - logger.debug("number=" + number); - return number; - } -} diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublication.java b/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublication.java deleted file mode 100644 index 05dcd7a2..00000000 --- a/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublication.java +++ /dev/null @@ -1,1227 +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 java.util.List; -import java.util.Arrays; - -import android.content.Context; -import android.content.Intent; -import com.android.internal.telephony.Phone; -import android.provider.Settings; -import android.os.SystemProperties; -import android.content.BroadcastReceiver; -import android.content.ComponentName; -import android.telephony.TelephonyManager; -import com.android.internal.telephony.IccCardConstants; -import com.android.internal.telephony.TelephonyIntents; -import android.telecom.TelecomManager; -import android.content.IntentFilter; -import android.app.PendingIntent; -import android.app.AlarmManager; -import android.os.SystemClock; -import android.os.Message; -import android.os.Handler; - - -import com.android.ims.ImsManager; -import com.android.ims.ImsConnectionStateListener; -import com.android.ims.ImsServiceClass; -import com.android.ims.ImsException; -import android.telephony.SubscriptionManager; -import com.android.ims.ImsConfig; -import com.android.ims.ImsConfig.FeatureConstants; -import com.android.ims.ImsConfig.FeatureValueConstants; - -import com.android.service.ims.RcsSettingUtils; -import com.android.ims.RcsPresenceInfo; -import com.android.ims.IRcsPresenceListener; -import com.android.ims.RcsManager.ResultCode; -import com.android.ims.RcsPresence.PublishState; - -import com.android.ims.internal.Logger; -import com.android.service.ims.TaskManager; -import com.android.service.ims.Task; - -import com.android.ims.internal.uce.presence.PresPublishTriggerType; -import com.android.ims.internal.uce.presence.PresSipResponse; -import com.android.ims.internal.uce.common.StatusCode; -import com.android.ims.internal.uce.presence.PresCmdStatus; - -import com.android.service.ims.RcsStackAdaptor; - -import com.android.service.ims.R; - -public class PresencePublication extends PresenceBase { - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private final Object mSyncObj = new Object(); - - final static String ACTION_IMS_FEATURE_AVAILABLE = - "com.android.service.ims.presence.ims-feature-status-changed"; - private static final int INVALID_SERVICE_ID = -1; - - boolean mMovedToIWLAN = false; - boolean mMovedToLTE = false; - boolean mVoPSEnabled = false; - - boolean mIsVolteAvailable = false; - boolean mIsVtAvailable = false; - boolean mIsVoWifiAvailable = false; - boolean mIsViWifiAvailable = false; - - // Queue for the pending PUBLISH request. Just need cache the last one. - volatile PublishRequest mPendingRequest = null; - volatile PublishRequest mPublishingRequest = null; - volatile PublishRequest mPublishedRequest = null; - - /* - * Message to notify for a publish - */ - public static final int MESSAGE_RCS_PUBLISH_REQUEST = 1; - - /** - * Publisher Error base - */ - public static final int PUBLISH_ERROR_CODE_START = ResultCode.SUBSCRIBER_ERROR_CODE_END; - - /** - * All publish errors not covered by specific errors - */ - public static final int PUBLISH_GENIRIC_FAILURE = PUBLISH_ERROR_CODE_START - 1; - - /** - * Responding for 403 - not authorized - */ - public static final int PUBLISH_NOT_AUTHORIZED_FOR_PRESENCE = PUBLISH_ERROR_CODE_START - 2; - - /** - * Responding for 404 error code. The subscriber is not provisioned. - * The Client should not send any EAB traffic after get this error. - */ - public static final int PUBLISH_NOT_PROVISIONED = PUBLISH_ERROR_CODE_START - 3; - - /** - * Responding for 200 - OK - */ - public static final int PUBLISH_SUCESS = ResultCode.SUCCESS; - - private RcsStackAdaptor mRcsStackAdaptor = null; - private PresenceSubscriber mSubscriber = null; - static private PresencePublication sPresencePublication = null; - private BroadcastReceiver mReceiver = null; - - private boolean mHasCachedTrigger = false; - private boolean mGotTriggerFromStack = false; - private boolean mDonotRetryUntilPowerCycle = false; - private boolean mSimLoaded = false; - private int mPreferredTtyMode = Phone.TTY_MODE_OFF; - - private boolean mImsRegistered = false; - private boolean mVtEnabled = false; - private boolean mDataEnabled = false; - - public class PublishType{ - public static final int PRES_PUBLISH_TRIGGER_DATA_CHANGED = 0; - // the lower layer should send trigger when enable volte - // the lower layer should unpublish when disable volte - // so only handle VT here. - public static final int PRES_PUBLISH_TRIGGER_VTCALL_CHANGED = 1; - public static final int PRES_PUBLISH_TRIGGER_CACHED_TRIGGER = 2; - public static final int PRES_PUBLISH_TRIGGER_TTY_ENABLE_STATUS = 3; - public static final int PRES_PUBLISH_TRIGGER_RETRY = 4; - public static final int PRES_PUBLISH_TRIGGER_FEATURE_AVAILABILITY_CHANGED = 5; - }; - - /** - * @param rcsStackAdaptor - * @param context - */ - public PresencePublication(RcsStackAdaptor rcsStackAdaptor, Context context) { - super(); - logger.debug("PresencePublication constrcuct"); - this.mRcsStackAdaptor = rcsStackAdaptor; - this.mContext = context; - - mVtEnabled = ImsManager.isVtEnabledByUser(mContext); - mDataEnabled = Settings.Global.getInt(mContext.getContentResolver(), - Settings.Global.MOBILE_DATA, 1) == 1; - mPreferredTtyMode = Settings.Secure.getInt( - mContext.getContentResolver(), - Settings.Secure.PREFERRED_TTY_MODE, - Phone.TTY_MODE_OFF); - logger.debug("The current TTY mode is: " + mPreferredTtyMode); - - if(mRcsStackAdaptor != null){ - mRcsStackAdaptor.setPublishState( - SystemProperties.getInt("rcs.publish.status", - PublishState.PUBLISH_STATE_NOT_PUBLISHED)); - } - - mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - logger.print("onReceive intent=" + intent); - if(TelephonyIntents.ACTION_SIM_STATE_CHANGED.equalsIgnoreCase(intent.getAction())){ - String stateExtra = intent.getStringExtra( - IccCardConstants.INTENT_KEY_ICC_STATE); - logger.print("ACTION_SIM_STATE_CHANGED INTENT_KEY_ICC_STATE=" + stateExtra); - final TelephonyManager teleMgr = (TelephonyManager) context.getSystemService( - Context.TELEPHONY_SERVICE); - if(IccCardConstants.INTENT_VALUE_ICC_LOADED.equalsIgnoreCase(stateExtra)) { - new Thread(new Runnable() { - @Override - public void run() { - if(teleMgr == null){ - logger.error("teleMgr = null"); - return; - } - - int count = 0; - // retry 2 minutes to get the information from ISIM and RUIM - for(int i=0; i<60; i++) { - String[] myImpu = teleMgr.getIsimImpu(); - String myDomain = teleMgr.getIsimDomain(); - String line1Number = teleMgr.getLine1Number(); - logger.debug("myImpu=" + myImpu + " myDomain=" + myDomain + - " line1Number=" + line1Number); - if(line1Number != null && line1Number.length() != 0 || - myImpu != null && myImpu.length != 0 && - myDomain != null && myDomain.length() != 0){ - mSimLoaded = true; - // treate hot SIM hot swap as power on. - mDonotRetryUntilPowerCycle = false; - if(mHasCachedTrigger) { - invokePublish(PresencePublication.PublishType. - PRES_PUBLISH_TRIGGER_CACHED_TRIGGER); - } - break; - }else{ - try{ - Thread.sleep(2000);//retry 2 seconds later - }catch(InterruptedException e){ - } - } - } - } - }, "wait for ISIM and RUIM").start(); - }else if (IccCardConstants.INTENT_VALUE_ICC_ABSENT. - equalsIgnoreCase(stateExtra)) { - // pulled out the SIM, set it as the same as power on status: - logger.print("Pulled out SIM, set to PUBLISH_STATE_NOT_PUBLISHED"); - - // only reset when the SIM gets absent. - reset(); - mSimLoaded = false; - setPublishState( - PublishState.PUBLISH_STATE_NOT_PUBLISHED); - } - }else if(Intent.ACTION_AIRPLANE_MODE_CHANGED.equalsIgnoreCase(intent.getAction())){ - boolean airplaneMode = intent.getBooleanExtra("state", false); - if(airplaneMode){ - logger.print("Airplane mode, set to PUBLISH_STATE_NOT_PUBLISHED"); - reset(); - setPublishState( - PublishState.PUBLISH_STATE_NOT_PUBLISHED); - } - }else if(TelecomManager.ACTION_TTY_PREFERRED_MODE_CHANGED.equalsIgnoreCase( - intent.getAction())){ - int newPreferredTtyMode = intent.getIntExtra( - TelecomManager.EXTRA_TTY_PREFERRED_MODE, - TelecomManager.TTY_MODE_OFF); - newPreferredTtyMode = telecomTtyModeToPhoneMode(newPreferredTtyMode); - logger.debug("Tty mode changed from " + mPreferredTtyMode - + " to " + newPreferredTtyMode); - - boolean mIsTtyEnabled = isTtyEnabled(mPreferredTtyMode); - boolean isTtyEnabled = isTtyEnabled(newPreferredTtyMode); - mPreferredTtyMode = newPreferredTtyMode; - if (mIsTtyEnabled != isTtyEnabled) { - logger.print("ttyEnabled status changed from " + mIsTtyEnabled - + " to " + isTtyEnabled); - invokePublish(PresencePublication.PublishType. - PRES_PUBLISH_TRIGGER_TTY_ENABLE_STATUS); - } - } else if(ImsConfig.ACTION_IMS_FEATURE_CHANGED.equalsIgnoreCase( - intent.getAction())){ - handleProvisionChanged(); - } - } - }; - - IntentFilter statusFilter = new IntentFilter(); - statusFilter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED); - statusFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); - statusFilter.addAction(TelecomManager.ACTION_TTY_PREFERRED_MODE_CHANGED); - statusFilter.addAction(ImsConfig.ACTION_IMS_FEATURE_CHANGED); - mContext.registerReceiver(mReceiver, statusFilter); - - sPresencePublication = this; - } - - private boolean isIPVoiceSupported(boolean volteAvailable, boolean vtAvailable, - boolean voWifiAvailable, boolean viWifiAvailable) { - // volte and vowifi can be enabled separately - if(!ImsManager.isVolteEnabledByPlatform(mContext) && - !ImsManager.isWfcEnabledByPlatform(mContext)) { - logger.print("Disabled by platform, voiceSupported=false"); - return false; - } - - if(!ImsManager.isVolteProvisionedOnDevice(mContext) && - !RcsSettingUtils.isVowifiProvisioned(mContext)) { - logger.print("Wasn't provisioned, voiceSupported=false"); - return false; - } - - if(!ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mContext) && - !ImsManager.isWfcEnabledByUser(mContext)){ - logger.print("User didn't enable volte or wfc, voiceSupported=false"); - return false; - } - - // for IWLAN. All WFC settings and provision should be fine if voWifiAvailable is true. - if(isOnIWLAN()) { - boolean voiceSupported=volteAvailable || voWifiAvailable; - logger.print("on IWLAN, voiceSupported=" + voiceSupported); - return voiceSupported; - } - - // for none-IWLAN - if(!isOnLTE()) { - logger.print("isOnLTE=false, voiceSupported=false"); - return false; - } - - if(!mVoPSEnabled) { - logger.print("mVoPSEnabled=false, voiceSupported=false"); - return false; - } - - logger.print("voiceSupported=true"); - return true; - } - - private boolean isIPVideoSupported(boolean volteAvailable, boolean vtAvailable, - boolean voWifiAvailable, boolean viWifiAvailable) { - // if volte or vt was disabled then the viwifi will be disabled as well. - if(!ImsManager.isVolteEnabledByPlatform(mContext) || - !ImsManager.isVtEnabledByPlatform(mContext)) { - logger.print("Disabled by platform, videoSupported=false"); - return false; - } - - if(!ImsManager.isVolteProvisionedOnDevice(mContext) || - !RcsSettingUtils.isLvcProvisioned(mContext)) { - logger.print("Not provisioned. videoSupported=false"); - return false; - } - - if(!ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mContext) || - !mVtEnabled){ - logger.print("User disabled volte or vt, videoSupported=false"); - return false; - } - - if(isTtyOn()){ - logger.print("isTtyOn=true, videoSupported=false"); - return false; - } - - // for IWLAN, all WFC settings and provision should be fine if viWifiAvailable is true. - if(isOnIWLAN()) { - boolean videoSupported = vtAvailable || viWifiAvailable; - logger.print("on IWLAN, videoSupported=" + videoSupported); - return videoSupported; - } - - if(!isDataEnabled()) { - logger.print("isDataEnabled()=false, videoSupported=false"); - return false; - } - - if(!isOnLTE()) { - logger.print("isOnLTE=false, videoSupported=false"); - return false; - } - - if(!mVoPSEnabled) { - logger.print("mVoPSEnabled=false, videoSupported=false"); - return false; - } - - return true; - } - - public boolean isTtyOn() { - logger.debug("isTtyOn settingsTtyMode=" + mPreferredTtyMode); - return isTtyEnabled(mPreferredTtyMode); - } - - public void onImsConnected() { - mImsRegistered = true; - } - - public void onImsDisconnected() { - logger.debug("reset PUBLISH status for IMS had been disconnected"); - mImsRegistered = false; - reset(); - } - - private void reset() { - mIsVolteAvailable = false; - mIsVtAvailable = false; - mIsVoWifiAvailable = false; - mIsViWifiAvailable = false; - - synchronized(mSyncObj) { - mPendingRequest = null; //ignore the previous request - mPublishingRequest = null; - mPublishedRequest = null; - } - } - - public void handleImsServiceUp() { - reset(); - } - - public void handleImsServiceDown() { - } - - private void handleProvisionChanged() { - if(RcsSettingUtils.isEabProvisioned(mContext)) { - logger.debug("provisioned, set mDonotRetryUntilPowerCycle to false"); - mDonotRetryUntilPowerCycle = false; - if(mHasCachedTrigger) { - invokePublish(PresencePublication.PublishType.PRES_PUBLISH_TRIGGER_CACHED_TRIGGER); - } - } - } - - static public PresencePublication getPresencePublication() { - return sPresencePublication; - } - - public void setSubscriber(PresenceSubscriber subscriber) { - mSubscriber = subscriber; - } - - public boolean isDataEnabled() { - return Settings.Global.getInt(mContext.getContentResolver(), - Settings.Global.MOBILE_DATA, 1) == 1; - } - - public void onMobileDataChanged(boolean value){ - logger.print("onMobileDataChanged, mDataEnabled=" + mDataEnabled + " value=" + value); - if(mDataEnabled != value) { - mDataEnabled = value; - RcsSettingUtils.setMobileDataEnabled(mContext, mDataEnabled); - - invokePublish( - PresencePublication.PublishType.PRES_PUBLISH_TRIGGER_DATA_CHANGED); - } - } - - public void onVtEnabled(boolean enabled) { - logger.debug("onVtEnabled mVtEnabled=" + mVtEnabled + " enabled=" + enabled); - - if(mVtEnabled != enabled) { - mVtEnabled = enabled; - invokePublish(PresencePublication.PublishType. - PRES_PUBLISH_TRIGGER_VTCALL_CHANGED); - } - } - - /** - * @return return true if it had been PUBLISHED. - */ - public boolean isPublishedOrPublishing() { - long publishThreshold = RcsSettingUtils.getPublishThrottle(mContext); - - boolean publishing = false; - publishing = (mPublishingRequest != null) && - (System.currentTimeMillis() - mPublishingRequest.getTimestamp() - <= publishThreshold); - - return (getPublishState() == PublishState.PUBLISH_STATE_200_OK || publishing); - } - - /** - * @return the Publish State - */ - public int getPublishState() { - if(mRcsStackAdaptor == null){ - return PublishState.PUBLISH_STATE_NOT_PUBLISHED; - } - - return mRcsStackAdaptor.getPublishState(); - } - - /** - * @param mPublishState the publishState to set - */ - public void setPublishState(int publishState) { - if(mRcsStackAdaptor != null){ - mRcsStackAdaptor.setPublishState(publishState); - } - } - - public boolean getHasCachedTrigger(){ - return mHasCachedTrigger; - } - - // Tiggered by framework. - public int invokePublish(int trigger){ - int ret; - - // if the value is true then it will call stack to send the PUBLISH - // though the previous publish had the same capability - // for example: for retry PUBLISH. - boolean bForceToNetwork = true; - switch(trigger) - { - case PublishType.PRES_PUBLISH_TRIGGER_DATA_CHANGED: - { - logger.print("PRES_PUBLISH_TRIGGER_DATA_CHANGED"); - bForceToNetwork = false; - break; - } - case PublishType.PRES_PUBLISH_TRIGGER_VTCALL_CHANGED: - { - logger.print("PRES_PUBLISH_TRIGGER_VTCALL_CHANGED"); - // Didn't get featureCapabilityChanged sometimes. - bForceToNetwork = true; - break; - } - case PublishType.PRES_PUBLISH_TRIGGER_CACHED_TRIGGER: - { - logger.print("PRES_PUBLISH_TRIGGER_CACHED_TRIGGER"); - break; - } - case PublishType.PRES_PUBLISH_TRIGGER_TTY_ENABLE_STATUS: - { - logger.print("PRES_PUBLISH_TRIGGER_TTY_ENABLE_STATUS"); - bForceToNetwork = true; - - break; - } - case PublishType.PRES_PUBLISH_TRIGGER_FEATURE_AVAILABILITY_CHANGED: - { - bForceToNetwork = false; - logger.print("PRES_PUBLISH_TRIGGER_FEATURE_AVAILABILITY_CHANGED"); - break; - } - case PublishType.PRES_PUBLISH_TRIGGER_RETRY: - { - logger.print("PRES_PUBLISH_TRIGGER_RETRY"); - break; - } - default: - { - logger.print("Unknown publish trigger from AP"); - } - } - - if(mGotTriggerFromStack == false){ - // Waiting for RCS stack get ready. - logger.print("Didn't get trigger from stack yet, discard framework trigger."); - return ResultCode.ERROR_SERVICE_NOT_AVAILABLE; - } - - if (mDonotRetryUntilPowerCycle) { - logger.print("Don't publish until next power cycle"); - return ResultCode.SUCCESS; - } - - if(!mSimLoaded){ - //need to read some information from SIM to publish - logger.print("invokePublish cache the trigger since the SIM is not ready"); - mHasCachedTrigger = true; - return ResultCode.ERROR_SERVICE_NOT_AVAILABLE; - } - - //the provision status didn't be read from modem yet - if(!RcsSettingUtils.isEabProvisioned(mContext)) { - logger.print("invokePublish cache the trigger, not provision yet"); - mHasCachedTrigger = true; - return ResultCode.ERROR_SERVICE_NOT_AVAILABLE; - } - - PublishRequest publishRequest = new PublishRequest( - bForceToNetwork, System.currentTimeMillis()); - - requestPublication(publishRequest); - - return ResultCode.SUCCESS; - } - - public int invokePublish(PresPublishTriggerType val) { - int ret; - - mGotTriggerFromStack = true; - - // Always send the PUBLISH when we got the trigger from stack. - // This can avoid any issue when switch the phone between IWLAN and LTE. - boolean bForceToNetwork = true; - switch (val.getPublishTrigeerType()) - { - case PresPublishTriggerType.UCE_PRES_PUBLISH_TRIGGER_ETAG_EXPIRED: - { - logger.print("PUBLISH_TRIGGER_ETAG_EXPIRED"); - break; - } - case PresPublishTriggerType.UCE_PRES_PUBLISH_TRIGGER_MOVE_TO_LTE_VOPS_DISABLED: - { - logger.print("PUBLISH_TRIGGER_MOVE_TO_LTE_VOPS_DISABLED"); - mMovedToLTE = true; - mVoPSEnabled = false; - mMovedToIWLAN = false; - - // onImsConnected could came later than this trigger. - mImsRegistered = true; - break; - } - case PresPublishTriggerType.UCE_PRES_PUBLISH_TRIGGER_MOVE_TO_LTE_VOPS_ENABLED: - { - logger.print("PUBLISH_TRIGGER_MOVE_TO_LTE_VOPS_ENABLED"); - mMovedToLTE = true; - mVoPSEnabled = true; - mMovedToIWLAN = false; - - // onImsConnected could came later than this trigger. - mImsRegistered = true; - break; - } - case PresPublishTriggerType.UCE_PRES_PUBLISH_TRIGGER_MOVE_TO_IWLAN: - { - logger.print("QRCS_PRES_PUBLISH_TRIGGER_MOVE_TO_IWLAN"); - mMovedToLTE = false; - mVoPSEnabled = false; - mMovedToIWLAN = true; - - // onImsConnected could came later than this trigger. - mImsRegistered = true; - break; - } - case PresPublishTriggerType.UCE_PRES_PUBLISH_TRIGGER_MOVE_TO_EHRPD: - { - logger.print("PUBLISH_TRIGGER_MOVE_TO_EHRPD"); - mMovedToLTE = false; - mVoPSEnabled = false; - mMovedToIWLAN = false; - - // onImsConnected could came later than this trigger. - mImsRegistered = true; - break; - } - case PresPublishTriggerType.UCE_PRES_PUBLISH_TRIGGER_MOVE_TO_HSPAPLUS: - { - logger.print("PUBLISH_TRIGGER_MOVE_TO_HSPAPLUS"); - mMovedToLTE = false; - mVoPSEnabled = false; - mMovedToIWLAN = false; - break; - } - case PresPublishTriggerType.UCE_PRES_PUBLISH_TRIGGER_MOVE_TO_2G: - { - logger.print("PUBLISH_TRIGGER_MOVE_TO_2G"); - mMovedToLTE = false; - mVoPSEnabled = false; - mMovedToIWLAN = false; - break; - } - case PresPublishTriggerType.UCE_PRES_PUBLISH_TRIGGER_MOVE_TO_3G: - { - logger.print("PUBLISH_TRIGGER_MOVE_TO_3G"); - mMovedToLTE = false; - mVoPSEnabled = false; - mMovedToIWLAN = false; - break; - } - default: - logger.print("Unknow Publish Trigger Type"); - } - - if (mDonotRetryUntilPowerCycle) { - logger.print("Don't publish until next power cycle"); - return ResultCode.SUCCESS; - } - - if(!mSimLoaded){ - //need to read some information from SIM to publish - logger.print("invokePublish cache the trigger since the SIM is not ready"); - mHasCachedTrigger = true; - return ResultCode.ERROR_SERVICE_NOT_AVAILABLE; - } - - //the provision status didn't be read from modem yet - if(!RcsSettingUtils.isEabProvisioned(mContext)) { - logger.print("invokePublish cache the trigger, not provision yet"); - mHasCachedTrigger = true; - return ResultCode.ERROR_SERVICE_NOT_AVAILABLE; - } - - PublishRequest publishRequest = new PublishRequest( - bForceToNetwork, System.currentTimeMillis()); - - requestPublication(publishRequest); - - return ResultCode.SUCCESS; - } - - public class PublishRequest { - private boolean mForceToNetwork = true; - private long mCurrentTime = 0; - private boolean mVolteCapable = false; - private boolean mVtCapable = false; - - PublishRequest(boolean bForceToNetwork, long currentTime) { - refreshPublishContent(); - mForceToNetwork = bForceToNetwork; - mCurrentTime = currentTime; - } - - public void refreshPublishContent() { - mVolteCapable = isIPVoiceSupported(mIsVolteAvailable, - mIsVtAvailable, - mIsVoWifiAvailable, - mIsViWifiAvailable); - mVtCapable = isIPVideoSupported(mIsVolteAvailable, - mIsVtAvailable, - mIsVoWifiAvailable, - mIsViWifiAvailable); - } - - public boolean getForceToNetwork() { - return mForceToNetwork; - } - - public void setForceToNetwork(boolean bForceToNetwork) { - mForceToNetwork = bForceToNetwork; - } - - public long getTimestamp() { - return mCurrentTime; - } - - public void setTimestamp(long currentTime) { - mCurrentTime = currentTime; - } - - public void setVolteCapable(boolean capable) { - mVolteCapable = capable; - } - - public void setVtCapable(boolean capable) { - mVtCapable = capable; - } - - public boolean getVolteCapable() { - return mVolteCapable; - } - - public boolean getVtCapable() { - return mVtCapable; - } - - public boolean hasSamePublishContent(PublishRequest request) { - if(request == null) { - logger.error("request == null"); - return false; - } - - return (mVolteCapable == request.getVolteCapable() && - mVtCapable == request.getVtCapable()); - } - - public String toString(){ - return "mForceToNetwork=" + mForceToNetwork + - " mCurrentTime=" + mCurrentTime + - " mVolteCapable=" + mVolteCapable + - " mVtCapable=" + mVtCapable; - } - } - - private Handler mMsgHandler = new Handler() { - @Override - public void handleMessage(Message msg) { - super.handleMessage(msg); - - logger.debug( "Thread=" + Thread.currentThread().getName() + " received " - + msg); - if(msg == null){ - logger.error("msg=null"); - return; - } - - switch (msg.what) { - case MESSAGE_RCS_PUBLISH_REQUEST: - logger.debug("handleMessage msg=RCS_PUBLISH_REQUEST:"); - - PublishRequest publishRequest = (PublishRequest) msg.obj; - synchronized(mSyncObj) { - mPendingRequest = null; - } - doPublish(publishRequest); - break; - - default: - logger.debug("handleMessage unknown msg=" + msg.what); - } - } - }; - - private void requestPublication(PublishRequest publishRequest) { - // this is used to avoid the temp false feature change when switched between network. - if(publishRequest == null) { - logger.error("Invalid parameter publishRequest == null"); - return; - } - - long requestThrottle = 2000; - long currentTime = System.currentTimeMillis(); - synchronized(mSyncObj){ - // There is a PUBLISH will be done soon. Discard it - if((mPendingRequest != null) && currentTime - mPendingRequest.getTimestamp() - <= requestThrottle) { - logger.print("A publish is pending, update the pending request and discard this one"); - if(publishRequest.getForceToNetwork() && !mPendingRequest.getForceToNetwork()) { - mPendingRequest.setForceToNetwork(true); - } - mPendingRequest.setTimestamp(publishRequest.getTimestamp()); - return; - } - - mPendingRequest = publishRequest; - } - - Message publishMessage = mMsgHandler.obtainMessage( - MESSAGE_RCS_PUBLISH_REQUEST, mPendingRequest); - mMsgHandler.sendMessageDelayed(publishMessage, requestThrottle); - } - - private void doPublish(PublishRequest publishRequest) { - - if(publishRequest == null) { - logger.error("publishRequest == null"); - return; - } - - if (mRcsStackAdaptor == null) { - logger.error("mRcsStackAdaptor == null"); - return; - } - - if(!mImsRegistered) { - logger.debug("IMS wasn't registered"); - return; - } - - // Since we are doing a publish, don't need the retry any more. - if(mPendingRetry) { - mPendingRetry = false; - mAlarmManager.cancel(mRetryAlarmIntent); - } - - // always publish the latest status. - synchronized(mSyncObj) { - publishRequest.refreshPublishContent(); - } - - logger.print("publishRequest=" + publishRequest); - if(!publishRequest.getForceToNetwork() && isPublishedOrPublishing() && - (publishRequest.hasSamePublishContent(mPublishingRequest) || - (mPublishingRequest == null) && - publishRequest.hasSamePublishContent(mPublishedRequest)) && - (getPublishState() != PublishState.PUBLISH_STATE_NOT_PUBLISHED)) { - logger.print("Don't need publish since the capability didn't change publishRequest " + - publishRequest + " getPublishState()=" + getPublishState()); - return; - } - - // Don't publish too frequently. Checking the throttle timer. - if(isPublishedOrPublishing()) { - if(mPendingRetry) { - logger.print("Pending a retry"); - return; - } - - long publishThreshold = RcsSettingUtils.getPublishThrottle(mContext); - long passed = publishThreshold; - if(mPublishingRequest != null) { - passed = System.currentTimeMillis() - mPublishingRequest.getTimestamp(); - } else if(mPublishedRequest != null) { - passed = System.currentTimeMillis() - mPublishedRequest.getTimestamp(); - } - passed = passed>=0?passed:publishThreshold; - - long left = publishThreshold - passed; - left = left>120000?120000:left; // Don't throttle more then 2 mintues. - if(left > 0) { - // A publish is ongoing or published in 1 minute. - // Since the new publish has new status. So schedule - // the publish after the throttle timer. - scheduleRetryPublish(left); - return; - } - } - - // we need send PUBLISH once even the volte is off when power on the phone. - // That will tell other phone that it has no volte/vt capability. - if(!ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mContext) && - getPublishState() != PublishState.PUBLISH_STATE_NOT_PUBLISHED) { - // volte was not enabled. - // or it is turnning off volte. lower layer should unpublish - reset(); - return; - } - - TelephonyManager teleMgr = (TelephonyManager) mContext.getSystemService( - Context.TELEPHONY_SERVICE); - if(teleMgr ==null) { - logger.debug("teleMgr=null"); - return; - } - - RcsPresenceInfo presenceInfo = new RcsPresenceInfo(teleMgr.getLine1Number(), - RcsPresenceInfo.VolteStatus.VOLTE_UNKNOWN, - publishRequest.getVolteCapable()?RcsPresenceInfo.ServiceState.ONLINE: - RcsPresenceInfo.ServiceState.OFFLINE, null, System.currentTimeMillis(), - publishRequest.getVtCapable()?RcsPresenceInfo.ServiceState.ONLINE: - RcsPresenceInfo.ServiceState.OFFLINE, null, - System.currentTimeMillis()); - - synchronized(mSyncObj) { - mPublishingRequest = publishRequest; - mPublishingRequest.setTimestamp(System.currentTimeMillis()); - } - - int ret = mRcsStackAdaptor.requestPublication(presenceInfo, null); - if(ret == ResultCode.ERROR_SERVICE_NOT_AVAILABLE){ - mHasCachedTrigger = true; - }else{ - //reset the cached trigger - mHasCachedTrigger = false; - } - } - - public void handleCmdStatus(PresCmdStatus cmdStatus) { - super.handleCmdStatus(cmdStatus); - } - - private PendingIntent mRetryAlarmIntent = null; - public static final String ACTION_RETRY_PUBLISH_ALARM = - "com.android.service.ims.presence.retry.publish"; - private AlarmManager mAlarmManager = null; - private BroadcastReceiver mRetryReceiver = null; - boolean mCancelRetry = true; - boolean mPendingRetry = false; - - private void scheduleRetryPublish(long timeSpan) { - logger.print("timeSpan=" + timeSpan + - " mPendingRetry=" + mPendingRetry + - " mCancelRetry=" + mCancelRetry); - - // avoid duplicated retry. - if(mPendingRetry) { - logger.debug("There was a retry already"); - return; - } - mPendingRetry = true; - mCancelRetry = false; - - Intent intent = new Intent(ACTION_RETRY_PUBLISH_ALARM); - intent.setClass(mContext, AlarmBroadcastReceiver.class); - mRetryAlarmIntent = PendingIntent.getBroadcast(mContext, 0, intent, - PendingIntent.FLAG_UPDATE_CURRENT); - - if(mAlarmManager == null) { - mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); - } - - mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, - SystemClock.elapsedRealtime() + timeSpan, mRetryAlarmIntent); - } - - public void retryPublish() { - logger.print("mCancelRetry=" + mCancelRetry); - mPendingRetry = false; - - // Need some time to cancel it (1 minute for longest) - // Don't do it if it was canceled already. - if(mCancelRetry) { - return; - } - - invokePublish(PublishType.PRES_PUBLISH_TRIGGER_RETRY); - } - - public void handleSipResponse(PresSipResponse pSipResponse) { - logger.print( "Publish response code = " + pSipResponse.getSipResponseCode() - +"Publish response reason phrase = " + pSipResponse.getReasonPhrase()); - - synchronized(mSyncObj) { - mPublishedRequest = mPublishingRequest; - mPublishingRequest = null; - } - if(pSipResponse == null){ - logger.debug("handlePublishResponse pSipResponse = null"); - return; - } - int sipCode = pSipResponse.getSipResponseCode(); - - if(isInConfigList(sipCode, pSipResponse.getReasonPhrase(), - R.array.config_volte_provision_error_on_publish_response)) { - logger.print("volte provision error. sipCode=" + sipCode + " phrase=" + - pSipResponse.getReasonPhrase()); - setPublishState(PublishState.PUBLISH_STATE_VOLTE_PROVISION_ERROR); - mDonotRetryUntilPowerCycle = true; - - notifyDm(); - - return; - } - - if(isInConfigList(sipCode, pSipResponse.getReasonPhrase(), - R.array.config_rcs_provision_error_on_publish_response)) { - logger.print("rcs provision error.sipCode=" + sipCode + " phrase=" + - pSipResponse.getReasonPhrase()); - setPublishState(PublishState.PUBLISH_STATE_RCS_PROVISION_ERROR); - mDonotRetryUntilPowerCycle = true; - - return; - } - - switch (sipCode) { - case 999: - logger.debug("Publish ignored - No capability change"); - break; - case 200: - setPublishState(PublishState.PUBLISH_STATE_200_OK); - if(mSubscriber != null) { - mSubscriber.retryToGetAvailability(); - } - break; - - case 408: - setPublishState(PublishState.PUBLISH_STATE_REQUEST_TIMEOUT); - break; - - default: // Generic Failure - if ((sipCode < 100) || (sipCode > 699)) { - logger.debug("Ignore internal response code, sipCode=" + sipCode); - // internal error - // 0- PERMANENT ERROR: UI should not retry immediately - // 888- TEMP ERROR: UI Can retry immediately - // 999- NO CHANGE: No Publish needs to be sent - if(sipCode == 888) { - // retry per 2 minutes - scheduleRetryPublish(120000); - } else { - logger.debug("Ignore internal response code, sipCode=" + sipCode); - } - } else { - logger.debug( "Generic Failure"); - setPublishState(PublishState.PUBLISH_STATE_OTHER_ERROR); - - if ((sipCode>=400) && (sipCode <= 699)) { - // 4xx/5xx/6xx, No retry, no impact on subsequent publish - logger.debug( "No Retry in OEM"); - } - } - break; - } - - // Suppose the request ID had been set when IQPresListener_CMDStatus - Task task = TaskManager.getDefault().getTaskByRequestId( - pSipResponse.getRequestId()); - if(task != null){ - task.mSipResponseCode = pSipResponse.getSipResponseCode(); - task.mSipReasonPhrase = pSipResponse.getReasonPhrase(); - } - - handleCallback(task, getPublishState(), false); - } - - private static boolean isTtyEnabled(int mode) { - return Phone.TTY_MODE_OFF != mode; - } - - private static int telecomTtyModeToPhoneMode(int telecomMode) { - switch (telecomMode) { - case TelecomManager.TTY_MODE_FULL: - return Phone.TTY_MODE_FULL; - case TelecomManager.TTY_MODE_VCO: - return Phone.TTY_MODE_VCO; - case TelecomManager.TTY_MODE_HCO: - return Phone.TTY_MODE_HCO; - case TelecomManager.TTY_MODE_OFF: - default: - return Phone.TTY_MODE_OFF; - } - } - - public void finish() { - if (mReceiver != null) { - mContext.unregisterReceiver(mReceiver); - mReceiver = null; - } - } - - protected void finalize() throws Throwable { - finish(); - } - - private PendingIntent createIncomingCallPendingIntent() { - Intent intent = new Intent(ACTION_IMS_FEATURE_AVAILABLE); - intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); - return PendingIntent.getBroadcast(mContext, 0, intent, - PendingIntent.FLAG_UPDATE_CURRENT); - } - - public void onFeatureCapabilityChanged(final int serviceClass, - final int[] enabledFeatures, final int[] disabledFeatures) { - logger.debug("onFeatureCapabilityChanged serviceClass="+serviceClass - +", enabledFeatures="+Arrays.toString(enabledFeatures) - +", disabledFeatures="+Arrays.toString(disabledFeatures)); - - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - onFeatureCapabilityChangedInternal(serviceClass, - enabledFeatures, disabledFeatures); - } - }, "onFeatureCapabilityChangedInternal thread"); - - thread.start(); - } - - synchronized private void onFeatureCapabilityChangedInternal(int serviceClass, - int[] enabledFeatures, int[] disabledFeatures) { - if (serviceClass == ImsServiceClass.MMTEL) { - boolean oldIsVolteAvailable = mIsVolteAvailable; - boolean oldIsVtAvailable = mIsVtAvailable; - boolean oldIsVoWifiAvailable = mIsVoWifiAvailable; - boolean oldIsViWifiAvailable = mIsViWifiAvailable; - - if(enabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE] == - ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE) { - mIsVolteAvailable = true; - } else if(enabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE] == - ImsConfig.FeatureConstants.FEATURE_TYPE_UNKNOWN) { - mIsVolteAvailable = false; - } else { - logger.print("invalid value for FEATURE_TYPE_VOICE_OVER_LTE"); - } - - if(enabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_WIFI] == - ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_WIFI) { - mIsVoWifiAvailable = true; - } else if(enabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_WIFI] == - ImsConfig.FeatureConstants.FEATURE_TYPE_UNKNOWN) { - mIsVoWifiAvailable = false; - } else { - logger.print("invalid value for FEATURE_TYPE_VOICE_OVER_WIFI"); - } - - if (enabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_LTE] == - ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_LTE) { - mIsVtAvailable = true; - } else if (enabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_LTE] == - ImsConfig.FeatureConstants.FEATURE_TYPE_UNKNOWN) { - mIsVtAvailable = false; - } else { - logger.print("invalid value for FEATURE_TYPE_VIDEO_OVER_LTE"); - } - - if(enabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_WIFI] == - ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_WIFI) { - mIsViWifiAvailable = true; - } else if(enabledFeatures[ImsConfig.FeatureConstants.FEATURE_TYPE_VIDEO_OVER_WIFI] == - ImsConfig.FeatureConstants.FEATURE_TYPE_UNKNOWN) { - mIsViWifiAvailable = false; - } else { - logger.print("invalid value for FEATURE_TYPE_VIDEO_OVER_WIFI"); - } - - logger.print("mIsVolteAvailable=" + mIsVolteAvailable + - " mIsVoWifiAvailable=" + mIsVoWifiAvailable + - " mIsVtAvailable=" + mIsVtAvailable + - " mIsViWifiAvailable=" + mIsViWifiAvailable + - " oldIsVolteAvailable=" + oldIsVolteAvailable + - " oldIsVoWifiAvailable=" + oldIsVoWifiAvailable + - " oldIsVtAvailable=" + oldIsVtAvailable + - " oldIsViWifiAvailable=" + oldIsViWifiAvailable); - - if(oldIsVolteAvailable != mIsVolteAvailable || - oldIsVtAvailable != mIsVtAvailable || - oldIsVoWifiAvailable != mIsVoWifiAvailable || - oldIsViWifiAvailable != mIsViWifiAvailable) { - if(mGotTriggerFromStack) { - if((Settings.Global.getInt(mContext.getContentResolver(), - Settings.Global.AIRPLANE_MODE_ON, 0) != 0) && !mIsVoWifiAvailable && - !mIsViWifiAvailable) { - logger.print("Airplane mode was on and no vowifi and viwifi." + - " Don't need publish. Stack will unpublish"); - return; - } - - if(isOnIWLAN()) { - // will check duplicated PUBLISH in requestPublication by invokePublish - invokePublish(PresencePublication.PublishType. - PRES_PUBLISH_TRIGGER_FEATURE_AVAILABILITY_CHANGED); - } - } else { - mHasCachedTrigger = true; - } - } - } - } - - private boolean isOnLTE() { - TelephonyManager teleMgr = (TelephonyManager) mContext.getSystemService( - Context.TELEPHONY_SERVICE); - int networkType = teleMgr.getDataNetworkType(); - logger.debug("mMovedToLTE=" + mMovedToLTE + " networkType=" + networkType); - - // Had reported LTE by trigger and still have DATA. - return mMovedToLTE && (networkType != TelephonyManager.NETWORK_TYPE_UNKNOWN); - } - - private boolean isOnIWLAN() { - TelephonyManager teleMgr = (TelephonyManager) mContext.getSystemService( - Context.TELEPHONY_SERVICE); - int networkType = teleMgr.getDataNetworkType(); - logger.debug("mMovedToIWLAN=" + mMovedToIWLAN + " networkType=" + networkType); - - // Had reported IWLAN by trigger and still have DATA. - return mMovedToIWLAN && (networkType != TelephonyManager.NETWORK_TYPE_UNKNOWN); - } - -} diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublishTask.java b/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublishTask.java deleted file mode 100644 index 361488ef..00000000 --- a/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublishTask.java +++ /dev/null @@ -1,90 +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 java.util.Set; -import java.util.HashMap; -import java.util.List; -import java.util.ArrayList; -import android.content.Context; -import android.content.Intent; -import android.app.PendingIntent; -import android.content.IntentFilter; -import android.os.RemoteException; -import android.app.AlarmManager; -import android.os.SystemClock; - -import com.android.ims.internal.uce.presence.PresCmdStatus; - -import com.android.ims.internal.Logger; -import com.android.ims.RcsManager.ResultCode; -import com.android.ims.RcsPresenceInfo; -import com.android.ims.IRcsPresenceListener; - -import com.android.service.ims.TaskManager; - -/** - * PresencePublishTask - */ -public class PresencePublishTask extends PresenceTask{ - /* - * The logger - */ - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private long mCreateTimestamp = 0; - - private int mRetryCount = 0; - - public PresencePublishTask(int taskId, int cmdId, IRcsPresenceListener listener, - String[] contacts){ - super(taskId, cmdId, listener, contacts); - - mCreateTimestamp = System.currentTimeMillis(); - } - - public long getCreateTimestamp() { - return mCreateTimestamp; - } - - public int getRetryCount() { - return mRetryCount; - } - - public void setRetryCount(int retryCount) { - mRetryCount = retryCount; - } - - public String toString(){ - return super.toString() + - " mCreateTimestamp=" + mCreateTimestamp + - " mRetryCount=" + mRetryCount; - } -}; - diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceSubscriber.java b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceSubscriber.java deleted file mode 100644 index 60a783bf..00000000 --- a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceSubscriber.java +++ /dev/null @@ -1,628 +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 java.util.List; -import java.util.ArrayList; -import java.util.Timer; -import java.util.TimerTask; -import java.util.concurrent.Semaphore; -import android.content.ContentValues; -import android.text.TextUtils; - -import android.content.BroadcastReceiver; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import com.android.internal.telephony.TelephonyIntents; -import android.os.HandlerThread; -import android.os.RemoteException; -import android.telephony.TelephonyManager; -import android.database.Cursor; - -import java.lang.String; -import android.content.Context; -import android.util.Log; - -import com.android.ims.internal.uce.presence.PresSipResponse; -import com.android.ims.internal.uce.common.StatusCode; -import com.android.ims.internal.uce.common.StatusCode; -import com.android.ims.internal.uce.presence.PresSubscriptionState; -import com.android.ims.internal.uce.presence.PresCmdStatus; -import com.android.ims.internal.uce.presence.PresResInfo; -import com.android.ims.internal.uce.presence.PresRlmiInfo; -import com.android.ims.internal.uce.presence.PresTupleInfo; - -import com.android.ims.RcsPresenceInfo; -import com.android.ims.RcsPresence; -import com.android.ims.IRcsPresenceListener; -import com.android.ims.RcsManager.ResultCode; -import com.android.ims.RcsPresence.PublishState; - -import com.android.ims.internal.Logger; -import com.android.ims.internal.ContactNumberUtils; -import com.android.service.ims.TaskManager; -import com.android.service.ims.Task; -import com.android.service.ims.RcsStackAdaptor; -import com.android.service.ims.RcsUtils; -import com.android.service.ims.RcsSettingUtils; - -import com.android.service.ims.R; - -public class PresenceSubscriber extends PresenceBase{ - /* - * The logger - */ - private Logger logger = Logger.getLogger(this.getClass().getName()); - - private RcsStackAdaptor mRcsStackAdaptor = null; - - private static PresenceSubscriber sSubsriber = null; - - private String mAvailabilityRetryNumber = null; - - /* - * Constructor - */ - public PresenceSubscriber(RcsStackAdaptor rcsStackAdaptor, Context context){ - mRcsStackAdaptor = rcsStackAdaptor; - mContext = context; - } - - private String numberToUriString(String number){ - String formatedContact = number; - if(!formatedContact.startsWith("sip:") && !formatedContact.startsWith("tel:")){ - String domain = TelephonyManager.getDefault().getIsimDomain(); - logger.debug("domain=" + domain); - if(domain == null || domain.length() ==0){ - formatedContact = "tel:" + formatedContact; - }else{ - formatedContact = "sip:" + formatedContact + "@" + domain; - } - } - - logger.print("numberToUriString formatedContact=" + formatedContact); - return formatedContact; - } - - private String numberToTelString(String number){ - String formatedContact = number; - if(!formatedContact.startsWith("sip:") && !formatedContact.startsWith("tel:")){ - formatedContact = "tel:" + formatedContact; - } - - logger.print("numberToTelString formatedContact=" + formatedContact); - return formatedContact; - } - - public int requestCapability(List<String> contactsNumber, - IRcsPresenceListener listener){ - logger.debug("requestCapability contactsNumber=" + contactsNumber); - - int ret = mRcsStackAdaptor.checkStackAndPublish(); - if(ret < ResultCode.SUCCESS){ - logger.error("requestCapability ret=" + ret); - return ret; - } - - if(contactsNumber == null || contactsNumber.size() ==0){ - ret = ResultCode.SUBSCRIBE_INVALID_PARAM; - return ret; - } - - logger.debug("check contact size ..."); - if(contactsNumber.size() > RcsSettingUtils.getMaxNumbersInRCL(mContext)){ - ret = ResultCode.SUBSCRIBE_TOO_LARGE; - logger.error("requestCapability contctNumber size=" + contactsNumber.size()); - return ret; - } - - String[] formatedNumbers = ContactNumberUtils.getDefault().format(contactsNumber); - ret = ContactNumberUtils.getDefault().validate(formatedNumbers); - if(ret != ContactNumberUtils.NUMBER_VALID){ - logger.error("requestCapability ret=" + ret); - return ret; - } - - String[] formatedContacts = new String[formatedNumbers.length]; - for(int i=0; i<formatedContacts.length; i++){ - formatedContacts[i] = numberToTelString(formatedNumbers[i]); - } - // In ms - long timeout = RcsSettingUtils.getCapabPollListSubExp(mContext) * 1000; - timeout += RcsSettingUtils.getSIPT1Timer(mContext); - - // The terminal notification may be received shortly after the time limit of - // the subscription due to network delays or retransmissions. - // Device shall wait for 3sec after the end of the subscription period in order to - // accept such notifications without returning spurious errors (e.g. SIP 481) - timeout += 3000; - - logger.print("add to task manager, formatedNumbers=" + - RcsUtils.toContactString(formatedNumbers)); - int taskId = TaskManager.getDefault().addCapabilityTask(mContext, formatedNumbers, - listener, timeout); - logger.print("taskId=" + taskId); - - ret = mRcsStackAdaptor.requestCapability(formatedContacts, taskId); - if(ret < ResultCode.SUCCESS){ - logger.error("requestCapability ret=" + ret + " remove taskId=" + taskId); - TaskManager.getDefault().removeTask(taskId); - } - - ret = taskId; - - return ret; - } - - public int requestAvailability(String contactNumber, IRcsPresenceListener listener, - boolean forceToNetwork){ - logger.print("requestAvailability contactNumber=" + contactNumber + - " forceToNetwork=" + forceToNetwork); - - String formatedContact = ContactNumberUtils.getDefault().format(contactNumber); - int ret = ContactNumberUtils.getDefault().validate(formatedContact); - if(ret != ContactNumberUtils.NUMBER_VALID){ - return ret; - } - - if(!forceToNetwork){ - logger.debug("check if we can use the value in cache"); - int availabilityExpire = RcsSettingUtils.getAvailabilityCacheExpiration(mContext); - availabilityExpire = availabilityExpire>0?availabilityExpire*1000: - 60*1000; // by default is 60s - logger.print("requestAvailability availabilityExpire=" + availabilityExpire); - - TaskManager.getDefault().clearTimeoutAvailabilityTask(availabilityExpire); - - Task task = TaskManager.getDefault().getAvailabilityTaskByContact(formatedContact); - if(task != null && task instanceof PresenceAvailabilityTask) { - PresenceAvailabilityTask availabilityTask = (PresenceAvailabilityTask)task; - if(availabilityTask.getNotifyTimestamp() == 0) { - // The previous one didn't get response yet. - logger.print("requestAvailability: the request is pending in queue"); - return ResultCode.SUBSCRIBE_ALREADY_IN_QUEUE; - }else { - // not expire yet. Can use the previous value. - logger.print("requestAvailability: the prevous valuedoesn't be expired yet"); - return ResultCode.SUBSCRIBE_TOO_FREQUENTLY; - } - } - } - - boolean isFtSupported = false; // hard code to not support FT at present. - boolean isChatSupported = false; // hard code to not support chat at present. - // Only poll/fetch capability/availability on LTE - if(((TelephonyManager.getDefault().getNetworkType() != TelephonyManager.NETWORK_TYPE_LTE) - && !isFtSupported && !isChatSupported)){ - logger.error("requestAvailability return ERROR_SERVICE_NOT_AVAILABLE" + - " for it is not LTE network"); - return ResultCode.ERROR_SERVICE_NOT_AVAILABLE; - } - - ret = mRcsStackAdaptor.checkStackAndPublish(); - if(ret < ResultCode.SUCCESS){ - logger.error("requestAvailability=" + ret); - return ret; - } - - // user number format in TaskManager. - int taskId = TaskManager.getDefault().addAvailabilityTask(formatedContact, listener); - - // Change it to URI format. - formatedContact = numberToUriString(formatedContact); - - logger.print("addAvailabilityTask formatedContact=" + formatedContact); - - ret = mRcsStackAdaptor.requestAvailability(formatedContact, taskId); - if(ret < ResultCode.SUCCESS){ - logger.error("requestAvailability ret=" + ret + " remove taskId=" + taskId); - TaskManager.getDefault().removeTask(taskId); - } - - ret = taskId; - - return ret; - } - - private int translateResponse403(PresSipResponse pSipResponse){ - String reasonPhrase = pSipResponse.getReasonPhrase(); - if(reasonPhrase == null){ - // No retry. The PS provisioning has not occurred correctly. UX Decision to show errror. - return ResultCode.SUBSCRIBE_GENIRIC_FAILURE; - } - - reasonPhrase = reasonPhrase.toLowerCase(); - if(reasonPhrase.contains("user not registered")){ - // Register to IMS then retry the single resource subscription if capability polling. - // availability fetch: no retry. ignore the availability and allow LVC? (PLM decision) - return ResultCode.SUBSCRIBE_NOT_REGISTERED; - } - - if(reasonPhrase.contains("not authorized for presence")){ - // No retry. - return ResultCode.SUBSCRIBE_NOT_AUTHORIZED_FOR_PRESENCE; - } - - // unknown phrase: handle it as the same as no phrase - return ResultCode.SUBSCRIBE_FORBIDDEN; - } - - private int translateResponseCode(PresSipResponse pSipResponse){ - // pSipResponse should not be null. - logger.debug("translateResponseCode getSipResponseCode=" + - pSipResponse.getSipResponseCode()); - int ret = ResultCode.SUBSCRIBE_GENIRIC_FAILURE; - - int sipCode = pSipResponse.getSipResponseCode(); - if(sipCode < 100 || sipCode > 699){ - logger.debug("internal error code sipCode=" + sipCode); - ret = ResultCode.SUBSCRIBE_TEMPORARY_ERROR; //it is internal issue. ignore it. - return ret; - } - - switch(sipCode){ - case 200: - ret = ResultCode.SUCCESS; - break; - - case 403: - ret = translateResponse403(pSipResponse); - break; - - case 404: - // Target MDN is not provisioned for VoLTE or it is not known as VzW IMS subscriber - // Device shall not retry. Device shall remove the VoLTE status of the target MDN - // and update UI - ret = ResultCode.SUBSCRIBE_NOT_FOUND; - break; - - case 408: - // Request Timeout - // Device shall retry with exponential back-off - ret = ResultCode.SUBSCRIBE_TEMPORARY_ERROR; - break; - - case 413: - // Too Large. - // Application need shrink the size of request contact list and resend the request - ret = ResultCode.SUBSCRIBE_TOO_LARGE; - break; - - case 423: - // Interval Too Short. Requested expiry interval too short and server rejects it - // Device shall re-attempt subscription after changing the expiration interval in - // the Expires header field to be equal to or greater than the expiration interval - // within the Min-Expires header field of the 423 response - ret = ResultCode.SUBSCRIBE_TEMPORARY_ERROR; - break; - - case 500: - // 500 Server Internal Error - // capability polling: exponential back-off retry (same rule as resource list) - // availability fetch: no retry. ignore the availability and allow LVC - // (PLM decision) - ret = ResultCode.SUBSCRIBE_TEMPORARY_ERROR; - break; - - case 503: - // capability polling: exponential back-off retry (same rule as resource list) - // availability fetch: no retry. ignore the availability and allow LVC? - // (PLM decision) - ret = ResultCode.SUBSCRIBE_TEMPORARY_ERROR; - break; - - // capability polling: Device shall retry with exponential back-off - // Availability Fetch: device shall ignore the error and shall not retry - case 603: - ret = ResultCode.SUBSCRIBE_TEMPORARY_ERROR; - break; - - default: - // Other 4xx/5xx/6xx - // Device shall not retry - ret = ResultCode.SUBSCRIBE_GENIRIC_FAILURE; - } - - logger.debug("translateResponseCode ret=" + ret); - return ret; - } - - public void handleSipResponse(PresSipResponse pSipResponse){ - if(pSipResponse == null){ - logger.debug("handleSipResponse pSipResponse = null"); - return; - } - - int sipCode = pSipResponse.getSipResponseCode(); - String phrase = pSipResponse.getReasonPhrase(); - if(isInConfigList(sipCode, phrase, - R.array.config_volte_provision_error_on_subscribe_response)) { - logger.print("volte provision sipCode=" + sipCode + " phrase=" + phrase); - mRcsStackAdaptor.setPublishState(PublishState.PUBLISH_STATE_VOLTE_PROVISION_ERROR); - - notifyDm(); - } else if(isInConfigList(sipCode, phrase, - R.array.config_rcs_provision_error_on_subscribe_response)) { - logger.print("rcs provision sipCode=" + sipCode + " phrase=" + phrase); - mRcsStackAdaptor.setPublishState(PublishState.PUBLISH_STATE_RCS_PROVISION_ERROR); - } - - int errorCode = translateResponseCode(pSipResponse); - logger.print("handleSipResponse errorCode=" + errorCode); - - if(errorCode == ResultCode.SUBSCRIBE_NOT_REGISTERED){ - logger.debug("setPublishState to unknown" + - " for subscribe error 403 not registered"); - mRcsStackAdaptor.setPublishState( - PublishState.PUBLISH_STATE_OTHER_ERROR); - } - - if(errorCode == ResultCode.SUBSCRIBE_NOT_AUTHORIZED_FOR_PRESENCE) { - logger.debug("ResultCode.SUBSCRIBE_NOT_AUTHORIZED_FOR_PRESENCE"); - } - - if(errorCode == ResultCode.SUBSCRIBE_FORBIDDEN){ - logger.debug("ResultCode.SUBSCRIBE_FORBIDDEN"); - } - - // Suppose the request ID had been set when IQPresListener_CMDStatus - Task task = TaskManager.getDefault().getTaskByRequestId( - pSipResponse.getRequestId()); - logger.debug("handleSipResponse task=" + task); - if(task != null){ - task.mSipResponseCode = sipCode; - task.mSipReasonPhrase = phrase; - TaskManager.getDefault().putTask(task.mTaskId, task); - } - - if(errorCode == ResultCode.SUBSCRIBE_NOT_REGISTERED && - task != null && task.mCmdId == TaskManager.TASK_TYPE_GET_AVAILABILITY) { - String[] contacts = ((PresenceTask)task).mContacts; - if(contacts != null && contacts.length>0){ - mAvailabilityRetryNumber = contacts[0]; - } - logger.debug("retry to get availability for " + mAvailabilityRetryNumber); - } - - // 404 error for single contact only as per requirement - // need handle 404 for multiple contacts as per CV 3.24. - if(errorCode == ResultCode.SUBSCRIBE_NOT_FOUND && - task != null && ((PresenceTask)task).mContacts != null) { - String[] contacts = ((PresenceTask)task).mContacts; - ArrayList<RcsPresenceInfo> presenceInfoList = new ArrayList<RcsPresenceInfo>(); - - for(int i=0; i<contacts.length; i++){ - logger.debug("404 error: task.mContacts[" + i + "]=" + contacts[i]); - if(TextUtils.isEmpty(contacts[i])){ - continue; - } - - RcsPresenceInfo presenceInfo = new RcsPresenceInfo(contacts[i], - RcsPresenceInfo.VolteStatus.VOLTE_DISABLED, - RcsPresenceInfo.ServiceState.OFFLINE, null, System.currentTimeMillis(), - RcsPresenceInfo.ServiceState.OFFLINE, null, System.currentTimeMillis()); - presenceInfoList.add(presenceInfo); - } - - // Notify presence information changed. - logger.debug("notify presence changed for 404 error"); - Intent intent = new Intent(RcsPresence.ACTION_PRESENCE_CHANGED); - intent.putParcelableArrayListExtra(RcsPresence.EXTRA_PRESENCE_INFO_LIST, - presenceInfoList); - intent.putExtra("updateLastTimestamp", true); - launchPersistService(intent); - } else if(errorCode == ResultCode.SUBSCRIBE_GENIRIC_FAILURE) { - updateAvailabilityToUnknown(task); - } - - handleCallback(task, errorCode, false); - } - - private void launchPersistService(Intent intent) { - ComponentName component = new ComponentName("com.android.service.ims.presence", - "com.android.service.ims.presence.PersistService"); - intent.setComponent(component); - mContext.startService(intent); - } - - public void retryToGetAvailability() { - logger.debug("retryToGetAvailability, number=" + mAvailabilityRetryNumber); - if(mAvailabilityRetryNumber == null){ - return; - } - requestAvailability(mAvailabilityRetryNumber, null, true); - //retry one time only - mAvailabilityRetryNumber = null; - } - - public void updatePresence(String pPresentityUri, PresTupleInfo[] pTupleInfo){ - if(mContext == null){ - logger.error("updatePresence mContext == null"); - return; - } - - RcsPresenceInfo rcsPresenceInfo = PresenceInfoParser.getPresenceInfoFromTuple( - pPresentityUri, pTupleInfo); - if(rcsPresenceInfo == null || TextUtils.isEmpty( - rcsPresenceInfo.getContactNumber())){ - logger.error("rcsPresenceInfo is null or " + - "TextUtils.isEmpty(rcsPresenceInfo.getContactNumber()"); - return; - } - - ArrayList<RcsPresenceInfo> rcsPresenceInfoList = new ArrayList<RcsPresenceInfo>(); - rcsPresenceInfoList.add(rcsPresenceInfo); - - // For single contact number we got 1 NOTIFY only. So regard it as terminated. - TaskManager.getDefault().onTerminated(rcsPresenceInfo.getContactNumber()); - - PresenceAvailabilityTask availabilityTask = TaskManager.getDefault(). - getAvailabilityTaskByContact(rcsPresenceInfo.getContactNumber()); - if(availabilityTask != null){ - availabilityTask.updateNotifyTimestamp(); - } - - // Notify presence information changed. - Intent intent = new Intent(RcsPresence.ACTION_PRESENCE_CHANGED); - intent.putParcelableArrayListExtra(RcsPresence.EXTRA_PRESENCE_INFO_LIST, - rcsPresenceInfoList); - intent.putExtra("updateLastTimestamp", true); - launchPersistService(intent); - } - - public void updatePresences(PresRlmiInfo pRlmiInfo, PresResInfo[] pRcsPresenceInfo) { - if(mContext == null){ - logger.error("updatePresences: mContext == null"); - return; - } - - RcsPresenceInfo[] rcsPresenceInfos = PresenceInfoParser. - getPresenceInfosFromPresenceRes(pRlmiInfo, pRcsPresenceInfo); - if(rcsPresenceInfos == null){ - logger.error("updatePresences: rcsPresenceInfos == null"); - return; - } - - ArrayList<RcsPresenceInfo> rcsPresenceInfoList = new ArrayList<RcsPresenceInfo>(); - - for (int i=0; i < rcsPresenceInfos.length; i++) { - RcsPresenceInfo rcsPresenceInfo = rcsPresenceInfos[i]; - if(rcsPresenceInfo != null && !TextUtils.isEmpty(rcsPresenceInfo.getContactNumber())){ - logger.debug("rcsPresenceInfo=" + rcsPresenceInfo); - - rcsPresenceInfoList.add(rcsPresenceInfo); - } - } - - boolean isTerminated = false; - if(pRlmiInfo.getPresSubscriptionState() != null){ - if(pRlmiInfo.getPresSubscriptionState().getPresSubscriptionStateValue() == - PresSubscriptionState.UCE_PRES_SUBSCRIPTION_STATE_TERMINATED){ - isTerminated = true; - } - } - - if(isTerminated){ - TaskManager.getDefault().onTerminated(pRlmiInfo.getRequestId(), - pRlmiInfo.getSubscriptionTerminatedReason()); - } - - if (rcsPresenceInfoList.size() > 0) { - // Notify presence changed - Intent intent = new Intent(RcsPresence.ACTION_PRESENCE_CHANGED); - intent.putParcelableArrayListExtra(RcsPresence.EXTRA_PRESENCE_INFO_LIST, - rcsPresenceInfoList); - logger.debug("broadcast ACTION_PRESENCE_CHANGED, rcsPresenceInfo=" + - rcsPresenceInfoList); - intent.putExtra("updateLastTimestamp", true); - launchPersistService(intent); - } - } - - public void handleCmdStatus(PresCmdStatus pCmdStatus){ - if(pCmdStatus == null){ - logger.error("handleCallbackForCmdStatus pCmdStatus=null"); - return; - } - - - Task taskTmp = TaskManager.getDefault().getTask(pCmdStatus.getUserData()); - int resultCode = RcsUtils.statusCodeToResultCode(pCmdStatus.getStatus().getStatusCode()); - logger.print("handleCmdStatus resultCode=" + resultCode); - PresenceTask task = null; - if(taskTmp != null && (taskTmp instanceof PresenceTask)){ - task = (PresenceTask)taskTmp; - task.mSipRequestId = pCmdStatus.getRequestId(); - task.mCmdStatus = resultCode; - TaskManager.getDefault().putTask(task.mTaskId, task); - - // handle error as the same as temporary network error - // set availability to false, keep old capability - if(resultCode != ResultCode.SUCCESS && task.mContacts != null){ - updateAvailabilityToUnknown(task); - } - } - - handleCallback(task, resultCode, true); - } - - private void updateAvailabilityToUnknown(Task inTask){ - //only used for serviceState is offline or unknown. - if(mContext == null){ - logger.error("updateAvailabilityToUnknown mContext=null"); - return; - } - - if(inTask == null){ - logger.error("updateAvailabilityToUnknown task=null"); - return; - } - - if(!(inTask instanceof PresenceTask)){ - logger.error("updateAvailabilityToUnknown not PresencTask"); - return; - } - - PresenceTask task = (PresenceTask)inTask; - - if(task.mContacts == null || task.mContacts.length ==0){ - logger.error("updateAvailabilityToUnknown no contacts"); - return; - } - - ArrayList<RcsPresenceInfo> presenceInfoList = new ArrayList<RcsPresenceInfo>(); - for(int i = 0; i< task.mContacts.length; i++){ - if(task.mContacts[i] == null || task.mContacts[i].length() == 0){ - continue; - } - - RcsPresenceInfo presenceInfo = new RcsPresenceInfo( - PresenceInfoParser.getPhoneFromUri(task.mContacts[i]), - RcsPresenceInfo.VolteStatus.VOLTE_UNKNOWN, - RcsPresenceInfo.ServiceState.UNKNOWN, null, System.currentTimeMillis(), - RcsPresenceInfo.ServiceState.UNKNOWN, null, System.currentTimeMillis()); - presenceInfoList.add(presenceInfo); - } - - if(presenceInfoList.size() > 0) { - // Notify presence information changed. - logger.debug("notify presence changed for cmd error"); - Intent intent = new Intent(RcsPresence.ACTION_PRESENCE_CHANGED); - intent.putParcelableArrayListExtra(RcsPresence.EXTRA_PRESENCE_INFO_LIST, - presenceInfoList); - - // don't update timestamp so it can be subscribed soon. - intent.putExtra("updateLastTimestamp", false); - launchPersistService(intent); - } - } -} - diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceTask.java b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceTask.java deleted file mode 100644 index 8ff74cd9..00000000 --- a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceTask.java +++ /dev/null @@ -1,76 +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 java.util.Set; -import java.util.HashMap; -import java.util.List; -import java.util.ArrayList; -import android.os.RemoteException; - -import com.android.ims.internal.uce.presence.PresCmdStatus; - -import com.android.ims.internal.Logger; -import com.android.ims.RcsManager.ResultCode; -import com.android.ims.RcsPresenceInfo; -import com.android.ims.IRcsPresenceListener; - -import com.android.service.ims.Task; -import com.android.service.ims.RcsUtils; - -/** - * PresenceTask - */ -public class PresenceTask extends Task{ - /* - * The logger - */ - private Logger logger = Logger.getLogger(this.getClass().getName()); - - // filled before send the request to stack - public String[] mContacts; - - public PresenceTask(int taskId, int cmdId, IRcsPresenceListener listener, String[] contacts){ - super(taskId, cmdId, listener); - - mContacts = contacts; - mListener = listener; - } - - public String toString(){ - return "PresenceTask: mTaskId=" + mTaskId + - " mCmdId=" + mCmdId + - " mContacts=" + RcsUtils.toContactString(mContacts) + - " mCmdStatus=" + mCmdStatus + - " mSipRequestId=" + mSipRequestId + - " mSipResponseCode=" + mSipResponseCode + - " mSipReasonPhrase=" + mSipReasonPhrase; - } -}; - diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/StackListener.java b/rcs/rcsservice/src/com/android/service/ims/presence/StackListener.java deleted file mode 100644 index 5abc19f1..00000000 --- a/rcs/rcsservice/src/com/android/service/ims/presence/StackListener.java +++ /dev/null @@ -1,535 +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 java.util.ArrayList; -import java.util.List; - -import android.content.ServiceConnection; -import android.annotation.SuppressLint; -import android.content.Intent; -import android.content.Context; -import android.content.SharedPreferences; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.os.RemoteException; -import android.text.TextUtils; -import android.util.Log; -import android.os.Parcel; - -import com.android.ims.internal.uce.presence.IPresenceListener; -import com.android.ims.internal.uce.presence.PresCmdId; -import com.android.ims.internal.uce.presence.PresCmdStatus; -import com.android.ims.internal.uce.presence.PresPublishTriggerType; -import com.android.ims.internal.uce.presence.PresResInfo; -import com.android.ims.internal.uce.presence.PresRlmiInfo; -import com.android.ims.internal.uce.presence.PresSipResponse; -import com.android.ims.internal.uce.presence.PresTupleInfo; -import com.android.ims.internal.uce.common.StatusCode; -import com.android.ims.internal.uce.common.StatusCode; - -import com.android.ims.RcsManager; -import com.android.ims.RcsManager.ResultCode; -import com.android.ims.RcsPresence; -import com.android.ims.RcsPresenceInfo; -import com.android.ims.IRcsPresenceListener; - -import com.android.ims.internal.Logger; -import com.android.service.ims.TaskManager; -import com.android.service.ims.Task; -import com.android.service.ims.RcsStackAdaptor; -import com.android.service.ims.LauncherUtils; - -public class StackListener extends Handler{ - /* - * The logger - */ - private Logger logger = Logger.getLogger(this.getClass().getName()); - - Context mContext; - private PresencePublication mPresencePublication = null; - private PresenceSubscriber mPresenceSubscriber = null; - - // RCS stack notify the AP to publish the presence. - private static final short PRESENCE_IMS_UNSOL_PUBLISH_TRIGGER = 1; - // PUBLISH CMD status changed - private static final short PRESENCE_IMS_UNSOL_PUBLISH_CMDSTATUS = 2; - // Received the SIP response for publish - private static final short PRESENCE_IMS_UNSOL_PUBLISH_SIPRESPONSE = 3; - // Received the presence for single contact - private static final short PRESENCE_IMS_UNSOL_NOTIFY_UPDATE = 4; - // Received the presence for contacts. - private static final short PRESENCE_IMS_UNSOL_NOTIFY_LIST_UPDATE = 5; - // Received the CMD status for capability/availability request - private static final short PRESENCE_IMS_UNSOL_NOTIFY_UPDATE_CMDSTATUS = 6; - // Received the SIP response for capability/availability request - private static final short PRESENCE_IMS_UNSOL_NOTIFY_UPDATE_SIPRESPONSE = 7; - - private final Object mSyncObj = new Object(); - - public StackListener(Context context, Looper looper) { - super(looper); - mContext = context; - } - - public void setPresencePublication(PresencePublication presencePublication){ - mPresencePublication = presencePublication; - } - - public void setPresenceSubscriber(PresenceSubscriber presenceSubscriber){ - mPresenceSubscriber = presenceSubscriber; - } - - @Override - public void handleMessage(Message msg) { - super.handleMessage(msg); - - logger.debug( "Thread=" + Thread.currentThread().getName() + " received " - + msg); - if(msg == null){ - logger.error("msg=null"); - return; - } - - switch (msg.what) { - // RCS stack notify the AP to publish the presence. - case PRESENCE_IMS_UNSOL_PUBLISH_TRIGGER: - { - PresPublishTriggerType val = (PresPublishTriggerType) msg.obj; - if(mPresencePublication == null || val == null){ - logger.error("mPresencePublication=" + mPresencePublication + " val=" + val); - return; - } - - mPresencePublication.invokePublish(val); - break; - } - - // RCS stack tell AP that the CMD status changed. - case PRESENCE_IMS_UNSOL_PUBLISH_CMDSTATUS: - { - PresCmdStatus pCmdStatus = (PresCmdStatus) msg.obj; - if(mPresencePublication == null || pCmdStatus == null){ - logger.error("mPresencePublication=" + mPresencePublication + - " pCmdStatus=" + pCmdStatus); - return; - } - - mPresencePublication.handleCmdStatus(pCmdStatus); - } - break; - - // RCS stack tells AP that the CMD status changed. - case PRESENCE_IMS_UNSOL_NOTIFY_UPDATE_CMDSTATUS: - { - PresCmdStatus pCmdStatus = (PresCmdStatus) msg.obj; - if(mPresenceSubscriber == null || pCmdStatus == null){ - logger.error("mPresenceSubcriber=" + mPresenceSubscriber + - " pCmdStatus=" + pCmdStatus); - return; - } - - mPresenceSubscriber.handleCmdStatus(pCmdStatus); - break; - } - - // RCS stack tells AP that the SIP response has been received. - case PRESENCE_IMS_UNSOL_PUBLISH_SIPRESPONSE: - { - PresSipResponse pSipResponse = (PresSipResponse) msg.obj; - if(mPresencePublication == null || pSipResponse == null){ - logger.error("mPresencePublication=" + mPresencePublication + - "pSipResponse=" +pSipResponse); - return; - } - - mPresencePublication.handleSipResponse(pSipResponse); - break; - } - - // RCS stack tells AP that the SIP response has been received. - case PRESENCE_IMS_UNSOL_NOTIFY_UPDATE_SIPRESPONSE: - { - PresSipResponse pSipResponse = (PresSipResponse) msg.obj; - if(mPresenceSubscriber == null || pSipResponse == null){ - logger.error("mPresenceSubscriber=" + mPresenceSubscriber + - " pSipResponse=" + pSipResponse); - return; - } - - mPresenceSubscriber.handleSipResponse(pSipResponse); - break; - } - - // RCS stack tells AP that the presence data has been received. - case PRESENCE_IMS_UNSOL_NOTIFY_UPDATE: - { - NotifyData notifyData = (NotifyData) msg.obj; - if(mPresenceSubscriber == null || notifyData == null){ - logger.error("mPresenceSubscriber=" + mPresenceSubscriber + - " notifyData=" + notifyData); - return; - } - - mPresenceSubscriber.updatePresence(notifyData.getUri(), - notifyData.getTupleInfo()); - break; - } - - case PRESENCE_IMS_UNSOL_NOTIFY_LIST_UPDATE: - { - NotifyListData notifyListData = (NotifyListData) msg.obj; - logger.debug("Received PRESENCE_IMS_UNSOL_NOTIFY_LIST_UPDATE"); - if(mPresenceSubscriber==null || notifyListData == null){ - logger.error("mPresenceSubscriber=" + mPresenceSubscriber + - " notifyListData=" + notifyListData); - return; - } - - mPresenceSubscriber.updatePresences(notifyListData.getRlmiInfo(), - notifyListData.getResInfo()); - break; - } - - default: - logger.debug("Unknown mesg " + msg.what + " recieved."); - } - } - - public class NotifyData{ - private String mUri; - private PresTupleInfo[] mTupleInfo; - - NotifyData(){ - mUri = null; - mTupleInfo = null; - } - - NotifyData(String uri, PresTupleInfo[] pTupleInfo){ - mUri = uri; - mTupleInfo = pTupleInfo; - } - - public String getUri(){ - return mUri; - } - - public PresTupleInfo[] getTupleInfo(){ - return mTupleInfo; - } - } - - public class NotifyListData{ - private PresRlmiInfo mRlmiInfo; - private PresResInfo[] mResInfo; - - NotifyListData(){ - mRlmiInfo = null; - mResInfo = null; - } - - NotifyListData(PresRlmiInfo pRlmiInfo, PresResInfo[] pResInfo){ - mRlmiInfo = pRlmiInfo; - mResInfo = pResInfo; - } - - public PresRlmiInfo getRlmiInfo(){ - return mRlmiInfo; - } - - public PresResInfo[] getResInfo(){ - return mResInfo; - } - } - - public IPresenceListener mPresenceListener = new IPresenceListener.Stub() { - public boolean onTransact(int code, Parcel data, Parcel reply, int flags) - throws RemoteException{ - try{ - return super.onTransact(code, data, reply, flags); - } catch (RemoteException e) { - Log.w("ListenerHandler", "Unexpected remote exception", e); - e.printStackTrace(); - throw e; - } - } - - public void getVersionCb(String pVersion) { - logger.debug("pVersion=" + pVersion); - } - - public void sipResponseReceived(PresSipResponse pSipResponse) throws RemoteException { - synchronized(mSyncObj){ - if(pSipResponse == null){ - logger.error("ISipResponseReceived pSipResponse=null"); - return; - } - - logger.debug("pSipResponse.getCmdId() "+ - pSipResponse.getCmdId().getCmdId()); - logger.debug("getReasonPhrase() "+pSipResponse.getReasonPhrase()); - logger.debug("getsRequestID() "+pSipResponse.getRequestId()); - logger.debug("getsSipResponseCode() "+pSipResponse.getSipResponseCode()); - - switch (pSipResponse.getCmdId().getCmdId()) { - case PresCmdId.UCE_PRES_CMD_PUBLISHMYCAP: - { - Message updateMesgSipPub = StackListener.this.obtainMessage( - PRESENCE_IMS_UNSOL_PUBLISH_SIPRESPONSE, - pSipResponse); - StackListener.this.sendMessage(updateMesgSipPub); - break; - } - - case PresCmdId.UCE_PRES_CMD_GETCONTACTCAP: - case PresCmdId.UCE_PRES_CMD_GETCONTACTLISTCAP: - { - Message updateMesgSipPub = StackListener.this.obtainMessage( - PRESENCE_IMS_UNSOL_NOTIFY_UPDATE_SIPRESPONSE, - pSipResponse); - StackListener.this.sendMessage(updateMesgSipPub); - - break; - } - - case PresCmdId.UCE_PRES_CMD_SETNEWFEATURETAG: - { - logger.debug("UCE_PRES_CMD_SETNEWFEATURETAG, doesn't care it"); - break; - } - - default: - logger.debug("CMD ID for unknown value=" + - pSipResponse.getCmdId().getCmdId()); - } - } - } - - public void serviceUnAvailable(StatusCode statusCode) throws RemoteException { - synchronized(mSyncObj){ - if(statusCode == null){ - logger.error("statusCode=null"); - }else{ - logger.debug("IServiceUnAvailable statusCode " + - statusCode.getStatusCode()); - } - logger.debug("QPresListener_ServiceUnAvailable"); - - RcsStackAdaptor rcsStackAdaptor = RcsStackAdaptor.getInstance(null); - if (rcsStackAdaptor != null) { - rcsStackAdaptor.setImsEnableState(false); - } - - Intent intent = new Intent(RcsManager.ACTION_RCS_SERVICE_UNAVAILABLE); - mContext.sendBroadcast(intent, - "com.android.ims.rcs.permission.STATUS_CHANGED"); - } - } - - public void serviceAvailable(StatusCode statusCode) throws RemoteException { - synchronized(mSyncObj){ - if(statusCode == null){ - logger.error("statusCode=null"); - }else{ - logger.debug("IServiceAvailable statusCode " + - statusCode.getStatusCode()); - } - - logger.debug("QPresListener_ServiceAvailable"); - - RcsStackAdaptor rcsStackAdaptor = RcsStackAdaptor.getInstance(null); - if (rcsStackAdaptor != null) { - rcsStackAdaptor.setImsEnableState(true); - } - - // Handle the cached trigger which got from stack - if(mPresencePublication != null && mPresencePublication.getHasCachedTrigger()){ - logger.debug("publish for cached trigger"); - - mPresencePublication.invokePublish( - PresencePublication.PublishType.PRES_PUBLISH_TRIGGER_CACHED_TRIGGER); - } - - Intent intent = new Intent(RcsManager.ACTION_RCS_SERVICE_AVAILABLE); - mContext.sendBroadcast(intent, - "com.android.ims.rcs.permission.STATUS_CHANGED"); - } - } - - public void publishTriggering(PresPublishTriggerType publishTrigger) - throws RemoteException { - if(publishTrigger == null){ - logger.error("publishTrigger=null"); - }else{ - logger.debug("getPublishTrigeerType() "+ - publishTrigger.getPublishTrigeerType()); - } - logger.debug("ListenerHandler : PublishTriggering"); - - Message publishTrigerMsg = StackListener.this.obtainMessage( - PRESENCE_IMS_UNSOL_PUBLISH_TRIGGER, publishTrigger); - StackListener.this.sendMessage(publishTrigerMsg); - } - - public void listCapInfoReceived(PresRlmiInfo pRlmiInfo, PresResInfo[] pResInfo) - throws RemoteException { - if(pRlmiInfo == null || pResInfo == null){ - logger.error("pRlmiInfo=" + pRlmiInfo + " pResInfo=" + pResInfo); - }else{ - logger.debug("pRlmiInfo.getListName "+pRlmiInfo.getListName()); - logger.debug("pRlmiInfo.isFullState "+pRlmiInfo.isFullState()); - logger.debug("pRlmiInfo.getUri "+pRlmiInfo.getUri()); - logger.debug("pRlmiInfo.getVersion "+pRlmiInfo.getVersion()); - logger.debug("pRlmiInfo.getSubscriptionTerminatedReason " + - pRlmiInfo.getSubscriptionTerminatedReason()); - logger.debug("pRlmiInfo.getPresSubscriptionState " + - pRlmiInfo.getPresSubscriptionState()); - logger.debug("pRlmiInfo.getRequestID=" + pRlmiInfo.getRequestId()); - for(int i=0; i < pResInfo.length; i++ ){ - if(pResInfo[i] == null){ - logger.debug("ignoring, pResInfo[" + i + "]=null"); - continue; - } - - logger.debug(".getDisplayName() "+pResInfo[i].getDisplayName()); - logger.debug("getResUri() "+pResInfo[i].getResUri()); - if(pResInfo[i].getInstanceInfo() != null){ - logger.debug("getInstanceInfo().getPresentityUri() "+ - pResInfo[i].getInstanceInfo().getPresentityUri()); - logger.debug("getInstanceInfo().getResId() "+ - pResInfo[i].getInstanceInfo().getResId()); - logger.debug("getInstanceInfo().getsReason() "+ - pResInfo[i].getInstanceInfo().getReason()); - logger.debug("getInstanceInfo().getResInstanceState() "+ - pResInfo[i].getInstanceInfo().getResInstanceState()); - if(pResInfo[i].getInstanceInfo().getTupleInfo() == null){ - logger.debug("pResInfo[" + i +"].getInstanceInfo().getTupleInfo()=null"); - continue; - } - - logger.debug("getTupleInfo().length "+ - pResInfo[i].getInstanceInfo().getTupleInfo().length); - if(pResInfo[i].getInstanceInfo().getTupleInfo() != null){ - for(int j = 0; j < pResInfo[i].getInstanceInfo().getTupleInfo().length; - j++) - { - if(pResInfo[i].getInstanceInfo().getTupleInfo() == null){ - logger.debug("ignoring, pResInfo[" + i + - "].getInstanceInfo().getTupleInfo()[" +j + "]"); - continue; - } - - logger.debug("getFeatureTag "+ - pResInfo[i].getInstanceInfo().getTupleInfo()[j]. - getFeatureTag()); - logger.debug("getsContactUri "+ - pResInfo[i].getInstanceInfo().getTupleInfo()[j]. - getContactUri()); - logger.debug("getsTimestamp "+ - pResInfo[i].getInstanceInfo().getTupleInfo()[j]. - getTimestamp()); - } - } - } - } - } - - Message notifyListReceivedMsg = StackListener.this.obtainMessage( - PRESENCE_IMS_UNSOL_NOTIFY_LIST_UPDATE, - new NotifyListData(pRlmiInfo, pResInfo)); - logger.debug("Send PRESENCE_IMS_UNSOL_NOTIFY_LIST_UPDATE"); - - StackListener.this.sendMessage(notifyListReceivedMsg); - } - - public void capInfoReceived(String presentityURI, PresTupleInfo[] pTupleInfo) - throws RemoteException { - logger.debug("ListenerHandler : CapInfoReceived"); - if(presentityURI == null || presentityURI == null){ - logger.error("presentityURI=null or presentityURI=null"); - return; - } - - logger.debug("ListenerHandler : CapInfoReceived : presentityURI "+ presentityURI); - - Message notifyReceivedMsg = StackListener.this.obtainMessage( - PRESENCE_IMS_UNSOL_NOTIFY_UPDATE, - new NotifyData(presentityURI, pTupleInfo)); - StackListener.this.sendMessage(notifyReceivedMsg); - } - - public void cmdStatus(PresCmdStatus pCmdStatus) throws RemoteException { - synchronized(mSyncObj){ - if(pCmdStatus == null || pCmdStatus.getCmdId() == null){ - logger.debug( "ICMDStatus error, pCmdStatus="+ pCmdStatus); - return; - } - - logger.debug("ListenerHandler : CMDStatus"); - logger.debug("ListenerHandler : CMDStatus : pCmdStatus.getRequestID() "+ - pCmdStatus.getRequestId()); - logger.debug("ListenerHandler : CMDStatus : pCmdStatus.getUserData() "+ - pCmdStatus.getUserData()); - logger.debug("ListenerHandler : CMDStatus : pCmdStatus.getCmdId() "+ - pCmdStatus.getCmdId().getCmdId()); - if(pCmdStatus.getStatus() != null){ - logger.debug("ListenerHandler : CMDStatus : pCmdStatus.getStatus() "+ - pCmdStatus.getStatus().getStatusCode()); - } - - switch (pCmdStatus.getCmdId().getCmdId()) { - case PresCmdId.UCE_PRES_CMD_PUBLISHMYCAP: - Message publishCmdMsg = StackListener.this.obtainMessage( - PRESENCE_IMS_UNSOL_PUBLISH_CMDSTATUS, - pCmdStatus); - StackListener.this.sendMessage(publishCmdMsg); - break; - - case PresCmdId.UCE_PRES_CMD_GETCONTACTCAP: - case PresCmdId.UCE_PRES_CMD_GETCONTACTLISTCAP: - Message notifyUpdateCmdMsg = StackListener.this.obtainMessage( - PRESENCE_IMS_UNSOL_NOTIFY_UPDATE_CMDSTATUS, - pCmdStatus); - StackListener.this.sendMessage(notifyUpdateCmdMsg); - break; - - case PresCmdId.UCE_PRES_CMD_SETNEWFEATURETAG: - logger.debug("UCE_PRES_CMD_SETNEWFEATURETAG: app does not care it"); - break; - - default: - logger.debug("CMD ID for unknown value=" + - pCmdStatus.getCmdId().getCmdId()); - } - } - } - }; -} - |