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

Commit 4534f441 authored by Brad Stenning's avatar Brad Stenning
Browse files

Register the status bar CarFacetButtons with their controller when the system bars are reset

This also adds multi-display support for the "selected facet" functionality

Bug:120955348
Test: Manual
Change-Id: Ide123746a5f10731174ba1ac8e71b88e173298fc
(cherry picked from commit de167bd48b52d2cb138b6f0b0168dcb749a58068)
parent 9cbf23f1
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.content.Intent;
import android.content.res.TypedArray;
import android.os.UserHandle;
import android.util.AttributeSet;
import android.view.Display;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
@@ -203,4 +204,16 @@ public class CarFacetButton extends LinearLayout {
            mMoreIcon.setVisibility(showMoreIcon ? VISIBLE : GONE);
        }
    }

    /**
     * @return The id of the display the button is on or Display.INVALID_DISPLAY if it's not yet on
     *         a display.
     */
    public int getDisplayId() {
        Display display = getDisplay();
        if (display == null) {
            return Display.INVALID_DISPLAY;
        }
        return display.getDisplayId();
    }
}
+68 −36
Original line number Diff line number Diff line
@@ -22,10 +22,13 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.view.Display;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

@@ -40,15 +43,16 @@ import javax.inject.Singleton;
@Singleton
public class CarFacetButtonController {

    protected HashMap<String, CarFacetButton> mButtonsByCategory = new HashMap<>();
    protected HashMap<String, CarFacetButton> mButtonsByPackage = new HashMap<>();
    protected HashMap<String, CarFacetButton> mButtonsByComponentName = new HashMap<>();
    protected CarFacetButton mSelectedFacetButton;
    protected ButtonMap mButtonsByCategory = new ButtonMap();
    protected ButtonMap mButtonsByPackage = new ButtonMap();
    protected ButtonMap mButtonsByComponentName = new ButtonMap();
    protected HashSet<CarFacetButton> mSelectedFacetButtons;
    protected Context mContext;

    @Inject
    public CarFacetButtonController(Context context) {
        mContext = context;
        mSelectedFacetButtons = new HashSet<>();
    }

    /**
@@ -59,27 +63,40 @@ public class CarFacetButtonController {
    public void addFacetButton(CarFacetButton facetButton) {
        String[] categories = facetButton.getCategories();
        for (int i = 0; i < categories.length; i++) {
            mButtonsByCategory.put(categories[i], facetButton);
            mButtonsByCategory.add(categories[i], facetButton);
        }

        String[] facetPackages = facetButton.getFacetPackages();
        for (int i = 0; i < facetPackages.length; i++) {
            mButtonsByPackage.put(facetPackages[i], facetButton);
            mButtonsByPackage.add(facetPackages[i], facetButton);
        }
        String[] componentNames = facetButton.getComponentName();
        for (int i = 0; i < componentNames.length; i++) {
            mButtonsByComponentName.put(componentNames[i], facetButton);
            mButtonsByComponentName.add(componentNames[i], facetButton);
        }
        // Using the following as a default button for display id info it's not
        // attached to a screen at this point so it can't be extracted here.
        mSelectedFacetButton = facetButton;
    }

    public void removeAll() {
        mButtonsByCategory.clear();
        mButtonsByPackage.clear();
        mButtonsByComponentName.clear();
        mSelectedFacetButton = null;
        mSelectedFacetButtons.clear();
    }

    /**
     * Iterate through a view looking for CarFacetButtons and adding them to the controller if found
     *
     * @param v the View that may contain CarFacetButtons
     */
    public void addAllFacetButtons(View v) {
        if (v instanceof CarFacetButton) {
            addFacetButton((CarFacetButton) v);
        } else if (v instanceof ViewGroup) {
            ViewGroup viewGroup = (ViewGroup) v;
            for (int i = 0; i < viewGroup.getChildCount(); i++) {
                addAllFacetButtons(viewGroup.getChildAt(i));
            }
        }
    }

