Merge changes I0feec96d,Id8eeac2b into udc-qpr-dev
* changes: Refresh PeopleSpace tiles earlier to avoid recomposition Convert PeopleSpaceActivity to Kotlin
This commit is contained in:
committed by
Android (Google) Code Review
commit
0646b88fcb
@@ -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 ->
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user