blob: ef8d0184c6edfe88dded0080000ff9380a2e0f68 [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.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
/**
* 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 static final Object sLock = new Object();
private static ImsUceManager sUceManager;
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
*/
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;
/**
* Gets the instance of UCE Manager
* @hide
*/
public static ImsUceManager getInstance(Context context) {
synchronized (sLock) {
if (sUceManager == null && context != null) {
sUceManager = new ImsUceManager(context);
}
return sUceManager;
}
}
/**
* Constructor
* @hide
*/
private ImsUceManager(Context context) {
//if (DBG) Log.d (LOG_TAG, "Constructor");
mContext = context;
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() {
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());
if (binder == null) {
//if (DBG)Log.d (LOG_TAG, "Unable to find IBinder");
return;
}
}
IBinder b = ServiceManager.getService(getUceServiceName());
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() {
mUceService = null;
if (mContext != null) {
Intent intent = new Intent(ACTION_UCE_SERVICE_DOWN);
mContext.sendBroadcast(new Intent(intent));
}
}
}
}