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

Commit e33e44a6 authored by William Leshner's avatar William Leshner Committed by Android (Google) Code Review
Browse files

Merge "Provide a way to add items to dream status bar." into tm-qpr-dev

parents 5f7ead34 28b2a909
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -34,11 +34,21 @@
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent" />

    <LinearLayout
        android:id="@+id/dream_overlay_extra_items"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:gravity="center_vertical"
        android:layout_marginEnd="@dimen/dream_overlay_status_bar_extra_margin"
        app:layout_constraintEnd_toStartOf="@+id/dream_overlay_system_status" />

    <LinearLayout
        android:id="@+id/dream_overlay_system_status"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:layout_marginStart="@dimen/dream_overlay_status_bar_extra_margin"
        app:layout_constraintEnd_toEndOf="parent">

        <com.android.systemui.statusbar.AlphaOptimizedImageView
+1 −0
Original line number Diff line number Diff line
@@ -1455,6 +1455,7 @@
    <dimen name="dream_overlay_camera_mic_off_indicator_size">8dp</dimen>
    <dimen name="dream_overlay_notification_indicator_size">6dp</dimen>
    <dimen name="dream_overlay_grey_chip_width">56dp</dimen>
    <dimen name="dream_overlay_status_bar_extra_margin">16dp</dimen>

    <!-- Dream overlay complications related dimensions -->
    <dimen name="dream_overlay_complication_clock_time_text_size">100sp</dimen>
+117 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.dreams;

import android.view.View;

import androidx.annotation.NonNull;

import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.statusbar.policy.CallbackController;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.Executor;

import javax.inject.Inject;

/**
 * {@link DreamOverlayStatusBarItemsProvider} provides extra dream overlay status bar items. A
 * callback can be registered that will be informed of items being added or removed from the
 * provider.
 */
@SysUISingleton
public class DreamOverlayStatusBarItemsProvider implements
        CallbackController<DreamOverlayStatusBarItemsProvider.Callback> {
    /**
     * Represents one item in the dream overlay status bar.
     */
    public interface StatusBarItem {
        /**
         * Return the {@link View} associated with this item.
         */
        View getView();
    }

    /**
     * A callback to be registered with the provider to be informed of when the list of status bar
     * items has changed.
     */
    public interface Callback {
        /**
         * Inform the callback that status bar items have changed.
         */
        void onStatusBarItemsChanged(List<StatusBarItem> newItems);
    }

    private final Executor mExecutor;
    private final List<StatusBarItem> mItems = new ArrayList<>();
    private final List<Callback> mCallbacks = new ArrayList<>();

    @Inject
    public DreamOverlayStatusBarItemsProvider(@Main Executor executor) {
        mExecutor = executor;
    }

    @Override
    public void addCallback(@NonNull Callback callback) {
        mExecutor.execute(() -> {
            Objects.requireNonNull(callback, "Callback must not be null.");
            if (mCallbacks.contains(callback)) {
                return;
            }

            mCallbacks.add(callback);
            if (!mItems.isEmpty()) {
                callback.onStatusBarItemsChanged(mItems);
            }
        });
    }

    @Override
    public void removeCallback(@NonNull Callback callback) {
        mExecutor.execute(() -> {
            Objects.requireNonNull(callback, "Callback must not be null.");
            mCallbacks.remove(callback);
        });
    }

    /**
     * Adds an item to the dream overlay status bar.
     */
    public void addStatusBarItem(StatusBarItem item) {
        mExecutor.execute(() -> {
            if (!mItems.contains(item)) {
                mItems.add(item);
                mCallbacks.forEach(callback -> callback.onStatusBarItemsChanged(mItems));
            }
        });
    }

    /**
     * Removes an item from the dream overlay status bar.
     */
    public void removeStatusBarItem(StatusBarItem item) {
        mExecutor.execute(() -> {
            if (mItems.remove(item)) {
                mCallbacks.forEach(callback -> callback.onStatusBarItemsChanged(mItems));
            }
        });
    }
}
+10 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.annotation.Nullable;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

import androidx.constraintlayout.widget.ConstraintLayout;

@@ -29,6 +30,7 @@ import com.android.systemui.R;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;

