Migrate AnimatableClockView to SystemUISharedLib

Attempt #2

Bug: 229771520
Test: Automated
Change-Id: I93170c27d47017a81c4ef430823939fd0b9ec9c7
This commit is contained in:
Hawkwood Glazier
2022-05-21 18:35:22 +00:00
parent 6584cde392
commit 18c08045e9
22 changed files with 110 additions and 105 deletions

View File

@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package com.android.keyguard package com.android.systemui.animation
import android.graphics.fonts.Font import android.graphics.fonts.Font
import android.graphics.fonts.FontVariationAxis import android.graphics.fonts.FontVariationAxis

View File

@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package com.android.keyguard package com.android.systemui.animation
import android.animation.Animator import android.animation.Animator
import android.animation.AnimatorListenerAdapter import android.animation.AnimatorListenerAdapter
@@ -61,8 +61,8 @@ class TextAnimator(
private val invalidateCallback: () -> Unit private val invalidateCallback: () -> Unit
) { ) {
// Following two members are for mutable for testing purposes. // Following two members are for mutable for testing purposes.
internal var textInterpolator: TextInterpolator = TextInterpolator(layout) public var textInterpolator: TextInterpolator = TextInterpolator(layout)
internal var animator: ValueAnimator = ValueAnimator.ofFloat(1f).apply { public var animator: ValueAnimator = ValueAnimator.ofFloat(1f).apply {
duration = DEFAULT_ANIMATION_DURATION duration = DEFAULT_ANIMATION_DURATION
addUpdateListener { addUpdateListener {
textInterpolator.progress = it.animatedValue as Float textInterpolator.progress = it.animatedValue as Float

View File

@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package com.android.keyguard package com.android.systemui.animation
import android.graphics.Canvas import android.graphics.Canvas
import android.graphics.Paint import android.graphics.Paint

View File

@@ -31,7 +31,7 @@
android:layout_alignParentStart="true" android:layout_alignParentStart="true"
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
android:paddingStart="@dimen/clock_padding_start"> android:paddingStart="@dimen/clock_padding_start">
<com.android.keyguard.AnimatableClockView <com.android.systemui.shared.clocks.AnimatableClockView
android:id="@+id/animatable_clock_view" android:id="@+id/animatable_clock_view"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@@ -53,7 +53,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@id/keyguard_slice_view" android:layout_below="@id/keyguard_slice_view"
android:visibility="gone"> android:visibility="gone">
<com.android.keyguard.AnimatableClockView <com.android.systemui.shared.clocks.AnimatableClockView
android:id="@+id/animatable_clock_view_large" android:id="@+id/animatable_clock_view_large"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View File

@@ -41,10 +41,4 @@
<attr name="passwordStyle" format="reference" /> <attr name="passwordStyle" format="reference" />
<attr name="numPadKeyStyle" format="reference" /> <attr name="numPadKeyStyle" format="reference" />
<declare-styleable name="AnimatableClockView">
<attr name="dozeWeight" format="integer" />
<attr name="lockScreenWeight" format="integer" />
<attr name="chargeAnimationDelay" format="integer" />
</declare-styleable>
</resources> </resources>

View File

@@ -23,11 +23,5 @@
<!-- Skeleton string format for displaying the date shorter. --> <!-- Skeleton string format for displaying the date shorter. -->
<string name="abbrev_month_day_no_year">MMMd</string> <string name="abbrev_month_day_no_year">MMMd</string>
<!-- Skeleton string format for displaying the time in 12-hour format. -->
<string name="clock_12hr_format">hm</string>
<!-- Skeleton string format for displaying the time in 24-hour format. -->
<string name="clock_24hr_format">Hm</string>
<string name="num_pad_key_ratio">1</string> <string name="num_pad_key_ratio">1</string>
</resources> </resources>

View File

@@ -47,6 +47,7 @@ android_library {
], ],
static_libs: [ static_libs: [
"PluginCoreLib", "PluginCoreLib",
"SystemUIAnimationLib",
"SystemUIUnfoldLib", "SystemUIUnfoldLib",
"androidx.dynamicanimation_dynamicanimation", "androidx.dynamicanimation_dynamicanimation",
"androidx.concurrent_concurrent-futures", "androidx.concurrent_concurrent-futures",

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2022 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- Formatting note: terminate all comments with a period, to avoid breaking
the documentation output. To suppress comment lines from the documentation
output, insert an eat-comment element after the comment lines.
-->
<resources>
<declare-styleable name="AnimatableClockView">
<attr name="dozeWeight" format="integer" />
<attr name="lockScreenWeight" format="integer" />
<attr name="chargeAnimationDelay" format="integer" />
</declare-styleable>
</resources>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2022 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Skeleton string format for displaying the time in 12-hour format. -->
<string name="clock_12hr_format">hm</string>
<!-- Skeleton string format for displaying the time in 24-hour format. -->
<string name="clock_24hr_format">Hm</string>
</resources>

View File

@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package com.android.keyguard package com.android.systemui.shared.clocks
import android.animation.TimeInterpolator import android.animation.TimeInterpolator
import android.annotation.ColorInt import android.annotation.ColorInt
@@ -27,9 +27,10 @@ import android.text.format.DateFormat
import android.util.AttributeSet import android.util.AttributeSet
import android.util.Log import android.util.Log
import android.widget.TextView import android.widget.TextView
import com.android.systemui.R
import com.android.systemui.animation.Interpolators import com.android.systemui.animation.Interpolators
import com.android.systemui.statusbar.notification.stack.StackStateAnimator import com.android.systemui.animation.TextAnimator
import com.android.systemui.animation.GlyphCallback
import com.android.systemui.shared.R
import java.io.PrintWriter import java.io.PrintWriter
import java.util.Calendar import java.util.Calendar
import java.util.Locale import java.util.Locale
@@ -39,13 +40,13 @@ import java.util.TimeZone
* Displays the time with the hour positioned above the minutes. (ie: 09 above 30 is 9:30) * Displays the time with the hour positioned above the minutes. (ie: 09 above 30 is 9:30)
* The time's text color is a gradient that changes its colors based on its controller. * The time's text color is a gradient that changes its colors based on its controller.
*/ */
@SuppressLint("AppCompatCustomView")
class AnimatableClockView @JvmOverloads constructor( class AnimatableClockView @JvmOverloads constructor(
context: Context, context: Context,
attrs: AttributeSet? = null, attrs: AttributeSet? = null,
defStyleAttr: Int = 0, defStyleAttr: Int = 0,
defStyleRes: Int = 0 defStyleRes: Int = 0
) : TextView(context, attrs, defStyleAttr, defStyleRes) { ) : TextView(context, attrs, defStyleAttr, defStyleRes) {
private val tag = "AnimatableClockView"
private var lastMeasureCall: CharSequence = "" private var lastMeasureCall: CharSequence = ""
@@ -134,7 +135,7 @@ class AnimatableClockView @JvmOverloads constructor(
if (!TextUtils.equals(text, formattedText)) { if (!TextUtils.equals(text, formattedText)) {
text = formattedText text = formattedText
Log.d( Log.d(
tag, "refreshTime this=$this" + TAG, "refreshTime this=$this" +
" currTimeContextDesc=$contentDescription" + " currTimeContextDesc=$contentDescription" +
" measuredHeight=$measuredHeight" + " measuredHeight=$measuredHeight" +
" lastMeasureCall=$lastMeasureCall" + " lastMeasureCall=$lastMeasureCall" +
@@ -142,7 +143,7 @@ class AnimatableClockView @JvmOverloads constructor(
) )
} else { } else {
Log.d( Log.d(
tag, "refreshTime (skipped due to unchanged text)" + TAG, "refreshTime (skipped due to unchanged text)" +
" this=$this" + " this=$this" +
" currTimeContextDesc=$contentDescription" + " currTimeContextDesc=$contentDescription" +
" measuredHeight=$measuredHeight" + " measuredHeight=$measuredHeight" +
@@ -169,7 +170,7 @@ class AnimatableClockView @JvmOverloads constructor(
} else { } else {
animator.updateLayout(layout) animator.updateLayout(layout)
} }
Log.v(tag, "onMeasure this=$this" + Log.v(TAG, "onMeasure this=$this" +
" currTimeContextDesc=$contentDescription" + " currTimeContextDesc=$contentDescription" +
" heightMeasureSpecMode=${MeasureSpec.getMode(heightMeasureSpec)}" + " heightMeasureSpecMode=${MeasureSpec.getMode(heightMeasureSpec)}" +
" heightMeasureSpecSize=${MeasureSpec.getSize(heightMeasureSpec)}" + " heightMeasureSpecSize=${MeasureSpec.getSize(heightMeasureSpec)}" +
@@ -180,7 +181,7 @@ class AnimatableClockView @JvmOverloads constructor(
override fun onDraw(canvas: Canvas) { override fun onDraw(canvas: Canvas) {
// intentionally doesn't call super.onDraw here or else the text will be rendered twice // intentionally doesn't call super.onDraw here or else the text will be rendered twice
Log.d(tag, "onDraw this=$this" + Log.d(TAG, "onDraw this=$this" +
" currTimeContextDesc=$contentDescription" + " currTimeContextDesc=$contentDescription" +
" isSingleLineInternal=$isSingleLineInternal") " isSingleLineInternal=$isSingleLineInternal")
textAnimator?.draw(canvas) textAnimator?.draw(canvas)
@@ -220,7 +221,7 @@ class AnimatableClockView @JvmOverloads constructor(
) )
} }
fun animateFoldAppear() { fun animateFoldAppear(animate: Boolean = true) {
if (textAnimator == null) { if (textAnimator == null) {
return return
} }
@@ -237,22 +238,22 @@ class AnimatableClockView @JvmOverloads constructor(
weight = dozingWeightInternal, weight = dozingWeightInternal,
textSize = -1f, textSize = -1f,
color = dozingColor, color = dozingColor,
animate = true, animate = animate,
interpolator = Interpolators.EMPHASIZED_DECELERATE, interpolator = Interpolators.EMPHASIZED_DECELERATE,
duration = StackStateAnimator.ANIMATION_DURATION_FOLD_TO_AOD.toLong(), duration = ANIMATION_DURATION_FOLD_TO_AOD.toLong(),
delay = 0, delay = 0,
onAnimationEnd = null onAnimationEnd = null
) )
} }
fun animateCharge(dozeStateGetter: DozeStateGetter) { fun animateCharge(isDozing: () -> Boolean) {
if (textAnimator == null || textAnimator!!.isRunning()) { if (textAnimator == null || textAnimator!!.isRunning()) {
// Skip charge animation if dozing animation is already playing. // Skip charge animation if dozing animation is already playing.
return return
} }
val startAnimPhase2 = Runnable { val startAnimPhase2 = Runnable {
setTextStyle( setTextStyle(
weight = if (dozeStateGetter.isDozing) dozingWeight else lockScreenWeight, weight = if (isDozing()) dozingWeight else lockScreenWeight,
textSize = -1f, textSize = -1f,
color = null, color = null,
animate = true, animate = true,
@@ -262,7 +263,7 @@ class AnimatableClockView @JvmOverloads constructor(
) )
} }
setTextStyle( setTextStyle(
weight = if (dozeStateGetter.isDozing) lockScreenWeight else dozingWeight, weight = if (isDozing()) lockScreenWeight else dozingWeight,
textSize = -1f, textSize = -1f,
color = null, color = null,
animate = true, animate = true,
@@ -412,14 +413,14 @@ class AnimatableClockView @JvmOverloads constructor(
} }
} }
interface DozeStateGetter { companion object {
val isDozing: Boolean private val TAG = AnimatableClockView::class.simpleName
} const val ANIMATION_DURATION_FOLD_TO_AOD: Int = 600
}
private const val DOUBLE_LINE_FORMAT_12_HOUR = "hh\nmm" private const val DOUBLE_LINE_FORMAT_12_HOUR = "hh\nmm"
private const val DOUBLE_LINE_FORMAT_24_HOUR = "HH\nmm" private const val DOUBLE_LINE_FORMAT_24_HOUR = "HH\nmm"
private const val DOZE_ANIM_DURATION: Long = 300 private const val DOZE_ANIM_DURATION: Long = 300
private const val APPEAR_ANIM_DURATION: Long = 350 private const val APPEAR_ANIM_DURATION: Long = 350
private const val CHARGE_ANIM_DURATION_PHASE_0: Long = 500 private const val CHARGE_ANIM_DURATION_PHASE_0: Long = 500
private const val CHARGE_ANIM_DURATION_PHASE_1: Long = 1000 private const val CHARGE_ANIM_DURATION_PHASE_1: Long = 1000
}
}

View File

@@ -33,6 +33,7 @@ import com.android.systemui.R;
import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.shared.clocks.AnimatableClockView;
import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.util.ViewController; import com.android.systemui.util.ViewController;
@@ -135,6 +136,21 @@ public class AnimatableClockController extends ViewController<AnimatableClockVie
reset(); reset();
} }
} }
@Override
public void onTimeFormatChanged(String timeFormat) {
mView.refreshFormat();
}
@Override
public void onTimeZoneChanged(TimeZone timeZone) {
mView.onTimeZoneChanged(timeZone);
}
@Override
public void onUserSwitchComplete(int userId) {
mView.refreshFormat();
}
}; };
@Override @Override
@@ -189,7 +205,7 @@ public class AnimatableClockController extends ViewController<AnimatableClockVie
/** Animate the clock appearance when a foldable device goes from fully-open/half-open state to /** Animate the clock appearance when a foldable device goes from fully-open/half-open state to
* fully folded state and it goes to sleep (always on display screen) */ * fully folded state and it goes to sleep (always on display screen) */
public void animateFoldAppear() { public void animateFoldAppear() {
mView.animateFoldAppear(); mView.animateFoldAppear(true);
} }
/** /**
@@ -199,20 +215,6 @@ public class AnimatableClockController extends ViewController<AnimatableClockVie
mView.refreshTime(); mView.refreshTime();
} }
/**
* Updates the timezone for the view.
*/
public void onTimeZoneChanged(TimeZone timeZone) {
mView.onTimeZoneChanged(timeZone);
}
/**
* Trigger a time format update
*/
public void refreshFormat() {
mView.refreshFormat();
}
/** /**
* Return locallly stored dozing state. * Return locallly stored dozing state.
*/ */

View File

@@ -22,6 +22,7 @@ import com.android.keyguard.dagger.KeyguardStatusViewScope;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.animation.Interpolators; import com.android.systemui.animation.Interpolators;
import com.android.systemui.plugins.ClockPlugin; import com.android.systemui.plugins.ClockPlugin;
import com.android.systemui.shared.clocks.AnimatableClockView;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@@ -385,17 +385,6 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
void updateTimeZone(TimeZone timeZone) { void updateTimeZone(TimeZone timeZone) {
mView.onTimeZoneChanged(timeZone); mView.onTimeZoneChanged(timeZone);
if (mClockViewController != null) {
mClockViewController.onTimeZoneChanged(timeZone);
mLargeClockViewController.onTimeZoneChanged(timeZone);
}
}
void refreshFormat() {
if (mClockViewController != null) {
mClockViewController.refreshFormat();
mLargeClockViewController.refreshFormat();
}
} }
/** /**

View File

@@ -238,11 +238,6 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
refreshTime(); refreshTime();
} }
@Override
public void onTimeFormatChanged(String timeFormat) {
mKeyguardClockSwitchController.refreshFormat();
}
@Override @Override
public void onTimeZoneChanged(TimeZone timeZone) { public void onTimeZoneChanged(TimeZone timeZone) {
mKeyguardClockSwitchController.updateTimeZone(timeZone); mKeyguardClockSwitchController.updateTimeZone(timeZone);
@@ -255,11 +250,6 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
refreshTime(); refreshTime();
} }
} }
@Override
public void onUserSwitchComplete(int userId) {
mKeyguardClockSwitchController.refreshFormat();
}
}; };
/** /**

View File

@@ -25,6 +25,7 @@ import android.view.View;
import com.android.keyguard.KeyguardSliceView; import com.android.keyguard.KeyguardSliceView;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.animation.Interpolators; import com.android.systemui.animation.Interpolators;
import com.android.systemui.shared.clocks.AnimatableClockView;
import com.android.systemui.statusbar.NotificationShelf; import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.StatusBarIconView; import com.android.systemui.statusbar.StatusBarIconView;
import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationEntry;
@@ -52,7 +53,8 @@ public class StackStateAnimator {
public static final int ANIMATION_DURATION_CLOSE_REMOTE_INPUT = 150; public static final int ANIMATION_DURATION_CLOSE_REMOTE_INPUT = 150;
public static final int ANIMATION_DURATION_HEADS_UP_APPEAR = 400; public static final int ANIMATION_DURATION_HEADS_UP_APPEAR = 400;
public static final int ANIMATION_DURATION_HEADS_UP_DISAPPEAR = 400; public static final int ANIMATION_DURATION_HEADS_UP_DISAPPEAR = 400;
public static final int ANIMATION_DURATION_FOLD_TO_AOD = 600; public static final int ANIMATION_DURATION_FOLD_TO_AOD =
AnimatableClockView.ANIMATION_DURATION_FOLD_TO_AOD;
public static final int ANIMATION_DURATION_PULSE_APPEAR = public static final int ANIMATION_DURATION_PULSE_APPEAR =
KeyguardSliceView.DEFAULT_ANIM_DURATION; KeyguardSliceView.DEFAULT_ANIM_DURATION;
public static final int ANIMATION_DURATION_BLOCKING_HELPER_FADE = 240; public static final int ANIMATION_DURATION_BLOCKING_HELPER_FADE = 240;

View File

@@ -51,6 +51,7 @@ import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.KeyguardUnlockAnimationController; import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
import com.android.systemui.plugins.ClockPlugin; import com.android.systemui.plugins.ClockPlugin;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.shared.clocks.AnimatableClockView;
import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.lockscreen.LockscreenSmartspaceController; import com.android.systemui.statusbar.lockscreen.LockscreenSmartspaceController;
import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.KeyguardBypassController;

View File

@@ -43,6 +43,7 @@ import android.widget.TextClock;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.ClockPlugin; import com.android.systemui.plugins.ClockPlugin;
import com.android.systemui.shared.clocks.AnimatableClockView;
import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.StatusBarState;
import org.junit.Before; import org.junit.Before;

View File

@@ -87,28 +87,6 @@ public class KeyguardStatusViewControllerTest extends SysuiTestCase {
verify(mKeyguardClockSwitchController).refresh(); verify(mKeyguardClockSwitchController).refresh();
} }
@Test
public void timeFormatUpdateNotifiesClockSwitchController() {
mController.onViewAttached();
verify(mKeyguardUpdateMonitor).registerCallback(
mKeyguardUpdateMonitorCallbackCaptor.capture());
mKeyguardUpdateMonitorCallbackCaptor.getValue().onTimeFormatChanged("");
verify(mKeyguardClockSwitchController).refreshFormat();
}
@Test
public void userChangeNotifiesClockSwitchController() {
mController.onViewAttached();
verify(mKeyguardUpdateMonitor).registerCallback(
mKeyguardUpdateMonitorCallbackCaptor.capture());
mKeyguardUpdateMonitorCallbackCaptor.getValue().onUserSwitchComplete(0);
verify(mKeyguardClockSwitchController).refreshFormat();
}
@Test @Test
public void setTranslationYExcludingMedia_forwardsCallToView() { public void setTranslationYExcludingMedia_forwardsCallToView() {
float translationY = 123f; float translationY = 123f;

View File

@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package com.android.keyguard package com.android.systemui.animation
import android.graphics.Paint import android.graphics.Paint
import android.graphics.fonts.Font import android.graphics.fonts.Font

View File

@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package com.android.keyguard package com.android.systemui.animation
import android.animation.AnimatorListenerAdapter import android.animation.AnimatorListenerAdapter
import android.animation.ValueAnimator import android.animation.ValueAnimator

View File

@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package com.android.keyguard package com.android.systemui.animation
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.Canvas import android.graphics.Canvas

View File

@@ -34,12 +34,12 @@ import android.view.View;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
import com.android.keyguard.AnimatableClockController; import com.android.keyguard.AnimatableClockController;
import com.android.keyguard.AnimatableClockView;
import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.settingslib.Utils; import com.android.settingslib.Utils;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.shared.clocks.AnimatableClockView;
import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.BatteryController;
import org.junit.After; import org.junit.After;