diff options
author | 2024-07-15 06:56:46 +0000 | |
---|---|---|
committer | 2024-07-15 08:40:16 +0000 | |
commit | ff769c7eb50918ac63649c3b1df2922dd598a94d (patch) | |
tree | d0ce80be083ce74a3f5fdf5344c767a1aaeb7882 | |
parent | 58dbc14544a5a8f25fde5c4c5a2b8b1eaaff0ada (diff) |
Remove SpaSliceProvider and SpaSliceBroadcastReceiver.
Test: Existing tests passed.
Bug: 352442832
Flag: stanza
Change-Id: I1be67c53947819f578f231d50989d88f0aa14893
13 files changed, 0 insertions, 652 deletions
diff --git a/packages/SettingsLib/Spa/gallery/AndroidManifest.xml b/packages/SettingsLib/Spa/gallery/AndroidManifest.xml index df5644b8aad0..26453609fc43 100644 --- a/packages/SettingsLib/Spa/gallery/AndroidManifest.xml +++ b/packages/SettingsLib/Spa/gallery/AndroidManifest.xml @@ -46,20 +46,6 @@ </intent-filter> </provider> - <provider android:name="com.android.settingslib.spa.slice.SpaSliceProvider" - android:authorities="com.android.spa.gallery.slice.provider" - android:exported="true" > - <intent-filter> - <action android:name="android.intent.action.VIEW" /> - <category android:name="android.app.slice.category.SLICE" /> - </intent-filter> - </provider> - - <receiver - android:name="com.android.settingslib.spa.slice.SpaSliceBroadcastReceiver" - android:exported="false"> - </receiver> - <activity android:name="com.android.settingslib.spa.debug.BlankActivity" android:exported="true"> diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt index 91bd7916b0ab..ffd28798d82f 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt @@ -55,7 +55,6 @@ import com.android.settingslib.spa.gallery.ui.CategoryPageProvider import com.android.settingslib.spa.gallery.ui.CopyablePageProvider import com.android.settingslib.spa.gallery.scaffold.ScrollablePagerPageProvider import com.android.settingslib.spa.gallery.ui.SpinnerPageProvider -import com.android.settingslib.spa.slice.SpaSliceBroadcastReceiver /** * Enum to define all SPP name here. @@ -120,9 +119,7 @@ class GallerySpaEnvironment(context: Context) : SpaEnvironment(context) { override val logger = DebugLogger() override val browseActivityClass = GalleryMainActivity::class.java - override val sliceBroadcastReceiverClass = SpaSliceBroadcastReceiver::class.java // For debugging override val searchProviderAuthorities = "com.android.spa.gallery.search.provider" - override val sliceProviderAuthorities = "com.android.spa.gallery.slice.provider" } diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePageProvider.kt index 96de1a778c97..6d1d34628efa 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePageProvider.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/preference/PreferencePageProvider.kt @@ -27,7 +27,6 @@ import androidx.compose.runtime.remember import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import com.android.settingslib.spa.framework.common.EntrySearchData -import com.android.settingslib.spa.framework.common.EntrySliceData import com.android.settingslib.spa.framework.common.EntryStatusData import com.android.settingslib.spa.framework.common.SettingsEntry import com.android.settingslib.spa.framework.common.SettingsEntryBuilder @@ -35,10 +34,8 @@ import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory import com.android.settingslib.spa.framework.common.createSettingsPage import com.android.settingslib.spa.framework.theme.SettingsTheme -import com.android.settingslib.spa.framework.util.createIntent import com.android.settingslib.spa.gallery.R import com.android.settingslib.spa.gallery.SettingsPageProviderEnum -import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.ASYNC_PREFERENCE_SUMMARY import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.ASYNC_PREFERENCE_TITLE import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.AUTO_UPDATE_PREFERENCE_TITLE import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.DISABLE_PREFERENCE_SUMMARY @@ -48,15 +45,10 @@ import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Compan import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.SIMPLE_PREFERENCE_KEYWORDS import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.SIMPLE_PREFERENCE_SUMMARY import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.SIMPLE_PREFERENCE_TITLE -import com.android.settingslib.spa.slice.createBrowsePendingIntent -import com.android.settingslib.spa.slice.provider.createDemoActionSlice -import com.android.settingslib.spa.slice.provider.createDemoBrowseSlice -import com.android.settingslib.spa.slice.provider.createDemoSlice import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spa.widget.preference.SimplePreferenceMacro import com.android.settingslib.spa.widget.ui.SettingsIcon -import kotlinx.coroutines.delay private const val TAG = "PreferencePage" @@ -139,26 +131,6 @@ object PreferencePageProvider : SettingsPageProvider { override val enabled = { model.asyncEnable.value } } ) - } - .setSliceDataFn { sliceUri, _ -> - val createSliceImpl = { s: String -> - createDemoBrowseSlice( - sliceUri = sliceUri, - title = ASYNC_PREFERENCE_TITLE, - summary = s, - ) - } - return@setSliceDataFn object : EntrySliceData() { - init { - postValue(createSliceImpl("(loading)")) - } - - override suspend fun asyncRunner() { - spaLogger.message(TAG, "Async entry loading") - delay(2000L) - postValue(createSliceImpl(ASYNC_PREFERENCE_SUMMARY)) - } - } }.build() ) entryList.add( @@ -176,28 +148,6 @@ object PreferencePageProvider : SettingsPageProvider { } } ) - } - .setSliceDataFn { sliceUri, args -> - val createSliceImpl = { v: Int -> - createDemoActionSlice( - sliceUri = sliceUri, - title = MANUAL_UPDATE_PREFERENCE_TITLE, - summary = "manual update value $v", - ) - } - - return@setSliceDataFn object : EntrySliceData() { - private var tick = args?.getString("init")?.toInt() ?: 0 - - init { - postValue(createSliceImpl(tick)) - } - - override suspend fun asyncAction() { - tick++ - postValue(createSliceImpl(tick)) - } - } }.build() ) entryList.add( @@ -216,33 +166,6 @@ object PreferencePageProvider : SettingsPageProvider { } } ) - } - .setSliceDataFn { sliceUri, args -> - val createSliceImpl = { v: Int -> - createDemoBrowseSlice( - sliceUri = sliceUri, - title = AUTO_UPDATE_PREFERENCE_TITLE, - summary = "auto update value $v", - ) - } - - return@setSliceDataFn object : EntrySliceData() { - private var tick = args?.getString("init")?.toInt() ?: 0 - - init { - postValue(createSliceImpl(tick)) - } - - override suspend fun asyncRunner() { - spaLogger.message(TAG, "autoUpdater.active") - while (true) { - delay(1000L) - tick++ - spaLogger.message(TAG, "autoUpdater.value $tick") - postValue(createSliceImpl(tick)) - } - } - } }.build() ) @@ -272,22 +195,6 @@ object PreferencePageProvider : SettingsPageProvider { clickRoute = SettingsPageProviderEnum.PREFERENCE.name ) } - .setSliceDataFn { sliceUri, _ -> - val intent = owner.createIntent()?.createBrowsePendingIntent() - ?: return@setSliceDataFn null - return@setSliceDataFn object : EntrySliceData() { - init { - postValue( - createDemoSlice( - sliceUri = sliceUri, - title = PAGE_TITLE, - summary = "Injected Entry", - intent = intent, - ) - ) - } - } - } } override fun getTitle(arguments: Bundle?): String { diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SpaEnvironment.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SpaEnvironment.kt index 2d956d5eddb2..6e5132bbb53e 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SpaEnvironment.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/common/SpaEnvironment.kt @@ -17,12 +17,10 @@ package com.android.settingslib.spa.framework.common import android.app.Activity -import android.content.BroadcastReceiver import android.content.Context import android.util.Log import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext -import com.android.settingslib.spa.slice.SettingsSliceDataRepository private const val TAG = "SpaEnvironment" @@ -69,8 +67,6 @@ abstract class SpaEnvironment(context: Context) { val entryRepository = lazy { SettingsEntryRepository(pageProviderRepository.value) } - val sliceDataRepository = lazy { SettingsSliceDataRepository(entryRepository.value) } - // The application context. Use local context as fallback when applicationContext is not // available (e.g. in Robolectric test). val appContext: Context = context.applicationContext ?: context @@ -81,11 +77,9 @@ abstract class SpaEnvironment(context: Context) { // Specify class name of browse activity and slice broadcast receiver, which is used to // generate the necessary intents. open val browseActivityClass: Class<out Activity>? = null - open val sliceBroadcastReceiverClass: Class<out BroadcastReceiver>? = null // Specify provider authorities for debugging purpose. open val searchProviderAuthorities: String? = null - open val sliceProviderAuthorities: String? = null // TODO: add other environment setup here. companion object { diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/slice/SettingsSliceDataRepository.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/slice/SettingsSliceDataRepository.kt deleted file mode 100644 index 7a4750dfb134..000000000000 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/slice/SettingsSliceDataRepository.kt +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settingslib.spa.slice - -import android.net.Uri -import android.util.Log -import com.android.settingslib.spa.framework.common.EntrySliceData -import com.android.settingslib.spa.framework.common.SettingsEntryRepository -import com.android.settingslib.spa.framework.util.getEntryId - -private const val TAG = "SliceDataRepository" - -class SettingsSliceDataRepository(private val entryRepository: SettingsEntryRepository) { - // The map of slice uri to its EntrySliceData, a.k.a. LiveData<Slice?> - private val sliceDataMap: MutableMap<String, EntrySliceData> = mutableMapOf() - - // Note: mark this function synchronized, so that we can get the same livedata during the - // whole lifecycle of a Slice. - @Synchronized - fun getOrBuildSliceData(sliceUri: Uri): EntrySliceData? { - val sliceString = sliceUri.getSliceId() ?: return null - return sliceDataMap[sliceString] ?: buildLiveDataImpl(sliceUri)?.let { - sliceDataMap[sliceString] = it - it - } - } - - fun getActiveSliceData(sliceUri: Uri): EntrySliceData? { - val sliceString = sliceUri.getSliceId() ?: return null - val sliceData = sliceDataMap[sliceString] ?: return null - return if (sliceData.isActive()) sliceData else null - } - - private fun buildLiveDataImpl(sliceUri: Uri): EntrySliceData? { - Log.d(TAG, "buildLiveData: $sliceUri") - - val entryId = sliceUri.getEntryId() ?: return null - val entry = entryRepository.getEntry(entryId) ?: return null - if (!entry.hasSliceSupport) return null - val arguments = sliceUri.getRuntimeArguments() - return entry.getSliceData(runtimeArguments = arguments, sliceUri = sliceUri) - } -} diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/slice/SliceUtil.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/slice/SliceUtil.kt index f3628903dc6d..ec89c7cd3a6c 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/slice/SliceUtil.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/slice/SliceUtil.kt @@ -16,23 +16,10 @@ package com.android.settingslib.spa.slice -import android.app.Activity -import android.app.PendingIntent -import android.content.BroadcastReceiver -import android.content.ComponentName -import android.content.Context -import android.content.Intent import android.net.Uri import android.os.Bundle -import com.android.settingslib.spa.framework.common.SettingsEntry -import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory import com.android.settingslib.spa.framework.util.KEY_DESTINATION import com.android.settingslib.spa.framework.util.KEY_HIGHLIGHT_ENTRY -import com.android.settingslib.spa.framework.util.SESSION_SLICE -import com.android.settingslib.spa.framework.util.SPA_INTENT_RESERVED_KEYS -import com.android.settingslib.spa.framework.util.appendSpaParams -import com.android.settingslib.spa.framework.util.getDestination -import com.android.settingslib.spa.framework.util.getEntryId // Defines SliceUri, which contains special query parameters: // -- KEY_DESTINATION: The route that this slice is navigated to. @@ -45,25 +32,6 @@ fun SliceUri.getEntryId(): String? { return getQueryParameter(KEY_HIGHLIGHT_ENTRY) } -fun SliceUri.getDestination(): String? { - return getQueryParameter(KEY_DESTINATION) -} - -fun SliceUri.getRuntimeArguments(): Bundle { - val params = Bundle() - for (queryName in queryParameterNames) { - if (SPA_INTENT_RESERVED_KEYS.contains(queryName)) continue - params.putString(queryName, getQueryParameter(queryName)) - } - return params -} - -fun SliceUri.getSliceId(): String? { - val entryId = getEntryId() ?: return null - val params = getRuntimeArguments() - return "${entryId}_$params" -} - fun Uri.Builder.appendSpaParams( destination: String? = null, entryId: String? = null, @@ -79,72 +47,3 @@ fun Uri.Builder.appendSpaParams( return this } -fun Uri.Builder.fromEntry( - entry: SettingsEntry, - authority: String?, - runtimeArguments: Bundle? = null -): Uri.Builder { - if (authority == null) return this - val sp = entry.containerPage() - return scheme("content").authority(authority).appendSpaParams( - destination = sp.buildRoute(), - entryId = entry.id, - runtimeArguments = runtimeArguments - ) -} - -fun SliceUri.createBroadcastPendingIntent(): PendingIntent? { - val context = SpaEnvironmentFactory.instance.appContext - val sliceBroadcastClass = - SpaEnvironmentFactory.instance.sliceBroadcastReceiverClass ?: return null - val entryId = getEntryId() ?: return null - return createBroadcastPendingIntent(context, sliceBroadcastClass, entryId) -} - -fun SliceUri.createBrowsePendingIntent(): PendingIntent? { - val context = SpaEnvironmentFactory.instance.appContext - val browseActivityClass = SpaEnvironmentFactory.instance.browseActivityClass ?: return null - val destination = getDestination() ?: return null - val entryId = getEntryId() - return createBrowsePendingIntent(context, browseActivityClass, destination, entryId) -} - -fun Intent.createBrowsePendingIntent(): PendingIntent? { - val context = SpaEnvironmentFactory.instance.appContext - val browseActivityClass = SpaEnvironmentFactory.instance.browseActivityClass ?: return null - val destination = getDestination() ?: return null - val entryId = getEntryId() - return createBrowsePendingIntent(context, browseActivityClass, destination, entryId) -} - -private fun createBrowsePendingIntent( - context: Context, - browseActivityClass: Class<out Activity>, - destination: String, - entryId: String? -): PendingIntent { - val intent = Intent().setComponent(ComponentName(context, browseActivityClass)) - .appendSpaParams(destination, entryId, SESSION_SLICE) - .apply { - // Set both extra and data (which is a Uri) in Slice Intent: - // 1) extra is used in SPA navigation framework - // 2) data is used in Slice framework - data = Uri.Builder().appendSpaParams(destination, entryId).build() - flags = Intent.FLAG_ACTIVITY_NEW_TASK - } - - return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE) -} - -private fun createBroadcastPendingIntent( - context: Context, - sliceBroadcastClass: Class<out BroadcastReceiver>, - entryId: String -): PendingIntent { - val intent = Intent().setComponent(ComponentName(context, sliceBroadcastClass)) - .apply { data = Uri.Builder().appendSpaParams(entryId = entryId).build() } - return PendingIntent.getBroadcast( - context, 0 /* requestCode */, intent, - PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_MUTABLE - ) -} diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/slice/SpaSliceBroadcastReceiver.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/slice/SpaSliceBroadcastReceiver.kt deleted file mode 100644 index 39cb43180f58..000000000000 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/slice/SpaSliceBroadcastReceiver.kt +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settingslib.spa.slice - -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory - -class SpaSliceBroadcastReceiver : BroadcastReceiver() { - override fun onReceive(context: Context?, intent: Intent?) { - val sliceRepository by SpaEnvironmentFactory.instance.sliceDataRepository - val sliceUri = intent?.data ?: return - val sliceData = sliceRepository.getActiveSliceData(sliceUri) ?: return - sliceData.doAction() - } -} diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/slice/SpaSliceProvider.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/slice/SpaSliceProvider.kt deleted file mode 100644 index 3496f02a70e4..000000000000 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/slice/SpaSliceProvider.kt +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settingslib.spa.slice - -import android.net.Uri -import android.util.Log -import androidx.lifecycle.Observer -import androidx.slice.Slice -import androidx.slice.SliceProvider -import com.android.settingslib.spa.framework.common.EntrySliceData -import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.withContext - -private const val TAG = "SpaSliceProvider" - -class SpaSliceProvider : SliceProvider(), Observer<Slice?> { - private fun getOrPutSliceData(sliceUri: Uri): EntrySliceData? { - if (!SpaEnvironmentFactory.isReady()) return null - val sliceRepository by SpaEnvironmentFactory.instance.sliceDataRepository - return sliceRepository.getOrBuildSliceData(sliceUri) - } - - override fun onBindSlice(sliceUri: Uri): Slice? { - if (context == null) return null - Log.d(TAG, "onBindSlice: $sliceUri") - return getOrPutSliceData(sliceUri)?.value - } - - override fun onSlicePinned(sliceUri: Uri) { - Log.d(TAG, "onSlicePinned: $sliceUri") - super.onSlicePinned(sliceUri) - val sliceLiveData = getOrPutSliceData(sliceUri) ?: return - runBlocking { - withContext(Dispatchers.Main) { - sliceLiveData.observeForever(this@SpaSliceProvider) - } - } - } - - override fun onSliceUnpinned(sliceUri: Uri) { - Log.d(TAG, "onSliceUnpinned: $sliceUri") - super.onSliceUnpinned(sliceUri) - val sliceLiveData = getOrPutSliceData(sliceUri) ?: return - runBlocking { - withContext(Dispatchers.Main) { - sliceLiveData.removeObserver(this@SpaSliceProvider) - } - } - } - - override fun onChanged(value: Slice?) { - val uri = value?.uri ?: return - Log.d(TAG, "onChanged: $uri") - context?.contentResolver?.notifyChange(uri, null) - } - - override fun onCreateSliceProvider(): Boolean { - Log.d(TAG, "onCreateSliceProvider") - return true - } -} diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/slice/presenter/Demo.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/slice/presenter/Demo.kt deleted file mode 100644 index 007f47bd3c82..000000000000 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/slice/presenter/Demo.kt +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settingslib.spa.slice.presenter - -import android.net.Uri -import androidx.compose.material3.HorizontalDivider -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.viewinterop.AndroidView -import androidx.lifecycle.compose.LocalLifecycleOwner -import androidx.slice.widget.SliceLiveData -import androidx.slice.widget.SliceView - -@Composable -fun SliceDemo(sliceUri: Uri) { - val context = LocalContext.current - val lifecycleOwner = LocalLifecycleOwner.current - val sliceData = remember { - SliceLiveData.fromUri(context, sliceUri) - } - - HorizontalDivider() - AndroidView( - factory = { localContext -> - val view = SliceView(localContext) - view.setShowTitleItems(true) - view.isScrollable = false - view - }, - update = { view -> sliceData.observe(lifecycleOwner, view) } - ) -} diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/slice/provider/Demo.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/slice/provider/Demo.kt deleted file mode 100644 index e4a738631474..000000000000 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/slice/provider/Demo.kt +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settingslib.spa.slice.provider - -import android.app.PendingIntent -import android.content.Context -import android.net.Uri -import androidx.core.R -import androidx.core.graphics.drawable.IconCompat -import androidx.slice.Slice -import androidx.slice.SliceManager -import androidx.slice.builders.ListBuilder -import androidx.slice.builders.SliceAction -import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory -import com.android.settingslib.spa.slice.createBroadcastPendingIntent -import com.android.settingslib.spa.slice.createBrowsePendingIntent - -fun createDemoBrowseSlice(sliceUri: Uri, title: String, summary: String): Slice? { - val intent = sliceUri.createBrowsePendingIntent() ?: return null - return createDemoSlice(sliceUri, title, summary, intent) -} - -fun createDemoActionSlice(sliceUri: Uri, title: String, summary: String): Slice? { - val intent = sliceUri.createBroadcastPendingIntent() ?: return null - return createDemoSlice(sliceUri, title, summary, intent) -} - -fun createDemoSlice(sliceUri: Uri, title: String, summary: String, intent: PendingIntent): Slice? { - val context = SpaEnvironmentFactory.instance.appContext - if (!SliceManager.getInstance(context).pinnedSlices.contains(sliceUri)) return null - return ListBuilder(context, sliceUri, ListBuilder.INFINITY) - .addRow(ListBuilder.RowBuilder().apply { - setPrimaryAction(createSliceAction(context, intent)) - setTitle(title) - setSubtitle(summary) - }).build() -} - -private fun createSliceAction(context: Context, intent: PendingIntent): SliceAction { - return SliceAction.create( - intent, - IconCompat.createWithResource(context, R.drawable.notification_action_background), - ListBuilder.ICON_IMAGE, - "Enter app" - ) -} diff --git a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/slice/SettingsSliceDataRepositoryTest.kt b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/slice/SettingsSliceDataRepositoryTest.kt deleted file mode 100644 index 341a4a5134f9..000000000000 --- a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/slice/SettingsSliceDataRepositoryTest.kt +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settingslib.spa.slice - -import android.content.Context -import android.net.Uri -import androidx.arch.core.executor.testing.InstantTaskExecutorRule -import androidx.lifecycle.Observer -import androidx.slice.Slice -import androidx.test.core.app.ApplicationProvider -import androidx.test.ext.junit.runners.AndroidJUnit4 -import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory -import com.android.settingslib.spa.framework.common.createSettingsPage -import com.android.settingslib.spa.framework.util.genEntryId -import com.android.settingslib.spa.tests.testutils.SpaEnvironmentForTest -import com.android.settingslib.spa.tests.testutils.SppHome -import com.android.settingslib.spa.tests.testutils.SppLayer2 -import com.google.common.truth.Truth.assertThat -import org.junit.Rule -import org.junit.Test -import org.junit.runner.RunWith - -@RunWith(AndroidJUnit4::class) -class SettingsSliceDataRepositoryTest { - @get:Rule val instantTaskExecutorRule = InstantTaskExecutorRule() - - private val context: Context = ApplicationProvider.getApplicationContext() - private val spaEnvironment = - SpaEnvironmentForTest(context, listOf(SppHome.createSettingsPage())) - private val sliceDataRepository by spaEnvironment.sliceDataRepository - - @Test - fun getOrBuildSliceDataTest() { - SpaEnvironmentFactory.reset(spaEnvironment) - - // Slice empty - assertThat(sliceDataRepository.getOrBuildSliceData(Uri.EMPTY)).isNull() - - // Slice supported - val page = SppLayer2.createSettingsPage() - val entryId = genEntryId("Layer2Entry1", page) - val sliceUri = Uri.Builder().appendSpaParams(page.buildRoute(), entryId).build() - assertThat(sliceUri.getDestination()).isEqualTo("SppLayer2") - assertThat(sliceUri.getSliceId()).isEqualTo("${entryId}_Bundle[{}]") - val sliceData = sliceDataRepository.getOrBuildSliceData(sliceUri) - assertThat(sliceData).isNotNull() - assertThat(sliceDataRepository.getOrBuildSliceData(sliceUri)).isSameInstanceAs(sliceData) - - // Slice unsupported - val entryId2 = genEntryId("Layer2Entry2", page) - val sliceUri2 = Uri.Builder().appendSpaParams(page.buildRoute(), entryId2).build() - assertThat(sliceUri2.getDestination()).isEqualTo("SppLayer2") - assertThat(sliceUri2.getSliceId()).isEqualTo("${entryId2}_Bundle[{}]") - assertThat(sliceDataRepository.getOrBuildSliceData(sliceUri2)).isNull() - } - - @Test - fun getActiveSliceDataTest() { - SpaEnvironmentFactory.reset(spaEnvironment) - - val page = SppLayer2.createSettingsPage() - val entryId = genEntryId("Layer2Entry1", page) - val sliceUri = Uri.Builder().appendSpaParams(page.buildRoute(), entryId).build() - - // build slice data first - val sliceData = sliceDataRepository.getOrBuildSliceData(sliceUri) - - // slice data is inactive - assertThat(sliceData!!.isActive()).isFalse() - assertThat(sliceDataRepository.getActiveSliceData(sliceUri)).isNull() - - // slice data is active - val observer = Observer<Slice?> { } - sliceData.observeForever(observer) - assertThat(sliceData.isActive()).isTrue() - assertThat(sliceDataRepository.getActiveSliceData(sliceUri)).isSameInstanceAs(sliceData) - - // slice data is inactive again - sliceData.removeObserver(observer) - assertThat(sliceData.isActive()).isFalse() - assertThat(sliceDataRepository.getActiveSliceData(sliceUri)).isNull() - } -} diff --git a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/slice/SliceUtilTest.kt b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/slice/SliceUtilTest.kt index d1c4e5110f60..b489afdae157 100644 --- a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/slice/SliceUtilTest.kt +++ b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/slice/SliceUtilTest.kt @@ -16,91 +16,27 @@ package com.android.settingslib.spa.slice -import android.content.Context -import android.content.Intent import android.net.Uri import androidx.core.os.bundleOf -import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 -import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory -import com.android.settingslib.spa.tests.testutils.SpaEnvironmentForTest import com.google.common.truth.Truth.assertThat import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) class SliceUtilTest { - private val context: Context = ApplicationProvider.getApplicationContext() - private val spaEnvironment = SpaEnvironmentForTest(context) - @Test fun sliceUriTest() { assertThat(Uri.EMPTY.getEntryId()).isNull() - assertThat(Uri.EMPTY.getDestination()).isNull() - assertThat(Uri.EMPTY.getRuntimeArguments().size()).isEqualTo(0) - assertThat(Uri.EMPTY.getSliceId()).isNull() // valid slice uri val dest = "myRoute" val entryId = "myEntry" val sliceUriWithoutParams = Uri.Builder().appendSpaParams(dest, entryId).build() assertThat(sliceUriWithoutParams.getEntryId()).isEqualTo(entryId) - assertThat(sliceUriWithoutParams.getDestination()).isEqualTo(dest) - assertThat(sliceUriWithoutParams.getRuntimeArguments().size()).isEqualTo(0) - assertThat(sliceUriWithoutParams.getSliceId()).isEqualTo("${entryId}_Bundle[{}]") val sliceUriWithParams = Uri.Builder().appendSpaParams(dest, entryId, bundleOf("p1" to "v1")).build() assertThat(sliceUriWithParams.getEntryId()).isEqualTo(entryId) - assertThat(sliceUriWithParams.getDestination()).isEqualTo(dest) - assertThat(sliceUriWithParams.getRuntimeArguments().size()).isEqualTo(1) - assertThat(sliceUriWithParams.getSliceId()).isEqualTo("${entryId}_Bundle[{p1=v1}]") - } - - @Test - fun createBroadcastPendingIntentTest() { - SpaEnvironmentFactory.reset(spaEnvironment) - - // Empty Slice Uri - assertThat(Uri.EMPTY.createBroadcastPendingIntent()).isNull() - - // Valid Slice Uri - val dest = "myRoute" - val entryId = "myEntry" - val sliceUriWithoutParams = Uri.Builder().appendSpaParams(dest, entryId).build() - val pendingIntent = sliceUriWithoutParams.createBroadcastPendingIntent() - assertThat(pendingIntent).isNotNull() - assertThat(pendingIntent!!.isBroadcast).isTrue() - assertThat(pendingIntent.isImmutable).isFalse() - } - - @Test - fun createBrowsePendingIntentTest() { - SpaEnvironmentFactory.reset(spaEnvironment) - - // Empty Slice Uri - assertThat(Uri.EMPTY.createBrowsePendingIntent()).isNull() - - // Empty Intent - assertThat(Intent().createBrowsePendingIntent()).isNull() - - // Valid Slice Uri - val dest = "myRoute" - val entryId = "myEntry" - val sliceUri = Uri.Builder().appendSpaParams(dest, entryId).build() - val pendingIntent = sliceUri.createBrowsePendingIntent() - assertThat(pendingIntent).isNotNull() - assertThat(pendingIntent!!.isActivity).isTrue() - assertThat(pendingIntent.isImmutable).isTrue() - - // Valid Intent - val intent = Intent().apply { - putExtra("spaActivityDestination", dest) - putExtra("highlightEntry", entryId) - } - val pendingIntent2 = intent.createBrowsePendingIntent() - assertThat(pendingIntent2).isNotNull() - assertThat(pendingIntent2!!.isActivity).isTrue() - assertThat(pendingIntent2.isImmutable).isTrue() } }
\ No newline at end of file diff --git a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/tests/testutils/SpaEnvironmentForTest.kt b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/tests/testutils/SpaEnvironmentForTest.kt index 22a5ca328755..4f8fd794b248 100644 --- a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/tests/testutils/SpaEnvironmentForTest.kt +++ b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/tests/testutils/SpaEnvironmentForTest.kt @@ -216,8 +216,6 @@ class SpaEnvironmentForTest( context: Context, rootPages: List<SettingsPage> = emptyList(), override val browseActivityClass: Class<out Activity>? = BlankActivity::class.java, - override val sliceBroadcastReceiverClass: Class<out BroadcastReceiver>? = - BlankSliceBroadcastReceiver::class.java, override val logger: SpaLogger = object : SpaLogger {} ) : SpaEnvironment(context) { |