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:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user