diff --git a/.DS_Store b/.DS_Store index a9edf0f..fc39c7b 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/cli_app.py b/cli_app.py index 94c0128..9de9f4e 100644 --- a/cli_app.py +++ b/cli_app.py @@ -1,5 +1,5 @@ from Sparserestore.restore import restore_files, FileToRestore, restore_file -from tweaks.tweaks import tweaks, TweakModifyType, FeatureFlagTweak, EligibilityTweak, BasicPlistTweak +from tweaks.tweaks import tweaks, TweakModifyType, FeatureFlagTweak, EligibilityTweak, AITweak, BasicPlistTweak from tweaks.basic_plist_locations import FileLocation from devicemanagement.constants import Device @@ -103,6 +103,7 @@ while running: # create the other plists flag_plist: dict = {} eligibility_files = None + ai_file = None basic_plists: dict = {} # verify the device credentials before continuing @@ -122,6 +123,8 @@ while running: elif isinstance(tweak, EligibilityTweak): tweak.set_region_code(device.locale[-2:]) eligibility_files = tweak.apply_tweak() + elif isinstance(tweak, AITweak): + ai_file = tweak.apply_tweak() elif isinstance(tweak, BasicPlistTweak): basic_plists = tweak.apply_tweak(basic_plists) else: @@ -142,6 +145,8 @@ while running: ] if eligibility_files != None: files_to_restore += eligibility_files + if ai_file != None: + files_to_restore.append(ai_file) for location, plist in basic_plists: files_to_restore.append(FileToRestore( contents=plistlib.dumps(plist), diff --git a/devicemanagement/device_manager.py b/devicemanagement/device_manager.py index e50032f..e044146 100644 --- a/devicemanagement/device_manager.py +++ b/devicemanagement/device_manager.py @@ -10,7 +10,7 @@ from pymobiledevice3.lockdown import create_using_usbmux from devicemanagement.constants import Device, Version from devicemanagement.data_singleton import DataSingleton -from tweaks.tweaks import tweaks, FeatureFlagTweak, EligibilityTweak, BasicPlistTweak +from tweaks.tweaks import tweaks, FeatureFlagTweak, EligibilityTweak, AITweak, BasicPlistTweak from tweaks.basic_plist_locations import FileLocation from Sparserestore.restore import restore_files, FileToRestore @@ -106,6 +106,7 @@ class DeviceManager: # create the other plists flag_plist: dict = {} eligibility_files = None + ai_file = None basic_plists: dict = {} # set the plist keys @@ -116,6 +117,8 @@ class DeviceManager: flag_plist = tweak.apply_tweak(flag_plist) elif isinstance(tweak, EligibilityTweak): eligibility_files = tweak.apply_tweak() + elif isinstance(tweak, AITweak): + ai_file = tweak.apply_tweak() elif isinstance(tweak, BasicPlistTweak): basic_plists = tweak.apply_tweak(basic_plists) else: @@ -146,6 +149,8 @@ class DeviceManager: )) if eligibility_files: files_to_restore += eligibility_files + if ai_file != None: + files_to_restore.append(ai_file) for location, plist in basic_plists: files_to_restore.append(FileToRestore( contents=plistlib.dumps(plist), diff --git a/gui/main_window.py b/gui/main_window.py index 7ae0cc6..f6482d2 100644 --- a/gui/main_window.py +++ b/gui/main_window.py @@ -68,11 +68,15 @@ class MainWindow(QtWidgets.QMainWindow): self.ui.discordBtn.clicked.connect(self.on_discordBtn_clicked) - ## EU ENABLER PAGE ACTIONS + ## ELIGIBILITY PAGE ACTIONS self.ui.euEnablerEnabledChk.toggled.connect(self.on_euEnablerEnabledChk_toggled) self.ui.methodChoiceDrp.activated.connect(self.on_methodChoiceDrp_activated) self.ui.regionCodeTxt.textEdited.connect(self.on_regionCodeTxt_textEdited) + self.ui.enableAIChk.toggled.connect(self.on_enableAIChk_toggled) + self.ui.languageTxt.textEdited.connect(self.on_languageTxt_textEdited) + self.ui.spoofModelChk.toggled.connect(self.on_spoofModelChk_toggled) + ## FEATURE FLAGS PAGE self.ui.clockAnimChk.toggled.connect(self.on_clockAnimChk_toggled) self.ui.lockscreenChk.toggled.connect(self.on_lockscreenChk_clicked) @@ -188,6 +192,7 @@ class MainWindow(QtWidgets.QMainWindow): self.ui.gestaltPageContent.setDisabled(False) self.ui.featureFlagsPageContent.setDisabled(False) + self.ui.euEnablerPageContent.setDisabled(False) self.ui.springboardOptionsPageContent.setDisabled(False) self.ui.internalOptionsPageContent.setDisabled(False) @@ -208,6 +213,14 @@ class MainWindow(QtWidgets.QMainWindow): self.ui.dynamicIslandDrp.removeItem(5) except: pass + if Version(self.device_manager.data_singleton.current_device.version) >= Version("18.0"): + self.ui.enableAIChk.show() + else: + self.ui.enableAIChk.hide() + self.ui.languageLbl.hide() + self.ui.languageTxt.hide() + self.ui.aiInfoLabel.hide() + self.ui.spoofModelChk.hide() if Version(self.device_manager.data_singleton.current_device.version) >= Version("18.0"): self.ui.aodChk.show() self.ui.sleepApneaChk.show() @@ -388,15 +401,33 @@ class MainWindow(QtWidgets.QMainWindow): tweaks["AI"].set_enabled(checked) - ## EU ENABLER PAGE + ## ELIGIBILITY PAGE def on_euEnablerEnabledChk_toggled(self, checked: bool): tweaks["EUEnabler"].set_enabled(checked) - self.ui.euEnablerPageContent.setDisabled(not checked) def on_methodChoiceDrp_activated(self, index: int): tweaks["EUEnabler"].set_selected_option(index) def on_regionCodeTxt_textEdited(self, text: str): tweaks["EUEnabler"].set_region_code(text) + def on_enableAIChk_toggled(self, checked: bool): + tweaks["AIEligibility"].set_enabled(checked) + tweaks["AIGestalt"].set_enabled(checked) + # change the visibility of stuff + if checked: + self.ui.languageLbl.show() + self.ui.languageTxt.show() + self.ui.aiInfoLabel.show() + self.ui.spoofModelChk.show() + else: + self.ui.languageLbl.hide() + self.ui.languageTxt.hide() + self.ui.aiInfoLabel.hide() + self.ui.spoofModelChk.hide() + def on_languageTxt_textEdited(self, text: str): + tweaks["AIEligibility"].set_language_code(text) + def on_spoofModelChk_toggled(self, checked: bool): + tweaks["SpoofModel"].set_enabled(checked) + ## SPRINGBOARD OPTIONS PAGE def on_footnoteTxt_textEdited(self, text: str): diff --git a/qt/mainwindow.ui b/qt/mainwindow.ui index 3e8051d..11bd4ea 100644 --- a/qt/mainwindow.ui +++ b/qt/mainwindow.ui @@ -593,7 +593,7 @@ QSlider::tick:horizontal { - EU Enabler + Eligibility @@ -2372,7 +2372,7 @@ QComboBox QAbstractItemView::item:hover { 0 - + -1 @@ -2380,16 +2380,25 @@ QComboBox QAbstractItemView::item:hover { - EU Enabler + Eligibility Tweaks - - - Enabled + + + Qt::Vertical - + + QSizePolicy::Fixed + + + + 20 + 16 + + + @@ -2425,6 +2434,13 @@ QComboBox QAbstractItemView::item:hover { + + + + Enable EU Enabler + + + @@ -2518,6 +2534,72 @@ QComboBox QAbstractItemView::item:hover { + + + + false + + + QFrame { + color: #414141; +} + + + QFrame::Plain + + + Qt::Horizontal + + + + + + + Enable Apple Intelligence (for Unsupported Devices) + + + + + + + Language Code (not needed for English) + + + + + + + Language Code (i.e. en) + + + + + + + + 0 + 0 + + + + In order to download the AI model, you must spoof the device model. This will break Face ID until +you revert. + +Once the model has downloaded, disable "Spoof Device Model" and click the "Apply Tweaks" +button on the "Apply" page again to fix Face ID. + + + Qt::AutoText + + + + + + + Spoof Device Model + + + diff --git a/qt/mainwindow_ui.py b/qt/mainwindow_ui.py index 3bf4315..c091846 100644 --- a/qt/mainwindow_ui.py +++ b/qt/mainwindow_ui.py @@ -1286,16 +1286,15 @@ class Ui_Nugget(object): self.verticalLayout_15.setSpacing(6) self.verticalLayout_15.setObjectName(u"verticalLayout_15") self.verticalLayout_15.setContentsMargins(0, 0, 0, 0) - self.setupOptionsLbl = QLabel(self.verticalWidget_5) - self.setupOptionsLbl.setObjectName(u"setupOptionsLbl") - self.setupOptionsLbl.setFont(font1) + self.eligibilityLbl = QLabel(self.verticalWidget_5) + self.eligibilityLbl.setObjectName(u"eligibilityLbl") + self.eligibilityLbl.setFont(font1) - self.verticalLayout_15.addWidget(self.setupOptionsLbl) + self.verticalLayout_15.addWidget(self.eligibilityLbl) - self.euEnablerEnabledChk = QCheckBox(self.verticalWidget_5) - self.euEnablerEnabledChk.setObjectName(u"euEnablerEnabledChk") + self.verticalSpacer_20 = QSpacerItem(20, 16, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) - self.verticalLayout_15.addWidget(self.euEnablerEnabledChk) + self.verticalLayout_15.addItem(self.verticalSpacer_20) self.horizontalLayout_21.addWidget(self.verticalWidget_5) @@ -1317,6 +1316,11 @@ class Ui_Nugget(object): self.verticalLayout_17.addWidget(self.line_13) + self.euEnablerEnabledChk = QCheckBox(self.euEnablerPage) + self.euEnablerEnabledChk.setObjectName(u"euEnablerEnabledChk") + + self.verticalLayout_17.addWidget(self.euEnablerEnabledChk) + self.euEnablerPageContent = QWidget(self.euEnablerPage) self.euEnablerPageContent.setObjectName(u"euEnablerPageContent") self.euEnablerPageContent.setEnabled(False) @@ -1378,6 +1382,45 @@ class Ui_Nugget(object): self.verticalLayout_16.addWidget(self.regionCodeTxt) + self.line_16 = QFrame(self.euEnablerPageContent) + self.line_16.setObjectName(u"line_16") + self.line_16.setEnabled(False) + self.line_16.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_16.setFrameShadow(QFrame.Plain) + self.line_16.setFrameShape(QFrame.HLine) + + self.verticalLayout_16.addWidget(self.line_16) + + self.enableAIChk = QCheckBox(self.euEnablerPageContent) + self.enableAIChk.setObjectName(u"enableAIChk") + + self.verticalLayout_16.addWidget(self.enableAIChk) + + self.languageLbl = QLabel(self.euEnablerPageContent) + self.languageLbl.setObjectName(u"languageLbl") + + self.verticalLayout_16.addWidget(self.languageLbl) + + self.languageTxt = QLineEdit(self.euEnablerPageContent) + self.languageTxt.setObjectName(u"languageTxt") + + self.verticalLayout_16.addWidget(self.languageTxt) + + self.aiInfoLabel = QLabel(self.euEnablerPageContent) + self.aiInfoLabel.setObjectName(u"aiInfoLabel") + sizePolicy1.setHeightForWidth(self.aiInfoLabel.sizePolicy().hasHeightForWidth()) + self.aiInfoLabel.setSizePolicy(sizePolicy1) + self.aiInfoLabel.setTextFormat(Qt.AutoText) + + self.verticalLayout_16.addWidget(self.aiInfoLabel) + + self.spoofModelChk = QCheckBox(self.euEnablerPageContent) + self.spoofModelChk.setObjectName(u"spoofModelChk") + + self.verticalLayout_16.addWidget(self.spoofModelChk) + self.verticalSpacer_7 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) self.verticalLayout_16.addItem(self.verticalSpacer_7) @@ -2475,7 +2518,7 @@ class Ui_Nugget(object): self.gestaltPageBtn.setProperty("cls", QCoreApplication.translate("Nugget", u"sidebarBtn", None)) self.featureFlagsPageBtn.setText(QCoreApplication.translate("Nugget", u" Feature Flags", None)) self.featureFlagsPageBtn.setProperty("cls", QCoreApplication.translate("Nugget", u"sidebarBtn", None)) - self.euEnablerPageBtn.setText(QCoreApplication.translate("Nugget", u" EU Enabler", None)) + self.euEnablerPageBtn.setText(QCoreApplication.translate("Nugget", u" Eligibility", None)) self.euEnablerPageBtn.setProperty("cls", QCoreApplication.translate("Nugget", u"sidebarBtn", None)) self.springboardOptionsPageBtn.setText(QCoreApplication.translate("Nugget", u" Springboard Options", None)) self.springboardOptionsPageBtn.setProperty("cls", QCoreApplication.translate("Nugget", u"sidebarBtn", None)) @@ -2541,14 +2584,23 @@ class Ui_Nugget(object): self.lockscreenChk.setText(QCoreApplication.translate("Nugget", u"Enable Duplicate Lockscreen Button and Lockscreen Quickswitch", None)) self.photosChk.setText(QCoreApplication.translate("Nugget", u"Enable Old Photo UI", None)) self.aiChk.setText(QCoreApplication.translate("Nugget", u"Enable Apple Intelligence", None)) - self.setupOptionsLbl.setText(QCoreApplication.translate("Nugget", u"EU Enabler", None)) - self.euEnablerEnabledChk.setText(QCoreApplication.translate("Nugget", u"Enabled", None)) + self.eligibilityLbl.setText(QCoreApplication.translate("Nugget", u"Eligibility Tweaks", None)) + self.euEnablerEnabledChk.setText(QCoreApplication.translate("Nugget", u"Enable EU Enabler", None)) self.label_5.setText(QCoreApplication.translate("Nugget", u"Method Type", None)) self.methodChoiceDrp.setItemText(0, QCoreApplication.translate("Nugget", u"Method 1", None)) self.methodChoiceDrp.setItemText(1, QCoreApplication.translate("Nugget", u"Method 2", None)) self.label_6.setText(QCoreApplication.translate("Nugget", u"Region Code (Should be 2 letters)", None)) self.regionCodeTxt.setPlaceholderText(QCoreApplication.translate("Nugget", u"Region Code (Default: US)", None)) + self.enableAIChk.setText(QCoreApplication.translate("Nugget", u"Enable Apple Intelligence (for Unsupported Devices)", None)) + self.languageLbl.setText(QCoreApplication.translate("Nugget", u"Language Code (not needed for English)", None)) + self.languageTxt.setPlaceholderText(QCoreApplication.translate("Nugget", u"Language Code (i.e. en)", None)) + self.aiInfoLabel.setText(QCoreApplication.translate("Nugget", u"In order to download the AI model, you must spoof the device model. This will break Face ID until\n" +"you revert.\n" +"\n" +"Once the model has downloaded, disable \"Spoof Device Model\" and click the \"Apply Tweaks\"\n" +"button on the \"Apply\" page again to fix Face ID.", None)) + self.spoofModelChk.setText(QCoreApplication.translate("Nugget", u"Spoof Device Model", None)) self.springboardOptionsLbl.setText(QCoreApplication.translate("Nugget", u"Springboard Options", None)) self.label_13.setText(QCoreApplication.translate("Nugget", u"Lock Screen Footnote Text", None)) self.footnoteTxt.setPlaceholderText(QCoreApplication.translate("Nugget", u"Footnote Text", None)) diff --git a/qt/ui_mainwindow.py b/qt/ui_mainwindow.py index 1f68bd7..d1ea245 100644 --- a/qt/ui_mainwindow.py +++ b/qt/ui_mainwindow.py @@ -1286,16 +1286,15 @@ class Ui_Nugget(object): self.verticalLayout_15.setSpacing(6) self.verticalLayout_15.setObjectName(u"verticalLayout_15") self.verticalLayout_15.setContentsMargins(0, 0, 0, 0) - self.setupOptionsLbl = QLabel(self.verticalWidget_5) - self.setupOptionsLbl.setObjectName(u"setupOptionsLbl") - self.setupOptionsLbl.setFont(font1) + self.eligibilityLbl = QLabel(self.verticalWidget_5) + self.eligibilityLbl.setObjectName(u"eligibilityLbl") + self.eligibilityLbl.setFont(font1) - self.verticalLayout_15.addWidget(self.setupOptionsLbl) + self.verticalLayout_15.addWidget(self.eligibilityLbl) - self.euEnablerEnabledChk = QCheckBox(self.verticalWidget_5) - self.euEnablerEnabledChk.setObjectName(u"euEnablerEnabledChk") + self.verticalSpacer_20 = QSpacerItem(20, 16, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed) - self.verticalLayout_15.addWidget(self.euEnablerEnabledChk) + self.verticalLayout_15.addItem(self.verticalSpacer_20) self.horizontalLayout_21.addWidget(self.verticalWidget_5) @@ -1317,6 +1316,11 @@ class Ui_Nugget(object): self.verticalLayout_17.addWidget(self.line_13) + self.euEnablerEnabledChk = QCheckBox(self.euEnablerPage) + self.euEnablerEnabledChk.setObjectName(u"euEnablerEnabledChk") + + self.verticalLayout_17.addWidget(self.euEnablerEnabledChk) + self.euEnablerPageContent = QWidget(self.euEnablerPage) self.euEnablerPageContent.setObjectName(u"euEnablerPageContent") self.euEnablerPageContent.setEnabled(False) @@ -1378,6 +1382,45 @@ class Ui_Nugget(object): self.verticalLayout_16.addWidget(self.regionCodeTxt) + self.line_16 = QFrame(self.euEnablerPageContent) + self.line_16.setObjectName(u"line_16") + self.line_16.setEnabled(False) + self.line_16.setStyleSheet(u"QFrame {\n" +" color: #414141;\n" +"}") + self.line_16.setFrameShadow(QFrame.Plain) + self.line_16.setFrameShape(QFrame.Shape.HLine) + + self.verticalLayout_16.addWidget(self.line_16) + + self.enableAIChk = QCheckBox(self.euEnablerPageContent) + self.enableAIChk.setObjectName(u"enableAIChk") + + self.verticalLayout_16.addWidget(self.enableAIChk) + + self.languageLbl = QLabel(self.euEnablerPageContent) + self.languageLbl.setObjectName(u"languageLbl") + + self.verticalLayout_16.addWidget(self.languageLbl) + + self.languageTxt = QLineEdit(self.euEnablerPageContent) + self.languageTxt.setObjectName(u"languageTxt") + + self.verticalLayout_16.addWidget(self.languageTxt) + + self.aiInfoLabel = QLabel(self.euEnablerPageContent) + self.aiInfoLabel.setObjectName(u"aiInfoLabel") + sizePolicy1.setHeightForWidth(self.aiInfoLabel.sizePolicy().hasHeightForWidth()) + self.aiInfoLabel.setSizePolicy(sizePolicy1) + self.aiInfoLabel.setTextFormat(Qt.AutoText) + + self.verticalLayout_16.addWidget(self.aiInfoLabel) + + self.spoofModelChk = QCheckBox(self.euEnablerPageContent) + self.spoofModelChk.setObjectName(u"spoofModelChk") + + self.verticalLayout_16.addWidget(self.spoofModelChk) + self.verticalSpacer_7 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) self.verticalLayout_16.addItem(self.verticalSpacer_7) @@ -2475,7 +2518,7 @@ class Ui_Nugget(object): self.gestaltPageBtn.setProperty("cls", QCoreApplication.translate("Nugget", u"sidebarBtn", None)) self.featureFlagsPageBtn.setText(QCoreApplication.translate("Nugget", u" Feature Flags", None)) self.featureFlagsPageBtn.setProperty("cls", QCoreApplication.translate("Nugget", u"sidebarBtn", None)) - self.euEnablerPageBtn.setText(QCoreApplication.translate("Nugget", u" EU Enabler", None)) + self.euEnablerPageBtn.setText(QCoreApplication.translate("Nugget", u" Eligibility", None)) self.euEnablerPageBtn.setProperty("cls", QCoreApplication.translate("Nugget", u"sidebarBtn", None)) self.springboardOptionsPageBtn.setText(QCoreApplication.translate("Nugget", u" Springboard Options", None)) self.springboardOptionsPageBtn.setProperty("cls", QCoreApplication.translate("Nugget", u"sidebarBtn", None)) @@ -2541,14 +2584,23 @@ class Ui_Nugget(object): self.lockscreenChk.setText(QCoreApplication.translate("Nugget", u"Enable Duplicate Lockscreen Button and Lockscreen Quickswitch", None)) self.photosChk.setText(QCoreApplication.translate("Nugget", u"Enable Old Photo UI", None)) self.aiChk.setText(QCoreApplication.translate("Nugget", u"Enable Apple Intelligence", None)) - self.setupOptionsLbl.setText(QCoreApplication.translate("Nugget", u"EU Enabler", None)) - self.euEnablerEnabledChk.setText(QCoreApplication.translate("Nugget", u"Enabled", None)) + self.eligibilityLbl.setText(QCoreApplication.translate("Nugget", u"Eligibility Tweaks", None)) + self.euEnablerEnabledChk.setText(QCoreApplication.translate("Nugget", u"Enable EU Enabler", None)) self.label_5.setText(QCoreApplication.translate("Nugget", u"Method Type", None)) self.methodChoiceDrp.setItemText(0, QCoreApplication.translate("Nugget", u"Method 1", None)) self.methodChoiceDrp.setItemText(1, QCoreApplication.translate("Nugget", u"Method 2", None)) self.label_6.setText(QCoreApplication.translate("Nugget", u"Region Code (Should be 2 letters)", None)) self.regionCodeTxt.setPlaceholderText(QCoreApplication.translate("Nugget", u"Region Code (Default: US)", None)) + self.enableAIChk.setText(QCoreApplication.translate("Nugget", u"Enable Apple Intelligence (for Unsupported Devices)", None)) + self.languageLbl.setText(QCoreApplication.translate("Nugget", u"Language Code (not needed for English)", None)) + self.languageTxt.setPlaceholderText(QCoreApplication.translate("Nugget", u"Language Code (i.e. en)", None)) + self.aiInfoLabel.setText(QCoreApplication.translate("Nugget", u"In order to download the AI model, you must spoof the device model. This will break Face ID until\n" +"you revert.\n" +"\n" +"Once the model has downloaded, disable \"Spoof Device Model\" and click the \"Apply Tweaks\"\n" +"button on the \"Apply\" page again to fix Face ID.", None)) + self.spoofModelChk.setText(QCoreApplication.translate("Nugget", u"Spoof Device Model", None)) self.springboardOptionsLbl.setText(QCoreApplication.translate("Nugget", u"Springboard Options", None)) self.label_13.setText(QCoreApplication.translate("Nugget", u"Lock Screen Footnote Text", None)) self.footnoteTxt.setPlaceholderText(QCoreApplication.translate("Nugget", u"Footnote Text", None)) diff --git a/tweaks/eligibility_tweak.py b/tweaks/eligibility_tweak.py index 42da131..c2bf966 100644 --- a/tweaks/eligibility_tweak.py +++ b/tweaks/eligibility_tweak.py @@ -89,4 +89,44 @@ class EligibilityTweak(Tweak): # return the new files to restore return files_to_restore - \ No newline at end of file + + +class AITweak(Tweak): + def __init__(self): + super().__init__(label="Enable Apple Intelligence (for Unsupported Devices) (Eligibility)", key=None, value="", min_version=Version("18.1")) + + def set_language_code(self, lang: str): + self.value = lang + + def apply_tweak(self) -> FileToRestore: + if not self.enabled: + return None + langs = ["en"] + if self.value != "": + langs.append(self.value) + plist = { + "OS_ELIGIBILITY_DOMAIN_CALCIUM": { + "os_eligibility_answer_source_t": 1, + "os_eligibility_answer_t": 2, + "status": { + "OS_ELIGIBILITY_INPUT_CHINA_CELLULAR": 2 + } + }, + "OS_ELIGIBILITY_DOMAIN_GREYMATTER": { + "context": { + "OS_ELIGIBILITY_CONTEXT_ELIGIBLE_DEVICE_LANGUAGES": langs + }, + "os_eligibility_answer_source_t": 1, + "os_eligibility_answer_t": 4, + "status": { + "OS_ELIGIBILITY_INPUT_DEVICE_LANGUAGE": 3, + "OS_ELIGIBILITY_INPUT_DEVICE_REGION_CODE": 3, + "OS_ELIGIBILITY_INPUT_EXTERNAL_BOOT_DRIVE": 3, + "OS_ELIGIBILITY_INPUT_GENERATIVE_MODEL_SYSTEM": 3, + "OS_ELIGIBILITY_INPUT_SHARED_IPAD": 3, + "OS_ELIGIBILITY_INPUT_SIRI_LANGUAGE": 3 + } + } + } + + return FileToRestore(contents=plistlib.dumps(plist), restore_path="/var/db/eligibilityd/eligibility.plist") \ No newline at end of file diff --git a/tweaks/tweaks.py b/tweaks/tweaks.py index 549afd5..7b3a512 100644 --- a/tweaks/tweaks.py +++ b/tweaks/tweaks.py @@ -1,6 +1,6 @@ from devicemanagement.constants import Version from .tweak_classes import MobileGestaltTweak, MobileGestaltMultiTweak, MobileGestaltPickerTweak, FeatureFlagTweak, TweakModifyType, BasicPlistTweak -from .eligibility_tweak import EligibilityTweak +from .eligibility_tweak import EligibilityTweak, AITweak from .basic_plist_locations import FileLocation @@ -37,6 +37,11 @@ tweaks = { "PhotoUI": FeatureFlagTweak("Enable Old Photo UI", flag_category='Photos', flag_names=['Lemonade'], is_list=False, inverted=True, min_version=Version("18.0")), "AI": FeatureFlagTweak("Enable Apple Intelligence", flag_category='SpringBoard', flag_names=['Domino', 'SuperDomino'], min_version=Version("18.1"), divider_below=True), + ## AI Enabler + "AIEligibility": AITweak(), + "AIGestalt": MobileGestaltTweak("Enable Apple Intelligence (for Unsupported Devices) (Gestalt)", "A62OafQ85EJAiiqKn4agtg", min_version=Version("18.1")), + "SpoofModel": MobileGestaltTweak("Spoof Device Model", "h9jDsbgj7xIVeIQ8S3/X3Q", value="iPhone17,3", min_version=Version("18.1"), divider_below=True), + ## Springboard Tweaks "LockScreenFootnote": BasicPlistTweak( "Set Lock Screen Footnote Text",