From 5522eb16acbd838d641c63b5bfe43dda2f752f1c Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Thu, 12 Dec 2024 13:19:15 -0500 Subject: [PATCH 1/4] fix mobilegestalt tweaks not applying + optimize tweak options --- gui/main_window.py | 4 ++-- tweaks/eligibility_tweak.py | 11 ++++----- tweaks/tweak_classes.py | 46 +++++++++++++++---------------------- tweaks/tweaks.py | 32 +++++++++++--------------- 4 files changed, 38 insertions(+), 55 deletions(-) diff --git a/gui/main_window.py b/gui/main_window.py index 60f3e03..eeaa1b0 100644 --- a/gui/main_window.py +++ b/gui/main_window.py @@ -18,8 +18,8 @@ from tweaks.tweaks import tweaks from tweaks.custom_gestalt_tweaks import CustomGestaltTweaks, ValueTypeStrings from tweaks.daemons_tweak import Daemon -App_Version = "4.2" -App_Build = 0 +App_Version = "4.2.1" +App_Build = 1 class Page(Enum): Home = 0 diff --git a/tweaks/eligibility_tweak.py b/tweaks/eligibility_tweak.py index 4c9d950..943534f 100644 --- a/tweaks/eligibility_tweak.py +++ b/tweaks/eligibility_tweak.py @@ -1,4 +1,4 @@ -from .tweak_classes import Tweak, TweakModifyType +from .tweak_classes import Tweak from Sparserestore.restore import FileToRestore from devicemanagement.constants import Version @@ -22,11 +22,8 @@ def replace_region_code(plist_path: str, original_code: str = "US", new_code: st return plistlib.dumps(updated_plist_data) class EligibilityTweak(Tweak): - def __init__( - self, - min_version: Version = Version("1.0") - ): - super().__init__(key=None, value=["Method 1", "Method 2"], edit_type=TweakModifyType.PICKER, min_version=min_version) + def __init__(self): + super().__init__(key=None, value=["Method 1", "Method 2"]) self.code = "US" self.method = 0 # between 0 and 1 @@ -89,7 +86,7 @@ class EligibilityTweak(Tweak): class AITweak(Tweak): def __init__(self): - super().__init__(key=None, value="", min_version=Version("18.1")) + super().__init__(key=None, value="") def set_language_code(self, lang: str): self.value = lang diff --git a/tweaks/tweak_classes.py b/tweaks/tweak_classes.py index bd5e5f5..2382c9d 100644 --- a/tweaks/tweak_classes.py +++ b/tweaks/tweak_classes.py @@ -2,24 +2,15 @@ from enum import Enum from devicemanagement.constants import Version from .basic_plist_locations import FileLocation -class TweakModifyType(Enum): - TOGGLE = 1 - TEXT = 2 - PICKER = 3 - class Tweak: def __init__( self, key: str, value: any = 1, - edit_type: TweakModifyType = TweakModifyType.TOGGLE, - min_version: Version = Version("1.0"), owner: int = 501, group: int = 501 ): self.key = key self.value = value - self.min_version = min_version - self.edit_type = edit_type self.owner = owner self.group = group self.enabled = False @@ -33,9 +24,6 @@ class Tweak: if toggle_enabled: self.enabled = True - def is_compatible(self, device_ver: str): - return Version(device_ver) >= self.min_version - def apply_tweak(self): raise NotImplementedError @@ -43,10 +31,9 @@ class NullifyFileTweak(Tweak): def __init__( self, file_location: FileLocation, - min_version: Version = Version("1.0"), owner: int = 501, group: int = 501 ): - super().__init__(key=None, value=None, min_version=min_version, owner=owner, group=group) + super().__init__(key=None, value=None, owner=owner, group=group) self.file_location = file_location def apply_tweak(self, other_tweaks: dict): @@ -60,12 +47,10 @@ class BasicPlistTweak(Tweak): file_location: FileLocation, key: str, value: any = True, - edit_type: TweakModifyType = TweakModifyType.TOGGLE, - min_version: Version = Version("1.0"), owner: int = 501, group: int = 501, is_risky: bool = False ): - super().__init__(key=key, value=value, edit_type=edit_type, min_version=min_version, owner=owner, group=group) + super().__init__(key=key, value=value, owner=owner, group=group) self.file_location = file_location self.is_risky = is_risky @@ -83,12 +68,10 @@ class AdvancedPlistTweak(BasicPlistTweak): self, file_location: FileLocation, keyValues: dict, - edit_type: TweakModifyType = TweakModifyType.TOGGLE, - min_version: Version = Version("1.0"), owner: int = 501, group: int = 501, is_risky: bool = False ): - super().__init__(file_location=file_location, key=None, value=keyValues, edit_type=edit_type, min_version=min_version, owner=owner, group=group, is_risky=is_risky) + super().__init__(file_location=file_location, key=None, value=keyValues, owner=owner, group=group, is_risky=is_risky) def set_multiple_values(self, keys: list[str], value: any): for key in keys: @@ -182,6 +165,15 @@ class RdarFixTweak(BasicPlistTweak): class MobileGestaltTweak(Tweak): + def __init__( + self, + key: str, subkey: str = None, + value: any = 1, + owner: int = 501, group: int = 501 + ): + super().__init__(key, value, owner, group) + self.subkey = subkey + def apply_tweak(self, plist: dict): if not self.enabled: return plist @@ -196,10 +188,9 @@ class MobileGestaltPickerTweak(Tweak): def __init__( self, key: str, subkey: str = None, - values: list = [1], - min_version: Version = Version("1.0") + values: list = [1] ): - super().__init__(key=key, value=values, edit_type=TweakModifyType.PICKER, min_version=min_version) + super().__init__(key=key, value=values) self.subkey = subkey self.selected_option = 0 # index of the selected option @@ -221,8 +212,8 @@ class MobileGestaltPickerTweak(Tweak): return self.selected_option class MobileGestaltMultiTweak(Tweak): - def __init__(self, keyValues: dict, min_version: Version = Version("1.0")): - super().__init__(key=None, min_version=min_version) + def __init__(self, keyValues: dict): + super().__init__(key=None) self.keyValues = keyValues # key values looks like ["key name" = value] @@ -237,10 +228,9 @@ class FeatureFlagTweak(Tweak): def __init__( self, flag_category: str, flag_names: list, - is_list: bool=True, inverted: bool=False, - min_version: Version = Version("1.0") + is_list: bool=True, inverted: bool=False ): - super().__init__(key=None, min_version=min_version) + super().__init__(key=None) self.flag_category = flag_category self.flag_names = flag_names self.is_list = is_list diff --git a/tweaks/tweaks.py b/tweaks/tweaks.py index d816592..63cf128 100644 --- a/tweaks/tweaks.py +++ b/tweaks/tweaks.py @@ -1,5 +1,5 @@ from devicemanagement.constants import Version -from .tweak_classes import MobileGestaltTweak, MobileGestaltMultiTweak, MobileGestaltPickerTweak, FeatureFlagTweak, TweakModifyType, BasicPlistTweak, AdvancedPlistTweak, RdarFixTweak, NullifyFileTweak +from .tweak_classes import MobileGestaltTweak, MobileGestaltMultiTweak, MobileGestaltPickerTweak, FeatureFlagTweak, BasicPlistTweak, AdvancedPlistTweak, RdarFixTweak, NullifyFileTweak from .eligibility_tweak import EligibilityTweak, AITweak from .basic_plist_locations import FileLocation @@ -7,12 +7,12 @@ tweaks = { ## MobileGestalt Tweaks "DynamicIsland": MobileGestaltPickerTweak("oPeik/9e8lQWMszEjbPzng", "ArtworkDeviceSubType", [2436, 2556, 2796, 2976, 2622, 2868]), "RdarFix": RdarFixTweak(), - "ModelName": MobileGestaltTweak("oPeik/9e8lQWMszEjbPzng", "ArtworkDeviceProductDescription", "", TweakModifyType.TEXT), + "ModelName": MobileGestaltTweak("oPeik/9e8lQWMszEjbPzng", "ArtworkDeviceProductDescription", ""), "BootChime": MobileGestaltTweak("QHxt+hGLaBPbQJbXiUJX3w"), "ChargeLimit": MobileGestaltTweak("37NVydb//GP/GrhuTN+exg"), "CollisionSOS": MobileGestaltTweak("HCzWusHQwZDea6nNhaKndw"), "TapToWake": MobileGestaltTweak("yZf3GTRMGTuwSV/lD7Cagw"), - "CameraButton": MobileGestaltMultiTweak({"CwvKxM2cEogD3p+HYgaW0Q": 1, "oOV1jhJbdV3AddkcCg0AEA": 1}, min_version=Version("18.0")), + "CameraButton": MobileGestaltMultiTweak({"CwvKxM2cEogD3p+HYgaW0Q": 1, "oOV1jhJbdV3AddkcCg0AEA": 1}), "Parallax": MobileGestaltTweak("UIParallaxCapability", value=0), "StageManager": MobileGestaltTweak("qeaj75wk3HF4DwQ8qbIi7g", value=1), "Medusa": MobileGestaltMultiTweak({"mG0AnH/Vy1veoqoLRAIgTA": 1, "UCG5MkVahJxG1YULbbd5Bg": 1, "ZYqko/XM5zD3XBfN5RmaXA": 1, "nVh/gwNpy7Jv1NOk00CMrw": 1, "uKc7FPnEO++lVhHWHFlGbQ": 1}), @@ -25,23 +25,20 @@ tweaks = { "InternalInstall": MobileGestaltTweak("EqrsVvjcYDdxHBiQmGhAWw"), "EUEnabler": EligibilityTweak(), "AOD": MobileGestaltMultiTweak( - {"2OOJf1VhaM7NxfRok3HbWQ": 1, "j8/Omm6s1lsmTDFsXjsBfA": 1}, - min_version=Version("18.0")), - "AODVibrancy": MobileGestaltTweak("ykpu7qyhqFweVMKtxNylWA", min_version=Version("18.0")), + {"2OOJf1VhaM7NxfRok3HbWQ": 1, "j8/Omm6s1lsmTDFsXjsBfA": 1}), + "AODVibrancy": MobileGestaltTweak("ykpu7qyhqFweVMKtxNylWA"), ## Feature Flag Tweaks "ClockAnim": FeatureFlagTweak(flag_category='SpringBoard', - flag_names=['SwiftUITimeAnimation'], - min_version=Version("18.0")), + flag_names=['SwiftUITimeAnimation']), "Lockscreen": FeatureFlagTweak(flag_category="SpringBoard", - flag_names=['AutobahnQuickSwitchTransition', 'SlipSwitch', 'PosterEditorKashida'], - min_version=Version("18.0")), - "PhotoUI": FeatureFlagTweak(flag_category='Photos', flag_names=['Lemonade'], is_list=False, inverted=True, min_version=Version("18.0")), - "AI": FeatureFlagTweak(flag_category='SpringBoard', flag_names=['Domino', 'SuperDomino'], min_version=Version("18.1")), + flag_names=['AutobahnQuickSwitchTransition', 'SlipSwitch', 'PosterEditorKashida']), + "PhotoUI": FeatureFlagTweak(flag_category='Photos', flag_names=['Lemonade'], is_list=False, inverted=True), + "AI": FeatureFlagTweak(flag_category='SpringBoard', flag_names=['Domino', 'SuperDomino']), ## AI Enabler "AIEligibility": AITweak(), - "AIGestalt": MobileGestaltTweak("A62OafQ85EJAiiqKn4agtg", min_version=Version("18.1")), + "AIGestalt": MobileGestaltTweak("A62OafQ85EJAiiqKn4agtg"), "SpoofModel": MobileGestaltPickerTweak("h9jDsbgj7xIVeIQ8S3/X3Q", values=[ # Default "Placeholder", # 0 | Original @@ -81,7 +78,7 @@ tweaks = { "iPad13,9", # 24 | iPad Pro (12.9-inch) (M1) (C) "iPad13,16", # 25 | iPad Air (M1) (W) "iPad13,17", # 26 | iPad Air (M1) (C) - ], min_version=Version("18.1")), + ]), "SpoofHardware": MobileGestaltPickerTweak("oYicEKzVTz4/CxxE05pEgQ", values=[ # Default "Placeholder", # 0 | Original @@ -121,7 +118,7 @@ tweaks = { "J522xAP", # 24 | iPad Pro (12.9-inch) (M1) (C) "J407AP", # 25 | iPad Air (M1) (W) "J408AP", # 26 | iPad Air (M1) (C) - ], min_version=Version("18.1")), + ]), "SpoofCPU": MobileGestaltPickerTweak("5pYKlGnYYBzGvAlIU8RjEQ", values=[ # Default "Placeholder", # 0 | Original @@ -161,13 +158,12 @@ tweaks = { "t8103", # 24 | iPad Pro (12.9-inch) (M1) (C) "t8103", # 25 | iPad Air (M1) (W) "t8103", # 26 | iPad Air (M1) (C) - ], min_version=Version("18.1")), + ]), ## Springboard Tweaks "LockScreenFootnote": BasicPlistTweak( FileLocation.footnote, - key="LockScreenFootnote", value="", - edit_type=TweakModifyType.TEXT + key="LockScreenFootnote", value="" ), "SBDontLockAfterCrash": BasicPlistTweak( FileLocation.springboard, From bb69a124e1c4a2601d5ff3c05a1c613d98e44951 Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Thu, 12 Dec 2024 13:24:20 -0500 Subject: [PATCH 2/4] fix skip setup applying on sparserestore devices --- devicemanagement/device_manager.py | 2 +- tweaks/tweaks.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/devicemanagement/device_manager.py b/devicemanagement/device_manager.py index 2d9fa1c..8d50b57 100644 --- a/devicemanagement/device_manager.py +++ b/devicemanagement/device_manager.py @@ -314,7 +314,7 @@ class DeviceManager: elif isinstance(tweak, BasicPlistTweak) or isinstance(tweak, RdarFixTweak) or isinstance(tweak, AdvancedPlistTweak): basic_plists = tweak.apply_tweak(basic_plists, self.allow_risky_tweaks) basic_plists_ownership[tweak.file_location] = tweak.owner - if tweak.owner == 0: + if tweak.enabled and tweak.owner == 0: uses_domains = True elif isinstance(tweak, NullifyFileTweak): tweak.apply_tweak(files_data) diff --git a/tweaks/tweaks.py b/tweaks/tweaks.py index 63cf128..6992c8e 100644 --- a/tweaks/tweaks.py +++ b/tweaks/tweaks.py @@ -5,9 +5,9 @@ from .basic_plist_locations import FileLocation tweaks = { ## MobileGestalt Tweaks - "DynamicIsland": MobileGestaltPickerTweak("oPeik/9e8lQWMszEjbPzng", "ArtworkDeviceSubType", [2436, 2556, 2796, 2976, 2622, 2868]), + "DynamicIsland": MobileGestaltPickerTweak("oPeik/9e8lQWMszEjbPzng", subkey="ArtworkDeviceSubType", values=[2436, 2556, 2796, 2976, 2622, 2868]), "RdarFix": RdarFixTweak(), - "ModelName": MobileGestaltTweak("oPeik/9e8lQWMszEjbPzng", "ArtworkDeviceProductDescription", ""), + "ModelName": MobileGestaltTweak("oPeik/9e8lQWMszEjbPzng", subkey="ArtworkDeviceProductDescription", value=""), "BootChime": MobileGestaltTweak("QHxt+hGLaBPbQJbXiUJX3w"), "ChargeLimit": MobileGestaltTweak("37NVydb//GP/GrhuTN+exg"), "CollisionSOS": MobileGestaltTweak("HCzWusHQwZDea6nNhaKndw"), From bf7902bcd32e1230be240aa9e300e427c1f5664f Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Thu, 12 Dec 2024 13:30:52 -0500 Subject: [PATCH 3/4] warn when no mobilegestalt file is selected --- devicemanagement/device_manager.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/devicemanagement/device_manager.py b/devicemanagement/device_manager.py index 8d50b57..9ac34a1 100644 --- a/devicemanagement/device_manager.py +++ b/devicemanagement/device_manager.py @@ -323,6 +323,11 @@ class DeviceManager: else: if gestalt_plist != None: gestalt_plist = tweak.apply_tweak(gestalt_plist) + elif tweak.enabled: + # no mobilegestalt file provided but applying mga tweaks, give warning + show_error_msg("No mobilegestalt file provided! Please select your file to apply mobilegestalt tweaks.") + update_label("Failed.") + return # set the custom gestalt keys if gestalt_plist != None: gestalt_plist = CustomGestaltTweaks.apply_tweaks(gestalt_plist) From f178c2967a0f12af3c293afc4ef99fe4d55a1747 Mon Sep 17 00:00:00 2001 From: leminlimez <59540996+leminlimez@users.noreply.github.com> Date: Thu, 12 Dec 2024 13:35:56 -0500 Subject: [PATCH 4/4] bump build number --- gui/main_window.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gui/main_window.py b/gui/main_window.py index eeaa1b0..a668e6b 100644 --- a/gui/main_window.py +++ b/gui/main_window.py @@ -19,7 +19,7 @@ from tweaks.custom_gestalt_tweaks import CustomGestaltTweaks, ValueTypeStrings from tweaks.daemons_tweak import Daemon App_Version = "4.2.1" -App_Build = 1 +App_Build = 0 class Page(Enum): Home = 0 @@ -906,12 +906,12 @@ class MainWindow(QtWidgets.QMainWindow): def update_bar(self, percent): self.ui.restoreProgressBar.setValue(int(percent)) def on_removeTweaksBtn_clicked(self): - # TODO: Add safety here + # TODO: Add threading here self.device_manager.apply_changes(resetting=True, update_label=self.update_label) def on_resetGestaltBtn_clicked(self): self.device_manager.reset_mobilegestalt(self.settings, update_label=self.update_label) @QtCore.Slot() def on_applyTweaksBtn_clicked(self): - # TODO: Add safety here + # TODO: Add threading here self.device_manager.apply_changes(update_label=self.update_label)