Loading packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java +2 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import com.android.systemui.scene.SceneContainerFrameworkModule; import com.android.systemui.screenshot.ReferenceScreenshotModule; import com.android.systemui.settings.MultiUserUtilsModule; import com.android.systemui.settings.UserTracker; import com.android.systemui.settings.brightness.dagger.BrightnessSliderModule; import com.android.systemui.shade.NotificationShadeWindowControllerImpl; import com.android.systemui.shade.ShadeModule; import com.android.systemui.startable.Dependencies; Loading Loading @@ -124,6 +125,7 @@ import javax.inject.Named; AccessibilityRepositoryModule.class, AospPolicyModule.class, BatterySaverModule.class, BrightnessSliderModule.class, CentralSurfacesModule.class, ClipboardOverlayOverrideModule.class, CollapsedStatusBarFragmentStartableModule.class, Loading packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java +27 −18 Original line number Diff line number Diff line Loading @@ -21,7 +21,6 @@ import static com.android.settingslib.display.BrightnessUtils.convertGammaToLine import static com.android.settingslib.display.BrightnessUtils.convertLinearToGammaFloat; import android.animation.ValueAnimator; import android.annotation.NonNull; import android.content.Context; import android.database.ContentObserver; import android.hardware.display.BrightnessInfo; Loading @@ -42,6 +41,7 @@ import android.service.vr.IVrStateCallbacks; import android.util.Log; import android.util.MathUtils; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; Loading Loading @@ -72,19 +72,19 @@ import java.util.concurrent.Executor; public class BrightnessController implements ToggleSlider.Listener, MirroredBrightnessController { private static final String TAG = "CentralSurfaces.BrightnessController"; private static final int SLIDER_ANIMATION_DURATION = 3000; protected static final int SLIDER_ANIMATION_DURATION = 3000; private static final int MSG_UPDATE_SLIDER = 1; private static final int MSG_ATTACH_LISTENER = 2; private static final int MSG_DETACH_LISTENER = 3; private static final int MSG_VR_MODE_CHANGED = 4; protected static final int MSG_UPDATE_SLIDER = 1; protected static final int MSG_ATTACH_LISTENER = 2; protected static final int MSG_DETACH_LISTENER = 3; protected static final int MSG_VR_MODE_CHANGED = 4; private static final Uri BRIGHTNESS_MODE_URI = protected static final Uri BRIGHTNESS_MODE_URI = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE); private final int mDisplayId; private final Context mContext; private final ToggleSlider mControl; protected final ToggleSlider mControl; private final DisplayManager mDisplayManager; private final UserTracker mUserTracker; private final DisplayTracker mDisplayTracker; Loading @@ -109,10 +109,10 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig private boolean mTrackingTouch = false; // Brightness adjusted via touch events. private volatile boolean mIsVrModeEnabled; private boolean mListening; private boolean mExternalChange; protected boolean mExternalChange; private boolean mControlValueInitialized; private float mBrightnessMin = PowerManager.BRIGHTNESS_MIN; private float mBrightnessMax = PowerManager.BRIGHTNESS_MAX; protected float mBrightnessMin = PowerManager.BRIGHTNESS_MIN; protected float mBrightnessMax = PowerManager.BRIGHTNESS_MAX; private boolean mIsBrightnessOverriddenByWindow = false; private ValueAnimator mSliderAnimator; Loading Loading @@ -253,10 +253,8 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig if (info == null) { return; } mBrightnessMax = info.brightnessMaximum; mBrightnessMin = info.brightnessMinimum; mIsBrightnessOverriddenByWindow = info.isBrightnessOverrideByWindow; updateBrightnessInfo(info); // Value is passed as intbits, since this is what the message takes. final int valueAsIntBits = Float.floatToIntBits(info.brightness); mMainHandler.obtainMessage(MSG_UPDATE_SLIDER, valueAsIntBits, Loading @@ -264,6 +262,12 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig } }; protected void updateBrightnessInfo(BrightnessInfo info) { mBrightnessMax = info.brightnessMaximum; mBrightnessMin = info.brightnessMinimum; mIsBrightnessOverriddenByWindow = info.isBrightnessOverrideByWindow; } private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() { @Override public void onVrStateChanged(boolean enabled) { Loading Loading @@ -301,7 +305,7 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig } }; private final Handler mMainHandler; protected final Handler mMainHandler; private final UserTracker.Callback mUserChangedCallback = new UserTracker.Callback() { Loading Loading @@ -459,7 +463,7 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig return !mAutomatic && !mTrackingTouch; } private void updateSlider(float brightnessValue, boolean inVrMode) { protected void updateSlider(float brightnessValue, boolean inVrMode) { final float min = mBrightnessMin; final float max = mBrightnessMax; Loading Loading @@ -502,12 +506,17 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig mSliderAnimator.start(); } /** Factory interface for creating a {@link BrightnessController}. */ public interface Factory { @NonNull BrightnessController create(ToggleSlider toggleSlider); } /** Factory for creating a {@link BrightnessController}. */ @AssistedFactory public interface Factory { public interface BrightnessControllerFactory extends Factory { /** Create a {@link BrightnessController} */ @NonNull BrightnessController create(ToggleSlider toggleSlider); } Loading packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java +28 −10 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.SeekBar; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.internal.logging.UiEventLogger; Loading @@ -42,6 +43,7 @@ import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.policy.BrightnessMirrorController; import com.android.systemui.util.ViewController; import com.android.systemui.util.time.SystemClock; import com.google.android.msdl.domain.MSDLPlayer; import javax.inject.Inject; Loading Loading @@ -89,7 +91,7 @@ public class BrightnessSliderController extends ViewController<BrightnessSliderV } }; BrightnessSliderController( protected BrightnessSliderController( BrightnessSliderView brightnessSliderView, FalsingManager falsingManager, UiEventLogger uiEventLogger, Loading Loading @@ -247,10 +249,7 @@ public class BrightnessSliderController extends ViewController<BrightnessSliderV return mView.isVisibleToUser(); } private final SeekBar.OnSeekBarChangeListener mSeekListener = new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { protected void handleSliderProgressChange(SeekBar seekBar, int progress, boolean fromUser) { if (mListener != null) { mListener.onChanged(mTracking, progress, false); if (fromUser) { Loading @@ -259,6 +258,13 @@ public class BrightnessSliderController extends ViewController<BrightnessSliderV } } private final SeekBar.OnSeekBarChangeListener mSeekListener = new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { handleSliderProgressChange(seekBar, progress, fromUser); } @Override public void onStartTrackingTouch(SeekBar seekBar) { mTracking = true; Loading Loading @@ -289,11 +295,21 @@ public class BrightnessSliderController extends ViewController<BrightnessSliderV } }; /** Factory interface for creating a {@link BrightnessSliderController}. */ public interface Factory { @NonNull BrightnessSliderController create( Context context, @Nullable ViewGroup viewRoot); int getLayout(); } /** * Creates a {@link BrightnessSliderController} with its associated view. */ public static class Factory { public static class BrightnessSliderControllerFactory implements Factory { private final FalsingManager mFalsingManager; private final UiEventLogger mUiEventLogger; private final VibratorHelper mVibratorHelper; Loading @@ -303,7 +319,7 @@ public class BrightnessSliderController extends ViewController<BrightnessSliderV private final BrightnessWarningToast mBrightnessWarningToast; @Inject public Factory( public BrightnessSliderControllerFactory( FalsingManager falsingManager, UiEventLogger uiEventLogger, VibratorHelper vibratorHelper, Loading @@ -328,6 +344,8 @@ public class BrightnessSliderController extends ViewController<BrightnessSliderV * @param viewRoot the {@link ViewGroup} that will contain the hierarchy. The inflated * hierarchy will not be attached */ @Override @NonNull public BrightnessSliderController create( Context context, @Nullable ViewGroup viewRoot) { Loading @@ -345,7 +363,7 @@ public class BrightnessSliderController extends ViewController<BrightnessSliderV } /** Get the layout to inflate based on what slider to use */ private int getLayout() { public int getLayout() { return R.layout.quick_settings_brightness_dialog; } } Loading packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderView.java +11 −7 Original line number Diff line number Diff line Loading @@ -43,12 +43,12 @@ import java.util.Collections; public class BrightnessSliderView extends FrameLayout { @NonNull private ToggleSeekBar mSlider; protected ToggleSeekBar mSlider; private DispatchTouchEventListener mListener; private Gefingerpoken mOnInterceptListener; @Nullable private Drawable mProgressDrawable; private float mScale = 1f; protected Drawable mProgressDrawable; protected float mScale = 1f; private final Rect mSystemGestureExclusionRect = new Rect(); public BrightnessSliderView(Context context) { Loading @@ -65,6 +65,10 @@ public class BrightnessSliderView extends FrameLayout { super.onFinishInflate(); setLayerType(LAYER_TYPE_HARDWARE, null); initBrightnessViewComponents(); } protected void initBrightnessViewComponents() { mSlider = requireViewById(R.id.slider); mSlider.setAccessibilityLabel(getContentDescription().toString()); setBoundaryOffset(); Loading @@ -81,7 +85,7 @@ public class BrightnessSliderView extends FrameLayout { } } private void setBoundaryOffset() { protected void setBoundaryOffset() { // BrightnessSliderView uses hardware layer; if the background of its children exceed its // boundary, it'll be cropped. We need to expand its boundary so that the background of // ToggleSeekBar (i.e. the focus state) can be correctly rendered. Loading Loading @@ -131,7 +135,7 @@ public class BrightnessSliderView extends FrameLayout { * @param admin * @see ToggleSeekBar#setEnforcedAdmin */ void setAdminBlocker(ToggleSeekBar.AdminBlocker blocker) { protected void setAdminBlocker(ToggleSeekBar.AdminBlocker blocker) { mSlider.setAdminBlocker(blocker); } Loading Loading @@ -211,7 +215,7 @@ public class BrightnessSliderView extends FrameLayout { } } private void applySliderScale() { protected void applySliderScale() { if (mProgressDrawable != null) { final Rect r = mProgressDrawable.getBounds(); int height = (int) (mProgressDrawable.getIntrinsicHeight() * mScale); Loading @@ -229,7 +233,7 @@ public class BrightnessSliderView extends FrameLayout { * Interface to attach a listener for {@link View#dispatchTouchEvent}. */ @FunctionalInterface interface DispatchTouchEventListener { public interface DispatchTouchEventListener { boolean onDispatchTouchEvent(MotionEvent ev); } } Loading packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSeekBar.java +2 −2 Original line number Diff line number Diff line Loading @@ -85,12 +85,12 @@ public class ToggleSeekBar extends SeekBar { } } void setAdminBlocker(AdminBlocker blocker) { public void setAdminBlocker(AdminBlocker blocker) { mAdminBlocker = blocker; setEnabled(blocker == null); } interface AdminBlocker { public interface AdminBlocker { boolean block(); } } Loading
packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java +2 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import com.android.systemui.scene.SceneContainerFrameworkModule; import com.android.systemui.screenshot.ReferenceScreenshotModule; import com.android.systemui.settings.MultiUserUtilsModule; import com.android.systemui.settings.UserTracker; import com.android.systemui.settings.brightness.dagger.BrightnessSliderModule; import com.android.systemui.shade.NotificationShadeWindowControllerImpl; import com.android.systemui.shade.ShadeModule; import com.android.systemui.startable.Dependencies; Loading Loading @@ -124,6 +125,7 @@ import javax.inject.Named; AccessibilityRepositoryModule.class, AospPolicyModule.class, BatterySaverModule.class, BrightnessSliderModule.class, CentralSurfacesModule.class, ClipboardOverlayOverrideModule.class, CollapsedStatusBarFragmentStartableModule.class, Loading
packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessController.java +27 −18 Original line number Diff line number Diff line Loading @@ -21,7 +21,6 @@ import static com.android.settingslib.display.BrightnessUtils.convertGammaToLine import static com.android.settingslib.display.BrightnessUtils.convertLinearToGammaFloat; import android.animation.ValueAnimator; import android.annotation.NonNull; import android.content.Context; import android.database.ContentObserver; import android.hardware.display.BrightnessInfo; Loading @@ -42,6 +41,7 @@ import android.service.vr.IVrStateCallbacks; import android.util.Log; import android.util.MathUtils; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; Loading Loading @@ -72,19 +72,19 @@ import java.util.concurrent.Executor; public class BrightnessController implements ToggleSlider.Listener, MirroredBrightnessController { private static final String TAG = "CentralSurfaces.BrightnessController"; private static final int SLIDER_ANIMATION_DURATION = 3000; protected static final int SLIDER_ANIMATION_DURATION = 3000; private static final int MSG_UPDATE_SLIDER = 1; private static final int MSG_ATTACH_LISTENER = 2; private static final int MSG_DETACH_LISTENER = 3; private static final int MSG_VR_MODE_CHANGED = 4; protected static final int MSG_UPDATE_SLIDER = 1; protected static final int MSG_ATTACH_LISTENER = 2; protected static final int MSG_DETACH_LISTENER = 3; protected static final int MSG_VR_MODE_CHANGED = 4; private static final Uri BRIGHTNESS_MODE_URI = protected static final Uri BRIGHTNESS_MODE_URI = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE); private final int mDisplayId; private final Context mContext; private final ToggleSlider mControl; protected final ToggleSlider mControl; private final DisplayManager mDisplayManager; private final UserTracker mUserTracker; private final DisplayTracker mDisplayTracker; Loading @@ -109,10 +109,10 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig private boolean mTrackingTouch = false; // Brightness adjusted via touch events. private volatile boolean mIsVrModeEnabled; private boolean mListening; private boolean mExternalChange; protected boolean mExternalChange; private boolean mControlValueInitialized; private float mBrightnessMin = PowerManager.BRIGHTNESS_MIN; private float mBrightnessMax = PowerManager.BRIGHTNESS_MAX; protected float mBrightnessMin = PowerManager.BRIGHTNESS_MIN; protected float mBrightnessMax = PowerManager.BRIGHTNESS_MAX; private boolean mIsBrightnessOverriddenByWindow = false; private ValueAnimator mSliderAnimator; Loading Loading @@ -253,10 +253,8 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig if (info == null) { return; } mBrightnessMax = info.brightnessMaximum; mBrightnessMin = info.brightnessMinimum; mIsBrightnessOverriddenByWindow = info.isBrightnessOverrideByWindow; updateBrightnessInfo(info); // Value is passed as intbits, since this is what the message takes. final int valueAsIntBits = Float.floatToIntBits(info.brightness); mMainHandler.obtainMessage(MSG_UPDATE_SLIDER, valueAsIntBits, Loading @@ -264,6 +262,12 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig } }; protected void updateBrightnessInfo(BrightnessInfo info) { mBrightnessMax = info.brightnessMaximum; mBrightnessMin = info.brightnessMinimum; mIsBrightnessOverriddenByWindow = info.isBrightnessOverrideByWindow; } private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() { @Override public void onVrStateChanged(boolean enabled) { Loading Loading @@ -301,7 +305,7 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig } }; private final Handler mMainHandler; protected final Handler mMainHandler; private final UserTracker.Callback mUserChangedCallback = new UserTracker.Callback() { Loading Loading @@ -459,7 +463,7 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig return !mAutomatic && !mTrackingTouch; } private void updateSlider(float brightnessValue, boolean inVrMode) { protected void updateSlider(float brightnessValue, boolean inVrMode) { final float min = mBrightnessMin; final float max = mBrightnessMax; Loading Loading @@ -502,12 +506,17 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig mSliderAnimator.start(); } /** Factory interface for creating a {@link BrightnessController}. */ public interface Factory { @NonNull BrightnessController create(ToggleSlider toggleSlider); } /** Factory for creating a {@link BrightnessController}. */ @AssistedFactory public interface Factory { public interface BrightnessControllerFactory extends Factory { /** Create a {@link BrightnessController} */ @NonNull BrightnessController create(ToggleSlider toggleSlider); } Loading
packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java +28 −10 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.SeekBar; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.internal.logging.UiEventLogger; Loading @@ -42,6 +43,7 @@ import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.policy.BrightnessMirrorController; import com.android.systemui.util.ViewController; import com.android.systemui.util.time.SystemClock; import com.google.android.msdl.domain.MSDLPlayer; import javax.inject.Inject; Loading Loading @@ -89,7 +91,7 @@ public class BrightnessSliderController extends ViewController<BrightnessSliderV } }; BrightnessSliderController( protected BrightnessSliderController( BrightnessSliderView brightnessSliderView, FalsingManager falsingManager, UiEventLogger uiEventLogger, Loading Loading @@ -247,10 +249,7 @@ public class BrightnessSliderController extends ViewController<BrightnessSliderV return mView.isVisibleToUser(); } private final SeekBar.OnSeekBarChangeListener mSeekListener = new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { protected void handleSliderProgressChange(SeekBar seekBar, int progress, boolean fromUser) { if (mListener != null) { mListener.onChanged(mTracking, progress, false); if (fromUser) { Loading @@ -259,6 +258,13 @@ public class BrightnessSliderController extends ViewController<BrightnessSliderV } } private final SeekBar.OnSeekBarChangeListener mSeekListener = new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { handleSliderProgressChange(seekBar, progress, fromUser); } @Override public void onStartTrackingTouch(SeekBar seekBar) { mTracking = true; Loading Loading @@ -289,11 +295,21 @@ public class BrightnessSliderController extends ViewController<BrightnessSliderV } }; /** Factory interface for creating a {@link BrightnessSliderController}. */ public interface Factory { @NonNull BrightnessSliderController create( Context context, @Nullable ViewGroup viewRoot); int getLayout(); } /** * Creates a {@link BrightnessSliderController} with its associated view. */ public static class Factory { public static class BrightnessSliderControllerFactory implements Factory { private final FalsingManager mFalsingManager; private final UiEventLogger mUiEventLogger; private final VibratorHelper mVibratorHelper; Loading @@ -303,7 +319,7 @@ public class BrightnessSliderController extends ViewController<BrightnessSliderV private final BrightnessWarningToast mBrightnessWarningToast; @Inject public Factory( public BrightnessSliderControllerFactory( FalsingManager falsingManager, UiEventLogger uiEventLogger, VibratorHelper vibratorHelper, Loading @@ -328,6 +344,8 @@ public class BrightnessSliderController extends ViewController<BrightnessSliderV * @param viewRoot the {@link ViewGroup} that will contain the hierarchy. The inflated * hierarchy will not be attached */ @Override @NonNull public BrightnessSliderController create( Context context, @Nullable ViewGroup viewRoot) { Loading @@ -345,7 +363,7 @@ public class BrightnessSliderController extends ViewController<BrightnessSliderV } /** Get the layout to inflate based on what slider to use */ private int getLayout() { public int getLayout() { return R.layout.quick_settings_brightness_dialog; } } Loading
packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderView.java +11 −7 Original line number Diff line number Diff line Loading @@ -43,12 +43,12 @@ import java.util.Collections; public class BrightnessSliderView extends FrameLayout { @NonNull private ToggleSeekBar mSlider; protected ToggleSeekBar mSlider; private DispatchTouchEventListener mListener; private Gefingerpoken mOnInterceptListener; @Nullable private Drawable mProgressDrawable; private float mScale = 1f; protected Drawable mProgressDrawable; protected float mScale = 1f; private final Rect mSystemGestureExclusionRect = new Rect(); public BrightnessSliderView(Context context) { Loading @@ -65,6 +65,10 @@ public class BrightnessSliderView extends FrameLayout { super.onFinishInflate(); setLayerType(LAYER_TYPE_HARDWARE, null); initBrightnessViewComponents(); } protected void initBrightnessViewComponents() { mSlider = requireViewById(R.id.slider); mSlider.setAccessibilityLabel(getContentDescription().toString()); setBoundaryOffset(); Loading @@ -81,7 +85,7 @@ public class BrightnessSliderView extends FrameLayout { } } private void setBoundaryOffset() { protected void setBoundaryOffset() { // BrightnessSliderView uses hardware layer; if the background of its children exceed its // boundary, it'll be cropped. We need to expand its boundary so that the background of // ToggleSeekBar (i.e. the focus state) can be correctly rendered. Loading Loading @@ -131,7 +135,7 @@ public class BrightnessSliderView extends FrameLayout { * @param admin * @see ToggleSeekBar#setEnforcedAdmin */ void setAdminBlocker(ToggleSeekBar.AdminBlocker blocker) { protected void setAdminBlocker(ToggleSeekBar.AdminBlocker blocker) { mSlider.setAdminBlocker(blocker); } Loading Loading @@ -211,7 +215,7 @@ public class BrightnessSliderView extends FrameLayout { } } private void applySliderScale() { protected void applySliderScale() { if (mProgressDrawable != null) { final Rect r = mProgressDrawable.getBounds(); int height = (int) (mProgressDrawable.getIntrinsicHeight() * mScale); Loading @@ -229,7 +233,7 @@ public class BrightnessSliderView extends FrameLayout { * Interface to attach a listener for {@link View#dispatchTouchEvent}. */ @FunctionalInterface interface DispatchTouchEventListener { public interface DispatchTouchEventListener { boolean onDispatchTouchEvent(MotionEvent ev); } } Loading
packages/SystemUI/src/com/android/systemui/settings/brightness/ToggleSeekBar.java +2 −2 Original line number Diff line number Diff line Loading @@ -85,12 +85,12 @@ public class ToggleSeekBar extends SeekBar { } } void setAdminBlocker(AdminBlocker blocker) { public void setAdminBlocker(AdminBlocker blocker) { mAdminBlocker = blocker; setEnabled(blocker == null); } interface AdminBlocker { public interface AdminBlocker { boolean block(); } }