1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5package org.chromium.components.dom_distiller.core;
6
7import org.chromium.base.CalledByNative;
8import org.chromium.base.JNINamespace;
9import org.chromium.base.NativeCall;
10
11import java.util.HashMap;
12import java.util.Map;
13
14/**
15 * Wrapper for the dom_distiller::DistilledPagePrefs.
16 */
17@JNINamespace("dom_distiller::android")
18public final class DistilledPagePrefs {
19
20    private final long mDistilledPagePrefsAndroid;
21    private Map<Observer, DistilledPagePrefsObserverWrapper> mObserverMap;
22
23    /**
24     * Observer interface for observing DistilledPagePrefs changes.
25     */
26    public interface Observer {
27        void onChangeFontFamily(FontFamily font);
28        void onChangeTheme(Theme theme);
29    }
30
31    /**
32     * Wrapper for dom_distiller::android::DistilledPagePrefsObserverAndroid.
33     */
34    private static class DistilledPagePrefsObserverWrapper {
35        private final Observer mDistilledPagePrefsObserver;
36        private final long mNativeDistilledPagePrefsObserverAndroidPtr;
37
38        public DistilledPagePrefsObserverWrapper(Observer observer) {
39            mNativeDistilledPagePrefsObserverAndroidPtr = nativeInitObserverAndroid();
40            mDistilledPagePrefsObserver = observer;
41        }
42
43        @CalledByNative("DistilledPagePrefsObserverWrapper")
44        private void onChangeFontFamily(int fontFamily) {
45            mDistilledPagePrefsObserver.onChangeFontFamily(
46                    FontFamily.getFontFamilyForValue(fontFamily));
47        }
48
49        @CalledByNative("DistilledPagePrefsObserverWrapper")
50        private void onChangeTheme(int theme) {
51            mDistilledPagePrefsObserver.onChangeTheme(Theme.getThemeForValue(theme));
52        }
53
54        public void destroy() {
55            nativeDestroyObserverAndroid(mNativeDistilledPagePrefsObserverAndroidPtr);
56        }
57
58        public long getNativePtr() {
59            return mNativeDistilledPagePrefsObserverAndroidPtr;
60        }
61
62        @NativeCall("DistilledPagePrefsObserverWrapper")
63        private native long nativeInitObserverAndroid();
64
65        @NativeCall("DistilledPagePrefsObserverWrapper")
66        private native void nativeDestroyObserverAndroid(
67                long nativeDistilledPagePrefsObserverAndroid);
68    }
69
70    DistilledPagePrefs(long distilledPagePrefsPtr) {
71        mDistilledPagePrefsAndroid = nativeInit(distilledPagePrefsPtr);
72        mObserverMap = new HashMap<Observer, DistilledPagePrefsObserverWrapper>();
73    }
74
75    /*
76     * Adds the observer to listen to changes in DistilledPagePrefs.
77     * @return whether the observerMap was changed as a result of the call.
78     */
79    public boolean addObserver(Observer obs) {
80        if (mObserverMap.containsKey(obs)) return false;
81        DistilledPagePrefsObserverWrapper wrappedObserver =
82                new DistilledPagePrefsObserverWrapper(obs);
83        nativeAddObserver(mDistilledPagePrefsAndroid, wrappedObserver.getNativePtr());
84        mObserverMap.put(obs, wrappedObserver);
85        return true;
86    }
87
88    /*
89     * Removes the observer and unregisters it from DistilledPagePrefs changes.
90     * @return whether the observer was removed as a result of the call.
91     */
92    public boolean removeObserver(Observer obs) {
93        DistilledPagePrefsObserverWrapper wrappedObserver = mObserverMap.remove(obs);
94        if (wrappedObserver == null) return false;
95        nativeRemoveObserver(mDistilledPagePrefsAndroid, wrappedObserver.getNativePtr());
96        wrappedObserver.destroy();
97        return true;
98    }
99
100    public void setFontFamily(FontFamily fontFamily) {
101        nativeSetFontFamily(mDistilledPagePrefsAndroid, fontFamily.asNativeEnum());
102    }
103
104    public FontFamily getFontFamily() {
105        return FontFamily.getFontFamilyForValue(nativeGetFontFamily(mDistilledPagePrefsAndroid));
106    }
107
108    public void setTheme(Theme theme) {
109        nativeSetTheme(mDistilledPagePrefsAndroid, theme.asNativeEnum());
110    }
111
112    public Theme getTheme() {
113        return Theme.getThemeForValue(nativeGetTheme(mDistilledPagePrefsAndroid));
114    }
115
116    private native long nativeInit(long distilledPagePrefPtr);
117
118    private native void nativeSetFontFamily(long nativeDistilledPagePrefsAndroid, int fontFamily);
119
120    private native int nativeGetFontFamily(long nativeDistilledPagePrefsAndroid);
121
122    private native void nativeSetTheme(long nativeDistilledPagePrefsAndroid, int theme);
123
124    private native int nativeGetTheme(long nativeDistilledPagePrefsAndroid);
125
126    private native void nativeAddObserver(long nativeDistilledPagePrefsAndroid,
127            long nativeObserverPtr);
128
129    private native void nativeRemoveObserver(long nativeDistilledPagePrefsAndroid,
130            long nativeObserverPtr);
131}
132