1// Copyright 2013 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.base;
6
7import android.app.Activity;
8import android.app.Application;
9import android.os.Bundle;
10import android.view.Window;
11
12/**
13 * Basic application functionality that should be shared among all browser applications.
14 */
15public class BaseChromiumApplication extends Application {
16    /**
17     * Interface to be implemented by listeners for window focus events.
18     */
19    public interface WindowFocusChangedListener {
20        /**
21         * Called when the window focus changes for {@code activity}.
22         * @param activity The {@link Activity} that has a window focus changed event.
23         * @param hasFocus Whether or not {@code activity} gained or lost focus.
24         */
25        public void onWindowFocusChanged(Activity activity, boolean hasFocus);
26    }
27
28    private ObserverList<WindowFocusChangedListener> mWindowFocusListeners =
29            new ObserverList<WindowFocusChangedListener>();
30
31    @Override
32    public void onCreate() {
33        super.onCreate();
34        ApplicationStatus.initialize(this);
35
36        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
37            @Override
38            public void onActivityCreated(final Activity activity, Bundle savedInstanceState) {
39                Window.Callback callback = activity.getWindow().getCallback();
40                activity.getWindow().setCallback(new WindowCallbackWrapper(callback) {
41                    @Override
42                    public void onWindowFocusChanged(boolean hasFocus) {
43                        super.onWindowFocusChanged(hasFocus);
44
45                        for (WindowFocusChangedListener listener : mWindowFocusListeners) {
46                            listener.onWindowFocusChanged(activity, hasFocus);
47                        }
48                    }
49                });
50            }
51
52            @Override
53            public void onActivityDestroyed(Activity activity) {
54                assert activity.getWindow().getCallback() instanceof WindowCallbackWrapper;
55            }
56
57            @Override
58            public void onActivityPaused(Activity activity) {
59                assert activity.getWindow().getCallback() instanceof WindowCallbackWrapper;
60            }
61
62            @Override
63            public void onActivityResumed(Activity activity) {
64                assert activity.getWindow().getCallback() instanceof WindowCallbackWrapper;
65            }
66
67            @Override
68            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
69                assert activity.getWindow().getCallback() instanceof WindowCallbackWrapper;
70            }
71
72            @Override
73            public void onActivityStarted(Activity activity) {
74                assert activity.getWindow().getCallback() instanceof WindowCallbackWrapper;
75            }
76
77            @Override
78            public void onActivityStopped(Activity activity) {
79                assert activity.getWindow().getCallback() instanceof WindowCallbackWrapper;
80            }
81        });
82    }
83
84    /**
85     * Registers a listener to receive window focus updates on activities in this application.
86     * @param listener Listener to receive window focus events.
87     */
88    public void registerWindowFocusChangedListener(WindowFocusChangedListener listener) {
89        mWindowFocusListeners.addObserver(listener);
90    }
91
92    /**
93     * Unregisters a listener from receiving window focus updates on activities in this application.
94     * @param listener Listener that doesn't want to receive window focus events.
95     */
96    public void unregisterWindowFocusChangedListener(WindowFocusChangedListener listener) {
97        mWindowFocusListeners.removeObserver(listener);
98    }
99}
100