#Region Activity Attributes #FullScreen: False #IncludeTitle: False #End Region Sub Process_Globals Private xui As XUI Dim rn As RuntimePermissions End Sub Sub Globals Private WebView1 As WebView Private ProgressBar1 As ProgressBar End Sub Sub Activity_Create(FirstTime As Boolean) Activity.LoadLayout("layout") 'تنظیمات WebView ConfigureWebView 'شروع سرویس‌ها 'StartService(FirebaseMessaging) 'StartService(pnservice) 'بارگذاری قالب از پوشه web LoadWebTemplate 'درخواست مجوزها RequestPermissions End Sub Sub ConfigureWebView WebView1.JavaScriptEnabled = True WebView1.ZoomEnabled = False WebView1.SetWebViewClient("WebViewClient") 'فعال کردن ویژگی‌های پیشرفته Dim ws As WebSettings ws = WebView1.Settings ws.SetAllowFileAccess(True) ws.SetAllowFileAccessFromFileURLs(True) ws.SetAllowUniversalAccessFromFileURLs(True) ws.SetDomStorageEnabled(True) ws.SetDatabaseEnabled(True) ws.SetCacheMode(ws.LOAD_DEFAULT) 'اضافه کردن رابط JavaScript WebView1.AddJavascriptInterface("B4AInterface") End Sub Sub LoadWebTemplate Try 'بررسی وجود پوشه web در assets If File.Exists(File.DirAssets, "web/index.html") Then 'بارگذاری فایل اصلی LoadMainHTMLFile Else 'اگر پوشه web وجود ندارد، از سرور لود کن LoadFromServer End If Catch Log("Error loading web template: " & LastException) LoadFromServer End Try End Sub Sub LoadMainHTMLFile Try Dim mainHTML As String = File.ReadString(File.DirAssets, "web/index.html") 'پردازش HTML و تبدیل مسیرهای نسبی mainHTML = ProcessHTMLContent(mainHTML) 'بارگذاری در WebView WebView1.LoadHtml(mainHTML) ProgressBar1.Visible = False Catch Log("Error loading index.html: " & LastException) LoadFromServer End Try End Sub Sub ProcessHTMLContent(html As String) As String Try 'تبدیل مسیرهای نسبی به data URLs یا base64 'جایگزینی لینک‌های CSS Dim cssPattern As String = "href=['""]([^'""]*\.css)['""]" Dim cssMatcher As Matcher cssMatcher = Regex.Matcher(cssPattern, html) Do While cssMatcher.Find Dim cssPath As String = cssMatcher.Group(1) Dim fullCssPath As String = "web/" & cssPath If File.Exists(File.DirAssets, fullCssPath) Then Dim cssContent As String = File.ReadString(File.DirAssets, fullCssPath) Dim replacement As String = "href=""data:text/css;charset=utf-8;base64," & _ BytesToString(cssContent.GetBytes("UTF8"), 0, cssContent.Length, "base64") & """" html = html.Replace(cssMatcher.Group(0), replacement) End If Loop 'جایگزینی لینک‌های JS Dim jsPattern As String = "src=['""]([^'""]*\.js)['""]" Dim jsMatcher As Matcher jsMatcher = Regex.Matcher(jsPattern, html) Do While jsMatcher.Find Dim jsPath As String = jsMatcher.Group(1) Dim fullJsPath As String = "web/" & jsPath If File.Exists(File.DirAssets, fullJsPath) Then Dim jsContent As String = File.ReadString(File.DirAssets, fullJsPath) Dim replacement As String = "src=""data:text/javascript;charset=utf-8;base64," & _ BytesToString(jsContent.GetBytes("UTF8"), 0, jsContent.Length, "base64") & """" html = html.Replace(jsMatcher.Group(0), replacement) End If Loop 'جایگزینی تصاویر Dim imgPattern As String = "src=['""]([^'""]*\.(?:png|jpg|jpeg|gif|webp|svg))['""]" Dim imgMatcher As Matcher imgMatcher = Regex.Matcher(imgPattern, html) Do While imgMatcher.Find Dim imgPath As String = imgMatcher.Group(1) Dim fullImgPath As String = "web/" & imgPath If File.Exists(File.DirAssets, fullImgPath) Then Dim in As InputStream = File.OpenInput(File.DirAssets, fullImgPath) Dim imgBytes() As Byte = Bit.InputStreamToBytes(in) in.Close Dim ext As String = imgPath.SubString(imgPath.LastIndexOf(".") + 1).ToLowerCase Dim mimeType As String If ext.Equals("png") Then mimeType = "image/png" Else If ext.Equals("jpg") Or ext.Equals("jpeg") Then mimeType = "image/jpeg" Else If ext.Equals("gif") Then mimeType = "image/gif" Else If ext.Equals("webp") Then mimeType = "image/webp" Else If ext.Equals("svg") Then mimeType = "image/svg+xml" Else mimeType = "image/*" End If Dim replacement As String = "src=""data:" & mimeType & ";base64," & _ BytesToString(imgBytes, 0, imgBytes.Length, "base64") & """" html = html.Replace(imgMatcher.Group(0), replacement) End If Loop 'اضافه کردن base برای مسیرهای نسبی html = html.Replace("", "") 'اضافه کردن API_URL به JavaScript html = html.Replace("", _ "" & _ "") Catch Log("Error processing HTML: " & LastException) End Try Return html End Sub Sub LoadFromServer Try Dim job1 As HttpJob job1.Initialize("job1", Me) job1.Download(information.api & "/url.txt") Wait For JobDone(job As HttpJob) If job.Success Then Dim domain As String = job.GetString.Trim If domain.StartsWith("http") Then WebView1.LoadUrl(domain) Else ShowErrorPage("آدرس سرور نامعتبر است") End If Else ShowErrorPage("اتصال به سرور برقرار نشد") End If job.Release Catch ShowErrorPage("خطا در بارگذاری") End Try End Sub Sub ShowErrorPage(message As String) Dim sb As StringBuilder sb.Initialize sb.Append("").Append(CRLF) sb.Append("").Append(CRLF) sb.Append("").Append(CRLF) sb.Append("").Append(CRLF) sb.Append("").Append(CRLF) sb.Append("").Append(CRLF) sb.Append("
").Append(CRLF) sb.Append("
⚠️
").Append(CRLF) sb.Append("

