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
24f19000764f6b93dfa15561342cbdd9c1aa1d3e22Brad Ebingerimport com.android.internal.annotations.VisibleForTesting;
259787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunnimport com.android.internal.util.IndentingPrintWriter;
269787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn
27905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepalimport java.util.HashMap;
28905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal
29905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal/**
30905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal * Searches for and returns connection services.
31905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal */
32f19000764f6b93dfa15561342cbdd9c1aa1d3e22Brad Ebinger@VisibleForTesting
33f19000764f6b93dfa15561342cbdd9c1aa1d3e22Brad Ebingerpublic class ConnectionServiceRepository {
34105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton    private final HashMap<Pair<ComponentName, UserHandle>, ConnectionServiceWrapper> mServiceCache =
35105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton            new HashMap<>();
3691d43cf9c985cc5a83795f256ef5c46ebb8fbdc1Tyler Gunn    private final PhoneAccountRegistrar mPhoneAccountRegistrar;
3791d43cf9c985cc5a83795f256ef5c46ebb8fbdc1Tyler Gunn    private final Context mContext;
388d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad    private final TelecomSystem.SyncRoot mLock;
398de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    private final CallsManager mCallsManager;
40905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal
4178a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad    private final ServiceBinder.Listener<ConnectionServiceWrapper> mUnbindListener =
4278a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad            new ServiceBinder.Listener<ConnectionServiceWrapper>() {
4378a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad                @Override
4478a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad                public void onUnbind(ConnectionServiceWrapper service) {
458d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    synchronized (mLock) {
468d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                        mServiceCache.remove(service.getComponentName());
478d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    }
4878a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad                }
4978a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad            };
5078a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad
518de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    ConnectionServiceRepository(
528de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            PhoneAccountRegistrar phoneAccountRegistrar,
538de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            Context context,
548d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad            TelecomSystem.SyncRoot lock,
558de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            CallsManager callsManager) {
5691d43cf9c985cc5a83795f256ef5c46ebb8fbdc1Tyler Gunn        mPhoneAccountRegistrar = phoneAccountRegistrar;
5791d43cf9c985cc5a83795f256ef5c46ebb8fbdc1Tyler Gunn        mContext = context;
588d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad        mLock = lock;
598de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        mCallsManager = callsManager;
60905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal    }
61905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal
62f19000764f6b93dfa15561342cbdd9c1aa1d3e22Brad Ebinger    @VisibleForTesting
63f19000764f6b93dfa15561342cbdd9c1aa1d3e22Brad Ebinger    public ConnectionServiceWrapper getService(ComponentName componentName, UserHandle userHandle) {
64105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton        Pair<ComponentName, UserHandle> cacheKey = Pair.create(componentName, userHandle);
65105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton        ConnectionServiceWrapper service = mServiceCache.get(cacheKey);
66905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal        if (service == null) {
67b78b27693afbe9736f0a54ec473328955251f885Ihab Awad            service = new ConnectionServiceWrapper(
68b78b27693afbe9736f0a54ec473328955251f885Ihab Awad                    componentName,
69b78b27693afbe9736f0a54ec473328955251f885Ihab Awad                    this,
7091d43cf9c985cc5a83795f256ef5c46ebb8fbdc1Tyler Gunn                    mPhoneAccountRegistrar,
718de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                    mCallsManager,
72105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton                    mContext,
738d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad                    mLock,
74105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton                    userHandle);
7578a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad            service.addListener(mUnbindListener);
76105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton            mServiceCache.put(cacheKey, service);
77905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal        }
78905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal        return service;
79905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal    }
80905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal
81905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal    /**
829787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn     * Dumps the state of the {@link ConnectionServiceRepository}.
839787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn     *
849787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn     * @param pw The {@code IndentingPrintWriter} to write the state to.
859787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn     */
869787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn    public void dump(IndentingPrintWriter pw) {
879787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn        pw.println("mServiceCache:");
889787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn        pw.increaseIndent();
89105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton        for (Pair<ComponentName, UserHandle> cacheKey : mServiceCache.keySet()) {
90105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton            ComponentName componentName = cacheKey.first;
919787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn            pw.println(componentName);
929787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn        }
939787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn        pw.decreaseIndent();
949787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn    }
95905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal}
96