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