diff options
4 files changed, 99 insertions, 118 deletions
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/people/ui/compose/PeopleScreen.kt b/packages/SystemUI/compose/features/src/com/android/systemui/people/ui/compose/PeopleScreen.kt index d84e67620177..68f010e1c50d 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/people/ui/compose/PeopleScreen.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/people/ui/compose/PeopleScreen.kt @@ -42,13 +42,10 @@ import androidx.compose.runtime.key import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.asImageBitmap -import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.repeatOnLifecycle import com.android.compose.theme.LocalAndroidColorScheme import com.android.systemui.R import com.android.systemui.compose.modifiers.sysuiResTag @@ -70,15 +67,6 @@ fun PeopleScreen( val priorityTiles by viewModel.priorityTiles.collectAsState() val recentTiles by viewModel.recentTiles.collectAsState() - // Make sure to refresh the tiles/conversations when the lifecycle is resumed, so that it - // updates them when going back to the Activity after leaving it. - val lifecycleOwner = LocalLifecycleOwner.current - LaunchedEffect(lifecycleOwner, viewModel) { - lifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) { - viewModel.onTileRefreshRequested() - } - } - // Call [onResult] this activity when the ViewModel tells us so. LaunchedEffect(viewModel.result) { viewModel.result.collect { result -> diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java deleted file mode 100644 index d1d3e3de39f0..000000000000 --- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) 2020 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.systemui.people; - -import static android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_ID; -import static android.appwidget.AppWidgetManager.INVALID_APPWIDGET_ID; - -import android.content.Intent; -import android.os.Bundle; -import android.util.Log; -import android.view.ViewGroup; - -import androidx.activity.ComponentActivity; -import androidx.lifecycle.ViewModelProvider; - -import com.android.systemui.compose.ComposeFacade; -import com.android.systemui.flags.FeatureFlags; -import com.android.systemui.flags.Flags; -import com.android.systemui.people.ui.view.PeopleViewBinder; -import com.android.systemui.people.ui.viewmodel.PeopleViewModel; - -import javax.inject.Inject; - -import kotlin.Unit; -import kotlin.jvm.functions.Function1; - -/** People Tile Widget configuration activity that shows the user their conversation tiles. */ -public class PeopleSpaceActivity extends ComponentActivity { - - private static final String TAG = "PeopleSpaceActivity"; - private static final boolean DEBUG = PeopleSpaceUtils.DEBUG; - - private final PeopleViewModel.Factory mViewModelFactory; - private final FeatureFlags mFeatureFlags; - - @Inject - public PeopleSpaceActivity(PeopleViewModel.Factory viewModelFactory, - FeatureFlags featureFlags) { - super(); - mViewModelFactory = viewModelFactory; - mFeatureFlags = featureFlags; - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setResult(RESULT_CANCELED); - - PeopleViewModel viewModel = new ViewModelProvider(this, mViewModelFactory).get( - PeopleViewModel.class); - - // Update the widget ID coming from the intent. - int widgetId = getIntent().getIntExtra(EXTRA_APPWIDGET_ID, INVALID_APPWIDGET_ID); - viewModel.onWidgetIdChanged(widgetId); - - Function1<PeopleViewModel.Result, Unit> onResult = (result) -> { - finishActivity(result); - return null; - }; - - if (mFeatureFlags.isEnabled(Flags.COMPOSE_PEOPLE_SPACE) - && ComposeFacade.INSTANCE.isComposeAvailable()) { - Log.d(TAG, "Using the Compose implementation of the PeopleSpaceActivity"); - ComposeFacade.INSTANCE.setPeopleSpaceActivityContent(this, viewModel, onResult); - } else { - Log.d(TAG, "Using the View implementation of the PeopleSpaceActivity"); - ViewGroup view = PeopleViewBinder.create(this); - PeopleViewBinder.bind(view, viewModel, /* lifecycleOwner= */ this, onResult); - setContentView(view); - } - } - - private void finishActivity(PeopleViewModel.Result result) { - if (result instanceof PeopleViewModel.Result.Success) { - if (DEBUG) Log.d(TAG, "Widget added!"); - Intent data = ((PeopleViewModel.Result.Success) result).getData(); - setResult(RESULT_OK, data); - } else { - if (DEBUG) Log.d(TAG, "Activity dismissed with no widgets added!"); - setResult(RESULT_CANCELED); - } - finish(); - } -} diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.kt b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.kt new file mode 100644 index 000000000000..5b7eb454597c --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.kt @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2023 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.systemui.people + +import android.appwidget.AppWidgetManager +import android.os.Bundle +import android.util.Log +import androidx.activity.ComponentActivity +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import com.android.systemui.compose.ComposeFacade.isComposeAvailable +import com.android.systemui.compose.ComposeFacade.setPeopleSpaceActivityContent +import com.android.systemui.flags.FeatureFlags +import com.android.systemui.flags.Flags +import com.android.systemui.people.ui.view.PeopleViewBinder +import com.android.systemui.people.ui.view.PeopleViewBinder.bind +import com.android.systemui.people.ui.viewmodel.PeopleViewModel +import javax.inject.Inject +import kotlinx.coroutines.launch + +/** People Tile Widget configuration activity that shows the user their conversation tiles. */ +class PeopleSpaceActivity +@Inject +constructor( + private val viewModelFactory: PeopleViewModel.Factory, + private val featureFlags: FeatureFlags, +) : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setResult(RESULT_CANCELED) + + // Update the widget ID coming from the intent. + val viewModel = ViewModelProvider(this, viewModelFactory)[PeopleViewModel::class.java] + val widgetId = + intent.getIntExtra( + AppWidgetManager.EXTRA_APPWIDGET_ID, + AppWidgetManager.INVALID_APPWIDGET_ID, + ) + viewModel.onWidgetIdChanged(widgetId) + + // Make sure to refresh the tiles/conversations when the lifecycle is resumed, so that it + // updates them when going back to the Activity after leaving it. + // Note that we do this here instead of inside an effect in the PeopleScreen() composable + // because otherwise onTileRefreshRequested() will be called after the first composition, + // which will trigger a new recomposition and redraw, affecting the GPU memory (see + // b/276871425). + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.RESUMED) { viewModel.onTileRefreshRequested() } + } + + // Set the content of the activity, using either the View or Compose implementation. + if (featureFlags.isEnabled(Flags.COMPOSE_PEOPLE_SPACE) && isComposeAvailable()) { + Log.d(TAG, "Using the Compose implementation of the PeopleSpaceActivity") + setPeopleSpaceActivityContent( + activity = this, + viewModel, + onResult = { finishActivity(it) }, + ) + } else { + Log.d(TAG, "Using the View implementation of the PeopleSpaceActivity") + val view = PeopleViewBinder.create(this) + bind(view, viewModel, lifecycleOwner = this, onResult = { finishActivity(it) }) + setContentView(view) + } + } + + private fun finishActivity(result: PeopleViewModel.Result) { + if (result is PeopleViewModel.Result.Success) { + if (DEBUG) Log.d(TAG, "Widget added!") + setResult(RESULT_OK, result.data) + } else { + if (DEBUG) Log.d(TAG, "Activity dismissed with no widgets added!") + setResult(RESULT_CANCELED) + } + + finish() + } + + companion object { + private const val TAG = "PeopleSpaceActivity" + private const val DEBUG = PeopleSpaceUtils.DEBUG + } +} diff --git a/packages/SystemUI/src/com/android/systemui/people/ui/view/PeopleViewBinder.kt b/packages/SystemUI/src/com/android/systemui/people/ui/view/PeopleViewBinder.kt index d8a429e5bb1a..5f338c30c966 100644 --- a/packages/SystemUI/src/com/android/systemui/people/ui/view/PeopleViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/people/ui/view/PeopleViewBinder.kt @@ -109,14 +109,6 @@ object PeopleViewBinder { } } } - - // Make sure to refresh the tiles/conversations when the Activity is resumed, so that it - // updates them when going back to the Activity after leaving it. - lifecycleOwner.lifecycleScope.launch { - lifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) { - viewModel.onTileRefreshRequested() - } - } } private fun setNoConversationsContent(view: ViewGroup, onGotItClicked: () -> Unit) { |