SetupWizard: Fix status bar managing workflow
StatusBarManager uses tokens in binder connections to identify disable records and queue each of them accordingly. New record creates each time an application connects to StatusBarManager and tries to change the state. New records don't activate until previous ones are destroyed. Records can be destroyed either when app binder dies, or when the same binder ticket reverts its previous changes. To accomodate this behavior, StatusBarManager was moved to a static class that initializes first when status bar gets disabled, and then gets destroyed when status bar is re-enabled. While we're at it, also fix race condition between main and exit activites by moving status bar disabling code to the application class. Change-Id: I3b33e628da1e1881181cbe665e6aaccee3dd19ef
This commit is contained in:
committed by
Timi Rautamäki
parent
44fb45c421
commit
fbf886e808
@@ -49,7 +49,6 @@ import android.os.UserManager;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewTreeObserver;
|
|
||||||
import android.view.animation.Animation;
|
import android.view.animation.Animation;
|
||||||
import android.view.animation.AnimationUtils;
|
import android.view.animation.AnimationUtils;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
@@ -64,8 +63,7 @@ import org.lineageos.setupwizard.util.SetupWizardUtils;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public abstract class BaseSetupWizardActivity extends Activity implements NavigationBarListener,
|
public abstract class BaseSetupWizardActivity extends Activity implements NavigationBarListener {
|
||||||
ViewTreeObserver.OnPreDrawListener {
|
|
||||||
|
|
||||||
public static final String TAG = BaseSetupWizardActivity.class.getSimpleName();
|
public static final String TAG = BaseSetupWizardActivity.class.getSimpleName();
|
||||||
|
|
||||||
@@ -81,10 +79,6 @@ public abstract class BaseSetupWizardActivity extends Activity implements Naviga
|
|||||||
protected static final int BIOMETRIC_ACTIVITY_REQUEST = 10101;
|
protected static final int BIOMETRIC_ACTIVITY_REQUEST = 10101;
|
||||||
protected static final int SCREENLOCK_ACTIVITY_REQUEST = 10102;
|
protected static final int SCREENLOCK_ACTIVITY_REQUEST = 10102;
|
||||||
|
|
||||||
private static final int IMMERSIVE_FLAGS = View.STATUS_BAR_DISABLE_HOME
|
|
||||||
| View.STATUS_BAR_DISABLE_RECENT;
|
|
||||||
private int mSystemUiFlags = IMMERSIVE_FLAGS;
|
|
||||||
|
|
||||||
private NavigationLayout mNavigationBar;
|
private NavigationLayout mNavigationBar;
|
||||||
|
|
||||||
protected boolean mIsActivityVisible = false;
|
protected boolean mIsActivityVisible = false;
|
||||||
@@ -120,11 +114,6 @@ public abstract class BaseSetupWizardActivity extends Activity implements Naviga
|
|||||||
mNavigationBar = getNavigationBar();
|
mNavigationBar = getNavigationBar();
|
||||||
if (mNavigationBar != null) {
|
if (mNavigationBar != null) {
|
||||||
mNavigationBar.setNavigationBarListener(this);
|
mNavigationBar.setNavigationBarListener(this);
|
||||||
mNavigationBar.setSystemUiVisibility(mSystemUiFlags);
|
|
||||||
// Set the UI flags before draw because the visibility might change in unexpected /
|
|
||||||
// undetectable times, like transitioning from a finishing activity that had a keyboard
|
|
||||||
ViewTreeObserver viewTreeObserver = mNavigationBar.getViewTreeObserver();
|
|
||||||
viewTreeObserver.addOnPreDrawListener(this);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,14 +208,6 @@ public abstract class BaseSetupWizardActivity extends Activity implements Naviga
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onPreDraw() {
|
|
||||||
// View.setSystemUiVisibility checks if the visibility changes before applying them
|
|
||||||
// so the performance impact is contained
|
|
||||||
mNavigationBar.setSystemUiVisibility(mSystemUiFlags);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The navigation bar instance in the layout, or null if the layout does not have a
|
* @return The navigation bar instance in the layout, or null if the layout does not have a
|
||||||
* navigation bar.
|
* navigation bar.
|
||||||
@@ -315,7 +296,6 @@ public abstract class BaseSetupWizardActivity extends Activity implements Naviga
|
|||||||
|
|
||||||
protected void onSetupStart() {
|
protected void onSetupStart() {
|
||||||
SetupWizardUtils.disableCaptivePortalDetection(getApplicationContext());
|
SetupWizardUtils.disableCaptivePortalDetection(getApplicationContext());
|
||||||
SetupWizardUtils.disableStatusBar(getApplicationContext());
|
|
||||||
tryEnablingWifi();
|
tryEnablingWifi();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -19,6 +19,7 @@ package org.lineageos.setupwizard;
|
|||||||
|
|
||||||
|
|
||||||
import android.app.Application;
|
import android.app.Application;
|
||||||
|
import android.app.StatusBarManager;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@@ -69,6 +70,8 @@ public class SetupWizardApp extends Application {
|
|||||||
|
|
||||||
public static final int RADIO_READY_TIMEOUT = 10 * 1000;
|
public static final int RADIO_READY_TIMEOUT = 10 * 1000;
|
||||||
|
|
||||||
|
private static StatusBarManager sStatusBarManager;
|
||||||
|
|
||||||
private boolean mIsRadioReady = false;
|
private boolean mIsRadioReady = false;
|
||||||
private boolean mIgnoreSimLocale = false;
|
private boolean mIgnoreSimLocale = false;
|
||||||
|
|
||||||
@@ -87,9 +90,14 @@ public class SetupWizardApp extends Application {
|
|||||||
PhoneMonitor.initInstance(this);
|
PhoneMonitor.initInstance(this);
|
||||||
SetupWizardUtils.disableComponentsForMissingFeatures(this);
|
SetupWizardUtils.disableComponentsForMissingFeatures(this);
|
||||||
SetupWizardUtils.setMobileDataEnabled(this, false);
|
SetupWizardUtils.setMobileDataEnabled(this, false);
|
||||||
|
sStatusBarManager = SetupWizardUtils.disableStatusBar(this);
|
||||||
mHandler.postDelayed(mRadioTimeoutRunnable, SetupWizardApp.RADIO_READY_TIMEOUT);
|
mHandler.postDelayed(mRadioTimeoutRunnable, SetupWizardApp.RADIO_READY_TIMEOUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static StatusBarManager getStatusBarManager() {
|
||||||
|
return sStatusBarManager;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isRadioReady() {
|
public boolean isRadioReady() {
|
||||||
return mIsRadioReady;
|
return mIsRadioReady;
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2013 The CyanogenMod Project
|
* Copyright (C) 2013 The CyanogenMod Project
|
||||||
* Copyright (C) 2017 The LineageOS Project
|
* Copyright (C) 2017-2021 The LineageOS Project
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -17,9 +17,6 @@
|
|||||||
|
|
||||||
package org.lineageos.setupwizard.util;
|
package org.lineageos.setupwizard.util;
|
||||||
|
|
||||||
import static android.app.StatusBarManager.DISABLE_NONE;
|
|
||||||
import static android.app.StatusBarManager.DISABLE_NOTIFICATION_ALERTS;
|
|
||||||
import static android.app.StatusBarManager.DISABLE_SEARCH;
|
|
||||||
import static android.content.Context.MODE_PRIVATE;
|
import static android.content.Context.MODE_PRIVATE;
|
||||||
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
|
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
|
||||||
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
|
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
|
||||||
@@ -166,24 +163,34 @@ public class SetupWizardUtils {
|
|||||||
Settings.Global.putInt(context.getContentResolver(), KEY_DETECT_CAPTIVE_PORTAL, 1);
|
Settings.Global.putInt(context.getContentResolver(), KEY_DETECT_CAPTIVE_PORTAL, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void disableStatusBar(Context context) {
|
public static StatusBarManager disableStatusBar(Context context) {
|
||||||
StatusBarManager statusBarManager = context.getSystemService(StatusBarManager.class);
|
StatusBarManager statusBarManager = context.getSystemService(StatusBarManager.class);
|
||||||
if (statusBarManager != null) {
|
if (statusBarManager != null) {
|
||||||
statusBarManager.disable(DISABLE_NOTIFICATION_ALERTS | DISABLE_SEARCH
|
if (LOGV) {
|
||||||
);
|
Log.v(SetupWizardApp.TAG, "Disabling status bar");
|
||||||
|
}
|
||||||
|
statusBarManager.setDisabledForSetup(true);
|
||||||
} else {
|
} else {
|
||||||
Log.w(SetupWizardApp.TAG,
|
Log.w(SetupWizardApp.TAG,
|
||||||
"Skip disabling notfications - could not get StatusBarManager");
|
"Skip disabling status bar - could not get StatusBarManager");
|
||||||
}
|
}
|
||||||
|
return statusBarManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void enableStatusBar(Context context) {
|
public static void enableStatusBar(Context context) {
|
||||||
StatusBarManager statusBarManager = context.getSystemService(StatusBarManager.class);
|
final SetupWizardApp setupWizardApp = (SetupWizardApp)context.getApplicationContext();
|
||||||
if(statusBarManager != null) {
|
StatusBarManager statusBarManager = setupWizardApp.getStatusBarManager();
|
||||||
Log.i(SetupWizardApp.TAG, "Enabling notfications - StatusBarManager");
|
if (statusBarManager != null) {
|
||||||
statusBarManager.disable(DISABLE_NONE);
|
if (LOGV) {
|
||||||
|
Log.v(SetupWizardApp.TAG, "Enabling status bar");
|
||||||
|
}
|
||||||
|
statusBarManager.setDisabledForSetup(false);
|
||||||
|
|
||||||
|
// Session must be destroyed if it's not used anymore
|
||||||
|
statusBarManager = null;
|
||||||
} else {
|
} else {
|
||||||
Log.i(SetupWizardApp.TAG, "Skip enabling notfications - StatusBarManager is null");
|
Log.w(SetupWizardApp.TAG,
|
||||||
|
"Skip enabling status bar - could not get StatusBarManager");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user