|  | /* | 
|  | * Copyright (C) 2007 The Android Open Source Project | 
|  | * | 
|  | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | * you may not use this file except in compliance with the License. | 
|  | * You may obtain a copy of the License at | 
|  | * | 
|  | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, software | 
|  | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | * See the License for the specific language governing permissions and | 
|  | * limitations under the License. | 
|  | */ | 
|  |  | 
|  | package android.database; | 
|  |  | 
|  | import java.util.ArrayList; | 
|  |  | 
|  | /** | 
|  | * Provides methods for registering or unregistering arbitrary observers in an {@link ArrayList}. | 
|  | * | 
|  | * This abstract class is intended to be subclassed and specialized to maintain | 
|  | * a registry of observers of specific types and dispatch notifications to them. | 
|  | * | 
|  | * @param T The observer type. | 
|  | */ | 
|  | @android.ravenwood.annotation.RavenwoodKeepWholeClass | 
|  | public abstract class Observable<T> { | 
|  | /** | 
|  | * The list of observers.  An observer can be in the list at most | 
|  | * once and will never be null. | 
|  | */ | 
|  | protected final ArrayList<T> mObservers = new ArrayList<T>(); | 
|  |  | 
|  | /** | 
|  | * Adds an observer to the list. The observer cannot be null and it must not already | 
|  | * be registered. | 
|  | * @param observer the observer to register | 
|  | * @throws IllegalArgumentException the observer is null | 
|  | * @throws IllegalStateException the observer is already registered | 
|  | */ | 
|  | public void registerObserver(T observer) { | 
|  | if (observer == null) { | 
|  | throw new IllegalArgumentException("The observer is null."); | 
|  | } | 
|  | synchronized(mObservers) { | 
|  | if (mObservers.contains(observer)) { | 
|  | throw new IllegalStateException("Observer " + observer + " is already registered."); | 
|  | } | 
|  | mObservers.add(observer); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Removes a previously registered observer. The observer must not be null and it | 
|  | * must already have been registered. | 
|  | * @param observer the observer to unregister | 
|  | * @throws IllegalArgumentException the observer is null | 
|  | * @throws IllegalStateException the observer is not yet registered | 
|  | */ | 
|  | public void unregisterObserver(T observer) { | 
|  | if (observer == null) { | 
|  | throw new IllegalArgumentException("The observer is null."); | 
|  | } | 
|  | synchronized(mObservers) { | 
|  | int index = mObservers.indexOf(observer); | 
|  | if (index == -1) { | 
|  | throw new IllegalStateException("Observer " + observer + " was not registered."); | 
|  | } | 
|  | mObservers.remove(index); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Remove all registered observers. | 
|  | */ | 
|  | public void unregisterAll() { | 
|  | synchronized(mObservers) { | 
|  | mObservers.clear(); | 
|  | } | 
|  | } | 
|  | } |