Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 87cf2883 authored by Lucas Silva's avatar Lucas Silva Committed by Automerger Merge Worker
Browse files

Merge "Update DockObserver to send dock intent after device provisioning" into...

Merge "Update DockObserver to send dock intent after device provisioning" into tm-qpr-dev am: 6420742c

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20581176



Change-Id: Iec6c2aca329a703c3c8d54b893c650146d2080d3
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 729c55cd 6420742c
Loading
Loading
Loading
Loading
+59 −9
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.server;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.ContentObserver;
import android.media.AudioManager;
import android.media.Ringtone;
import android.media.RingtoneManager;
@@ -73,6 +74,7 @@ final class DockObserver extends SystemService {
    private final boolean mAllowTheaterModeWakeFromDock;

    private final List<ExtconStateConfig> mExtconStateConfigs;
    private DeviceProvisionedObserver mDeviceProvisionedObserver;

    static final class ExtconStateProvider {
        private final Map<String, String> mState;
@@ -167,6 +169,7 @@ final class DockObserver extends SystemService {
                com.android.internal.R.bool.config_allowTheaterModeWakeFromDock);
        mKeepDreamingWhenUndocking = context.getResources().getBoolean(
                com.android.internal.R.bool.config_keepDreamingWhenUndocking);
        mDeviceProvisionedObserver = new DeviceProvisionedObserver(mHandler);

        mExtconStateConfigs = loadExtconStateConfigs(context);

@@ -199,14 +202,18 @@ final class DockObserver extends SystemService {
        if (phase == PHASE_ACTIVITY_MANAGER_READY) {
            synchronized (mLock) {
                mSystemReady = true;
                mDeviceProvisionedObserver.onSystemReady();
                updateIfDockedLocked();
            }
        }
    }

    private void updateIfDockedLocked() {
        // don't bother broadcasting undocked here
        if (mReportedDockState != Intent.EXTRA_DOCK_STATE_UNDOCKED) {
            updateLocked();
        }
    }
        }
    }

    private void setActualDockStateLocked(int newState) {
        mActualDockState = newState;
@@ -252,8 +259,7 @@ final class DockObserver extends SystemService {

            // Skip the dock intent if not yet provisioned.
            final ContentResolver cr = getContext().getContentResolver();
            if (Settings.Global.getInt(cr,
                    Settings.Global.DEVICE_PROVISIONED, 0) == 0) {
            if (!mDeviceProvisionedObserver.isDeviceProvisioned()) {
                Slog.i(TAG, "Device not provisioned, skipping dock broadcast");
                return;
            }
@@ -419,4 +425,48 @@ final class DockObserver extends SystemService {
            }
        }
    }

    private final class DeviceProvisionedObserver extends ContentObserver {
        private boolean mRegistered;

        public DeviceProvisionedObserver(Handler handler) {
            super(handler);
        }

        @Override
        public void onChange(boolean selfChange, Uri uri) {
            synchronized (mLock) {
                updateRegistration();
                if (isDeviceProvisioned()) {
                    // Send the dock broadcast if device is docked after provisioning.
                    updateIfDockedLocked();
                }
            }
        }

        void onSystemReady() {
            updateRegistration();
        }

        private void updateRegistration() {
            boolean register = !isDeviceProvisioned();
            if (register == mRegistered) {
                return;
            }
            final ContentResolver resolver = getContext().getContentResolver();
            if (register) {
                resolver.registerContentObserver(
                        Settings.Global.getUriFor(Settings.Global.DEVICE_PROVISIONED),
                        false, this);
            } else {
                resolver.unregisterContentObserver(this);
            }
            mRegistered = register;
        }

        boolean isDeviceProvisioned() {
            return Settings.Global.getInt(getContext().getContentResolver(),
                    Settings.Global.DEVICE_PROVISIONED, 0) != 0;
        }
    }
}
+27 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat;

import android.content.Intent;
import android.os.Looper;
import android.provider.Settings;
import android.testing.AndroidTestingRunner;
import android.testing.TestableContext;
import android.testing.TestableLooper;
@@ -74,6 +75,11 @@ public class DockObserverTest {
                .isEqualTo(Intent.EXTRA_DOCK_STATE_UNDOCKED);
    }

    void setDeviceProvisioned(boolean provisioned) {
        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED,
                provisioned ? 1 : 0);
    }

    @Before
    public void setUp() {
        if (Looper.myLooper() == null) {
@@ -131,4 +137,25 @@ public class DockObserverTest {
        assertDockEventIntentWithExtraThenUndock(observer, "DOCK=1\nKEY5=5",
                Intent.EXTRA_DOCK_STATE_HE_DESK);
    }

    @Test
    public void testDockIntentBroadcast_deviceNotProvisioned()
            throws ExecutionException, InterruptedException {
        DockObserver observer = new DockObserver(mInterceptingContext);
        // Set the device as not provisioned.
        setDeviceProvisioned(false);
        observer.onBootPhase(SystemService.PHASE_ACTIVITY_MANAGER_READY);

        BroadcastInterceptingContext.FutureIntent futureIntent =
                updateExtconDockState(observer, "DOCK=1");
        TestableLooper.get(this).processAllMessages();
        // Verify no broadcast was sent as device was not provisioned.
        futureIntent.assertNotReceived();

        // Ensure we send the broadcast when the device is provisioned.
        setDeviceProvisioned(true);
        TestableLooper.get(this).processAllMessages();
        assertThat(futureIntent.get().getIntExtra(Intent.EXTRA_DOCK_STATE, -1))
                .isEqualTo(Intent.EXTRA_DOCK_STATE_DESK);
    }
}