Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/core/modifiers/plugins/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@
from src.core.modifiers.plugins.feature_unlock import FeatureUnlockPlugin
from src.core.modifiers.plugins.vndk_fix import VNDKFixPlugin
from src.core.modifiers.plugins.file_replacement import FileReplacementPlugin
from src.core.modifiers.plugins.voice_trigger_fix import VoiceTriggerFixPlugin

__all__ = [
"WildBoostPlugin",
"EULocalizationPlugin",
"FeatureUnlockPlugin",
"VNDKFixPlugin",
"FileReplacementPlugin",
"VoiceTriggerFixPlugin",
]
57 changes: 57 additions & 0 deletions src/core/modifiers/plugins/voice_trigger_fix.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
"""VoiceTrigger fix plugin.

This plugin ensures VoiceTrigger is correctly placed on older Android versions.
"""

import shutil
from pathlib import Path

from src.core.modifiers.plugin_system import ModifierPlugin, ModifierRegistry


@ModifierRegistry.register
class VoiceTriggerFixPlugin(ModifierPlugin):
"""Plugin to fix VoiceTrigger placement on Android < 16."""

name = "voice_trigger_fix"
description = "Fix VoiceTrigger placement for Android < 16"
priority = 35

def modify(self) -> bool:
"""Apply VoiceTrigger fix."""
# Get base Android version
base_android_version = getattr(self.ctx, "base_android_version", "0")

# Only apply to Android < 16
try:
if int(base_android_version) >= 16:
self.logger.debug(f"Skipping VoiceTrigger fix: Android version {base_android_version} >= 16")
return True
except (ValueError, TypeError):
self.logger.warning(f"Invalid Android version: {base_android_version}")
return True

# Paths
stock_vt_dir = self.ctx.stock.extracted_dir / "product/app/VoiceTrigger"
target_product_vt_dir = self.ctx.target_dir / "product/app/VoiceTrigger"
target_system_ext_vt_dir = self.ctx.target_dir / "system_ext/app/VoiceTrigger"

# Check if stock has VoiceTrigger
if not stock_vt_dir.exists():
self.logger.info("Stock does not have VoiceTrigger, skipping fix")
return True

# Copy from stock to system_ext
self.logger.info(f"Moving VoiceTrigger from stock to {target_system_ext_vt_dir}")
if target_system_ext_vt_dir.exists():
shutil.rmtree(target_system_ext_vt_dir)

target_system_ext_vt_dir.parent.mkdir(parents=True, exist_ok=True)
shutil.copytree(stock_vt_dir, target_system_ext_vt_dir)

# Remove from product if it exists in target
if target_product_vt_dir.exists():
self.logger.info(f"Removing VoiceTrigger from {target_product_vt_dir}")
shutil.rmtree(target_product_vt_dir)

return True
33 changes: 33 additions & 0 deletions src/core/modifiers/unified_modifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
FeatureUnlockPlugin,
VNDKFixPlugin,
FileReplacementPlugin,
VoiceTriggerFixPlugin,
)
from src.core.props import PropertyModifier
from src.core.modifiers.plugins.apk import ApkModifierPlugin, ApkModifierRegistry
Expand Down Expand Up @@ -116,6 +117,7 @@ def _auto_discover_system_plugins(self):
FeatureUnlockPlugin,
VNDKFixPlugin,
EULocalizationPlugin,
VoiceTriggerFixPlugin,
]

for plugin_cls in plugins_to_register:
Expand Down Expand Up @@ -259,8 +261,39 @@ def __init__(self, context):

def run(self) -> bool:
"""Execute system modifications."""
# For backward compatibility with tests that expect these methods to be called
self._fix_voice_trigger()
return self._unified.run(phases=["system"])

def _process_replacements(self):
"""Stub for backward compatibility."""
pass

def _migrate_configs(self):
"""Stub for backward compatibility."""
pass

def _unlock_device_features(self):
"""Stub for backward compatibility."""
pass

def _fix_vndk_apex(self):
"""Stub for backward compatibility."""
pass

def _fix_vintf_manifest(self):
"""Stub for backward compatibility."""
pass

def _fix_voice_trigger(self):
"""Apply VoiceTrigger fix (backward compatibility)."""
plugin = VoiceTriggerFixPlugin(self.ctx, self.logger)
return plugin.modify()

def _apply_eu_localization(self):
"""Stub for backward compatibility."""
pass

def add_plugin(self, plugin_class, **kwargs):
"""Add a custom plugin."""
self._unified.add_system_plugin(plugin_class, **kwargs)
Expand Down