18215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang/*
28215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang * Copyright (C) 2014 The Android Open Source Project
38215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang *
48215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang * Licensed under the Apache License, Version 2.0 (the "License");
58215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang * you may not use this file except in compliance with the License.
68215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang * You may obtain a copy of the License at
78215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang *
88215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang *      http://www.apache.org/licenses/LICENSE-2.0
98215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang *
108215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang * Unless required by applicable law or agreed to in writing, software
118215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang * distributed under the License is distributed on an "AS IS" BASIS,
128215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang * See the License for the specific language governing permissions and
148215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang * limitations under the License.
158215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang */
168215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang
178215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wangpackage android.telephony;
188215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang
198215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wangimport android.content.ComponentName;
208215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wangimport android.content.Context;
218215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wangimport android.content.Intent;
228215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wangimport android.content.ServiceConnection;
238215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wangimport android.os.IBinder;
248215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wangimport android.service.carrier.CarrierMessagingService;
258215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wangimport android.service.carrier.ICarrierMessagingService;
268215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang
278215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wangimport com.android.internal.util.Preconditions;
288215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang
298215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang/**
308215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang * Provides basic structure for platform to connect to the carrier messaging service.
318215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang * <p>
328215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang * <code>
338215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang * CarrierMessagingServiceManager carrierMessagingServiceManager =
348215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang *     new CarrierMessagingServiceManagerImpl();
358215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang * if (carrierMessagingServiceManager.bindToCarrierMessagingService(context, carrierPackageName)) {
368215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang *   // wait for onServiceReady callback
378215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang * } else {
388215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang *   // Unable to bind: handle error.
398215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang * }
408215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang * </code>
418215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang * <p> Upon completion {@link #disposeConnection} should be called to unbind the
428215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang * CarrierMessagingService.
438215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang * @hide
448215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang */
458215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wangpublic abstract class CarrierMessagingServiceManager {
468215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang    // Populated by bindToCarrierMessagingService. bindToCarrierMessagingService must complete
478215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang    // prior to calling disposeConnection so that mCarrierMessagingServiceConnection is initialized.
488215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang    private volatile CarrierMessagingServiceConnection mCarrierMessagingServiceConnection;
498215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang
508215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang    /**
518215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang     * Binds to the carrier messaging service under package {@code carrierPackageName}. This method
528215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang     * should be called exactly once.
538215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang     *
548215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang     * @param context the context
558215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang     * @param carrierPackageName the carrier package name
568215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang     * @return true upon successfully binding to a carrier messaging service, false otherwise
578215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang     */
588215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang    public boolean bindToCarrierMessagingService(Context context, String carrierPackageName) {
598215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        Preconditions.checkState(mCarrierMessagingServiceConnection == null);
608215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang
618215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        Intent intent = new Intent(CarrierMessagingService.SERVICE_INTERFACE);
628215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        intent.setPackage(carrierPackageName);
638215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        mCarrierMessagingServiceConnection = new CarrierMessagingServiceConnection();
648215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        return context.bindService(intent, mCarrierMessagingServiceConnection,
658215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang                Context.BIND_AUTO_CREATE);
668215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang    }
678215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang
688215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang    /**
698215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang     * Unbinds the carrier messaging service. This method should be called exactly once.
708215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang     *
718215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang     * @param context the context
728215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang     */
738215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang    public void disposeConnection(Context context) {
748215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        Preconditions.checkNotNull(mCarrierMessagingServiceConnection);
758215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        context.unbindService(mCarrierMessagingServiceConnection);
768215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        mCarrierMessagingServiceConnection = null;
778215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang    }
788215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang
798215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang    /**
808215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang     * Implemented by subclasses to use the carrier messaging service once it is ready.
818215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang     *
828215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang     * @param carrierMessagingService the carrier messaing service interface
838215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang     */
848215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang    protected abstract void onServiceReady(ICarrierMessagingService carrierMessagingService);
858215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang
868215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang    /**
878215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang     * A basic {@link ServiceConnection}.
888215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang     */
898215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang    private final class CarrierMessagingServiceConnection implements ServiceConnection {
908215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        @Override
918215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        public void onServiceConnected(ComponentName name, IBinder service) {
928215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang            onServiceReady(ICarrierMessagingService.Stub.asInterface(service));
938215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        }
948215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang
958215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        @Override
968215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        public void onServiceDisconnected(ComponentName name) {
978215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang        }
988215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang    }
998215559cd1141ac90c478fd3df75e43c9d755c6cCheuksan Wang}
100