1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 package org.chromium.webview_shell;
6 
7 import android.app.Activity;
8 import android.os.Bundle;
9 import android.view.View;
10 import android.view.View.OnClickListener;
11 import android.view.WindowManager;
12 import android.webkit.WebView;
13 import android.widget.CheckBox;
14 import android.widget.CompoundButton;
15 import android.widget.SeekBar;
16 import android.widget.SeekBar.OnSeekBarChangeListener;
17 
18 /**
19  * Activity to exercise transform animations on WebView.
20  */
21 public class WebViewAnimationTestActivity extends Activity {
22     private static final String HTML = "<html>"
23             + "  <head>"
24             + "    <style type =\"text/css\">"
25             + "      .container {"
26             + "            display: grid;"
27             + "            grid-template-columns: 100px 100px 100px 100px 100px;"
28             + "            grid-template-rows: 100px 100px 100px 100px 100px;"
29             + "      }"
30             + "     .alt1 {"
31             + "       background-color: #aaffaa;"
32             + "     }"
33             + "     .alt2 {"
34             + "       background-color: #ff4545;"
35             + "     }"
36             + "    </style>"
37             + "  </head>"
38             + "  <body>"
39             + "   <div class=\"container\">"
40             + "     <div class=\"alt1\">00</div>"
41             + "     <div class=\"alt2\">01</div>"
42             + "     <div class=\"alt1\">02</div>"
43             + "     <div class=\"alt2\">03</div>"
44             + "     <div class=\"alt1\">04</div>"
45             + "     <div class=\"alt2\">05</div>"
46             + "     <div class=\"alt1\">06</div>"
47             + "     <div class=\"alt2\">07</div>"
48             + "     <div class=\"alt1\">08</div>"
49             + "     <div class=\"alt2\">09</div>"
50             + "     <div class=\"alt1\">10</div>"
51             + "     <div class=\"alt2\">11</div>"
52             + "     <div class=\"alt1\">12</div>"
53             + "     <div class=\"alt2\">13</div>"
54             + "     <div class=\"alt1\">14</div>"
55             + "     <div class=\"alt2\">15</div>"
56             + "     <div class=\"alt1\">16</div>"
57             + "     <div class=\"alt2\">17</div>"
58             + "     <div class=\"alt1\">18</div>"
59             + "     <div class=\"alt2\">19</div>"
60             + "     <div class=\"alt1\">20</div>"
61             + "     <div class=\"alt2\">21</div>"
62             + "     <div class=\"alt1\">22</div>"
63             + "     <div class=\"alt2\">23</div>"
64             + "     <div class=\"alt1\">24</div>"
65             + "   </div>"
66             + "  </body>"
67             + "</html>";
68 
69     private WebView mWebView;
70     private boolean mIsWindowHardwareAccelerated;
71 
72     /** Called when the activity is first created. */
73     @Override
onCreate(Bundle savedInstanceState)74     public void onCreate(Bundle savedInstanceState) {
75         super.onCreate(savedInstanceState);
76         setContentView(R.layout.activity_webview_animation_test);
77         mWebView = (WebView) findViewById(R.id.webview);
78 
79         mIsWindowHardwareAccelerated =
80                 (getWindow().getAttributes().flags
81                         | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED)
82                 != 0;
83         mWebView.setBackgroundColor(0);
84         mWebView.loadDataWithBaseURL("http://foo.bar", HTML, "text/html", null, "http://foo.bar");
85         OnClickListener onClickListner = (View v) -> {
86             switch (v.getId()) {
87                 case R.id.translate:
88                     runTranslate();
89                     break;
90                 case R.id.scale:
91                     runScale();
92                     break;
93                 case R.id.rotate:
94                     runRotate();
95                     break;
96             }
97         };
98         findViewById(R.id.scale).setOnClickListener(onClickListner);
99         findViewById(R.id.translate).setOnClickListener(onClickListner);
100         findViewById(R.id.rotate).setOnClickListener(onClickListner);
101         ((SeekBar) findViewById(R.id.view_alpha))
102                 .setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
103                     @Override
104                     public void onProgressChanged(SeekBar view, int progress, boolean fromUser) {
105                         switch (view.getId()) {
106                             case R.id.view_alpha:
107                                 mWebView.setAlpha(progress / 100f);
108                                 break;
109                         }
110                     }
111 
112                     @Override
113                     public void onStartTrackingTouch(SeekBar seekBar) {}
114 
115                     @Override
116                     public void onStopTrackingTouch(SeekBar seekBar) {}
117                 });
118         CheckBox checkBox = ((CheckBox) findViewById(R.id.use_layer));
119         checkBox.setOnCheckedChangeListener(
120                 (CompoundButton arg0, boolean checked) -> { setWebViewLayer(checked); });
121         setWebViewLayer(checkBox.isChecked());
122     }
123 
runTranslate()124     private void runTranslate() {
125         if (mWebView.getTranslationX() == 0f) {
126             mWebView.animate().translationX(100f).translationY(100f);
127         } else {
128             mWebView.animate().translationX(0f).translationY(0f);
129         }
130     }
131 
runScale()132     private void runScale() {
133         if (mWebView.getScaleX() == 1f) {
134             mWebView.animate().scaleX(.5f).scaleY(.5f);
135         } else {
136             mWebView.animate().scaleX(1f).scaleY(1f);
137         }
138     }
139 
runRotate()140     private void runRotate() {
141         if (mWebView.getRotationX() == 0f) {
142             mWebView.animate().rotationX(45f).rotationY(45f).rotation(90f);
143         } else {
144             mWebView.animate().rotationX(0f).rotationY(0f).rotation(0f);
145         }
146     }
147 
setWebViewLayer(boolean isOnLayer)148     private void setWebViewLayer(boolean isOnLayer) {
149         if (isOnLayer) {
150             mWebView.setLayerType(mIsWindowHardwareAccelerated ? View.LAYER_TYPE_HARDWARE
151                                                                : View.LAYER_TYPE_SOFTWARE,
152                     null);
153         } else {
154             mWebView.setLayerType(View.LAYER_TYPE_NONE, null);
155         }
156     }
157 }
158