· 6 years ago · Apr 07, 2020, 04:08 AM
1screen_webview_kv = '''
2<ScreenWebView>:
3 id: screen_webview
4 FloatLayout:
5 canvas.before:
6 Color:
7 rgba: rgba("#E1E1E1")
8 Rectangle:
9 size: self.size
10 pos: self.pos
11 Label:
12 id: info_label
13 halign: 'center'
14 font_name: "Roboto"
15 pos_hint: {"center_x": 0.5, "center_y": 0.5}
16 color: rgba("#555555")
17'''
18
19from kivy.app import App
20from kivy.clock import Clock, mainthread
21from kivmob import KivMob, TestIds
22from .generic import DynamicScreen
23from kivy.base import EventLoop
24from kivy.utils import platform
25
26if platform == 'android':
27 from android.runnable import run_on_ui_thread
28 from jnius import autoclass
29
30 WebView = autoclass('android.webkit.WebView')
31 CookieManager = autoclass('android.webkit.CookieManager')
32 WebViewClient = autoclass('android.webkit.WebViewClient')
33 activity = autoclass('org.renpy.android.PythonActivity').mActivity
34 android_keys = autoclass('android.view.KeyEvent')
35
36else:
37 def run_on_ui_thread(func):
38 ''' dummy wrapper for desktop compatibility '''
39 return func
40
41
42class ScreenWebView(DynamicScreen):
43 view_cached = None
44 webview = None
45 wvc = None
46 webview_lock = False # simple lock to avoid launching two webviews
47 url = 'about:blank'
48
49 def __init__(self, url, **kwargs):
50 self.name = 'screen_webview'
51 self.url = url
52 self.kv_string = screen_webview_kv
53 super(ScreenWebView, self).__init__(**kwargs)
54 App.get_running_app().root.ids.screen_manager.add_widget(self)
55 App.get_running_app().root.ids.screen_manager.current = "screen_webview"
56 pantallas = App.get_running_app().root.ids.screen_manager.screens
57 print(pantallas)
58
59 def on_enter(self, *args):
60 super(ScreenWebView, self).on_enter(*args)
61 print("se llamo a on_enter")
62 if platform == 'android':
63 ''' on android create webview for webpage '''
64 self.ids["info_label"].text = "Bancanos un toque mientras cargamos el Archivo.."
65 self.webview_lock = True
66 # creo el wv y llamo al chekeador del back button, tiene un ciclo while a dentro
67 Clock.schedule_once(lambda x: create_webview(self), 0)
68 else:
69 ''' on desktop just launch web browser '''
70 self.ids["info_label"].text = "Bancanos un toque mientras cargamos el Archivo.."
71 import webbrowser
72 webbrowser.open_new(self.url)
73
74 @run_on_ui_thread
75 def key_back_handler(self, *args):
76 print("se llamo a key handler")
77 if self.webview:
78 if self.webview.canGoBack() == True:
79 self.webview.goBack()
80 print("can Go back")
81 else:
82 self.webview.destroy()
83 Clock.schedule_once(self.detach_webview, 0)
84 return True
85 else:
86 App.get_running_app().root.ids.screen_manager.current = "screen_archivos"
87 return True
88
89 @mainthread
90 def quit_screen(self, *args):
91 print("se llamo a quit_Screen")
92 app = App.get_running_app()
93 app.root.ids.screen_manager.current = "screen_archivos"
94
95 @run_on_ui_thread
96 def detach_webview(self, *args):
97 print("se llamo a detach_Webview")
98 if self.webview_lock == False:
99 if self.webview:
100 self.webview.loadUrl("about:blank")
101 self.webview.clearHistory() # refer to android webview api
102 self.webview.clearCache(True)
103 self.webview.clearFormData()
104 self.webview.freeMemory()
105 # self.webview.pauseTimers()
106 activity.setContentView(self.view_cached)
107 Clock.schedule_once(self.quit_screen, 0)
108
109
110@run_on_ui_thread
111def create_webview(wvdado, *args):
112 # cookie_manager.getInstance().removeAllCookie()
113 # print(dir(cookie_manager))
114 # cookie_manager.removeSessionCookie()
115 # 'acceptCookie', 'allowFileSchemeCookies', 'equals', 'getClass', 'getCookie', 'getInstance', 'hasCookies', 'hashCode', 'instance', 'notify', 'notifyAll', 'removeAllCookie', 'removeExpiredCookie', 'removeSessionCookie', 'setAcceptCookie', 'setAcceptFileSchemeCookies', 'setCookie', 'toString', 'wait'
116 self = wvdado
117 print("el objeto que recibio la funcion create_wv es:", self, "y su url es:", self.url)
118 if self.view_cached is None:
119 self.view_cached = activity.currentFocus
120 # if self.webview is None:
121 self.webview = WebView(activity)
122 # self.webview.clearCache(True)
123 # self.webview.clearFormData()
124 # self.webview.clearHistory()
125 # self.webview.clearMatches()
126 # self.webview.clearSslPreferences()
127 #self.webview.canGoBack(False)
128 cookie_manager = CookieManager.getInstance()
129 cookie_manager.removeAllCookie()
130
131 settings = self.webview.getSettings()
132 settings.setJavaScriptEnabled(True)
133 settings.setUseWideViewPort(True) # enables viewport html meta tags
134 settings.setLoadWithOverviewMode(True) # uses viewport
135 settings.setSupportZoom(True) # enables zoom
136 settings.setBuiltInZoomControls(False) # enables zoom controls
137
138 settings.setSavePassword(False)
139 settings.setSaveFormData(False)
140 # if self.wvc is None:
141 self.wvc = WebViewClient()
142 self.webview.setWebViewClient(self.wvc)
143 activity.setContentView(self.webview)
144 self.webview.loadUrl(self.url)
145 self.webview_lock = False