index.uts 5.4 KB

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