diff options
author | Calvin Pan <calvinpan@google.com> | 2021-07-02 17:41:02 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2021-07-02 17:41:02 +0000 |
commit | 23a0ea2ea06bdcdc3093b1753306ca0d7a82b984 (patch) | |
tree | 2c4d53b792882bef5743a8ed8d82bc310609bd0d | |
parent | 0f7ed6b0dae0bf0350fd6dad378f4bde9083b6bd (diff) | |
parent | 6a449f8422fc3792e5a89748395d86ff854bb4af (diff) | |
download | ims-23a0ea2ea06bdcdc3093b1753306ca0d7a82b984.tar.gz |
Merge "Using local timestamp instead of network when saving RCS capability" into sc-dev
4 files changed, 81 insertions, 42 deletions
diff --git a/src/java/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater.java b/src/java/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater.java index 5f2a5653..6d3eabf3 100644 --- a/src/java/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater.java +++ b/src/java/com/android/ims/rcs/uce/eab/EabBulkCapabilityUpdater.java @@ -19,8 +19,6 @@ package com.android.ims.rcs.uce.eab; import static android.telephony.ims.RcsContactUceCapability.CAPABILITY_MECHANISM_OPTIONS; import static android.telephony.ims.RcsContactUceCapability.CAPABILITY_MECHANISM_PRESENCE; -import static com.android.ims.rcs.uce.eab.EabControllerImpl.getCapabilityCacheExpiration; - import android.app.AlarmManager; import android.content.BroadcastReceiver; import android.content.Context; @@ -290,7 +288,7 @@ public final class EabBulkCapabilityUpdater { Log.d(TAG, "Can't find min timestamp in eab provider"); return; } - expiredTimestamp += getCapabilityCacheExpiration(mSubId); + expiredTimestamp += mEabControllerImpl.getCapabilityCacheExpiration(mSubId); Log.d(TAG, "set time alert at " + expiredTimestamp); cancelTimeAlert(mContext); setTimeAlert(mContext, expiredTimestamp); @@ -397,7 +395,7 @@ public final class EabBulkCapabilityUpdater { private List<Uri> getExpiredContactList() { List<Uri> refreshList = new ArrayList<>(); long expiredTime = (System.currentTimeMillis() / 1000) - + getCapabilityCacheExpiration(mSubId); + + mEabControllerImpl.getCapabilityCacheExpiration(mSubId); String selection = "(" + EabProvider.EabCommonColumns.MECHANISM + "=" + CAPABILITY_MECHANISM_PRESENCE + " AND " + EabProvider.PresenceTupleColumns.REQUEST_TIMESTAMP + "<" diff --git a/src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java b/src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java index f59171f3..cc1011fc 100644 --- a/src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java +++ b/src/java/com/android/ims/rcs/uce/eab/EabControllerImpl.java @@ -41,9 +41,7 @@ import android.telephony.ims.RcsContactUceCapability; import android.telephony.ims.RcsContactUceCapability.OptionsBuilder; import android.telephony.ims.RcsContactUceCapability.PresenceBuilder; import android.text.TextUtils; -import android.text.format.Time; import android.util.Log; -import android.util.TimeFormatException; import com.android.i18n.phonenumbers.NumberParseException; import com.android.i18n.phonenumbers.PhoneNumberUtil; @@ -56,10 +54,8 @@ import java.time.Instant; import java.time.format.DateTimeParseException; import java.time.temporal.ChronoUnit; import java.util.ArrayList; -import java.util.GregorianCalendar; import java.util.List; import java.util.Objects; -import java.util.TimeZone; import java.util.function.Predicate; /** @@ -84,12 +80,19 @@ public class EabControllerImpl implements EabController { private UceControllerCallback mUceControllerCallback; private volatile boolean mIsSetDestroyedFlag = false; + private ExpirationTimeFactory mExpirationTimeFactory = () -> Instant.now().getEpochSecond(); + @VisibleForTesting public final Runnable mCapabilityCleanupRunnable = () -> { Log.d(TAG, "Cleanup Capabilities"); cleanupExpiredCapabilities(); }; + @VisibleForTesting + public interface ExpirationTimeFactory { + long getExpirationTime(); + } + public EabControllerImpl(Context context, int subId, UceControllerCallback c, Looper looper) { mContext = context; mSubId = subId; @@ -481,7 +484,7 @@ public class EabControllerImpl implements EabController { return value; } - protected static int getCapabilityCacheExpiration(int subId) { + protected int getCapabilityCacheExpiration(int subId) { int value = -1; try { ProvisioningManager pm = ProvisioningManager.createForSubscriptionId(subId); @@ -498,7 +501,7 @@ public class EabControllerImpl implements EabController { return value; } - protected static long getAvailabilityCacheExpiration(int subId) { + protected long getAvailabilityCacheExpiration(int subId) { long value = -1; try { ProvisioningManager pm = ProvisioningManager.createForSubscriptionId(subId); @@ -577,14 +580,6 @@ public class EabControllerImpl implements EabController { } } - // Using the current timestamp if the timestamp doesn't populate - Long timestamp; - if (tuple.getTime() != null) { - timestamp = tuple.getTime().getEpochSecond(); - } else { - timestamp = Instant.now().getEpochSecond(); - } - contentValues = new ContentValues(); contentValues.put(EabProvider.PresenceTupleColumns.EAB_COMMON_ID, commonId); contentValues.put(EabProvider.PresenceTupleColumns.BASIC_STATUS, tuple.getStatus()); @@ -593,7 +588,11 @@ public class EabControllerImpl implements EabController { tuple.getServiceVersion()); contentValues.put(EabProvider.PresenceTupleColumns.DESCRIPTION, tuple.getServiceDescription()); - contentValues.put(EabProvider.PresenceTupleColumns.REQUEST_TIMESTAMP, timestamp); + + // Using current timestamp instead of network timestamp since there is not use cases for + // network timestamp and the network timestamp may cause capability expire immediately. + contentValues.put(EabProvider.PresenceTupleColumns.REQUEST_TIMESTAMP, + mExpirationTimeFactory.getExpirationTime()); contentValues.put(EabProvider.PresenceTupleColumns.CONTACT_URI, tuple.getContactUri().toString()); if (serviceCapabilities != null) { @@ -790,4 +789,9 @@ public class EabControllerImpl implements EabController { } return number; } + + @VisibleForTesting + public void setExpirationTimeFactory(ExpirationTimeFactory factory) { + mExpirationTimeFactory = factory; + } } diff --git a/src/java/com/android/ims/rcs/uce/eab/EabUtil.java b/src/java/com/android/ims/rcs/uce/eab/EabUtil.java index de738067..e2c21cdb 100644 --- a/src/java/com/android/ims/rcs/uce/eab/EabUtil.java +++ b/src/java/com/android/ims/rcs/uce/eab/EabUtil.java @@ -75,6 +75,46 @@ public class EabUtil { } /** + * Get the given EAB capability from the EAB database. + * + * Output format: + * [PHONE_NUMBER], [RAW_PRESENCE_ID], [PRESENCE_TIMESTAMP], [RAW_OPTION_ID], [OPTION_TIMESTAMP] + */ + public static String getCapabilityFromEab(Context context, String contact) { + StringBuilder result = new StringBuilder(); + try (Cursor cursor = context.getContentResolver().query( + EabProvider.ALL_DATA_URI, + new String[]{ContactColumns.PHONE_NUMBER, + PresenceTupleColumns._ID, + PresenceTupleColumns.REQUEST_TIMESTAMP, + OptionsColumns._ID, + OptionsColumns.REQUEST_TIMESTAMP}, + ContactColumns.PHONE_NUMBER + "=?", + new String[]{contact}, null)) { + if (cursor != null && cursor.moveToFirst()) { + result.append(cursor.getString(cursor.getColumnIndex( + ContactColumns.PHONE_NUMBER))); + result.append(","); + result.append(cursor.getString(cursor.getColumnIndex( + PresenceTupleColumns._ID))); + result.append(","); + result.append(cursor.getString(cursor.getColumnIndex( + PresenceTupleColumns.REQUEST_TIMESTAMP))); + result.append(","); + result.append(cursor.getString(cursor.getColumnIndex( + OptionsColumns._ID))); + result.append(","); + result.append(cursor.getString(cursor.getColumnIndex( + OptionsColumns.REQUEST_TIMESTAMP))); + } + } catch (Exception e) { + Log.w(LOG_TAG, "getCapability exception " + e); + } + Log.d(LOG_TAG, "getCapabilityFromEab() result: " + result); + return result.toString(); + } + + /** * Remove the given EAB contacts from the EAB database. */ public static int removeContactFromEab(int subId, String contacts, Context context) { diff --git a/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java b/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java index af52217d..5138445f 100644 --- a/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java +++ b/tests/src/com/android/ims/rcs/uce/eab/EabControllerTest.java @@ -28,12 +28,14 @@ import static com.android.ims.rcs.uce.eab.EabProvider.OPTIONS_URI; import static com.android.ims.rcs.uce.eab.EabProvider.PRESENCE_URI; import static org.junit.Assert.fail; +import static org.mockito.Mockito.doReturn; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.os.Looper; import android.os.PersistableBundle; +import android.telephony.ims.ProvisioningManager; import android.telephony.ims.RcsContactPresenceTuple; import android.telephony.ims.RcsContactUceCapability; import android.test.mock.MockContentResolver; @@ -48,9 +50,10 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; -import java.time.temporal.ChronoUnit; import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Calendar; import java.util.GregorianCalendar; @@ -67,6 +70,9 @@ public class EabControllerTest extends ImsTestBase { PersistableBundle mBundle; ExecutorService mExecutor = Executors.newSingleThreadExecutor(); + @Mock + EabControllerImpl.ExpirationTimeFactory mExpirationTimeFactory; + private static final int TEST_SUB_ID = 1; private static final String TEST_PHONE_NUMBER = "16661234567"; private static final String TEST_SERVICE_STATUS = "status"; @@ -90,6 +96,8 @@ public class EabControllerTest extends ImsTestBase { insertContactInfoToDB(); mEabController = new EabControllerImpl( mContext, TEST_SUB_ID, null, Looper.getMainLooper()); + mEabController.setExpirationTimeFactory(mExpirationTimeFactory); + doReturn(Instant.now().getEpochSecond()).when(mExpirationTimeFactory).getExpirationTime(); mBundle = mContextFixture.getTestCarrierConfigBundle(); } @@ -103,7 +111,7 @@ public class EabControllerTest extends ImsTestBase { @SmallTest public void testGetAvailability() { List<RcsContactUceCapability> contactList = new ArrayList<>(); - contactList.add(createPresenceCapability(false)); + contactList.add(createPresenceCapability()); mEabController.saveCapabilities(contactList); @@ -117,7 +125,7 @@ public class EabControllerTest extends ImsTestBase { @SmallTest public void testGetCapability() { List<RcsContactUceCapability> contactList = new ArrayList<>(); - contactList.add(createPresenceCapability(false)); + contactList.add(createPresenceCapability()); mEabController.saveCapabilities(contactList); @@ -133,7 +141,9 @@ public class EabControllerTest extends ImsTestBase { @SmallTest public void testGetExpiredCapability() { List<RcsContactUceCapability> contactList = new ArrayList<>(); - contactList.add(createPresenceCapability(true)); + doReturn(0L).when(mExpirationTimeFactory).getExpirationTime(); + + contactList.add(createPresenceCapability()); mEabController.saveCapabilities(contactList); @@ -150,13 +160,9 @@ public class EabControllerTest extends ImsTestBase { public void testNonRcsCapability() { // Set non-rcs capabilities expiration to 121 days mBundle.putInt(KEY_NON_RCS_CAPABILITIES_CACHE_EXPIRATION_SEC_INT, 121 * 24 * 60 * 60); - // Set timestamp to 120 days age - GregorianCalendar date = new GregorianCalendar(); - date.setTimeZone(TimeZone.getTimeZone("UTC")); - date.add(Calendar.DATE, -120); List<RcsContactUceCapability> contactList = new ArrayList<>(); - contactList.add(createPresenceNonRcsCapability(Instant.now())); + contactList.add(createPresenceNonRcsCapability()); mEabController.saveCapabilities(contactList); @@ -176,10 +182,11 @@ public class EabControllerTest extends ImsTestBase { // Set non-rcs capabilities expiration to 119 days mBundle.putInt(KEY_NON_RCS_CAPABILITIES_CACHE_EXPIRATION_SEC_INT, 119 * 24 * 60 * 60); // Set timestamp to 120 days age - Instant timestamp = Instant.now().minus(120, ChronoUnit.DAYS); + long timestamp = Instant.now().minus(120, ChronoUnit.DAYS).getEpochSecond(); + doReturn(timestamp).when(mExpirationTimeFactory).getExpirationTime(); List<RcsContactUceCapability> contactList = new ArrayList<>(); - contactList.add(createPresenceNonRcsCapability(timestamp)); + contactList.add(createPresenceNonRcsCapability()); mEabController.saveCapabilities(contactList); // Verify result is expired @@ -282,14 +289,7 @@ public class EabControllerTest extends ImsTestBase { } } - private RcsContactUceCapability createPresenceCapability(boolean isExpired) { - Instant timestamp; - if (isExpired) { - timestamp = Instant.now().minus(120, ChronoUnit.DAYS); - } else { - timestamp = Instant.now().plus(120, ChronoUnit.DAYS); - } - + private RcsContactUceCapability createPresenceCapability() { RcsContactPresenceTuple.ServiceCapabilities.Builder serviceCapabilitiesBuilder = new RcsContactPresenceTuple.ServiceCapabilities.Builder(TEST_AUDIO_CAPABLE, TEST_VIDEO_CAPABLE); @@ -299,7 +299,6 @@ public class EabControllerTest extends ImsTestBase { .setServiceDescription(TEST_SERVICE_DESCRIPTION) .setContactUri(TEST_CONTACT_URI) .setServiceCapabilities(serviceCapabilitiesBuilder.build()) - .setTime(timestamp) .build(); RcsContactPresenceTuple tupleWithEmptyServiceCapabilities = @@ -307,7 +306,6 @@ public class EabControllerTest extends ImsTestBase { TEST_SERVICE_VERSION) .setServiceDescription(TEST_SERVICE_DESCRIPTION) .setContactUri(TEST_CONTACT_URI) - .setTime(timestamp) .build(); RcsContactUceCapability.PresenceBuilder builder = @@ -318,7 +316,7 @@ public class EabControllerTest extends ImsTestBase { return builder.build(); } - private RcsContactUceCapability createPresenceNonRcsCapability(Instant timestamp) { + private RcsContactUceCapability createPresenceNonRcsCapability() { RcsContactPresenceTuple.ServiceCapabilities.Builder serviceCapabilitiesBuilder = new RcsContactPresenceTuple.ServiceCapabilities.Builder(false, false); RcsContactPresenceTuple tupleWithServiceCapabilities = @@ -327,7 +325,6 @@ public class EabControllerTest extends ImsTestBase { .setServiceDescription(TEST_SERVICE_DESCRIPTION) .setContactUri(TEST_CONTACT_URI) .setServiceCapabilities(serviceCapabilitiesBuilder.build()) - .setTime(timestamp) .build(); RcsContactUceCapability.PresenceBuilder builder = |