ConnectionServiceRepository.java revision 8de76915ea2772faeb41705aaaeb65f5b3478ac4
1905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal/*
2905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal * Copyright (C) 2013 The Android Open Source Project
3905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal *
4905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal * Licensed under the Apache License, Version 2.0 (the "License");
5905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal * you may not use this file except in compliance with the License.
6905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal * You may obtain a copy of the License at
7905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal *
8905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal *      http://www.apache.org/licenses/LICENSE-2.0
9905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal *
10905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal * Unless required by applicable law or agreed to in writing, software
11905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal * distributed under the License is distributed on an "AS IS" BASIS,
12905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal * See the License for the specific language governing permissions and
14905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal * limitations under the License.
15905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal */
16905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal
177cc70b4f0ad1064a4a0dce6056ad82b205887160Tyler Gunnpackage com.android.server.telecom;
18905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal
19905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepalimport android.content.ComponentName;
2091d43cf9c985cc5a83795f256ef5c46ebb8fbdc1Tyler Gunnimport android.content.Context;
21105d977687d1d0de7cd9420fc140b01404261df1Evan Charltonimport android.os.UserHandle;
22105d977687d1d0de7cd9420fc140b01404261df1Evan Charltonimport android.util.Pair;
23905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal
249787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunnimport com.android.internal.util.IndentingPrintWriter;
259787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn
26905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepalimport java.util.HashMap;
27905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal
28905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal/**
29905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal * Searches for and returns connection services.
30905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal */
3178a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awadfinal class ConnectionServiceRepository {
32105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton    private final HashMap<Pair<ComponentName, UserHandle>, ConnectionServiceWrapper> mServiceCache =
33105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton            new HashMap<>();
3491d43cf9c985cc5a83795f256ef5c46ebb8fbdc1Tyler Gunn    private final PhoneAccountRegistrar mPhoneAccountRegistrar;
3591d43cf9c985cc5a83795f256ef5c46ebb8fbdc1Tyler Gunn    private final Context mContext;
368de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    private final CallsManager mCallsManager;
37905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal
3878a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad    private final ServiceBinder.Listener<ConnectionServiceWrapper> mUnbindListener =
3978a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad            new ServiceBinder.Listener<ConnectionServiceWrapper>() {
4078a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad                @Override
4178a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad                public void onUnbind(ConnectionServiceWrapper service) {
4278a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad                    mServiceCache.remove(service.getComponentName());
4378a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad                }
4478a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad            };
4578a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad
468de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    ConnectionServiceRepository(
478de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            PhoneAccountRegistrar phoneAccountRegistrar,
488de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            Context context,
498de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            CallsManager callsManager) {
5091d43cf9c985cc5a83795f256ef5c46ebb8fbdc1Tyler Gunn        mPhoneAccountRegistrar = phoneAccountRegistrar;
5191d43cf9c985cc5a83795f256ef5c46ebb8fbdc1Tyler Gunn        mContext = context;
528de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        mCallsManager = callsManager;
53905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal    }
54905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal
55105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton    ConnectionServiceWrapper getService(ComponentName componentName, UserHandle userHandle) {
56105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton        Pair<ComponentName, UserHandle> cacheKey = Pair.create(componentName, userHandle);
57105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton        ConnectionServiceWrapper service = mServiceCache.get(cacheKey);
58905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal        if (service == null) {
59b78b27693afbe9736f0a54ec473328955251f885Ihab Awad            service = new ConnectionServiceWrapper(
60b78b27693afbe9736f0a54ec473328955251f885Ihab Awad                    componentName,
61b78b27693afbe9736f0a54ec473328955251f885Ihab Awad                    this,
6291d43cf9c985cc5a83795f256ef5c46ebb8fbdc1Tyler Gunn                    mPhoneAccountRegistrar,
638de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                    mCallsManager,
64105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton                    mContext,
65105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton                    userHandle);
6678a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad            service.addListener(mUnbindListener);
67105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton            mServiceCache.put(cacheKey, service);
68905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal        }
69905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal        return service;
70905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal    }
71905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal
72905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal    /**
739787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn     * Dumps the state of the {@link ConnectionServiceRepository}.
749787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn     *
759787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn     * @param pw The {@code IndentingPrintWriter} to write the state to.
769787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn     */
779787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn    public void dump(IndentingPrintWriter pw) {
789787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn        pw.println("mServiceCache:");
799787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn        pw.increaseIndent();
80105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton        for (Pair<ComponentName, UserHandle> cacheKey : mServiceCache.keySet()) {
81105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton            ComponentName componentName = cacheKey.first;
829787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn            pw.println(componentName);
839787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn        }
849787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn        pw.decreaseIndent();
859787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn    }
86905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal}
87