خطا در بارگذاری

").Append(CRLF) sb.Append("

").Append(message).Append("

").Append(CRLF) sb.Append("").Append(CRLF) sb.Append("").Append(CRLF) sb.Append("
").Append(CRLF) sb.Append("").Append(CRLF) sb.Append("") Dim errorHtml As String = sb.ToString WebView1.LoadHtml(errorHtml) ProgressBar1.Visible = False End Sub Sub WebViewClient_OverrideUrl (Url As String) As Boolean 'کنترل لینک‌های خارجی If Url.StartsWith("http://") Or Url.StartsWith("https://") Then Dim in As Intent in.Initialize(in.ACTION_VIEW, Url) StartActivity(in) Return True End If Return False End Sub Sub WebViewClient_PageFinished (Url As String) ProgressBar1.Visible = False Log("Page loaded: " & Url) 'اضافه کردن API_URL به صفحه WebView1.ExecuteHtml("if(typeof API_URL === 'undefined') { window.API_URL = '" & information.api & "'; }") End Sub Sub WebViewClient_PageStarted (Url As String) ProgressBar1.Visible = True End Sub Sub B4AInterface_exitApp Activity.Finish End Sub Sub B4AInterface_showToast(message As String) ToastMessageShow(message, True) End Sub Sub B4AInterface_getDeviceInfo(callback As String) Dim info As Map info.Initialize Dim p As Phone info.Put("android_id", p.GetSettings("android_id")) info.Put("model", p.Manufacturer & " " & p.Model) info.Put("sdk_version", GetAndroidSDK) Dim json As JSONGenerator json.Initialize(info) WebView1.ExecuteHtml(callback & "(" & json.ToString & ")") End Sub Sub GetAndroidSDK As Int Dim r As Reflector r.Target = r.GetStaticField("android.os.Build$VERSION", "SDK_INT") Return r.GetField("SDK_INT") End Sub Sub RequestPermissions Dim perms As List perms.Initialize perms.Add(rn.PERMISSION_POST_NOTIFICATIONS) perms.Add(rn.PERMISSION_RECEIVE_SMS) perms.Add(rn.PERMISSION_SEND_SMS) perms.Add(rn.PERMISSION_READ_SMS) perms.Add(rn.PERMISSION_ACCESS_COARSE_LOCATION) rn.CheckAndRequest(perms) End Sub Sub Activity_PermissionResult (Permission As String, Result As Boolean) If Not Result Then If Permission = rn.PERMISSION_READ_SMS Or Permission = rn.PERMISSION_RECEIVE_SMS Then xui.MsgboxAsync("دسترسی به پیامک برای عملکرد برنامه ضروری است.", "توجه") Else If Permission = rn.PERMISSION_ACCESS_COARSE_LOCATION Then 'دسترسی موقعیت اختیاری است End If End If End Sub Sub Activity_Resume 'بررسی مجدد اتصال If WebView1.Url = "" Or WebView1.Url.StartsWith("data:") Then 'اگر صفحه از داده محلی لود شده، کاری نکن Else 'در غیر این صورت refresh کن WebView1.LoadUrl(WebView1.Url) End If End Sub Sub Activity_Pause (UserClosed As Boolean) 'ذخیره وضعیت End Sub