Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 937d9fa2 authored by Evan Laird's avatar Evan Laird
Browse files

Fix broken demo mode

Demo mode was relying on the CollapsedStatusBar's icon manager being the
first element of the IconGroup list, and this is no longer true. Also
demo mode used to be a regular LinearLayout but now needs to be a
StatusIconContainer because of notchiness

Fixes: 73897667
Test: enable demo mode; adb shell am broadcast -a "com.android.systemui.demo" -e command status -e alarm show
Change-Id: Ieb84ac2860082e339305160ac135ee5e78c23d7f
parent 62747fee
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue

    public static final String TAG = "CollapsedStatusBarFragment";
    private static final String EXTRA_PANEL_STATE = "panel_state";
    public static final String STATUS_BAR_ICON_MANAGER_TAG = "status_bar_icon_manager";
    public static final int FADE_IN_DURATION = 320;
    public static final int FADE_IN_DELAY = 50;
    private PhoneStatusBarView mStatusBar;
@@ -94,6 +95,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
            mStatusBar.go(savedInstanceState.getInt(EXTRA_PANEL_STATE));
        }
        mDarkIconManager = new DarkIconManager(view.findViewById(R.id.statusIcons));
        mDarkIconManager.setShouldLog(true);
        Dependency.get(StatusBarIconController.class).addIconGroup(mDarkIconManager);
        mSystemIconArea = mStatusBar.findViewById(R.id.system_icon_area);
        mClockView = mStatusBar.findViewById(R.id.clock);
+32 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.statusbar.phone;

import android.graphics.Rect;
import android.graphics.drawable.Icon;
import android.os.Bundle;
import android.os.UserHandle;
@@ -25,21 +26,27 @@ import android.view.ViewGroup;
import android.widget.LinearLayout;

import com.android.internal.statusbar.StatusBarIcon;
import com.android.settingslib.Utils;
import com.android.systemui.DemoMode;
import com.android.systemui.R;
import com.android.systemui.statusbar.StatusBarIconView;
import com.android.systemui.statusbar.policy.DarkIconDispatcher;
import com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver;
import com.android.systemui.statusbar.policy.LocationControllerImpl;
import com.android.systemui.util.leak.LeakDetector;

public class DemoStatusIcons extends LinearLayout implements DemoMode {
public class DemoStatusIcons extends StatusIconContainer implements DemoMode, DarkReceiver {
    private final LinearLayout mStatusIcons;
    private final int mIconSize;

    private boolean mDemoMode;
    private int mColor;

    public DemoStatusIcons(LinearLayout statusIcons, int iconSize) {
        super(statusIcons.getContext());
        mStatusIcons = statusIcons;
        mIconSize = iconSize;
        mColor = DarkIconDispatcher.DEFAULT_ICON_TINT;

        setLayoutParams(mStatusIcons.getLayoutParams());
        setOrientation(mStatusIcons.getOrientation());
@@ -48,6 +55,22 @@ public class DemoStatusIcons extends LinearLayout implements DemoMode {
        p.addView(this, p.indexOfChild(mStatusIcons));
    }

    public void remove() {
        ((ViewGroup) getParent()).removeView(this);
    }

    public void setColor(int color) {
        mColor = color;
        updateColors();
    }

    private void updateColors() {
        for (int i = 0; i < getChildCount(); i++) {
            StatusBarIconView child = (StatusBarIconView) getChildAt(i);
            child.setStaticDrawableColor(mColor);
        }
    }

    @Override
    public void dispatchDemoCommand(String command, Bundle args) {
        if (!mDemoMode && command.equals(COMMAND_ENTER)) {
@@ -136,6 +159,7 @@ public class DemoStatusIcons extends LinearLayout implements DemoMode {
                    break;
                } else {
                    StatusBarIcon icon = v.getStatusBarIcon();
                    icon.visible = true;
                    icon.icon = Icon.createWithResource(icon.icon.getResPackage(), iconId);
                    v.set(icon);
                    v.updateDrawable();
@@ -150,9 +174,16 @@ public class DemoStatusIcons extends LinearLayout implements DemoMode {
            return;
        }
        StatusBarIcon icon = new StatusBarIcon(iconPkg, UserHandle.SYSTEM, iconId, 0, 0, "Demo");
        icon.visible = true;
        StatusBarIconView v = new StatusBarIconView(getContext(), null, null);
        v.setTag(slot);
        v.set(icon);
        v.setStaticDrawableColor(mColor);
        addView(v, 0, new LinearLayout.LayoutParams(mIconSize, mIconSize));
    }

    @Override
    public void onDarkChanged(Rect area, float darkIntensity, int tint) {
        setColor(DarkIconDispatcher.getTint(area, mStatusIcons, tint));
    }
}
+72 −1
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ import static android.app.StatusBarManager.DISABLE2_SYSTEM_ICONS;
import static android.app.StatusBarManager.DISABLE_NONE;

import android.content.Context;
import android.os.Bundle;
import android.support.annotation.VisibleForTesting;
import android.text.TextUtils;
import android.util.ArraySet;
@@ -29,6 +30,7 @@ import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;

import com.android.internal.statusbar.StatusBarIcon;
import com.android.systemui.DemoMode;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.statusbar.StatusBarIconView;
@@ -109,6 +111,20 @@ public interface StatusBarIconController {
            super.onSetIcon(viewIndex, icon);
            mDarkIconDispatcher.applyDark((ImageView) mGroup.getChildAt(viewIndex));
        }

        @Override
        protected DemoStatusIcons createDemoStatusIcons() {
            DemoStatusIcons icons = super.createDemoStatusIcons();
            mDarkIconDispatcher.addDarkReceiver(icons);

            return icons;
        }

        @Override
        protected void exitDemoMode() {
            mDarkIconDispatcher.removeDarkReceiver(mDemoStatusIcons);
            super.exitDemoMode();
        }
    }

    public static class TintedIconManager extends IconManager {
@@ -134,15 +150,28 @@ public interface StatusBarIconController {
                }
            }
        }

