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