Merge "Handle density changes in QS" into nyc-dev

This commit is contained in:
Jason Monk
2016-03-01 19:26:55 +00:00
committed by Android (Google) Code Review
19 changed files with 193 additions and 71 deletions

View File

@@ -39,8 +39,9 @@
android:clipToPadding="false"
android:clipChildren="false">
<include
layout="@layout/qs_panel"
<com.android.systemui.DensityContainer
android:id="@+id/qs_density_container"
android:layout="@layout/qs_panel"
android:layout_width="@dimen/notification_panel_width"
android:layout_height="wrap_content"
android:layout_gravity="@integer/notification_panel_layout_gravity" />

View File

@@ -93,5 +93,9 @@
<attr name="defValue" format="boolean" />
<attr name="metricsAction" format="integer" />
</declare-styleable>
<declare-styleable name="DensityContainer">
<attr name="android:layout" />
</declare-styleable>
</resources>

View File

@@ -0,0 +1,78 @@
/*
* Copyright (C) 2016 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.
*/
package com.android.systemui;
import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import java.util.ArrayList;
import java.util.List;
public class DensityContainer extends FrameLayout {
private final List<InflateListener> mInflateListeners = new ArrayList<>();
private final int mLayout;
private int mDensity;
public DensityContainer(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
mDensity = context.getResources().getConfiguration().densityDpi;
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DensityContainer);
if (!a.hasValue(R.styleable.DensityContainer_android_layout)) {
throw new IllegalArgumentException("DensityContainer must contain a layout");
}
mLayout = a.getResourceId(R.styleable.DensityContainer_android_layout, 0);
inflateLayout();
}
@Override
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
int density = newConfig.densityDpi;
if (density != mDensity) {
mDensity = density;
inflateLayout();
}
}
private void inflateLayout() {
removeAllViews();
LayoutInflater.from(getContext()).inflate(mLayout, this);
final int N = mInflateListeners.size();
for (int i = 0; i < N; i++) {
mInflateListeners.get(i).onInflated(getChildAt(0));
}
}
public void addInflateListener(InflateListener listener) {
mInflateListeners.add(listener);
listener.onInflated(getChildAt(0));
}
public interface InflateListener {
/**
* Called whenever a new view is inflated.
*/
void onInflated(View v);
}
}

View File

