1cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak/* 2cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * Copyright (c) 2016 The Android Open Source Project 3cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * 4cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * Licensed under the Apache License, Version 2.0 (the "License"); 5cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * you may not use this file except in compliance with the License. 6cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * You may obtain a copy of the License at 7cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * 8cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * http://www.apache.org/licenses/LICENSE-2.0 9cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * 10cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * Unless required by applicable law or agreed to in writing, software 11cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * distributed under the License is distributed on an "AS IS" BASIS, 12cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * See the License for the specific language governing permissions and 14cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * limitations under the License. 15cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak */ 16cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak 17cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiakpackage com.android.ims.internal.uce.uceservice; 18cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak 19cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiakimport android.content.Context; 20cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiakimport android.content.Intent; 21cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak 22cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiakimport android.os.Handler; 23cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiakimport android.os.HandlerThread; 24cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiakimport android.os.IBinder; 25cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiakimport android.os.Message; 26cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiakimport android.os.ServiceManager; 27cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiakimport android.os.RemoteException; 28cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak 29cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiakimport java.util.HashMap; 30cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiakimport android.util.Log; 31cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak 32cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak/** 33cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * ImsUceManager Declaration 34cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * @hide 35cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak */ 36cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiakpublic class ImsUceManager { 37cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak 38cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak private static final String LOG_TAG = "ImsUceManager"; 39cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak /** 40cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * Uce Service name Internal Uce only 41cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * @hide 42cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak */ 43cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak private static final String UCE_SERVICE = "uce"; 44cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak 45cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak /** 46cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * IUceService object 47cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * @hide 48cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak */ 49cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak private IUceService mUceService = null; 50cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak private UceServiceDeathRecipient mDeathReceipient = new UceServiceDeathRecipient(); 51cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak private Context mContext; 52cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak private int mPhoneId; 53cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak /** 54cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * Stores the UceManager instaces of Clients identified by 55cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * phoneId 56cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * @hide 57cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak */ 58cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak private static HashMap<Integer, ImsUceManager> sUceManagerInstances = 59cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak new HashMap<Integer, ImsUceManager>(); 60cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak 61cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak public static final String ACTION_UCE_SERVICE_UP = 62cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak "com.android.ims.internal.uce.UCE_SERVICE_UP"; 63cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak public static final String ACTION_UCE_SERVICE_DOWN = 64cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak "com.android.ims.internal.uce.UCE_SERVICE_DOWN"; 65cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak 66cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak /** Uce Service status received in IUceListener.setStatus() 67cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * callback 68cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * @hide 69cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak */ 70cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak public static final int UCE_SERVICE_STATUS_FAILURE = 0; 71cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak /** indicate UI to call Presence/Options API. */ 72cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak public static final int UCE_SERVICE_STATUS_ON = 1; 73cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak /** Indicate UI destroy Presence/Options */ 74cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak public static final int UCE_SERVICE_STATUS_CLOSED = 2; 75cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak /** Service up and trying to register for network events */ 76cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak public static final int UCE_SERVICE_STATUS_READY = 3; 77cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak 78cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak /** 79cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * Part of the ACTION_UCE_SERVICE_UP or _DOWN intents. A long 80cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * value; the phone ID corresponding to the IMS service coming up or down. 81cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * Internal use only. 82cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * @hide 83cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak */ 84cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak public static final String EXTRA_PHONE_ID = "android:phone_id"; 85cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak 86cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak 87cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak /** 88cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * Gets the instance of UCE Manager 89cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * @hide 90cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak */ 91cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak public static ImsUceManager getInstance(Context context, int phoneId) { 92cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak //if (DBG) Log.d (LOG_TAG, "GetInstance Called"); 93cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak synchronized (sUceManagerInstances) { 94cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak if (sUceManagerInstances.containsKey(phoneId)) { 95cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak return sUceManagerInstances.get(phoneId); 96cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak } else { 97cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak ImsUceManager uceMgr = new ImsUceManager(context, phoneId); 98cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak sUceManagerInstances.put(phoneId, uceMgr); 99cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak return uceMgr; 100cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak } 101cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak } 102cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak } 103cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak 104cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak /** 105cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * Constructor 106cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * @hide 107cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak */ 108cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak private ImsUceManager(Context context, int phoneId) { 109cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak //if (DBG) Log.d (LOG_TAG, "Constructor"); 110cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak mContext = context; 111cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak mPhoneId = phoneId; 112cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak createUceService(true); 113cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak } 114cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak 115cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak /** 116cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * Gets the Uce service Instance 117cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * 118cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * client should call this API only after createUceService() 119cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * this instance is deleted when ACTION_UCE_SERVICE_DOWN event 120cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * is received. 121cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * @hide 122cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak */ 123cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak public IUceService getUceServiceInstance() { 124cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak //if (DBG) Log.d (LOG_TAG, "GetUceServiceInstance Called"); 125cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak return mUceService; 126cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak } 127cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak 128cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak /** 129cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * Gets the UCE service name 130cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * @hide 131cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak */ 132cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak private String getUceServiceName(int phoneId) { 133cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak return UCE_SERVICE; 134cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak } 135cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak 136cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak /** 137cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * Gets the IBinder to UCE service 138cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * 139cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * Client should call this after receving ACTION_UCE_SERVICE_UP 140cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * event. 141cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * @hide 142cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak */ 143cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak public void createUceService(boolean checkService) { 144cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak //if (DBG) Log.d (LOG_TAG, "CreateUceService Called"); 145cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak if (checkService) { 146cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak IBinder binder = ServiceManager.checkService(getUceServiceName(mPhoneId)); 147cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak 148cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak if (binder == null) { 149cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak //if (DBG)Log.d (LOG_TAG, "Unable to find IBinder"); 150cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak return; 151cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak } 152cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak } 153cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak IBinder b = ServiceManager.getService(getUceServiceName(mPhoneId)); 154cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak 155cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak if (b != null) { 156cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak try { 157cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak b.linkToDeath(mDeathReceipient, 0); 158cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak } catch (RemoteException e) { 159cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak } 160cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak } 161cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak 162cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak this.mUceService = IUceService.Stub.asInterface(b); 163cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak } 164cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak 165cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak 166cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak /** 167cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * Death recipient class for monitoring IMS service. 168cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * 169cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * After receiving ACTION_UCE_SERVICE_DOWN event, the client 170cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * should wait to receive ACTION_UCE_SERVICE_UP and call 171cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * createUceService inorder to create mUceService instance. 172cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak * @hide 173cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak */ 174cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak private class UceServiceDeathRecipient implements IBinder.DeathRecipient { 175cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak @Override 176cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak public void binderDied() { 177cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak //if (DBG) Log.d (LOG_TAG, "found IBinder/IUceService Service Died"); 178cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak mUceService = null; 179cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak 180cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak if (mContext != null) { 181cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak Intent intent = new Intent(ACTION_UCE_SERVICE_DOWN); 182cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak intent.putExtra(EXTRA_PHONE_ID, mPhoneId); 183cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak mContext.sendBroadcast(new Intent(intent)); 184cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak } 185cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak } 186cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak } 187cfedd20d54687449bb6a6982085003cbf9a22bcbPavel Zhamaitsiak} 188