Skip to content

Commit 60ddffc

Browse files
committed
listen system pasteboard update
1 parent 396e646 commit 60ddffc

File tree

6 files changed

+99
-1
lines changed

6 files changed

+99
-1
lines changed

entry/src/main/ets/InputMethodExtensionAbility/FcitxInputMethodService.ets

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ import { InputMethodExtensionAbility } from "@kit.IMEKit";
22
import type Want from "@ohos.app.ability.Want";
33
import keyboardController from "./model/KeyboardController";
44
import fcitx from 'libentry.so';
5+
import pasteboardController from "./model/pasteboard/PasteboardController";
56

67
export default class FcitxInputMethodService extends InputMethodExtensionAbility {
78
onCreate(want: Want): void {
9+
pasteboardController.onCreate(this.context)
810
keyboardController.onCreate(this.context)
911
const bundle = this.context.bundleCodeDir
1012
const resfile = this.context.resourceDir
@@ -13,5 +15,6 @@ export default class FcitxInputMethodService extends InputMethodExtensionAbility
1315

1416
onDestroy(): void {
1517
keyboardController.onDestroy()
18+
pasteboardController.onDestroy()
1619
}
1720
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { Context } from '@kit.AbilityKit'
2+
import { BusinessError, pasteboard } from '@kit.BasicServicesKit'
3+
4+
const systemPasteboard: pasteboard.SystemPasteboard = pasteboard.getSystemPasteboard()
5+
6+
export class PasteboardController {
7+
constructor() {
8+
}
9+
10+
public onCreate(context: Context): void {
11+
console.debug('onCreate')
12+
systemPasteboard.on('update', this.onSystemPasteboardUpdate)
13+
}
14+
15+
public onDestroy(): void {
16+
console.debug('onDestroy')
17+
systemPasteboard.off('update', this.onSystemPasteboardUpdate)
18+
}
19+
20+
public onSystemPasteboardUpdate(): void {
21+
systemPasteboard.getData((err: BusinessError, data: pasteboard.PasteData) => {
22+
if (err) {
23+
console.error(`Failed to get paste data: ${err.message}`)
24+
return
25+
}
26+
const text = data.getPrimaryText()
27+
console.debug(`get primary text: ${text}`)
28+
})
29+
}
30+
}
31+
32+
const pasteboardController = new PasteboardController()
33+
34+
export default pasteboardController

entry/src/main/ets/ability/EntryAbility.ets

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit';
1+
import { abilityAccessCtrl, AbilityConstant, ConfigurationConstant, UIAbility, Want } from '@kit.AbilityKit';
22
import { hilog } from '@kit.PerformanceAnalysisKit';
33
import { window } from '@kit.ArkUI';
4+
import { PermissionUtil } from '../utils/PermissionUtil';
45

56
export default class EntryAbility extends UIAbility {
67
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
@@ -21,10 +22,19 @@ export default class EntryAbility extends UIAbility {
2122
hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
2223
return;
2324
}
25+
this.checkPasteboardPermission()
2426
hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.');
2527
});
2628
}
2729

30+
private checkPasteboardPermission() {
31+
if (PermissionUtil.checkAccessToken('ohos.permission.READ_PASTEBOARD') ===
32+
abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
33+
return
34+
}
35+
PermissionUtil.requestPermissions(this.context, ['ohos.permission.READ_PASTEBOARD'])
36+
}
37+
2838
onWindowStageDestroy(): void {
2939
// Main window is destroyed, release UI related resources
3040
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { abilityAccessCtrl, bundleManager, common, PermissionRequestResult, Permissions } from '@kit.AbilityKit'
2+
import { BusinessError } from '@kit.BasicServicesKit'
3+
4+
export namespace PermissionUtil {
5+
6+
export function checkAccessToken(permission: Permissions): abilityAccessCtrl.GrantStatus {
7+
const atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager()
8+
let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED
9+
10+
let tokenId: number = 0
11+
try {
12+
let bundleInfo: bundleManager.BundleInfo =
13+
bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
14+
let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo
15+
tokenId = appInfo.accessTokenId
16+
} catch (error) {
17+
const err: BusinessError = error as BusinessError
18+
console.error(`Failed to get bundle info for self. Code is ${err.code}, message is ${err.message}`)
19+
}
20+
21+
try {
22+
grantStatus = atManager.checkAccessTokenSync(tokenId, permission)
23+
} catch (error) {
24+
const err: BusinessError = error as BusinessError
25+
console.error(`Failed to check access token. Code is ${err.code}, message is ${err.message}`)
26+
}
27+
28+
return grantStatus
29+
}
30+
31+
export function requestPermissions(context: common.UIAbilityContext, permissions: Permissions | Array<Permissions>,
32+
requestResult?: Callback<PermissionRequestResult>): void {
33+
const atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager()
34+
const ps = Array.isArray(permissions) ? [...permissions] : [permissions]
35+
atManager.requestPermissionsFromUser(context, ps).then((result) => {
36+
if (requestResult) requestResult(result)
37+
})
38+
}
39+
}

entry/src/main/module.json5

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@
2020
"abilities": ["InputMethodExtensionAbility"],
2121
"when": "inuse"
2222
}
23+
},
24+
{
25+
"name": "ohos.permission.READ_PASTEBOARD",
26+
"reason": "$string:READ_PASTEBOARD_reason",
27+
"usedScene": {
28+
"abilities": ["EntryAbility", "InputMethodExtensionAbility"],
29+
"when": "inuse"
30+
}
2331
}
2432
],
2533
"abilities": [

entry/src/main/resources/base/element/string.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
{
1616
"name": "INTERNET_reason",
1717
"value": "Used in Cloud Pinyin."
18+
},
19+
{
20+
"name": "READ_PASTEBOARD_reason",
21+
"value": "Used for autofill and pasteboard history."
1822
}
1923
]
2024
}

0 commit comments

Comments
 (0)