1 /* 2 * Copyright (C) 2022 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.settingslib.spa.slice 18 19 import android.net.Uri 20 import android.util.Log 21 import androidx.lifecycle.Observer 22 import androidx.slice.Slice 23 import androidx.slice.SliceProvider 24 import com.android.settingslib.spa.framework.common.EntrySliceData 25 import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory 26 import kotlinx.coroutines.Dispatchers 27 import kotlinx.coroutines.runBlocking 28 import kotlinx.coroutines.withContext 29 30 private const val TAG = "SpaSliceProvider" 31 32 class SpaSliceProvider : SliceProvider(), Observer<Slice?> { getOrPutSliceDatanull33 private fun getOrPutSliceData(sliceUri: Uri): EntrySliceData? { 34 if (!SpaEnvironmentFactory.isReady()) return null 35 val sliceRepository by SpaEnvironmentFactory.instance.sliceDataRepository 36 return sliceRepository.getOrBuildSliceData(sliceUri) 37 } 38 onBindSlicenull39 override fun onBindSlice(sliceUri: Uri): Slice? { 40 if (context == null) return null 41 Log.d(TAG, "onBindSlice: $sliceUri") 42 return getOrPutSliceData(sliceUri)?.value 43 } 44 onSlicePinnednull45 override fun onSlicePinned(sliceUri: Uri) { 46 Log.d(TAG, "onSlicePinned: $sliceUri") 47 super.onSlicePinned(sliceUri) 48 val sliceLiveData = getOrPutSliceData(sliceUri) ?: return 49 runBlocking { 50 withContext(Dispatchers.Main) { 51 sliceLiveData.observeForever(this@SpaSliceProvider) 52 } 53 } 54 } 55 onSliceUnpinnednull56 override fun onSliceUnpinned(sliceUri: Uri) { 57 Log.d(TAG, "onSliceUnpinned: $sliceUri") 58 super.onSliceUnpinned(sliceUri) 59 val sliceLiveData = getOrPutSliceData(sliceUri) ?: return 60 runBlocking { 61 withContext(Dispatchers.Main) { 62 sliceLiveData.removeObserver(this@SpaSliceProvider) 63 } 64 } 65 } 66 onChangednull67 override fun onChanged(value: Slice?) { 68 val uri = value?.uri ?: return 69 Log.d(TAG, "onChanged: $uri") 70 context?.contentResolver?.notifyChange(uri, null) 71 } 72 onCreateSliceProvidernull73 override fun onCreateSliceProvider(): Boolean { 74 Log.d(TAG, "onCreateSliceProvider") 75 return true 76 } 77 } 78