1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.settings.core.lifecycle;
17 
18 import android.annotation.UiThread;
19 import android.content.Context;
20 import android.os.Bundle;
21 import android.support.annotation.Nullable;
22 import android.support.v7.preference.PreferenceScreen;
23 import android.view.Menu;
24 import android.view.MenuInflater;
25 import android.view.MenuItem;
26 
27 import com.android.settings.core.lifecycle.events.OnAttach;
28 import com.android.settings.core.lifecycle.events.OnCreate;
29 import com.android.settings.core.lifecycle.events.OnCreateOptionsMenu;
30 import com.android.settings.core.lifecycle.events.OnDestroy;
31 import com.android.settings.core.lifecycle.events.OnOptionsItemSelected;
32 import com.android.settings.core.lifecycle.events.OnPause;
33 import com.android.settings.core.lifecycle.events.OnPrepareOptionsMenu;
34 import com.android.settings.core.lifecycle.events.OnResume;
35 import com.android.settings.core.lifecycle.events.OnSaveInstanceState;
36 import com.android.settings.core.lifecycle.events.OnStart;
37 import com.android.settings.core.lifecycle.events.OnStop;
38 import com.android.settings.core.lifecycle.events.SetPreferenceScreen;
39 import com.android.settings.utils.ThreadUtils;
40 
41 import java.util.ArrayList;
42 import java.util.List;
43 
44 /**
45  * Dispatcher for lifecycle events.
46  */
47 public class Lifecycle {
48 
49     protected final List<LifecycleObserver> mObservers = new ArrayList<>();
50 
51     /**
52      * Registers a new observer of lifecycle events.
53      */
54     @UiThread
addObserver(T observer)55     public <T extends LifecycleObserver> T addObserver(T observer) {
56         ThreadUtils.ensureMainThread();
57         mObservers.add(observer);
58         return observer;
59     }
60 
onAttach(Context context)61     public void onAttach(Context context) {
62         for (LifecycleObserver observer : mObservers) {
63             if (observer instanceof OnAttach) {
64                 ((OnAttach) observer).onAttach(context);
65             }
66         }
67     }
68 
onCreate(Bundle savedInstanceState)69     public void onCreate(Bundle savedInstanceState) {
70         for (LifecycleObserver observer : mObservers) {
71             if (observer instanceof OnCreate) {
72                 ((OnCreate) observer).onCreate(savedInstanceState);
73             }
74         }
75     }
76 
onStart()77     public void onStart() {
78         for (LifecycleObserver observer : mObservers) {
79             if (observer instanceof OnStart) {
80                 ((OnStart) observer).onStart();
81             }
82         }
83     }
84 
setPreferenceScreen(PreferenceScreen preferenceScreen)85     public void setPreferenceScreen(PreferenceScreen preferenceScreen) {
86         for (LifecycleObserver observer : mObservers) {
87             if (observer instanceof SetPreferenceScreen) {
88                 ((SetPreferenceScreen) observer).setPreferenceScreen(preferenceScreen);
89             }
90         }
91     }
92 
onResume()93     public void onResume() {
94         for (LifecycleObserver observer : mObservers) {
95             if (observer instanceof OnResume) {
96                 ((OnResume) observer).onResume();
97             }
98         }
99     }
100 
onPause()101     public void onPause() {
102         for (LifecycleObserver observer : mObservers) {
103             if (observer instanceof OnPause) {
104                 ((OnPause) observer).onPause();
105             }
106         }
107     }
108 
onSaveInstanceState(Bundle outState)109     public void onSaveInstanceState(Bundle outState) {
110         for (LifecycleObserver observer : mObservers) {
111             if (observer instanceof OnSaveInstanceState) {
112                 ((OnSaveInstanceState) observer).onSaveInstanceState(outState);
113             }
114         }
115     }
116 
onStop()117     public void onStop() {
118         for (LifecycleObserver observer : mObservers) {
119             if (observer instanceof OnStop) {
120                 ((OnStop) observer).onStop();
121             }
122         }
123     }
124 
onDestroy()125     public void onDestroy() {
126         for (LifecycleObserver observer : mObservers) {
127             if (observer instanceof OnDestroy) {
128                 ((OnDestroy) observer).onDestroy();
129             }
130         }
131     }
132 
onCreateOptionsMenu(final Menu menu, final @Nullable MenuInflater inflater)133     public void onCreateOptionsMenu(final Menu menu, final @Nullable MenuInflater inflater) {
134         for (LifecycleObserver observer : mObservers) {
135             if (observer instanceof OnCreateOptionsMenu) {
136                 ((OnCreateOptionsMenu) observer).onCreateOptionsMenu(menu, inflater);
137             }
138         }
139     }
140 
onPrepareOptionsMenu(final Menu menu)141     public void onPrepareOptionsMenu(final Menu menu) {
142         for (LifecycleObserver observer : mObservers) {
143             if (observer instanceof OnPrepareOptionsMenu) {
144                 ((OnPrepareOptionsMenu) observer).onPrepareOptionsMenu(menu);
145             }
146         }
147     }
148 
onOptionsItemSelected(final MenuItem menuItem)149     public boolean onOptionsItemSelected(final MenuItem menuItem) {
150         for (LifecycleObserver observer : mObservers) {
151             if (observer instanceof OnOptionsItemSelected) {
152                 if (((OnOptionsItemSelected) observer).onOptionsItemSelected(menuItem)) {
153                     return true;
154                 }
155             }
156         }
157         return false;
158     }
159 }
160