summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeUi.java26
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java17
2 files changed, 24 insertions, 19 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java
index 7c816cec08f2..34a80e867153 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeUi.java
@@ -26,9 +26,9 @@ import android.os.SystemClock;
import android.text.format.Formatter;
import android.util.Log;
+import com.android.systemui.DejankUtils;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.doze.dagger.DozeScope;
-import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.AlarmTimeout;
import com.android.systemui.util.wakelock.WakeLock;
@@ -52,15 +52,21 @@ public class DozeUi implements DozeMachine.Part {
private final boolean mCanAnimateTransition;
private final DozeParameters mDozeParameters;
private final DozeLog mDozeLog;
- private final StatusBarStateController mStatusBarStateController;
private long mLastTimeTickElapsed = 0;
+ // If time tick is scheduled and there's not a pending runnable to cancel:
+ private boolean mTimeTickScheduled;
+ private final Runnable mCancelTimeTickerRunnable = new Runnable() {
+ @Override
+ public void run() {
+ mTimeTicker.cancel();
+ }
+ };
@Inject
public DozeUi(Context context, AlarmManager alarmManager,
WakeLock wakeLock, DozeHost host, @Main Handler handler,
DozeParameters params,
- StatusBarStateController statusBarStateController,
DozeLog dozeLog) {
mContext = context;
mWakeLock = wakeLock;
@@ -70,7 +76,6 @@ public class DozeUi implements DozeMachine.Part {
mDozeParameters = params;
mTimeTicker = new AlarmTimeout(alarmManager, this::onTimeTick, "doze_time_tick", handler);
mDozeLog = dozeLog;
- mStatusBarStateController = statusBarStateController;
}
@Override
@@ -157,13 +162,15 @@ public class DozeUi implements DozeMachine.Part {
}
private void scheduleTimeTick() {
- if (mTimeTicker.isScheduled()) {
+ if (mTimeTickScheduled) {
return;
}
+ mTimeTickScheduled = true;
+ DejankUtils.removeCallbacks(mCancelTimeTickerRunnable);
long time = System.currentTimeMillis();
long delta = roundToNextMinute(time) - System.currentTimeMillis();
- boolean scheduled = mTimeTicker.schedule(delta, AlarmTimeout.MODE_IGNORE_IF_SCHEDULED);
+ boolean scheduled = mTimeTicker.schedule(delta, AlarmTimeout.MODE_RESCHEDULE_IF_SCHEDULED);
if (scheduled) {
mDozeLog.traceTimeTickScheduled(time, time + delta);
}
@@ -171,11 +178,11 @@ public class DozeUi implements DozeMachine.Part {
}
private void unscheduleTimeTick() {
- if (!mTimeTicker.isScheduled()) {
+ if (!mTimeTickScheduled) {
return;
}
- verifyLastTimeTick();
- mTimeTicker.cancel();
+ mTimeTickScheduled = false;
+ DejankUtils.postAfterTraversal(mCancelTimeTickerRunnable);
}
private void verifyLastTimeTick() {
@@ -205,6 +212,7 @@ public class DozeUi implements DozeMachine.Part {
// Keep wakelock until a frame has been pushed.
mHandler.post(mWakeLock.wrap(() -> {}));
+ mTimeTickScheduled = false;
scheduleTimeTick();
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java
index 49cdfa72f344..7311f4a5ef71 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeUiTest.java
@@ -33,15 +33,14 @@ import static org.mockito.Mockito.when;
import android.app.AlarmManager;
import android.os.Handler;
import android.os.HandlerThread;
+import android.testing.TestableLooper;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
-import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.systemui.DejankUtils;
import com.android.systemui.SysuiTestCase;
-import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.phone.DozeParameters;
-import com.android.systemui.tuner.TunerService;
import com.android.systemui.util.wakelock.WakeLockFake;
import org.junit.After;
@@ -53,6 +52,7 @@ import org.mockito.MockitoAnnotations;
@RunWith(AndroidJUnit4.class)
@SmallTest
+@TestableLooper.RunWithLooper
public class DozeUiTest extends SysuiTestCase {
@Mock
@@ -62,23 +62,19 @@ public class DozeUiTest extends SysuiTestCase {
@Mock
private DozeParameters mDozeParameters;
@Mock
- private KeyguardUpdateMonitor mKeyguardUpdateMonitor;
- @Mock
private DozeHost mHost;
@Mock
private DozeLog mDozeLog;
- @Mock
- private TunerService mTunerService;
private WakeLockFake mWakeLock;
private Handler mHandler;
private HandlerThread mHandlerThread;
private DozeUi mDozeUi;
- @Mock
- private StatusBarStateController mStatusBarStateController;
@Before
public void setUp() throws Exception {
+ allowTestableLooperAsMainThread();
MockitoAnnotations.initMocks(this);
+ DejankUtils.setImmediate(true);
mHandlerThread = new HandlerThread("DozeUiTest");
mHandlerThread.start();
@@ -86,12 +82,13 @@ public class DozeUiTest extends SysuiTestCase {
mHandler = mHandlerThread.getThreadHandler();
mDozeUi = new DozeUi(mContext, mAlarmManager, mWakeLock, mHost, mHandler,
- mDozeParameters, mStatusBarStateController, mDozeLog);
+ mDozeParameters, mDozeLog);
mDozeUi.setDozeMachine(mMachine);
}
@After
public void tearDown() throws Exception {
+ DejankUtils.setImmediate(false);
mHandlerThread.quit();
mHandler = null;
mHandlerThread = null;