1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdochpackage org.chromium.components.dom_distiller.core;
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import org.chromium.base.CalledByNative;
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdochimport org.chromium.base.JNINamespace;
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import org.chromium.base.NativeCall;
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import java.util.HashMap;
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import java.util.Map;
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch/**
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * Wrapper for the dom_distiller::DistilledPagePrefs.
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch */
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@JNINamespace("dom_distiller::android")
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdochpublic final class DistilledPagePrefs {
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    private final long mDistilledPagePrefsAndroid;
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    private Map<Observer, DistilledPagePrefsObserverWrapper> mObserverMap;
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    /**
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     * Observer interface for observing DistilledPagePrefs changes.
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     */
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    public interface Observer {
276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        void onChangeFontFamily(FontFamily font);
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        void onChangeTheme(Theme theme);
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    /**
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     * Wrapper for dom_distiller::android::DistilledPagePrefsObserverAndroid.
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     */
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    private static class DistilledPagePrefsObserverWrapper {
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        private final Observer mDistilledPagePrefsObserver;
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        private final long mNativeDistilledPagePrefsObserverAndroidPtr;
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        public DistilledPagePrefsObserverWrapper(Observer observer) {
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            mNativeDistilledPagePrefsObserverAndroidPtr = nativeInitObserverAndroid();
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            mDistilledPagePrefsObserver = observer;
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        @CalledByNative("DistilledPagePrefsObserverWrapper")
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        private void onChangeFontFamily(int fontFamily) {
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            mDistilledPagePrefsObserver.onChangeFontFamily(
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    FontFamily.getFontFamilyForValue(fontFamily));
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        @CalledByNative("DistilledPagePrefsObserverWrapper")
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        private void onChangeTheme(int theme) {
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            mDistilledPagePrefsObserver.onChangeTheme(Theme.getThemeForValue(theme));
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        public void destroy() {
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            nativeDestroyObserverAndroid(mNativeDistilledPagePrefsObserverAndroidPtr);
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        public long getNativePtr() {
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            return mNativeDistilledPagePrefsObserverAndroidPtr;
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        @NativeCall("DistilledPagePrefsObserverWrapper")
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        private native long nativeInitObserverAndroid();
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        @NativeCall("DistilledPagePrefsObserverWrapper")
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        private native void nativeDestroyObserverAndroid(
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                long nativeDistilledPagePrefsObserverAndroid);
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DistilledPagePrefs(long distilledPagePrefsPtr) {
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        mDistilledPagePrefsAndroid = nativeInit(distilledPagePrefsPtr);
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        mObserverMap = new HashMap<Observer, DistilledPagePrefsObserverWrapper>();
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    /*
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     * Adds the observer to listen to changes in DistilledPagePrefs.
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     * @return whether the observerMap was changed as a result of the call.
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     */
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    public boolean addObserver(Observer obs) {
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (mObserverMap.containsKey(obs)) return false;
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        DistilledPagePrefsObserverWrapper wrappedObserver =
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                new DistilledPagePrefsObserverWrapper(obs);
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        nativeAddObserver(mDistilledPagePrefsAndroid, wrappedObserver.getNativePtr());
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        mObserverMap.put(obs, wrappedObserver);
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return true;
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    /*
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     * Removes the observer and unregisters it from DistilledPagePrefs changes.
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     * @return whether the observer was removed as a result of the call.
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     */
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    public boolean removeObserver(Observer obs) {
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        DistilledPagePrefsObserverWrapper wrappedObserver = mObserverMap.remove(obs);
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (wrappedObserver == null) return false;
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        nativeRemoveObserver(mDistilledPagePrefsAndroid, wrappedObserver.getNativePtr());
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        wrappedObserver.destroy();
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return true;
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    public void setFontFamily(FontFamily fontFamily) {
1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        nativeSetFontFamily(mDistilledPagePrefsAndroid, fontFamily.asNativeEnum());
1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    public FontFamily getFontFamily() {
1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        return FontFamily.getFontFamilyForValue(nativeGetFontFamily(mDistilledPagePrefsAndroid));
1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    public void setTheme(Theme theme) {
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        nativeSetTheme(mDistilledPagePrefsAndroid, theme.asNativeEnum());
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    public Theme getTheme() {
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return Theme.getThemeForValue(nativeGetTheme(mDistilledPagePrefsAndroid));
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    private native long nativeInit(long distilledPagePrefPtr);
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    private native void nativeSetFontFamily(long nativeDistilledPagePrefsAndroid, int fontFamily);
1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    private native int nativeGetFontFamily(long nativeDistilledPagePrefsAndroid);
1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    private native void nativeSetTheme(long nativeDistilledPagePrefsAndroid, int theme);
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    private native int nativeGetTheme(long nativeDistilledPagePrefsAndroid);
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    private native void nativeAddObserver(long nativeDistilledPagePrefsAndroid,
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            long nativeObserverPtr);
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    private native void nativeRemoveObserver(long nativeDistilledPagePrefsAndroid,
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            long nativeObserverPtr);
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
132