@@ -31,6 +31,7 @@ import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.systemui.R;
import com.android.systemui.qs.QSTile.DetailAdapter;
import com.android.systemui.qs.QSTile.Host.Callback;
import com.android.systemui.qs.customize.QSCustomizer;
import com.android.systemui.qs.external.CustomTile;
import com.android.systemui.settings.BrightnessController;
@@ -44,7 +45,7 @@ import java.util.ArrayList;
import java.util.Collection;
/** View that represents the quick settings tile panel. **/
public class QSPanel extends LinearLayout implements Tunable {
public class QSPanel extends LinearLayout implements Tunable, Callback {
public static final String QS_SHOW_BRIGHTNESS = "qs_show_brightness";
@@ -123,9 +124,15 @@ public class QSPanel extends LinearLayout implements Tunable {
@Override
protected void onDetachedFromWindow() {
TunerService.get(mContext).removeTunable(this);
mHost.removeCallback(this);
super.onDetachedFromWindow();
}
@Override
public void onTilesChanged() {
setTiles(mHost.getTiles());
}
@Override
public void onTuningChanged(String key, String newValue) {
if (QS_SHOW_BRIGHTNESS.equals(key)) {
@@ -168,6 +175,8 @@ public class QSPanel extends LinearLayout implements Tunable {
public void setHost(QSTileHost host) {
mHost = host;
mHost.addCallback(this);
setTiles(mHost.getTiles());
mFooter.setHost(host);
createCustomizePanel();
}

View File

@@ -390,6 +390,7 @@ public abstract class QSTile<TState extends State> implements Listenable {
Context getContext();
Collection<QSTile<?>> getTiles();
void addCallback(Callback callback);
void removeCallback(Callback callback);
BluetoothController getBluetoothController();
LocationController getLocationController();
RotationLockController getRotationLockController();

View File

@@ -227,6 +227,8 @@ public class SignalClusterView
protected void onDetachedFromWindow() {
mMobileSignalGroup.removeAllViews();
TunerService.get(mContext).removeTunable(this);
mSC.removeCallback(this);
mNC.removeSignalCallback(this);
super.onDetachedFromWindow();
}

View File

@@ -19,7 +19,6 @@ package com.android.systemui.statusbar.phone;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.RelativeLayout;
import com.android.systemui.qs.QSPanel;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.NetworkControllerImpl;

View File

@@ -42,6 +42,8 @@ import android.widget.TextView;
import com.android.internal.logging.MetricsLogger;
import com.android.keyguard.KeyguardStatusView;
import com.android.systemui.DejankUtils;
import com.android.systemui.DensityContainer;
import com.android.systemui.DensityContainer.InflateListener;
import com.android.systemui.EventLogConstants;
import com.android.systemui.EventLogTags;
import com.android.systemui.Interpolators;
@@ -215,8 +217,14 @@ public class NotificationPanelView extends PanelView implements
super.onFinishInflate();
mKeyguardStatusBar = (KeyguardStatusBarView) findViewById(R.id.keyguard_header);
mKeyguardStatusView = (KeyguardStatusView) findViewById(R.id.keyguard_status_view);
mQsContainer = (QSContainer) findViewById(R.id.quick_settings_container);
mQsContainer.getHeader().setOnClickListener(this);
DensityContainer container = (DensityContainer) findViewById(R.id.qs_density_container);
container.addInflateListener(new InflateListener() {
@Override
public void onInflated(View v) {
mQsContainer = (QSContainer) v.findViewById(R.id.quick_settings_container);
mQsContainer.getHeader().setOnClickListener(NotificationPanelView.this);
}
});
mClockView = (TextView) findViewById(R.id.clock_view);
mNotificationContainerParent = (NotificationsQuickSettingsContainer)
findViewById(R.id.notification_container_parent);

View File

@@ -47,7 +47,7 @@ public class NotificationsQuickSettingsContainer extends FrameLayout
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mQsContainer = findViewById(R.id.quick_settings_container);
mQsContainer = findViewById(R.id.qs_density_container);
mStackScroller = findViewById(R.id.notification_stack_scroller);
mKeyguardStatusBar = findViewById(R.id.keyguard_header);
ViewStub userSwitcher = (ViewStub) findViewById(R.id.keyguard_user_switcher);

View File

@@ -23,7 +23,6 @@ import android.annotation.NonNull;
import android.app.ActivityManager;
import android.app.ActivityManagerNative;
import android.app.IActivityManager;
import android.app.IWallpaperManagerCallback;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.StatusBarManager;
@@ -104,6 +103,8 @@ import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.BatteryMeterView;
import com.android.systemui.DemoMode;
import com.android.systemui.DensityContainer;
import com.android.systemui.DensityContainer.InflateListener;
import com.android.systemui.EventLogConstants;
import com.android.systemui.EventLogTags;
import com.android.systemui.Interpolators;
@@ -778,8 +779,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
mStatusBarView.setScrimController(mScrimController);
mDozeScrimController = new DozeScrimController(mScrimController, context);
mHeader = (BaseStatusBarHeader) mStatusBarWindow.findViewById(R.id.header);
mHeader.setActivityStarter(this);
mKeyguardStatusBar = (KeyguardStatusBarView) mStatusBarWindow.findViewById(R.id.keyguard_header);
mKeyguardStatusView = mStatusBarWindow.findViewById(R.id.keyguard_status_view);
mKeyguardBottomArea =
@@ -839,12 +838,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
initSignalCluster(mStatusBarView);
initSignalCluster(mKeyguardStatusBar);
initSignalCluster(mHeader);
final boolean isAPhone = mNetworkController.hasVoiceCallingFeature();
if (isAPhone) {
mNetworkController.addEmergencyListener(mHeader);
}
mFlashlightController = new FlashlightController(mContext);
mKeyguardBottomArea.setFlashlightController(mFlashlightController);
@@ -863,39 +856,40 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
}
// Set up the quick settings tile panel
mQSPanel = (QSPanel) mStatusBarWindow.findViewById(R.id.quick_settings_panel);
if (mQSPanel != null) {
DensityContainer container = (DensityContainer) mStatusBarWindow.findViewById(
R.id.qs_density_container);
if (container != null) {
final QSTileHost qsh = new QSTileHost(mContext, this,
mBluetoothController, mLocationController, mRotationLockController,
mNetworkController, mZenModeController, mHotspotController,
mCastController, mFlashlightController,
mUserSwitcherController, mUserInfoController, mKeyguardMonitor,
mSecurityController, mBatteryController, mIconController);
mQSPanel.setTiles(qsh.getTiles());
mSecurityController, mBatteryController, mIconController,
mNextAlarmController);
mBrightnessMirrorController = new BrightnessMirrorController(mStatusBarWindow);
mQSPanel.setBrightnessMirror(mBrightnessMirrorController);
QSContainer qsContainer = (QSContainer) mStatusBarWindow.findViewById(
R.id.quick_settings_container);
qsContainer.setHost(qsh);
qsh.addCallback(new QSTileHost.Callback() {
container.addInflateListener(new InflateListener() {
@Override
public void onTilesChanged() {
mQSPanel.setTiles(qsh.getTiles());
public void onInflated(View v) {
QSContainer qsContainer = (QSContainer) v.findViewById(
R.id.quick_settings_container);
qsContainer.setHost(qsh);
mQSPanel = qsContainer.getQsPanel();
mQSPanel.setBrightnessMirror(mBrightnessMirrorController);
mHeader = qsContainer.getHeader();
initSignalCluster(mHeader);
mHeader.setActivityStarter(PhoneStatusBar.this);
}
});
}
// User info. Trigger first load.
mHeader.setUserInfoController(mUserInfoController);
mKeyguardStatusBar.setUserInfoController(mUserInfoController);
mKeyguardStatusBar.setUserSwitcherController(mUserSwitcherController);
mUserInfoController.reloadUserInfo();
mHeader.setBatteryController(mBatteryController);
((BatteryMeterView) mStatusBarView.findViewById(R.id.battery)).setBatteryController(
mBatteryController);
mKeyguardStatusBar.setBatteryController(mBatteryController);
mHeader.setNextAlarmController(mNextAlarmController);
PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
mBroadcastReceiver.onReceive(mContext,

View File

@@ -57,6 +57,7 @@ import com.android.systemui.qs.tiles.WorkModeTile;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.BluetoothController;
import com.android.systemui.statusbar.policy.CastController;
import com.android.systemui.statusbar.policy.NextAlarmController;
import com.android.systemui.statusbar.policy.NightModeController;
import com.android.systemui.statusbar.policy.FlashlightController;
import com.android.systemui.statusbar.policy.HotspotController;
@@ -111,16 +112,18 @@ public final class QSTileHost implements QSTile.Host, Tunable {
private final NightModeController mNightModeController;
private final AutoTileManager mAutoTiles;
private final ManagedProfileController mProfileController;
private final NextAlarmController mNextAlarmController;
private View mHeader;
public QSTileHost(Context context, PhoneStatusBar statusBar,
BluetoothController bluetooth, LocationController location,
RotationLockController rotation, NetworkController network,
ZenModeController zen, HotspotController hotspot,
CastController cast, FlashlightController flashlight,
UserSwitcherController userSwitcher, UserInfoController userInfo,
KeyguardMonitor keyguard, SecurityController security,
BatteryController battery, StatusBarIconController iconController) {
BluetoothController bluetooth, LocationController location,
RotationLockController rotation, NetworkController network,
ZenModeController zen, HotspotController hotspot,
CastController cast, FlashlightController flashlight,
UserSwitcherController userSwitcher, UserInfoController userInfo,
KeyguardMonitor keyguard, SecurityController security,
BatteryController battery, StatusBarIconController iconController,
NextAlarmController nextAlarmController) {
mContext = context;
mStatusBar = statusBar;
mBluetooth = bluetooth;
@@ -137,6 +140,7 @@ public final class QSTileHost implements QSTile.Host, Tunable {
mSecurity = security;
mBattery = battery;
mIconController = iconController;
mNextAlarmController = nextAlarmController;
mNightModeController = new NightModeController(mContext, true);
mProfileController = new ManagedProfileController(this);
@@ -152,6 +156,10 @@ public final class QSTileHost implements QSTile.Host, Tunable {
mAutoTiles = new AutoTileManager(context, this);
}
public NextAlarmController getNextAlarmController() {
return mNextAlarmController;
}
public void setHeaderView(View view) {
mHeader = view;
}
@@ -170,6 +178,11 @@ public final class QSTileHost implements QSTile.Host, Tunable {
mCallbacks.add(callback);
}
@Override
public void removeCallback(Callback callback) {
mCallbacks.remove(callback);
}
@Override
public Collection<QSTile<?>> getTiles() {
return mTiles.values();

View File

@@ -35,13 +35,13 @@ import com.android.systemui.FontSizeUtils;
import com.android.systemui.R;
import com.android.systemui.qs.QSAnimator;
import com.android.systemui.qs.QSPanel;
import com.android.systemui.qs.QSTile;
import com.android.systemui.qs.QuickQSPanel;
import com.android.systemui.qs.TouchAnimator;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.NextAlarmController;
import com.android.systemui.statusbar.policy.NextAlarmController.NextAlarmChangeCallback;
import com.android.systemui.statusbar.policy.UserInfoController;
import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener;
import com.android.systemui.tuner.TunerService;
public class QuickStatusBarHeader extends BaseStatusBarHeader implements
@@ -90,6 +90,7 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements
private TouchAnimator mAlarmTranslation;
private TouchAnimator mSettingsAlpha;
private float mExpansionAmount;
private QSTileHost mHost;
public QuickStatusBarHeader(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -222,6 +223,14 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements
mExpandIndicator.setExpanded(headerExpansionFraction > EXPAND_INDICATOR_THRESHOLD);
}
@Override
protected void onDetachedFromWindow() {
setListening(false);
mHost.getUserInfoController().remListener(mUserListener);
mHost.getNetworkController().removeEmergencyListener(this);
super.onDetachedFromWindow();
}
private void updateAlarmVisibilities() {
mAlarmStatus.setVisibility(mAlarmShowing ? View.VISIBLE : View.INVISIBLE);
mAlarmStatusCollapsed.setVisibility(mAlarmShowing ? View.VISIBLE : View.INVISIBLE);
@@ -284,17 +293,19 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements
}
public void setupHost(final QSTileHost host) {
mHost = host;
host.setHeaderView(this);
mHeaderQsPanel.setQSPanelAndHeader(mQsPanel, this);
mHeaderQsPanel.setHost(host);
mHeaderQsPanel.setMaxTiles(5);
mHeaderQsPanel.setTiles(host.getTiles());
host.addCallback(new QSTile.Host.Callback() {
@Override
public void onTilesChanged() {
mHeaderQsPanel.setTiles(host.getTiles());
}
});
mHeaderQsPanel.setHost(host);
setUserInfoController(host.getUserInfoController());
setBatteryController(host.getBatteryController());
setNextAlarmController(host.getNextAlarmController());
final boolean isAPhone = mHost.getNetworkController().hasVoiceCallingFeature();
if (isAPhone) {
mHost.getNetworkController().addEmergencyListener(this);
}
}
@Override
@@ -340,12 +351,7 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements
@Override
public void setUserInfoController(UserInfoController userInfoController) {
userInfoController.addListener(new UserInfoController.OnUserInfoChangedListener() {
@Override
public void onUserInfoChanged(String name, Drawable picture) {
mMultiUserAvatar.setImageDrawable(picture);
}
});
userInfoController.addListener(mUserListener);
}
@Override
@@ -358,4 +364,11 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements
}
}
}
private final OnUserInfoChangedListener mUserListener = new OnUserInfoChangedListener() {
@Override
public void onUserInfoChanged(String name, Drawable picture) {
mMultiUserAvatar.setImageDrawable(picture);
}
};
}

View File

@@ -39,7 +39,6 @@ import android.widget.RelativeLayout;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;
import com.android.keyguard.KeyguardStatusView;
import com.android.systemui.BatteryMeterView;
import com.android.systemui.FontSizeUtils;
@@ -48,7 +47,7 @@ import com.android.systemui.qs.QSPanel;
import com.android.systemui.qs.QSTile;
import com.android.systemui.qs.QSTile.DetailAdapter;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.NetworkControllerImpl.EmergencyListener;
import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener;
import com.android.systemui.statusbar.policy.NextAlarmController;
import com.android.systemui.statusbar.policy.UserInfoController;
import com.android.systemui.tuner.TunerService;

View File

@@ -19,11 +19,10 @@ import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.telephony.SubscriptionInfo;
import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;
import com.android.systemui.statusbar.policy.NetworkControllerImpl.EmergencyListener;
import java.util.ArrayList;
import java.util.List;

View File

@@ -19,7 +19,6 @@ package com.android.systemui.statusbar.policy;
import android.content.Context;
import android.content.Intent;
import android.telephony.SubscriptionInfo;
import com.android.settingslib.net.DataUsageController;
import com.android.settingslib.wifi.AccessPoint;
@@ -36,6 +35,11 @@ public interface NetworkController {
DataUsageController getMobileDataController();
DataSaverController getDataSaverController();
boolean hasVoiceCallingFeature();
void addEmergencyListener(EmergencyListener listener);
void removeEmergencyListener(EmergencyListener listener);
public interface SignalCallback {
void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon,
boolean activityIn, boolean activityOut, String description);
@@ -53,6 +57,10 @@ public interface NetworkController {
void setMobileDataEnabled(boolean enabled);
}
public interface EmergencyListener {
void setEmergencyCallsOnly(boolean emergencyOnly);
}
public static class IconState {
public final boolean visible;
public final int icon;

View File

@@ -252,6 +252,10 @@ public class NetworkControllerImpl extends BroadcastReceiver
mCallbackHandler.setEmergencyCallsOnly(isEmergencyOnly());
}
public void removeEmergencyListener(EmergencyListener listener) {
mCallbackHandler.setListening(listener, false);
}
public boolean hasMobileDataFeature() {
return mHasMobileDataFeature;
}
@@ -812,10 +816,6 @@ public class NetworkControllerImpl extends BroadcastReceiver
}
};
public interface EmergencyListener {
void setEmergencyCallsOnly(boolean emergencyOnly);
}
public static class SubscriptionDefaults {
public int getDefaultVoiceSubId() {
return SubscriptionManager.getDefaultVoiceSubscriptionId();

View File

@@ -14,17 +14,13 @@
package com.android.systemui.statusbar.policy;
import libcore.util.Objects;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.opengl.Matrix;
import android.provider.Settings;
import android.provider.Settings.Secure;
import android.util.MathUtils;
import com.android.systemui.tuner.TunerService;
import java.util.ArrayList;
@@ -189,8 +185,8 @@ public class NightModeController implements TunerService.Tunable {
}
private void updateNightMode(Intent intent) {
mIsNight = intent.getBooleanExtra(EXTRA_IS_NIGHT, false);
mAmount = intent.getFloatExtra(EXTRA_AMOUNT, 0);
mIsNight = intent != null && intent.getBooleanExtra(EXTRA_IS_NIGHT, false);
mAmount = intent != null ? intent.getFloatExtra(EXTRA_AMOUNT, 0) : 0;
}
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {

View File

@@ -43,7 +43,7 @@ public class TileServicesTests extends SysuiTestCase {
QSTileHost host = new QSTileHost(mContext, null, null, null, null,
networkController, null,
Mockito.mock(HotspotController.class), null,
null, null, null, null, null, null, null);
null, null, null, null, null, null, null, null);
mTileService = new TestTileServices(host, Looper.myLooper());
}

View File

@@ -19,12 +19,10 @@ import android.os.HandlerThread;
import android.telephony.SubscriptionInfo;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import com.android.systemui.R;
import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;
import com.android.systemui.statusbar.policy.NetworkControllerImpl.EmergencyListener;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.Mockito;