Merge "Introduce static @hide PowerManager.isRebootingUserspaceSupportedImpl()" am: d8f9951f21

Change-Id: I35e5111b5db8be175c85032a90c82336ff9373be
This commit is contained in:
Nikita Ioffe
2020-04-09 18:28:37 +00:00
committed by Automerger Merge Worker
3 changed files with 24 additions and 2 deletions

View File

@@ -24,6 +24,7 @@ import android.os.RemoteException;
import android.os.ServiceManager; import android.os.ServiceManager;
import android.os.SystemClock; import android.os.SystemClock;
import android.os.SystemProperties; import android.os.SystemProperties;
import android.sysprop.InitProperties;
public class PowerCommand extends Svc.Command { public class PowerCommand extends Svc.Command {
private static final int FORCE_SUSPEND_DELAY_DEFAULT_MILLIS = 0; private static final int FORCE_SUSPEND_DELAY_DEFAULT_MILLIS = 0;
@@ -103,6 +104,8 @@ public class PowerCommand extends Svc.Command {
pm.reboot(false, mode, true); pm.reboot(false, mode, true);
} catch (RemoteException e) { } catch (RemoteException e) {
maybeLogRemoteException("Failed to reboot."); maybeLogRemoteException("Failed to reboot.");
} catch (Exception e) {
System.err.println("Failed to reboot: " + e.getMessage());
} }
return; return;
} else if ("shutdown".equals(args[1])) { } else if ("shutdown".equals(args[1])) {
@@ -138,7 +141,9 @@ public class PowerCommand extends Svc.Command {
// if it is already in shutdown flow. // if it is already in shutdown flow.
private void maybeLogRemoteException(String msg) { private void maybeLogRemoteException(String msg) {
String powerProp = SystemProperties.get("sys.powerctl"); String powerProp = SystemProperties.get("sys.powerctl");
if (powerProp.isEmpty()) { // Also check if userspace reboot is ongoing, since in case of userspace reboot value of the
// sys.powerctl property will be reset.
if (powerProp.isEmpty() && !InitProperties.userspace_reboot_in_progress().orElse(false)) {
System.err.println(msg); System.err.println(msg);
} }
} }

View File

@@ -1332,12 +1332,25 @@ public final class PowerManager {
} }
} }
/**
* Returns {@code true} if this device supports rebooting userspace.
*
* <p>This method exists solely for the sake of re-using same logic between {@code PowerManager}
* and {@code PowerManagerService}.
*
* @hide
*/
public static boolean isRebootingUserspaceSupportedImpl() {
return InitProperties.is_userspace_reboot_supported().orElse(false);
}
/** /**
* Returns {@code true} if this device supports rebooting userspace. * Returns {@code true} if this device supports rebooting userspace.
*/ */
// TODO(b/138605180): add link to documentation once it's ready. // TODO(b/138605180): add link to documentation once it's ready.
public boolean isRebootingUserspaceSupported() { public boolean isRebootingUserspaceSupported() {
return InitProperties.is_userspace_reboot_supported().orElse(false); return isRebootingUserspaceSupportedImpl();
} }
/** /**

View File

@@ -2843,6 +2843,10 @@ public final class PowerManagerService extends SystemService
private void shutdownOrRebootInternal(final @HaltMode int haltMode, final boolean confirm, private void shutdownOrRebootInternal(final @HaltMode int haltMode, final boolean confirm,
@Nullable final String reason, boolean wait) { @Nullable final String reason, boolean wait) {
if (PowerManager.REBOOT_USERSPACE.equals(reason)) { if (PowerManager.REBOOT_USERSPACE.equals(reason)) {
if (!PowerManager.isRebootingUserspaceSupportedImpl()) {
throw new UnsupportedOperationException(
"Attempted userspace reboot on a device that doesn't support it");
}
UserspaceRebootLogger.noteUserspaceRebootWasRequested(); UserspaceRebootLogger.noteUserspaceRebootWasRequested();
} }
if (mHandler == null || !mSystemReady) { if (mHandler == null || !mSystemReady) {