| /* |
| * Copyright (C) 2010 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 android.cts.util; |
| |
| import android.content.Context; |
| import android.content.pm.PackageManager; |
| |
| /** |
| * Utilities to enable the android.webkit.* CTS tests (and others that rely on a functioning |
| * android.webkit.WebView implementation) to determine whether a functioning WebView is present |
| * on the device or not. |
| * |
| * Test cases that require android.webkit.* classes should wrap their first usage of WebView in a |
| * try catch block, and pass any exception that is thrown to |
| * NullWebViewUtils.determineIfWebViewAvailable. The return value of |
| * NullWebViewUtils.isWebViewAvailable will then determine if the test should expect to be able to |
| * use a WebView. |
| */ |
| public class NullWebViewUtils { |
| |
| private static boolean sWebViewUnavailable; |
| |
| /** |
| * @param context Current Activity context, used to query the PackageManager. |
| * @param t An exception thrown by trying to invoke android.webkit.* APIs. |
| */ |
| public static void determineIfWebViewAvailable(Context context, Throwable t) { |
| sWebViewUnavailable = !hasWebViewFeature(context) && checkCauseWasUnsupportedOperation(t); |
| } |
| |
| /** |
| * After calling determineIfWebViewAvailable, this returns whether a WebView is available on the |
| * device and wheter the test can rely on it. |
| * @return True iff. PackageManager determined that there is no WebView on the device and the |
| * exception thrown from android.webkit.* was UnsupportedOperationException. |
| */ |
| public static boolean isWebViewAvailable() { |
| return !sWebViewUnavailable; |
| } |
| |
| private static boolean hasWebViewFeature(Context context) { |
| // Query the system property that determins if there is a functional WebView on the device. |
| PackageManager pm = context.getPackageManager(); |
| return pm.hasSystemFeature(PackageManager.FEATURE_WEBVIEW); |
| } |
| |
| private static boolean checkCauseWasUnsupportedOperation(Throwable t) { |
| if (t == null) return false; |
| while (t.getCause() != null) { |
| t = t.getCause(); |
| } |
| return t instanceof UnsupportedOperationException; |
| } |
| |
| /** |
| * Some CTS tests (by design) first use android.webkit.* from a background thread. This helper |
| * allows the test to catch the UnsupportedOperationException from that background thread, and |
| * then query the result from the test main thread. |
| */ |
| public static class NullWebViewFromThreadExceptionHandler |
| implements Thread.UncaughtExceptionHandler { |
| private Throwable mPendingException; |
| |
| @Override |
| public void uncaughtException(Thread t, Throwable e) { |
| mPendingException = e; |
| } |
| |
| public boolean isWebViewAvailable(Context context) { |
| return hasWebViewFeature(context) || |
| !checkCauseWasUnsupportedOperation(mPendingException); |
| } |
| } |
| } |