blob: 4b0b098d4e5bef7dde0d2b86895b732f0a856e6f [file] [log] [blame]
/*
* 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));
}
}
}
}