    /**
@@ -94,12 +111,10 @@ public class CarFacetButtonController {
     * @param stackInfoList of the currently running application
     */
    public void taskChanged(List<ActivityManager.StackInfo> stackInfoList) {
        int displayId = getDisplayId();
        ActivityManager.StackInfo validStackInfo = null;
        for (ActivityManager.StackInfo stackInfo :stackInfoList) {
            // If the display id is unknown or it matches the stack, it's valid for use
            if ((displayId == -1 || displayId == stackInfo.displayId)
                    && stackInfo.topActivity != null) {
            // Find the first stack info with a topActivity
            if (stackInfo.topActivity != null) {
                validStackInfo = stackInfo;
                break;
            }
@@ -110,12 +125,20 @@ public class CarFacetButtonController {
            return;
        }

        if (mSelectedFacetButton != null) {
            mSelectedFacetButton.setSelected(false);
        if (mSelectedFacetButtons != null) {
            Iterator<CarFacetButton> iterator = mSelectedFacetButtons.iterator();
            while(iterator.hasNext()) {
                CarFacetButton carFacetButton = iterator.next();
                if (carFacetButton.getDisplayId() == validStackInfo.displayId) {
                    carFacetButton.setSelected(false);
                    iterator.remove();
                }
            }
        }

        String packageName = validStackInfo.topActivity.getPackageName();
        CarFacetButton facetButton = findFacetButtongByComponentName(validStackInfo.topActivity);
        HashSet<CarFacetButton> facetButton =
                findFacetButtonByComponentName(validStackInfo.topActivity);
        if (facetButton == null) {
            facetButton = mButtonsByPackage.get(packageName);
        }
@@ -127,26 +150,21 @@ public class CarFacetButtonController {
            }
        }

        if (facetButton != null && facetButton.getVisibility() == View.VISIBLE) {
            facetButton.setSelected(true);
            mSelectedFacetButton = facetButton;
        if (facetButton != null) {
            for (CarFacetButton carFacetButton : facetButton) {
                if (carFacetButton.getDisplayId() == validStackInfo.displayId) {
                    carFacetButton.setSelected(true);
                    mSelectedFacetButtons.add(carFacetButton);
                }

    }

    private int getDisplayId() {
        if (mSelectedFacetButton != null) {
            Display display = mSelectedFacetButton.getDisplay();
            if (display != null) {
                return display.getDisplayId();
            }
        }
        return -1;

    }

    private CarFacetButton findFacetButtongByComponentName(ComponentName componentName) {
        CarFacetButton button = mButtonsByComponentName.get(componentName.flattenToShortString());
        return (button != null) ? button :
    private HashSet<CarFacetButton> findFacetButtonByComponentName(ComponentName componentName) {
        HashSet<CarFacetButton> buttons =
                mButtonsByComponentName.get(componentName.flattenToShortString());
        return (buttons != null) ? buttons :
                mButtonsByComponentName.get(componentName.flattenToString());
    }

@@ -168,4 +186,18 @@ public class CarFacetButtonController {
        }
        return null;
    }

    // simple multi-map
    private static class ButtonMap extends HashMap<String, HashSet<CarFacetButton>> {

        public boolean add(String key, CarFacetButton value) {
            if (containsKey(key)) {
                return get(key).add(value);
            }
            HashSet<CarFacetButton> set = new HashSet<>();
            set.add(value);
            put(key, set);
            return true;
        }
    }
}
+3 −1
Original line number Diff line number Diff line
@@ -187,11 +187,13 @@ public class CarStatusBar extends StatusBar implements
        if (mIsKeyguard) {
            updateNavBarForKeyguardContent();
        }
        // CarFacetButtonController was reset therefore we need to re-add the status bar elements
        // to the controller.
        mCarFacetButtonController.addAllFacetButtons(mStatusBarWindow);
    }

    private void addTemperatureViewToController(View v) {
        if (v instanceof TemperatureView) {
            Log.d(TAG, "addTemperatureViewToController: found ");
            mHvacController.addHvacTextView((TemperatureView) v);
        } else if (v instanceof ViewGroup) {
            ViewGroup viewGroup = (ViewGroup) v;