blob: 370f72a2a8de8fc5845e1077d71e1275f767ebb7 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.preferences;
import android.util.SparseArray;
import org.chromium.base.annotations.CalledByNative;
/**
* This class is the Java implementation of native PrefChangeRegistrar. It receives notification for
* changes of one or more preferences from native PrefService.
*
* Note that {@link #destroy} should be called to destroy the native PrefChangeRegistrar.
*/
public class PrefChangeRegistrar {
/**
* Interface for callback when registered preference is changed.
*/
public interface PrefObserver { void onPreferenceChange(); }
/** Mapping preference index and corresponding observer. **/
private final SparseArray<PrefObserver> mObservers = new SparseArray<>();
/** Native pointer for PrefChangeRegistrarAndroid. **/
private long mNativeRegistrar;
/**
* Initialize native PrefChangeRegistrar.
*/
public PrefChangeRegistrar() {
mNativeRegistrar = nativeInit();
}
/**
* Add an observer to be notified of changes to the specified preference.
* @param preference The preference to be observed.
* @param observer The observer to be notified.
*/
public void addObserver(@Pref int preference, PrefObserver observer) {
assert mObservers.get(preference)
== null : "Only one observer should be added to each preference.";
mObservers.put(preference, observer);
nativeAdd(mNativeRegistrar, preference);
}
/**
* Remove an observer for the specified preference if it has previously been added.
* @param preference The specified preference.
*/
public void removeObserver(@Pref int preference) {
PrefObserver observer = mObservers.get(preference);
if (observer == null) return;
mObservers.remove(preference);
nativeRemove(mNativeRegistrar, preference);
}
/**
* Destroy native PrefChangeRegistrar.
*/
public void destroy() {
if (mNativeRegistrar != 0) {
nativeDestroy(mNativeRegistrar);
}
mNativeRegistrar = 0;
}
@CalledByNative
private void onPreferenceChange(int preference) {
assert mObservers.get(preference)
!= null : "Notification from unregistered preference changes.";
mObservers.get(preference).onPreferenceChange();
}
private native long nativeInit();
private native void nativeAdd(long nativePrefChangeRegistrarAndroid, int preference);
private native void nativeRemove(long nativePrefChangeRegistrarAndroid, int preference);
private native void nativeDestroy(long nativePrefChangeRegistrarAndroid);
}