feat: 新增 42 个 Android API 模块
新增模块覆盖: 系统层 (14): system, security, print, opengl, renderscript, transition, test, service_notification, service_controls, service_quicksettings, service_wallpaper, service_autofill, service_dreams, service_vr 应用层 (13): app_admin, app_backup, app_job, app_usage, app_role, app_people, appwidget, companion, credentials, mtp, sip, telecom, speech 硬件媒体层 (15): hardware_display, hardware_fingerprint, hardware_usb, hardware_input, media_audiofx, media_browse, media_session, media_tv, media_midi, media_projection, uwb, se, view_autofill, view_textclassifier, view_translation 总计 94 个模块,75,342 行代码
This commit is contained in:
1 parent
8ad62be068
commit
506f9ac725
43 files changed
+16704
-23
No files matched your search
@@ -0,0 +1,423 @@
|
||||
from __future__ import annotations
|
||||
|
||||
"""
|
||||
Android Service Autofill 组件 — AutofillService, FillRequest, FillResponse,
|
||||
SaveRequest, SaveInfo, Dataset, AutofillFieldClassificationService 等
|
||||
方法签名完全对齐 Android SDK (android.service.autofill 包)
|
||||
"""
|
||||
|
||||
import time
|
||||
from typing import Any, Callable, Dict, List, Optional, Set
|
||||
|
||||
from .._core import Stub, AndroidOnlyError
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# FillRequest
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
class FillRequest(Stub):
|
||||
"""FillRequest — 自动填充请求"""
|
||||
|
||||
# 请求标志
|
||||
FLAG_MANUAL_REQUEST = 0x0001
|
||||
FLAG_COMPATIBILITY_MODE_REQUEST = 0x0002
|
||||
|
||||
def __init__(self, request_id: int = 0, flags: int = 0,
|
||||
fill_contexts: Optional[List[Any]] = None):
|
||||
super().__init__()
|
||||
self._request_id = request_id
|
||||
self._flags = flags
|
||||
self._fill_contexts = fill_contexts or []
|
||||
self._client_state: Optional[Any] = None
|
||||
|
||||
def getId(self) -> int:
|
||||
"""获取请求 ID"""
|
||||
return self._request_id
|
||||
|
||||
def getFlags(self) -> int:
|
||||
"""获取标志"""
|
||||
return self._flags
|
||||
|
||||
def getFillContexts(self) -> List[Any]:
|
||||
"""获取填充上下文"""
|
||||
return list(self._fill_contexts)
|
||||
|
||||
def getClientState(self) -> Optional[Any]:
|
||||
return self._client_state
|
||||
|
||||
def setClientState(self, state: Any):
|
||||
self._client_state = state
|
||||
|
||||
def toString(self) -> str:
|
||||
return (f"FillRequest(id={self._request_id}, "
|
||||
f"flags={self._flags}, contexts={len(self._fill_contexts)})")
|
||||
|
||||
def hashCode(self) -> int:
|
||||
return self._request_id & 0x7FFFFFFF
|
||||
|
||||
def equals(self, other) -> bool:
|
||||
if not isinstance(other, FillRequest):
|
||||
return False
|
||||
return self._request_id == other._request_id
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# Dataset
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
class Dataset(Stub):
|
||||
"""Dataset — 自动填充数据集"""
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self._field_values: Dict[Any, Any] = {}
|
||||
self._id: Optional[Any] = None
|
||||
self._authentication: Optional[Any] = None
|
||||
|
||||
def getFieldValues(self) -> Dict[Any, Any]:
|
||||
return dict(self._field_values)
|
||||
|
||||
def getId(self) -> Optional[Any]:
|
||||
return self._id
|
||||
|
||||
def setId(self, id: Any):
|
||||
self._id = id
|
||||
|
||||
def toString(self) -> str:
|
||||
return f"Dataset(fields={len(self._field_values)}, id={self._id})"
|
||||
|
||||
def hashCode(self) -> int:
|
||||
return hash(str(self._id)) & 0x7FFFFFFF
|
||||
|
||||
def equals(self, other) -> bool:
|
||||
if not isinstance(other, Dataset):
|
||||
return False
|
||||
return self._id == other._id
|
||||
|
||||
# ── Builder ──
|
||||
|
||||
class Builder(Stub):
|
||||
"""Builder — Dataset 构建器"""
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self._dataset = Dataset()
|
||||
|
||||
def setId(self, id: Any) -> "Dataset.Builder":
|
||||
self._dataset._id = id
|
||||
return self
|
||||
|
||||
def setValue(self, id: Any, value: Any) -> "Dataset.Builder":
|
||||
self._dataset._field_values[id] = value
|
||||
return self
|
||||
|
||||
def setAuthentication(self, authentication: Any) -> "Dataset.Builder":
|
||||
self._dataset._authentication = authentication
|
||||
return self
|
||||
|
||||
def build(self) -> Dataset:
|
||||
return self._dataset
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# SaveInfo
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
class SaveInfo(Stub):
|
||||
"""SaveInfo — 保存信息"""
|
||||
|
||||
# 保存类型
|
||||
SAVE_DATA_TYPE_EMAIL = 0x0001
|
||||
SAVE_DATA_TYPE_PASSWORD = 0x0002
|
||||
SAVE_DATA_TYPE_USERNAME = 0x0004
|
||||
SAVE_DATA_TYPE_CREDIT_CARD = 0x0008
|
||||
SAVE_DATA_TYPE_ADDRESS = 0x0010
|
||||
SAVE_DATA_TYPE_GENERIC = 0x0020
|
||||
SAVE_DATA_TYPE_PASSWORD_V2 = 0x0040
|
||||
SAVE_DATA_TYPE_SMS_2FA = 0x0080
|
||||
SAVE_DATA_TYPE_BIRTH_DATE = 0x0100
|
||||
SAVE_DATA_TYPE_EMAIL_ADDRESS = 0x0200
|
||||
SAVE_DATA_TYPE_PHONE = 0x0400
|
||||
SAVE_DATA_TYPE_USERNAME_V2 = 0x0800
|
||||
SAVE_DATA_TYPE_CARD_NUMBER = 0x1000
|
||||
SAVE_DATA_TYPE_CARD_EXPIRATION_DATE = 0x2000
|
||||
SAVE_DATA_TYPE_CARD_SECURITY_CODE = 0x4000
|
||||
SAVE_DATA_TYPE_FI_ACCOUNT_NUMBER = 0x8000
|
||||
SAVE_DATA_TYPE_FI_ROUTING_NUMBER = 0x10000
|
||||
SAVE_DATA_TYPE_PASSPORT = 0x20000
|
||||
SAVE_DATA_TYPE_DRIVERS_LICENSE = 0x40000
|
||||
SAVE_DATA_TYPE_SSN = 0x80000
|
||||
|
||||
# 标志
|
||||
FLAG_SAVE_ON_ALL_VIEWS_INVISIBLE = 0x0001
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self._type: int = SaveInfo.SAVE_DATA_TYPE_GENERIC
|
||||
self._required_ids: List[Any] = []
|
||||
self._optional_ids: List[Any] = []
|
||||
self._description: Optional[Any] = None
|
||||
self._flags: int = 0
|
||||
self._trigger_ids: List[Any] = []
|
||||
self._validator: Optional[Any] = None
|
||||
|
||||
def getType(self) -> int:
|
||||
return self._type
|
||||
|
||||
def getRequiredIds(self) -> List[Any]:
|
||||
return list(self._required_ids)
|
||||
|
||||
def getOptionalIds(self) -> List[Any]:
|
||||
return list(self._optional_ids)
|
||||
|
||||
def getDescription(self) -> Optional[Any]:
|
||||
return self._description
|
||||
|
||||
def getFlags(self) -> int:
|
||||
return self._flags
|
||||
|
||||
def toString(self) -> str:
|
||||
return (f"SaveInfo(type={self._type}, required={len(self._required_ids)}, "
|
||||
f"optional={len(self._optional_ids)})")
|
||||
|
||||
def hashCode(self) -> int:
|
||||
return hash((self._type, tuple(self._required_ids))) & 0x7FFFFFFF
|
||||
|
||||
def equals(self, other) -> bool:
|
||||
if not isinstance(other, SaveInfo):
|
||||
return False
|
||||
return self._type == other._type
|
||||
|
||||
# ── Builder ──
|
||||
|
||||
class Builder(Stub):
|
||||
"""Builder — SaveInfo 构建器"""
|
||||
|
||||
def __init__(self, type_: int, required_ids: List[Any]):
|
||||
super().__init__()
|
||||
self._save_info = SaveInfo()
|
||||
self._save_info._type = type_
|
||||
self._save_info._required_ids = list(required_ids)
|
||||
|
||||
def setOptionalIds(self, optional_ids: List[Any]) -> "SaveInfo.Builder":
|
||||
self._save_info._optional_ids = list(optional_ids)
|
||||
return self
|
||||
|
||||
def setDescription(self, description: Any) -> "SaveInfo.Builder":
|
||||
self._save_info._description = description
|
||||
return self
|
||||
|
||||
def setFlags(self, flags: int) -> "SaveInfo.Builder":
|
||||
self._save_info._flags = flags
|
||||
return self
|
||||
|
||||
def setTriggerIds(self, trigger_ids: List[Any]) -> "SaveInfo.Builder":
|
||||
self._save_info._trigger_ids = list(trigger_ids)
|
||||
return self
|
||||
|
||||
def setValidator(self, validator: Any) -> "SaveInfo.Builder":
|
||||
self._save_info._validator = validator
|
||||
return self
|
||||
|
||||
def build(self) -> SaveInfo:
|
||||
return self._save_info
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# FillResponse
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
class FillResponse(Stub):
|
||||
"""FillResponse — 自动填充响应"""
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self._datasets: List[Dataset] = []
|
||||
self._save_info: Optional[SaveInfo] = None
|
||||
self._client_state: Optional[Any] = None
|
||||
self._authentication_result: Optional[Any] = None
|
||||
|
||||
def getDatasets(self) -> List[Dataset]:
|
||||
return list(self._datasets)
|
||||
|
||||
def getSaveInfo(self) -> Optional[SaveInfo]:
|
||||
return self._save_info
|
||||
|
||||
def getClientState(self) -> Optional[Any]:
|
||||
return self._client_state
|
||||
|
||||
def toString(self) -> str:
|
||||
return (f"FillResponse(datasets={len(self._datasets)}, "
|
||||
f"saveInfo={'set' if self._save_info else 'none'})")
|
||||
|
||||
def hashCode(self) -> int:
|
||||
return id(self) & 0x7FFFFFFF
|
||||
|
||||
def equals(self, other) -> bool:
|
||||
return self is other
|
||||
|
||||
# ── Builder ──
|
||||
|
||||
class Builder(Stub):
|
||||
"""Builder — FillResponse 构建器"""
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self._response = FillResponse()
|
||||
|
||||
def addDataset(self, dataset: Dataset) -> "FillResponse.Builder":
|
||||
self._response._datasets.append(dataset)
|
||||
return self
|
||||
|
||||
def setDatasets(self, datasets: List[Dataset]) -> "FillResponse.Builder":
|
||||
self._response._datasets = list(datasets)
|
||||
return self
|
||||
|
||||
def setSaveInfo(self, save_info: SaveInfo) -> "FillResponse.Builder":
|
||||
self._response._save_info = save_info
|
||||
return self
|
||||
|
||||
def setClientState(self, client_state: Any) -> "FillResponse.Builder":
|
||||
self._response._client_state = client_state
|
||||
return self
|
||||
|
||||
def setAuthenticationResult(self, result: Any) -> "FillResponse.Builder":
|
||||
self._response._authentication_result = result
|
||||
return self
|
||||
|
||||
def build(self) -> FillResponse:
|
||||
return self._response
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# SaveRequest
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
class SaveRequest(Stub):
|
||||
"""SaveRequest — 保存请求"""
|
||||
|
||||
def __init__(self, request_id: int = 0,
|
||||
client_state: Optional[Any] = None,
|
||||
fill_contexts: Optional[List[Any]] = None):
|
||||
super().__init__()
|
||||
self._request_id = request_id
|
||||
self._client_state = client_state
|
||||
self._fill_contexts = fill_contexts or []
|
||||
|
||||
def getId(self) -> int:
|
||||
return self._request_id
|
||||
|
||||
def getClientState(self) -> Optional[Any]:
|
||||
return self._client_state
|
||||
|
||||
def getFillContexts(self) -> List[Any]:
|
||||
return list(self._fill_contexts)
|
||||
|
||||
def toString(self) -> str:
|
||||
return (f"SaveRequest(id={self._request_id}, "
|
||||
f"contexts={len(self._fill_contexts)})")
|
||||
|
||||
def hashCode(self) -> int:
|
||||
return self._request_id & 0x7FFFFFFF
|
||||
|
||||
def equals(self, other) -> bool:
|
||||
if not isinstance(other, SaveRequest):
|
||||
return False
|
||||
return self._request_id == other._request_id
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# AutofillService
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
class AutofillService(Stub):
|
||||
"""AutofillService — 自动填充服务"""
|
||||
|
||||
SERVICE_INTERFACE = "android.service.autofill.AutofillService"
|
||||
SERVICE_META_DATA = "android.autofill"
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
def onFillRequest(self, request: FillRequest,
|
||||
cancellation_signal: Any,
|
||||
callback: Any):
|
||||
"""填充请求回调"""
|
||||
response = FillResponse()
|
||||
if callback and hasattr(callback, 'onSuccess'):
|
||||
callback.onSuccess(response)
|
||||
|
||||
def onSaveRequest(self, request: SaveRequest, callback: Any):
|
||||
"""保存请求回调"""
|
||||
if callback and hasattr(callback, 'onSuccess'):
|
||||
callback.onSuccess()
|
||||
|
||||
def onConnected(self):
|
||||
"""服务已连接"""
|
||||
pass
|
||||
|
||||
def onDisconnected(self):
|
||||
"""服务已断开"""
|
||||
pass
|
||||
|
||||
def onUnbind(self, intent: Any) -> bool:
|
||||
return False
|
||||
|
||||
def toString(self) -> str:
|
||||
return f"AutofillService@{hex(id(self))}"
|
||||
|
||||
def hashCode(self) -> int:
|
||||
return id(self) & 0x7FFFFFFF
|
||||
|
||||
def equals(self, other) -> bool:
|
||||
return self is other
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# AutofillFieldClassificationService
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
class AutofillFieldClassificationService(Stub):
|
||||
"""AutofillFieldClassificationService — 自动填充字段分类服务"""
|
||||
|
||||
SERVICE_INTERFACE = (
|
||||
"android.service.autofill.AutofillFieldClassificationService"
|
||||
)
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
def onConnected(self):
|
||||
pass
|
||||
|
||||
def onDisconnected(self):
|
||||
pass
|
||||
|
||||
def onClassificationRequest(self, request: Any, callback: Any):
|
||||
if callback and hasattr(callback, 'onSuccess'):
|
||||
callback.onSuccess(None)
|
||||
|
||||
def toString(self) -> str:
|
||||
return f"AutofillFieldClassificationService@{hex(id(self))}"
|
||||
|
||||
def hashCode(self) -> int:
|
||||
return id(self) & 0x7FFFFFFF
|
||||
|
||||
def equals(self, other) -> bool:
|
||||
return self is other
|
||||
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# __all__
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
|
||||
__all__ = [
|
||||
"AutofillService",
|
||||
"FillRequest",
|
||||
"FillResponse",
|
||||
"SaveRequest",
|
||||
"SaveInfo",
|
||||
"Dataset",
|
||||
"AutofillFieldClassificationService",
|
||||
]
|
||||
Reference in new issue
Block a user