<template>
	<view class="content"></view>
</template>

<script lang="ts">
	import {
		onLoad,
		onShow,
		onHide,
		onUnload
	} from '@dcloudio/uni-app'
	import {
		reactive,
		defineProps
	} from "vue";
	export default {
		setup() {
			let details = reactive({
				activity: null,
				receiver: null,
				intentFilter: null,
				isstart:false,
				
			})
			const props=defineProps<{ishidestop?:boolean}>()
			onLoad(() => {
				initScan()
				startScan();
			})
			onShow(()=>{
				startScan();
			})
			onHide(() => {
				if(props?.ishidestop)return
				stopScan();
			})
			onUnload(() => {
				stopScan();
				uni.$off('scancodedate')
			})

			function initScan() {
				// #ifdef APP
				if (plus) {
					details.activity = plus.android.runtimeMainActivity(); //获取activity
					var IntentFilter = plus.android.importClass('android.content.IntentFilter');
					details.intentFilter = new IntentFilter();
					details.intentFilter.addAction("scan.rcv.message") // 换你的广播动作
					details.receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
						onReceive: function(context, intent) {
							console.log("intent", intent)
							plus.android.importClass(intent);
							let content = utf8ByteToUnicodeStr(intent.getByteArrayExtra('barocode'))
							uni.$emit('scancodedate', content.replace(/\n/g, ""))
						}
					});
				}
				// #endif
			}

			function utf8ByteToUnicodeStr(utf8Bytes) {
				var unicodeStr = "";
				for (var pos = 0; pos < utf8Bytes.length;) {
					var flag = utf8Bytes[pos];
					var unicode = 0;
					if ((flag >>> 7) === 0) {
						unicodeStr += String.fromCharCode(utf8Bytes[pos]);
						pos += 1;

					} else if ((flag & 0xFC) === 0xFC) {
						unicode = (utf8Bytes[pos] & 0x3) << 30;
						unicode |= (utf8Bytes[pos + 1] & 0x3F) << 24;
						unicode |= (utf8Bytes[pos + 2] & 0x3F) << 18;
						unicode |= (utf8Bytes[pos + 3] & 0x3F) << 12;
						unicode |= (utf8Bytes[pos + 4] & 0x3F) << 6;
						unicode |= (utf8Bytes[pos + 5] & 0x3F);
						unicodeStr += String.fromCodePoint(unicode);
						pos += 6;

					} else if ((flag & 0xF8) === 0xF8) {
						unicode = (utf8Bytes[pos] & 0x7) << 24;
						unicode |= (utf8Bytes[pos + 1] & 0x3F) << 18;
						unicode |= (utf8Bytes[pos + 2] & 0x3F) << 12;
						unicode |= (utf8Bytes[pos + 3] & 0x3F) << 6;
						unicode |= (utf8Bytes[pos + 4] & 0x3F);
						unicodeStr += String.fromCodePoint(unicode);
						pos += 5;

					} else if ((flag & 0xF0) === 0xF0) {
						unicode = (utf8Bytes[pos] & 0xF) << 18;
						unicode |= (utf8Bytes[pos + 1] & 0x3F) << 12;
						unicode |= (utf8Bytes[pos + 2] & 0x3F) << 6;
						unicode |= (utf8Bytes[pos + 3] & 0x3F);
						unicodeStr += String.fromCodePoint(unicode);
						pos += 4;

					} else if ((flag & 0xE0) === 0xE0) {
						unicode = (utf8Bytes[pos] & 0x1F) << 12;;
						unicode |= (utf8Bytes[pos + 1] & 0x3F) << 6;
						unicode |= (utf8Bytes[pos + 2] & 0x3F);
						unicodeStr += String.fromCharCode(unicode);
						pos += 3;

					} else if ((flag & 0xC0) === 0xC0) { //110
						unicode = (utf8Bytes[pos] & 0x3F) << 6;
						unicode |= (utf8Bytes[pos + 1] & 0x3F);
						unicodeStr += String.fromCharCode(unicode);
						pos += 2;

					} else {
						unicodeStr += String.fromCharCode(utf8Bytes[pos]);
						pos += 1;
					}
				}
				return unicodeStr;
			}

			function startScan() {
				// #ifdef APP
				if(details.isstart) return
				details.isstart=true
				details.activity.registerReceiver(details.receiver, details.intentFilter);
				// #endif
			}
			function stopScan() {
				// #ifdef APP
				details.isstart=false
				details.activity.unregisterReceiver(details.receiver);
				// #endif
			}
			return {
				startScan,
				stopScan,
				initScan,
			}
		}
	}
</script>

<style>
</style>