Files
Android-pyApi/android_pyapi/android/service_autofill.py
T
shuiyu1123 506f9ac725 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 行代码
2026-06-24 12:00:28 +00:00

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",
]