1 /*
2  * Copyright (C) 2021 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 
17 package com.android.tv.settings.service;
18 
19 import android.app.Service;
20 import android.content.Intent;
21 import android.os.Bundle;
22 import android.os.Handler;
23 import android.os.IBinder;
24 import android.util.ArrayMap;
25 import android.util.Log;
26 import android.util.Pair;
27 
28 import androidx.annotation.Nullable;
29 
30 import com.android.tv.settings.service.ISettingsService;
31 import com.android.tv.settings.service.ISettingsServiceListener;
32 import com.android.tv.settings.service.data.State;
33 import com.android.tv.settings.service.data.StateUtil;
34 import com.android.tv.twopanelsettings.slices.ContextSingleton;
35 
36 import java.util.List;
37 
38 public class SettingsService extends Service {
39     private static final String TAG = "TvSettingsService";
40     private static final boolean DEBUG = true;
41     private final Handler mHandler = new Handler();
42     private final ArrayMap<Integer, Pair<State, Integer>> mStateMap = new ArrayMap<>();
43 
44     private ISettingsServiceListener mListener;
45 
46     private final ISettingsService.Stub mBinder = new ISettingsService.Stub() {
47 
48         @Override
49         public List<PreferenceParcelable> getPreferences(int state) {
50             return null;
51         }
52 
53         @Override
54         public PreferenceParcelable getPreference(int state, String key) {
55             return null;
56         }
57 
58         @Override
59         public void registerListener(ISettingsServiceListener listener) {
60             mHandler.post(() -> {
61                 mListener = listener;
62             });
63         }
64 
65         @Override
66         public void unRegisterListener(ISettingsServiceListener listener) {
67             mHandler.post(() -> {
68                 mListener = null;
69             });
70         }
71 
72         @Override
73         public void onCreate(int state, Bundle extras) {
74             mHandler.post(() -> {
75                 if (DEBUG) {
76                     Log.d(TAG, "onCreate " + state);
77                 }
78                 SettingsService.this.onCreateFragment(state, extras);
79             });
80         }
81 
82         @Override
83         public void onStart(int state) {
84             mHandler.post(() -> {
85                 if (DEBUG) {
86                     Log.d(TAG, "onStart " + state);
87                 }
88                 SettingsService.this.onStartFragment(state);
89             });
90         }
91 
92         @Override
93         public void onResume(int state) {
94             mHandler.post(() -> {
95                 if (DEBUG) {
96                     Log.d(TAG, "onResume " + state);
97                 }
98                 SettingsService.this.onResumeFragment(state);
99             });
100 
101         }
102 
103         @Override
104         public void onPause(int state) {
105             mHandler.post(() -> {
106                 if (DEBUG) {
107                     Log.d(TAG, "onPause " + state);
108                 }
109                 SettingsService.this.onPauseFragment(state);
110             });
111         }
112 
113         @Override
114         public void onStop(int state) {
115             mHandler.post(() -> {
116                 if (DEBUG) {
117                     Log.d(TAG, "onStop " + state);
118                 }
119                 SettingsService.this.onStopFragment(state);
120             });
121         }
122 
123         @Override
124         public void onDestroy(int state) {
125             mHandler.post(() -> {
126                 if (DEBUG) {
127                     Log.d(TAG, "onDestroy " + state);
128                 }
129                 SettingsService.this.onDestroyFragment(state);
130             });
131         }
132 
133         @Override
134         public void onPreferenceClick(int state, String key, boolean status) {
135             mHandler.post(() -> {
136                 if (DEBUG) {
137                     Log.d(TAG, "onPreferenceTreeClick " + state + " " + key);
138                 }
139                 SettingsService.this.onPreferenceClick(state, key, status);
140             });
141         }
142 
143         @Override
144         public void grantSliceAccess(String packageName, String uri) {
145             ContextSingleton.getInstance()
146                     .grantFullAccess(getApplicationContext(), uri, packageName);
147         }
148     };
149 
onCreateFragment(int state, Bundle extras)150     void onCreateFragment(int state, Bundle extras) {
151         StateUtil.createState(
152                 getApplicationContext(), state, mListener, mStateMap).onCreate(extras);
153     }
154 
onStartFragment(int state)155     void onStartFragment(int state) {
156         StateUtil.getState(state, mStateMap).onStart();
157     }
158 
159 
onResumeFragment(int state)160     void onResumeFragment(int state) {
161         StateUtil.getState(state, mStateMap).onResume();
162     }
163 
onStopFragment(int state)164     void onStopFragment(int state) {
165         StateUtil.getState(state, mStateMap).onStop();
166     }
167 
onPauseFragment(int state)168     void onPauseFragment(int state) {
169         StateUtil.getState(state, mStateMap).onPause();
170     }
171 
onDestroyFragment(int state)172     void onDestroyFragment(int state) {
173         StateUtil.getState(state, mStateMap).onDestroy();
174         StateUtil.removeState(state, mStateMap);
175     }
176 
onPreferenceClick(int state, String key, boolean status)177     void onPreferenceClick(int state, String key, boolean status) {
178         StateUtil.getState(state, mStateMap).onPreferenceTreeClick(key, status);
179     }
180 
181 
182     @Nullable
183     @Override
onBind(Intent intent)184     public IBinder onBind(Intent intent) {
185         return mBinder;
186     }
187 }
188