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

Commit a56351c7 authored by Nick Chameyev's avatar Nick Chameyev Committed by Automerger Merge Worker
Browse files

Merge "Extract unfold classes to a separate library" into tm-qpr-dev am: 3676e7af

parents 780a4225 3676e7af
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ android_library {
    ],
    static_libs: [
        "PluginCoreLib",
        "SystemUIUnfoldLib",
        "androidx.dynamicanimation_dynamicanimation",
        "androidx.concurrent_concurrent-futures",
        "dagger2",
+0 −49
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.unfold.config

import android.content.Context
import android.os.SystemProperties

internal class ResourceUnfoldTransitionConfig(private val context: Context) :
    UnfoldTransitionConfig {

    override val isEnabled: Boolean
        get() = readIsEnabledResource() && isPropertyEnabled

    override val isHingeAngleEnabled: Boolean
        get() = readIsHingeAngleEnabled()

    private val isPropertyEnabled: Boolean
        get() =
            SystemProperties.getInt(
                UNFOLD_TRANSITION_MODE_PROPERTY_NAME, UNFOLD_TRANSITION_PROPERTY_ENABLED) ==
                UNFOLD_TRANSITION_PROPERTY_ENABLED

    private fun readIsEnabledResource(): Boolean =
        context.resources.getBoolean(com.android.internal.R.bool.config_unfoldTransitionEnabled)

    private fun readIsHingeAngleEnabled(): Boolean =
        context.resources.getBoolean(com.android.internal.R.bool.config_unfoldTransitionHingeAngle)
}

/**
 * Temporary persistent property to control unfold transition mode.
 *
 * See [com.android.unfold.config.AnimationMode].
 */
private const val UNFOLD_TRANSITION_MODE_PROPERTY_NAME = "persist.unfold.transition_enabled"
private const val UNFOLD_TRANSITION_PROPERTY_ENABLED = 1
+35 −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.unfold.system

import android.app.ActivityManager
import android.app.WindowConfiguration
import com.android.systemui.unfold.util.CurrentActivityTypeProvider
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class ActivityManagerActivityTypeProvider @Inject constructor(
    private val activityManager: ActivityManager
) : CurrentActivityTypeProvider {

    override val isHomeActivity: Boolean?
        get() {
            val activityType = activityManager.getRunningTasks(/* maxNum= */ 1)
                    ?.getOrNull(0)?.topActivityType ?: return null

            return activityType == WindowConfiguration.ACTIVITY_TYPE_HOME
        }
}
+51 −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.unfold.system

import android.content.Context
import android.hardware.devicestate.DeviceStateManager
import com.android.systemui.unfold.updates.FoldProvider
import com.android.systemui.unfold.updates.FoldProvider.FoldCallback
import java.util.concurrent.Executor
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class DeviceStateManagerFoldProvider @Inject constructor(
    private val deviceStateManager: DeviceStateManager,
    private val context: Context
) : FoldProvider {

    private val callbacks: MutableMap<FoldCallback,
            DeviceStateManager.DeviceStateCallback> = hashMapOf()

    override fun registerCallback(callback: FoldCallback, executor: Executor) {
        val listener = FoldStateListener(context, callback)
        deviceStateManager.registerCallback(executor, listener)
        callbacks[callback] = listener
    }

    override fun unregisterCallback(callback: FoldCallback) {
        val listener = callbacks.remove(callback)
        listener?.let {
            deviceStateManager.unregisterCallback(it)
        }
    }

    private inner class FoldStateListener(
        context: Context,
        listener: FoldCallback
    ) : DeviceStateManager.FoldStateListener(context, { listener.onFoldUpdated(it) })
}
+61 −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.unfold.system

import android.os.Handler
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dagger.qualifiers.UiBackground
import com.android.systemui.unfold.config.ResourceUnfoldTransitionConfig
import com.android.systemui.unfold.config.UnfoldTransitionConfig
import com.android.systemui.unfold.dagger.UnfoldBackground
import com.android.systemui.unfold.dagger.UnfoldMain
import com.android.systemui.unfold.updates.FoldProvider
import com.android.systemui.unfold.util.CurrentActivityTypeProvider
import dagger.Binds
import dagger.Module
import java.util.concurrent.Executor

/**
 * Dagger module with system-only dependencies for the unfold animation.
 * The code that is used to calculate unfold transition progress
 * depends on some hidden APIs that are not available in normal
 * apps. In order to re-use this code and use alternative implementations
 * of these classes in other apps and hidden APIs here.
 */
@Module
abstract class SystemUnfoldSharedModule {

    @Binds
    abstract fun activityTypeProvider(executor: ActivityManagerActivityTypeProvider):
            CurrentActivityTypeProvider

    @Binds
    abstract fun config(config: ResourceUnfoldTransitionConfig): UnfoldTransitionConfig

    @Binds
    abstract fun foldState(provider: DeviceStateManagerFoldProvider): FoldProvider

    @Binds
    @UnfoldMain
    abstract fun mainExecutor(@Main executor: Executor): Executor

    @Binds
    @UnfoldMain
    abstract fun mainHandler(@Main handler: Handler): Handler

    @Binds
    @UnfoldBackground
    abstract fun backgroundExecutor(@UiBackground executor: Executor): Executor
}
Loading