ConnectionServiceRepository.java revision b78b27693afbe9736f0a54ec473328955251f885
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
17905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepalpackage com.android.telecomm;
18905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal
19905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepalimport android.content.ComponentName;
20905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepalimport android.content.Intent;
21905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepalimport android.content.pm.PackageManager;
22905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepalimport android.content.pm.ResolveInfo;
23905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepalimport android.content.pm.ServiceInfo;
24f2f14efaf1ac2cd1e78d29b9d7213696746f1f17Santos Cordonimport android.telecomm.ConnectionService;
25905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal
26905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepalimport java.util.ArrayList;
27905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepalimport java.util.Collection;
28905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepalimport java.util.HashMap;
29905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal
30905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal/**
31905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal * Searches for and returns connection services.
32905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal */
33905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepalfinal class ConnectionServiceRepository
34905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal        implements ServiceBinder.Listener<ConnectionServiceWrapper> {
35905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal    private final HashMap<ComponentName, ConnectionServiceWrapper> mServiceCache =
36905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal            new HashMap<ComponentName, ConnectionServiceWrapper>();
37905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal
38664837f9a8a98f98876417a0bfff64834e8032faSailesh Nepal    ConnectionServiceRepository() {
39905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal    }
40905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal
41905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal    Collection<ConnectionServiceWrapper> lookupServices() {
42905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal        PackageManager packageManager = TelecommApp.getInstance().getPackageManager();
43f2f14efaf1ac2cd1e78d29b9d7213696746f1f17Santos Cordon        Intent intent = new Intent(ConnectionService.SERVICE_INTERFACE);
44905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal        ArrayList<ConnectionServiceWrapper> services = new ArrayList<>();
45905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal
46905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal        for (ResolveInfo entry : packageManager.queryIntentServices(intent, 0)) {
47905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal            ServiceInfo serviceInfo = entry.serviceInfo;
48905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal            if (serviceInfo != null) {
49905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal                services.add(getService(new ComponentName(
50905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal                        serviceInfo.packageName, serviceInfo.name)));
51905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal            }
52905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal        }
53905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal        return services;
54905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal    }
55905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal
56905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal    ConnectionServiceWrapper getService(ComponentName componentName) {
57905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal        ConnectionServiceWrapper service = mServiceCache.get(componentName);
58905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal        if (service == null) {
59b78b27693afbe9736f0a54ec473328955251f885Ihab Awad            service = new ConnectionServiceWrapper(
60b78b27693afbe9736f0a54ec473328955251f885Ihab Awad                    componentName,
61b78b27693afbe9736f0a54ec473328955251f885Ihab Awad                    this,
62b78b27693afbe9736f0a54ec473328955251f885Ihab Awad                    TelecommApp.getInstance().getPhoneAccountRegistrar());
63905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal            service.addListener(this);
64905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal            mServiceCache.put(componentName, service);
65905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal        }
66905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal        return service;
67905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal    }
68905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal
69905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal    /**
70905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal     * Removes the specified service from the cache when the service unbinds.
71905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal     *
72905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal     * {@inheritDoc}
73905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal     */
74905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal    @Override
75905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal    public void onUnbind(ConnectionServiceWrapper service) {
76905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal        mServiceCache.remove(service.getComponentName());
77905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal    }
78905dfba7883666f45a0c6958d8bc6c19d68972d9Sailesh Nepal}
79