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

Commit ee82a471 authored by Caitlin Shkuratov's avatar Caitlin Shkuratov
Browse files

[CS] 2/ Remove ongoing call flags; make controller a CoreStartable.

Fixes: 254512753
Fixes: 254512681
Fixes: 254512734
Test: start ongoing call then enter immersive mode in an app -> verify
status bar still displays
Test: start ongoing call, then enter immersive mode, then swipe up to
dismiss status bar -> verify status bar disappears
Test: smoke test of the ongoing call chip
Test: atest OngoingCallControllerTest

Change-Id: Id1a75d4c553b16937a1d8c7ede352ac1fb3f7b1b
parent 67e107ad
Loading
Loading
Loading
Loading
+0 −10
Original line number Diff line number Diff line
@@ -405,16 +405,6 @@ object Flags {
    val NEW_SHADE_CARRIER_GROUP_MOBILE_ICONS =
        unreleasedFlag("new_shade_carrier_group_mobile_icons", teamfood = true)

    // 700 - dialer/calls
    // TODO(b/254512734): Tracking Bug
    val ONGOING_CALL_STATUS_BAR_CHIP = releasedFlag("ongoing_call_status_bar_chip")

    // TODO(b/254512681): Tracking Bug
    val ONGOING_CALL_IN_IMMERSIVE = releasedFlag("ongoing_call_in_immersive")

    // TODO(b/254512753): Tracking Bug
    val ONGOING_CALL_IN_IMMERSIVE_CHIP_TAP = releasedFlag("ongoing_call_in_immersive_chip_tap")

    // 800 - general visual/theme
    @JvmField val MONET = resourceBooleanFlag(R.bool.flag_monet, "monet")

+0 −57
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package com.android.systemui.statusbar.dagger;

import android.app.IActivityManager;
import android.app.WallpaperManager;
import android.content.Context;
import android.hardware.display.DisplayManager;
@@ -38,7 +37,6 @@ import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
import com.android.systemui.media.controls.pipeline.MediaDataManager;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.power.domain.interactor.PowerInteractor;
import com.android.systemui.settings.DisplayTracker;
@@ -57,12 +55,10 @@ import com.android.systemui.statusbar.SmartReplyController;
import com.android.systemui.statusbar.StatusBarStateControllerImpl;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.commandline.CommandRegistry;
import com.android.systemui.statusbar.gesture.SwipeStatusBarAwayGestureHandler;
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
import com.android.systemui.statusbar.notification.RemoteInputControllerLogger;
import com.android.systemui.statusbar.notification.collection.NotifCollection;
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.phone.CentralSurfacesImpl;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
@@ -73,23 +69,15 @@ import com.android.systemui.statusbar.phone.StatusBarIconControllerImpl;
import com.android.systemui.statusbar.phone.StatusBarIconList;
import com.android.systemui.statusbar.phone.StatusBarNotificationPresenterModule;
import com.android.systemui.statusbar.phone.StatusBarRemoteInputCallback;
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallFlags;
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallLogger;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.RemoteInputUriController;
import com.android.systemui.statusbar.window.StatusBarWindowController;
import com.android.systemui.util.concurrency.DelayableExecutor;
import com.android.systemui.util.time.SystemClock;

import dagger.Binds;
import dagger.Lazy;
import dagger.Module;
import dagger.Provides;

import java.util.Optional;
import java.util.concurrent.Executor;

/**
 * This module provides instances needed to construct {@link CentralSurfacesImpl}. These are moved to
 * this separate from {@link CentralSurfacesModule} module so that components that wish to build
@@ -229,51 +217,6 @@ public interface CentralSurfacesDependenciesModule {
                        com.android.internal.R.array.config_statusBarIcons));
    }

    /**
     */
    @Provides
    @SysUISingleton
    static OngoingCallController provideOngoingCallController(
            Context context,
            CommonNotifCollection notifCollection,
            SystemClock systemClock,
            ActivityStarter activityStarter,
            @Main Executor mainExecutor,
            IActivityManager iActivityManager,
            OngoingCallLogger logger,
            DumpManager dumpManager,
            StatusBarWindowController statusBarWindowController,
            SwipeStatusBarAwayGestureHandler swipeStatusBarAwayGestureHandler,
            StatusBarStateController statusBarStateController,
            OngoingCallFlags ongoingCallFlags) {

        boolean ongoingCallInImmersiveEnabled = ongoingCallFlags.isInImmersiveEnabled();
        Optional<StatusBarWindowController> windowController =
                ongoingCallInImmersiveEnabled
                        ? Optional.of(statusBarWindowController)
                        : Optional.empty();
        Optional<SwipeStatusBarAwayGestureHandler> gestureHandler =
                ongoingCallInImmersiveEnabled
                        ? Optional.of(swipeStatusBarAwayGestureHandler)
                        : Optional.empty();
        OngoingCallController ongoingCallController =
                new OngoingCallController(
                        context,
                        notifCollection,
                        ongoingCallFlags,
                        systemClock,
                        activityStarter,
                        mainExecutor,
                        iActivityManager,
                        logger,
                        dumpManager,
                        windowController,
                        gestureHandler,
                        statusBarStateController);
        ongoingCallController.init();
        return ongoingCallController;
    }

    /**
     * {@link NotificationPanelViewController} implements two interfaces:
     *  - {@link com.android.systemui.shade.ShadeViewController}, which can be used by any class
+6 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.statusbar.dagger
import com.android.systemui.CoreStartable
import com.android.systemui.statusbar.data.repository.StatusBarModeRepository
import com.android.systemui.statusbar.data.repository.StatusBarModeRepositoryImpl
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController
import dagger.Binds
import dagger.Module
import dagger.multibindings.ClassKey
@@ -43,4 +44,9 @@ abstract class StatusBarModule {
    @IntoMap
    @ClassKey(StatusBarModeRepositoryImpl::class)
    abstract fun bindStatusBarModeRepositoryStart(impl: StatusBarModeRepositoryImpl): CoreStartable

    @Binds
    @IntoMap
    @ClassKey(OngoingCallController::class)
    abstract fun bindOngoingCallController(impl: OngoingCallController): CoreStartable
}
+29 −42
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import android.util.Log
import android.view.View
import androidx.annotation.VisibleForTesting
import com.android.internal.jank.InteractionJankMonitor
import com.android.systemui.CoreStartable
import com.android.systemui.Dumpable
import com.android.systemui.R
import com.android.systemui.animation.ActivityLaunchAnimator
@@ -43,7 +44,6 @@ import com.android.systemui.statusbar.policy.CallbackController
import com.android.systemui.statusbar.window.StatusBarWindowController
import com.android.systemui.util.time.SystemClock
import java.io.PrintWriter
import java.util.Optional
import java.util.concurrent.Executor
import javax.inject.Inject

@@ -54,17 +54,16 @@ import javax.inject.Inject
class OngoingCallController @Inject constructor(
    private val context: Context,
    private val notifCollection: CommonNotifCollection,
    private val ongoingCallFlags: OngoingCallFlags,
    private val systemClock: SystemClock,
    private val activityStarter: ActivityStarter,
    @Main private val mainExecutor: Executor,
    private val iActivityManager: IActivityManager,
    private val logger: OngoingCallLogger,
    private val dumpManager: DumpManager,
    private val statusBarWindowController: Optional<StatusBarWindowController>,
    private val swipeStatusBarAwayGestureHandler: Optional<SwipeStatusBarAwayGestureHandler>,
    private val statusBarWindowController: StatusBarWindowController,
    private val swipeStatusBarAwayGestureHandler: SwipeStatusBarAwayGestureHandler,
    private val statusBarStateController: StatusBarStateController
) : CallbackController<OngoingCallListener>, Dumpable {
) : CallbackController<OngoingCallListener>, Dumpable, CoreStartable {
    private var isFullscreen: Boolean = false
    /** Non-null if there's an active call notification. */
    private var callNotificationInfo: CallNotificationInfo? = null
@@ -120,13 +119,11 @@ class OngoingCallController @Inject constructor(
        }
    }

    fun init() {
    override fun start() {
        dumpManager.registerDumpable(this)
        if (ongoingCallFlags.isStatusBarChipEnabled()) {
        notifCollection.addCollectionListener(notifListener)
        statusBarStateController.addCallback(statusBarStateListener)
    }
    }

    /**
     * Sets the chip view that will contain ongoing call information.
@@ -138,7 +135,7 @@ class OngoingCallController @Inject constructor(
        this.chipView = chipView
        val backgroundView: OngoingCallBackgroundContainer? =
            chipView.findViewById(R.id.ongoing_call_chip_background)
        backgroundView?.maxHeightFetcher = { statusBarWindowController.get().statusBarHeight }
        backgroundView?.maxHeightFetcher = { statusBarWindowController.statusBarHeight }
        if (hasOngoingCall()) {
            updateChip()
        }
@@ -197,9 +194,7 @@ class OngoingCallController @Inject constructor(

            uidObserver.registerWithUid(currentCallNotificationInfo.uid)
            if (!currentCallNotificationInfo.statusBarSwipedAway) {
                statusBarWindowController.ifPresent {
                    it.setOngoingProcessRequiresStatusBarVisible(true)
                }
                statusBarWindowController.setOngoingProcessRequiresStatusBarVisible(true)
            }
            updateGestureListening()
            mListeners.forEach { l -> l.onOngoingCallStateChanged(animate = true) }
@@ -217,9 +212,6 @@ class OngoingCallController @Inject constructor(

    private fun updateChipClickListener() {
        if (callNotificationInfo == null) { return }
        if (isFullscreen && !ongoingCallFlags.isInImmersiveChipTapEnabled()) {
            chipView?.setOnClickListener(null)
        } else {
        val currentChipView = chipView
        val backgroundView =
            currentChipView?.findViewById<View>(R.id.ongoing_call_chip_background)
@@ -236,7 +228,6 @@ class OngoingCallController @Inject constructor(
            }
        }
    }
    }

    /** Returns true if the given [procState] represents a process that's visible to the user. */
    private fun isProcessVisibleToUser(procState: Int): Boolean {
@@ -247,10 +238,10 @@ class OngoingCallController @Inject constructor(
        if (callNotificationInfo == null ||
            callNotificationInfo?.statusBarSwipedAway == true ||
            !isFullscreen) {
            swipeStatusBarAwayGestureHandler.ifPresent { it.removeOnGestureDetectedCallback(TAG) }
            swipeStatusBarAwayGestureHandler.removeOnGestureDetectedCallback(TAG)
        } else {
            swipeStatusBarAwayGestureHandler.ifPresent {
                it.addOnGestureDetectedCallback(TAG) { _ -> onSwipeAwayGestureDetected() }
            swipeStatusBarAwayGestureHandler.addOnGestureDetectedCallback(TAG) { _ ->
                onSwipeAwayGestureDetected()
            }
        }
    }
@@ -258,8 +249,8 @@ class OngoingCallController @Inject constructor(
    private fun removeChip() {
        callNotificationInfo = null
        tearDownChipView()
        statusBarWindowController.ifPresent { it.setOngoingProcessRequiresStatusBarVisible(false) }
        swipeStatusBarAwayGestureHandler.ifPresent { it.removeOnGestureDetectedCallback(TAG) }
        statusBarWindowController.setOngoingProcessRequiresStatusBarVisible(false)
        swipeStatusBarAwayGestureHandler.removeOnGestureDetectedCallback(TAG)
        mListeners.forEach { l -> l.onOngoingCallStateChanged(animate = true) }
        uidObserver.unregister()
    }
@@ -283,12 +274,8 @@ class OngoingCallController @Inject constructor(
    private fun onSwipeAwayGestureDetected() {
        if (DEBUG) { Log.d(TAG, "Swipe away gesture detected") }
        callNotificationInfo = callNotificationInfo?.copy(statusBarSwipedAway = true)
        statusBarWindowController.ifPresent {
            it.setOngoingProcessRequiresStatusBarVisible(false)
        }
        swipeStatusBarAwayGestureHandler.ifPresent {
            it.removeOnGestureDetectedCallback(TAG)
        }
        statusBarWindowController.setOngoingProcessRequiresStatusBarVisible(false)
        swipeStatusBarAwayGestureHandler.removeOnGestureDetectedCallback(TAG)
    }

    private val statusBarStateListener = object : StatusBarStateController.StateListener {
+0 −35
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 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.statusbar.phone.ongoingcall

import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.Flags
import javax.inject.Inject

@SysUISingleton
class OngoingCallFlags @Inject constructor(private val featureFlags: FeatureFlags) {

    fun isStatusBarChipEnabled(): Boolean =
            featureFlags.isEnabled(Flags.ONGOING_CALL_STATUS_BAR_CHIP)

    fun isInImmersiveEnabled(): Boolean = isStatusBarChipEnabled()
            && featureFlags.isEnabled(Flags.ONGOING_CALL_IN_IMMERSIVE)

    fun isInImmersiveChipTapEnabled(): Boolean = isInImmersiveEnabled()
            && featureFlags.isEnabled(Flags.ONGOING_CALL_IN_IMMERSIVE_CHIP_TAP)
}
 No newline at end of file
Loading