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