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