1a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann/*
2a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann * Copyright (C) 2016 The Android Open Source Project
3a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann *
4a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann * Licensed under the Apache License, Version 2.0 (the "License");
5a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann * you may not use this file except in compliance with the License.
6a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann * You may obtain a copy of the License at
7a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann *
8a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann *      http://www.apache.org/licenses/LICENSE-2.0
9a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann *
10a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann * Unless required by applicable law or agreed to in writing, software
11a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann * distributed under the License is distributed on an "AS IS" BASIS,
12a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann * See the License for the specific language governing permissions and
14a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann * limitations under the License.
15a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann */
16a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann
17a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmannpackage com.android.packageinstaller;
18a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann
19a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmannimport android.content.BroadcastReceiver;
20a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmannimport android.content.Context;
21a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmannimport android.content.Intent;
2274fa089b8c39d84b737607a3e3d2cde4d3b42d24Philip P. Moltmannimport android.support.annotation.NonNull;
23a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann
24a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann/**
25a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann * Receives install events and perists them using a {@link EventResultPersister}.
26a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann */
27a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmannpublic class InstallEventReceiver extends BroadcastReceiver {
28a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann    private static final Object sLock = new Object();
29a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann    private static EventResultPersister sReceiver;
30a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann
31a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann    /**
32a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann     * Get the event receiver persisting the results
33a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann     *
34a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann     * @return The event receiver.
35a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann     */
36a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann    @NonNull private static EventResultPersister getReceiver(@NonNull Context context) {
37a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann        synchronized (sLock) {
38a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann            if (sReceiver == null) {
39cd5a5a60ca028b30969c0dc16c5f0f3c205b494bPhilip P. Moltmann                sReceiver = new EventResultPersister(
40cd5a5a60ca028b30969c0dc16c5f0f3c205b494bPhilip P. Moltmann                        TemporaryFileManager.getInstallStateFile(context));
41a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann            }
42a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann        }
43a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann
44a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann        return sReceiver;
45a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann    }
46a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann
47a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann    @Override
48a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann    public void onReceive(Context context, Intent intent) {
49cd5a5a60ca028b30969c0dc16c5f0f3c205b494bPhilip P. Moltmann        getReceiver(context).onEventReceived(context, intent);
50a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann    }
51a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann
52a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann    /**
53a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann     * Add an observer. If there is already an event for this id, call back inside of this call.
54a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann     *
55a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann     * @param context  A context of the current app
56a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann     * @param id       The id the observer is for or {@code GENERATE_NEW_ID} to generate a new one.
57a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann     * @param observer The observer to call back.
58a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann     *
59a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann     * @return The id for this event
60a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann     */
61a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann    static int addObserver(@NonNull Context context, int id,
62a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann            @NonNull EventResultPersister.EventResultObserver observer)
63a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann            throws EventResultPersister.OutOfIdsException {
64a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann        return getReceiver(context).addObserver(id, observer);
65a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann    }
66a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann
67a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann    /**
68a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann     * Remove a observer.
69a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann     *
70a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann     * @param context  A context of the current app
71a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann     * @param id The id the observer was added for
72a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann     */
73a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann    static void removeObserver(@NonNull Context context, int id) {
74a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann        getReceiver(context).removeObserver(id);
75a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann    }
76a35df07e28e94f78fefc88d24ebfa7643b6df7e6Philip P. Moltmann}
77