@@ -58,6 +60,7 @@ public class DreamOverlayStatusBarView extends ConstraintLayout {
    public static final int STATUS_ICON_PRIORITY_MODE_ON = 6;

    private final Map<Integer, View> mStatusIcons = new HashMap<>();
    private ViewGroup mSystemStatusViewGroup;

    public DreamOverlayStatusBarView(Context context) {
        this(context, null);
@@ -94,6 +97,8 @@ public class DreamOverlayStatusBarView extends ConstraintLayout {
                fetchStatusIconForResId(R.id.dream_overlay_notification_indicator));
        mStatusIcons.put(STATUS_ICON_PRIORITY_MODE_ON,
                fetchStatusIconForResId(R.id.dream_overlay_priority_mode));

        mSystemStatusViewGroup = findViewById(R.id.dream_overlay_extra_items);
    }

    void showIcon(@StatusIconType int iconType, boolean show, @Nullable String contentDescription) {
@@ -107,6 +112,11 @@ public class DreamOverlayStatusBarView extends ConstraintLayout {
        icon.setVisibility(show ? View.VISIBLE : View.GONE);
    }

    void setExtraStatusBarItemViews(List<View> views) {
        mSystemStatusViewGroup.removeAllViews();
        views.forEach(view -> mSystemStatusViewGroup.addView(view));
    }

    private View fetchStatusIconForResId(int resId) {
        final View statusIcon = findViewById(resId);
        return Objects.requireNonNull(statusIcon);
+28 −1
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import android.view.View;

import com.android.systemui.R;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dreams.DreamOverlayStatusBarItemsProvider.StatusBarItem;
import com.android.systemui.dreams.dagger.DreamOverlayComponent;
import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController;
import com.android.systemui.statusbar.policy.NextAlarmController;
@@ -47,10 +48,13 @@ import com.android.systemui.touch.TouchInsetManager;
import com.android.systemui.util.ViewController;
import com.android.systemui.util.time.DateFormatUtil;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.Executor;
import java.util.stream.Collectors;

import javax.inject.Inject;

@@ -69,7 +73,10 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
    private final Optional<DreamOverlayNotificationCountProvider>
            mDreamOverlayNotificationCountProvider;
    private final ZenModeController mZenModeController;
    private final DreamOverlayStatusBarItemsProvider mStatusBarItemsProvider;
    private final Executor mMainExecutor;
    private final List<DreamOverlayStatusBarItemsProvider.StatusBarItem> mExtraStatusBarItems =
            new ArrayList<>();

    private boolean mIsAttached;

@@ -116,6 +123,9 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
                            ? buildNotificationsContentDescription(notificationCount)
                            : null);

    private final DreamOverlayStatusBarItemsProvider.Callback mStatusBarItemsProviderCallback =
            this::onStatusBarItemsChanged;

    @Inject
    public DreamOverlayStatusBarViewController(
            DreamOverlayStatusBarView view,
@@ -129,7 +139,8 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
            IndividualSensorPrivacyController sensorPrivacyController,
            Optional<DreamOverlayNotificationCountProvider> dreamOverlayNotificationCountProvider,
            ZenModeController zenModeController,
            StatusBarWindowStateController statusBarWindowStateController) {
            StatusBarWindowStateController statusBarWindowStateController,
            DreamOverlayStatusBarItemsProvider statusBarItemsProvider) {
        super(view);
        mResources = resources;
        mMainExecutor = mainExecutor;
@@ -140,6 +151,7 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
        mDateFormatUtil = dateFormatUtil;
        mSensorPrivacyController = sensorPrivacyController;
        mDreamOverlayNotificationCountProvider = dreamOverlayNotificationCountProvider;
        mStatusBarItemsProvider = statusBarItemsProvider;
        mZenModeController = zenModeController;

        // Register to receive show/hide updates for the system status bar. Our custom status bar
@@ -166,6 +178,8 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
        mDreamOverlayNotificationCountProvider.ifPresent(
                provider -> provider.addCallback(mNotificationCountCallback));

        mStatusBarItemsProvider.addCallback(mStatusBarItemsProviderCallback);

        mTouchInsetSession.addViewToTracking(mView);
    }

@@ -177,6 +191,7 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
        mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
        mDreamOverlayNotificationCountProvider.ifPresent(
                provider -> provider.removeCallback(mNotificationCountCallback));
        mStatusBarItemsProvider.removeCallback(mStatusBarItemsProviderCallback);
        mTouchInsetSession.clear();

        mIsAttached = false;
@@ -271,4 +286,16 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
            }
        });
    }

    private void onStatusBarItemsChanged(List<StatusBarItem> newItems) {
        mMainExecutor.execute(() -> {
            mExtraStatusBarItems.clear();
            mExtraStatusBarItems.addAll(newItems);
            mView.setExtraStatusBarItemViews(
                    newItems
                            .stream()
                            .map(StatusBarItem::getView)
                            .collect(Collectors.toList()));
        });
    }
}
Loading