/* * Copyright (c) 2016 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 com.android.ims.internal.uce.uceservice; import android.content.Context; import android.content.Intent; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; import android.os.Message; import android.os.ServiceManager; import android.os.RemoteException; import java.util.HashMap; import android.util.Log; /** * ImsUceManager Declaration * @hide */ public class ImsUceManager { private static final String LOG_TAG = "ImsUceManager"; /** * Uce Service name Internal Uce only * @hide */ private static final String UCE_SERVICE = "uce"; /** * IUceService object * @hide */ private IUceService mUceService = null; private UceServiceDeathRecipient mDeathReceipient = new UceServiceDeathRecipient(); private Context mContext; private int mPhoneId; /** * Stores the UceManager instaces of Clients identified by * phoneId * @hide */ private static HashMap<Integer, ImsUceManager> sUceManagerInstances = new HashMap<Integer, ImsUceManager>(); public static final String ACTION_UCE_SERVICE_UP = "com.android.ims.internal.uce.UCE_SERVICE_UP"; public static final String ACTION_UCE_SERVICE_DOWN = "com.android.ims.internal.uce.UCE_SERVICE_DOWN"; /** Uce Service status received in IUceListener.setStatus() * callback * @hide */ public static final int UCE_SERVICE_STATUS_FAILURE = 0; /** indicate UI to call Presence/Options API. */ public static final int UCE_SERVICE_STATUS_ON = 1; /** Indicate UI destroy Presence/Options */ public static final int UCE_SERVICE_STATUS_CLOSED = 2; /** Service up and trying to register for network events */ public static final int UCE_SERVICE_STATUS_READY = 3; /** * Part of the ACTION_UCE_SERVICE_UP or _DOWN intents. A long * value; the phone ID corresponding to the IMS service coming up or down. * Internal use only. * @hide */ public static final String EXTRA_PHONE_ID = "android:phone_id"; /** * Gets the instance of UCE Manager * @hide */ public static ImsUceManager getInstance(Context context, int phoneId) { //if (DBG) Log.d (LOG_TAG, "GetInstance Called"); synchronized (sUceManagerInstances) { if (sUceManagerInstances.containsKey(phoneId)) { return sUceManagerInstances.get(phoneId); } else { ImsUceManager uceMgr = new ImsUceManager(context, phoneId); sUceManagerInstances.put(phoneId, uceMgr); return uceMgr; } } } /** * Constructor * @hide */ private ImsUceManager(Context context, int phoneId) { //if (DBG) Log.d (LOG_TAG, "Constructor"); mContext = context; mPhoneId = phoneId; createUceService(true); } /** * Gets the Uce service Instance * * client should call this API only after createUceService() * this instance is deleted when ACTION_UCE_SERVICE_DOWN event * is received. * @hide */ public IUceService getUceServiceInstance() { //if (DBG) Log.d (LOG_TAG, "GetUceServiceInstance Called"); return mUceService; } /** * Gets the UCE service name * @hide */ private String getUceServiceName(int phoneId) { return UCE_SERVICE; } /** * Gets the IBinder to UCE service * * Client should call this after receving ACTION_UCE_SERVICE_UP * event. * @hide */ public void createUceService(boolean checkService) { //if (DBG) Log.d (LOG_TAG, "CreateUceService Called"); if (checkService) { IBinder binder = ServiceManager.checkService(getUceServiceName(mPhoneId)); if (binder == null) { //if (DBG)Log.d (LOG_TAG, "Unable to find IBinder"); return; } } IBinder b = ServiceManager.getService(getUceServiceName(mPhoneId)); if (b != null) { try { b.linkToDeath(mDeathReceipient, 0); } catch (RemoteException e) { } } this.mUceService = IUceService.Stub.asInterface(b); } /** * Death recipient class for monitoring IMS service. * * After receiving ACTION_UCE_SERVICE_DOWN event, the client * should wait to receive ACTION_UCE_SERVICE_UP and call * createUceService inorder to create mUceService instance. * @hide */ private class UceServiceDeathRecipient implements IBinder.DeathRecipient { @Override public void binderDied() { //if (DBG) Log.d (LOG_TAG, "found IBinder/IUceService Service Died"); mUceService = null; if (mContext != null) { Intent intent = new Intent(ACTION_UCE_SERVICE_DOWN); intent.putExtra(EXTRA_PHONE_ID, mPhoneId); mContext.sendBroadcast(new Intent(intent)); } } } }