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

Commit 12efda4c authored by Amit Mahajan's avatar Amit Mahajan Committed by Gerrit Code Review
Browse files

Merge "Create @SystemApi wrapper for ICarrierMessagingService."

parents e024878d ae0e5326
Loading
Loading
Loading
Loading
+0 −99
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2014 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.
 */

package android.telephony;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.service.carrier.CarrierMessagingService;
import android.service.carrier.ICarrierMessagingService;

import com.android.internal.util.Preconditions;

/**
 * Provides basic structure for platform to connect to the carrier messaging service.
 * <p>
 * <code>
 * CarrierMessagingServiceManager carrierMessagingServiceManager =
 *     new CarrierMessagingServiceManagerImpl();
 * if (carrierMessagingServiceManager.bindToCarrierMessagingService(context, carrierPackageName)) {
 *   // wait for onServiceReady callback
 * } else {
 *   // Unable to bind: handle error.
 * }
 * </code>
 * <p> Upon completion {@link #disposeConnection} should be called to unbind the
 * CarrierMessagingService.
 * @hide
 */
public abstract class CarrierMessagingServiceManager {
    // Populated by bindToCarrierMessagingService. bindToCarrierMessagingService must complete
    // prior to calling disposeConnection so that mCarrierMessagingServiceConnection is initialized.
    private volatile CarrierMessagingServiceConnection mCarrierMessagingServiceConnection;

    /**
     * Binds to the carrier messaging service under package {@code carrierPackageName}. This method
     * should be called exactly once.
     *
     * @param context the context
     * @param carrierPackageName the carrier package name
     * @return true upon successfully binding to a carrier messaging service, false otherwise
     */
    public boolean bindToCarrierMessagingService(Context context, String carrierPackageName) {
        Preconditions.checkState(mCarrierMessagingServiceConnection == null);

        Intent intent = new Intent(CarrierMessagingService.SERVICE_INTERFACE);
        intent.setPackage(carrierPackageName);
        mCarrierMessagingServiceConnection = new CarrierMessagingServiceConnection();
        return context.bindService(intent, mCarrierMessagingServiceConnection,
                Context.BIND_AUTO_CREATE);
    }

    /**
     * Unbinds the carrier messaging service. This method should be called exactly once.
     *
     * @param context the context
     */
    public void disposeConnection(Context context) {
        Preconditions.checkNotNull(mCarrierMessagingServiceConnection);
        context.unbindService(mCarrierMessagingServiceConnection);
        mCarrierMessagingServiceConnection = null;
    }

    /**
     * Implemented by subclasses to use the carrier messaging service once it is ready.
     *
     * @param carrierMessagingService the carrier messaing service interface
     */
    protected abstract void onServiceReady(ICarrierMessagingService carrierMessagingService);

    /**
     * A basic {@link ServiceConnection}.
     */
    private final class CarrierMessagingServiceConnection implements ServiceConnection {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            onServiceReady(ICarrierMessagingService.Stub.asInterface(service));
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
        }
    }
}
+13 −16
Original line number Original line Diff line number Diff line
@@ -23,12 +23,10 @@ import android.content.pm.ResolveInfo;
import android.os.Binder;
import android.os.Binder;
import android.os.Handler;
import android.os.Handler;
import android.os.Message;
import android.os.Message;
import android.os.RemoteException;
import android.service.carrier.CarrierMessagingService;
import android.service.carrier.CarrierMessagingService;
import android.service.carrier.ICarrierMessagingCallback;
import android.service.carrier.CarrierMessagingServiceWrapper;
import android.service.carrier.ICarrierMessagingService;
import android.service.carrier.CarrierMessagingServiceWrapper.CarrierMessagingCallbackWrapper;
import android.service.carrier.MessagePdu;
import android.service.carrier.MessagePdu;
import android.telephony.CarrierMessagingServiceManager;
import android.telephony.Rlog;
import android.telephony.Rlog;
import android.util.LocalLog;
import android.util.LocalLog;


