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

Commit 89da99e2 authored by Xin Li's avatar Xin Li
Browse files

Merge 25Q1 (ab/BP1A.250305.020) to AOSP main

Bug: 385190204
Merged-In: I85132679579a43aa856eb00dac2ab46503bff76f
Change-Id: Ie8d1ef12ecf0fb80111ea79d8d7a33e72466c0be
parents 2de3ce48 6011b640
Loading
Loading
Loading
Loading

.gitignore

0 → 100644
+1 −0
Original line number Diff line number Diff line
/weathereffects/graphics/build/
+25 −1
Original line number Diff line number Diff line
@@ -66,6 +66,30 @@ flag {
flag {
    name: "new_customization_picker_ui"
    namespace: "systemui"
    description: "Enables the BC25 design of the customization picker UI."
    description: "Enables the new design of the customization picker UI."
    bug: "339081035"
}

flag {
    name: "ambient_aod"
    namespace: "systemui"
    description: "Enables ambient wallpaper and AOD enhancements"
    bug: "372655702"
}

flag {
    name: "enable_launcher_icon_shapes"
    namespace: "systemui"
    description: "Enables launcher icon shapes customization"
    bug: "348708061"
}

flag {
    name: "smartspace_sports_card_background"
    namespace: "systemui"
    description: "Enables Smartspace sports card background protection and related ui updates"
    bug: "380285747"
    metadata {
         purpose: PURPOSE_BUGFIX
    }
}
+19 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?><!--
  ~ Copyright (C) 2024 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.
  -->
<resources>
    <!-- Animations -->
    <item type="id" name="ongoing_animation"/>
</resources>
+42 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 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.app.animation

import android.animation.Animator
import android.view.View

/** A static class for general animation-related utilities. */
class Animations {
    companion object {
        /** Stores a [view]'s ongoing [animation] so it can be cancelled if needed. */
        @JvmStatic
        fun setOngoingAnimation(view: View, animation: Animator?) {
            cancelOngoingAnimation(view)
            view.setTag(R.id.ongoing_animation, animation)
        }

        /**
         * Cancels the ongoing animation affecting a [view], if any was previously stored using
         * [setOngoingAnimation].
         */
        @JvmStatic
        fun cancelOngoingAnimation(view: View) {
            (view.getTag(R.id.ongoing_animation) as? Animator)?.cancel()
            view.setTag(R.id.ongoing_animation, null)
        }
    }
}
+77 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 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.app.animation

import android.animation.ValueAnimator
import android.content.Context
import android.view.View
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import androidx.test.platform.app.InstrumentationRegistry
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.runner.RunWith

@SmallTest
@RunWith(AndroidJUnit4::class)
class AnimationsTest {
    companion object {
        const val TEST_DURATION = 1000L
    }

    private val context: Context = InstrumentationRegistry.getInstrumentation().context

    @Test
    fun ongoingAnimationsAreStoredAndCancelledCorrectly() {
        val view = View(context)

        val oldAnimation = FakeAnimator()
        Animations.setOngoingAnimation(view, oldAnimation)
        oldAnimation.start()
        assertEquals(oldAnimation, view.getTag(R.id.ongoing_animation))
        assertTrue(oldAnimation.started)

        val newAnimation = FakeAnimator()
        Animations.setOngoingAnimation(view, newAnimation)
        newAnimation.start()
        assertEquals(newAnimation, view.getTag(R.id.ongoing_animation))
        assertTrue(oldAnimation.cancelled)
        assertTrue(newAnimation.started)

        Animations.cancelOngoingAnimation(view)
        assertNull(view.getTag(R.id.ongoing_animation))
        assertTrue(newAnimation.cancelled)
    }
}

/** Test animator for tracking start and cancel signals. */
private class FakeAnimator : ValueAnimator() {
    var started = false
    var cancelled = false

    override fun start() {
        started = true
        cancelled = false
    }

    override fun cancel() {
        started = false
        cancelled = true
    }
}
Loading