        @Override
        protected DemoStatusIcons createDemoStatusIcons() {
            DemoStatusIcons icons = super.createDemoStatusIcons();
            icons.setColor(mColor);
            return icons;
        }
    }

    /**
     * Turns info from StatusBarIconController into ImageViews in a ViewGroup.
     */
    public static class IconManager {
    public static class IconManager implements DemoMode {
        protected final ViewGroup mGroup;
        protected final Context mContext;
        protected final int mIconSize;
        // Whether or not these icons show up in dumpsys
        protected boolean mShouldLog = false;

        // Enables SystemUI demo mode to take effect in this group
        protected boolean mDemoable = true;
        protected DemoStatusIcons mDemoStatusIcons;

        public IconManager(ViewGroup group) {
            mGroup = group;
@@ -159,6 +188,22 @@ public interface StatusBarIconController {
            }
        }

        public boolean isDemoable() {
            return mDemoable;
        }

        public void setIsDemoable(boolean demoable) {
            mDemoable = demoable;
        }

        public void setShouldLog(boolean should) {
            mShouldLog = should;
        }

        public boolean shouldLog() {
            return mShouldLog;
        }

        protected void onIconAdded(int index, String slot, boolean blocked,
                StatusBarIcon icon) {
            addIcon(index, slot, blocked, icon);
@@ -218,5 +263,31 @@ public interface StatusBarIconController {
            StatusBarIconView view = (StatusBarIconView) mGroup.getChildAt(viewIndex);
            view.set(icon);
        }

        @Override
        public void dispatchDemoCommand(String command, Bundle args) {
            if (!mDemoable) {
                return;
            }

            if (mDemoStatusIcons != null && command.equals(COMMAND_EXIT)) {
                mDemoStatusIcons.dispatchDemoCommand(command, args);
                exitDemoMode();
            } else {
                if (mDemoStatusIcons == null) {
                    mDemoStatusIcons = createDemoStatusIcons();
                }
                mDemoStatusIcons.dispatchDemoCommand(command, args);
            }
        }

        protected void exitDemoMode() {
            mDemoStatusIcons.remove();
            mDemoStatusIcons = null;
        }

        protected DemoStatusIcons createDemoStatusIcons() {
            return new DemoStatusIcons((LinearLayout) mGroup, mIconSize);
        }
    }
}
+20 −14
Original line number Diff line number Diff line
@@ -41,6 +41,8 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;

import static com.android.systemui.statusbar.phone.CollapsedStatusBarFragment.STATUS_BAR_ICON_MANAGER_TAG;

/**
 * Receives the callbacks from CommandQueue related to icons and tracks the state of
 * all the icons. Dispatches this state to any IconManagers that are currently
@@ -48,6 +50,7 @@ import java.util.ArrayList;
 */
public class StatusBarIconControllerImpl extends StatusBarIconList implements Tunable,
        ConfigurationListener, Dumpable, CommandQueue.Callbacks, StatusBarIconController {
    private static final String TAG = "StatusBarIconController";

    private final ArrayList<IconManager> mIconGroups = new ArrayList<>();
    private final ArraySet<String> mIconBlacklist = new ArraySet<>();
@@ -55,6 +58,7 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu

    private Context mContext;
    private DemoStatusIcons mDemoStatusIcons;
    private IconManager mStatusBarIconManager;

    public StatusBarIconControllerImpl(Context context) {
        super(context.getResources().getStringArray(
@@ -197,26 +201,28 @@ public class StatusBarIconControllerImpl extends StatusBarIconList implements Tu

    @Override
    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
        // TODO: Dump info about all icon groups?
        ViewGroup statusIcons = mIconGroups.get(0).mGroup;
        int N = statusIcons.getChildCount();
        pw.println(TAG + " state:");
        for (IconManager manager : mIconGroups) {
            if (manager.shouldLog()) {
                ViewGroup group = manager.mGroup;
                int N = group.getChildCount();
                pw.println("  icon views: " + N);
                for (int i = 0; i < N; i++) {
            StatusBarIconView ic = (StatusBarIconView) statusIcons.getChildAt(i);
                    StatusBarIconView ic = (StatusBarIconView) group.getChildAt(i);
                    pw.println("    [" + i + "] icon=" + ic);
                }
            }
        }

        super.dump(pw);
    }

    public void dispatchDemoCommand(String command, Bundle args) {
        if (mDemoStatusIcons == null) {
            // TODO: Rework how we handle demo mode.
            int iconSize = mContext.getResources().getDimensionPixelSize(
                    com.android.internal.R.dimen.status_bar_icon_size);
            mDemoStatusIcons = new DemoStatusIcons((LinearLayout) mIconGroups.get(0).mGroup,
                    iconSize);
        }
        mDemoStatusIcons.dispatchDemoCommand(command, args);
        for (IconManager manager : mIconGroups) {
            if (manager.isDemoable()) {
                manager.dispatchDemoCommand(command, args);
            }
        }
    }

    @Override
+1 −0
Original line number Diff line number Diff line
@@ -77,6 +77,7 @@ public class StatusBarIconList {
    }

    public void dump(PrintWriter pw) {
        pw.println("StatusBarIconList state:");
        final int N = mSlots.size();
        pw.println("  icon slots: " + N);
        for (int i=0; i<N; i++) {
Loading