diff options
author | 2025-03-24 11:10:42 -0700 | |
---|---|---|
committer | 2025-03-24 11:10:42 -0700 | |
commit | 69998a8c779a20f0d00c0338be3eb7cad943021b (patch) | |
tree | af9ff4e1dc193b016a05de29107114f7d27db3ac /src | |
parent | e0a018785efb805a35e1bd8cedea622b57ae2f63 (diff) | |
parent | 836a832bfe4de06ab5ebec4fe3aaa8f44392bbd4 (diff) |
Merge "Using Choreographer for getting refreshrate instead of display manager" into main
Diffstat (limited to 'src')
3 files changed, 71 insertions, 92 deletions
diff --git a/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java b/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java index f86772e5f5..c95c376290 100644 --- a/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java +++ b/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java @@ -91,6 +91,7 @@ public interface LauncherBaseAppComponent { LoaderCursorFactory getLoaderCursorFactory(); WidgetHolderFactory getWidgetHolderFactory(); + RefreshRateTracker getFrameRateProvider(); /** Builder for LauncherBaseAppComponent. */ interface Builder { diff --git a/src/com/android/launcher3/util/window/RefreshRateTracker.java b/src/com/android/launcher3/util/window/RefreshRateTracker.java deleted file mode 100644 index e3397d4359..0000000000 --- a/src/com/android/launcher3/util/window/RefreshRateTracker.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * 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.launcher3.util.window; - -import static android.view.Display.DEFAULT_DISPLAY; - -import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; - -import android.content.Context; -import android.hardware.display.DisplayManager; -import android.hardware.display.DisplayManager.DisplayListener; -import android.view.Display; - -import androidx.annotation.WorkerThread; - -import com.android.launcher3.dagger.ApplicationContext; -import com.android.launcher3.dagger.LauncherAppComponent; -import com.android.launcher3.dagger.LauncherAppSingleton; -import com.android.launcher3.util.DaggerSingletonObject; -import com.android.launcher3.util.DaggerSingletonTracker; -import com.android.launcher3.util.SafeCloseable; - -import javax.inject.Inject; - -/** - * Utility class to track refresh rate of the current device - */ -@LauncherAppSingleton -public class RefreshRateTracker implements DisplayListener, SafeCloseable { - - private static final DaggerSingletonObject<RefreshRateTracker> INSTANCE = - new DaggerSingletonObject<>(LauncherAppComponent::getRefreshRateTracker); - - private int mSingleFrameMs = 1; - - private final DisplayManager mDM; - - @Inject - RefreshRateTracker(@ApplicationContext Context context, DaggerSingletonTracker tracker) { - mDM = context.getSystemService(DisplayManager.class); - updateSingleFrameMs(); - mDM.registerDisplayListener(this, UI_HELPER_EXECUTOR.getHandler()); - tracker.addCloseable(this); - } - - /** - * Returns the single frame time in ms - */ - public static int getSingleFrameMs(Context context) { - return INSTANCE.get(context).mSingleFrameMs; - } - - @Override - public final void onDisplayAdded(int displayId) { } - - @Override - public final void onDisplayRemoved(int displayId) { } - - @WorkerThread - @Override - public final void onDisplayChanged(int displayId) { - if (displayId == DEFAULT_DISPLAY) { - updateSingleFrameMs(); - } - } - - private void updateSingleFrameMs() { - Display display = mDM.getDisplay(DEFAULT_DISPLAY); - if (display != null) { - float refreshRate = display.getRefreshRate(); - mSingleFrameMs = refreshRate > 0 ? (int) (1000 / refreshRate) : 16; - } - } - - @Override - public void close() { - mDM.unregisterDisplayListener(this); - } -} diff --git a/src/com/android/launcher3/util/window/RefreshRateTracker.kt b/src/com/android/launcher3/util/window/RefreshRateTracker.kt new file mode 100644 index 0000000000..577fec1136 --- /dev/null +++ b/src/com/android/launcher3/util/window/RefreshRateTracker.kt @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2025 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.launcher3.util.window + +import android.content.Context +import android.hardware.display.DisplayManager +import android.hardware.display.DisplayManager.DisplayListener +import android.view.Display.DEFAULT_DISPLAY +import com.android.launcher3.dagger.ApplicationContext +import com.android.launcher3.dagger.LauncherAppSingleton +import com.android.launcher3.dagger.LauncherComponentProvider.appComponent +import com.android.launcher3.util.DaggerSingletonTracker +import com.android.launcher3.util.Executors +import javax.inject.Inject + +/** Utility class to track refresh rate of the current device */ +interface RefreshRateTracker { + + val singleFrameMs: Int + + @LauncherAppSingleton + class RefreshRateTrackerImpl + @Inject + constructor(@ApplicationContext ctx: Context, tracker: DaggerSingletonTracker) : + RefreshRateTracker, DisplayListener { + + private val displayManager: DisplayManager = + ctx.getSystemService(DisplayManager::class.java)!!.also { + it.registerDisplayListener(this, Executors.UI_HELPER_EXECUTOR.handler) + tracker.addCloseable { it.unregisterDisplayListener(this) } + } + + override var singleFrameMs: Int = updateSingleFrameMs() + + private fun updateSingleFrameMs(): Int { + val refreshRate = displayManager.getDisplay(DEFAULT_DISPLAY)?.refreshRate + return if (refreshRate != null && refreshRate > 0) (1000 / refreshRate).toInt() else 16 + } + + override fun onDisplayChanged(displayId: Int) { + if (displayId == DEFAULT_DISPLAY) { + singleFrameMs = updateSingleFrameMs() + } + } + + override fun onDisplayAdded(displayId: Int) {} + + override fun onDisplayRemoved(displayId: Int) {} + } + + companion object { + + /** Returns the single frame time in ms */ + @JvmStatic fun Context.getSingleFrameMs() = appComponent.frameRateProvider.singleFrameMs + } +} |