index.uts 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import { UnregisterRequestPermissionTipsListener, RegisterRequestPermissionTipsListener, RequestPermissionTipsListener, SetRequestPermissionTips } from "../interface";
  2. import RelativeLayout from 'android.widget.RelativeLayout';
  3. import LinearLayout from 'android.widget.LinearLayout';
  4. import Color from 'android.graphics.Color';
  5. import TextView from 'android.widget.TextView';
  6. import ViewGroup from 'android.view.ViewGroup';
  7. import Activity from 'android.app.Activity';
  8. import HashMap from 'java.util.HashMap';
  9. import AnimationUtils from 'android.view.animation.AnimationUtils';
  10. import R from 'io.dcloud.uts.permissionrequest.R'
  11. import Html from 'android.text.Html';
  12. import View from 'android.view.View';
  13. import Runnable from "java.lang.Runnable"
  14. let PermissionTipsView : View | null = null
  15. let permissionTips : HashMap<String, String> = new HashMap<String, String>()
  16. var permissionListener : RequestPermissionListener | null = null
  17. var listener : RequestPermissionTipsListener | null = null
  18. @UTSJS.keepAlive
  19. export function unregisterRequestPermissionTipsListener(e : RequestPermissionTipsListener | null) {
  20. listener = null;
  21. if (permissionListener != null) {
  22. permissionListener!.stop()
  23. permissionListener = null
  24. }
  25. if (PermissionTipsView != null) {
  26. if (PermissionTipsView!.getParent() != null) {
  27. PermissionTipsView!.setAnimation(null);
  28. ((PermissionTipsView!.getParent()) as ViewGroup).removeView(PermissionTipsView)
  29. }
  30. PermissionTipsView = null
  31. }
  32. }
  33. @UTSJS.keepAlive
  34. export function registerRequestPermissionTipsListener(l : RequestPermissionTipsListener | null) {
  35. listener = l
  36. if (permissionListener == null) {
  37. permissionListener = uni.createRequestPermissionListener()
  38. permissionListener!.onRequest((permissions : Array<string>) => {
  39. if (listener != null)
  40. listener!.onRequest?.invoke(permissions)
  41. })
  42. permissionListener!.onConfirm((permissions : Array<string>) => {
  43. UTSAndroid.getUniActivity()!.runOnUiThread(new ConfirmRunnable(permissions))
  44. })
  45. permissionListener!.onComplete((permissions : Array<string>) => {
  46. UTSAndroid.getUniActivity()!.runOnUiThread(new CompleteRunnable(permissions))
  47. })
  48. }
  49. }
  50. class ConfirmRunnable implements Runnable {
  51. permissions : Array<string>
  52. constructor(permissions : Array<string>) {
  53. this.permissions = permissions
  54. }
  55. override run() {
  56. let activity = UTSAndroid.getUniActivity()!
  57. if (PermissionTipsView != null && PermissionTipsView!.getParent() != null) {
  58. PermissionTipsView!.setAnimation(null);
  59. ((PermissionTipsView!.getParent()) as ViewGroup).removeView(PermissionTipsView)
  60. }
  61. if (this.permissions.length > 0) {
  62. try {
  63. PermissionTipsView = createPermissionWindow(activity, this.permissions);
  64. if (PermissionTipsView != null) {
  65. (activity.findViewById(android.R.id.content) as ViewGroup).addView(PermissionTipsView!)
  66. }
  67. } catch (e) {
  68. console.log(e)
  69. }
  70. }
  71. if (listener != null)
  72. listener!.onConfirm?.invoke(this.permissions)
  73. }
  74. }
  75. class CompleteRunnable implements Runnable {
  76. permissions : Array<string>
  77. constructor(permissions : Array<string>) {
  78. this.permissions = permissions
  79. }
  80. override run() {
  81. let activity = UTSAndroid.getUniActivity()!
  82. if (PermissionTipsView != null) {
  83. PermissionTipsView!.setAnimation(AnimationUtils.loadAnimation(activity, R.anim.popupwindow_exit));
  84. ((PermissionTipsView!.getParent()) as ViewGroup).removeView(PermissionTipsView!)
  85. PermissionTipsView = null
  86. }
  87. if (listener != null) {
  88. var permissionStatus = {}
  89. for (var p in this.permissions) {
  90. permissionStatus[p] = UTSAndroid.checkSystemPermissionGranted(UTSAndroid.getUniActivity()!, [p]) ? "grant" : "denied"
  91. }
  92. listener!.onComplete?.invoke(permissionStatus)
  93. }
  94. }
  95. }
  96. export const setRequestPermissionTips : SetRequestPermissionTips = (tips : UTSJSONObject) => {
  97. permissionTips.clear()
  98. for (var k in tips) {
  99. permissionTips.put(k, tips[k] != null ? tips[k].toString() : "")
  100. }
  101. }
  102. function createPermissionWindow(activity : Activity, permissions : Array<string>) : ViewGroup | null {
  103. let rootView = new RelativeLayout(activity);
  104. rootView.setBackgroundColor(Color.TRANSPARENT);
  105. let backgroundView = new LinearLayout(activity);
  106. backgroundView.setPadding(30, 0, 30, 30);
  107. backgroundView.setOrientation(1)
  108. backgroundView.setBackgroundResource(R.drawable.dcloud_permission_background);
  109. let permissionTipsList : Array<string> = new Array<string>()
  110. for (var p in permissions) {
  111. if (permissionTips.containsKey(p) && permissionTipsList.indexOf(permissionTips.get(p)) == -1) {
  112. permissionTipsList.push(permissionTips.get(p)!)
  113. }
  114. }
  115. for (var p in permissionTipsList) {
  116. let text = new TextView(activity);
  117. text.setText(Html.fromHtml(p, Html.FROM_HTML_SEPARATOR_LINE_BREAK_HEADING))
  118. text.setPadding(0, 30, 0, 0)
  119. text.setTextSize((5 * getScale()).toFloat())
  120. text.setTextColor(Color.BLACK)
  121. backgroundView.addView(text)
  122. }
  123. if (backgroundView.getChildCount() == 0) {
  124. return null;
  125. }
  126. let rll = new RelativeLayout.LayoutParams(-1, -2)
  127. rll.topMargin = (UTSAndroid.getStatusBarHeight() * getScale()).toInt();
  128. rll.leftMargin = 30;
  129. rll.rightMargin = 30;
  130. rll.bottomMargin = 30;
  131. rootView.addView(backgroundView, rll)
  132. rootView.setAnimation(AnimationUtils.loadAnimation(activity, R.anim.popupwindow_enter));
  133. return rootView;
  134. }
  135. function getScale() : Float {
  136. if (UTSAndroid.getUniActivity() != null) {
  137. return UTSAndroid.getUniActivity()!.resources.displayMetrics.scaledDensity
  138. }
  139. return (0 as number).toFloat();
  140. }