Commit a9656e55 authored by Bo Liu's avatar Bo Liu Committed by Commit Bot

android: Use Context.getDisplay on R

Context.getDisplay is new on R and will throw an exception when the
Context is not associated with a display. Use this exception to detect
this case instead of trying to unwrap the context to find an Activity.

Bug: 1116000
Change-Id: Ib900205b8ce8aceb21a9f705431e040aef0e6ddb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2354291
Commit-Queue: Bo <boliu@chromium.org>
Reviewed-by: default avatarTheresa  <twellington@chromium.org>
Reviewed-by: default avatarAndrew Grieve <agrieve@chromium.org>
Cr-Commit-Position: refs/heads/master@{#797878}
parent cfb0cee9
......@@ -3577,6 +3577,7 @@ if (is_android) {
"android/java/src/org/chromium/base/compat/ApiHelperForOMR1.java",
"android/java/src/org/chromium/base/compat/ApiHelperForP.java",
"android/java/src/org/chromium/base/compat/ApiHelperForQ.java",
"android/java/src/org/chromium/base/compat/ApiHelperForR.java",
"android/java/src/org/chromium/base/library_loader/LegacyLinker.java",
"android/java/src/org/chromium/base/library_loader/LibraryLoader.java",
"android/java/src/org/chromium/base/library_loader/LibraryPrefetcher.java",
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.base.compat;
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.view.Display;
import org.chromium.base.annotations.VerifiesOnR;
/**
* Utility class to use new APIs that were added in Q (API level 29). These need to exist in a
* separate class so that Android framework can successfully verify classes without
* encountering the new APIs.
*/
@VerifiesOnR
@TargetApi(Build.VERSION_CODES.R)
public final class ApiHelperForR {
private ApiHelperForR() {}
public static Display getDisplay(Context context) throws UnsupportedOperationException {
return context.getDisplay();
}
}
......@@ -8,17 +8,18 @@ import android.annotation.SuppressLint;
import android.content.Context;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManager.DisplayListener;
import android.os.Build;
import android.util.SparseArray;
import android.view.Display;
import android.view.WindowManager;
import org.chromium.base.BuildInfo;
import org.chromium.base.ContextUtils;
import org.chromium.base.ThreadUtils;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.base.annotations.MainDex;
import org.chromium.base.annotations.NativeMethods;
import org.chromium.base.compat.ApiHelperForR;
/**
* DisplayAndroidManager is a class that informs its observers Display changes.
......@@ -97,9 +98,14 @@ public class DisplayAndroidManager {
}
public static Display getDefaultDisplayForContext(Context context) {
// TODO(boliu): There are other valid display context though they require R APIs to query.
// This is good enough for now since nothing in chromium calls Context.createDisplayContext.
if (BuildInfo.targetsAtLeastR() && ContextUtils.activityFromContext(context) == null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
Display display = null;
try {
display = ApiHelperForR.getDisplay(context);
} catch (UnsupportedOperationException e) {
// Context is not associated with a display.
}
if (display != null) return display;
return getGlobalDefaultDisplay();
}
return getDisplayForContextNoChecks(context);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment