From c7706b9aa3821580aca1431d432c14bfb22d7457 Mon Sep 17 00:00:00 2001 From: Tobias Sterbak Date: Thu, 23 Mar 2023 11:37:15 +0000 Subject: [PATCH] Supported device codes for a config are now a list; config is loaded based on this --- .../assets/configs/avicii.yaml | 7 ++- .../assets/configs/cheeseburger.yaml | 7 ++- openandroidinstaller/assets/configs/d2s.yaml | 6 +- openandroidinstaller/assets/configs/dre.yaml | 7 ++- .../assets/configs/dumpling.yaml | 7 ++- .../assets/configs/enchilada.yaml | 7 ++- .../assets/configs/fajita.yaml | 7 ++- .../assets/configs/guacamole.yaml | 7 ++- .../assets/configs/guacamoleb.yaml | 7 ++- .../assets/configs/hotdog.yaml | 7 ++- .../assets/configs/hotdogb.yaml | 7 ++- .../assets/configs/sargo.yaml | 6 +- openandroidinstaller/assets/configs/yuga.yaml | 7 ++- openandroidinstaller/installer_config.py | 55 ++++++++----------- openandroidinstaller/utils.py | 8 +-- openandroidinstaller/views/select_view.py | 9 +-- openandroidinstaller/views/start_view.py | 4 +- 17 files changed, 94 insertions(+), 71 deletions(-) diff --git a/openandroidinstaller/assets/configs/avicii.yaml b/openandroidinstaller/assets/configs/avicii.yaml index 99cc545f..beb9e933 100644 --- a/openandroidinstaller/assets/configs/avicii.yaml +++ b/openandroidinstaller/assets/configs/avicii.yaml @@ -1,7 +1,10 @@ metadata: maintainer: Tobias Sterbak (tsterbak) - devicename: OnePlus Nord - devicecode: avicii + device_name: OnePlus Nord + device_code: avicii + supported_device_codes: + - avicii + - Nord requirements: android: 10 steps: diff --git a/openandroidinstaller/assets/configs/cheeseburger.yaml b/openandroidinstaller/assets/configs/cheeseburger.yaml index 6a825fa9..a357ecb1 100644 --- a/openandroidinstaller/assets/configs/cheeseburger.yaml +++ b/openandroidinstaller/assets/configs/cheeseburger.yaml @@ -1,7 +1,10 @@ metadata: maintainer: SirRGB - devicename: OnePlus 5 - devicecode: cheeseburger + device_name: OnePlus 5 + device_code: cheeseburger + supported_device_codes: + - cheeseburger + - OnePlus5 twrp-link: cheeseburger_dumpling steps: unlock_bootloader: diff --git a/openandroidinstaller/assets/configs/d2s.yaml b/openandroidinstaller/assets/configs/d2s.yaml index 07bd6819..08b59a47 100644 --- a/openandroidinstaller/assets/configs/d2s.yaml +++ b/openandroidinstaller/assets/configs/d2s.yaml @@ -1,7 +1,9 @@ metadata: maintainer: Tobias Sterbak (tsterbak) - devicename: Samsung Galaxy Note 10+ - devicecode: d2s + device_name: Samsung Galaxy Note 10+ + device_code: d2s + supported_device_codes: + - d2s requirements: android: 12 steps: diff --git a/openandroidinstaller/assets/configs/dre.yaml b/openandroidinstaller/assets/configs/dre.yaml index 1b8be02a..f9994757 100644 --- a/openandroidinstaller/assets/configs/dre.yaml +++ b/openandroidinstaller/assets/configs/dre.yaml @@ -1,7 +1,10 @@ metadata: maintainer: Tobias Sterbak (tsterbak) - devicename: OnePlus Nord N200 - devicecode: dre + device_name: OnePlus Nord N200 + device_code: dre + supported_device_codes: + - dre + - NordN200 requirements: android: 11 steps: diff --git a/openandroidinstaller/assets/configs/dumpling.yaml b/openandroidinstaller/assets/configs/dumpling.yaml index a2324245..e358b8a7 100644 --- a/openandroidinstaller/assets/configs/dumpling.yaml +++ b/openandroidinstaller/assets/configs/dumpling.yaml @@ -1,7 +1,10 @@ metadata: maintainer: SirRGB - devicename: OnePlus 5T - devicecode: dumpling + device_name: OnePlus 5T + device_code: dumpling + supported_device_codes: + - dumpling + - OnePlus5T twrp-link: cheeseburger_dumpling steps: unlock_bootloader: diff --git a/openandroidinstaller/assets/configs/enchilada.yaml b/openandroidinstaller/assets/configs/enchilada.yaml index e1da4282..e1eeae7f 100644 --- a/openandroidinstaller/assets/configs/enchilada.yaml +++ b/openandroidinstaller/assets/configs/enchilada.yaml @@ -1,7 +1,10 @@ metadata: maintainer: Tobias Sterbak (tsterbak) - devicename: OnePlus 6 - devicecode: enchilada + device_name: OnePlus 6 + device_code: enchilada + supported_device_codes: + - enchilada + - OnePlus6 requirements: android: 11 steps: diff --git a/openandroidinstaller/assets/configs/fajita.yaml b/openandroidinstaller/assets/configs/fajita.yaml index 8ce4c1a2..2bfb76f1 100644 --- a/openandroidinstaller/assets/configs/fajita.yaml +++ b/openandroidinstaller/assets/configs/fajita.yaml @@ -1,7 +1,10 @@ metadata: maintainer: Tobias Sterbak (tsterbak) - devicename: OnePlus 6T - devicecode: fajita + device_name: OnePlus 6T + device_code: fajita + supported_device_codes: + - fajita + - OnePlus6T requirements: android: 11 steps: diff --git a/openandroidinstaller/assets/configs/guacamole.yaml b/openandroidinstaller/assets/configs/guacamole.yaml index 129d7b98..8aeec6f0 100644 --- a/openandroidinstaller/assets/configs/guacamole.yaml +++ b/openandroidinstaller/assets/configs/guacamole.yaml @@ -1,7 +1,10 @@ metadata: maintainer: Tobias Sterbak (tsterbak) - devicename: OnePlus 7 Pro - devicecode: guacamole + device_name: OnePlus 7 Pro + device_code: guacamole + supported_device_codes: + - guacamole + - OnePlus7Pro requirements: android: 12 steps: diff --git a/openandroidinstaller/assets/configs/guacamoleb.yaml b/openandroidinstaller/assets/configs/guacamoleb.yaml index e39c9378..264d5e0d 100644 --- a/openandroidinstaller/assets/configs/guacamoleb.yaml +++ b/openandroidinstaller/assets/configs/guacamoleb.yaml @@ -1,7 +1,10 @@ metadata: maintainer: Tobias Sterbak (tsterbak) - devicename: OnePlus 7 - devicecode: guacamoleb + device_name: OnePlus 7 + device_code: guacamoleb + supported_device_codes: + - guacamoleb + - OnePlus7 requirements: android: 12 steps: diff --git a/openandroidinstaller/assets/configs/hotdog.yaml b/openandroidinstaller/assets/configs/hotdog.yaml index 15cc7015..676ecc1e 100644 --- a/openandroidinstaller/assets/configs/hotdog.yaml +++ b/openandroidinstaller/assets/configs/hotdog.yaml @@ -1,7 +1,10 @@ metadata: maintainer: Tobias Sterbak (tsterbak) - devicename: OnePlus 7T Pro - devicecode: hotdog + device_name: OnePlus 7T Pro + device_code: hotdog + supported_device_codes: + - hotdog + - OnePlus7TPro requirements: android: 12 steps: diff --git a/openandroidinstaller/assets/configs/hotdogb.yaml b/openandroidinstaller/assets/configs/hotdogb.yaml index da1c487a..be3773aa 100644 --- a/openandroidinstaller/assets/configs/hotdogb.yaml +++ b/openandroidinstaller/assets/configs/hotdogb.yaml @@ -1,7 +1,10 @@ metadata: maintainer: Tobias Sterbak (tsterbak) - devicename: OnePlus 7T - devicecode: hotdogb + device_name: OnePlus 7T + device_code: hotdogb + supported_device_codes: + - hotdogb + - OnePlus7T requirements: android: 12 steps: diff --git a/openandroidinstaller/assets/configs/sargo.yaml b/openandroidinstaller/assets/configs/sargo.yaml index 2e19de38..c4515fbd 100644 --- a/openandroidinstaller/assets/configs/sargo.yaml +++ b/openandroidinstaller/assets/configs/sargo.yaml @@ -1,7 +1,9 @@ metadata: maintainer: Tobias Sterbak (tsterbak) - devicename: Pixel 3a - devicecode: sargo + device_name: Pixel 3a + device_code: sargo + supported_device_codes: + - sargo requirements: android: 12.1.0 steps: diff --git a/openandroidinstaller/assets/configs/yuga.yaml b/openandroidinstaller/assets/configs/yuga.yaml index 16409933..00df8601 100644 --- a/openandroidinstaller/assets/configs/yuga.yaml +++ b/openandroidinstaller/assets/configs/yuga.yaml @@ -1,7 +1,10 @@ metadata: maintainer: Tobias Sterbak (tsterbak) - devicename: Sony Xperia Z - devicecode: yuga + device_name: Sony Xperia Z + device_code: yuga + supported_device_codes: + - yuga + - C6603 steps: unlock_bootloader: - type: confirm_button diff --git a/openandroidinstaller/installer_config.py b/openandroidinstaller/installer_config.py index 62aa1a01..520616fc 100644 --- a/openandroidinstaller/installer_config.py +++ b/openandroidinstaller/installer_config.py @@ -50,23 +50,6 @@ def __init__( class InstallerConfig: - # map some detected device codes to their real code. - device_code_mapping: Dict[str, str] = { - # Sony issues - "C6603": "yuga", - # OnePlus issues - "OnePlus5": "cheeseburger", - "OnePlus5T": "dumpling", - "OnePlus6": "enchilada", - "OnePlus6T": "fajita", - "OnePlus7": "guacamoleb", - "OnePlus7Pro": "guacamole", - "OnePlus7T": "hotdogb", - "OnePlus7TPro": "hotdog", - "Nord": "avicii", - "NordN200": "dre", - } - def __init__( self, unlock_bootloader: List[Step], @@ -78,15 +61,10 @@ def __init__( self.flash_recovery = flash_recovery self.metadata = metadata self.requirements = requirements - self.device_code = metadata.get("devicecode") + self.device_code = metadata.get("device_code") + self.supported_device_codes = metadata.get("supported_device_codes") self.twrp_link = metadata.get("twrp-link") - # manage device codes and alternative device codes/names - inverted_mapping: Dict[str, str] = dict(map(reversed, self.device_code_mapping.items())) # type: ignore - self.alternative_device_code = inverted_mapping.get( - self.device_code, self.device_code # type: ignore - ) - @classmethod def from_file(cls, path): with open(path, "r", encoding="utf-8") as stream: @@ -118,17 +96,27 @@ def from_file(cls, path): return cls(unlock_bootloader, flash_recovery, metadata, requirements) +def _find_config_file(device_code: str, config_path: Path) -> Optional[Path]: + """Find the config file which is supported by the given device code.""" + for path in config_path.rglob("*.yaml"): + with open(path, "r", encoding="utf-8") as stream: + try: + raw_config = dict(yaml.safe_load(stream)) + if device_code in raw_config.get("metadata", dict()).get("supported_device_codes", []): + logger.info(f"Device code '{device_code}' is supported by config '{path}'.") + return path + except: + pass + return None + + def _load_config(device_code: str, config_path: Path) -> Optional[InstallerConfig]: """ Function to load a function from given path and directory path. Try to load local file in the same directory as the executable first, then load from assets. """ - # try loading a custom local file first - mapped_device_code = InstallerConfig.device_code_mapping.get( - device_code, device_code - ) - custom_path = Path.cwd().joinpath(Path(f"{mapped_device_code}.yaml")) + custom_path = _find_config_file(device_code, config_path=Path.cwd()) try: config = InstallerConfig.from_file(custom_path) logger.info(f"Loaded custom device config from {custom_path}.") @@ -136,7 +124,9 @@ def _load_config(device_code: str, config_path: Path) -> Optional[InstallerConfi return config except FileNotFoundError: # if no localfile, then try to load a config file from assets - path = config_path.joinpath(Path(f"{mapped_device_code}.yaml")) + path = _find_config_file(device_code, config_path) + + # path = config_path.joinpath(Path(f"{mapped_device_code}.yaml")) try: config = InstallerConfig.from_file(path) logger.info(f"Loaded device config from {path}.") @@ -168,8 +158,9 @@ def validate_config(config: str) -> bool: { "metadata": { "maintainer": str, - "devicename": str, - "devicecode": str, + "device_name": str, + "device_code": str, + "supported_device_codes": [str], schema.Optional("twrp-link"): str, }, schema.Optional("requirements"): { diff --git a/openandroidinstaller/utils.py b/openandroidinstaller/utils.py index 7a83cb83..bc317041 100644 --- a/openandroidinstaller/utils.py +++ b/openandroidinstaller/utils.py @@ -14,7 +14,7 @@ # Author: Tobias Sterbak import zipfile -from typing import Optional +from typing import Optional, List import requests from loguru import logger @@ -40,7 +40,7 @@ def get_download_link(devicecode: str) -> Optional[str]: def image_works_with_device( - device_code: str, alternative_device_code: str, image_path: str + supported_device_codes: List[str], image_path: str ) -> bool: """Determine if an image works for the given device.""" with zipfile.ZipFile(image_path) as image_zip: @@ -51,9 +51,7 @@ def image_works_with_device( supported_devices = str(metadata[-1]).split("=")[-1][:-3].split(",") logger.info(f"Image works with device: {supported_devices}") - if (device_code in supported_devices) or ( - alternative_device_code in supported_devices - ): + if any(code in supported_devices for code in supported_device_codes): logger.success("Device supported by the selected image.") return True else: diff --git a/openandroidinstaller/views/select_view.py b/openandroidinstaller/views/select_view.py index 705880b9..ac65fd5d 100644 --- a/openandroidinstaller/views/select_view.py +++ b/openandroidinstaller/views/select_view.py @@ -115,7 +115,7 @@ def build(self): # download link self.download_link = get_download_link( - self.state.config.metadata.get("devicecode", "ERROR") + self.state.config.metadata.get("device_code", "NOTFOUND") ) # attach hidden dialogues @@ -256,10 +256,8 @@ def pick_image_result(self, e: FilePickerResultEvent): logger.info("No image selected.") # check if the image works with the device and show the filename in different colors accordingly if e.files: - device_code = self.state.config.device_code if image_works_with_device( - device_code=device_code, - alternative_device_code=self.state.config.alternative_device_code, + supported_device_codes=self.state.config.supported_device_codes, image_path=self.state.image_path, ): self.selected_image.color = colors.GREEN @@ -300,8 +298,7 @@ def enable_button_if_ready(self, e): device_code = self.state.config.device_code if not ( image_works_with_device( - device_code=device_code, - alternative_device_code=self.state.config.alternative_device_code, + supported_device_codes=self.state.config.supported_device_codes, image_path=self.state.image_path, ) and recovery_works_with_device( diff --git a/openandroidinstaller/views/start_view.py b/openandroidinstaller/views/start_view.py index 44c6d6c8..57e4d3c5 100644 --- a/openandroidinstaller/views/start_view.py +++ b/openandroidinstaller/views/start_view.py @@ -244,7 +244,7 @@ def search_devices(self, e): self.state.is_ab = is_ab if self.state.config: device_name = self.state.config.metadata.get( - "devicename", "No device name in config." + "device_name", "No device name in config." ) else: device_name = None @@ -254,7 +254,7 @@ def search_devices(self, e): self.continue_button.disabled = False self.bootloader_switch.disabled = False # overwrite the text field with the real name from the config - self.device_name.value = f"{device_name} (code: {InstallerConfig.device_code_mapping.get(device_code, device_code)})" + self.device_name.value = f"{device_name} (code: {self.state.config.device_code})" self.device_name.color = colors.GREEN else: # failed to load config