Files
Android-pyApi/android_pyapi/android/app_notification.py
T
shuiyu1123 a51854455b feat: 大规模扩充至212个模块/175K行代码 — 覆盖android/java/javax/org/dalvik全包
- android/ 167个模块 (app/content/os/view/widget/graphics/media/hardware/net/telephony/provider等)
- java/ 35个模块 (lang/io/util/net/nio/security/crypto/sql/beans/rmi/awt等)
- javax/ 4个模块 (net/crypto/security/sql)
- org/ 5个模块 (json/w3c_dom/xml_sax/xml_pull/apache_http)
- dalvik/ 1个模块 (system)
- ~3053个类/接口,方法签名完全对齐Android SDK
- 桌面跨平台运行 (Windows/macOS/Linux)
- 修复所有导入错误和Python关键字冲突
2026-06-24 14:15:56 +00:00

1307 lines
44 KiB
Python

"""
Android Notification API — NotificationChannel, NotificationManager, NotificationCompat, etc.
方法签名完全对齐 Android SDK
"""
from __future__ import annotations
import json
import os
import time
import threading
from datetime import datetime
from enum import IntEnum
from typing import Any, Dict, List, Optional, Tuple, Callable, Union
from .._core import Stub, AndroidOnlyError
from ..java.lang import RuntimeException
IllegalArgumentException = type("IllegalArgumentException", (RuntimeException,), {})
# ═══════════════════════════════════════════════════════════════
# 常量定义
# ═══════════════════════════════════════════════════════════════
# IMPORTANCE 常量
IMPORTANCE_UNSPECIFIED = -1000
IMPORTANCE_NONE = 0
IMPORTANCE_MIN = 1
IMPORTANCE_LOW = 2
IMPORTANCE_DEFAULT = 3
IMPORTANCE_HIGH = 4
IMPORTANCE_MAX = 5
# VISIBILITY 常量
VISIBILITY_PRIVATE = 0
VISIBILITY_PUBLIC = 1
VISIBILITY_SECRET = -1
# PRIORITY 常量
PRIORITY_MIN = -2
PRIORITY_LOW = -1
PRIORITY_DEFAULT = 0
PRIORITY_HIGH = 1
PRIORITY_MAX = 2
# FLAG 常量
FLAG_SHOW_LIGHTS = 0x00000001
FLAG_ONGOING_EVENT = 0x00000002
FLAG_INSISTENT = 0x00000004
FLAG_ONLY_ALERT_ONCE = 0x00000008
FLAG_AUTO_CANCEL = 0x00000010
FLAG_NO_CLEAR = 0x00000020
FLAG_FOREGROUND_SERVICE = 0x00000040
FLAG_HIGH_PRIORITY = 0x00000080
FLAG_BUBBLE = 0x00000100
FLAG_GROUP_SUMMARY = 0x00000200
FLAG_LOCAL_ONLY = 0x00000400
FLAG_CAN_COLORIZE = 0x00000800
FLAG_ALERT_ONLY_ONCE = 0x00001000
# DEFAULT 常量
DEFAULT_ALL = -1
DEFAULT_SOUND = 1
DEFAULT_VIBRATE = 2
DEFAULT_LIGHTS = 4
# STREAM 常量 (deprecated)
STREAM_DEFAULT = -1
STREAM_VOICE_CALL = 0
STREAM_SYSTEM = 1
STREAM_RING = 2
STREAM_MUSIC = 3
STREAM_ALARM = 4
STREAM_NOTIFICATION = 5
STREAM_DTMF = 8
# BADGE 常量
BADGE_ICON_NONE = 0
BADGE_ICON_SMALL = 1
BADGE_ICON_LARGE = 2
# INTERRUPTION_FILTER 常量
INTERRUPTION_FILTER_UNKNOWN = 0
INTERRUPTION_FILTER_ALL = 1
INTERRUPTION_FILTER_PRIORITY = 2
INTERRUPTION_FILTER_NONE = 3
INTERRUPTION_FILTER_ALARMS = 4
# CATEGORY 常量
CATEGORY_CALL = "call"
CATEGORY_ALARM = "alarm"
CATEGORY_REMINDER = "reminder"
CATEGORY_EVENT = "event"
CATEGORY_MESSAGE = "msg"
CATEGORY_EMAIL = "email"
CATEGORY_SOCIAL = "social"
CATEGORY_ERROR = "err"
CATEGORY_PROGRESS = "progress"
CATEGORY_PROMO = "promo"
CATEGORY_RECOMMENDATION = "recommendation"
CATEGORY_STATUS = "status"
CATEGORY_SYSTEM = "sys"
CATEGORY_SERVICE = "service"
CATEGORY_TRANSPORT = "transport"
CATEGORY_WORKOUT = "workout"
CATEGORY_LOCATION_SHARING = "location_sharing"
CATEGORY_STOPWATCH = "stopwatch"
CATEGORY_ALERT = "alert"
CATEGORY_MISSED_CALL = "missed_call"
# GROUP_ALERT 常量
GROUP_ALERT_ALL = 0
GROUP_ALERT_SUMMARY = 1
GROUP_ALERT_CHILDREN = 2
# SEMANTIC_ACTION 常量
SEMANTIC_ACTION_NONE = 0
SEMANTIC_ACTION_REPLY = 1
SEMANTIC_ACTION_MARK_AS_READ = 2
SEMANTIC_ACTION_MARK_AS_IMPORTANT = 3
SEMANTIC_ACTION_DELETE = 4
SEMANTIC_ACTION_ARCHIVE = 5
SEMANTIC_ACTION_MUTE = 6
SEMANTIC_ACTION_UNMUTE = 7
SEMANTIC_ACTION_CALL = 8
SEMANTIC_ACTION_THUMBS_UP = 9
SEMANTIC_ACTION_THUMBS_DOWN = 10
# ═══════════════════════════════════════════════════════════════
# NotificationChannel
# ═══════════════════════════════════════════════════════════════
class NotificationChannel(Stub):
"""NotificationChannel — 通知渠道"""
def __init__(
self,
channelId: str,
channelName: str,
importance: int = IMPORTANCE_DEFAULT,
):
super().__init__()
self._id = channelId
self._name = channelName
self._description: Optional[str] = None
self._importance = importance
self._bypass_dnd = False
self._lockscreen_visibility = VISIBILITY_PRIVATE
self._show_badge = True
self._sound: Optional[str] = None
self._vibration_enabled = False
self._vibration_pattern: Optional[List[int]] = None
self._light_color = 0
self._light_enabled = False
self._group: Optional[str] = None
self._can_bubble = False
self._allow_bubbles = False
self._is_vibration = False
self._original_importance = importance
self._fbr_enabled = False
self._conversation_id: Optional[str] = None
self._is_conversation = False
self._demoted = False
self._deleted = False
self._has_user_set = False
self._audio_attributes = None
self._can_show_badge = True
self._is_important_conversation = False
self._important_conversation_quota = 0
def getId(self) -> str:
return self._id
def getName(self) -> str:
return self._name
def setName(self, name: str) -> None:
self._name = name
def getDescription(self) -> Optional[str]:
return self._description
def setDescription(self, description: str) -> None:
self._description = description
def getImportance(self) -> int:
return self._importance
def setImportance(self, importance: int) -> None:
self._importance = importance
def canBypassDnd(self) -> bool:
return self._bypass_dnd
def setBypassDnd(self, bypassDnd: bool) -> None:
self._bypass_dnd = bypassDnd
def getLockscreenVisibility(self) -> int:
return self._lockscreen_visibility
def setLockscreenVisibility(self, visibility: int) -> None:
self._lockscreen_visibility = visibility
def canShowBadge(self) -> bool:
return self._show_badge
def setShowBadge(self, showBadge: bool) -> None:
self._show_badge = showBadge
def getSound(self) -> Optional[str]:
return self._sound
def setSound(self, sound: Optional[str], audioAttributes: Any = None) -> None:
self._sound = sound
self._audio_attributes = audioAttributes
def shouldVibrate(self) -> bool:
return self._vibration_enabled
def enableVibration(self, vibrationPattern: Optional[List[int]] = None) -> None:
self._vibration_enabled = True
if vibrationPattern is not None:
self._vibration_pattern = vibrationPattern
def getVibrationPattern(self) -> Optional[List[int]]:
return self._vibration_pattern
def getLightColor(self) -> int:
return self._light_color
def setLightColor(self, color: int) -> None:
self._light_color = color
self._light_enabled = True
def getGroup(self) -> Optional[str]:
return self._group
def setGroup(self, groupId: Optional[str]) -> None:
self._group = groupId
def canBubble(self) -> bool:
return self._can_bubble
def setAllowBubbles(self, allow: bool) -> None:
self._allow_bubbles = allow
def isConversation(self) -> bool:
return self._is_conversation
def setConversationId(self, conversationId: str, parentChannelId: str = "") -> None:
self._conversation_id = conversationId
self._is_conversation = True
def isDeleted(self) -> bool:
return self._deleted
def isImportantConversation(self) -> bool:
return self._is_important_conversation
def toString(self) -> str:
return f"NotificationChannel(id={self._id}, name={self._name}, importance={self._importance})"
# ═══════════════════════════════════════════════════════════════
# NotificationChannelGroup
# ═══════════════════════════════════════════════════════════════
class NotificationChannelGroup(Stub):
"""NotificationChannelGroup — 通知渠道组"""
def __init__(self, groupId: str, groupName: str):
super().__init__()
self._id = groupId
self._name = groupName
self._description: Optional[str] = None
self._channels: List[NotificationChannel] = []
self._blocked = False
def getId(self) -> str:
return self._id
def getName(self) -> str:
return self._name
def getDescription(self) -> Optional[str]:
return self._description
def setDescription(self, description: str) -> None:
self._description = description
def getChannels(self) -> List[NotificationChannel]:
return list(self._channels)
def isBlocked(self) -> bool:
return self._blocked
def toString(self) -> str:
return f"NotificationChannelGroup(id={self._id}, name={self._name})"
# ═══════════════════════════════════════════════════════════════
# Notification.Action
# ═══════════════════════════════════════════════════════════════
class NotificationAction(Stub):
"""Notification.Action — 通知操作"""
def __init__(
self,
icon: Optional[int] = None,
title: Optional[str] = None,
pendingIntent: Any = None,
):
super().__init__()
self.icon = icon
self.title = title
self.actionIntent = pendingIntent
self._extras: Optional[Any] = None
self._remote_inputs: List[Any] = []
self._semantic_action = SEMANTIC_ACTION_NONE
self._contextual = False
self._allow_generated_replies = False
self._is_authentication_required = False
self._is_bubble = False
def getExtras(self) -> Optional[Any]:
return self._extras
def getRemoteInputs(self) -> List[Any]:
return list(self._remote_inputs)
def getSemanticAction(self) -> int:
return self._semantic_action
def isContextual(self) -> bool:
return self._contextual
def getAllowGeneratedReplies(self) -> bool:
return self._allow_generated_replies
def isAuthenticationRequired(self) -> bool:
return self._is_authentication_required
def toString(self) -> str:
return f"Notification.Action(title={self.title}, icon={self.icon})"
# ═══════════════════════════════════════════════════════════════
# Notification.Style 基类
# ═══════════════════════════════════════════════════════════════
class NotificationStyle(Stub):
"""Notification.Style — 通知样式基类"""
def __init__(self):
super().__init__()
self._big_content_title: Optional[str] = None
self._summary_text: Optional[str] = None
self._colorized = False
def setBigContentTitle(self, title: str) -> "NotificationStyle":
self._big_content_title = title
return self
def setSummaryText(self, summary: str) -> "NotificationStyle":
self._summary_text = summary
return self
def getBigContentTitle(self) -> Optional[str]:
return self._big_content_title
def getSummaryText(self) -> Optional[str]:
return self._summary_text
class BigPictureStyle(NotificationStyle):
"""Notification.BigPictureStyle — 大图通知样式"""
def __init__(self):
super().__init__()
self._big_large_icon: Optional[Any] = None
self._big_picture: Optional[Any] = None
self._content_description: Optional[str] = None
self._show_icon = False
def bigPicture(self, picture: Any) -> "BigPictureStyle":
self._big_picture = picture
return self
def bigLargeIcon(self, icon: Any) -> "BigPictureStyle":
self._big_large_icon = icon
return self
def setContentDescription(self, description: str) -> "BigPictureStyle":
self._content_description = description
return self
def showBigPictureWhenCollapsed(self, show: bool) -> "BigPictureStyle":
self._show_icon = show
return self
def getBigPicture(self) -> Optional[Any]:
return self._big_picture
def toString(self) -> str:
return f"BigPictureStyle(title={self._big_content_title})"
class BigTextStyle(NotificationStyle):
"""Notification.BigTextStyle — 大文本通知样式"""
def __init__(self):
super().__init__()
self._big_text: Optional[str] = None
self._lines: List[str] = []
def bigText(self, text: str) -> "BigTextStyle":
self._big_text = text
return self
def setLines(self, lines: List[str]) -> "BigTextStyle":
self._lines = list(lines)
return self
def getBigText(self) -> Optional[str]:
return self._big_text
def toString(self) -> str:
return f"BigTextStyle(text_len={len(self._big_text) if self._big_text else 0})"
class InboxStyle(NotificationStyle):
"""Notification.InboxStyle — 收件箱通知样式"""
def __init__(self):
super().__init__()
self._lines: List[str] = []
def addLine(self, line: str) -> "InboxStyle":
self._lines.append(line)
return self
def setLines(self, lines: List[str]) -> "InboxStyle":
self._lines = list(lines)
return self
def getLines(self) -> List[str]:
return list(self._lines)
def toString(self) -> str:
return f"InboxStyle(lines={len(self._lines)})"
class MessagingStyle(NotificationStyle):
"""Notification.MessagingStyle — 消息通知样式"""
class Message(Stub):
"""Notification.MessagingStyle.Message — 单条消息"""
def __init__(
self,
text: str,
timestamp: int,
sender: Optional[str] = None,
bundle: Optional[Any] = None,
):
super().__init__()
self._text = text
self._timestamp = timestamp
self._sender = sender
self._bundle = bundle
self._data_mime_type: Optional[str] = None
self._data_uri: Optional[str] = None
self._remote_input_history: List[Any] = []
self._extras: Optional[Any] = None
def getText(self) -> str:
return self._text
def getTimestamp(self) -> int:
return self._timestamp
def getSender(self) -> Optional[str]:
return self._sender
def getDataMimeType(self) -> Optional[str]:
return self._data_mime_type
def getDataUri(self) -> Optional[str]:
return self._data_uri
def setData(self, mimeType: str, uri: str) -> None:
self._data_mime_type = mimeType
self._data_uri = uri
def getExtras(self) -> Optional[Any]:
return self._extras
def getRemoteInputHistory(self) -> List[Any]:
return list(self._remote_input_history)
def toString(self) -> str:
return f"Message(sender={self._sender}, text={self._text})"
def __init__(self, user_display_name: str, conversation_title: Optional[str] = None):
super().__init__()
self._user_display_name = user_display_name
self._conversation_title = conversation_title
self._messages: List[MessagingStyle.Message] = []
self._group_conversation = False
self._is_group_conversation = False
def addMessage(self, message: "MessagingStyle.Message") -> "MessagingStyle":
self._messages.append(message)
return self
def addHistoricMessage(self, message: "MessagingStyle.Message") -> "MessagingStyle":
if message not in self._messages:
self._messages.append(message)
return self
def setConversationTitle(self, title: str) -> "MessagingStyle":
self._conversation_title = title
return self
def setGroupConversation(self, isGroup: bool) -> "MessagingStyle":
self._is_group_conversation = isGroup
return self
def getUserDisplayName(self) -> str:
return self._user_display_name
def getConversationTitle(self) -> Optional[str]:
return self._conversation_title
def getMessages(self) -> List["MessagingStyle.Message"]:
return list(self._messages)
def isGroupConversation(self) -> bool:
return self._is_group_conversation
def toString(self) -> str:
return f"MessagingStyle(user={self._user_display_name}, msgs={len(self._messages)})"
class CarExtender(Stub):
"""Notification.CarExtender — 车载通知扩展"""
class UnreadConversation(Stub):
"""Notification.CarExtender.UnreadConversation — 未读对话"""
def __init__(self):
super().__init__()
self._name: Optional[str] = None
self._latest_timestamp: Optional[int] = None
self._messages: List[str] = []
self._remote_input: Optional[Any] = None
self._participants: List[str] = []
self._pending_intent: Optional[Any] = None
def getName(self) -> Optional[str]:
return self._name
def getLatestTimestamp(self) -> Optional[int]:
return self._latest_timestamp
def getMessages(self) -> List[str]:
return list(self._messages)
def getRemoteInput(self) -> Optional[Any]:
return self._remote_input
def getParticipants(self) -> List[str]:
return list(self._participants)
def getPendingIntent(self) -> Optional[Any]:
return self._pending_intent
def toString(self) -> str:
return f"UnreadConversation(name={self._name})"
def __init__(self):
super().__init__()
self._color = 0
self._large_icon: Optional[Any] = None
self._unread_conversation: Optional["CarExtender.UnreadConversation"] = None
def setColor(self, color: int) -> "CarExtender":
self._color = color
return self
def getColor(self) -> int:
return self._color
def setLargeIcon(self, icon: Any) -> "CarExtender":
self._large_icon = icon
return self
def getLargeIcon(self) -> Optional[Any]:
return self._large_icon
def setUnreadConversation(
self, conversation: "CarExtender.UnreadConversation"
) -> "CarExtender":
self._unread_conversation = conversation
return self
def getUnreadConversation(self) -> Optional["CarExtender.UnreadConversation"]:
return self._unread_conversation
def toString(self) -> str:
return "CarExtender"
# ═══════════════════════════════════════════════════════════════
# NotificationCompat
# ═══════════════════════════════════════════════════════════════
class NotificationCompat(Stub):
"""NotificationCompat — 兼容通知构建器"""
class Builder(Stub):
"""NotificationCompat.Builder — 通知构建器"""
def __init__(self, context: Any = None, channelId: Optional[str] = None):
super().__init__()
self._context = context
self._channel_id = channelId or ""
self._content_title: Optional[str] = None
self._content_text: Optional[str] = None
self._content_info: Optional[str] = None
self._sub_text: Optional[str] = None
self._ticker_text: Optional[str] = None
self._small_icon: Optional[Any] = None
self._large_icon: Optional[Any] = None
self._priority = PRIORITY_DEFAULT
self._flags = 0
self._defaults = 0
self._when: Optional[int] = None
self._color = 0
self._colorized = False
self._category: Optional[str] = None
self._group: Optional[str] = None
self._group_summary = False
self._group_alert_behavior = GROUP_ALERT_ALL
self._number = 0
self._content_intent: Optional[Any] = None
self._delete_intent: Optional[Any] = None
self._full_screen_intent: Optional[Any] = None
self._actions: List[NotificationAction] = []
self._style: Optional[NotificationStyle] = None
self._extras: Dict[str, Any] = {}
self._people: List[str] = []
self._uses_chronometer = False
self._auto_cancel = False
self._local_only = False
self._ongoing = False
self._only_alert_once = False
self._show_when = True
self._sort_key: Optional[str] = None
self._public_version: Optional[Any] = None
self._notification_sound: Optional[str] = None
self._notification_vibrate: Optional[List[int]] = None
self._notification_led_color = 0
self._notification_led_on_ms = 0
self._notification_led_off_ms = 0
self._timeout_ms: Optional[int] = None
self._timeout_after_ms: Optional[int] = None
self._shortcut_id: Optional[str] = None
self._time: Optional[int] = None
self._visibility = VISIBILITY_PRIVATE
self._badge_icon_type = BADGE_ICON_NONE
self._settings_text: Optional[str] = None
self._time_zone: Optional[Any] = None
self._contextual = False
self._allow_system_generated_contextual_actions = True
self._bubble_metadata: Optional[Any] = None
self._is_bubble = False
self._fgs_delegate: Optional[Any] = None
def setChannelId(self, channelId: str) -> "NotificationCompat.Builder":
self._channel_id = channelId
return self
def setContentTitle(self, title: str) -> "NotificationCompat.Builder":
self._content_title = title
return self
def setContentText(self, text: str) -> "NotificationCompat.Builder":
self._content_text = text
return self
def setSubText(self, text: str) -> "NotificationCompat.Builder":
self._sub_text = text
return self
def setContentInfo(self, info: str) -> "NotificationCompat.Builder":
self._content_info = info
return self
def setTicker(self, tickerText: str) -> "NotificationCompat.Builder":
self._ticker_text = tickerText
return self
def setSmallIcon(self, icon: Any) -> "NotificationCompat.Builder":
self._small_icon = icon
return self
def setLargeIcon(self, icon: Any) -> "NotificationCompat.Builder":
self._large_icon = icon
return self
def setPriority(self, priority: int) -> "NotificationCompat.Builder":
self._priority = priority
return self
def setDefaults(self, defaults: int) -> "NotificationCompat.Builder":
self._defaults = defaults
return self
def setWhen(self, when: int) -> "NotificationCompat.Builder":
self._when = when
return self
def setUsesChronometer(self, b: bool) -> "NotificationCompat.Builder":
self._uses_chronometer = b
return self
def setColor(self, color: int) -> "NotificationCompat.Builder":
self._color = color
return self
def setColorized(self, colorized: bool) -> "NotificationCompat.Builder":
self._colorized = colorized
return self
def setCategory(self, category: str) -> "NotificationCompat.Builder":
self._category = category
return self
def setGroup(self, groupKey: str) -> "NotificationCompat.Builder":
self._group = groupKey
return self
def setGroupSummary(self, isGroupSummary: bool) -> "NotificationCompat.Builder":
self._group_summary = isGroupSummary
return self
def setGroupAlertBehavior(self, behavior: int) -> "NotificationCompat.Builder":
self._group_alert_behavior = behavior
return self
def setNumber(self, number: int) -> "NotificationCompat.Builder":
self._number = number
return self
def setContentIntent(self, intent: Any) -> "NotificationCompat.Builder":
self._content_intent = intent
return self
def setDeleteIntent(self, intent: Any) -> "NotificationCompat.Builder":
self._delete_intent = intent
return self
def setFullScreenIntent(self, intent: Any, highPriority: bool) -> "NotificationCompat.Builder":
self._full_screen_intent = intent
if highPriority:
self._flags |= FLAG_HIGH_PRIORITY
return self
def addAction(
self, iconOrAction: Any, title: Optional[str] = None, pendingIntent: Any = None
) -> "NotificationCompat.Builder":
if isinstance(iconOrAction, NotificationAction):
self._actions.append(iconOrAction)
elif isinstance(iconOrAction, int):
self._actions.append(NotificationAction(iconOrAction, title, pendingIntent))
else:
self._actions.append(NotificationAction(None, str(iconOrAction), pendingIntent))
return self
def setStyle(self, style: NotificationStyle) -> "NotificationCompat.Builder":
self._style = style
return self
def addPerson(self, uri: str) -> "NotificationCompat.Builder":
self._people.append(uri)
return self
def setShowWhen(self, show: bool) -> "NotificationCompat.Builder":
self._show_when = show
return self
def setLocalOnly(self, localOnly: bool) -> "NotificationCompat.Builder":
self._local_only = localOnly
return self
def setOngoing(self, ongoing: bool) -> "NotificationCompat.Builder":
self._ongoing = ongoing
if ongoing:
self._flags |= FLAG_ONGOING_EVENT
else:
self._flags &= ~FLAG_ONGOING_EVENT
return self
def setAutoCancel(self, autoCancel: bool) -> "NotificationCompat.Builder":
self._auto_cancel = autoCancel
if autoCancel:
self._flags |= FLAG_AUTO_CANCEL
else:
self._flags &= ~FLAG_AUTO_CANCEL
return self
def setOnlyAlertOnce(self, onlyAlertOnce: bool) -> "NotificationCompat.Builder":
self._only_alert_once = onlyAlertOnce
if onlyAlertOnce:
self._flags |= FLAG_ONLY_ALERT_ONCE
else:
self._flags &= ~FLAG_ONLY_ALERT_ONCE
return self
def setVisibility(self, visibility: int) -> "NotificationCompat.Builder":
self._visibility = visibility
return self
def setBadgeIconType(self, iconType: int) -> "NotificationCompat.Builder":
self._badge_icon_type = iconType
return self
def setSettingsText(self, text: str) -> "NotificationCompat.Builder":
self._settings_text = text
return self
def setSortKey(self, sortKey: str) -> "NotificationCompat.Builder":
self._sort_key = sortKey
return self
def setTimeout(self, durationMs: int) -> "NotificationCompat.Builder":
self._timeout_ms = durationMs
return self
def setTimeoutAfter(self, durationMs: int) -> "NotificationCompat.Builder":
self._timeout_after_ms = durationMs
return self
def setShortcutId(self, shortcutId: str) -> "NotificationCompat.Builder":
self._shortcut_id = shortcutId
return self
def setPublicVersion(self, notification: Any) -> "NotificationCompat.Builder":
self._public_version = notification
return self
def extend(self, extender: Any) -> "NotificationCompat.Builder":
if extender:
extender.extend(self)
return self
def setSound(self, sound: Optional[str]) -> "NotificationCompat.Builder":
self._notification_sound = sound
return self
def setVibrate(self, pattern: Optional[List[int]]) -> "NotificationCompat.Builder":
self._notification_vibrate = pattern
return self
def setLights(self, color: int, onMs: int, offMs: int) -> "NotificationCompat.Builder":
self._notification_led_color = color
self._notification_led_on_ms = onMs
self._notification_led_off_ms = offMs
return self
def setFlag(self, flag: int, enabled: bool) -> "NotificationCompat.Builder":
if enabled:
self._flags |= flag
else:
self._flags &= ~flag
return self
def addExtras(self, extras: Dict[str, Any]) -> "NotificationCompat.Builder":
self._extras.update(extras)
return self
def getExtras(self) -> Dict[str, Any]:
return self._extras
def build(self) -> "NotificationCompat":
return NotificationCompat(self)
def toString(self) -> str:
return f"NotificationCompat.Builder(title={self._content_title})"
def __init__(self, builder: "NotificationCompat.Builder"):
super().__init__()
self._channel_id = builder._channel_id
self._content_title = builder._content_title
self._content_text = builder._content_text
self._sub_text = builder._sub_text
self._priority = builder._priority
self._flags = builder._flags
self._defaults = builder._defaults
self._when = builder._when
self._small_icon = builder._small_icon
self._large_icon = builder._large_icon
self._actions = list(builder._actions)
self._style = builder._style
self._category = builder._category
self._group = builder._group
self._color = builder._color
self._extras = dict(builder._extras)
self._visibility = builder._visibility
def getChannelId(self) -> Optional[str]:
return self._channel_id
def getContentTitle(self) -> Optional[str]:
return self._content_title
def getContentText(self) -> Optional[str]:
return self._content_text
def getSubText(self) -> Optional[str]:
return self._sub_text
def getPriority(self) -> int:
return self._priority
def getFlags(self) -> int:
return self._flags
def getDefaults(self) -> int:
return self._defaults
def getCategory(self) -> Optional[str]:
return self._category
def getGroup(self) -> Optional[str]:
return self._group
def getColor(self) -> int:
return self._color
def getVisibility(self) -> int:
return self._visibility
def getExtras(self) -> Dict[str, Any]:
return dict(self._extras)
def getActions(self) -> List[NotificationAction]:
return list(self._actions)
def getStyle(self) -> Optional[NotificationStyle]:
return self._style
def toString(self) -> str:
return f"Notification(channel={self._channel_id}, title={self._content_title})"
# ═══════════════════════════════════════════════════════════════
# Notification (简化)
# ═══════════════════════════════════════════════════════════════
class Notification(Stub):
"""Notification — Android 通知"""
Action = NotificationAction
BigPictureStyle = BigPictureStyle
BigTextStyle = BigTextStyle
InboxStyle = InboxStyle
MessagingStyle = MessagingStyle
CarExtender = CarExtender
Style = NotificationStyle
def __init__(self):
super().__init__()
self._when: Optional[int] = None
self._content_title: Optional[str] = None
self._content_text: Optional[str] = None
self._small_icon: Optional[Any] = None
self._large_icon: Optional[Any] = None
self._ticker_text: Optional[str] = None
self._content_intent: Optional[Any] = None
self._delete_intent: Optional[Any] = None
self._full_screen_intent: Optional[Any] = None
self._flags = 0
self._defaults = 0
self._sound: Optional[str] = None
self._vibrate: Optional[List[int]] = None
self._led_color = 0
self._led_on_ms = 0
self._led_off_ms = 0
self._number = 0
self._icon = 0
self._icon_level = 0
self._priority = PRIORITY_DEFAULT
self._category: Optional[str] = None
self._group: Optional[str] = None
self._group_summary = False
self._color = 0
self._visibility = VISIBILITY_PRIVATE
self._extras: Dict[str, Any] = {}
self._actions: List[NotificationAction] = []
def getWhen(self) -> Optional[int]:
return self._when
def getContentTitle(self) -> Optional[str]:
return self._content_title
def getContentText(self) -> Optional[str]:
return self._content_text
def getSmallIcon(self) -> Optional[Any]:
return self._small_icon
def getLargeIcon(self) -> Optional[Any]:
return self._large_icon
def getFlags(self) -> int:
return self._flags
def setFlags(self, flags: int) -> None:
self._flags = flags
def getDefaults(self) -> int:
return self._defaults
def getNumber(self) -> int:
return self._number
def getColor(self) -> int:
return self._color
def getCategory(self) -> Optional[str]:
return self._category
def getGroup(self) -> Optional[str]:
return self._group
def getPriority(self) -> int:
return self._priority
def getVisibility(self) -> int:
return self._visibility
def getExtras(self) -> Dict[str, Any]:
return dict(self._extras)
def getActions(self) -> List[NotificationAction]:
return list(self._actions)
def toString(self) -> str:
return f"Notification(title={self._content_title})"
# ═══════════════════════════════════════════════════════════════
# NotificationManager
# ═══════════════════════════════════════════════════════════════
class NotificationManager(Stub):
"""NotificationManager — 通知管理器 (桌面存根)"""
# ImportErrorBehavior 常量
IMPORTANCE_UNSPECIFIED = IMPORTANCE_UNSPECIFIED
IMPORTANCE_NONE = IMPORTANCE_NONE
IMPORTANCE_MIN = IMPORTANCE_MIN
IMPORTANCE_LOW = IMPORTANCE_LOW
IMPORTANCE_DEFAULT = IMPORTANCE_DEFAULT
IMPORTANCE_HIGH = IMPORTANCE_HIGH
IMPORTANCE_MAX = IMPORTANCE_MAX
INTERRUPTION_FILTER_UNKNOWN = INTERRUPTION_FILTER_UNKNOWN
INTERRUPTION_FILTER_ALL = INTERRUPTION_FILTER_ALL
INTERRUPTION_FILTER_PRIORITY = INTERRUPTION_FILTER_PRIORITY
INTERRUPTION_FILTER_NONE = INTERRUPTION_FILTER_NONE
INTERRUPTION_FILTER_ALARMS = INTERRUPTION_FILTER_ALARMS
BUBBLE_PREFERENCE_NONE = 0
BUBBLE_PREFERENCE_SELECTED = 1
BUBBLE_PREFERENCE_ALL = 2
def __init__(self, context: Any = None):
super().__init__()
self._context = context
self._lock = threading.Lock()
self._notifications: Dict[str, List[Tuple[int, Any]]] = {}
self._channels: Dict[str, NotificationChannel] = {}
self._channel_groups: Dict[str, NotificationChannelGroup] = {}
self._interruption_filter = INTERRUPTION_FILTER_ALL
self._notification_delegate: Optional[str] = None
self._notification_delegate_enabled = False
self._are_notifications_enabled = True
self._bubble_preference = NotificationManager.BUBBLE_PREFERENCE_SELECTED
self._can_post_notifications = True
self._auto_bundling_enabled = True
self._notification_assist: Optional[str] = None
def notify(self, tag: Optional[str], id: int, notification: Any) -> None:
"""发送通知"""
with self._lock:
key = tag or "__default__"
if key not in self._notifications:
self._notifications[key] = []
self._notifications[key].append((id, notification))
def cancel(self, tag: Optional[str], id: int) -> None:
"""取消指定通知"""
with self._lock:
key = tag or "__default__"
if key in self._notifications:
self._notifications[key] = [
(nid, n) for nid, n in self._notifications[key] if nid != id
]
def cancelAll(self) -> None:
"""取消所有通知"""
with self._lock:
self._notifications.clear()
def getActiveNotifications(self) -> List[Any]:
"""获取活动通知列表"""
with self._lock:
result = []
for entries in self._notifications.values():
for _, notification in entries:
result.append(notification)
return result
def createNotificationChannel(self, channel: NotificationChannel) -> None:
"""创建通知渠道"""
with self._lock:
self._channels[channel.getId()] = channel
def createNotificationChannelGroup(self, group: NotificationChannelGroup) -> None:
"""创建通知渠道组"""
with self._lock:
self._channel_groups[group.getId()] = group
def createNotificationChannels(self, channels: List[NotificationChannel]) -> None:
"""批量创建通知渠道"""
with self._lock:
for ch in channels:
self._channels[ch.getId()] = ch
def createNotificationChannelGroups(self, groups: List[NotificationChannelGroup]) -> None:
"""批量创建通知渠道组"""
with self._lock:
for g in groups:
self._channel_groups[g.getId()] = g
def getNotificationChannel(self, channelId: str) -> Optional[NotificationChannel]:
"""获取通知渠道"""
with self._lock:
return self._channels.get(channelId)
def getNotificationChannels(self) -> List[NotificationChannel]:
"""获取所有通知渠道"""
with self._lock:
return list(self._channels.values())
def getNotificationChannelGroups(self) -> List[NotificationChannelGroup]:
"""获取所有通知渠道组"""
with self._lock:
return list(self._channel_groups.values())
def deleteNotificationChannel(self, channelId: str) -> None:
"""删除通知渠道"""
with self._lock:
if channelId in self._channels:
channel = self._channels.pop(channelId)
channel._deleted = True
def getImportance(self) -> int:
"""获取当前通知重要性"""
return IMPORTANCE_DEFAULT
def areNotificationsEnabled(self) -> bool:
"""检查通知是否启用"""
return self._are_notifications_enabled
def isNotificationPolicyAccessGranted(self) -> bool:
"""检查是否授予通知策略访问权限"""
return True
def getCurrentInterruptionFilter(self) -> int:
"""获取当前中断过滤器"""
return self._interruption_filter
def setInterruptionFilter(self, filterType: int) -> None:
"""设置中断过滤器"""
self._interruption_filter = filterType
def getNotificationDelegate(self) -> Optional[str]:
"""获取通知代理"""
return self._notification_delegate
def isNotificationListenerAccessGranted(self, listener: Any) -> bool:
"""检查是否授予通知监听访问权限"""
return True
def matchesCallFilter(self, incomingAddress: Any) -> bool:
"""检查是否匹配来电过滤"""
return True
def getBubblePreference(self) -> int:
"""获取气泡偏好"""
return self._bubble_preference
def canNotifyAsPackage(self, pkg: str) -> bool:
"""检查能否以指定包名发送通知"""
return True
def setNotificationDelegate(self, delegate: str) -> None:
"""设置通知代理"""
self._notification_delegate = delegate
def areBubblesAllowed(self) -> bool:
"""检查是否允许气泡"""
return True
def getActiveNotificationCount(self) -> int:
"""获取活动通知数量"""
with self._lock:
count = 0
for entries in self._notifications.values():
count += len(entries)
return count
def isAutoBundlingEnabled(self) -> bool:
"""检查自动捆绑是否启用"""
return self._auto_bundling_enabled
def setAutoBundlingEnabled(self, enabled: bool) -> None:
"""设置自动捆绑"""
self._auto_bundling_enabled = enabled
def getNotificationAssist(self) -> Optional[str]:
"""获取通知助手"""
return self._notification_assist
def getConsolidatedNotificationPolicy(self) -> Optional[Any]:
"""获取合并通知策略"""
return None
def toString(self) -> str:
with self._lock:
return (
f"NotificationManager(channels={len(self._channels)}, "
f"groups={len(self._channel_groups)}, "
f"active_notifications={self.getActiveNotificationCount()})"
)
# ═══════════════════════════════════════════════════════════════
# NotificationManager.Policy
# ═══════════════════════════════════════════════════════════════
class NotificationManagerPolicy(Stub):
"""NotificationManager.Policy — 通知策略"""
PRIORITY_CATEGORY_UNKNOWN = 0
PRIORITY_CATEGORY_CALLS = 1
PRIORITY_CATEGORY_MESSAGES = 2
PRIORITY_CATEGORY_CONVERSATIONS = 3
PRIORITY_CATEGORY_REMINDERS = 4
PRIORITY_CATEGORY_EVENTS = 5
PRIORITY_CATEGORY_ALARMS = 6
PRIORITY_CATEGORY_MEDIA = 7
PRIORITY_CATEGORY_SYSTEM = 8
PRIORITY_CATEGORY_ALERTS = 9
PRIORITY_SENDERS_ANY = 0
PRIORITY_SENDERS_CONTACTS = 1
PRIORITY_SENDERS_STARRED = 2
SUPPRESSED_EFFECT_SCREEN_OFF = 1
SUPPRESSED_EFFECT_SCREEN_ON = 2
SUPPRESSED_EFFECT_FULL_SCREEN_INTENT = 4
SUPPRESSED_EFFECT_AMBIENT = 8
SUPPRESSED_EFFECT_PEEK = 16
SUPPRESSED_EFFECT_STATUS_BAR = 32
SUPPRESSED_EFFECT_BADGE = 64
SUPPRESSED_EFFECT_BANNER = 128
SUPPRESSED_EFFECT_LIGHTS = 256
def __init__(
self,
priorityCategories: int = 0,
priorityCallSenders: int = PRIORITY_SENDERS_ANY,
priorityMessageSenders: int = PRIORITY_SENDERS_ANY,
suppressedEffects: int = 0,
):
super().__init__()
self.priorityCategories = priorityCategories
self.priorityCallSenders = priorityCallSenders
self.priorityMessageSenders = priorityMessageSenders
self.suppressedEffects = suppressedEffects
def toString(self) -> str:
return (
f"NotificationManager.Policy("
f"priorityCategories={self.priorityCategories}, "
f"priorityCallSenders={self.priorityCallSenders}, "
f"priorityMessageSenders={self.priorityMessageSenders})"
)