From cd7aeb16de6cd6b4943c3c65036948565a069b2c Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Mon, 28 Sep 2020 15:24:06 -0400 Subject: [PATCH 1/6] 1/N Remove Injection from QSSBHeader First pass at removing injected items from the QuickStatusbarHeader, moving relevant items over to its controller. Lots of unused members are removed in this CL as well. Bug: 168904199 Test: atest SystemUITests Change-Id: I10b85e2b14f0ec3cd1988b6184a270209211618a --- .../qs/QSContainerImplController.java | 24 +- .../com/android/systemui/qs/QSFragment.java | 5 +- .../systemui/qs/QuickStatusBarHeader.java | 220 ++------------- .../qs/QuickStatusBarHeaderController.java | 265 +++++++++++++++++- 4 files changed, 295 insertions(+), 219 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java index fa3328417bd63..1e239b1e9ec98 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImplController.java @@ -17,30 +17,44 @@ package com.android.systemui.qs; import com.android.systemui.R; +import com.android.systemui.util.ViewController; import javax.inject.Inject; -public class QSContainerImplController { - private final QSContainerImpl mView; +class QSContainerImplController extends ViewController { private final QuickStatusBarHeaderController mQuickStatusBarHeaderController; private QSContainerImplController(QSContainerImpl view, QuickStatusBarHeaderController.Builder quickStatusBarHeaderControllerBuilder) { - mView = view; + super(view); mQuickStatusBarHeaderController = quickStatusBarHeaderControllerBuilder .setQuickStatusBarHeader(mView.findViewById(R.id.header)).build(); } + @Override + public void init() { + super.init(); + mQuickStatusBarHeaderController.init(); + } + public void setListening(boolean listening) { mQuickStatusBarHeaderController.setListening(listening); } - public static class Builder { + @Override + protected void onViewAttached() { + } + + @Override + protected void onViewDetached() { + } + + static class Builder { private final QuickStatusBarHeaderController.Builder mQuickStatusBarHeaderControllerBuilder; private QSContainerImpl mView; @Inject - public Builder( + Builder( QuickStatusBarHeaderController.Builder quickStatusBarHeaderControllerBuilder) { mQuickStatusBarHeaderControllerBuilder = quickStatusBarHeaderControllerBuilder; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index f1bb8996e1810..3a783653a2d88 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -142,7 +142,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca mQSContainerImplController = mQSContainerImplControllerBuilder .setQSContainerImpl((QSContainerImpl) view) .build(); - + mQSContainerImplController.init(); mQSDetail.setQsPanel(mQSPanel, mHeader, (View) mFooter); mQSAnimator = new QSAnimator(this, mHeader.findViewById(R.id.quick_qs_panel), mQSPanel); @@ -367,14 +367,13 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca if (DEBUG) Log.d(TAG, "setListening " + listening); mListening = listening; mQSContainerImplController.setListening(listening); - mHeader.setListening(listening); mFooter.setListening(listening); mQSPanel.setListening(mListening, mQsExpanded); } @Override public void setHeaderListening(boolean listening) { - mHeader.setListening(listening); + mQSContainerImplController.setListening(listening); mFooter.setListening(listening); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index 544249a51b08f..b6aa2b78a5f95 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -21,8 +21,8 @@ import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEX import android.annotation.ColorInt; import android.app.AlarmManager; +import android.app.AlarmManager.AlarmClockInfo; import android.content.Context; -import android.content.Intent; import android.content.res.ColorStateList; import android.content.res.Configuration; import android.content.res.Resources; @@ -30,14 +30,8 @@ import android.graphics.Color; import android.graphics.Rect; import android.media.AudioManager; import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.provider.AlarmClock; -import android.provider.Settings; import android.service.notification.ZenModeConfig; -import android.text.format.DateUtils; import android.util.AttributeSet; -import android.util.Log; import android.util.MathUtils; import android.util.Pair; import android.view.ContextThemeWrapper; @@ -58,7 +52,6 @@ import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleRegistry; -import com.android.internal.logging.UiEventLogger; import com.android.settingslib.Utils; import com.android.systemui.BatteryMeterView; import com.android.systemui.DualToneHandler; @@ -66,15 +59,11 @@ import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.demomode.DemoMode; import com.android.systemui.demomode.DemoModeController; -import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; import com.android.systemui.privacy.OngoingPrivacyChip; -import com.android.systemui.privacy.PrivacyChipEvent; -import com.android.systemui.privacy.PrivacyItem; import com.android.systemui.privacy.PrivacyItemController; import com.android.systemui.qs.QSDetail.Callback; -import com.android.systemui.qs.carrier.QSCarrierGroup; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.phone.StatusBarIconController; @@ -82,10 +71,7 @@ import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconMa import com.android.systemui.statusbar.phone.StatusBarWindowView; import com.android.systemui.statusbar.phone.StatusIconContainer; import com.android.systemui.statusbar.policy.Clock; -import com.android.systemui.statusbar.policy.DateView; -import com.android.systemui.statusbar.policy.NextAlarmController; import com.android.systemui.statusbar.policy.ZenModeController; -import com.android.systemui.util.RingerModeTracker; import java.util.ArrayList; import java.util.List; @@ -100,32 +86,17 @@ import javax.inject.Named; * battery) and also contains the {@link QuickQSPanel} along with some of the panel's inner * contents. */ -public class QuickStatusBarHeader extends RelativeLayout implements - View.OnClickListener, NextAlarmController.NextAlarmChangeCallback, - ZenModeController.Callback, LifecycleOwner { - private static final String TAG = "QuickStatusBarHeader"; - private static final boolean DEBUG = false; +public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwner { - /** Delay for auto fading out the long press tooltip after it's fully visible (in ms). */ - private static final long AUTO_FADE_OUT_DELAY_MS = DateUtils.SECOND_IN_MILLIS * 6; - private static final int FADE_ANIMATION_DURATION_MS = 300; - private static final int TOOLTIP_NOT_YET_SHOWN_COUNT = 0; public static final int MAX_TOOLTIP_SHOWN_COUNT = 2; - private final NextAlarmController mAlarmController; private final ZenModeController mZenController; private final StatusBarIconController mStatusBarIconController; - private final ActivityStarter mActivityStarter; - - private QSPanel mQsPanel; private boolean mExpanded; - private boolean mListening; private boolean mQsDisabled; - private QSCarrierGroup mCarrierGroup; protected QuickQSPanel mHeaderQsPanel; - protected QSTileHost mHost; private TintedIconManager mIconManager; private TouchAnimator mStatusIconsAlphaAnimator; private TouchAnimator mHeaderTextContainerAlphaAnimator; @@ -137,9 +108,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements private View mQuickQsStatusIcons; private View mHeaderTextContainerView; - private int mRingerMode = AudioManager.RINGER_MODE_NORMAL; - private AlarmManager.AlarmClockInfo mNextAlarm; - private ImageView mNextAlarmIcon; /** {@link TextView} containing the actual text indicating when the next alarm will go off. */ private TextView mNextAlarmTextView; @@ -149,11 +117,9 @@ public class QuickStatusBarHeader extends RelativeLayout implements private TextView mRingerModeTextView; private View mRingerContainer; private Clock mClockView; - private DateView mDateView; private OngoingPrivacyChip mPrivacyChip; private Space mSpace; private BatteryMeterView mBatteryRemainingIcon; - private RingerModeTracker mRingerModeTracker; private DemoModeController mDemoModeController; private DemoMode mDemoModeReceiver; private UserTracker mUserTracker; @@ -161,11 +127,9 @@ public class QuickStatusBarHeader extends RelativeLayout implements private boolean mMicCameraIndicatorsEnabled; private PrivacyItemController mPrivacyItemController; - private final UiEventLogger mUiEventLogger; // Used for RingerModeTracker private final LifecycleRegistry mLifecycle = new LifecycleRegistry(this); - private boolean mHasTopCutout = false; private int mStatusBarPaddingTop = 0; private int mRoundedCornerPadding = 0; private int mContentMarginStart; @@ -175,57 +139,19 @@ public class QuickStatusBarHeader extends RelativeLayout implements private int mCutOutPaddingRight; private float mExpandedHeaderAlpha = 1.0f; private float mKeyguardExpansionFraction; - private boolean mPrivacyChipLogged = false; - - private PrivacyItemController.Callback mPICCallback = new PrivacyItemController.Callback() { - @Override - public void onPrivacyItemsChanged(List privacyItems) { - mPrivacyChip.setPrivacyList(privacyItems); - setChipVisibility(!privacyItems.isEmpty()); - } - - @Override - public void onFlagAllChanged(boolean flag) { - if (mAllIndicatorsEnabled != flag) { - mAllIndicatorsEnabled = flag; - update(); - } - } - - @Override - public void onFlagMicCameraChanged(boolean flag) { - if (mMicCameraIndicatorsEnabled != flag) { - mMicCameraIndicatorsEnabled = flag; - update(); - } - } - - private void update() { - StatusIconContainer iconContainer = requireViewById(R.id.statusIcons); - iconContainer.setIgnoredSlots(getIgnoredIconSlots()); - setChipVisibility(!mPrivacyChip.getPrivacyList().isEmpty()); - } - }; @Inject public QuickStatusBarHeader(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs, - NextAlarmController nextAlarmController, ZenModeController zenModeController, - StatusBarIconController statusBarIconController, - ActivityStarter activityStarter, PrivacyItemController privacyItemController, - CommandQueue commandQueue, RingerModeTracker ringerModeTracker, - UiEventLogger uiEventLogger, DemoModeController demoModeController, - UserTracker userTracker) { + ZenModeController zenModeController, StatusBarIconController statusBarIconController, + PrivacyItemController privacyItemController, CommandQueue commandQueue, + DemoModeController demoModeController, UserTracker userTracker) { super(context, attrs); - mAlarmController = nextAlarmController; mZenController = zenModeController; mStatusBarIconController = statusBarIconController; - mActivityStarter = activityStarter; mPrivacyItemController = privacyItemController; mDualToneHandler = new DualToneHandler( new ContextThemeWrapper(context, R.style.QSHeaderTheme)); mCommandQueue = commandQueue; - mRingerModeTracker = ringerModeTracker; - mUiEventLogger = uiEventLogger; mDemoModeController = demoModeController; mUserTracker = userTracker; } @@ -249,15 +175,10 @@ public class QuickStatusBarHeader extends RelativeLayout implements mNextAlarmIcon = findViewById(R.id.next_alarm_icon); mNextAlarmTextView = findViewById(R.id.next_alarm_text); mNextAlarmContainer = findViewById(R.id.alarm_container); - mNextAlarmContainer.setOnClickListener(this::onClick); mRingerModeIcon = findViewById(R.id.ringer_mode_icon); mRingerModeTextView = findViewById(R.id.ringer_mode_text); mRingerContainer = findViewById(R.id.ringer_container); - mRingerContainer.setOnClickListener(this::onClick); mPrivacyChip = findViewById(R.id.privacy_chip); - mPrivacyChip.setOnClickListener(this::onClick); - mCarrierGroup = findViewById(R.id.carrier_group); - updateResources(); @@ -276,9 +197,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements mRingerModeIcon.setImageTintList(ColorStateList.valueOf(fillColor)); mClockView = findViewById(R.id.clock); - mClockView.setOnClickListener(this); mDemoModeReceiver = new ClockDemoModeReceiver(mClockView); - mDateView = findViewById(R.id.date); mSpace = findViewById(R.id.space); // Tint for the battery icons are handled in setupHost() @@ -299,7 +218,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements return mHeaderQsPanel; } - private List getIgnoredIconSlots() { + List getIgnoredIconSlots() { ArrayList ignored = new ArrayList<>(); if (getChipEnabled()) { ignored.add(mContext.getResources().getString( @@ -315,8 +234,8 @@ public class QuickStatusBarHeader extends RelativeLayout implements return ignored; } - private void updateStatusText() { - boolean changed = updateRingerStatus() || updateAlarmStatus(); + void updateStatusText(int ringerMode, AlarmClockInfo nextAlarm) { + boolean changed = updateRingerStatus(ringerMode) || updateAlarmStatus(nextAlarm); if (changed) { boolean alarmVisible = mNextAlarmTextView.getVisibility() == View.VISIBLE; @@ -326,32 +245,18 @@ public class QuickStatusBarHeader extends RelativeLayout implements } } - private void setChipVisibility(boolean chipVisible) { - if (chipVisible && getChipEnabled()) { - mPrivacyChip.setVisibility(View.VISIBLE); - // Makes sure that the chip is logged as viewed at most once each time QS is opened - // mListening makes sure that the callback didn't return after the user closed QS - if (!mPrivacyChipLogged && mListening) { - mPrivacyChipLogged = true; - mUiEventLogger.log(PrivacyChipEvent.ONGOING_INDICATORS_CHIP_VIEW); - } - } else { - mPrivacyChip.setVisibility(View.GONE); - } - } - - private boolean updateRingerStatus() { + private boolean updateRingerStatus(int ringerMode) { boolean isOriginalVisible = mRingerModeTextView.getVisibility() == View.VISIBLE; CharSequence originalRingerText = mRingerModeTextView.getText(); boolean ringerVisible = false; if (!ZenModeConfig.isZenOverridingRinger(mZenController.getZen(), mZenController.getConsolidatedPolicy())) { - if (mRingerMode == AudioManager.RINGER_MODE_VIBRATE) { + if (ringerMode == AudioManager.RINGER_MODE_VIBRATE) { mRingerModeIcon.setImageResource(R.drawable.ic_volume_ringer_vibrate); mRingerModeTextView.setText(R.string.qs_status_phone_vibrate); ringerVisible = true; - } else if (mRingerMode == AudioManager.RINGER_MODE_SILENT) { + } else if (ringerMode == AudioManager.RINGER_MODE_SILENT) { mRingerModeIcon.setImageResource(R.drawable.ic_volume_ringer_mute); mRingerModeTextView.setText(R.string.qs_status_phone_muted); ringerVisible = true; @@ -365,14 +270,14 @@ public class QuickStatusBarHeader extends RelativeLayout implements !Objects.equals(originalRingerText, mRingerModeTextView.getText()); } - private boolean updateAlarmStatus() { + private boolean updateAlarmStatus(AlarmClockInfo nextAlarm) { boolean isOriginalVisible = mNextAlarmTextView.getVisibility() == View.VISIBLE; CharSequence originalAlarmText = mNextAlarmTextView.getText(); boolean alarmVisible = false; - if (mNextAlarm != null) { + if (nextAlarm != null) { alarmVisible = true; - mNextAlarmTextView.setText(formatNextAlarm(mNextAlarm)); + mNextAlarmTextView.setText(formatNextAlarm(nextAlarm)); } mNextAlarmIcon.setVisibility(alarmVisible ? View.VISIBLE : View.GONE); mNextAlarmTextView.setVisibility(alarmVisible ? View.VISIBLE : View.GONE); @@ -419,7 +324,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements setMinimumHeight(sbHeight + qqsHeight); } - private void updateResources() { + void updateResources() { Resources resources = mContext.getResources(); updateMinimumHeight(); @@ -531,13 +436,8 @@ public class QuickStatusBarHeader extends RelativeLayout implements @Override public void onAttachedToWindow() { super.onAttachedToWindow(); - mRingerModeTracker.getRingerModeInternal().observe(this, ringer -> { - mRingerMode = ringer; - updateStatusText(); - }); mStatusBarIconController.addIconGroup(mIconManager); mDemoModeController.addCallback(mDemoModeReceiver); - requestApplyInsets(); } @Override @@ -563,17 +463,14 @@ public class QuickStatusBarHeader extends RelativeLayout implements if (cutout != null) { Rect topCutout = cutout.getBoundingRectTop(); if (topCutout.isEmpty() || cornerCutout) { - mHasTopCutout = false; lp.width = 0; mSpace.setVisibility(View.GONE); } else { - mHasTopCutout = true; lp.width = topCutout.width(); mSpace.setVisibility(View.VISIBLE); } } mSpace.setLayoutParams(lp); - setChipVisibility(mPrivacyChip.getVisibility() == View.VISIBLE); mCutOutPaddingLeft = padding.first; mCutOutPaddingRight = padding.second; mWaterfallTopInset = cutout == null ? 0 : cutout.getWaterfallInsets().top; @@ -614,100 +511,19 @@ public class QuickStatusBarHeader extends RelativeLayout implements @Override @VisibleForTesting public void onDetachedFromWindow() { - setListening(false); - mRingerModeTracker.getRingerModeInternal().removeObservers(this); mStatusBarIconController.removeIconGroup(mIconManager); mDemoModeController.removeCallback(mDemoModeReceiver); super.onDetachedFromWindow(); } - public void setListening(boolean listening) { - if (listening == mListening) { - return; - } - mHeaderQsPanel.setListening(listening); - if (mHeaderQsPanel.switchTileLayout()) { - updateResources(); - } - mListening = listening; - - if (listening) { - mZenController.addCallback(this); - mAlarmController.addCallback(this); - mLifecycle.setCurrentState(Lifecycle.State.RESUMED); - // Get the most up to date info - mAllIndicatorsEnabled = mPrivacyItemController.getAllIndicatorsAvailable(); - mMicCameraIndicatorsEnabled = mPrivacyItemController.getMicCameraAvailable(); - mPrivacyItemController.addCallback(mPICCallback); - } else { - mZenController.removeCallback(this); - mAlarmController.removeCallback(this); - mLifecycle.setCurrentState(Lifecycle.State.CREATED); - mPrivacyItemController.removeCallback(mPICCallback); - mPrivacyChipLogged = false; - } - } - - @Override - public void onClick(View v) { - if (v == mClockView) { - mActivityStarter.postStartActivityDismissingKeyguard(new Intent( - AlarmClock.ACTION_SHOW_ALARMS), 0); - } else if (v == mNextAlarmContainer && mNextAlarmContainer.isVisibleToUser()) { - if (mNextAlarm.getShowIntent() != null) { - mActivityStarter.postStartActivityDismissingKeyguard( - mNextAlarm.getShowIntent()); - } else { - Log.d(TAG, "No PendingIntent for next alarm. Using default intent"); - mActivityStarter.postStartActivityDismissingKeyguard(new Intent( - AlarmClock.ACTION_SHOW_ALARMS), 0); - } - } else if (v == mPrivacyChip) { - // If the privacy chip is visible, it means there were some indicators - Handler mUiHandler = new Handler(Looper.getMainLooper()); - mUiEventLogger.log(PrivacyChipEvent.ONGOING_INDICATORS_CHIP_CLICK); - mUiHandler.post(() -> { - mActivityStarter.postStartActivityDismissingKeyguard( - new Intent(Intent.ACTION_REVIEW_ONGOING_PERMISSION_USAGE), 0); - mHost.collapsePanels(); - }); - } else if (v == mRingerContainer && mRingerContainer.isVisibleToUser()) { - mActivityStarter.postStartActivityDismissingKeyguard(new Intent( - Settings.ACTION_SOUND_SETTINGS), 0); - } - } - - @Override - public void onNextAlarmChanged(AlarmManager.AlarmClockInfo nextAlarm) { - mNextAlarm = nextAlarm; - updateStatusText(); - } - - @Override - public void onZenChanged(int zen) { - updateStatusText(); - } - - @Override - public void onConfigChanged(ZenModeConfig config) { - updateStatusText(); - } - public void updateEverything() { post(() -> setClickable(!mExpanded)); } public void setQSPanel(final QSPanel qsPanel) { - mQsPanel = qsPanel; - setupHost(qsPanel.getHost()); - } - - public void setupHost(final QSTileHost host) { - mHost = host; //host.setHeaderView(mExpandIndicator); - mHeaderQsPanel.setQSPanelAndHeader(mQsPanel, this); - mHeaderQsPanel.setHost(host, null /* No customization in header */); - + mHeaderQsPanel.setQSPanelAndHeader(qsPanel, this); + mHeaderQsPanel.setHost(qsPanel.getHost(), null /* No customization in header */); Rect tintArea = new Rect(0, 0, 0, 0); int colorForeground = Utils.getColorAttrDefaultColor(getContext(), @@ -778,7 +594,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements } } - private boolean getChipEnabled() { + boolean getChipEnabled() { return mMicCameraIndicatorsEnabled || mAllIndicatorsEnabled; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java index d899acbade4a7..66419605f022c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java @@ -16,36 +16,279 @@ package com.android.systemui.qs; +import android.app.AlarmManager.AlarmClockInfo; +import android.content.Intent; +import android.media.AudioManager; +import android.os.Handler; +import android.os.Looper; +import android.provider.AlarmClock; +import android.provider.Settings; +import android.service.notification.ZenModeConfig; +import android.util.Log; +import android.view.View; +import android.view.View.OnClickListener; + +import androidx.annotation.NonNull; +import androidx.lifecycle.Lifecycle; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.LifecycleRegistry; + +import com.android.internal.logging.UiEventLogger; import com.android.systemui.R; +import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.privacy.OngoingPrivacyChip; +import com.android.systemui.privacy.PrivacyChipEvent; +import com.android.systemui.privacy.PrivacyItem; +import com.android.systemui.privacy.PrivacyItemController; import com.android.systemui.qs.carrier.QSCarrierGroupController; +import com.android.systemui.statusbar.phone.StatusIconContainer; +import com.android.systemui.statusbar.policy.Clock; +import com.android.systemui.statusbar.policy.NextAlarmController; +import com.android.systemui.statusbar.policy.NextAlarmController.NextAlarmChangeCallback; +import com.android.systemui.statusbar.policy.ZenModeController; +import com.android.systemui.statusbar.policy.ZenModeController.Callback; +import com.android.systemui.util.RingerModeTracker; +import com.android.systemui.util.ViewController; + +import java.util.List; import javax.inject.Inject; -public class QuickStatusBarHeaderController { - private final QuickStatusBarHeader mView; +/** + * Controller for {@link QuickStatusBarHeader}. + */ +class QuickStatusBarHeaderController extends ViewController { + private static final String TAG = "QuickStatusBarHeader"; + + private final ZenModeController mZenModeController; + private final NextAlarmController mNextAlarmController; + private final PrivacyItemController mPrivacyItemController; + private final RingerModeTracker mRingerModeTracker; + private final ActivityStarter mActivityStarter; + private final UiEventLogger mUiEventLogger; private final QSCarrierGroupController mQSCarrierGroupController; + private final QuickQSPanel mHeaderQsPanel; + private final LifecycleRegistry mLifecycle; + private final OngoingPrivacyChip mPrivacyChip; + private final Clock mClockView; + private final View mNextAlarmContainer; + private final View mRingerContainer; + private final QSTileHost mQSTileHost; + + private boolean mListening; + private AlarmClockInfo mNextAlarm; + private boolean mAllIndicatorsEnabled; + private boolean mMicCameraIndicatorsEnabled; + private boolean mPrivacyChipLogged; + private int mRingerMode = AudioManager.RINGER_MODE_NORMAL; + + private final ZenModeController.Callback mZenModeControllerCallback = new Callback() { + @Override + public void onZenChanged(int zen) { + mView.updateStatusText(mRingerMode, mNextAlarm); + } + + @Override + public void onConfigChanged(ZenModeConfig config) { + mView.updateStatusText(mRingerMode, mNextAlarm); + } + }; + + private final NextAlarmChangeCallback mNextAlarmChangeCallback = new NextAlarmChangeCallback() { + @Override + public void onNextAlarmChanged(AlarmClockInfo nextAlarm) { + mNextAlarm = nextAlarm; + mView.updateStatusText(mRingerMode, mNextAlarm); + } + }; + + private final LifecycleOwner mLifecycleOwner = new LifecycleOwner() { + @NonNull + @Override + public Lifecycle getLifecycle() { + return mLifecycle; + } + }; + + private PrivacyItemController.Callback mPICCallback = new PrivacyItemController.Callback() { + @Override + public void onPrivacyItemsChanged(@NonNull List privacyItems) { + mPrivacyChip.setPrivacyList(privacyItems); + setChipVisibility(!privacyItems.isEmpty()); + } + + @Override + public void onFlagAllChanged(boolean flag) { + if (mAllIndicatorsEnabled != flag) { + mAllIndicatorsEnabled = flag; + update(); + } + } + + @Override + public void onFlagMicCameraChanged(boolean flag) { + if (mMicCameraIndicatorsEnabled != flag) { + mMicCameraIndicatorsEnabled = flag; + update(); + } + } + + private void update() { + StatusIconContainer iconContainer = mView.requireViewById(R.id.statusIcons); + iconContainer.setIgnoredSlots(mView.getIgnoredIconSlots()); + setChipVisibility(!mPrivacyChip.getPrivacyList().isEmpty()); + } + }; + + private View.OnClickListener mOnClickListener = new OnClickListener() { + @Override + public void onClick(View v) { + if (v == mClockView) { + mActivityStarter.postStartActivityDismissingKeyguard(new Intent( + AlarmClock.ACTION_SHOW_ALARMS), 0); + } else if (v == mNextAlarmContainer && mNextAlarmContainer.isVisibleToUser()) { + if (mNextAlarm.getShowIntent() != null) { + mActivityStarter.postStartActivityDismissingKeyguard( + mNextAlarm.getShowIntent()); + } else { + Log.d(TAG, "No PendingIntent for next alarm. Using default intent"); + mActivityStarter.postStartActivityDismissingKeyguard(new Intent( + AlarmClock.ACTION_SHOW_ALARMS), 0); + } + } else if (v == mPrivacyChip) { + // If the privacy chip is visible, it means there were some indicators + Handler mUiHandler = new Handler(Looper.getMainLooper()); + mUiEventLogger.log(PrivacyChipEvent.ONGOING_INDICATORS_CHIP_CLICK); + mUiHandler.post(() -> { + mActivityStarter.postStartActivityDismissingKeyguard( + new Intent(Intent.ACTION_REVIEW_ONGOING_PERMISSION_USAGE), 0); + mQSTileHost.collapsePanels(); + }); + } else if (v == mRingerContainer && mRingerContainer.isVisibleToUser()) { + mActivityStarter.postStartActivityDismissingKeyguard(new Intent( + Settings.ACTION_SOUND_SETTINGS), 0); + } + } + }; private QuickStatusBarHeaderController(QuickStatusBarHeader view, + ZenModeController zenModeController, NextAlarmController nextAlarmController, + PrivacyItemController privacyItemController, RingerModeTracker ringerModeTracker, + ActivityStarter activityStarter, UiEventLogger uiEventLogger, + QSTileHost qsTileHost, QSCarrierGroupController.Builder qsCarrierGroupControllerBuilder) { - mView = view; + super(view); + mZenModeController = zenModeController; + mNextAlarmController = nextAlarmController; + mPrivacyItemController = privacyItemController; + mRingerModeTracker = ringerModeTracker; + mActivityStarter = activityStarter; + mUiEventLogger = uiEventLogger; + mQSTileHost = qsTileHost; + mLifecycle = new LifecycleRegistry(mLifecycleOwner); + mQSCarrierGroupController = qsCarrierGroupControllerBuilder .setQSCarrierGroup(mView.findViewById(R.id.carrier_group)) .build(); + + mPrivacyChip = mView.findViewById(R.id.privacy_chip); + mHeaderQsPanel = mView.findViewById(R.id.quick_qs_panel); + mNextAlarmContainer = mView.findViewById(R.id.alarm_container); + mClockView = mView.findViewById(R.id.clock); + mRingerContainer = mView.findViewById(R.id.ringer_container); + } + + @Override + protected void onViewAttached() { + mRingerModeTracker.getRingerModeInternal().observe(mLifecycleOwner, ringer -> { + mRingerMode = ringer; + mView.updateStatusText(mRingerMode, mNextAlarm); + }); + + mClockView.setOnClickListener(mOnClickListener); + mNextAlarmContainer.setOnClickListener(mOnClickListener); + mRingerContainer.setOnClickListener(mOnClickListener); + mPrivacyChip.setOnClickListener(mOnClickListener); + setChipVisibility(mPrivacyChip.getVisibility() == View.VISIBLE); + } + + @Override + protected void onViewDetached() { + mRingerModeTracker.getRingerModeInternal().removeObservers(mLifecycleOwner); + mClockView.setOnClickListener(null); + mNextAlarmContainer.setOnClickListener(null); + mRingerContainer.setOnClickListener(null); + mPrivacyChip.setOnClickListener(null); + setListening(false); } public void setListening(boolean listening) { mQSCarrierGroupController.setListening(listening); - // TODO: move mView.setListening logic into here. - mView.setListening(listening); + + if (listening == mListening) { + return; + } + mListening = listening; + + mHeaderQsPanel.setListening(listening); + if (mHeaderQsPanel.switchTileLayout()) { + mView.updateResources(); + } + + if (listening) { + mZenModeController.addCallback(mZenModeControllerCallback); + mNextAlarmController.addCallback(mNextAlarmChangeCallback); + mLifecycle.setCurrentState(Lifecycle.State.RESUMED); + // Get the most up to date info + mAllIndicatorsEnabled = mPrivacyItemController.getAllIndicatorsAvailable(); + mMicCameraIndicatorsEnabled = mPrivacyItemController.getMicCameraAvailable(); + mPrivacyItemController.addCallback(mPICCallback); + } else { + mZenModeController.removeCallback(mZenModeControllerCallback); + mNextAlarmController.removeCallback(mNextAlarmChangeCallback); + mLifecycle.setCurrentState(Lifecycle.State.CREATED); + mPrivacyItemController.removeCallback(mPICCallback); + mPrivacyChipLogged = false; + } } + private void setChipVisibility(boolean chipVisible) { + if (chipVisible && mView.getChipEnabled()) { + mPrivacyChip.setVisibility(View.VISIBLE); + // Makes sure that the chip is logged as viewed at most once each time QS is opened + // mListening makes sure that the callback didn't return after the user closed QS + if (!mPrivacyChipLogged && mListening) { + mPrivacyChipLogged = true; + mUiEventLogger.log(PrivacyChipEvent.ONGOING_INDICATORS_CHIP_VIEW); + } + } else { + mPrivacyChip.setVisibility(View.GONE); + } + } - public static class Builder { + static class Builder { + private final ZenModeController mZenModeController; + private final NextAlarmController mNextAlarmController; + private final PrivacyItemController mPrivacyItemController; + private final RingerModeTracker mRingerModeTracker; + private final ActivityStarter mActivityStarter; + private final UiEventLogger mUiEventLogger; + private final QSTileHost mQsTileHost; private final QSCarrierGroupController.Builder mQSCarrierGroupControllerBuilder; private QuickStatusBarHeader mView; @Inject - public Builder(QSCarrierGroupController.Builder qsCarrierGroupControllerBuilder) { + Builder(ZenModeController zenModeController, NextAlarmController nextAlarmController, + PrivacyItemController privacyItemController, RingerModeTracker ringerModeTracker, + ActivityStarter activityStarter, UiEventLogger uiEventLogger, QSTileHost qsTileHost, + QSCarrierGroupController.Builder qsCarrierGroupControllerBuilder) { + mZenModeController = zenModeController; + mNextAlarmController = nextAlarmController; + mPrivacyItemController = privacyItemController; + mRingerModeTracker = ringerModeTracker; + mActivityStarter = activityStarter; + mUiEventLogger = uiEventLogger; + mQsTileHost = qsTileHost; mQSCarrierGroupControllerBuilder = qsCarrierGroupControllerBuilder; } @@ -54,8 +297,12 @@ public class QuickStatusBarHeaderController { return this; } - public QuickStatusBarHeaderController build() { - return new QuickStatusBarHeaderController(mView, mQSCarrierGroupControllerBuilder); + + QuickStatusBarHeaderController build() { + return new QuickStatusBarHeaderController(mView, mZenModeController, + mNextAlarmController, mPrivacyItemController, mRingerModeTracker, + mActivityStarter, mUiEventLogger, mQsTileHost, + mQSCarrierGroupControllerBuilder); } } } From df721fcc9a2461ca0c8c964670311e22eefe15d0 Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Mon, 28 Sep 2020 16:24:49 -0400 Subject: [PATCH 2/6] 2/N Remove SBIconCtrl and CommandQueue from QSBarHeader. Remove StatusBarIconController and CommandQueue from QuickStatusBarHeader. Relevant code has been moved to the controller. Bug: 168904199 Test: atest SystemUITests Change-Id: Ia310cf87f3da2312007dca295aa281516febe9a1 --- .../systemui/qs/QuickStatusBarHeader.java | 41 ++++++------------- .../qs/QuickStatusBarHeaderController.java | 33 +++++++++++++-- .../android/systemui/qs/QSFragmentTest.java | 6 +-- 3 files changed, 45 insertions(+), 35 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index b6aa2b78a5f95..61d10e70293cf 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -47,7 +47,6 @@ import android.widget.Space; import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.annotation.VisibleForTesting; import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LifecycleRegistry; @@ -65,11 +64,8 @@ import com.android.systemui.privacy.OngoingPrivacyChip; import com.android.systemui.privacy.PrivacyItemController; import com.android.systemui.qs.QSDetail.Callback; import com.android.systemui.settings.UserTracker; -import com.android.systemui.statusbar.CommandQueue; -import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager; import com.android.systemui.statusbar.phone.StatusBarWindowView; -import com.android.systemui.statusbar.phone.StatusIconContainer; import com.android.systemui.statusbar.policy.Clock; import com.android.systemui.statusbar.policy.ZenModeController; @@ -91,18 +87,15 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn public static final int MAX_TOOLTIP_SHOWN_COUNT = 2; private final ZenModeController mZenController; - private final StatusBarIconController mStatusBarIconController; private boolean mExpanded; private boolean mQsDisabled; protected QuickQSPanel mHeaderQsPanel; - private TintedIconManager mIconManager; private TouchAnimator mStatusIconsAlphaAnimator; private TouchAnimator mHeaderTextContainerAlphaAnimator; private TouchAnimator mPrivacyChipAlphaAnimator; private DualToneHandler mDualToneHandler; - private final CommandQueue mCommandQueue; private View mSystemIconsView; private View mQuickQsStatusIcons; @@ -142,16 +135,13 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn @Inject public QuickStatusBarHeader(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs, - ZenModeController zenModeController, StatusBarIconController statusBarIconController, - PrivacyItemController privacyItemController, CommandQueue commandQueue, + ZenModeController zenModeController, PrivacyItemController privacyItemController, DemoModeController demoModeController, UserTracker userTracker) { super(context, attrs); mZenController = zenModeController; - mStatusBarIconController = statusBarIconController; mPrivacyItemController = privacyItemController; mDualToneHandler = new DualToneHandler( new ContextThemeWrapper(context, R.style.QSHeaderTheme)); - mCommandQueue = commandQueue; mDemoModeController = demoModeController; mUserTracker = userTracker; } @@ -163,11 +153,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn mHeaderQsPanel = findViewById(R.id.quick_qs_panel); mSystemIconsView = findViewById(R.id.quick_status_bar_system_icons); mQuickQsStatusIcons = findViewById(R.id.quick_qs_status_icons); - StatusIconContainer iconContainer = findViewById(R.id.statusIcons); - // Ignore privacy icons because they show in the space above QQS - iconContainer.addIgnoredSlots(getIgnoredIconSlots()); - iconContainer.setShouldRestrictIcons(false); - mIconManager = new TintedIconManager(iconContainer, mCommandQueue); // Views corresponding to the header info section (e.g. ringer and next alarm). mHeaderTextContainerView = findViewById(R.id.header_text_container); @@ -183,19 +168,9 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn updateResources(); Rect tintArea = new Rect(0, 0, 0, 0); - int colorForeground = Utils.getColorAttrDefaultColor(getContext(), - android.R.attr.colorForeground); - float intensity = getColorIntensity(colorForeground); - int fillColor = mDualToneHandler.getSingleColor(intensity); - // Set light text on the header icons because they will always be on a black background applyDarkness(R.id.clock, tintArea, 0, DarkIconDispatcher.DEFAULT_ICON_TINT); - // Set the correct tint for the status icons so they contrast - mIconManager.setTint(fillColor); - mNextAlarmIcon.setImageTintList(ColorStateList.valueOf(fillColor)); - mRingerModeIcon.setImageTintList(ColorStateList.valueOf(fillColor)); - mClockView = findViewById(R.id.clock); mDemoModeReceiver = new ClockDemoModeReceiver(mClockView); mSpace = findViewById(R.id.space); @@ -214,6 +189,18 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn mMicCameraIndicatorsEnabled = mPrivacyItemController.getMicCameraAvailable(); } + void onAttach(TintedIconManager iconManager) { + int colorForeground = Utils.getColorAttrDefaultColor(getContext(), + android.R.attr.colorForeground); + float intensity = getColorIntensity(colorForeground); + int fillColor = mDualToneHandler.getSingleColor(intensity); + + // Set the correct tint for the status icons so they contrast + iconManager.setTint(fillColor); + mNextAlarmIcon.setImageTintList(ColorStateList.valueOf(fillColor)); + mRingerModeIcon.setImageTintList(ColorStateList.valueOf(fillColor)); + } + public QuickQSPanel getHeaderQsPanel() { return mHeaderQsPanel; } @@ -436,7 +423,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn @Override public void onAttachedToWindow() { super.onAttachedToWindow(); - mStatusBarIconController.addIconGroup(mIconManager); mDemoModeController.addCallback(mDemoModeReceiver); } @@ -511,7 +497,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn @Override @VisibleForTesting public void onDetachedFromWindow() { - mStatusBarIconController.removeIconGroup(mIconManager); mDemoModeController.removeCallback(mDemoModeReceiver); super.onDetachedFromWindow(); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java index 66419605f022c..c452c88c9a805 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java @@ -41,6 +41,8 @@ import com.android.systemui.privacy.PrivacyChipEvent; import com.android.systemui.privacy.PrivacyItem; import com.android.systemui.privacy.PrivacyItemController; import com.android.systemui.qs.carrier.QSCarrierGroupController; +import com.android.systemui.statusbar.CommandQueue; +import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.StatusIconContainer; import com.android.systemui.statusbar.policy.Clock; import com.android.systemui.statusbar.policy.NextAlarmController; @@ -74,6 +76,10 @@ class QuickStatusBarHeaderController extends ViewController Date: Mon, 28 Sep 2020 18:09:32 -0400 Subject: [PATCH 3/6] 3/N Move PrivacyItemController out of QSBarHeader. Move PrivacyItemController out of QuickStatusBarHeader and into its controller. Change-Id: Ibdc24912fd333d80ab13dfd5df12ebc27d68353f Test: atest SystemUITests --- .../systemui/qs/QuickStatusBarHeader.java | 32 ++----------------- .../qs/QuickStatusBarHeaderController.java | 31 ++++++++++++++++-- 2 files changed, 30 insertions(+), 33 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index 61d10e70293cf..aefe8ed87703f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -61,7 +61,6 @@ import com.android.systemui.demomode.DemoModeController; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; import com.android.systemui.privacy.OngoingPrivacyChip; -import com.android.systemui.privacy.PrivacyItemController; import com.android.systemui.qs.QSDetail.Callback; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager; @@ -69,8 +68,6 @@ import com.android.systemui.statusbar.phone.StatusBarWindowView; import com.android.systemui.statusbar.policy.Clock; import com.android.systemui.statusbar.policy.ZenModeController; -import java.util.ArrayList; -import java.util.List; import java.util.Locale; import java.util.Objects; @@ -119,7 +116,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn private boolean mAllIndicatorsEnabled; private boolean mMicCameraIndicatorsEnabled; - private PrivacyItemController mPrivacyItemController; // Used for RingerModeTracker private final LifecycleRegistry mLifecycle = new LifecycleRegistry(this); @@ -135,11 +131,10 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn @Inject public QuickStatusBarHeader(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs, - ZenModeController zenModeController, PrivacyItemController privacyItemController, - DemoModeController demoModeController, UserTracker userTracker) { + ZenModeController zenModeController, DemoModeController demoModeController, + UserTracker userTracker) { super(context, attrs); mZenController = zenModeController; - mPrivacyItemController = privacyItemController; mDualToneHandler = new DualToneHandler( new ContextThemeWrapper(context, R.style.QSHeaderTheme)); mDemoModeController = demoModeController; @@ -184,9 +179,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn mBatteryRemainingIcon.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE); mRingerModeTextView.setSelected(true); mNextAlarmTextView.setSelected(true); - - mAllIndicatorsEnabled = mPrivacyItemController.getAllIndicatorsAvailable(); - mMicCameraIndicatorsEnabled = mPrivacyItemController.getMicCameraAvailable(); } void onAttach(TintedIconManager iconManager) { @@ -205,22 +197,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn return mHeaderQsPanel; } - List getIgnoredIconSlots() { - ArrayList ignored = new ArrayList<>(); - if (getChipEnabled()) { - ignored.add(mContext.getResources().getString( - com.android.internal.R.string.status_bar_camera)); - ignored.add(mContext.getResources().getString( - com.android.internal.R.string.status_bar_microphone)); - if (mAllIndicatorsEnabled) { - ignored.add(mContext.getResources().getString( - com.android.internal.R.string.status_bar_location)); - } - } - - return ignored; - } - void updateStatusText(int ringerMode, AlarmClockInfo nextAlarm) { boolean changed = updateRingerStatus(ringerMode) || updateAlarmStatus(nextAlarm); @@ -579,10 +555,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn } } - boolean getChipEnabled() { - return mMicCameraIndicatorsEnabled || mAllIndicatorsEnabled; - } - private static class ClockDemoModeReceiver implements DemoMode { private Clock mClockView; diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java index c452c88c9a805..beace4276f47e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java @@ -52,6 +52,7 @@ import com.android.systemui.statusbar.policy.ZenModeController.Callback; import com.android.systemui.util.RingerModeTracker; import com.android.systemui.util.ViewController; +import java.util.ArrayList; import java.util.List; import javax.inject.Inject; @@ -141,7 +142,7 @@ class QuickStatusBarHeaderController extends ViewController getIgnoredIconSlots() { + ArrayList ignored = new ArrayList<>(); + if (getChipEnabled()) { + ignored.add(mView.getResources().getString( + com.android.internal.R.string.status_bar_camera)); + ignored.add(mView.getResources().getString( + com.android.internal.R.string.status_bar_microphone)); + if (mAllIndicatorsEnabled) { + ignored.add(mView.getResources().getString( + com.android.internal.R.string.status_bar_location)); + } + } + + return ignored; + } + + + private boolean getChipEnabled() { + return mMicCameraIndicatorsEnabled || mAllIndicatorsEnabled; + } + static class Builder { private final ZenModeController mZenModeController; private final NextAlarmController mNextAlarmController; From 8143950a357368055a38dd49eb1b34ba9e0d4e86 Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Tue, 29 Sep 2020 10:38:31 -0400 Subject: [PATCH 4/6] 4/N Remove ZenModeController for QSBarHeader. Remove the ZenModeController from the QuickStatusBarHeader. Test: atest SystemUITests Bug: 168904199 Change-Id: Icaf9085630f0daec16cb5d86c9552b21a2e9d0e6 --- .../systemui/qs/QuickStatusBarHeader.java | 23 ++++++------------- .../qs/QuickStatusBarHeaderController.java | 14 +++++++---- 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index aefe8ed87703f..86fcabe7df3d3 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -17,8 +17,6 @@ package com.android.systemui.qs; import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS; import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; -import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT; - import android.annotation.ColorInt; import android.app.AlarmManager; import android.app.AlarmManager.AlarmClockInfo; @@ -30,7 +28,6 @@ import android.graphics.Color; import android.graphics.Rect; import android.media.AudioManager; import android.os.Bundle; -import android.service.notification.ZenModeConfig; import android.util.AttributeSet; import android.util.MathUtils; import android.util.Pair; @@ -66,8 +63,8 @@ import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager; import com.android.systemui.statusbar.phone.StatusBarWindowView; import com.android.systemui.statusbar.policy.Clock; -import com.android.systemui.statusbar.policy.ZenModeController; +import java.util.List; import java.util.Locale; import java.util.Objects; @@ -83,8 +80,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn public static final int MAX_TOOLTIP_SHOWN_COUNT = 2; - private final ZenModeController mZenController; - private boolean mExpanded; private boolean mQsDisabled; @@ -113,8 +108,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn private DemoModeController mDemoModeController; private DemoMode mDemoModeReceiver; private UserTracker mUserTracker; - private boolean mAllIndicatorsEnabled; - private boolean mMicCameraIndicatorsEnabled; // Used for RingerModeTracker private final LifecycleRegistry mLifecycle = new LifecycleRegistry(this); @@ -131,10 +124,8 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn @Inject public QuickStatusBarHeader(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs, - ZenModeController zenModeController, DemoModeController demoModeController, - UserTracker userTracker) { + DemoModeController demoModeController, UserTracker userTracker) { super(context, attrs); - mZenController = zenModeController; mDualToneHandler = new DualToneHandler( new ContextThemeWrapper(context, R.style.QSHeaderTheme)); mDemoModeController = demoModeController; @@ -197,8 +188,9 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn return mHeaderQsPanel; } - void updateStatusText(int ringerMode, AlarmClockInfo nextAlarm) { - boolean changed = updateRingerStatus(ringerMode) || updateAlarmStatus(nextAlarm); + void updateStatusText(int ringerMode, AlarmClockInfo nextAlarm, boolean zenOverridingRinger) { + boolean changed = updateRingerStatus(ringerMode, zenOverridingRinger) + || updateAlarmStatus(nextAlarm); if (changed) { boolean alarmVisible = mNextAlarmTextView.getVisibility() == View.VISIBLE; @@ -208,13 +200,12 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn } } - private boolean updateRingerStatus(int ringerMode) { + private boolean updateRingerStatus(int ringerMode, boolean zenOverridingRinger) { boolean isOriginalVisible = mRingerModeTextView.getVisibility() == View.VISIBLE; CharSequence originalRingerText = mRingerModeTextView.getText(); boolean ringerVisible = false; - if (!ZenModeConfig.isZenOverridingRinger(mZenController.getZen(), - mZenController.getConsolidatedPolicy())) { + if (!zenOverridingRinger) { if (ringerMode == AudioManager.RINGER_MODE_VIBRATE) { mRingerModeIcon.setImageResource(R.drawable.ic_volume_ringer_vibrate); mRingerModeTextView.setText(R.string.qs_status_phone_vibrate); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java index beace4276f47e..8d08249aab402 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java @@ -92,12 +92,12 @@ class QuickStatusBarHeaderController extends ViewController { mRingerMode = ringer; - mView.updateStatusText(mRingerMode, mNextAlarm); + mView.updateStatusText(mRingerMode, mNextAlarm, isZenOverridingRinger()); }); mClockView.setOnClickListener(mOnClickListener); @@ -308,11 +308,15 @@ class QuickStatusBarHeaderController extends ViewController Date: Tue, 29 Sep 2020 13:33:14 -0400 Subject: [PATCH 5/6] 5/N Remove DemoModecontroller from QSBarHeader Remove the DemoModecontroller from the QuickStatusBarHeader. Bug: 168904199 Test: atest SytemUITests Change-Id: Ie02cbc5c83185cd050ceed744455b1e99f02dedf --- .../systemui/qs/QuickStatusBarHeader.java | 54 ++----------------- .../qs/QuickStatusBarHeaderController.java | 45 +++++++++++++++- .../android/systemui/qs/QSFragmentTest.java | 4 -- 3 files changed, 47 insertions(+), 56 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index 86fcabe7df3d3..0cc53191a0c59 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -17,6 +17,8 @@ package com.android.systemui.qs; import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS; import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; +import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT; + import android.annotation.ColorInt; import android.app.AlarmManager; import android.app.AlarmManager.AlarmClockInfo; @@ -27,7 +29,6 @@ import android.content.res.Resources; import android.graphics.Color; import android.graphics.Rect; import android.media.AudioManager; -import android.os.Bundle; import android.util.AttributeSet; import android.util.MathUtils; import android.util.Pair; @@ -53,8 +54,6 @@ import com.android.systemui.BatteryMeterView; import com.android.systemui.DualToneHandler; import com.android.systemui.Interpolators; import com.android.systemui.R; -import com.android.systemui.demomode.DemoMode; -import com.android.systemui.demomode.DemoModeController; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; import com.android.systemui.privacy.OngoingPrivacyChip; @@ -64,7 +63,6 @@ import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconMa import com.android.systemui.statusbar.phone.StatusBarWindowView; import com.android.systemui.statusbar.policy.Clock; -import java.util.List; import java.util.Locale; import java.util.Objects; @@ -105,8 +103,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn private OngoingPrivacyChip mPrivacyChip; private Space mSpace; private BatteryMeterView mBatteryRemainingIcon; - private DemoModeController mDemoModeController; - private DemoMode mDemoModeReceiver; private UserTracker mUserTracker; // Used for RingerModeTracker @@ -124,11 +120,10 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn @Inject public QuickStatusBarHeader(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs, - DemoModeController demoModeController, UserTracker userTracker) { + UserTracker userTracker) { super(context, attrs); mDualToneHandler = new DualToneHandler( new ContextThemeWrapper(context, R.style.QSHeaderTheme)); - mDemoModeController = demoModeController; mUserTracker = userTracker; } @@ -158,7 +153,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn applyDarkness(R.id.clock, tintArea, 0, DarkIconDispatcher.DEFAULT_ICON_TINT); mClockView = findViewById(R.id.clock); - mDemoModeReceiver = new ClockDemoModeReceiver(mClockView); mSpace = findViewById(R.id.space); // Tint for the battery icons are handled in setupHost() @@ -387,12 +381,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn updateResources(); } - @Override - public void onAttachedToWindow() { - super.onAttachedToWindow(); - mDemoModeController.addCallback(mDemoModeReceiver); - } - @Override public WindowInsets onApplyWindowInsets(WindowInsets insets) { // Handle padding of the clock @@ -461,13 +449,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn 0); } - @Override - @VisibleForTesting - public void onDetachedFromWindow() { - mDemoModeController.removeCallback(mDemoModeReceiver); - super.onDetachedFromWindow(); - } - public void updateEverything() { post(() -> setClickable(!mExpanded)); } @@ -545,33 +526,4 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn updateHeaderTextContainerAlphaAnimator(); } } - - private static class ClockDemoModeReceiver implements DemoMode { - private Clock mClockView; - - @Override - public List demoCommands() { - return List.of(COMMAND_CLOCK); - } - - ClockDemoModeReceiver(Clock clockView) { - mClockView = clockView; - } - - @Override - public void dispatchDemoCommand(String command, Bundle args) { - mClockView.dispatchDemoCommand(command, args); - } - - @Override - public void onDemoModeStarted() { - mClockView.onDemoModeStarted(); - } - - @Override - public void onDemoModeFinished() { - mClockView.onDemoModeFinished(); - } - } - } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java index 8d08249aab402..41bb9b490a0f0 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java @@ -19,6 +19,7 @@ package com.android.systemui.qs; import android.app.AlarmManager.AlarmClockInfo; import android.content.Intent; import android.media.AudioManager; +import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.provider.AlarmClock; @@ -35,6 +36,8 @@ import androidx.lifecycle.LifecycleRegistry; import com.android.internal.logging.UiEventLogger; import com.android.systemui.R; +import com.android.systemui.demomode.DemoMode; +import com.android.systemui.demomode.DemoModeController; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.privacy.OngoingPrivacyChip; import com.android.systemui.privacy.PrivacyChipEvent; @@ -79,8 +82,10 @@ class QuickStatusBarHeaderController extends ViewController demoCommands() { + return List.of(COMMAND_CLOCK); + } + + ClockDemoModeReceiver(Clock clockView) { + mClockView = clockView; + } + + @Override + public void dispatchDemoCommand(String command, Bundle args) { + mClockView.dispatchDemoCommand(command, args); + } + + @Override + public void onDemoModeStarted() { + mClockView.onDemoModeStarted(); + } + + @Override + public void onDemoModeFinished() { + mClockView.onDemoModeFinished(); + } + } + static class Builder { private final ZenModeController mZenModeController; private final NextAlarmController mNextAlarmController; @@ -327,6 +367,7 @@ class QuickStatusBarHeaderController extends ViewController Date: Thu, 1 Oct 2020 12:25:45 -0400 Subject: [PATCH 6/6] 6/N Remove UserTracker from QSBarHeader Remove the UserTracker from the QuickStatusBarHeader. This removes the last view injection from QuickStatusBarHeader. Bug: 168904199 Test: atest SytemUITests Change-Id: I2f5bf971041b75642b292f7494f31f210e1cb724 --- .../systemui/qs/QuickStatusBarHeader.java | 27 +++++----------- .../qs/QuickStatusBarHeaderController.java | 32 ++++++++++++++----- .../util/InjectionInflationController.java | 5 --- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index 0cc53191a0c59..a9fbc744b38e3 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -17,10 +17,7 @@ package com.android.systemui.qs; import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS; import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; -import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT; - import android.annotation.ColorInt; -import android.app.AlarmManager; import android.app.AlarmManager.AlarmClockInfo; import android.content.Context; import android.content.res.ColorStateList; @@ -58,7 +55,6 @@ import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.DarkIconDispatcher.DarkReceiver; import com.android.systemui.privacy.OngoingPrivacyChip; import com.android.systemui.qs.QSDetail.Callback; -import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager; import com.android.systemui.statusbar.phone.StatusBarWindowView; import com.android.systemui.statusbar.policy.Clock; @@ -66,9 +62,6 @@ import com.android.systemui.statusbar.policy.Clock; import java.util.Locale; import java.util.Objects; -import javax.inject.Inject; -import javax.inject.Named; - /** * View that contains the top-most bits of the screen (primarily the status bar with date, time, and * battery) and also contains the {@link QuickQSPanel} along with some of the panel's inner @@ -103,7 +96,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn private OngoingPrivacyChip mPrivacyChip; private Space mSpace; private BatteryMeterView mBatteryRemainingIcon; - private UserTracker mUserTracker; // Used for RingerModeTracker private final LifecycleRegistry mLifecycle = new LifecycleRegistry(this); @@ -118,13 +110,10 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn private float mExpandedHeaderAlpha = 1.0f; private float mKeyguardExpansionFraction; - @Inject - public QuickStatusBarHeader(@Named(VIEW_CONTEXT) Context context, AttributeSet attrs, - UserTracker userTracker) { + public QuickStatusBarHeader(Context context, AttributeSet attrs) { super(context, attrs); mDualToneHandler = new DualToneHandler( new ContextThemeWrapper(context, R.style.QSHeaderTheme)); - mUserTracker = userTracker; } @Override @@ -182,9 +171,10 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn return mHeaderQsPanel; } - void updateStatusText(int ringerMode, AlarmClockInfo nextAlarm, boolean zenOverridingRinger) { + void updateStatusText(int ringerMode, AlarmClockInfo nextAlarm, boolean zenOverridingRinger, + boolean use24HourFormat) { boolean changed = updateRingerStatus(ringerMode, zenOverridingRinger) - || updateAlarmStatus(nextAlarm); + || updateAlarmStatus(nextAlarm, use24HourFormat); if (changed) { boolean alarmVisible = mNextAlarmTextView.getVisibility() == View.VISIBLE; @@ -218,14 +208,14 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn !Objects.equals(originalRingerText, mRingerModeTextView.getText()); } - private boolean updateAlarmStatus(AlarmClockInfo nextAlarm) { + private boolean updateAlarmStatus(AlarmClockInfo nextAlarm, boolean use24HourFormat) { boolean isOriginalVisible = mNextAlarmTextView.getVisibility() == View.VISIBLE; CharSequence originalAlarmText = mNextAlarmTextView.getText(); boolean alarmVisible = false; if (nextAlarm != null) { alarmVisible = true; - mNextAlarmTextView.setText(formatNextAlarm(nextAlarm)); + mNextAlarmTextView.setText(formatNextAlarm(nextAlarm, use24HourFormat)); } mNextAlarmIcon.setVisibility(alarmVisible ? View.VISIBLE : View.GONE); mNextAlarmTextView.setVisibility(alarmVisible ? View.VISIBLE : View.GONE); @@ -470,12 +460,11 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn mHeaderQsPanel.setCallback(qsPanelCallback); } - private String formatNextAlarm(AlarmManager.AlarmClockInfo info) { + private String formatNextAlarm(AlarmClockInfo info, boolean use24HourFormat) { if (info == null) { return ""; } - String skeleton = android.text.format.DateFormat - .is24HourFormat(mContext, mUserTracker.getUserId()) ? "EHm" : "Ehma"; + String skeleton = use24HourFormat ? "EHm" : "Ehma"; String pattern = android.text.format.DateFormat .getBestDateTimePattern(Locale.getDefault(), skeleton); return android.text.format.DateFormat.format(pattern, info.getTriggerTime()).toString(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java index 41bb9b490a0f0..676a300b0ff23 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java @@ -44,6 +44,7 @@ import com.android.systemui.privacy.PrivacyChipEvent; import com.android.systemui.privacy.PrivacyItem; import com.android.systemui.privacy.PrivacyItemController; import com.android.systemui.qs.carrier.QSCarrierGroupController; +import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.StatusIconContainer; @@ -83,6 +84,7 @@ class QuickStatusBarHeaderController extends ViewController { mRingerMode = ringer; - mView.updateStatusText(mRingerMode, mNextAlarm, isZenOverridingRinger()); + mView.updateStatusText(mRingerMode, mNextAlarm, isZenOverridingRinger(), + use24HourFormat()); }); mClockView.setOnClickListener(mOnClickListener); @@ -368,6 +381,7 @@ class QuickStatusBarHeaderController extends ViewController