diff options
3 files changed, 84 insertions, 37 deletions
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarFacetButton.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarFacetButton.java index 0a20eaa0b888..a371a1d8db01 100644 --- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarFacetButton.java +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarFacetButton.java @@ -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(); + } } diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java index 7811a1caeb88..d20038db9151 100644 --- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarFacetButtonController.java @@ -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) { + for (ActivityManager.StackInfo stackInfo :stackInfoList) { + // 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; - } - - } - - private int getDisplayId() { - if (mSelectedFacetButton != null) { - Display display = mSelectedFacetButton.getDisplay(); - if (display != null) { - return display.getDisplayId(); + if (facetButton != null) { + for (CarFacetButton carFacetButton : facetButton) { + if (carFacetButton.getDisplayId() == validStackInfo.displayId) { + carFacetButton.setSelected(true); + mSelectedFacetButtons.add(carFacetButton); + } } } - 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; + } + } } diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java index 9bcc1ab90e47..44e8874f8386 100644 --- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java @@ -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; |