| Index: ui/android/java/src/org/chromium/ui/widget/Toast.java
|
| diff --git a/ui/android/java/src/org/chromium/ui/widget/Toast.java b/ui/android/java/src/org/chromium/ui/widget/Toast.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..735104d639da33938dea48828042a14c93b98bcf
|
| --- /dev/null
|
| +++ b/ui/android/java/src/org/chromium/ui/widget/Toast.java
|
| @@ -0,0 +1,185 @@
|
| +// Copyright 2015 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.ui.widget;
|
| +
|
| +import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
|
| +
|
| +import android.annotation.SuppressLint;
|
| +import android.app.Activity;
|
| +import android.content.Context;
|
| +import android.content.ContextWrapper;
|
| +import android.content.pm.ActivityInfo;
|
| +import android.content.pm.ApplicationInfo;
|
| +import android.content.pm.PackageManager;
|
| +import android.content.res.Resources;
|
| +import android.os.Build;
|
| +import android.view.View;
|
| +import android.view.ViewGroup;
|
| +import android.widget.FrameLayout;
|
| +
|
| +import org.chromium.base.SysUtils;
|
| +
|
| +/**
|
| + * Toast wrapper, makes sure toasts don't trigger HW acceleration when created
|
| + * from activities that are not HW accelerated.
|
| + *
|
| + * Can (and should) also be used for Chromium-related additions and extensions.
|
| + */
|
| +public class Toast {
|
| +
|
| + public static final int LENGTH_SHORT = android.widget.Toast.LENGTH_SHORT;
|
| + public static final int LENGTH_LONG = android.widget.Toast.LENGTH_LONG;
|
| +
|
| + private android.widget.Toast mToast;
|
| + private ViewGroup mSWLayout;
|
| +
|
| + public Toast(Context context) {
|
| + this(context, new android.widget.Toast(context));
|
| + }
|
| +
|
| + private Toast(Context context, android.widget.Toast toast) {
|
| + mToast = toast;
|
| +
|
| + if (SysUtils.isLowEndDevice()
|
| + && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP
|
| + && context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.LOLLIPOP
|
| + && isHWAccelerationDisabled(context)) {
|
| + // Don't HW accelerate Toasts. Unfortunately the only way to do it is to make
|
| + // toast.getView().getContext().getApplicationInfo().targetSdkVersion return
|
| + // something less than LOLLIPOP (see WindowManagerGlobal.addView).
|
| + mSWLayout = new FrameLayout(new ContextWrapper(context) {
|
| + @Override
|
| + public ApplicationInfo getApplicationInfo() {
|
| + ApplicationInfo info = new ApplicationInfo(super.getApplicationInfo());
|
| + info.targetSdkVersion = Build.VERSION_CODES.KITKAT;
|
| + return info;
|
| + }
|
| + });
|
| +
|
| + setView(toast.getView());
|
| + }
|
| + }
|
| +
|
| + public android.widget.Toast getAndroidToast() {
|
| + return mToast;
|
| + }
|
| +
|
| + public void show() {
|
| + mToast.show();
|
| + }
|
| +
|
| + public void cancel() {
|
| + mToast.cancel();
|
| + }
|
| +
|
| + public void setView(View view) {
|
| + if (mSWLayout != null) {
|
| + mSWLayout.removeAllViews();
|
| + if (view != null) {
|
| + mSWLayout.addView(view, WRAP_CONTENT, WRAP_CONTENT);
|
| + mToast.setView(mSWLayout);
|
| + } else {
|
| + // When null view is set we propagate it to the toast to trigger appropriate
|
| + // handling (for example show() throws an exception when view is null).
|
| + mToast.setView(null);
|
| + }
|
| + } else {
|
| + mToast.setView(view);
|
| + }
|
| + }
|
| +
|
| + public View getView() {
|
| + if (mToast.getView() == null) {
|
| + return null;
|
| + }
|
| + if (mSWLayout != null) {
|
| + return mSWLayout.getChildAt(0);
|
| + } else {
|
| + return mToast.getView();
|
| + }
|
| + }
|
| +
|
| + public void setDuration(int duration) {
|
| + mToast.setDuration(duration);
|
| + }
|
| +
|
| + public int getDuration() {
|
| + return mToast.getDuration();
|
| + }
|
| +
|
| + public void setMargin(float horizontalMargin, float verticalMargin) {
|
| + mToast.setMargin(horizontalMargin, verticalMargin);
|
| + }
|
| +
|
| + public float getHorizontalMargin() {
|
| + return mToast.getHorizontalMargin();
|
| + }
|
| +
|
| + public float getVerticalMargin() {
|
| + return mToast.getVerticalMargin();
|
| + }
|
| +
|
| + public void setGravity(int gravity, int xOffset, int yOffset) {
|
| + mToast.setGravity(gravity, xOffset, yOffset);
|
| + }
|
| +
|
| + public int getGravity() {
|
| + return mToast.getGravity();
|
| + }
|
| +
|
| + public int getXOffset() {
|
| + return mToast.getXOffset();
|
| + }
|
| +
|
| + public int getYOffset() {
|
| + return mToast.getYOffset();
|
| + }
|
| +
|
| + public void setText(int resId) {
|
| + mToast.setText(resId);
|
| + }
|
| +
|
| + public void setText(CharSequence s) {
|
| + mToast.setText(s);
|
| + }
|
| +
|
| + @SuppressLint("ShowToast")
|
| + public static Toast makeText(Context context, CharSequence text, int duration) {
|
| + return new Toast(context, android.widget.Toast.makeText(context, text, duration));
|
| + }
|
| +
|
| + @SuppressLint("ShowToast")
|
| + public static Toast makeText(Context context, int resId, int duration)
|
| + throws Resources.NotFoundException {
|
| + return new Toast(context, android.widget.Toast.makeText(context, resId, duration));
|
| + }
|
| +
|
| + private static Activity getActivity(Context context) {
|
| + while (context != null) {
|
| + if (context instanceof Activity) {
|
| + return (Activity) context;
|
| + }
|
| + if (!(context instanceof ContextWrapper)) {
|
| + break;
|
| + }
|
| + context = ((ContextWrapper) context).getBaseContext();
|
| + }
|
| + return null;
|
| + }
|
| +
|
| + private static boolean isHWAccelerationDisabled(Context context) {
|
| + Activity activity = getActivity(context);
|
| + if (activity == null) {
|
| + return false;
|
| + }
|
| + try {
|
| + ActivityInfo info = activity.getPackageManager().getActivityInfo(
|
| + activity.getComponentName(), 0);
|
| + return (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) == 0;
|
| + } catch (PackageManager.NameNotFoundException e) {
|
| + return false;
|
| + }
|
| + }
|
| +}
|
|
|