package nodomain.freeyourgadget.gadgetbridge.womp; import android.Manifest; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import org.json.JSONObject; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.activities.ControlCenterv2; /** * 分拣员工作台:与手环功能相互独立,未登录也可留在本页。 */ public class WompWorkbenchFragment extends Fragment implements WompJsBridge.Host { private WebView webView; private String pendingScanCb; private ActivityResultLauncher scanLauncher; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); scanLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (pendingScanCb == null) { return; } String code = ""; if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) { code = result.getData().getStringExtra(WompScanActivity.EXTRA_CODE); } String script = "window.__wompCb && window.__wompCb(" + JSONObject.quote(pendingScanCb) + ",true," + JSONObject.quote(code == null ? "" : code) + ")"; evalJs(script); pendingScanCb = null; }); } @SuppressLint("SetJavaScriptEnabled") @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View root = inflater.inflate(R.layout.fragment_womp_workbench, container, false); webView = root.findViewById(R.id.womp_webview); WebSettings s = webView.getSettings(); s.setJavaScriptEnabled(true); s.setDomStorageEnabled(true); s.setAllowFileAccess(true); s.setAllowContentAccess(true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { s.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); } webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { if (url != null && (url.endsWith("home.html") || url.endsWith("login.html"))) { view.clearHistory(); } } }); webView.setWebChromeClient(new WebChromeClient()); webView.addJavascriptInterface(new WompJsBridge(requireActivity(), this), "Womp"); String page = WompSession.isLoggedIn(requireContext()) ? "home.html" : "login.html"; webView.loadUrl("file:///android_asset/womp/" + page); ensureLocationPermission(); return root; } private void ensureLocationPermission() { if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{ Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION }, 7103); } } public boolean goBack() { if (webView != null && webView.canGoBack()) { webView.goBack(); return true; } return false; } @Override public void scan(String callbackId) { pendingScanCb = callbackId; if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.CAMERA}, 7102); return; } scanLauncher.launch(new Intent(requireContext(), WompScanActivity.class)); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 7102 && pendingScanCb != null && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { scanLauncher.launch(new Intent(requireContext(), WompScanActivity.class)); } else if (requestCode == 7102 && pendingScanCb != null) { evalJs("window.__wompCb && window.__wompCb(" + JSONObject.quote(pendingScanCb) + ",true,\"\")"); pendingScanCb = null; } } @Override public void closePage() { if (getActivity() instanceof ControlCenterv2) { ((ControlCenterv2) getActivity()).showBandTab(); } } @Override public void onLoggedIn() { WompKeepAliveService.start(requireContext()); if (webView != null) { webView.loadUrl("file:///android_asset/womp/home.html"); } } @Override public void onLogout() { if (webView != null) { webView.loadUrl("file:///android_asset/womp/login.html"); } } @Override public void evalJs(String script) { if (webView != null && getActivity() != null) { getActivity().runOnUiThread(() -> { if (webView != null) { webView.evaluateJavascript(script, null); } }); } } @Override public void onResume() { super.onResume(); if (webView != null) { webView.onResume(); } } @Override public void onPause() { if (webView != null) { webView.onPause(); } super.onPause(); } @Override public void onDestroyView() { if (webView != null) { webView.destroy(); webView = null; } super.onDestroyView(); } }