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