55import android .content .Context ;
66import android .content .SharedPreferences ;
77import android .content .res .AssetManager ;
8+ import android .hardware .display .DisplayManager ;
89import android .net .Uri ;
910import android .util .AttributeSet ;
1011import android .util .Log ;
@@ -55,9 +56,9 @@ public OmoWebView(Context context, @Nullable AttributeSet attrs, int defStyleAtt
5556 this (context , attrs , defStyleAttr , 0 );
5657 }
5758
58- private void setFrameRate (Window window , int frameRate ) {
59- Display display = window .getWindowManager ().getDefaultDisplay ();
59+ private void setFrameRate (Window window , Display display , int frameRate ) {
6060 if (Math .floor (display .getRefreshRate ()) == frameRate ) {
61+ Debug .i ().log (Log .INFO , "setFrameRate: already set" );
6162 return ;
6263 }
6364
@@ -86,13 +87,36 @@ private void setFrameRate(Window window, int frameRate) {
8687 var attributes = window .getAttributes ();
8788 attributes .preferredRefreshRate = targetMode .getRefreshRate ();
8889 window .setAttributes (attributes );
90+ } else {
91+ Debug .i ().log (Log .WARN , "targetMode == null" );
92+ Toast .makeText (getContext (), "Suitable display mode not found, view logs for details" , Toast .LENGTH_LONG ).show ();
8993 }
9094 }
9195
9296 @ SuppressLint ("SetJavaScriptEnabled" )
9397 public OmoWebView (Context context , @ Nullable AttributeSet attrs , int defStyleAttr , int defStyleRes ) {
9498 super (context , attrs , defStyleAttr , defStyleRes );
9599
100+ DisplayManager displayManager = (DisplayManager ) context .getSystemService (Context .DISPLAY_SERVICE );
101+ displayManager .registerDisplayListener (new DisplayManager .DisplayListener () {
102+ @ Override
103+ public void onDisplayAdded (int displayId ) {}
104+
105+ @ Override
106+ public void onDisplayRemoved (int displayId ) {}
107+
108+ @ Override
109+ public void onDisplayChanged (int displayId ) {
110+ Debug .i ().log (Log .INFO , "onDisplayChanged" );
111+ Display display = displayManager .getDisplay (displayId );
112+
113+ Activity activity = (Activity ) getContext ();
114+ Window window = activity .getWindow ();
115+
116+ setFrameRate (window , display , 60 );
117+ }
118+ }, null );
119+
96120 OmoApplication application = (OmoApplication ) context .getApplicationContext ();
97121 SharedPreferences preferences = application .getPreferences ();
98122
@@ -116,15 +140,16 @@ public OmoWebView(Context context, @Nullable AttributeSet attrs, int defStyleAtt
116140 settings .setCacheMode (WebSettings .LOAD_NO_CACHE );
117141 settings .setLoadsImagesAutomatically (true );
118142 settings .setMediaPlaybackRequiresUserGesture (false );
143+ }
119144
120- if ( context instanceof Activity ) {
121- Activity activity = ( Activity ) context ;
122- Window window = activity . getWindow ();
123- setFrameRate ( window , 60 );
124- } else {
125- Debug . i (). log ( Log . ERROR , "failed to set frame rate, isAttachedToWindow() == false, how?" );
126- Toast . makeText ( getContext (), "Failed to set frame rate, view logs for details" , Toast . LENGTH_LONG ). show ();
127- }
145+ @ Override
146+ protected void onAttachedToWindow () {
147+ super . onAttachedToWindow ();
148+
149+ Activity activity = ( Activity ) getContext ();
150+ Window window = activity . getWindow ( );
151+
152+ setFrameRate ( window , getDisplay (), 60 );
128153 }
129154
130155 public void start () {
0 commit comments