Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 840cab8c authored by calvinpan's avatar calvinpan Committed by Automerger Merge Worker
Browse files

Fix issues in EabController am: 5f74ec24

Original change: https://android-review.googlesource.com/c/platform/frameworks/opt/net/ims/+/1559369

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I2fe0964b3899d3c40f12b1620bb4f5274fe11b68
parents 0982900f 5f74ec24
Loading
Loading
Loading
Loading
+43 −30
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ 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 android.telephony.ims.RcsContactUceCapability.SOURCE_TYPE_CACHED;

import android.annotation.NonNull;
import android.content.ContentValues;
@@ -32,7 +33,9 @@ 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.ims.RcsFeatureManager;
import com.android.ims.rcs.uce.UceController.UceControllerCallback;
@@ -40,6 +43,7 @@ import com.android.ims.rcs.uce.UceController.UceControllerCallback;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Objects;
import java.util.function.Predicate;
@@ -148,6 +152,7 @@ public class EabControllerImpl implements EabController {
            Log.d(TAG, "EabController destroyed.");
            return;
        }

        Log.d(TAG, "Save capabilities: " + contactCapabilities.size());

        // Update the capabilities
@@ -210,22 +215,21 @@ public class EabControllerImpl implements EabController {
        Cursor cursor = mContext.getContentResolver().query(
                queryUri, null, null, null, null);

        boolean isExpired = false;
        if (cursor != null && cursor.getCount() != 0) {
            while (cursor.moveToNext()) {
                if (isExpiredMethod.test(cursor)) {
                    continue;
                }

                if (builder == null) {
                    builder = createNewBuilder(contactUri, cursor);
                } else {
                    updateCapability(contactUri, cursor, builder);
                }
                if (isExpiredMethod.test(cursor)) {
                    isExpired = true;
                    break;
                }
            }
            cursor.close();

            if (isExpired) {
            if (builder == null) {
                result = new EabCapabilityResult(contactUri,
                        EabCapabilityResult.EAB_CONTACT_EXPIRED_FAILURE,
                        null);
@@ -273,7 +277,7 @@ public class EabControllerImpl implements EabController {

        if (mechanism == CAPABILITY_MECHANISM_PRESENCE) {
            PresenceBuilder builder = new PresenceBuilder(
                    contactUri, CAPABILITY_MECHANISM_PRESENCE, result);
                    contactUri, SOURCE_TYPE_CACHED, result);
            builder.addCapabilityTuple(createPresenceTuple(contactUri, cursor));
            builderWrapper.setPresenceBuilder(builder);
        } else {
@@ -296,10 +300,10 @@ public class EabControllerImpl implements EabController {
                EabProvider.PresenceTupleColumns.REQUEST_TIMESTAMP);

        // ServiceCapabilities fields
        String audioCapableStr = getStringValue(cursor,
                EabProvider.PresenceTupleColumns.AUDIO_CAPABLE);
        String videoCapableStr = getStringValue(cursor,
                EabProvider.PresenceTupleColumns.VIDEO_CAPABLE);
        boolean audioCapable = getIntValue(cursor,
                EabProvider.PresenceTupleColumns.AUDIO_CAPABLE) == 1;
        boolean videoCapable = getIntValue(cursor,
                EabProvider.PresenceTupleColumns.VIDEO_CAPABLE) == 1;
        String duplexModes = getStringValue(cursor,
                EabProvider.PresenceTupleColumns.DUPLEX_MODE);
        String unsupportedDuplexModes = getStringValue(cursor,
@@ -318,24 +322,19 @@ public class EabControllerImpl implements EabController {
        }

        // Create ServiceCapabilities
        ServiceCapabilities serviceCapabilities = null;
        if (!TextUtils.isEmpty(audioCapableStr)
                || !TextUtils.isEmpty(videoCapableStr)
                || !TextUtils.isEmpty(duplexModes)
                || !TextUtils.isEmpty(unsupportedDuplexModes)) {
            boolean audioCapable = Boolean.parseBoolean(audioCapableStr);
            boolean videoCapable = Boolean.parseBoolean(videoCapableStr);

        ServiceCapabilities serviceCapabilities;
        ServiceCapabilities.Builder serviceCapabilitiesBuilder =
                new ServiceCapabilities.Builder(audioCapable, videoCapable);
        if (!TextUtils.isEmpty(duplexModes)
                || !TextUtils.isEmpty(unsupportedDuplexModes)) {
            for (String duplexMode : duplexModeList) {
                serviceCapabilitiesBuilder.addSupportedDuplexMode(duplexMode);
            }
            for (String unsupportedDuplex : unsupportedDuplexModeList) {
                serviceCapabilitiesBuilder.addUnsupportedDuplexMode(unsupportedDuplex);
            }
            serviceCapabilities = serviceCapabilitiesBuilder.build();
        }
        serviceCapabilities = serviceCapabilitiesBuilder.build();

        // Create RcsContactPresenceTuple
        RcsContactPresenceTuple.Builder rcsContactPresenceTupleBuilder =
@@ -441,7 +440,7 @@ public class EabControllerImpl implements EabController {
        ContentValues contentValues = new ContentValues();
        contentValues.put(EabProvider.ContactColumns.PHONE_NUMBER, phoneNumber);
        Uri result = mContext.getContentResolver().insert(EabProvider.CONTACT_URI, contentValues);
        return Integer.valueOf(result.getLastPathSegment());
        return Integer.parseInt(result.getLastPathSegment());
    }

    private void deleteOldPresenceCapability(int id) {
@@ -474,7 +473,7 @@ public class EabControllerImpl implements EabController {
        contentValues.put(EabProvider.EabCommonColumns.REQUEST_RESULT,
                capability.getRequestResult());
        Uri result = mContext.getContentResolver().insert(EabProvider.COMMON_URI, contentValues);
        int commonId = Integer.valueOf(result.getLastPathSegment());
        int commonId = Integer.parseInt(result.getLastPathSegment());
        Log.d(TAG, "Insert into common table. Id: " + commonId);

        ContentValues[] presenceContent =
@@ -487,22 +486,36 @@ public class EabControllerImpl implements EabController {
            String duplexMode = null, unsupportedDuplexMode = null;
            if (serviceCapabilities != null) {
                List<String> duplexModes = serviceCapabilities.getSupportedDuplexModes();
                if (duplexModes != null && duplexModes.size() != 0) {
                if (duplexModes.size() != 0) {
                    duplexMode = TextUtils.join(",", duplexModes);
                }

                List<String> unsupportedDuplexModes =
                        serviceCapabilities.getSupportedDuplexModes();
                if (unsupportedDuplexModes != null && unsupportedDuplexModes.size() != 0) {
                        serviceCapabilities.getUnsupportedDuplexModes();
                if (unsupportedDuplexModes.size() != 0) {
                    unsupportedDuplexMode =
                            TextUtils.join(",", unsupportedDuplexModes);
                }
            }

            // Using the current timestamp if the timestamp doesn't populate
            String timeStamp = tuple.getTimestamp();
            if (timeStamp == null) {
                timeStamp = String.valueOf(Instant.now().getEpochSecond());
            Long timestamp;
            if (tuple.getTimestamp() != null) {
                try {
                    Time time = new Time();
                    time.parse3339(tuple.getTimestamp());

                    GregorianCalendar date = new GregorianCalendar(
                            time.year, time.month, time.monthDay,
                            time.hour, time.minute, time.second);
                    timestamp = date.getTime().getTime() / 1000;
                } catch (TimeFormatException ex) {
                    Log.d(TAG, "Fail on parsing the timestamp. "
                            + "Timestamp: " + tuple.getTimestamp());
                    timestamp = Instant.now().getEpochSecond();
                }
            } else {
                timestamp = Instant.now().getEpochSecond();
            }

            contentValues = new ContentValues();
@@ -513,7 +526,7 @@ public class EabControllerImpl implements EabController {
                    tuple.getServiceVersion());
            contentValues.put(EabProvider.PresenceTupleColumns.DESCRIPTION,
                    tuple.getServiceDescription());
            contentValues.put(EabProvider.PresenceTupleColumns.REQUEST_TIMESTAMP, timeStamp);
            contentValues.put(EabProvider.PresenceTupleColumns.REQUEST_TIMESTAMP, timestamp);
            contentValues.put(EabProvider.PresenceTupleColumns.CONTACT_URI,
                    tuple.getContactUri().toString());
            if (serviceCapabilities != null) {
+4 −5
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.ims.rcs.uce.eab;

import static android.content.ContentResolver.NOTIFY_DELETE;
import static android.content.ContentResolver.NOTIFY_INSERT;
import static android.content.ContentResolver.NOTIFY_SYNC_TO_NETWORK;
import static android.content.ContentResolver.NOTIFY_UPDATE;

import android.content.ContentProvider;
@@ -30,7 +29,6 @@ import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.os.UserHandle;
import android.provider.BaseColumns;
import android.text.TextUtils;
import android.util.Log;
@@ -118,12 +116,12 @@ public class EabProvider extends ContentProvider {

            // join options table
            + " LEFT JOIN " + EAB_OPTIONS_TABLE_NAME
            + " ON " + EAB_OPTIONS_TABLE_NAME + "." + EabCommonColumns._ID
            + " ON " + EAB_COMMON_TABLE_NAME + "." + EabCommonColumns._ID
            + "=" + EAB_OPTIONS_TABLE_NAME + "." + OptionsColumns.EAB_COMMON_ID

            // join presence table
            + " LEFT JOIN " + EAB_PRESENCE_TUPLE_TABLE_NAME
            + " ON " + EAB_PRESENCE_TUPLE_TABLE_NAME + "." + EabCommonColumns._ID
            + " ON " + EAB_COMMON_TABLE_NAME + "." + EabCommonColumns._ID
            + "=" + EAB_PRESENCE_TUPLE_TABLE_NAME + "."
            + PresenceTupleColumns.EAB_COMMON_ID;

@@ -282,7 +280,8 @@ public class EabProvider extends ContentProvider {
        public static final String UNSUPPORTED_DUPLEX_MODE = "unsupported_duplex_mode";

        /**
         * The presence request timestamp.
         * The presence request timestamp. Represents seconds of UTC time since Unix epoch
         * 1970-01-01 00:00:00.
         * <P>Type:  LONG</P>
         */
        public static final String REQUEST_TIMESTAMP = "presence_request_timestamp";
+36 −0
Original line number Diff line number Diff line
@@ -37,6 +37,42 @@ public class EabUtil {

    private static final String LOG_TAG = UceUtils.getLogPrefix() + "EabUtil";

    /**
     * Get the given EAB contacts from the EAB database.
     *
     * Output format:
     * [PHONE_NUMBER], [RAW_CONTACT_ID], [CONTACT_ID], [DATA_ID]
     */
    public static String getContactFromEab(Context context, String contact) {
        StringBuilder result = new StringBuilder();
        try (Cursor cursor = context.getContentResolver().query(
                EabProvider.CONTACT_URI,
                new String[]{ContactColumns.PHONE_NUMBER,
                        ContactColumns.RAW_CONTACT_ID,
                        ContactColumns.CONTACT_ID,
                        ContactColumns.DATA_ID},
                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(
                        ContactColumns.RAW_CONTACT_ID)));
                result.append(",");
                result.append(cursor.getString(cursor.getColumnIndex(
                        ContactColumns.CONTACT_ID)));
                result.append(",");
                result.append(cursor.getString(cursor.getColumnIndex(
                        ContactColumns.DATA_ID)));
            }
        } catch (Exception e) {
            Log.w(LOG_TAG, "getEabContactId exception " + e);
        }
        Log.d(LOG_TAG, "getContactFromEab() result: " + result);
        return result.toString();
    }

    /**
     * Remove the given EAB contacts from the EAB database.
     */
+14 −5
Original line number Diff line number Diff line
@@ -21,8 +21,6 @@ import static android.telephony.ims.RcsContactUceCapability.SOURCE_TYPE_NETWORK;

import static com.android.ims.rcs.uce.eab.EabProvider.CONTACT_URI;

import static java.time.temporal.ChronoUnit.DAYS;

import android.content.ContentValues;
import android.net.Uri;
import android.os.Looper;
@@ -41,8 +39,10 @@ import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.time.Instant;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;

@RunWith(AndroidJUnit4.class)
@@ -126,8 +126,17 @@ public class EabControllerTest extends ImsTestBase {
    }

    private RcsContactUceCapability createPresenceCapability(boolean isExpired) {
        long timeStamp = isExpired ? Instant.now().minus(100, DAYS).getEpochSecond()
                : Instant.now().plus(100, DAYS).getEpochSecond();
        String timeStamp;
        GregorianCalendar date = new GregorianCalendar();
        if (isExpired) {
            date.add(Calendar.DATE, -120);
        } else {
            date.add(Calendar.DATE, 120);
        }

        timeStamp = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX")
                .format(date.getTime());

        RcsContactPresenceTuple.ServiceCapabilities.Builder serviceCapabilitiesBuilder =
                new RcsContactPresenceTuple.ServiceCapabilities.Builder(TEST_AUDIO_CAPABLE,
                        TEST_VIDEO_CAPABLE);