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.settingslib.core.lifecycle;
17 
18 
19 import static androidx.lifecycle.Lifecycle.Event.ON_CREATE;
20 import static androidx.lifecycle.Lifecycle.Event.ON_DESTROY;
21 import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE;
22 import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
23 import static androidx.lifecycle.Lifecycle.Event.ON_START;
24 import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
25 
26 import android.annotation.CallSuper;
27 import android.content.Context;
28 import android.os.Bundle;
29 import android.view.Menu;
30 import android.view.MenuInflater;
31 import android.view.MenuItem;
32 
33 import androidx.lifecycle.LifecycleOwner;
34 import androidx.preference.PreferenceFragmentCompat;
35 import androidx.preference.PreferenceScreen;
36 
37 /**
38  * {@link PreferenceFragmentCompat} that has hooks to observe fragment lifecycle events.
39  */
40 public abstract class ObservablePreferenceFragment extends PreferenceFragmentCompat
41         implements LifecycleOwner {
42 
43     private final Lifecycle mLifecycle = new Lifecycle(this);
44 
getSettingsLifecycle()45     public Lifecycle getSettingsLifecycle() {
46         return mLifecycle;
47     }
48 
49     @CallSuper
50     @Override
onAttach(Context context)51     public void onAttach(Context context) {
52         super.onAttach(context);
53         mLifecycle.onAttach(context);
54     }
55 
56     @CallSuper
57     @Override
onCreate(Bundle savedInstanceState)58     public void onCreate(Bundle savedInstanceState) {
59         mLifecycle.onCreate(savedInstanceState);
60         mLifecycle.handleLifecycleEvent(ON_CREATE);
61         super.onCreate(savedInstanceState);
62     }
63 
64     @Override
setPreferenceScreen(PreferenceScreen preferenceScreen)65     public void setPreferenceScreen(PreferenceScreen preferenceScreen) {
66         mLifecycle.setPreferenceScreen(preferenceScreen);
67         super.setPreferenceScreen(preferenceScreen);
68     }
69 
70     @CallSuper
71     @Override
onSaveInstanceState(Bundle outState)72     public void onSaveInstanceState(Bundle outState) {
73         super.onSaveInstanceState(outState);
74         mLifecycle.onSaveInstanceState(outState);
75     }
76 
77     @CallSuper
78     @Override
onStart()79     public void onStart() {
80         mLifecycle.handleLifecycleEvent(ON_START);
81         super.onStart();
82     }
83 
84     @CallSuper
85     @Override
onResume()86     public void onResume() {
87         mLifecycle.handleLifecycleEvent(ON_RESUME);
88         super.onResume();
89     }
90 
91     @CallSuper
92     @Override
onPause()93     public void onPause() {
94         mLifecycle.handleLifecycleEvent(ON_PAUSE);
95         super.onPause();
96     }
97 
98     @CallSuper
99     @Override
onStop()100     public void onStop() {
101         mLifecycle.handleLifecycleEvent(ON_STOP);
102         super.onStop();
103     }
104 
105     @CallSuper
106     @Override
onDestroy()107     public void onDestroy() {
108         mLifecycle.handleLifecycleEvent(ON_DESTROY);
109         super.onDestroy();
110     }
111 
112     @CallSuper
113     @Override
onCreateOptionsMenu(final Menu menu, final MenuInflater inflater)114     public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) {
115         mLifecycle.onCreateOptionsMenu(menu, inflater);
116         super.onCreateOptionsMenu(menu, inflater);
117     }
118 
119     @CallSuper
120     @Override
onPrepareOptionsMenu(final Menu menu)121     public void onPrepareOptionsMenu(final Menu menu) {
122         mLifecycle.onPrepareOptionsMenu(menu);
123         super.onPrepareOptionsMenu(menu);
124     }
125 
126     @CallSuper
127     @Override
onOptionsItemSelected(final MenuItem menuItem)128     public boolean onOptionsItemSelected(final MenuItem menuItem) {
129         boolean lifecycleHandled = mLifecycle.onOptionsItemSelected(menuItem);
130         if (!lifecycleHandled) {
131             return super.onOptionsItemSelected(menuItem);
132         }
133         return lifecycleHandled;
134     }
135 }
136