diff --git a/.DS_Store b/.DS_Store
index fc39c7b..e4c4668 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/cli_app.py b/cli_app.py
index 9de9f4e..75c31b1 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, AITweak, BasicPlistTweak
+from tweaks.tweaks import tweaks, TweakModifyType, FeatureFlagTweak, EligibilityTweak, AITweak, BasicPlistTweak, RdarFixTweak
from tweaks.basic_plist_locations import FileLocation
from devicemanagement.constants import Device
@@ -63,6 +63,7 @@ while running:
ld = create_using_usbmux(serial=current_device.serial)
vals = ld.all_values
device = Device(uuid=current_device.serial, name=vals['DeviceName'], version=vals['ProductVersion'], model=vals['ProductType'], locale=ld.locale, ld=ld)
+ tweaks["RdarFix"].get_rdar_mode()
except Exception as e:
print(traceback.format_exc())
input("Press Enter to continue...")
@@ -125,7 +126,7 @@ while running:
eligibility_files = tweak.apply_tweak()
elif isinstance(tweak, AITweak):
ai_file = tweak.apply_tweak()
- elif isinstance(tweak, BasicPlistTweak):
+ elif isinstance(tweak, BasicPlistTweak) or isinstance(tweak, RdarFixTweak):
basic_plists = tweak.apply_tweak(basic_plists)
else:
gestalt_plist = tweak.apply_tweak(gestalt_plist)
@@ -218,6 +219,7 @@ while running:
picker_choice = int(input("Select option: "))
if picker_choice > 0 and picker_choice <= len(values):
tweak.set_selected_option(picker_choice-1)
+ tweaks["RdarFix"].set_di_type(values[tweak.get_selected_option()])
elif picker_choice == len(values)+1:
tweak.set_enabled(False)
else:
diff --git a/devicemanagement/device_manager.py b/devicemanagement/device_manager.py
index bdbb2ad..5626313 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, AITweak, BasicPlistTweak
+from tweaks.tweaks import tweaks, FeatureFlagTweak, EligibilityTweak, AITweak, BasicPlistTweak, RdarFixTweak
from tweaks.basic_plist_locations import FileLocation
from Sparserestore.restore import restore_files, FileToRestore
@@ -48,6 +48,7 @@ class DeviceManager:
locale=ld.locale,
ld=ld
)
+ tweaks["RdarFix"].get_rdar_mode(vals['ProductType'])
self.devices.append(dev)
except Exception as e:
print(f"ERROR with lockdown device with UUID {device.serial}")
@@ -124,7 +125,7 @@ class DeviceManager:
eligibility_files = tweak.apply_tweak()
elif isinstance(tweak, AITweak):
ai_file = tweak.apply_tweak()
- elif isinstance(tweak, BasicPlistTweak):
+ elif isinstance(tweak, BasicPlistTweak) or isinstance(tweak, RdarFixTweak):
basic_plists = tweak.apply_tweak(basic_plists)
else:
if gestalt_plist != None:
diff --git a/gui/main_window.py b/gui/main_window.py
index 74384c1..b022701 100644
--- a/gui/main_window.py
+++ b/gui/main_window.py
@@ -116,6 +116,7 @@ class MainWindow(QtWidgets.QMainWindow):
## MOBILE GESTALT PAGE ACTIONS
self.ui.dynamicIslandDrp.activated.connect(self.on_dynamicIslandDrp_activated)
+ self.ui.rdarFixChk.clicked.connect(self.on_rdarFixChk_clicked)
self.ui.modelNameChk.toggled.connect(self.on_modelNameChk_clicked)
self.ui.modelNameTxt.textEdited.connect(self.on_modelNameTxt_textEdited)
@@ -213,6 +214,12 @@ class MainWindow(QtWidgets.QMainWindow):
self.ui.dynamicIslandDrp.removeItem(5)
except:
pass
+ rdar_title = tweaks["RdarFix"].get_rdar_title()
+ if rdar_title == "hide":
+ self.ui.rdarFixChk.hide()
+ else:
+ self.ui.rdarFixChk.show()
+ self.ui.rdarFixChk.setText(f"{rdar_title} (modifies resolution)")
if Version(self.device_manager.data_singleton.current_device.version) >= Version("18.1"):
self.ui.enableAIChk.show()
self.ui.languageLbl.hide()
@@ -348,6 +355,9 @@ class MainWindow(QtWidgets.QMainWindow):
tweaks["DynamicIsland"].set_enabled(False)
else:
tweaks["DynamicIsland"].set_selected_option(index - 1)
+ tweaks["RdarFix"].set_di_type(tweaks["DynamicIsland"].value[tweaks["DynamicIsland"].get_selected_option()])
+ def on_rdarFixChk_clicked(self, checked: bool):
+ tweaks["RdarFix"].set_enabled(checked)
def on_modelNameChk_clicked(self, checked: bool):
tweaks["ModelName"].set_enabled(checked)
diff --git a/qt/mainwindow.ui b/qt/mainwindow.ui
index 11bd4ea..f0ce940 100644
--- a/qt/mainwindow.ui
+++ b/qt/mainwindow.ui
@@ -1566,7 +1566,7 @@ QToolButton:pressed {
-
- Nugget GUI - Version 3.0 (beta 1)
+ Nugget GUI - Version 3.0 (beta 2)
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
@@ -1875,6 +1875,13 @@ QComboBox QAbstractItemView::item:hover {
+ -
+
+
+ Fix RDAR (modifies resolution)
+
+
+
-
diff --git a/qt/mainwindow_ui.py b/qt/mainwindow_ui.py
index c091846..d16c52a 100644
--- a/qt/mainwindow_ui.py
+++ b/qt/mainwindow_ui.py
@@ -1009,6 +1009,11 @@ class Ui_Nugget(object):
self.verticalLayout_8.addWidget(self.dynamicIslandDrp)
+ self.rdarFixChk = QCheckBox(self.gestaltPageContent)
+ self.rdarFixChk.setObjectName(u"rdarFixChk")
+
+ self.verticalLayout_8.addWidget(self.rdarFixChk)
+
self.modelNameChk = QCheckBox(self.gestaltPageContent)
self.modelNameChk.setObjectName(u"modelNameChk")
@@ -2549,7 +2554,7 @@ class Ui_Nugget(object):
self.toolButton_15.setText(QCoreApplication.translate("Nugget", u"Additional Thanks", None))
self.libiBtn.setText(QCoreApplication.translate("Nugget", u"pymobiledevice3", None))
self.qtBtn.setText(QCoreApplication.translate("Nugget", u"Qt Creator", None))
- self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.0 (beta 1)", None))
+ self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.0 (beta 2)", None))
self.statusBarLbl.setText(QCoreApplication.translate("Nugget", u"Mobile Gestalt", None))
self.label_9.setText(QCoreApplication.translate("Nugget", u"Device Subtype Preset", None))
self.dynamicIslandDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None))
@@ -2561,6 +2566,7 @@ class Ui_Nugget(object):
self.dynamicIslandDrp.setItemText(6, QCoreApplication.translate("Nugget", u"2868 (iPhone 16 Pro Max Dynamic Island)", None))
self.dynamicIslandDrp.setCurrentText(QCoreApplication.translate("Nugget", u"None", None))
+ self.rdarFixChk.setText(QCoreApplication.translate("Nugget", u"Fix RDAR (modifies resolution)", None))
self.modelNameChk.setText(QCoreApplication.translate("Nugget", u"Change Device Model Name", None))
self.modelNameTxt.setPlaceholderText(QCoreApplication.translate("Nugget", u"Model Name", None))
self.bootChimeChk.setText(QCoreApplication.translate("Nugget", u"Enable Boot Chime", None))
diff --git a/qt/ui_mainwindow.py b/qt/ui_mainwindow.py
index d1ea245..552fde6 100644
--- a/qt/ui_mainwindow.py
+++ b/qt/ui_mainwindow.py
@@ -1009,6 +1009,11 @@ class Ui_Nugget(object):
self.verticalLayout_8.addWidget(self.dynamicIslandDrp)
+ self.rdarFixChk = QCheckBox(self.gestaltPageContent)
+ self.rdarFixChk.setObjectName(u"rdarFixChk")
+
+ self.verticalLayout_8.addWidget(self.rdarFixChk)
+
self.modelNameChk = QCheckBox(self.gestaltPageContent)
self.modelNameChk.setObjectName(u"modelNameChk")
@@ -2549,7 +2554,7 @@ class Ui_Nugget(object):
self.toolButton_15.setText(QCoreApplication.translate("Nugget", u"Additional Thanks", None))
self.libiBtn.setText(QCoreApplication.translate("Nugget", u"pymobiledevice3", None))
self.qtBtn.setText(QCoreApplication.translate("Nugget", u"Qt Creator", None))
- self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.0 (beta 1)", None))
+ self.label.setText(QCoreApplication.translate("Nugget", u"Nugget GUI - Version 3.0 (beta 2)", None))
self.statusBarLbl.setText(QCoreApplication.translate("Nugget", u"Mobile Gestalt", None))
self.label_9.setText(QCoreApplication.translate("Nugget", u"Device Subtype Preset", None))
self.dynamicIslandDrp.setItemText(0, QCoreApplication.translate("Nugget", u"None", None))
@@ -2561,6 +2566,7 @@ class Ui_Nugget(object):
self.dynamicIslandDrp.setItemText(6, QCoreApplication.translate("Nugget", u"2868 (iPhone 16 Pro Max Dynamic Island)", None))
self.dynamicIslandDrp.setCurrentText(QCoreApplication.translate("Nugget", u"None", None))
+ self.rdarFixChk.setText(QCoreApplication.translate("Nugget", u"Fix RDAR (modifies resolution)", None))
self.modelNameChk.setText(QCoreApplication.translate("Nugget", u"Change Device Model Name", None))
self.modelNameTxt.setPlaceholderText(QCoreApplication.translate("Nugget", u"Model Name", None))
self.bootChimeChk.setText(QCoreApplication.translate("Nugget", u"Enable Boot Chime", None))
diff --git a/tweaks/basic_plist_locations.py b/tweaks/basic_plist_locations.py
index 2bc9ad5..d8328f0 100644
--- a/tweaks/basic_plist_locations.py
+++ b/tweaks/basic_plist_locations.py
@@ -1,6 +1,9 @@
from enum import Enum
class FileLocation(Enum):
+ # Mobile Gestalt
+ resolution = "/var/Managed Preferences/mobile/com.apple.iokit.IOMobileGraphicsFamily.plist"
+
# Springboard Options
springboard = "/var/Managed Preferences/mobile/com.apple.springboard.plist"
footnote = "/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles/Library/ConfigurationProfiles/SharedDeviceConfiguration.plist"
diff --git a/tweaks/tweak_classes.py b/tweaks/tweak_classes.py
index 8942d70..a94f1b1 100644
--- a/tweaks/tweak_classes.py
+++ b/tweaks/tweak_classes.py
@@ -62,6 +62,66 @@ class BasicPlistTweak(Tweak):
else:
other_tweaks[self.file_location] = {self.key: self.value}
return other_tweaks
+
+
+class RdarFixTweak(BasicPlistTweak):
+ def __init__(self, divider_below: bool = False):
+ super().__init__(label="Fix RDAR (modifies resolution)", file_location=FileLocation.resolution, key=None, divider_below=divider_below)
+ self.mode = 0
+
+ def get_rdar_mode(self, model: str) -> int:
+ if (model == "iPhone11,2" or model == "iPhone11,4" or model == "iPhone11,6"
+ or model == "iPhone11,8"
+ or model == "iPhone12,1" or model == "iPhone12,3" or model == "iPhone12,5"):
+ self.mode = 1
+ elif (model == "iPhone13,1" or model == "iPhone13,2" or model == "iPhone13,3" or model == "iPhone13,4"
+ or model == "iPhone14,4" or model == "iPhone14,5" or model == "iPhone14,2" or model == "iPhone14,3"
+ or model == "iPhone14,7" or model == "iPhone14,8"):
+ self.mode = 2
+ elif (model == "iPhone12,8" or model == "iPhone14,6"):
+ self.mode = 3
+ return self.mode
+
+ def get_rdar_title(self) -> str:
+ if self.mode == 1 or self.mode == 3:
+ return "Fix RDAR"
+ elif self.mode == 2:
+ return "Dynamic Island Status Bar Fix"
+ return "hide"
+
+ def set_di_type(self, type: int):
+ self.di_type = type
+
+ def apply_tweak(self, other_tweaks: dict) -> dict:
+ if not self.enabled:
+ return other_tweaks
+ if self.mode == 1 or self.mode == 3:
+ plist = {
+ "canvas_height": 1791,
+ "canvas_width": 828
+ }
+ other_tweaks[self.file_location] = plist
+ elif self.mode == 2:
+ width = 2868
+ height = 1320
+ if self.di_type == 2556:
+ width = 1179
+ height = 2556
+ elif self.di_type == 2796 or self.di_type == 2976:
+ width = 1290
+ height = 2796
+ elif self.di_type == 2622:
+ width = 1206
+ height = 2622
+ elif self.di_type == 2868:
+ width = 1320
+ height = 2868
+ plist = {
+ "canvas_height": height,
+ "canvas_width": width
+ }
+ other_tweaks[self.file_location] = plist
+ return other_tweaks
class MobileGestaltTweak(Tweak):
diff --git a/tweaks/tweaks.py b/tweaks/tweaks.py
index 9d2065e..775dd49 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
+from .tweak_classes import MobileGestaltTweak, MobileGestaltMultiTweak, MobileGestaltPickerTweak, FeatureFlagTweak, TweakModifyType, BasicPlistTweak, RdarFixTweak
from .eligibility_tweak import EligibilityTweak, AITweak
from .basic_plist_locations import FileLocation
@@ -7,6 +7,7 @@ from .basic_plist_locations import FileLocation
tweaks = {
## MobileGestalt Tweaks
"DynamicIsland": MobileGestaltPickerTweak("Toggle Dynamic Island", "oPeik/9e8lQWMszEjbPzng", "ArtworkDeviceSubType", [2436, 2556, 2796, 2976, 2622, 2868]),
+ "RdarFix": RdarFixTweak(),
"ModelName": MobileGestaltTweak("Set Device Model Name", "oPeik/9e8lQWMszEjbPzng", "ArtworkDeviceProductDescription", "", TweakModifyType.TEXT),
"BootChime": MobileGestaltTweak("Toggle Boot Chime", "QHxt+hGLaBPbQJbXiUJX3w"),
"ChargeLimit": MobileGestaltTweak("Toggle Charge Limit", "37NVydb//GP/GrhuTN+exg"),