ConnectionServiceRepository.java revision 8d5d9ddc66b55b6906364ab3c0e244dab4d58f13
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; 368d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad private final TelecomSystem.SyncRoot mLock; 378de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad private final CallsManager mCallsManager; 38905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal 3978a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad private final ServiceBinder.Listener<ConnectionServiceWrapper> mUnbindListener = 4078a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad new ServiceBinder.Listener<ConnectionServiceWrapper>() { 4178a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad @Override 4278a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad public void onUnbind(ConnectionServiceWrapper service) { 438d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad synchronized (mLock) { 448d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad mServiceCache.remove(service.getComponentName()); 458d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad } 4678a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad } 4778a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad }; 4878a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad 498de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad ConnectionServiceRepository( 508de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad PhoneAccountRegistrar phoneAccountRegistrar, 518de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad Context context, 528d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad TelecomSystem.SyncRoot lock, 538de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad CallsManager callsManager) { 5491d43cf9c985cc5a83795f256ef5c46ebb8fbdc1Tyler Gunn mPhoneAccountRegistrar = phoneAccountRegistrar; 5591d43cf9c985cc5a83795f256ef5c46ebb8fbdc1Tyler Gunn mContext = context; 568d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad mLock = lock; 578de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad mCallsManager = callsManager; 58905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal } 59905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal 60105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton ConnectionServiceWrapper getService(ComponentName componentName, UserHandle userHandle) { 61105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton Pair<ComponentName, UserHandle> cacheKey = Pair.create(componentName, userHandle); 62105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton ConnectionServiceWrapper service = mServiceCache.get(cacheKey); 63905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal if (service == null) { 64b78b27693afbe9736f0a54ec473328955251f885Ihab Awad service = new ConnectionServiceWrapper( 65b78b27693afbe9736f0a54ec473328955251f885Ihab Awad componentName, 66b78b27693afbe9736f0a54ec473328955251f885Ihab Awad this, 6791d43cf9c985cc5a83795f256ef5c46ebb8fbdc1Tyler Gunn mPhoneAccountRegistrar, 688de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad mCallsManager, 69105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton mContext, 708d5d9ddc66b55b6906364ab3c0e244dab4d58f13Ihab Awad mLock, 71105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton userHandle); 7278a5e6b9c1595c81f72d7a822617cb78db224e48Ihab Awad service.addListener(mUnbindListener); 73105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton mServiceCache.put(cacheKey, service); 74905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal } 75905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal return service; 76905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal } 77905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal 78905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal /** 799787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn * Dumps the state of the {@link ConnectionServiceRepository}. 809787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn * 819787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn * @param pw The {@code IndentingPrintWriter} to write the state to. 829787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn */ 839787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn public void dump(IndentingPrintWriter pw) { 849787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn pw.println("mServiceCache:"); 859787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn pw.increaseIndent(); 86105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton for (Pair<ComponentName, UserHandle> cacheKey : mServiceCache.keySet()) { 87105d977687d1d0de7cd9420fc140b01404261df1Evan Charlton ComponentName componentName = cacheKey.first; 889787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn pw.println(componentName); 899787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn } 909787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn pw.decreaseIndent(); 919787e0e80d8960cf8b0ca74c7cdc4c4aac97187aTyler Gunn } 92905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal} 93