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

Commit 2b0c822d authored by ashastry's avatar ashastry Committed by android-build-merger
Browse files

Merge "Refactor CarrierServicesSmsFilter to enable parallel filtering."

am: 73ab9b1b

Change-Id: I8013ed1e9a1b65b138ce75f0713357cff29e0613
parents ccb259dc 73ab9b1b
Loading
Loading
Loading
Loading
+59 −23
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import com.android.internal.telephony.uicc.UiccController;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;

/**
 * Filters incoming SMS with carrier services.
@@ -75,6 +76,20 @@ public class CarrierServicesSmsFilter {
     * @return {@code true} if the SMS was handled by carrier services.
     */
    boolean filter() {
        Optional<String> carrierAppForFiltering = getCarrierAppPackageForFiltering();
        List<String> smsFilterPackages = new ArrayList<>();
        if (carrierAppForFiltering.isPresent()) {
            smsFilterPackages.add(carrierAppForFiltering.get());
        }
        FilterAggregator filterAggregator = new FilterAggregator(smsFilterPackages.size());
        for (String smsFilterPackage : smsFilterPackages) {
            filterWithPackage(smsFilterPackage, filterAggregator);
        }
        boolean handled = smsFilterPackages.size() > 0;
        return handled;
    }

    private Optional<String> getCarrierAppPackageForFiltering() {
        List<String> carrierPackages = null;
        UiccCard card = UiccController.getInstance().getUiccCard(mPhoneId);
        if (card != null) {
@@ -86,8 +101,7 @@ public class CarrierServicesSmsFilter {
        }
        if (carrierPackages != null && carrierPackages.size() == 1) {
            log("Found carrier package.");
            filterWithCarrierApp(carrierPackages.get(0));
            return true;
            return Optional.of(carrierPackages.get(0));
        }

        // It is possible that carrier app is not present as a CarrierPackage, but instead as a
@@ -97,19 +111,18 @@ public class CarrierServicesSmsFilter {

        if (systemPackages != null && systemPackages.size() == 1) {
            log("Found system package.");
            filterWithCarrierApp(systemPackages.get(0));
            return true;
            return Optional.of(systemPackages.get(0));
        }
        logv("Unable to find carrier package: " + carrierPackages
                + ", nor systemPackages: " + systemPackages);
        return false;
        return Optional.empty();
    }

    private void filterWithCarrierApp(String carrierPackageName) {
    private void filterWithPackage(String packageName, FilterAggregator filterAggregator) {
        CarrierSmsFilter smsFilter = new CarrierSmsFilter(mPdus, mDestPort, mPduFormat);
        CarrierSmsFilterCallback smsFilterCallback =
                new CarrierSmsFilterCallback(mCarrierServicesSmsFilterCallback, smsFilter);
        smsFilter.filterSms(carrierPackageName, smsFilterCallback);
                new CarrierSmsFilterCallback(filterAggregator, smsFilter);
        smsFilter.filterSms(packageName, smsFilterCallback);
    }

    private List<String> getSystemAppForIntent(Intent intent) {
@@ -152,7 +165,6 @@ public class CarrierServicesSmsFilter {
        void onFilterComplete(int result);
    }


    /**
     * Asynchronously binds to the carrier messaging service, and filters out the message if
     * instructed to do so by the carrier messaging service. A new instance must be used for every
@@ -208,13 +220,12 @@ public class CarrierServicesSmsFilter {
     * the result is ready, the carrier messaging service connection is disposed.
     */
    private final class CarrierSmsFilterCallback extends ICarrierMessagingCallback.Stub {
        private final CarrierServicesSmsFilterCallbackInterface mCarrierServicesSmsFilterCallback;
        private final FilterAggregator mFilterAggregator;
        private final CarrierMessagingServiceManager mCarrierMessagingServiceManager;

        CarrierSmsFilterCallback(
                CarrierServicesSmsFilterCallbackInterface carrierServicesSmsFilterCallback,
        CarrierSmsFilterCallback(FilterAggregator filterAggregator,
                                 CarrierMessagingServiceManager carrierMessagingServiceManager) {
            mCarrierServicesSmsFilterCallback = carrierServicesSmsFilterCallback;
            mFilterAggregator = filterAggregator;
            mCarrierMessagingServiceManager = carrierMessagingServiceManager;
        }

@@ -224,15 +235,7 @@ public class CarrierServicesSmsFilter {
        @Override
        public void onFilterComplete(int result) {
            mCarrierMessagingServiceManager.disposeConnection(mContext);
            // Calling identity was the CarrierMessagingService in this callback, change it back to
            // ours. This is required for dropSms() and VisualVoicemailSmsFilter.filter().
            long token = Binder.clearCallingIdentity();
            try {
                mCarrierServicesSmsFilterCallback.onFilterComplete(result);
            } finally {
                // return back to the CarrierMessagingService, restore the calling identity.
                Binder.restoreCallingIdentity(token);
            }
            mFilterAggregator.onFilterComplete(result);
        }

        @Override
@@ -255,4 +258,37 @@ public class CarrierServicesSmsFilter {
            loge("Unexpected onDownloadMmsComplete call with result: " + result);
        }
    }

    private final class FilterAggregator {
        private final Object mFilterLock = new Object();
        private int mNumPendingFilters;
        private int mFilterResult;

        FilterAggregator(int numFilters) {
            mNumPendingFilters = numFilters;
            mFilterResult = CarrierMessagingService.RECEIVE_OPTIONS_DEFAULT;
        }

        void onFilterComplete(int result) {
            synchronized (mFilterLock) {
                mNumPendingFilters--;
                combine(result);
                if (mNumPendingFilters == 0) {
                    // Calling identity was the CarrierMessagingService in this callback, change it
                    // back to ours.
                    long token = Binder.clearCallingIdentity();
                    try {
                        mCarrierServicesSmsFilterCallback.onFilterComplete(mFilterResult);
                    } finally {
                        // return back to the CarrierMessagingService, restore the calling identity.
                        Binder.restoreCallingIdentity(token);
                    }
                }
            }
        }

        private void combine(int result) {
            mFilterResult = mFilterResult | result;
        }
    }
}