Reload homepage cards when necessary

Many users leave Settings app by pressing Home key, but Settings remains
in the same card status and doesn't update when users come back, which
may lead to a bad UX.

This change reloads cards and resets the UI session for some events,
including home key, recent app key, and screen off.

Fixes: 151789260
Test: robotest
Change-Id: Idb575cef4a58894984cb42238d7b3b43c49389a3
This commit is contained in:
Jason Chiu
2020-04-17 19:05:08 +08:00
parent 07431066c4
commit e0327ee583
9 changed files with 419 additions and 77 deletions

View File

@@ -19,12 +19,18 @@ package com.android.settings.homepage.contextualcards;
import static com.android.settings.homepage.contextualcards.ContextualCardsAdapter.SPAN_COUNT;
import android.app.settings.SettingsEnums;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.VisibleForTesting;
import androidx.loader.app.LoaderManager;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.ItemTouchHelper;
@@ -38,6 +44,17 @@ import com.android.settings.wifi.slice.ContextualWifiScanWorker;
public class ContextualCardsFragment extends InstrumentedFragment implements
FocusRecyclerView.FocusListener {
private static final String TAG = "ContextualCardsFragment";
private static final boolean DEBUG = Build.IS_DEBUGGABLE;
@VisibleForTesting
static boolean sRestartLoaderNeeded;
@VisibleForTesting
BroadcastReceiver mKeyEventReceiver;
@VisibleForTesting
BroadcastReceiver mScreenOffReceiver;
private FocusRecyclerView mCardsContainer;
private GridLayoutManager mLayoutManager;
private ContextualCardsAdapter mContextualCardsAdapter;
@@ -53,14 +70,30 @@ public class ContextualCardsFragment extends InstrumentedFragment implements
}
mContextualCardManager = new ContextualCardManager(context, getSettingsLifecycle(),
savedInstanceState);
mKeyEventReceiver = new KeyEventReceiver();
}
@Override
public void onStart() {
super.onStart();
registerScreenOffReceiver();
registerKeyEventReceiver();
ContextualWifiScanWorker.newVisibleUiSession();
mContextualCardManager.loadContextualCards(LoaderManager.getInstance(this));
mContextualCardManager.loadContextualCards(LoaderManager.getInstance(this),
sRestartLoaderNeeded);
sRestartLoaderNeeded = false;
}
@Override
public void onStop() {
unregisterKeyEventReceiver();
super.onStop();
}
@Override
public void onDestroy() {
unregisterScreenOffReceiver();
super.onDestroy();
}
@Override
@@ -92,4 +125,82 @@ public class ContextualCardsFragment extends InstrumentedFragment implements
public int getMetricsCategory() {
return SettingsEnums.SETTINGS_HOMEPAGE;
}
private void registerKeyEventReceiver() {
getActivity().registerReceiver(mKeyEventReceiver,
new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
}
private void unregisterKeyEventReceiver() {
getActivity().unregisterReceiver(mKeyEventReceiver);
}
private void registerScreenOffReceiver() {
if (mScreenOffReceiver == null) {
mScreenOffReceiver = new ScreenOffReceiver();
getActivity().registerReceiver(mScreenOffReceiver,
new IntentFilter(Intent.ACTION_SCREEN_OFF));
}
}
private void unregisterScreenOffReceiver() {
if (mScreenOffReceiver != null) {
getActivity().unregisterReceiver(mScreenOffReceiver);
mScreenOffReceiver = null;
}
}
private void resetSession(Context context) {
sRestartLoaderNeeded = true;
unregisterScreenOffReceiver();
FeatureFactory.getFactory(context).getSlicesFeatureProvider().newUiSession();
}
/**
* Receiver for updating UI session when home key or recent app key is pressed.
*/
@VisibleForTesting
class KeyEventReceiver extends BroadcastReceiver {
private static final String KEY_REASON = "reason";
private static final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
private static final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
@Override
public void onReceive(Context context, Intent intent) {
if (intent == null || !Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) {
return;
}
final String reason = intent.getStringExtra(KEY_REASON);
if (!SYSTEM_DIALOG_REASON_RECENT_APPS.equals(reason)
&& !SYSTEM_DIALOG_REASON_HOME_KEY.equals(reason)) {
return;
}
if (DEBUG) {
Log.d(TAG, "key pressed = " + reason);
}
resetSession(context);
}
}
/**
* Receiver for updating UI session when screen is turned off.
*/
@VisibleForTesting
class ScreenOffReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent == null || !Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
return;
}
if (DEBUG) {
Log.d(TAG, "screen off");
}
resetSession(context);
}
}
}