@@ -209,7 +207,7 @@ public class CarrierServicesSmsFilter {
     * instructed to do so by the carrier messaging service. A new instance must be used for every
     * instructed to do so by the carrier messaging service. A new instance must be used for every
     * message.
     * message.
     */
     */
    private final class CarrierSmsFilter extends CarrierMessagingServiceManager {
    private final class CarrierSmsFilter extends CarrierMessagingServiceWrapper {
        private final byte[][] mPdus;
        private final byte[][] mPdus;
        private final int mDestPort;
        private final int mDestPort;
        private final String mSmsFormat;
        private final String mSmsFormat;
@@ -223,8 +221,8 @@ public class CarrierServicesSmsFilter {
        }
        }


        /**
        /**
         * Attempts to bind to a {@link ICarrierMessagingService}. Filtering is initiated
         * Attempts to bind to a {@link CarrierMessagingService}. Filtering is initiated
         * asynchronously once the service is ready using {@link #onServiceReady}.
         * asynchronously once the service is ready using {@link #onServiceReady()}.
         */
         */
        void filterSms(String carrierPackageName, CarrierSmsFilterCallback smsFilterCallback) {
        void filterSms(String carrierPackageName, CarrierSmsFilterCallback smsFilterCallback) {
            mSmsFilterCallback = smsFilterCallback;
            mSmsFilterCallback = smsFilterCallback;
@@ -241,13 +239,12 @@ public class CarrierServicesSmsFilter {
         * delivered to {@code smsFilterCallback}.
         * delivered to {@code smsFilterCallback}.
         */
         */
        @Override
        @Override
        protected void onServiceReady(ICarrierMessagingService carrierMessagingService) {
        public void onServiceReady() {
            try {
            try {
                log("onServiceReady: calling filterSms");
                log("onServiceReady: calling filterSms");
                carrierMessagingService.filterSms(
                filterSms(new MessagePdu(Arrays.asList(mPdus)), mSmsFormat, mDestPort,
                        new MessagePdu(Arrays.asList(mPdus)), mSmsFormat, mDestPort,
                        mPhone.getSubId(), mSmsFilterCallback);
                        mPhone.getSubId(), mSmsFilterCallback);
            } catch (RemoteException e) {
            } catch (RuntimeException e) {
                loge("Exception filtering the SMS: " + e);
                loge("Exception filtering the SMS: " + e);
                mSmsFilterCallback.onFilterComplete(
                mSmsFilterCallback.onFilterComplete(
                        CarrierMessagingService.RECEIVE_OPTIONS_DEFAULT);
                        CarrierMessagingService.RECEIVE_OPTIONS_DEFAULT);
@@ -259,15 +256,15 @@ public class CarrierServicesSmsFilter {
     * A callback used to notify the platform of the carrier messaging app filtering result. Once
     * A callback used to notify the platform of the carrier messaging app filtering result. Once
     * the result is ready, the carrier messaging service connection is disposed.
     * the result is ready, the carrier messaging service connection is disposed.
     */
     */
    private final class CarrierSmsFilterCallback extends ICarrierMessagingCallback.Stub {
    private final class CarrierSmsFilterCallback extends CarrierMessagingCallbackWrapper {
        private final FilterAggregator mFilterAggregator;
        private final FilterAggregator mFilterAggregator;
        private final CarrierMessagingServiceManager mCarrierMessagingServiceManager;
        private final CarrierMessagingServiceWrapper mCarrierMessagingServiceWrapper;
        private boolean mIsOnFilterCompleteCalled;
        private boolean mIsOnFilterCompleteCalled;


        CarrierSmsFilterCallback(FilterAggregator filterAggregator,
        CarrierSmsFilterCallback(FilterAggregator filterAggregator,
                CarrierMessagingServiceManager carrierMessagingServiceManager) {
                CarrierMessagingServiceWrapper carrierMessagingServiceWrapper) {
            mFilterAggregator = filterAggregator;
            mFilterAggregator = filterAggregator;
            mCarrierMessagingServiceManager = carrierMessagingServiceManager;
            mCarrierMessagingServiceWrapper = carrierMessagingServiceWrapper;
            mIsOnFilterCompleteCalled = false;
            mIsOnFilterCompleteCalled = false;
        }
        }


@@ -281,7 +278,7 @@ public class CarrierServicesSmsFilter {
            // is run afterwards, we should not follow through
            // is run afterwards, we should not follow through
            if (!mIsOnFilterCompleteCalled) {
            if (!mIsOnFilterCompleteCalled) {
                mIsOnFilterCompleteCalled = true;
                mIsOnFilterCompleteCalled = true;
                mCarrierMessagingServiceManager.disposeConnection(mContext);
                mCarrierMessagingServiceWrapper.disposeConnection(mContext);
                mFilterAggregator.onFilterComplete(result);
                mFilterAggregator.onFilterComplete(result);
            }
            }
        }
        }
+16 −17
Original line number Original line Diff line number Diff line
@@ -56,16 +56,14 @@ import android.os.Handler;
import android.os.Message;
import android.os.Message;
import android.os.PersistableBundle;
import android.os.PersistableBundle;
import android.os.Process;
import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserHandle;
import android.provider.Settings;
import android.provider.Settings;
import android.provider.Telephony;
import android.provider.Telephony;
import android.provider.Telephony.Sms;
import android.provider.Telephony.Sms;
import android.service.carrier.CarrierMessagingService;
import android.service.carrier.CarrierMessagingService;
import android.service.carrier.ICarrierMessagingCallback;
import android.service.carrier.CarrierMessagingServiceWrapper;
import android.service.carrier.ICarrierMessagingService;
import android.service.carrier.CarrierMessagingServiceWrapper.CarrierMessagingCallbackWrapper;
import android.telephony.CarrierConfigManager;
import android.telephony.CarrierConfigManager;
import android.telephony.CarrierMessagingServiceManager;
import android.telephony.PhoneNumberUtils;
import android.telephony.PhoneNumberUtils;
import android.telephony.Rlog;
import android.telephony.Rlog;
import android.telephony.ServiceState;
import android.telephony.ServiceState;
@@ -363,7 +361,7 @@ public abstract class SMSDispatcher extends Handler {
    /**
    /**
     * Use the carrier messaging service to send a data or text SMS.
     * Use the carrier messaging service to send a data or text SMS.
     */
     */
    protected abstract class SmsSender extends CarrierMessagingServiceManager {
    protected abstract class SmsSender extends CarrierMessagingServiceWrapper {
        protected final SmsTracker mTracker;
        protected final SmsTracker mTracker;
        // Initialized in sendSmsByCarrierApp
        // Initialized in sendSmsByCarrierApp
        protected volatile SmsSenderCallback mSenderCallback;
        protected volatile SmsSenderCallback mSenderCallback;
@@ -402,16 +400,16 @@ public abstract class SMSDispatcher extends Handler {
        }
        }


        @Override
        @Override
        protected void onServiceReady(ICarrierMessagingService carrierMessagingService) {
        public void onServiceReady() {
            HashMap<String, Object> map = mTracker.getData();
            HashMap<String, Object> map = mTracker.getData();
            String text = (String) map.get(MAP_KEY_TEXT);
            String text = (String) map.get(MAP_KEY_TEXT);


            if (text != null) {
            if (text != null) {
                try {
                try {
                    carrierMessagingService.sendTextSms(text, getSubId(),
                    sendTextSms(text, getSubId(),
                            mTracker.mDestAddress, getSendSmsFlag(mTracker.mDeliveryIntent),
                            mTracker.mDestAddress, getSendSmsFlag(mTracker.mDeliveryIntent),
                            mSenderCallback);
                            mSenderCallback);
                } catch (RemoteException e) {
                } catch (RuntimeException e) {
                    Rlog.e(TAG, "Exception sending the SMS: " + e);
                    Rlog.e(TAG, "Exception sending the SMS: " + e);
                    mSenderCallback.onSendSmsComplete(
                    mSenderCallback.onSendSmsComplete(
                            CarrierMessagingService.SEND_STATUS_RETRY_ON_CARRIER_NETWORK,
                            CarrierMessagingService.SEND_STATUS_RETRY_ON_CARRIER_NETWORK,
@@ -434,17 +432,17 @@ public abstract class SMSDispatcher extends Handler {
        }
        }


        @Override
        @Override
        protected void onServiceReady(ICarrierMessagingService carrierMessagingService) {
        public void onServiceReady() {
            HashMap<String, Object> map = mTracker.getData();
            HashMap<String, Object> map = mTracker.getData();
            byte[] data = (byte[]) map.get(MAP_KEY_DATA);
            byte[] data = (byte[]) map.get(MAP_KEY_DATA);
            int destPort = (int) map.get(MAP_KEY_DEST_PORT);
            int destPort = (int) map.get(MAP_KEY_DEST_PORT);


            if (data != null) {
            if (data != null) {
                try {
                try {
                    carrierMessagingService.sendDataSms(data, getSubId(),
                    sendDataSms(data, getSubId(),
                            mTracker.mDestAddress, destPort,
                            mTracker.mDestAddress, destPort,
                            getSendSmsFlag(mTracker.mDeliveryIntent), mSenderCallback);
                            getSendSmsFlag(mTracker.mDeliveryIntent), mSenderCallback);
                } catch (RemoteException e) {
                } catch (RuntimeException e) {
                    Rlog.e(TAG, "Exception sending the SMS: " + e);
                    Rlog.e(TAG, "Exception sending the SMS: " + e);
                    mSenderCallback.onSendSmsComplete(
                    mSenderCallback.onSendSmsComplete(
                            CarrierMessagingService.SEND_STATUS_RETRY_ON_CARRIER_NETWORK,
                            CarrierMessagingService.SEND_STATUS_RETRY_ON_CARRIER_NETWORK,
@@ -462,7 +460,8 @@ public abstract class SMSDispatcher extends Handler {
     * Callback for TextSmsSender and DataSmsSender from the carrier messaging service.
     * Callback for TextSmsSender and DataSmsSender from the carrier messaging service.
     * Once the result is ready, the carrier messaging service connection is disposed.
     * Once the result is ready, the carrier messaging service connection is disposed.
     */
     */
    protected final class SmsSenderCallback extends ICarrierMessagingCallback.Stub {
    protected final class SmsSenderCallback extends
            CarrierMessagingServiceWrapper.CarrierMessagingCallbackWrapper {
        private final SmsSender mSmsSender;
        private final SmsSender mSmsSender;


        public SmsSenderCallback(SmsSender smsSender) {
        public SmsSenderCallback(SmsSender smsSender) {
@@ -541,7 +540,7 @@ public abstract class SMSDispatcher extends Handler {
    /**
    /**
     * Use the carrier messaging service to send a multipart text SMS.
     * Use the carrier messaging service to send a multipart text SMS.
     */
     */
    private final class MultipartSmsSender extends CarrierMessagingServiceManager {
    private final class MultipartSmsSender extends CarrierMessagingServiceWrapper {
        private final List<String> mParts;
        private final List<String> mParts;
        public final SmsTracker[] mTrackers;
        public final SmsTracker[] mTrackers;
        // Initialized in sendSmsByCarrierApp
        // Initialized in sendSmsByCarrierApp
@@ -567,12 +566,12 @@ public abstract class SMSDispatcher extends Handler {
        }
        }


        @Override
        @Override
        protected void onServiceReady(ICarrierMessagingService carrierMessagingService) {
        public void onServiceReady() {
            try {
            try {
                carrierMessagingService.sendMultipartTextSms(
                sendMultipartTextSms(
                        mParts, getSubId(), mTrackers[0].mDestAddress,
                        mParts, getSubId(), mTrackers[0].mDestAddress,
                        getSendSmsFlag(mTrackers[0].mDeliveryIntent), mSenderCallback);
                        getSendSmsFlag(mTrackers[0].mDeliveryIntent), mSenderCallback);
            } catch (RemoteException e) {
            } catch (RuntimeException e) {
                Rlog.e(TAG, "Exception sending the SMS: " + e);
                Rlog.e(TAG, "Exception sending the SMS: " + e);
                mSenderCallback.onSendMultipartSmsComplete(
                mSenderCallback.onSendMultipartSmsComplete(
                        CarrierMessagingService.SEND_STATUS_RETRY_ON_CARRIER_NETWORK,
                        CarrierMessagingService.SEND_STATUS_RETRY_ON_CARRIER_NETWORK,
@@ -585,7 +584,7 @@ public abstract class SMSDispatcher extends Handler {
     * Callback for MultipartSmsSender from the carrier messaging service.
     * Callback for MultipartSmsSender from the carrier messaging service.
     * Once the result is ready, the carrier messaging service connection is disposed.
     * Once the result is ready, the carrier messaging service connection is disposed.
     */
     */
    private final class MultipartSmsSenderCallback extends ICarrierMessagingCallback.Stub {
    private final class MultipartSmsSenderCallback extends CarrierMessagingCallbackWrapper {
        private final MultipartSmsSender mSmsSender;
        private final MultipartSmsSender mSmsSender;


        MultipartSmsSenderCallback(MultipartSmsSender smsSender) {
        MultipartSmsSenderCallback(MultipartSmsSender smsSender) {