新增模块覆盖: 系统层 (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 行代码
423 lines
14 KiB
Python
423 lines
14 KiB
Python
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",
|
|
] |