From 798d11450a098141b01454d81fada74b832725fd Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Wed, 15 Apr 2026 21:04:51 +0300 Subject: [PATCH 01/55] Add website-targeted JavaScript Skin Designer integration --- docs/website/content/skindesigner.md | 6 + docs/website/hugo.toml | 7 + .../layouts/_default/skindesigner.html | 239 ++++++++++++++++++ ...ename1_tools_skindesigner_ShouldExecute.js | 25 +- scripts/website/build.sh | 68 +++++ 5 files changed, 343 insertions(+), 2 deletions(-) create mode 100644 docs/website/content/skindesigner.md create mode 100644 docs/website/layouts/_default/skindesigner.html diff --git a/docs/website/content/skindesigner.md b/docs/website/content/skindesigner.md new file mode 100644 index 0000000000..d8f132acf2 --- /dev/null +++ b/docs/website/content/skindesigner.md @@ -0,0 +1,6 @@ ++++ +title = "Skin Designer" +layout = "skindesigner" +url = "/skindesigner/" +summary = "Build and download custom Codename One device skins right in your browser." ++++ diff --git a/docs/website/hugo.toml b/docs/website/hugo.toml index bccb71fa25..c1d67cf5e7 100644 --- a/docs/website/hugo.toml +++ b/docs/website/hugo.toml @@ -91,6 +91,13 @@ name = "Playground" url = "/playground/" weight = 17 +[[menu.main]] +parent = "developers" +name = "Skin Designer" +url = "/skindesigner/" +weight = 18 + + [[menu.main]] identifier = "resources" name = "RESOURCES" diff --git a/docs/website/layouts/_default/skindesigner.html b/docs/website/layouts/_default/skindesigner.html new file mode 100644 index 0000000000..ba10999d7b --- /dev/null +++ b/docs/website/layouts/_default/skindesigner.html @@ -0,0 +1,239 @@ +{{- define "main" }} +
+
+
+ Skin Designer icon +
+
+
+
+

Loading Skin Designer...

+
+ +
+
+ + + + +{{- end }} diff --git a/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_ShouldExecute.js b/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_ShouldExecute.js index 0ff205847e..5b82fd091d 100644 --- a/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_ShouldExecute.js +++ b/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_ShouldExecute.js @@ -2,12 +2,33 @@ var o = {}; + function notifyUiReady() { + var sendReady = function() { + try { + if (window.parent && window.parent !== window && window.parent.postMessage) { + window.parent.postMessage({ type: "cn1-skindesigner-ui-ready" }, "*"); + } + } catch (ignored) { + // Ignore cross-origin/sandbox restrictions in embedded website mode. + } + }; + + if (window.requestAnimationFrame) { + window.requestAnimationFrame(function() { + window.requestAnimationFrame(sendReady); + }); + } else { + window.setTimeout(sendReady, 48); + } + } + o.shouldExecute_ = function(callback) { - callback.error(new Error("Not implemented yet")); + callback.complete(true); }; o.isSupported_ = function(callback) { - callback.complete(false); + notifyUiReady(); + callback.complete(true); }; exports.com_codename1_tools_skindesigner_ShouldExecute= o; diff --git a/scripts/website/build.sh b/scripts/website/build.sh index c4c8f6118f..15160cd91c 100755 --- a/scripts/website/build.sh +++ b/scripts/website/build.sh @@ -22,6 +22,7 @@ WEBSITE_INCLUDE_JAVADOCS="${WEBSITE_INCLUDE_JAVADOCS:-false}" WEBSITE_INCLUDE_DEVGUIDE="${WEBSITE_INCLUDE_DEVGUIDE:-auto}" WEBSITE_INCLUDE_INITIALIZR="${WEBSITE_INCLUDE_INITIALIZR:-false}" WEBSITE_INCLUDE_PLAYGROUND="${WEBSITE_INCLUDE_PLAYGROUND:-false}" +WEBSITE_INCLUDE_SKINDESIGNER="${WEBSITE_INCLUDE_SKINDESIGNER:-false}" WEBSITE_BOOTSTRAP_CN1_SNAPSHOTS="${WEBSITE_BOOTSTRAP_CN1_SNAPSHOTS:-auto}" WEBSITE_CN1_VERSION="${WEBSITE_CN1_VERSION:-auto}" CN1_USER="${CN1_USER:-}" @@ -73,6 +74,14 @@ if [ "${WEBSITE_INCLUDE_PLAYGROUND}" = "auto" ]; then fi fi +if [ "${WEBSITE_INCLUDE_SKINDESIGNER}" = "auto" ]; then + if [ -n "${CN1_USER}" ] && [ -n "${CN1_TOKEN}" ]; then + WEBSITE_INCLUDE_SKINDESIGNER="true" + else + WEBSITE_INCLUDE_SKINDESIGNER="false" + fi +fi + if [ "${WEBSITE_BOOTSTRAP_CN1_SNAPSHOTS}" = "auto" ]; then WEBSITE_BOOTSTRAP_CN1_SNAPSHOTS="false" fi @@ -665,6 +674,64 @@ build_playground_for_site() { fi } + +build_skindesigner_for_site() { + if [ "${WEBSITE_INCLUDE_SKINDESIGNER}" != "true" ]; then + return + fi + + bootstrap_local_cn1_snapshots + + echo "Building Skin Designer JavaScript bundle for website..." >&2 + ( + cd "${REPO_ROOT}/scripts/skindesigner" + if [ "${WEBSITE_BOOTSTRAP_CN1_SNAPSHOTS}" = "true" ]; then + activate_bootstrapped_java17 + fi + + run_skindesigner_mvn() { + if command -v xvfb-run >/dev/null 2>&1; then + xvfb-run -a sh ./mvnw "$@" + else + sh ./mvnw "$@" + fi + } + + set_cn1_user_token "Skin Designer" + local skindesigner_workspace_args=() + if [ "${WEBSITE_BOOTSTRAP_CN1_SNAPSHOTS}" = "true" ]; then + skindesigner_workspace_args+=(-Dcn1.localWorkspace=true) + fi + + run_skindesigner_mvn -q -U -pl javascript -am \ + "${skindesigner_workspace_args[@]}" \ + -DskipTests \ + -Dautomated=true \ + -Dcodename1.platform=javascript \ + package + ) + + local output_dir="${WEBSITE_DIR}/static/skindesigner-app" + local result_zip="${REPO_ROOT}/scripts/skindesigner/javascript/target/result.zip" + if [ ! -f "${result_zip}" ]; then + result_zip="$(ls -1 "${REPO_ROOT}"/scripts/skindesigner/javascript/target/skindesigner-javascript-*.zip 2>/dev/null | head -n1 || true)" + fi + + if [ -z "${result_zip}" ] || [ ! -f "${result_zip}" ]; then + echo "Could not locate Skin Designer JavaScript build zip output in scripts/skindesigner/javascript/target." >&2 + exit 1 + fi + + rm -rf "${output_dir}" + mkdir -p "${output_dir}" + unzip -q -o "${result_zip}" -d "${output_dir}" + + if [ ! -f "${output_dir}/index.html" ]; then + echo "Skin Designer website bundle is missing index.html after extraction." >&2 + exit 1 + fi +} + if ! command -v "${HUGO_BIN}" >/dev/null 2>&1; then echo "Hugo binary not found. Install Hugo (extended) and retry." >&2 exit 1 @@ -674,6 +741,7 @@ build_javadocs_for_site build_developer_guide_for_site build_initializr_for_site build_playground_for_site +build_skindesigner_for_site cd "${WEBSITE_DIR}" From eebbcbc9d4c282cd0b4aae388a90d5db5e06aa0d Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Thu, 16 Apr 2026 05:02:06 +0300 Subject: [PATCH 02/55] Fix skindesigner page loader asset path --- docs/website/layouts/_default/skindesigner.html | 8 -------- 1 file changed, 8 deletions(-) diff --git a/docs/website/layouts/_default/skindesigner.html b/docs/website/layouts/_default/skindesigner.html index ba10999d7b..e91f63055f 100644 --- a/docs/website/layouts/_default/skindesigner.html +++ b/docs/website/layouts/_default/skindesigner.html @@ -2,7 +2,6 @@
- Skin Designer icon
@@ -86,13 +85,6 @@ radial-gradient(720px 360px at 100% 100%, rgba(52, 168, 196, 0.24), rgba(52, 168, 196, 0) 65%); } -.cn1-skindesigner-loader .icon { - width: 110px; - height: auto; - border-radius: 18px; - box-shadow: 0 10px 28px rgba(0, 0, 0, 0.25); -} - .cn1-loader-ring { width: 46px; height: 46px; From a55dca46a097d073ce483f5d3218be4932978f56 Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Thu, 16 Apr 2026 06:14:52 +0300 Subject: [PATCH 03/55] Ensure skindesigner app is built and embedded from app root --- docs/website/layouts/_default/skindesigner.html | 2 +- scripts/website/build.sh | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/docs/website/layouts/_default/skindesigner.html b/docs/website/layouts/_default/skindesigner.html index e91f63055f..9d59f43e4c 100644 --- a/docs/website/layouts/_default/skindesigner.html +++ b/docs/website/layouts/_default/skindesigner.html @@ -11,7 +11,7 @@ diff --git a/scripts/website/build.sh b/scripts/website/build.sh index 15160cd91c..a289b1cd8e 100755 --- a/scripts/website/build.sh +++ b/scripts/website/build.sh @@ -22,7 +22,7 @@ WEBSITE_INCLUDE_JAVADOCS="${WEBSITE_INCLUDE_JAVADOCS:-false}" WEBSITE_INCLUDE_DEVGUIDE="${WEBSITE_INCLUDE_DEVGUIDE:-auto}" WEBSITE_INCLUDE_INITIALIZR="${WEBSITE_INCLUDE_INITIALIZR:-false}" WEBSITE_INCLUDE_PLAYGROUND="${WEBSITE_INCLUDE_PLAYGROUND:-false}" -WEBSITE_INCLUDE_SKINDESIGNER="${WEBSITE_INCLUDE_SKINDESIGNER:-false}" +WEBSITE_INCLUDE_SKINDESIGNER="${WEBSITE_INCLUDE_SKINDESIGNER:-true}" WEBSITE_BOOTSTRAP_CN1_SNAPSHOTS="${WEBSITE_BOOTSTRAP_CN1_SNAPSHOTS:-auto}" WEBSITE_CN1_VERSION="${WEBSITE_CN1_VERSION:-auto}" CN1_USER="${CN1_USER:-}" @@ -75,11 +75,7 @@ if [ "${WEBSITE_INCLUDE_PLAYGROUND}" = "auto" ]; then fi if [ "${WEBSITE_INCLUDE_SKINDESIGNER}" = "auto" ]; then - if [ -n "${CN1_USER}" ] && [ -n "${CN1_TOKEN}" ]; then - WEBSITE_INCLUDE_SKINDESIGNER="true" - else - WEBSITE_INCLUDE_SKINDESIGNER="false" - fi + WEBSITE_INCLUDE_SKINDESIGNER="true" fi if [ "${WEBSITE_BOOTSTRAP_CN1_SNAPSHOTS}" = "auto" ]; then From 715fcb9a99cf1c5d2a8b7dbdba6e4f458601228e Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Thu, 16 Apr 2026 06:40:36 +0300 Subject: [PATCH 04/55] Bootstrap skindesigner ZipSupport before website JS build --- scripts/website/build.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/scripts/website/build.sh b/scripts/website/build.sh index a289b1cd8e..cf780ce531 100755 --- a/scripts/website/build.sh +++ b/scripts/website/build.sh @@ -699,6 +699,14 @@ build_skindesigner_for_site() { skindesigner_workspace_args+=(-Dcn1.localWorkspace=true) fi + # Ensure attached classifier artifact skindesigner-ZipSupport:jar:common + # is present in the local Maven repo before building skindesigner-common. + run_skindesigner_mvn -q -U -pl cn1libs/ZipSupport -am \ + "${skindesigner_workspace_args[@]}" \ + -DskipTests \ + -Dcodename1.platform=javascript \ + install + run_skindesigner_mvn -q -U -pl javascript -am \ "${skindesigner_workspace_args[@]}" \ -DskipTests \ From 85d7eedba7cd51e095a1a02e55d1f1dfe2b0721b Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Thu, 16 Apr 2026 07:23:19 +0300 Subject: [PATCH 05/55] Prepare skindesigner ZipSupport jar from repository assets --- .../tools/sync-zipsupport-from-initializr.sh | 16 ++++++++++++++++ scripts/website/build.sh | 1 + 2 files changed, 17 insertions(+) create mode 100755 scripts/skindesigner/tools/sync-zipsupport-from-initializr.sh diff --git a/scripts/skindesigner/tools/sync-zipsupport-from-initializr.sh b/scripts/skindesigner/tools/sync-zipsupport-from-initializr.sh new file mode 100755 index 0000000000..ecef8c3d37 --- /dev/null +++ b/scripts/skindesigner/tools/sync-zipsupport-from-initializr.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +set -eu + +ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" +INITIALIZR_CN1LIBS_DIR="$ROOT_DIR/../initializr/cn1libs" +TARGET_CN1LIBS_DIR="$ROOT_DIR/cn1libs" + +if [ ! -f "$INITIALIZR_CN1LIBS_DIR/ZipSupport/jars/main.zip" ]; then + echo "Missing source file: $INITIALIZR_CN1LIBS_DIR/ZipSupport/jars/main.zip" >&2 + exit 1 +fi + +mkdir -p "$TARGET_CN1LIBS_DIR/ZipSupport/jars" +cp "$INITIALIZR_CN1LIBS_DIR/ZipSupport/jars/main.zip" "$TARGET_CN1LIBS_DIR/ZipSupport/jars/main.zip" + +echo "Prepared skindesigner ZipSupport jars/main.zip from scripts/initializr/cn1libs" diff --git a/scripts/website/build.sh b/scripts/website/build.sh index cf780ce531..4beb0f38a7 100755 --- a/scripts/website/build.sh +++ b/scripts/website/build.sh @@ -681,6 +681,7 @@ build_skindesigner_for_site() { echo "Building Skin Designer JavaScript bundle for website..." >&2 ( cd "${REPO_ROOT}/scripts/skindesigner" + ./tools/sync-zipsupport-from-initializr.sh if [ "${WEBSITE_BOOTSTRAP_CN1_SNAPSHOTS}" = "true" ]; then activate_bootstrapped_java17 fi From c356f44e3b94ae71d98b9f314352ff8b78b9053a Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Thu, 16 Apr 2026 07:48:48 +0300 Subject: [PATCH 06/55] Normalize skindesigner ZipSupport metadata during sync --- .../tools/sync-zipsupport-from-initializr.sh | 61 +++++++++++++++++-- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/scripts/skindesigner/tools/sync-zipsupport-from-initializr.sh b/scripts/skindesigner/tools/sync-zipsupport-from-initializr.sh index ecef8c3d37..eba00a320d 100755 --- a/scripts/skindesigner/tools/sync-zipsupport-from-initializr.sh +++ b/scripts/skindesigner/tools/sync-zipsupport-from-initializr.sh @@ -4,13 +4,66 @@ set -eu ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" INITIALIZR_CN1LIBS_DIR="$ROOT_DIR/../initializr/cn1libs" TARGET_CN1LIBS_DIR="$ROOT_DIR/cn1libs" +SOURCE_ZIP="$INITIALIZR_CN1LIBS_DIR/ZipSupport/jars/main.zip" +TARGET_ZIP="$TARGET_CN1LIBS_DIR/ZipSupport/jars/main.zip" -if [ ! -f "$INITIALIZR_CN1LIBS_DIR/ZipSupport/jars/main.zip" ]; then - echo "Missing source file: $INITIALIZR_CN1LIBS_DIR/ZipSupport/jars/main.zip" >&2 +if [ ! -f "$SOURCE_ZIP" ]; then + echo "Missing source file: $SOURCE_ZIP" >&2 exit 1 fi mkdir -p "$TARGET_CN1LIBS_DIR/ZipSupport/jars" -cp "$INITIALIZR_CN1LIBS_DIR/ZipSupport/jars/main.zip" "$TARGET_CN1LIBS_DIR/ZipSupport/jars/main.zip" -echo "Prepared skindesigner ZipSupport jars/main.zip from scripts/initializr/cn1libs" +python3 - "$SOURCE_ZIP" "$TARGET_ZIP" <<'PY' +import os +import tempfile +import zipfile +import sys + +source_zip = sys.argv[1] +target_zip = sys.argv[2] + +old_prefix = "META-INF/codenameone/com.codename1.initializr/initializr-ZipSupport/" +new_prefix = "META-INF/codenameone/com.codename1.tools.skindesigner/skindesigner-ZipSupport/" + +with tempfile.NamedTemporaryFile(delete=False) as tmp: + tmp_path = tmp.name + +try: + with zipfile.ZipFile(source_zip, "r") as src, zipfile.ZipFile(tmp_path, "w") as dst: + for info in src.infolist(): + data = src.read(info.filename) + filename = info.filename + + if filename.startswith(old_prefix): + filename = new_prefix + filename[len(old_prefix):] + + if filename.endswith("codenameone_library_required.properties"): + text = data.decode("utf-8") + filtered = [] + for line in text.splitlines(): + if line.startswith("codename1.arg.java.version="): + continue + filtered.append(line) + data = ("\n".join(filtered) + "\n").encode("utf-8") + + out = zipfile.ZipInfo(filename) + out.date_time = info.date_time + out.compress_type = info.compress_type + out.external_attr = info.external_attr + out.comment = info.comment + out.extra = info.extra + out.create_system = info.create_system + out.create_version = info.create_version + out.extract_version = info.extract_version + out.flag_bits = info.flag_bits + out.internal_attr = info.internal_attr + dst.writestr(out, data) + + os.replace(tmp_path, target_zip) +finally: + if os.path.exists(tmp_path): + os.unlink(tmp_path) +PY + +echo "Prepared skindesigner ZipSupport jars/main.zip from scripts/initializr/cn1libs with skindesigner metadata" From 6a9c56dfcccc526b290cf04f458351abde87b6ee Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Thu, 16 Apr 2026 09:30:00 +0300 Subject: [PATCH 07/55] Polish Skin Designer UI and wire website dark mode --- .../common/src/main/css/theme.css | 138 +++++++++++++---- .../tools/skindesigner/SkinDesigner.java | 142 ++++++++++++++++-- .../skindesigner/WebsiteThemeNative.java | 8 + ...ename1_tools_skindesigner_ShouldExecute.js | 21 --- ...1_tools_skindesigner_WebsiteThemeNative.js | 76 ++++++++++ 5 files changed, 320 insertions(+), 65 deletions(-) create mode 100644 scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/WebsiteThemeNative.java create mode 100644 scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_WebsiteThemeNative.js diff --git a/scripts/skindesigner/common/src/main/css/theme.css b/scripts/skindesigner/common/src/main/css/theme.css index 43dcf1f4a7..07c240d0d7 100644 --- a/scripts/skindesigner/common/src/main/css/theme.css +++ b/scripts/skindesigner/common/src/main/css/theme.css @@ -1,55 +1,135 @@ -/** Define Theme Constants here */ #Constants { includeNativeBool: true; defaultSourceDPIInt: "0"; useLargerTextScaleBool: true; } -/** Style for Button class */ -Button { - font-family: "native:MainLight"; - font-size: 3mm; +SkinDesignerForm { + background: #eef3ff; +} + +SkinDesignerFormDark { + background: #0a111d; +} + +SkinDesignerTabsContainer { + background: #eef3ff; + border: none; +} + +SkinDesignerTabsContainerDark { + background: #0a111d; + border: none; } -/** Style for App Title Bar Text */ -Title { +Tab { + background: #f3f4f7; + color: #112247; + border: 1px solid #d9dee8; font-family: "native:MainLight"; - font-size: 6mm; + font-size: 2.8mm; + text-align: center; + margin: 0; + padding: 0.8mm; } -/** Style for Dialog body */ -DialogBody { +TabDark { + background: #102b66; + color: #f5f8ff; + border: 1px solid #4c6ea8; font-family: "native:MainLight"; font-size: 2.8mm; + text-align: center; + margin: 0; + padding: 0.8mm; +} + +TabSelected { + background: #ffffff; + color: #112247; + border: 2px solid #2f6bff; +} + +TabSelectedDark { + background: #163575; + color: #f5f8ff; + border: 2px solid #4d86ff; +} + +TabsContainer { + background: #eef3ff; +} + +TabsContainerDark { + background: #0a111d; } -/** Style for Dialog title bar text */ -DialogTitle { +SkinDesignerCard { + background: #ffffff; + border: 1px solid #d9dee8; + border-radius: 2mm; + margin: 1mm; + padding: 1.2mm; +} + +SkinDesignerCardDark { + background: #102b66; + border: 1px solid #4c6ea8; + border-radius: 2mm; + margin: 1mm; + padding: 1.2mm; +} + +SkinDesignerFieldLabel { + color: #112247; font-family: "native:MainLight"; - font-size: 4.5mm; + font-size: 2.8mm; + margin: 0; + padding: 0.8mm 0.3mm 0.2mm 0.3mm; + background: transparent; } -/** Style for the side menu */ -SideNavigationPanel { - background: white; - padding: 2mm 1mm 1mm 1mm; +SkinDesignerFieldLabelDark { + color: #f5f8ff; + font-family: "native:MainLight"; + font-size: 2.8mm; + margin: 0; + padding: 0.8mm 0.3mm 0.2mm 0.3mm; + background: transparent; } -@media platform-ios { - /** iOS Only styles for side menu. */ - SideNavigationPanel { - /** Extra top padding to deal with notch on iPhoneX */ - padding: 6mm 1mm 1mm 1mm; - } +SkinDesignerField { + color: #112247; + background: #ffffff; + border: 1px solid #d9dee8; + padding: 1mm; + font-family: "native:MainLight"; + font-size: 3mm; } -/** Style for commands in side menu. */ -SideCommand { +SkinDesignerFieldDark { + color: #f5f8ff; + background: #163575; + border: 1px solid #4c6ea8; padding: 1mm; + font-family: "native:MainLight"; + font-size: 3mm; +} + +SkinDesignerActionButton { + color: #ffffff; + background: #2f6bff; + border: none; + padding: 0.9mm 1.4mm; + font-family: "native:MainLight"; + font-size: 2.7mm; +} + +SkinDesignerActionButtonDark { + color: #f5f8ff; + background: #4d86ff; border: none; - text-decoration: none; - color: black; + padding: 0.9mm 1.4mm; font-family: "native:MainLight"; - font-size: 4mm; - border-bottom: 2px solid #cccccc; + font-size: 2.7mm; } diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 95fd8546de..c9f6ad2fb6 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -28,6 +28,7 @@ import com.codename1.ui.TextArea; import com.codename1.ui.TextField; import com.codename1.ui.Toolbar; +import com.codename1.ui.UITimer; import com.codename1.ui.geom.Rectangle; import com.codename1.ui.layouts.BorderLayout; import com.codename1.ui.layouts.BoxLayout; @@ -49,12 +50,16 @@ public class SkinDesigner extends Lifecycle { private static final String[] NATIVE_THEMES = {"iOS 7+", "iOS 6", "Android 4 +","Android 2.x", "Windows"}; private static final String[] NATIVE_THEME_FILES = {"iOS7Theme.res", "iPhoneTheme.res", "android_holo_light.res","androidTheme.res", "winTheme.res"}; + private boolean websiteDarkMode; @Override public void runApp() { Form skinDesignerForm = new Form("Skin Designer", new BorderLayout()); + skinDesignerForm.setUIID("SkinDesignerForm"); Validator vl = new Validator(); final Tabs details = new Tabs(); + details.getTabsContainer().setUIID("SkinDesignerTabsContainer"); + details.getTabsContainer().setScrollableX(false); Style titleCommand = UIManager.getInstance().getComponentStyle("Command"); ImageSettings imPortrait = createImageSettings("/skin.png", "port", vl); ImageSettings imLandscape = createImageSettings("/skin_l.png", "lan", vl); @@ -62,24 +67,28 @@ public void runApp() { skinDesignerForm.add(BorderLayout.CENTER, details); Picker nativeTheme = new Picker(); + nativeTheme.setUIID("SkinDesignerField"); nativeTheme.setStrings(NATIVE_THEMES); nativeTheme.setSelectedString(NATIVE_THEMES[0]); nativeTheme.setRenderingPrototype("XXXXXXXXXXXXXXXXXXX"); autoSave(nativeTheme, "nativeTheme"); Picker platformName = new Picker(); + platformName.setUIID("SkinDesignerField"); platformName.setStrings("ios", "and", "win","rim", "se"); platformName.setSelectedString("ios"); platformName.setRenderingPrototype("XXXX"); autoSave(platformName, "platformName"); OnOffSwitch tablet = new OnOffSwitch(); + tablet.setUIID("SkinDesignerField"); tablet.setValue(false); autoSave(tablet, "tablet"); TextField systemFontFamily = new TextField("Helvetica", "System Font Family", 20, TextField.ANY); TextField proportionalFontFamily = new TextField("Helvetica", "Proportional Font Family", 20, TextField.ANY); TextField monospaceFontFamily = new TextField("Courier", "Monospace Font Family", 20, TextField.ANY); + styleFields(systemFontFamily, proportionalFontFamily, monospaceFontFamily); autoSave(systemFontFamily, "systemFontFamily"); autoSave(proportionalFontFamily, "proportionalFontFamily"); autoSave(monospaceFontFamily, "monospaceFontFamily"); @@ -87,26 +96,31 @@ public void runApp() { TextField smallFontSize = new TextField("11", "Small Font Size", 20, TextField.NUMERIC); TextField mediumFontSize = new TextField("14", "Medium Font Size", 20, TextField.NUMERIC); TextField largeFontSize = new TextField("20", "Large Font Size", 20, TextField.NUMERIC); + styleFields(smallFontSize, mediumFontSize, largeFontSize); autoSave(smallFontSize, "smallFontSize"); autoSave(mediumFontSize, "mediumFontSize"); autoSave(largeFontSize, "largeFontSize"); TextField pixelRatio = new TextField("6.4173236936575", "Pixel Ratio - pixels per millimeter", 20, TextField.DECIMAL); + pixelRatio.setUIID("SkinDesignerField"); autoSave(pixelRatio, "pixelRatio"); Picker overrideNamePrimary = new Picker(); + overrideNamePrimary.setUIID("SkinDesignerField"); overrideNamePrimary.setStrings("phone", "tablet", "desktop"); overrideNamePrimary.setSelectedString("phone"); overrideNamePrimary.setRenderingPrototype("XXXXXXXX"); autoSave(overrideNamePrimary, "overrideNamePrimary"); Picker overrideNameSecondary = new Picker(); + overrideNameSecondary.setUIID("SkinDesignerField"); overrideNameSecondary.setStrings("ios", "android", "windows"); overrideNameSecondary.setSelectedString("ios"); overrideNameSecondary.setRenderingPrototype("XXXXXXXX"); autoSave(overrideNameSecondary, "overrideNameSecondary"); Picker overrideNameLast = new Picker(); + overrideNameLast.setUIID("SkinDesignerField"); overrideNameLast.setStrings("iphone", "ipad", "android-phone", "android-tablet", "desktop"); overrideNameLast.setSelectedString("iphone"); overrideNameLast.setRenderingPrototype("XXXXXXXX"); @@ -114,27 +128,28 @@ public void runApp() { Container settingsContainer = BoxLayout.encloseY( - new Label("Native Theme"), + labeledFieldTitle("Native Theme"), nativeTheme, - new Label("Platform Name"), + labeledFieldTitle("Platform Name"), platformName, - BorderLayout.center(new Label("Tablet")).add(BorderLayout.EAST, tablet), - new Label(systemFontFamily.getHint()), + BorderLayout.center(labeledFieldTitle("Tablet")).add(BorderLayout.EAST, tablet), + labeledFieldTitle(systemFontFamily.getHint()), systemFontFamily, - new Label(proportionalFontFamily.getHint()), + labeledFieldTitle(proportionalFontFamily.getHint()), proportionalFontFamily, new FloatingHint(monospaceFontFamily), - new Label(smallFontSize.getHint()), + labeledFieldTitle(smallFontSize.getHint()), smallFontSize, - new Label(mediumFontSize.getHint()), + labeledFieldTitle(mediumFontSize.getHint()), mediumFontSize, - new Label(largeFontSize.getHint()), + labeledFieldTitle(largeFontSize.getHint()), largeFontSize, - new Label(pixelRatio.getHint()), + labeledFieldTitle(pixelRatio.getHint()), pixelRatio, - new Label("Platform Overrides"), + labeledFieldTitle("Platform Overrides"), BoxLayout.encloseX(overrideNamePrimary, overrideNameSecondary, overrideNameLast) ); + settingsContainer.setUIID("SkinDesignerCard"); settingsContainer.setScrollableY(true); Style tab = UIManager.getInstance().getComponentStyle("Tab"); @@ -145,9 +160,9 @@ public void runApp() { FontImage landscapeIconSel = FontImage.createMaterial(FontImage.MATERIAL_STAY_CURRENT_LANDSCAPE, tabSel, 4.5f); FontImage settingsIcon = FontImage.createMaterial(FontImage.MATERIAL_SETTINGS, tab, 3.5f); FontImage settingsIconSel = FontImage.createMaterial(FontImage.MATERIAL_SETTINGS, tabSel, 3.5f); - details.addTab("Portrait", portraitIcon, imPortrait.getContainer()); - details.addTab("Landscape", landscapeIcon, imLandscape.getContainer()); - details.addTab("Settings", settingsIcon, settingsContainer); + details.addTab("", portraitIcon, imPortrait.getContainer()); + details.addTab("", landscapeIcon, imLandscape.getContainer()); + details.addTab("", settingsIcon, settingsContainer); details.setTabSelectedIcon(0, portraitIconSel); details.setTabSelectedIcon(1, landscapeIconSel); details.setTabSelectedIcon(2, settingsIconSel); @@ -209,9 +224,103 @@ public void runApp() { }); } + initWebsiteThemeSync(skinDesignerForm); skinDesignerForm.show(); } + private Label labeledFieldTitle(String text) { + Label label = new Label(text); + label.setUIID("SkinDesignerFieldLabel"); + return label; + } + + private void styleFields(TextField... fields) { + for (TextField field : fields) { + field.setUIID("SkinDesignerField"); + } + } + + private void initWebsiteThemeSync(Form form) { + WebsiteThemeNative websiteThemeNative = NativeLookup.create(WebsiteThemeNative.class); + if (websiteThemeNative == null || !websiteThemeNative.isSupported()) { + return; + } + websiteDarkMode = websiteThemeNative.isDarkMode(); + Display.getInstance().setDarkMode(websiteDarkMode); + applyWebsiteTheme(form, websiteDarkMode); + form.refreshTheme(); + websiteThemeNative.notifyUiReady(); + UITimer.timer(900, true, form, () -> { + boolean dark = websiteThemeNative.isDarkMode(); + if (dark != websiteDarkMode) { + websiteDarkMode = dark; + Display.getInstance().setDarkMode(dark); + applyWebsiteTheme(form, dark); + form.refreshTheme(); + } + }); + } + + private void applyWebsiteTheme(Container component, boolean dark) { + for (int i = 0; i < component.getComponentCount(); i++) { + com.codename1.ui.Component child = component.getComponentAt(i); + String uiid = child.getUIID(); + String themed = themedUiid(uiid, dark); + if (uiid != null && !uiid.equals(themed)) { + child.setUIID(themed); + } + if (child instanceof Container) { + applyWebsiteTheme((Container) child, dark); + } + } + String containerUiid = component.getUIID(); + String themedContainer = themedUiid(containerUiid, dark); + if (containerUiid != null && !containerUiid.equals(themedContainer)) { + component.setUIID(themedContainer); + } + } + + private String themedUiid(String uiid, boolean dark) { + if (uiid == null || uiid.length() == 0) { + return uiid; + } + if (dark) { + if (uiid.endsWith("Dark")) { + return uiid; + } + switch (uiid) { + case "SkinDesignerForm": + case "SkinDesignerTabsContainer": + case "SkinDesignerCard": + case "SkinDesignerField": + case "SkinDesignerFieldLabel": + case "Tab": + case "TabSelected": + case "TabsContainer": + return uiid + "Dark"; + default: + return uiid; + } + } + if (!uiid.endsWith("Dark")) { + return uiid; + } + String base = uiid.substring(0, uiid.length() - "Dark".length()); + switch (base) { + case "SkinDesignerForm": + case "SkinDesignerTabsContainer": + case "SkinDesignerCard": + case "SkinDesignerField": + case "SkinDesignerFieldLabel": + case "Tab": + case "TabSelected": + case "TabsContainer": + return base; + default: + return uiid; + } + } + interface ImageSettings { Container getContainer(); Image createSkinOverlay(); @@ -257,6 +366,7 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid } ScaleImageLabel sl = new ScaleImageLabel(img); Button imagePicker = new Button("Select Image"); + imagePicker.setUIID("SkinDesignerActionButton"); imagePicker.addActionListener((e) -> { Display.getInstance().openGallery((ee) -> { if(ee != null && ee.getSource() != null) { @@ -284,6 +394,7 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid final TextField screenHeightPixels = new TextField("480", "Height", 8, TextField.NUMERIC); final TextField screenPositionX = new TextField("40", "X", 8, TextField.NUMERIC); final TextField screenPositionY = new TextField("40", "Y", 8, TextField.NUMERIC); + styleFields(screenWidthPixels, screenHeightPixels, screenPositionX, screenPositionY); autoSave(screenWidthPixels, prefix + "Width"); autoSave(screenHeightPixels, prefix + "Height"); autoSave(screenPositionX, prefix + "X"); @@ -294,6 +405,7 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid addConstraint(screenPositionY, new NumericConstraint(false, 0, 5000, "Screen position must be a valid integer in the 0-5000 range")); Button aim = new Button(); + aim.setUIID("SkinDesignerActionButton"); FontImage.setMaterialIcon(aim, FontImage.MATERIAL_PAN_TOOL); aim.addActionListener(e -> @@ -304,11 +416,11 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid screenHeightPixels.getAsInt(1024))); final Container cnt = BoxLayout.encloseY(imagePicker, - BorderLayout.center( - new Label("Screen Position (X/Y/Width/Height)")). + BorderLayout.center(labeledFieldTitle("Screen Position (X/Y/Width/Height)")). add(BorderLayout.EAST, aim), GridLayout.encloseIn(4, screenPositionX, screenPositionY, screenWidthPixels, screenHeightPixels), sl); + cnt.setUIID("SkinDesignerCard"); cnt.setScrollableY(true); return new ImageSettings() { @Override diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/WebsiteThemeNative.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/WebsiteThemeNative.java new file mode 100644 index 0000000000..0c02cc0637 --- /dev/null +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/WebsiteThemeNative.java @@ -0,0 +1,8 @@ +package com.codename1.tools.skindesigner; + +import com.codename1.system.NativeInterface; + +public interface WebsiteThemeNative extends NativeInterface { + boolean isDarkMode(); + void notifyUiReady(); +} diff --git a/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_ShouldExecute.js b/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_ShouldExecute.js index 5b82fd091d..02638a1254 100644 --- a/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_ShouldExecute.js +++ b/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_ShouldExecute.js @@ -2,32 +2,11 @@ var o = {}; - function notifyUiReady() { - var sendReady = function() { - try { - if (window.parent && window.parent !== window && window.parent.postMessage) { - window.parent.postMessage({ type: "cn1-skindesigner-ui-ready" }, "*"); - } - } catch (ignored) { - // Ignore cross-origin/sandbox restrictions in embedded website mode. - } - }; - - if (window.requestAnimationFrame) { - window.requestAnimationFrame(function() { - window.requestAnimationFrame(sendReady); - }); - } else { - window.setTimeout(sendReady, 48); - } - } - o.shouldExecute_ = function(callback) { callback.complete(true); }; o.isSupported_ = function(callback) { - notifyUiReady(); callback.complete(true); }; diff --git a/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_WebsiteThemeNative.js b/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_WebsiteThemeNative.js new file mode 100644 index 0000000000..b4cd9b5471 --- /dev/null +++ b/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_WebsiteThemeNative.js @@ -0,0 +1,76 @@ +(function(exports){ + +var o = {}; + + function readWebsiteThemePreference() { + try { + var parentWindow = (window.parent && window.parent !== window) ? window.parent : null; + var parentDoc = parentWindow && parentWindow.document ? parentWindow.document : null; + var parentBody = parentDoc && parentDoc.body ? parentDoc.body : null; + var classes = parentBody && parentBody.classList ? parentBody.classList : null; + if (classes) { + if (classes.contains("dark") || classes.contains("cn1-skindesigner-dark")) { + return true; + } + if (classes.contains("light") || classes.contains("cn1-skindesigner-light")) { + return false; + } + } + + if (parentWindow && parentWindow.localStorage) { + var pref = parentWindow.localStorage.getItem("pref-theme"); + if (pref === "dark") { + return true; + } + if (pref === "light") { + return false; + } + } + + var mediaWindow = parentWindow || window; + if (mediaWindow.matchMedia) { + return mediaWindow.matchMedia("(prefers-color-scheme: dark)").matches; + } + } catch (ignored) { + // Ignore parent access failures and fallback below. + } + + if (window.matchMedia) { + return window.matchMedia("(prefers-color-scheme: dark)").matches; + } + + return false; + } + + o.isDarkMode_ = function(callback) { + callback.complete(!!readWebsiteThemePreference()); + }; + + o.notifyUiReady_ = function(callback) { + var sendReady = function() { + try { + if (window.parent && window.parent !== window && window.parent.postMessage) { + window.parent.postMessage({ type: "cn1-skindesigner-ui-ready" }, "*"); + } + } catch (ignored) { + // Ignore cross-origin or sandbox restrictions. + } + callback.complete(); + }; + + if (window.requestAnimationFrame) { + window.requestAnimationFrame(function() { + window.requestAnimationFrame(sendReady); + }); + } else { + window.setTimeout(sendReady, 48); + } + }; + + o.isSupported_ = function(callback) { + callback.complete(true); + }; + +exports.com_codename1_tools_skindesigner_WebsiteThemeNative = o; + +})(cn1_get_native_interfaces()); From a548fc39d9dcf98a88db965591277352bbca3dc6 Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Thu, 16 Apr 2026 09:55:45 +0300 Subject: [PATCH 08/55] Fix SkinDesigner UITimer import package --- .../java/com/codename1/tools/skindesigner/SkinDesigner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index c9f6ad2fb6..2400a90075 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -28,7 +28,6 @@ import com.codename1.ui.TextArea; import com.codename1.ui.TextField; import com.codename1.ui.Toolbar; -import com.codename1.ui.UITimer; import com.codename1.ui.geom.Rectangle; import com.codename1.ui.layouts.BorderLayout; import com.codename1.ui.layouts.BoxLayout; @@ -37,6 +36,7 @@ import com.codename1.ui.plaf.Style; import com.codename1.ui.spinner.Picker; import com.codename1.ui.util.ImageIO; +import com.codename1.ui.util.UITimer; import com.codename1.ui.validation.NumericConstraint; import com.codename1.ui.validation.Validator; import java.io.ByteArrayOutputStream; From 9f15dffc6bf423237f1c45ef510b0cdac822208b Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Thu, 16 Apr 2026 10:46:23 +0300 Subject: [PATCH 09/55] Remove skindesigner tab overlays and improve dark mode sync --- .../common/src/main/css/theme.css | 74 +++++++++++++++++++ .../tools/skindesigner/SkinDesigner.java | 50 ++++++++++++- ...1_tools_skindesigner_WebsiteThemeNative.js | 19 +++++ 3 files changed, 142 insertions(+), 1 deletion(-) diff --git a/scripts/skindesigner/common/src/main/css/theme.css b/scripts/skindesigner/common/src/main/css/theme.css index 07c240d0d7..7d199a96b9 100644 --- a/scripts/skindesigner/common/src/main/css/theme.css +++ b/scripts/skindesigner/common/src/main/css/theme.css @@ -22,6 +22,80 @@ SkinDesignerTabsContainerDark { border: none; } +SkinDesignerTabBar { + background: #eef3ff; + border: none; + padding: 0.4mm; +} + +SkinDesignerTabBarDark { + background: #0a111d; + border: none; + padding: 0.4mm; +} + +SkinDesignerTabButton { + background: #f3f4f7; + color: #112247; + border: 1px solid #d9dee8; + margin: 0.2mm; + padding: 0.9mm; +} + +SkinDesignerTabButtonDark { + background: #102b66; + color: #f5f8ff; + border: 1px solid #4c6ea8; + margin: 0.2mm; + padding: 0.9mm; +} + +SkinDesignerTabButtonSelected { + background: #ffffff; + color: #112247; + border: 2px solid #2f6bff; + margin: 0.2mm; + padding: 0.9mm; +} + +SkinDesignerTabButtonSelectedDark { + background: #163575; + color: #f5f8ff; + border: 2px solid #4d86ff; + margin: 0.2mm; + padding: 0.9mm; +} + +Toolbar { + background: #eef3ff; +} + +ToolbarDark { + background: #0a111d; +} + +Title { + color: #112247; + background: #eef3ff; + font-family: "native:MainLight"; +} + +TitleDark { + color: #f5f8ff; + background: #0a111d; + font-family: "native:MainLight"; +} + +Command { + color: #112247; + background: transparent; +} + +CommandDark { + color: #f5f8ff; + background: transparent; +} + Tab { background: #f3f4f7; color: #112247; diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 2400a90075..cb7251c78d 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -20,6 +20,7 @@ import com.codename1.ui.BrowserComponent; import com.codename1.ui.Button; import com.codename1.ui.Command; +import com.codename1.ui.Component; import com.codename1.ui.Container; import com.codename1.ui.FontImage; import com.codename1.ui.Graphics; @@ -64,6 +65,7 @@ public void runApp() { ImageSettings imPortrait = createImageSettings("/skin.png", "port", vl); ImageSettings imLandscape = createImageSettings("/skin_l.png", "lan", vl); + details.hideTabs(); skinDesignerForm.add(BorderLayout.CENTER, details); Picker nativeTheme = new Picker(); @@ -166,6 +168,39 @@ public void runApp() { details.setTabSelectedIcon(0, portraitIconSel); details.setTabSelectedIcon(1, landscapeIconSel); details.setTabSelectedIcon(2, settingsIconSel); + Button portraitTab = new Button(portraitIconSel); + portraitTab.setUIID("SkinDesignerTabButtonSelected"); + Button landscapeTab = new Button(landscapeIcon); + landscapeTab.setUIID("SkinDesignerTabButton"); + Button settingsTab = new Button(settingsIcon); + settingsTab.setUIID("SkinDesignerTabButton"); + Container customTabBar = GridLayout.encloseIn(3, portraitTab, landscapeTab, settingsTab); + customTabBar.setUIID("SkinDesignerTabBar"); + skinDesignerForm.add(BorderLayout.NORTH, customTabBar); + + Runnable refreshCustomTabs = () -> { + int selectedIndex = details.getSelectedIndex(); + portraitTab.setIcon(selectedIndex == 0 ? portraitIconSel : portraitIcon); + landscapeTab.setIcon(selectedIndex == 1 ? landscapeIconSel : landscapeIcon); + settingsTab.setIcon(selectedIndex == 2 ? settingsIconSel : settingsIcon); + portraitTab.setUIID(selectedIndex == 0 ? "SkinDesignerTabButtonSelected" : "SkinDesignerTabButton"); + landscapeTab.setUIID(selectedIndex == 1 ? "SkinDesignerTabButtonSelected" : "SkinDesignerTabButton"); + settingsTab.setUIID(selectedIndex == 2 ? "SkinDesignerTabButtonSelected" : "SkinDesignerTabButton"); + portraitTab.getParent().revalidate(); + }; + portraitTab.addActionListener(e -> { + details.setSelectedIndex(0); + refreshCustomTabs.run(); + }); + landscapeTab.addActionListener(e -> { + details.setSelectedIndex(1); + refreshCustomTabs.run(); + }); + settingsTab.addActionListener(e -> { + details.setSelectedIndex(2); + refreshCustomTabs.run(); + }); + details.addSelectionListener((oldSelected, newSelected) -> refreshCustomTabs.run()); vl.addConstraint(smallFontSize, new NumericConstraint(false, 5, 400, "Font size must be a valid integer in the 5-400 range")). addConstraint(mediumFontSize, new NumericConstraint(false, 5, 400, "Font size must be a valid integer in the 5-400 range")). addConstraint(largeFontSize, new NumericConstraint(false, 5, 400, "Font size must be a valid integer in the 5-400 range")). @@ -224,6 +259,7 @@ public void runApp() { }); } + refreshCustomTabs.run(); initWebsiteThemeSync(skinDesignerForm); skinDesignerForm.show(); } @@ -263,7 +299,7 @@ private void initWebsiteThemeSync(Form form) { private void applyWebsiteTheme(Container component, boolean dark) { for (int i = 0; i < component.getComponentCount(); i++) { - com.codename1.ui.Component child = component.getComponentAt(i); + Component child = component.getComponentAt(i); String uiid = child.getUIID(); String themed = themedUiid(uiid, dark); if (uiid != null && !uiid.equals(themed)) { @@ -294,6 +330,12 @@ private String themedUiid(String uiid, boolean dark) { case "SkinDesignerCard": case "SkinDesignerField": case "SkinDesignerFieldLabel": + case "SkinDesignerTabBar": + case "SkinDesignerTabButton": + case "SkinDesignerTabButtonSelected": + case "Toolbar": + case "Title": + case "Command": case "Tab": case "TabSelected": case "TabsContainer": @@ -312,6 +354,12 @@ private String themedUiid(String uiid, boolean dark) { case "SkinDesignerCard": case "SkinDesignerField": case "SkinDesignerFieldLabel": + case "SkinDesignerTabBar": + case "SkinDesignerTabButton": + case "SkinDesignerTabButtonSelected": + case "Toolbar": + case "Title": + case "Command": case "Tab": case "TabSelected": case "TabsContainer": diff --git a/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_WebsiteThemeNative.js b/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_WebsiteThemeNative.js index b4cd9b5471..01d88c0fd4 100644 --- a/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_WebsiteThemeNative.js +++ b/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_WebsiteThemeNative.js @@ -7,7 +7,9 @@ var o = {}; var parentWindow = (window.parent && window.parent !== window) ? window.parent : null; var parentDoc = parentWindow && parentWindow.document ? parentWindow.document : null; var parentBody = parentDoc && parentDoc.body ? parentDoc.body : null; + var parentHtml = parentDoc && parentDoc.documentElement ? parentDoc.documentElement : null; var classes = parentBody && parentBody.classList ? parentBody.classList : null; + var htmlClasses = parentHtml && parentHtml.classList ? parentHtml.classList : null; if (classes) { if (classes.contains("dark") || classes.contains("cn1-skindesigner-dark")) { return true; @@ -16,6 +18,14 @@ var o = {}; return false; } } + if (htmlClasses) { + if (htmlClasses.contains("dark") || htmlClasses.contains("cn1-skindesigner-dark")) { + return true; + } + if (htmlClasses.contains("light") || htmlClasses.contains("cn1-skindesigner-light")) { + return false; + } + } if (parentWindow && parentWindow.localStorage) { var pref = parentWindow.localStorage.getItem("pref-theme"); @@ -26,6 +36,15 @@ var o = {}; return false; } } + if (window.localStorage) { + var localPref = window.localStorage.getItem("pref-theme"); + if (localPref === "dark") { + return true; + } + if (localPref === "light") { + return false; + } + } var mediaWindow = parentWindow || window; if (mediaWindow.matchMedia) { From 0ec6cdd66bdc69c02f3810110705f6e95f354d90 Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Thu, 16 Apr 2026 11:02:43 +0300 Subject: [PATCH 10/55] Move skindesigner actions off toolbar and init theme after show --- .../tools/skindesigner/SkinDesigner.java | 94 ++++++++++--------- 1 file changed, 51 insertions(+), 43 deletions(-) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index cb7251c78d..50c1bfec9d 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -61,7 +61,6 @@ public void runApp() { final Tabs details = new Tabs(); details.getTabsContainer().setUIID("SkinDesignerTabsContainer"); details.getTabsContainer().setScrollableX(false); - Style titleCommand = UIManager.getInstance().getComponentStyle("Command"); ImageSettings imPortrait = createImageSettings("/skin.png", "port", vl); ImageSettings imLandscape = createImageSettings("/skin_l.png", "lan", vl); @@ -208,30 +207,10 @@ public void runApp() { setShowErrorMessageForFocusedComponent(true); ShouldExecute s = NativeLookup.create(ShouldExecute.class); - if(s != null && s.isSupported()) { - Command saveCommand = skinDesignerForm.getToolbar().addCommandToRightBar("", - FontImage.createMaterial(FontImage.MATERIAL_SAVE, titleCommand), e -> { - byte[] data = createSkinFile(imPortrait, imLandscape, nativeTheme, platformName, tablet, systemFontFamily, - proportionalFontFamily, monospaceFontFamily, smallFontSize, mediumFontSize, largeFontSize, - pixelRatio, overrideNamePrimary, overrideNameSecondary, overrideNameLast); - if(data != null) { - FileSystemStorage fs = FileSystemStorage.getInstance(); - try(OutputStream os = fs.openOutputStream(fs.getAppHomePath() + "skin-file.skin")) { - os.write(data); - } catch(IOException err) { - Log.e(err); - ToastBar.showErrorMessage("Error wring skin file " + err); - } - // in the JavaScript port this will trigger the download dialog - if(s.shouldExecute()) { - Display.getInstance().execute(fs.getAppHomePath() + "skin-file.skin"); - } - } - }); - vl.addSubmitButtons(skinDesignerForm.getToolbar().findCommandComponent(saveCommand)); - } - - skinDesignerForm.getToolbar().addMaterialCommandToLeftBar("", FontImage.MATERIAL_HELP, e -> { + Button helpAction = new Button("Help"); + helpAction.setUIID("SkinDesignerActionButton"); + FontImage.setMaterialIcon(helpAction, FontImage.MATERIAL_HELP); + helpAction.addActionListener(e -> { BrowserComponent help = new BrowserComponent(); help.setURL("jar:///help.html"); Form helpForm = new Form("Help", new BorderLayout()); @@ -240,28 +219,57 @@ public void runApp() { helpForm.show(); }); - if(Display.getInstance().isNativeShareSupported()) { - skinDesignerForm.getToolbar().addCommandToRightBar("", - FontImage.createMaterial(FontImage.MATERIAL_SHARE, titleCommand), e -> { - byte[] data = createSkinFile(imPortrait, imLandscape, nativeTheme, platformName, tablet, systemFontFamily, - proportionalFontFamily, monospaceFontFamily, smallFontSize, mediumFontSize, largeFontSize, - pixelRatio, overrideNamePrimary, overrideNameSecondary, overrideNameLast); - if(data != null) { - FileSystemStorage fs = FileSystemStorage.getInstance(); - try(OutputStream os = fs.openOutputStream(fs.getAppHomePath() + "skin-file.skin")) { - os.write(data); - } catch(IOException err) { - Log.e(err); - ToastBar.showErrorMessage("Error wring skin file " + err); - } - Display.getInstance().share(null, fs.getAppHomePath() + "skin-file.skin", "application/vnd.codenameone-skin"); - } - }); + Button saveAction = new Button("Save"); + saveAction.setUIID("SkinDesignerActionButton"); + FontImage.setMaterialIcon(saveAction, FontImage.MATERIAL_SAVE); + saveAction.addActionListener(e -> { + byte[] data = createSkinFile(imPortrait, imLandscape, nativeTheme, platformName, tablet, systemFontFamily, + proportionalFontFamily, monospaceFontFamily, smallFontSize, mediumFontSize, largeFontSize, + pixelRatio, overrideNamePrimary, overrideNameSecondary, overrideNameLast); + if(data != null) { + FileSystemStorage fs = FileSystemStorage.getInstance(); + try(OutputStream os = fs.openOutputStream(fs.getAppHomePath() + "skin-file.skin")) { + os.write(data); + } catch(IOException err) { + Log.e(err); + ToastBar.showErrorMessage("Error wring skin file " + err); + } + // in the JavaScript port this will trigger the download dialog + if(s != null && s.isSupported() && s.shouldExecute()) { + Display.getInstance().execute(fs.getAppHomePath() + "skin-file.skin"); + } + } + }); + + Button shareAction = new Button("Share"); + shareAction.setUIID("SkinDesignerActionButton"); + FontImage.setMaterialIcon(shareAction, FontImage.MATERIAL_SHARE); + shareAction.addActionListener(e -> { + byte[] data = createSkinFile(imPortrait, imLandscape, nativeTheme, platformName, tablet, systemFontFamily, + proportionalFontFamily, monospaceFontFamily, smallFontSize, mediumFontSize, largeFontSize, + pixelRatio, overrideNamePrimary, overrideNameSecondary, overrideNameLast); + if(data != null) { + FileSystemStorage fs = FileSystemStorage.getInstance(); + try(OutputStream os = fs.openOutputStream(fs.getAppHomePath() + "skin-file.skin")) { + os.write(data); + } catch(IOException err) { + Log.e(err); + ToastBar.showErrorMessage("Error wring skin file " + err); + } + Display.getInstance().share(null, fs.getAppHomePath() + "skin-file.skin", "application/vnd.codenameone-skin"); + } + }); + if (!Display.getInstance().isNativeShareSupported()) { + shareAction.setHidden(true); + shareAction.setVisible(false); } + Container actions = GridLayout.encloseIn(3, helpAction, saveAction, shareAction); + actions.setUIID("SkinDesignerTabBar"); + settingsContainer.addComponent(0, actions); refreshCustomTabs.run(); - initWebsiteThemeSync(skinDesignerForm); skinDesignerForm.show(); + initWebsiteThemeSync(skinDesignerForm); } private Label labeledFieldTitle(String text) { From 41dcc6337ec590a31b0f6b561692a956ef13b0c1 Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Thu, 16 Apr 2026 12:05:03 +0300 Subject: [PATCH 11/55] Restore skindesigner tabs and move theme bridge into ShouldExecute --- .../common/codenameone_settings.properties | 1 + .../tools/skindesigner/ShouldExecute.java | 2 + .../tools/skindesigner/SkinDesigner.java | 20 ++-- .../skindesigner/WebsiteThemeNative.java | 8 -- ...ename1_tools_skindesigner_ShouldExecute.js | 84 ++++++++++++++++ ...1_tools_skindesigner_WebsiteThemeNative.js | 95 ------------------- 6 files changed, 97 insertions(+), 113 deletions(-) delete mode 100644 scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/WebsiteThemeNative.java delete mode 100644 scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_WebsiteThemeNative.js diff --git a/scripts/skindesigner/common/codenameone_settings.properties b/scripts/skindesigner/common/codenameone_settings.properties index 8dc6a9c8df..a344a9f269 100644 --- a/scripts/skindesigner/common/codenameone_settings.properties +++ b/scripts/skindesigner/common/codenameone_settings.properties @@ -4,6 +4,7 @@ codename1.android.keystorePassword= codename1.arg.ios.newStorageLocation=true codename1.arg.ios.NSPhotoLibraryUsageDescription=Some functionality of the application requires access to your photo library codename1.arg.java.version=17 +codename1.arg.javascript.inject_proxy=false codename1.cssTheme=true codename1.displayName=SkinDesigner codename1.icon=icon.png diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/ShouldExecute.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/ShouldExecute.java index 3ba8b7bd68..de93ab5aae 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/ShouldExecute.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/ShouldExecute.java @@ -4,4 +4,6 @@ public interface ShouldExecute extends NativeInterface { boolean shouldExecute(); + boolean isDarkMode(); + void notifyUiReady(); } diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 50c1bfec9d..9cfd3f329c 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -56,6 +56,7 @@ public class SkinDesigner extends Lifecycle { @Override public void runApp() { Form skinDesignerForm = new Form("Skin Designer", new BorderLayout()); + skinDesignerForm.setTitle(""); skinDesignerForm.setUIID("SkinDesignerForm"); Validator vl = new Validator(); final Tabs details = new Tabs(); @@ -167,11 +168,11 @@ public void runApp() { details.setTabSelectedIcon(0, portraitIconSel); details.setTabSelectedIcon(1, landscapeIconSel); details.setTabSelectedIcon(2, settingsIconSel); - Button portraitTab = new Button(portraitIconSel); + Button portraitTab = new Button("Portrait", portraitIconSel); portraitTab.setUIID("SkinDesignerTabButtonSelected"); - Button landscapeTab = new Button(landscapeIcon); + Button landscapeTab = new Button("Landscape", landscapeIcon); landscapeTab.setUIID("SkinDesignerTabButton"); - Button settingsTab = new Button(settingsIcon); + Button settingsTab = new Button("Settings", settingsIcon); settingsTab.setUIID("SkinDesignerTabButton"); Container customTabBar = GridLayout.encloseIn(3, portraitTab, landscapeTab, settingsTab); customTabBar.setUIID("SkinDesignerTabBar"); @@ -269,7 +270,7 @@ public void runApp() { refreshCustomTabs.run(); skinDesignerForm.show(); - initWebsiteThemeSync(skinDesignerForm); + initWebsiteThemeSync(skinDesignerForm, s); } private Label labeledFieldTitle(String text) { @@ -284,18 +285,17 @@ private void styleFields(TextField... fields) { } } - private void initWebsiteThemeSync(Form form) { - WebsiteThemeNative websiteThemeNative = NativeLookup.create(WebsiteThemeNative.class); - if (websiteThemeNative == null || !websiteThemeNative.isSupported()) { + private void initWebsiteThemeSync(Form form, ShouldExecute nativeBridge) { + if (nativeBridge == null || !nativeBridge.isSupported()) { return; } - websiteDarkMode = websiteThemeNative.isDarkMode(); + websiteDarkMode = nativeBridge.isDarkMode(); Display.getInstance().setDarkMode(websiteDarkMode); applyWebsiteTheme(form, websiteDarkMode); form.refreshTheme(); - websiteThemeNative.notifyUiReady(); + nativeBridge.notifyUiReady(); UITimer.timer(900, true, form, () -> { - boolean dark = websiteThemeNative.isDarkMode(); + boolean dark = nativeBridge.isDarkMode(); if (dark != websiteDarkMode) { websiteDarkMode = dark; Display.getInstance().setDarkMode(dark); diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/WebsiteThemeNative.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/WebsiteThemeNative.java deleted file mode 100644 index 0c02cc0637..0000000000 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/WebsiteThemeNative.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.codename1.tools.skindesigner; - -import com.codename1.system.NativeInterface; - -public interface WebsiteThemeNative extends NativeInterface { - boolean isDarkMode(); - void notifyUiReady(); -} diff --git a/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_ShouldExecute.js b/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_ShouldExecute.js index 02638a1254..a75500a03d 100644 --- a/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_ShouldExecute.js +++ b/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_ShouldExecute.js @@ -2,10 +2,94 @@ var o = {}; + function readWebsiteThemePreference() { + try { + var parentWindow = (window.parent && window.parent !== window) ? window.parent : null; + var parentDoc = parentWindow && parentWindow.document ? parentWindow.document : null; + var parentBody = parentDoc && parentDoc.body ? parentDoc.body : null; + var parentHtml = parentDoc && parentDoc.documentElement ? parentDoc.documentElement : null; + var classes = parentBody && parentBody.classList ? parentBody.classList : null; + var htmlClasses = parentHtml && parentHtml.classList ? parentHtml.classList : null; + if (classes) { + if (classes.contains("dark") || classes.contains("cn1-skindesigner-dark")) { + return true; + } + if (classes.contains("light") || classes.contains("cn1-skindesigner-light")) { + return false; + } + } + if (htmlClasses) { + if (htmlClasses.contains("dark") || htmlClasses.contains("cn1-skindesigner-dark")) { + return true; + } + if (htmlClasses.contains("light") || htmlClasses.contains("cn1-skindesigner-light")) { + return false; + } + } + + if (parentWindow && parentWindow.localStorage) { + var pref = parentWindow.localStorage.getItem("pref-theme"); + if (pref === "dark") { + return true; + } + if (pref === "light") { + return false; + } + } + if (window.localStorage) { + var localPref = window.localStorage.getItem("pref-theme"); + if (localPref === "dark") { + return true; + } + if (localPref === "light") { + return false; + } + } + + var mediaWindow = parentWindow || window; + if (mediaWindow.matchMedia) { + return mediaWindow.matchMedia("(prefers-color-scheme: dark)").matches; + } + } catch (ignored) { + // Ignore parent access failures and fallback below. + } + + if (window.matchMedia) { + return window.matchMedia("(prefers-color-scheme: dark)").matches; + } + + return false; + } + o.shouldExecute_ = function(callback) { callback.complete(true); }; + o.isDarkMode_ = function(callback) { + callback.complete(!!readWebsiteThemePreference()); + }; + + o.notifyUiReady_ = function(callback) { + var sendReady = function() { + try { + if (window.parent && window.parent !== window && window.parent.postMessage) { + window.parent.postMessage({ type: "cn1-skindesigner-ui-ready" }, "*"); + } + } catch (ignored) { + // Ignore cross-origin/sandbox restrictions in embedded website mode. + } + callback.complete(); + }; + + if (window.requestAnimationFrame) { + window.requestAnimationFrame(function() { + window.requestAnimationFrame(sendReady); + }); + } else { + window.setTimeout(sendReady, 48); + } + }; + o.isSupported_ = function(callback) { callback.complete(true); }; diff --git a/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_WebsiteThemeNative.js b/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_WebsiteThemeNative.js deleted file mode 100644 index 01d88c0fd4..0000000000 --- a/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_WebsiteThemeNative.js +++ /dev/null @@ -1,95 +0,0 @@ -(function(exports){ - -var o = {}; - - function readWebsiteThemePreference() { - try { - var parentWindow = (window.parent && window.parent !== window) ? window.parent : null; - var parentDoc = parentWindow && parentWindow.document ? parentWindow.document : null; - var parentBody = parentDoc && parentDoc.body ? parentDoc.body : null; - var parentHtml = parentDoc && parentDoc.documentElement ? parentDoc.documentElement : null; - var classes = parentBody && parentBody.classList ? parentBody.classList : null; - var htmlClasses = parentHtml && parentHtml.classList ? parentHtml.classList : null; - if (classes) { - if (classes.contains("dark") || classes.contains("cn1-skindesigner-dark")) { - return true; - } - if (classes.contains("light") || classes.contains("cn1-skindesigner-light")) { - return false; - } - } - if (htmlClasses) { - if (htmlClasses.contains("dark") || htmlClasses.contains("cn1-skindesigner-dark")) { - return true; - } - if (htmlClasses.contains("light") || htmlClasses.contains("cn1-skindesigner-light")) { - return false; - } - } - - if (parentWindow && parentWindow.localStorage) { - var pref = parentWindow.localStorage.getItem("pref-theme"); - if (pref === "dark") { - return true; - } - if (pref === "light") { - return false; - } - } - if (window.localStorage) { - var localPref = window.localStorage.getItem("pref-theme"); - if (localPref === "dark") { - return true; - } - if (localPref === "light") { - return false; - } - } - - var mediaWindow = parentWindow || window; - if (mediaWindow.matchMedia) { - return mediaWindow.matchMedia("(prefers-color-scheme: dark)").matches; - } - } catch (ignored) { - // Ignore parent access failures and fallback below. - } - - if (window.matchMedia) { - return window.matchMedia("(prefers-color-scheme: dark)").matches; - } - - return false; - } - - o.isDarkMode_ = function(callback) { - callback.complete(!!readWebsiteThemePreference()); - }; - - o.notifyUiReady_ = function(callback) { - var sendReady = function() { - try { - if (window.parent && window.parent !== window && window.parent.postMessage) { - window.parent.postMessage({ type: "cn1-skindesigner-ui-ready" }, "*"); - } - } catch (ignored) { - // Ignore cross-origin or sandbox restrictions. - } - callback.complete(); - }; - - if (window.requestAnimationFrame) { - window.requestAnimationFrame(function() { - window.requestAnimationFrame(sendReady); - }); - } else { - window.setTimeout(sendReady, 48); - } - }; - - o.isSupported_ = function(callback) { - callback.complete(true); - }; - -exports.com_codename1_tools_skindesigner_WebsiteThemeNative = o; - -})(cn1_get_native_interfaces()); From 2f0e4b8877eb47c38d534a2e782eddbdd9f196a0 Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Thu, 16 Apr 2026 20:28:03 +0300 Subject: [PATCH 12/55] Restore built-in skindesigner tabs and harden native bridge lookup --- .../tools/skindesigner/SkinDesigner.java | 82 ++++++++----------- 1 file changed, 32 insertions(+), 50 deletions(-) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 9cfd3f329c..2573917d21 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -52,6 +52,7 @@ public class SkinDesigner extends Lifecycle { private static final String[] NATIVE_THEME_FILES = {"iOS7Theme.res", "iPhoneTheme.res", "android_holo_light.res","androidTheme.res", "winTheme.res"}; private boolean websiteDarkMode; + private ShouldExecute nativeBridge; @Override public void runApp() { @@ -65,7 +66,6 @@ public void runApp() { ImageSettings imPortrait = createImageSettings("/skin.png", "port", vl); ImageSettings imLandscape = createImageSettings("/skin_l.png", "lan", vl); - details.hideTabs(); skinDesignerForm.add(BorderLayout.CENTER, details); Picker nativeTheme = new Picker(); @@ -162,52 +162,18 @@ public void runApp() { FontImage landscapeIconSel = FontImage.createMaterial(FontImage.MATERIAL_STAY_CURRENT_LANDSCAPE, tabSel, 4.5f); FontImage settingsIcon = FontImage.createMaterial(FontImage.MATERIAL_SETTINGS, tab, 3.5f); FontImage settingsIconSel = FontImage.createMaterial(FontImage.MATERIAL_SETTINGS, tabSel, 3.5f); - details.addTab("", portraitIcon, imPortrait.getContainer()); - details.addTab("", landscapeIcon, imLandscape.getContainer()); - details.addTab("", settingsIcon, settingsContainer); + details.addTab("Portrait", portraitIcon, imPortrait.getContainer()); + details.addTab("Landscape", landscapeIcon, imLandscape.getContainer()); + details.addTab("Settings", settingsIcon, settingsContainer); details.setTabSelectedIcon(0, portraitIconSel); details.setTabSelectedIcon(1, landscapeIconSel); details.setTabSelectedIcon(2, settingsIconSel); - Button portraitTab = new Button("Portrait", portraitIconSel); - portraitTab.setUIID("SkinDesignerTabButtonSelected"); - Button landscapeTab = new Button("Landscape", landscapeIcon); - landscapeTab.setUIID("SkinDesignerTabButton"); - Button settingsTab = new Button("Settings", settingsIcon); - settingsTab.setUIID("SkinDesignerTabButton"); - Container customTabBar = GridLayout.encloseIn(3, portraitTab, landscapeTab, settingsTab); - customTabBar.setUIID("SkinDesignerTabBar"); - skinDesignerForm.add(BorderLayout.NORTH, customTabBar); - - Runnable refreshCustomTabs = () -> { - int selectedIndex = details.getSelectedIndex(); - portraitTab.setIcon(selectedIndex == 0 ? portraitIconSel : portraitIcon); - landscapeTab.setIcon(selectedIndex == 1 ? landscapeIconSel : landscapeIcon); - settingsTab.setIcon(selectedIndex == 2 ? settingsIconSel : settingsIcon); - portraitTab.setUIID(selectedIndex == 0 ? "SkinDesignerTabButtonSelected" : "SkinDesignerTabButton"); - landscapeTab.setUIID(selectedIndex == 1 ? "SkinDesignerTabButtonSelected" : "SkinDesignerTabButton"); - settingsTab.setUIID(selectedIndex == 2 ? "SkinDesignerTabButtonSelected" : "SkinDesignerTabButton"); - portraitTab.getParent().revalidate(); - }; - portraitTab.addActionListener(e -> { - details.setSelectedIndex(0); - refreshCustomTabs.run(); - }); - landscapeTab.addActionListener(e -> { - details.setSelectedIndex(1); - refreshCustomTabs.run(); - }); - settingsTab.addActionListener(e -> { - details.setSelectedIndex(2); - refreshCustomTabs.run(); - }); - details.addSelectionListener((oldSelected, newSelected) -> refreshCustomTabs.run()); vl.addConstraint(smallFontSize, new NumericConstraint(false, 5, 400, "Font size must be a valid integer in the 5-400 range")). addConstraint(mediumFontSize, new NumericConstraint(false, 5, 400, "Font size must be a valid integer in the 5-400 range")). addConstraint(largeFontSize, new NumericConstraint(false, 5, 400, "Font size must be a valid integer in the 5-400 range")). addConstraint(pixelRatio, new NumericConstraint(true, 0.1, 60, "PixelRatio is a positive decimal size in the range of 0.1 to 60")). setShowErrorMessageForFocusedComponent(true); - ShouldExecute s = NativeLookup.create(ShouldExecute.class); Button helpAction = new Button("Help"); helpAction.setUIID("SkinDesignerActionButton"); FontImage.setMaterialIcon(helpAction, FontImage.MATERIAL_HELP); @@ -236,7 +202,8 @@ public void runApp() { ToastBar.showErrorMessage("Error wring skin file " + err); } // in the JavaScript port this will trigger the download dialog - if(s != null && s.isSupported() && s.shouldExecute()) { + ShouldExecute bridge = resolveNativeBridgeQuietly(); + if(bridge != null && bridge.isSupported() && bridge.shouldExecute()) { Display.getInstance().execute(fs.getAppHomePath() + "skin-file.skin"); } } @@ -268,9 +235,8 @@ public void runApp() { actions.setUIID("SkinDesignerTabBar"); settingsContainer.addComponent(0, actions); - refreshCustomTabs.run(); skinDesignerForm.show(); - initWebsiteThemeSync(skinDesignerForm, s); + initWebsiteThemeSync(skinDesignerForm); } private Label labeledFieldTitle(String text) { @@ -285,17 +251,33 @@ private void styleFields(TextField... fields) { } } - private void initWebsiteThemeSync(Form form, ShouldExecute nativeBridge) { - if (nativeBridge == null || !nativeBridge.isSupported()) { - return; + private ShouldExecute resolveNativeBridgeQuietly() { + if (nativeBridge != null) { + return nativeBridge; + } + try { + nativeBridge = NativeLookup.create(ShouldExecute.class); + } catch (Throwable ignored) { + nativeBridge = null; + } + return nativeBridge; + } + + private void initWebsiteThemeSync(Form form) { + ShouldExecute bridge = resolveNativeBridgeQuietly(); + if (bridge != null && bridge.isSupported()) { + websiteDarkMode = bridge.isDarkMode(); + Display.getInstance().setDarkMode(websiteDarkMode); + applyWebsiteTheme(form, websiteDarkMode); + form.refreshTheme(); + bridge.notifyUiReady(); } - websiteDarkMode = nativeBridge.isDarkMode(); - Display.getInstance().setDarkMode(websiteDarkMode); - applyWebsiteTheme(form, websiteDarkMode); - form.refreshTheme(); - nativeBridge.notifyUiReady(); UITimer.timer(900, true, form, () -> { - boolean dark = nativeBridge.isDarkMode(); + ShouldExecute liveBridge = resolveNativeBridgeQuietly(); + if (liveBridge == null || !liveBridge.isSupported()) { + return; + } + boolean dark = liveBridge.isDarkMode(); if (dark != websiteDarkMode) { websiteDarkMode = dark; Display.getInstance().setDarkMode(dark); From 9be2061eb78e63bca3fa3fc0e7af0da3b379a6f9 Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Thu, 16 Apr 2026 21:08:53 +0300 Subject: [PATCH 13/55] Drive skindesigner theme from iframe query and remove native bridge dependency --- .../layouts/_default/skindesigner.html | 15 +++- .../tools/skindesigner/ShouldExecute.java | 2 - .../tools/skindesigner/SkinDesigner.java | 77 +++++++++-------- ...ename1_tools_skindesigner_ShouldExecute.js | 84 ------------------- 4 files changed, 58 insertions(+), 120 deletions(-) diff --git a/docs/website/layouts/_default/skindesigner.html b/docs/website/layouts/_default/skindesigner.html index 9d59f43e4c..7495cec3e2 100644 --- a/docs/website/layouts/_default/skindesigner.html +++ b/docs/website/layouts/_default/skindesigner.html @@ -11,7 +11,7 @@ @@ -180,6 +180,19 @@ dark = body.classList.contains("dark") || !!(mediaQuery && mediaQuery.matches); } body.classList.toggle("cn1-skindesigner-dark", dark); + syncFrameTheme(dark); + } + + function syncFrameTheme(dark) { + if (!frame) { + return; + } + var base = frame.getAttribute("data-base-src") || "/skindesigner-app/"; + var target = base + (base.indexOf("?") >= 0 ? "&" : "?") + "theme=" + (dark ? "dark" : "light"); + var current = frame.getAttribute("src"); + if (current !== target) { + frame.setAttribute("src", target); + } } body.classList.add("cn1-skindesigner-page-body"); diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/ShouldExecute.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/ShouldExecute.java index de93ab5aae..3ba8b7bd68 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/ShouldExecute.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/ShouldExecute.java @@ -4,6 +4,4 @@ public interface ShouldExecute extends NativeInterface { boolean shouldExecute(); - boolean isDarkMode(); - void notifyUiReady(); } diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 2573917d21..6d5757e18e 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -8,6 +8,7 @@ import com.codename1.components.ToastBar; import com.codename1.io.FileSystemStorage; import com.codename1.ui.Display; +import com.codename1.ui.CN; import com.codename1.ui.Form; import com.codename1.ui.Label; import com.codename1.ui.plaf.UIManager; @@ -16,7 +17,6 @@ import com.codename1.io.Properties; import com.codename1.io.Storage; import com.codename1.io.Util; -import com.codename1.system.NativeLookup; import com.codename1.ui.BrowserComponent; import com.codename1.ui.Button; import com.codename1.ui.Command; @@ -52,7 +52,6 @@ public class SkinDesigner extends Lifecycle { private static final String[] NATIVE_THEME_FILES = {"iOS7Theme.res", "iPhoneTheme.res", "android_holo_light.res","androidTheme.res", "winTheme.res"}; private boolean websiteDarkMode; - private ShouldExecute nativeBridge; @Override public void runApp() { @@ -202,10 +201,7 @@ public void runApp() { ToastBar.showErrorMessage("Error wring skin file " + err); } // in the JavaScript port this will trigger the download dialog - ShouldExecute bridge = resolveNativeBridgeQuietly(); - if(bridge != null && bridge.isSupported() && bridge.shouldExecute()) { - Display.getInstance().execute(fs.getAppHomePath() + "skin-file.skin"); - } + Display.getInstance().execute(fs.getAppHomePath() + "skin-file.skin"); } }); @@ -236,7 +232,7 @@ public void runApp() { settingsContainer.addComponent(0, actions); skinDesignerForm.show(); - initWebsiteThemeSync(skinDesignerForm); + initThemeFromUrl(skinDesignerForm); } private Label labeledFieldTitle(String text) { @@ -251,33 +247,13 @@ private void styleFields(TextField... fields) { } } - private ShouldExecute resolveNativeBridgeQuietly() { - if (nativeBridge != null) { - return nativeBridge; - } - try { - nativeBridge = NativeLookup.create(ShouldExecute.class); - } catch (Throwable ignored) { - nativeBridge = null; - } - return nativeBridge; - } - - private void initWebsiteThemeSync(Form form) { - ShouldExecute bridge = resolveNativeBridgeQuietly(); - if (bridge != null && bridge.isSupported()) { - websiteDarkMode = bridge.isDarkMode(); - Display.getInstance().setDarkMode(websiteDarkMode); - applyWebsiteTheme(form, websiteDarkMode); - form.refreshTheme(); - bridge.notifyUiReady(); - } + private void initThemeFromUrl(Form form) { + websiteDarkMode = readThemeFromUrl(); + Display.getInstance().setDarkMode(websiteDarkMode); + applyWebsiteTheme(form, websiteDarkMode); + form.refreshTheme(); UITimer.timer(900, true, form, () -> { - ShouldExecute liveBridge = resolveNativeBridgeQuietly(); - if (liveBridge == null || !liveBridge.isSupported()) { - return; - } - boolean dark = liveBridge.isDarkMode(); + boolean dark = readThemeFromUrl(); if (dark != websiteDarkMode) { websiteDarkMode = dark; Display.getInstance().setDarkMode(dark); @@ -287,6 +263,41 @@ private void initWebsiteThemeSync(Form form) { }); } + private boolean readThemeFromUrl() { + String href = CN.getProperty("browser.window.location.href", ""); + String theme = queryParam(href, "theme"); + if ("dark".equalsIgnoreCase(theme)) { + return true; + } + if ("light".equalsIgnoreCase(theme)) { + return false; + } + return Display.getInstance().isDarkMode(); + } + + private String queryParam(String href, String name) { + if (href == null || href.length() == 0) { + return null; + } + int queryStart = href.indexOf('?'); + if (queryStart < 0 || queryStart == href.length() - 1) { + return null; + } + String query = href.substring(queryStart + 1); + int hash = query.indexOf('#'); + if (hash >= 0) { + query = query.substring(0, hash); + } + String prefix = name + "="; + String[] pairs = Util.split(query, "&"); + for (String pair : pairs) { + if (pair.startsWith(prefix) && pair.length() > prefix.length()) { + return pair.substring(prefix.length()); + } + } + return null; + } + private void applyWebsiteTheme(Container component, boolean dark) { for (int i = 0; i < component.getComponentCount(); i++) { Component child = component.getComponentAt(i); diff --git a/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_ShouldExecute.js b/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_ShouldExecute.js index a75500a03d..02638a1254 100644 --- a/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_ShouldExecute.js +++ b/scripts/skindesigner/javascript/src/main/javascript/com_codename1_tools_skindesigner_ShouldExecute.js @@ -2,94 +2,10 @@ var o = {}; - function readWebsiteThemePreference() { - try { - var parentWindow = (window.parent && window.parent !== window) ? window.parent : null; - var parentDoc = parentWindow && parentWindow.document ? parentWindow.document : null; - var parentBody = parentDoc && parentDoc.body ? parentDoc.body : null; - var parentHtml = parentDoc && parentDoc.documentElement ? parentDoc.documentElement : null; - var classes = parentBody && parentBody.classList ? parentBody.classList : null; - var htmlClasses = parentHtml && parentHtml.classList ? parentHtml.classList : null; - if (classes) { - if (classes.contains("dark") || classes.contains("cn1-skindesigner-dark")) { - return true; - } - if (classes.contains("light") || classes.contains("cn1-skindesigner-light")) { - return false; - } - } - if (htmlClasses) { - if (htmlClasses.contains("dark") || htmlClasses.contains("cn1-skindesigner-dark")) { - return true; - } - if (htmlClasses.contains("light") || htmlClasses.contains("cn1-skindesigner-light")) { - return false; - } - } - - if (parentWindow && parentWindow.localStorage) { - var pref = parentWindow.localStorage.getItem("pref-theme"); - if (pref === "dark") { - return true; - } - if (pref === "light") { - return false; - } - } - if (window.localStorage) { - var localPref = window.localStorage.getItem("pref-theme"); - if (localPref === "dark") { - return true; - } - if (localPref === "light") { - return false; - } - } - - var mediaWindow = parentWindow || window; - if (mediaWindow.matchMedia) { - return mediaWindow.matchMedia("(prefers-color-scheme: dark)").matches; - } - } catch (ignored) { - // Ignore parent access failures and fallback below. - } - - if (window.matchMedia) { - return window.matchMedia("(prefers-color-scheme: dark)").matches; - } - - return false; - } - o.shouldExecute_ = function(callback) { callback.complete(true); }; - o.isDarkMode_ = function(callback) { - callback.complete(!!readWebsiteThemePreference()); - }; - - o.notifyUiReady_ = function(callback) { - var sendReady = function() { - try { - if (window.parent && window.parent !== window && window.parent.postMessage) { - window.parent.postMessage({ type: "cn1-skindesigner-ui-ready" }, "*"); - } - } catch (ignored) { - // Ignore cross-origin/sandbox restrictions in embedded website mode. - } - callback.complete(); - }; - - if (window.requestAnimationFrame) { - window.requestAnimationFrame(function() { - window.requestAnimationFrame(sendReady); - }); - } else { - window.setTimeout(sendReady, 48); - } - }; - o.isSupported_ = function(callback) { callback.complete(true); }; From edd3b08af6370a3dc3f4b92ab15bc6024c904edf Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Thu, 16 Apr 2026 21:18:16 +0300 Subject: [PATCH 14/55] Harden skindesigner iframe theme URL assignment --- docs/website/layouts/_default/skindesigner.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/website/layouts/_default/skindesigner.html b/docs/website/layouts/_default/skindesigner.html index 7495cec3e2..d4402ff64d 100644 --- a/docs/website/layouts/_default/skindesigner.html +++ b/docs/website/layouts/_default/skindesigner.html @@ -11,7 +11,6 @@ @@ -158,6 +157,7 @@ var loader = document.getElementById("cn1-skindesigner-loader"); var siteHeader = document.querySelector(".header"); var mediaQuery = window.matchMedia ? window.matchMedia("(prefers-color-scheme: dark)") : null; + var skinDesignerBasePath = "/skindesigner-app/"; function syncHeight() { var h = siteHeader ? siteHeader.offsetHeight : 76; @@ -187,8 +187,7 @@ if (!frame) { return; } - var base = frame.getAttribute("data-base-src") || "/skindesigner-app/"; - var target = base + (base.indexOf("?") >= 0 ? "&" : "?") + "theme=" + (dark ? "dark" : "light"); + var target = skinDesignerBasePath + "?theme=" + (dark ? "dark" : "light"); var current = frame.getAttribute("src"); if (current !== target) { frame.setAttribute("src", target); From 122d95f868a7ff5998001dc193304ff638b53317 Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Fri, 17 Apr 2026 07:01:51 +0300 Subject: [PATCH 15/55] Improve skindesigner tab/icon theming and expose primary actions --- .../common/src/main/css/theme.css | 2 + .../tools/skindesigner/SkinDesigner.java | 45 ++++++++++--------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/scripts/skindesigner/common/src/main/css/theme.css b/scripts/skindesigner/common/src/main/css/theme.css index 7d199a96b9..273bfecb08 100644 --- a/scripts/skindesigner/common/src/main/css/theme.css +++ b/scripts/skindesigner/common/src/main/css/theme.css @@ -197,6 +197,7 @@ SkinDesignerActionButton { padding: 0.9mm 1.4mm; font-family: "native:MainLight"; font-size: 2.7mm; + text-align: center; } SkinDesignerActionButtonDark { @@ -206,4 +207,5 @@ SkinDesignerActionButtonDark { padding: 0.9mm 1.4mm; font-family: "native:MainLight"; font-size: 2.7mm; + text-align: center; } diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 6d5757e18e..91668b82c3 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -11,7 +11,6 @@ import com.codename1.ui.CN; import com.codename1.ui.Form; import com.codename1.ui.Label; -import com.codename1.ui.plaf.UIManager; import com.codename1.io.Log; import com.codename1.io.Preferences; import com.codename1.io.Properties; @@ -19,7 +18,6 @@ import com.codename1.io.Util; import com.codename1.ui.BrowserComponent; import com.codename1.ui.Button; -import com.codename1.ui.Command; import com.codename1.ui.Component; import com.codename1.ui.Container; import com.codename1.ui.FontImage; @@ -34,7 +32,6 @@ import com.codename1.ui.layouts.BoxLayout; import com.codename1.ui.layouts.GridLayout; import com.codename1.ui.layouts.LayeredLayout; -import com.codename1.ui.plaf.Style; import com.codename1.ui.spinner.Picker; import com.codename1.ui.util.ImageIO; import com.codename1.ui.util.UITimer; @@ -55,6 +52,7 @@ public class SkinDesigner extends Lifecycle { @Override public void runApp() { + CN.setProperty("platformHint.javascript.beforeUnloadMessage", null); Form skinDesignerForm = new Form("Skin Designer", new BorderLayout()); skinDesignerForm.setTitle(""); skinDesignerForm.setUIID("SkinDesignerForm"); @@ -153,20 +151,9 @@ public void runApp() { settingsContainer.setUIID("SkinDesignerCard"); settingsContainer.setScrollableY(true); - Style tab = UIManager.getInstance().getComponentStyle("Tab"); - Style tabSel = UIManager.getInstance().getComponentSelectedStyle("Tab"); - FontImage portraitIcon = FontImage.createMaterial(FontImage.MATERIAL_STAY_CURRENT_PORTRAIT, tab, 4.5f); - FontImage landscapeIcon = FontImage.createMaterial(FontImage.MATERIAL_STAY_CURRENT_LANDSCAPE, tab, 4.5f); - FontImage portraitIconSel = FontImage.createMaterial(FontImage.MATERIAL_STAY_CURRENT_PORTRAIT, tabSel, 4.5f); - FontImage landscapeIconSel = FontImage.createMaterial(FontImage.MATERIAL_STAY_CURRENT_LANDSCAPE, tabSel, 4.5f); - FontImage settingsIcon = FontImage.createMaterial(FontImage.MATERIAL_SETTINGS, tab, 3.5f); - FontImage settingsIconSel = FontImage.createMaterial(FontImage.MATERIAL_SETTINGS, tabSel, 3.5f); - details.addTab("Portrait", portraitIcon, imPortrait.getContainer()); - details.addTab("Landscape", landscapeIcon, imLandscape.getContainer()); - details.addTab("Settings", settingsIcon, settingsContainer); - details.setTabSelectedIcon(0, portraitIconSel); - details.setTabSelectedIcon(1, landscapeIconSel); - details.setTabSelectedIcon(2, settingsIconSel); + details.addTab("Portrait", FontImage.MATERIAL_STAY_CURRENT_PORTRAIT, 4.5f, imPortrait.getContainer()); + details.addTab("Landscape", FontImage.MATERIAL_STAY_CURRENT_LANDSCAPE, 4.5f, imLandscape.getContainer()); + details.addTab("Settings", FontImage.MATERIAL_SETTINGS, 3.5f, settingsContainer); vl.addConstraint(smallFontSize, new NumericConstraint(false, 5, 400, "Font size must be a valid integer in the 5-400 range")). addConstraint(mediumFontSize, new NumericConstraint(false, 5, 400, "Font size must be a valid integer in the 5-400 range")). addConstraint(largeFontSize, new NumericConstraint(false, 5, 400, "Font size must be a valid integer in the 5-400 range")). @@ -229,10 +216,10 @@ public void runApp() { } Container actions = GridLayout.encloseIn(3, helpAction, saveAction, shareAction); actions.setUIID("SkinDesignerTabBar"); - settingsContainer.addComponent(0, actions); + skinDesignerForm.add(BorderLayout.NORTH, actions); skinDesignerForm.show(); - initThemeFromUrl(skinDesignerForm); + initThemeFromUrl(skinDesignerForm, details); } private Label labeledFieldTitle(String text) { @@ -247,10 +234,11 @@ private void styleFields(TextField... fields) { } } - private void initThemeFromUrl(Form form) { + private void initThemeFromUrl(Form form, Tabs details) { websiteDarkMode = readThemeFromUrl(); Display.getInstance().setDarkMode(websiteDarkMode); applyWebsiteTheme(form, websiteDarkMode); + applyTabsTheme(details, websiteDarkMode); form.refreshTheme(); UITimer.timer(900, true, form, () -> { boolean dark = readThemeFromUrl(); @@ -258,11 +246,28 @@ private void initThemeFromUrl(Form form) { websiteDarkMode = dark; Display.getInstance().setDarkMode(dark); applyWebsiteTheme(form, dark); + applyTabsTheme(details, dark); form.refreshTheme(); } }); } + private void applyTabsTheme(Tabs tabs, boolean dark) { + if (tabs == null) { + return; + } + String tabsUiid = dark ? "SkinDesignerTabsContainerDark" : "SkinDesignerTabsContainer"; + String tabUiid = dark ? "TabDark" : "Tab"; + tabs.setUIID(tabsUiid); + tabs.setTabUIID(tabUiid); + Container tabsContainer = tabs.getTabsContainer(); + for (int i = 0; i < tabsContainer.getComponentCount(); i++) { + tabsContainer.getComponentAt(i).setUIID(tabUiid); + } + tabs.refreshTheme(); + tabs.revalidate(); + } + private boolean readThemeFromUrl() { String href = CN.getProperty("browser.window.location.href", ""); String theme = queryParam(href, "theme"); From f49b0c5a5ad2d5fb70843c63dcb2fc3ffd953179 Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Fri, 17 Apr 2026 12:35:12 +0300 Subject: [PATCH 16/55] Fix skindesigner action button UX and positioning form chrome --- .../tools/skindesigner/SkinDesigner.java | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 91668b82c3..2b033e0f9c 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -26,7 +26,6 @@ import com.codename1.ui.Tabs; import com.codename1.ui.TextArea; import com.codename1.ui.TextField; -import com.codename1.ui.Toolbar; import com.codename1.ui.geom.Rectangle; import com.codename1.ui.layouts.BorderLayout; import com.codename1.ui.layouts.BoxLayout; @@ -161,8 +160,7 @@ public void runApp() { setShowErrorMessageForFocusedComponent(true); Button helpAction = new Button("Help"); - helpAction.setUIID("SkinDesignerActionButton"); - FontImage.setMaterialIcon(helpAction, FontImage.MATERIAL_HELP); + styleActionButton(helpAction, FontImage.MATERIAL_HELP); helpAction.addActionListener(e -> { BrowserComponent help = new BrowserComponent(); help.setURL("jar:///help.html"); @@ -173,8 +171,7 @@ public void runApp() { }); Button saveAction = new Button("Save"); - saveAction.setUIID("SkinDesignerActionButton"); - FontImage.setMaterialIcon(saveAction, FontImage.MATERIAL_SAVE); + styleActionButton(saveAction, FontImage.MATERIAL_SAVE); saveAction.addActionListener(e -> { byte[] data = createSkinFile(imPortrait, imLandscape, nativeTheme, platformName, tablet, systemFontFamily, proportionalFontFamily, monospaceFontFamily, smallFontSize, mediumFontSize, largeFontSize, @@ -193,8 +190,7 @@ public void runApp() { }); Button shareAction = new Button("Share"); - shareAction.setUIID("SkinDesignerActionButton"); - FontImage.setMaterialIcon(shareAction, FontImage.MATERIAL_SHARE); + styleActionButton(shareAction, FontImage.MATERIAL_SHARE); shareAction.addActionListener(e -> { byte[] data = createSkinFile(imPortrait, imLandscape, nativeTheme, platformName, tablet, systemFontFamily, proportionalFontFamily, monospaceFontFamily, smallFontSize, mediumFontSize, largeFontSize, @@ -216,7 +212,7 @@ public void runApp() { } Container actions = GridLayout.encloseIn(3, helpAction, saveAction, shareAction); actions.setUIID("SkinDesignerTabBar"); - skinDesignerForm.add(BorderLayout.NORTH, actions); + skinDesignerForm.add(BorderLayout.SOUTH, actions); skinDesignerForm.show(); initThemeFromUrl(skinDesignerForm, details); @@ -234,6 +230,13 @@ private void styleFields(TextField... fields) { } } + private void styleActionButton(Button button, char materialIcon) { + button.setUIID("SkinDesignerActionButton"); + FontImage.setMaterialIcon(button, materialIcon); + button.getAllStyles().setAlignment(Component.CENTER); + button.setGap(CN.convertToPixels(0.7f)); + } + private void initThemeFromUrl(Form form, Tabs details) { websiteDarkMode = readThemeFromUrl(); Display.getInstance().setDarkMode(websiteDarkMode); @@ -537,15 +540,20 @@ void aimPosition(final Image img, final TextField x, final TextField y, final in String originalX = x.getText(); String originalY = y.getText(); Form editPosition = new Form("", new BorderLayout()); - Toolbar tb = new Toolbar(true); - editPosition.setToolbar(tb); - tb.setUIID("Container"); - tb.addCommandToRightBar("", FontImage.createMaterial(FontImage.MATERIAL_CHECK, "Label", 4), e -> x.getComponentForm().showBack()); - tb.addCommandToLeftBar("", FontImage.createMaterial(FontImage.MATERIAL_CANCEL, "Label", 4), e -> { + editPosition.setUIID("SkinDesignerForm"); + Button done = new Button("Done"); + styleActionButton(done, FontImage.MATERIAL_CHECK); + done.addActionListener(e -> x.getComponentForm().showBack()); + Button cancel = new Button("Cancel"); + styleActionButton(cancel, FontImage.MATERIAL_CANCEL); + cancel.addActionListener(e -> { x.setText(originalX); y.setText(originalY); x.getComponentForm().showBack(); }); + Container topActions = GridLayout.encloseIn(2, cancel, done); + topActions.setUIID("SkinDesignerTabBar"); + editPosition.add(BorderLayout.NORTH, topActions); Image mute = createMute(x.getAsInt(0), y.getAsInt(0), w, h, img); class oo extends ImageViewer { @@ -641,6 +649,7 @@ public void keyReleased(int key) { editPosition.add(BorderLayout.CENTER, LayeredLayout.encloseIn(iv, overlay, BorderLayout.south(GridLayout.encloseIn(6, zoomIn, zoomOut, left, right, up, down)))); + applyWebsiteTheme(editPosition, websiteDarkMode); editPosition.show(); } From 443b8fd9f21c1c58bfed739565454ff7328ae616 Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Fri, 17 Apr 2026 13:53:03 +0300 Subject: [PATCH 17/55] Refine SkinDesigner action buttons and help theming --- .../tools/skindesigner/SkinDesigner.java | 89 +++++++++---------- 1 file changed, 43 insertions(+), 46 deletions(-) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 2b033e0f9c..ab43bbb4ea 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -29,6 +29,7 @@ import com.codename1.ui.geom.Rectangle; import com.codename1.ui.layouts.BorderLayout; import com.codename1.ui.layouts.BoxLayout; +import com.codename1.ui.layouts.FlowLayout; import com.codename1.ui.layouts.GridLayout; import com.codename1.ui.layouts.LayeredLayout; import com.codename1.ui.spinner.Picker; @@ -59,8 +60,8 @@ public void runApp() { final Tabs details = new Tabs(); details.getTabsContainer().setUIID("SkinDesignerTabsContainer"); details.getTabsContainer().setScrollableX(false); - ImageSettings imPortrait = createImageSettings("/skin.png", "port", vl); - ImageSettings imLandscape = createImageSettings("/skin_l.png", "lan", vl); + final ImageSettings[] imPortraitRef = new ImageSettings[1]; + final ImageSettings[] imLandscapeRef = new ImageSettings[1]; skinDesignerForm.add(BorderLayout.CENTER, details); @@ -159,21 +160,8 @@ public void runApp() { addConstraint(pixelRatio, new NumericConstraint(true, 0.1, 60, "PixelRatio is a positive decimal size in the range of 0.1 to 60")). setShowErrorMessageForFocusedComponent(true); - Button helpAction = new Button("Help"); - styleActionButton(helpAction, FontImage.MATERIAL_HELP); - helpAction.addActionListener(e -> { - BrowserComponent help = new BrowserComponent(); - help.setURL("jar:///help.html"); - Form helpForm = new Form("Help", new BorderLayout()); - helpForm.add(BorderLayout.CENTER, help); - helpForm.getToolbar().setBackCommand("Back", ee -> skinDesignerForm.showBack()); - helpForm.show(); - }); - - Button saveAction = new Button("Save"); - styleActionButton(saveAction, FontImage.MATERIAL_SAVE); - saveAction.addActionListener(e -> { - byte[] data = createSkinFile(imPortrait, imLandscape, nativeTheme, platformName, tablet, systemFontFamily, + Runnable saveAction = () -> { + byte[] data = createSkinFile(imPortraitRef[0], imLandscapeRef[0], nativeTheme, platformName, tablet, systemFontFamily, proportionalFontFamily, monospaceFontFamily, smallFontSize, mediumFontSize, largeFontSize, pixelRatio, overrideNamePrimary, overrideNameSecondary, overrideNameLast); if(data != null) { @@ -187,32 +175,12 @@ public void runApp() { // in the JavaScript port this will trigger the download dialog Display.getInstance().execute(fs.getAppHomePath() + "skin-file.skin"); } - }); + }; - Button shareAction = new Button("Share"); - styleActionButton(shareAction, FontImage.MATERIAL_SHARE); - shareAction.addActionListener(e -> { - byte[] data = createSkinFile(imPortrait, imLandscape, nativeTheme, platformName, tablet, systemFontFamily, - proportionalFontFamily, monospaceFontFamily, smallFontSize, mediumFontSize, largeFontSize, - pixelRatio, overrideNamePrimary, overrideNameSecondary, overrideNameLast); - if(data != null) { - FileSystemStorage fs = FileSystemStorage.getInstance(); - try(OutputStream os = fs.openOutputStream(fs.getAppHomePath() + "skin-file.skin")) { - os.write(data); - } catch(IOException err) { - Log.e(err); - ToastBar.showErrorMessage("Error wring skin file " + err); - } - Display.getInstance().share(null, fs.getAppHomePath() + "skin-file.skin", "application/vnd.codenameone-skin"); - } - }); - if (!Display.getInstance().isNativeShareSupported()) { - shareAction.setHidden(true); - shareAction.setVisible(false); - } - Container actions = GridLayout.encloseIn(3, helpAction, saveAction, shareAction); - actions.setUIID("SkinDesignerTabBar"); - skinDesignerForm.add(BorderLayout.SOUTH, actions); + imPortraitRef[0] = createImageSettings("/skin.png", "port", vl, () -> showHelpForm(skinDesignerForm), saveAction); + imLandscapeRef[0] = createImageSettings("/skin_l.png", "lan", vl, () -> showHelpForm(skinDesignerForm), saveAction); + ImageSettings imPortrait = imPortraitRef[0]; + ImageSettings imLandscape = imLandscapeRef[0]; skinDesignerForm.show(); initThemeFromUrl(skinDesignerForm, details); @@ -237,6 +205,12 @@ private void styleActionButton(Button button, char materialIcon) { button.setGap(CN.convertToPixels(0.7f)); } + private void styleIconActionButton(Button button, char materialIcon) { + styleActionButton(button, materialIcon); + button.setText(""); + button.setGap(0); + } + private void initThemeFromUrl(Form form, Tabs details) { websiteDarkMode = readThemeFromUrl(); Display.getInstance().setDarkMode(websiteDarkMode); @@ -414,7 +388,7 @@ private void autoSave(Picker p, String preferencesKey) { }); } - private ImageSettings createImageSettings(String imageFile, String prefix, Validator vl) { + private ImageSettings createImageSettings(String imageFile, String prefix, Validator vl, Runnable helpCallback, Runnable saveCallback) { Image img = null; try { img = Image.createImage(Display.getInstance().getResourceAsStream(getClass(), imageFile)); @@ -462,8 +436,7 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid addConstraint(screenPositionY, new NumericConstraint(false, 0, 5000, "Screen position must be a valid integer in the 0-5000 range")); Button aim = new Button(); - aim.setUIID("SkinDesignerActionButton"); - FontImage.setMaterialIcon(aim, FontImage.MATERIAL_PAN_TOOL); + styleIconActionButton(aim, FontImage.MATERIAL_PAN_TOOL); aim.addActionListener(e -> aimPosition(sl.getIcon(), @@ -472,9 +445,17 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid screenWidthPixels.getAsInt(768), screenHeightPixels.getAsInt(1024))); + Button helpButton = new Button(); + styleIconActionButton(helpButton, FontImage.MATERIAL_HELP); + helpButton.addActionListener(e -> helpCallback.run()); + + Button saveButton = new Button(); + styleIconActionButton(saveButton, FontImage.MATERIAL_SAVE); + saveButton.addActionListener(e -> saveCallback.run()); + final Container cnt = BoxLayout.encloseY(imagePicker, BorderLayout.center(labeledFieldTitle("Screen Position (X/Y/Width/Height)")). - add(BorderLayout.EAST, aim), + add(BorderLayout.EAST, BoxLayout.encloseX(aim, helpButton, saveButton)), GridLayout.encloseIn(4, screenPositionX, screenPositionY, screenWidthPixels, screenHeightPixels), sl); cnt.setUIID("SkinDesignerCard"); @@ -520,6 +501,22 @@ public Image createSkinOverlay() { }; } + private void showHelpForm(Form backForm) { + BrowserComponent help = new BrowserComponent(); + help.setURL("jar:///help.html"); + Form helpForm = new Form("Help", new BorderLayout()); + helpForm.setUIID("SkinDesignerForm"); + helpForm.add(BorderLayout.CENTER, help); + Button back = new Button(); + styleIconActionButton(back, FontImage.MATERIAL_ARROW_BACK); + back.addActionListener(ee -> backForm.showBack()); + Container helpActions = FlowLayout.encloseRight(back); + helpActions.setUIID("SkinDesignerTabBar"); + helpForm.add(BorderLayout.NORTH, helpActions); + applyWebsiteTheme(helpForm, websiteDarkMode); + helpForm.show(); + } + private Image createMute(int x, int y, int w, int h, Image img) { Image mute = Image.createImage(img.getWidth(), img.getHeight(), 0); Graphics g = mute.getGraphics(); From 51b428fa3def71558d8b3843a9a88e83bbf80e1d Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Fri, 17 Apr 2026 14:27:49 +0300 Subject: [PATCH 18/55] Fix SkinDesigner tab initialization compile order --- .../java/com/codename1/tools/skindesigner/SkinDesigner.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index ab43bbb4ea..085d8caf06 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -151,9 +151,6 @@ public void runApp() { settingsContainer.setUIID("SkinDesignerCard"); settingsContainer.setScrollableY(true); - details.addTab("Portrait", FontImage.MATERIAL_STAY_CURRENT_PORTRAIT, 4.5f, imPortrait.getContainer()); - details.addTab("Landscape", FontImage.MATERIAL_STAY_CURRENT_LANDSCAPE, 4.5f, imLandscape.getContainer()); - details.addTab("Settings", FontImage.MATERIAL_SETTINGS, 3.5f, settingsContainer); vl.addConstraint(smallFontSize, new NumericConstraint(false, 5, 400, "Font size must be a valid integer in the 5-400 range")). addConstraint(mediumFontSize, new NumericConstraint(false, 5, 400, "Font size must be a valid integer in the 5-400 range")). addConstraint(largeFontSize, new NumericConstraint(false, 5, 400, "Font size must be a valid integer in the 5-400 range")). @@ -181,6 +178,9 @@ public void runApp() { imLandscapeRef[0] = createImageSettings("/skin_l.png", "lan", vl, () -> showHelpForm(skinDesignerForm), saveAction); ImageSettings imPortrait = imPortraitRef[0]; ImageSettings imLandscape = imLandscapeRef[0]; + details.addTab("Portrait", FontImage.MATERIAL_STAY_CURRENT_PORTRAIT, 4.5f, imPortrait.getContainer()); + details.addTab("Landscape", FontImage.MATERIAL_STAY_CURRENT_LANDSCAPE, 4.5f, imLandscape.getContainer()); + details.addTab("Settings", FontImage.MATERIAL_SETTINGS, 3.5f, settingsContainer); skinDesignerForm.show(); initThemeFromUrl(skinDesignerForm, details); From 32353307163862052f2cd0fb03461beed581da1f Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Fri, 17 Apr 2026 18:51:51 +0300 Subject: [PATCH 19/55] Add dark help HTML and drag positioning support --- .../tools/skindesigner/SkinDesigner.java | 41 +++++++++++++++++- .../common/src/main/resources/help.html | 43 +++++++++++++++++++ 2 files changed, 83 insertions(+), 1 deletion(-) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 085d8caf06..f0f2ad528a 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -503,7 +503,7 @@ public Image createSkinOverlay() { private void showHelpForm(Form backForm) { BrowserComponent help = new BrowserComponent(); - help.setURL("jar:///help.html"); + help.setURL("jar:///help.html?theme=" + (websiteDarkMode ? "dark" : "light")); Form helpForm = new Form("Help", new BorderLayout()); helpForm.setUIID("SkinDesignerForm"); helpForm.add(BorderLayout.CENTER, help); @@ -554,6 +554,9 @@ void aimPosition(final Image img, final TextField x, final TextField y, final in Image mute = createMute(x.getAsInt(0), y.getAsInt(0), w, h, img); class oo extends ImageViewer { + private int lastDragX = -1; + private int lastDragY = -1; + public oo(Image img) { super(img); } @@ -561,6 +564,42 @@ public oo(Image img) { public boolean pinch(float scale) { return super.pinch(scale); } + + @Override + public void pointerPressed(int xPos, int yPos) { + super.pointerPressed(xPos, yPos); + lastDragX = xPos; + lastDragY = yPos; + } + + @Override + public void pointerDragged(int xPos, int yPos) { + if(lastDragX < 0 || lastDragY < 0) { + lastDragX = xPos; + lastDragY = yPos; + return; + } + int dx = Math.round((xPos - lastDragX) / getZoom()); + int dy = Math.round((yPos - lastDragY) / getZoom()); + if(dx != 0 || dy != 0) { + int maxX = Math.max(0, img.getWidth() - w); + int maxY = Math.max(0, img.getHeight() - h); + int newX = Math.min(maxX, Math.max(0, x.getAsInt(0) + dx)); + int newY = Math.min(maxY, Math.max(0, y.getAsInt(0) + dy)); + x.setText("" + newX); + y.setText("" + newY); + setImageNoReposition(createMute(newX, newY, w, h, img)); + lastDragX = xPos; + lastDragY = yPos; + } + } + + @Override + public void pointerReleased(int xPos, int yPos) { + super.pointerReleased(xPos, yPos); + lastDragX = -1; + lastDragY = -1; + } } final oo overlay = new oo(mute); ImageViewer iv = new ImageViewer(img) { diff --git a/scripts/skindesigner/common/src/main/resources/help.html b/scripts/skindesigner/common/src/main/resources/help.html index 25165b9daa..17c912b528 100644 --- a/scripts/skindesigner/common/src/main/resources/help.html +++ b/scripts/skindesigner/common/src/main/resources/help.html @@ -4,6 +4,49 @@ Help + +

Skin Designer Help

From fa743b51fa637a7df9c6b37e5b626c0c2777d285 Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Fri, 17 Apr 2026 20:09:16 +0300 Subject: [PATCH 20/55] Improve landscape coordinate defaults and skin safe-area support --- .../com/codename1/impl/javase/JavaSEPort.java | 28 +++++++++++- .../tools/skindesigner/SkinDesigner.java | 44 +++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/Ports/JavaSE/src/com/codename1/impl/javase/JavaSEPort.java b/Ports/JavaSE/src/com/codename1/impl/javase/JavaSEPort.java index bcf4c861e1..c81a1bad02 100644 --- a/Ports/JavaSE/src/com/codename1/impl/javase/JavaSEPort.java +++ b/Ports/JavaSE/src/com/codename1/impl/javase/JavaSEPort.java @@ -2729,7 +2729,17 @@ private void loadSkinFile(InputStream skin, final JFrame frm) { landscapeSkinHotspots = new HashMap(); landscapeScreenCoordinates = new Rectangle(); - if(props.getProperty("roundScreen", "false").equalsIgnoreCase("true")) { + boolean roundScreen = props.getProperty("roundScreen", "false").equalsIgnoreCase("true"); + boolean hasSafeAreaProps = + props.getProperty("safePortraitX") != null || + props.getProperty("safePortraitY") != null || + props.getProperty("safePortraitWidth") != null || + props.getProperty("safePortraitHeight") != null || + props.getProperty("safeLandscapeX") != null || + props.getProperty("safeLandscapeY") != null || + props.getProperty("safeLandscapeWidth") != null || + props.getProperty("safeLandscapeHeight") != null; + if(roundScreen) { safeAreaLandscape = new Rectangle(); safeAreaPortrait = new Rectangle(); @@ -2758,6 +2768,22 @@ private void loadSkinFile(InputStream skin, final JFrame frm) { } else { initializeCoordinates(map, props, portraitSkinHotspots, portraitScreenCoordinates); initializeCoordinates(landscapeMap, props, landscapeSkinHotspots, landscapeScreenCoordinates); + if (hasSafeAreaProps) { + safeAreaPortrait = new Rectangle(); + safeAreaLandscape = new Rectangle(); + safeAreaPortrait.setBounds( + Integer.parseInt(props.getProperty("safePortraitX", "" + portraitScreenCoordinates.x)), + Integer.parseInt(props.getProperty("safePortraitY", "" + portraitScreenCoordinates.y)), + Integer.parseInt(props.getProperty("safePortraitWidth", "" + portraitScreenCoordinates.width)), + Integer.parseInt(props.getProperty("safePortraitHeight", "" + portraitScreenCoordinates.height)) + ); + safeAreaLandscape.setBounds( + Integer.parseInt(props.getProperty("safeLandscapeX", "" + landscapeScreenCoordinates.x)), + Integer.parseInt(props.getProperty("safeLandscapeY", "" + landscapeScreenCoordinates.y)), + Integer.parseInt(props.getProperty("safeLandscapeWidth", "" + landscapeScreenCoordinates.width)), + Integer.parseInt(props.getProperty("safeLandscapeHeight", "" + landscapeScreenCoordinates.height)) + ); + } } diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index f0f2ad528a..dc76c89cfd 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -356,6 +356,10 @@ interface ImageSettings { Container getContainer(); Image createSkinOverlay(); Image getSkinImage(); + int getScreenX(); + int getScreenY(); + int getScreenWidth(); + int getScreenHeight(); } private void autoSave(TextArea ta, String preferencesKey) { @@ -425,6 +429,18 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid final TextField screenHeightPixels = new TextField("480", "Height", 8, TextField.NUMERIC); final TextField screenPositionX = new TextField("40", "X", 8, TextField.NUMERIC); final TextField screenPositionY = new TextField("40", "Y", 8, TextField.NUMERIC); + if("lan".equals(prefix) && Preferences.get("lanX", null) == null) { + String portraitX = Preferences.get("portX", null); + String portraitY = Preferences.get("portY", null); + String portraitWidth = Preferences.get("portWidth", null); + String portraitHeight = Preferences.get("portHeight", null); + if(portraitX != null && portraitY != null && portraitWidth != null && portraitHeight != null) { + screenPositionX.setText(portraitY); + screenPositionY.setText(portraitX); + screenWidthPixels.setText(portraitHeight); + screenHeightPixels.setText(portraitWidth); + } + } styleFields(screenWidthPixels, screenHeightPixels, screenPositionX, screenPositionY); autoSave(screenWidthPixels, prefix + "Width"); autoSave(screenHeightPixels, prefix + "Height"); @@ -498,6 +514,26 @@ public Image createSkinOverlay() { screenWidthPixels.getAsInt(50), screenHeightPixels.getAsInt(50)); return m; } + + @Override + public int getScreenX() { + return screenPositionX.getAsInt(0); + } + + @Override + public int getScreenY() { + return screenPositionY.getAsInt(0); + } + + @Override + public int getScreenWidth() { + return screenWidthPixels.getAsInt(50); + } + + @Override + public int getScreenHeight() { + return screenHeightPixels.getAsInt(50); + } }; } @@ -753,6 +789,14 @@ byte[] createSkinFile(ImageSettings imPortrait, ImageSettings imLandscape, Picke props.put("overrideNames", overrideNamePrimary.getSelectedString() + "," + overrideNameSecondary.getSelectedString() + "," + overrideNameLast.getSelectedString()); + props.put("safePortraitX", "" + imPortrait.getScreenX()); + props.put("safePortraitY", "" + imPortrait.getScreenY()); + props.put("safePortraitWidth", "" + imPortrait.getScreenWidth()); + props.put("safePortraitHeight", "" + imPortrait.getScreenHeight()); + props.put("safeLandscapeX", "" + imLandscape.getScreenX()); + props.put("safeLandscapeY", "" + imLandscape.getScreenY()); + props.put("safeLandscapeWidth", "" + imLandscape.getScreenWidth()); + props.put("safeLandscapeHeight", "" + imLandscape.getScreenHeight()); ze = new ZipEntry("skin.properties"); zos.putNextEntry(ze); From 4dc2c5af68fa5b4cd30c1cb4059fc7a1615ee5d1 Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Fri, 17 Apr 2026 21:46:45 +0300 Subject: [PATCH 21/55] Fix landscape pan defaults and expose advanced skin settings --- .../tools/skindesigner/SkinDesigner.java | 136 +++++++++++++++--- 1 file changed, 115 insertions(+), 21 deletions(-) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index dc76c89cfd..0de757229d 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -1,7 +1,6 @@ package com.codename1.tools.skindesigner; import com.codename1.system.Lifecycle; -import com.codename1.components.FloatingHint; import com.codename1.components.ImageViewer; import com.codename1.components.OnOffSwitch; import com.codename1.components.ScaleImageLabel; @@ -125,6 +124,25 @@ public void runApp() { overrideNameLast.setRenderingPrototype("XXXXXXXX"); autoSave(overrideNameLast, "overrideNameLast"); + TextField safePortraitX = new TextField("40", "Safe Portrait X", 8, TextField.NUMERIC); + TextField safePortraitY = new TextField("40", "Safe Portrait Y", 8, TextField.NUMERIC); + TextField safePortraitWidth = new TextField("320", "Safe Portrait Width", 8, TextField.NUMERIC); + TextField safePortraitHeight = new TextField("480", "Safe Portrait Height", 8, TextField.NUMERIC); + TextField safeLandscapeX = new TextField("40", "Safe Landscape X", 8, TextField.NUMERIC); + TextField safeLandscapeY = new TextField("40", "Safe Landscape Y", 8, TextField.NUMERIC); + TextField safeLandscapeWidth = new TextField("480", "Safe Landscape Width", 8, TextField.NUMERIC); + TextField safeLandscapeHeight = new TextField("320", "Safe Landscape Height", 8, TextField.NUMERIC); + styleFields(safePortraitX, safePortraitY, safePortraitWidth, safePortraitHeight, + safeLandscapeX, safeLandscapeY, safeLandscapeWidth, safeLandscapeHeight); + autoSave(safePortraitX, "safePortraitX"); + autoSave(safePortraitY, "safePortraitY"); + autoSave(safePortraitWidth, "safePortraitWidth"); + autoSave(safePortraitHeight, "safePortraitHeight"); + autoSave(safeLandscapeX, "safeLandscapeX"); + autoSave(safeLandscapeY, "safeLandscapeY"); + autoSave(safeLandscapeWidth, "safeLandscapeWidth"); + autoSave(safeLandscapeHeight, "safeLandscapeHeight"); + Container settingsContainer = BoxLayout.encloseY( labeledFieldTitle("Native Theme"), @@ -136,7 +154,8 @@ public void runApp() { systemFontFamily, labeledFieldTitle(proportionalFontFamily.getHint()), proportionalFontFamily, - new FloatingHint(monospaceFontFamily), + labeledFieldTitle(monospaceFontFamily.getHint()), + monospaceFontFamily, labeledFieldTitle(smallFontSize.getHint()), smallFontSize, labeledFieldTitle(mediumFontSize.getHint()), @@ -146,7 +165,11 @@ public void runApp() { labeledFieldTitle(pixelRatio.getHint()), pixelRatio, labeledFieldTitle("Platform Overrides"), - BoxLayout.encloseX(overrideNamePrimary, overrideNameSecondary, overrideNameLast) + BoxLayout.encloseX(overrideNamePrimary, overrideNameSecondary, overrideNameLast), + labeledFieldTitle("Safe Area Portrait (X/Y/Width/Height)"), + GridLayout.encloseIn(4, safePortraitX, safePortraitY, safePortraitWidth, safePortraitHeight), + labeledFieldTitle("Safe Area Landscape (X/Y/Width/Height)"), + GridLayout.encloseIn(4, safeLandscapeX, safeLandscapeY, safeLandscapeWidth, safeLandscapeHeight) ); settingsContainer.setUIID("SkinDesignerCard"); settingsContainer.setScrollableY(true); @@ -160,7 +183,9 @@ public void runApp() { Runnable saveAction = () -> { byte[] data = createSkinFile(imPortraitRef[0], imLandscapeRef[0], nativeTheme, platformName, tablet, systemFontFamily, proportionalFontFamily, monospaceFontFamily, smallFontSize, mediumFontSize, largeFontSize, - pixelRatio, overrideNamePrimary, overrideNameSecondary, overrideNameLast); + pixelRatio, overrideNamePrimary, overrideNameSecondary, overrideNameLast, + safePortraitX, safePortraitY, safePortraitWidth, safePortraitHeight, + safeLandscapeX, safeLandscapeY, safeLandscapeWidth, safeLandscapeHeight); if(data != null) { FileSystemStorage fs = FileSystemStorage.getInstance(); try(OutputStream os = fs.openOutputStream(fs.getAppHomePath() + "skin-file.skin")) { @@ -450,6 +475,20 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid addConstraint(screenHeightPixels, new NumericConstraint(false, 20, 5000, "Screen size must be a valid integer in the 20-5000 range")). addConstraint(screenPositionX, new NumericConstraint(false, 0, 5000, "Screen position must be a valid integer in the 0-5000 range")). addConstraint(screenPositionY, new NumericConstraint(false, 0, 5000, "Screen position must be a valid integer in the 0-5000 range")); + if("lan".equals(prefix)) { + String portraitX = Preferences.get("portX", null); + String portraitY = Preferences.get("portY", null); + String portraitWidth = Preferences.get("portWidth", null); + String portraitHeight = Preferences.get("portHeight", null); + if(portraitX != null && portraitY != null && portraitWidth != null && portraitHeight != null && + portraitX.equals(screenPositionX.getText()) && portraitY.equals(screenPositionY.getText()) && + portraitWidth.equals(screenWidthPixels.getText()) && portraitHeight.equals(screenHeightPixels.getText())) { + screenPositionX.setText(portraitY); + screenPositionY.setText(portraitX); + screenWidthPixels.setText(portraitHeight); + screenHeightPixels.setText(portraitWidth); + } + } Button aim = new Button(); styleIconActionButton(aim, FontImage.MATERIAL_PAN_TOOL); @@ -469,10 +508,39 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid styleIconActionButton(saveButton, FontImage.MATERIAL_SAVE); saveButton.addActionListener(e -> saveCallback.run()); + ScaleImageLabel maskLabel = new ScaleImageLabel(); + Button maskPicker = new Button("Select Screen Mask (Optional)"); + maskPicker.setUIID("SkinDesignerActionButton"); + maskPicker.addActionListener((e) -> { + Display.getInstance().openGallery((ee) -> { + if(ee != null && ee.getSource() != null) { + try { + String fileName = (String)ee.getSource(); + Image mask = Image.createImage(fileName); + maskLabel.setIcon(mask); + maskLabel.getParent().revalidate(); + Util.copy(FileSystemStorage.getInstance().openInputStream(fileName), + Storage.getInstance().createOutputStream(prefix + ".mask.png")); + } catch(IOException err) { + ToastBar.showErrorMessage("Error Loading Mask: " + err); + } + } + }, Display.GALLERY_IMAGE); + }); + if(Storage.getInstance().exists(prefix + ".mask.png")) { + try(InputStream is = Storage.getInstance().createInputStream(prefix + ".mask.png")) { + maskLabel.setIcon(Image.createImage(is)); + } catch(IOException err) { + Log.e(err); + } + } + final Container cnt = BoxLayout.encloseY(imagePicker, BorderLayout.center(labeledFieldTitle("Screen Position (X/Y/Width/Height)")). add(BorderLayout.EAST, BoxLayout.encloseX(aim, helpButton, saveButton)), GridLayout.encloseIn(4, screenPositionX, screenPositionY, screenWidthPixels, screenHeightPixels), + maskPicker, + maskLabel, sl); cnt.setUIID("SkinDesignerCard"); cnt.setScrollableY(true); @@ -488,12 +556,22 @@ public Image getSkinImage() { int[] data = img.getRGB(); int width = img.getWidth(); int height = img.getHeight(); - Rectangle screen = new Rectangle(screenPositionX.getAsInt(0), screenPositionY.getAsInt(0), - screenWidthPixels.getAsInt(50), screenHeightPixels.getAsInt(50)); - for(int x = 0 ; x < width ; x++) { - for(int y = 0 ; y < height ; y++) { - if(screen.contains(x, y, 1, 1)) { - data[y * width + x] = 0; + Image mask = maskLabel.getIcon(); + if(mask != null && mask.getWidth() == width && mask.getHeight() == height) { + int[] maskRgb = mask.getRGB(); + for(int i = 0 ; i < maskRgb.length ; i++) { + if(maskRgb[i] != 0xff000000) { + data[i] = 0; + } + } + } else { + Rectangle screen = new Rectangle(screenPositionX.getAsInt(0), screenPositionY.getAsInt(0), + screenWidthPixels.getAsInt(50), screenHeightPixels.getAsInt(50)); + for(int x = 0 ; x < width ; x++) { + for(int y = 0 ; y < height ; y++) { + if(screen.contains(x, y, 1, 1)) { + data[y * width + x] = 0; + } } } } @@ -510,8 +588,22 @@ public Image createSkinOverlay() { Image m = Image.createImage(skinImage.getWidth(), skinImage.getHeight(), 0); Graphics g = m.getGraphics(); g.setColor(0); - g.fillRect(screenPositionX.getAsInt(0), screenPositionY.getAsInt(0), - screenWidthPixels.getAsInt(50), screenHeightPixels.getAsInt(50)); + Image mask = maskLabel.getIcon(); + if(mask != null && mask.getWidth() == skinImage.getWidth() && mask.getHeight() == skinImage.getHeight()) { + int[] maskRgb = mask.getRGB(); + int w = mask.getWidth(); + int h = mask.getHeight(); + for(int x = 0; x < w; x++) { + for(int y = 0; y < h; y++) { + if(maskRgb[y * w + x] == 0xff000000) { + g.drawLine(x, y, x, y); + } + } + } + } else { + g.fillRect(screenPositionX.getAsInt(0), screenPositionY.getAsInt(0), + screenWidthPixels.getAsInt(50), screenHeightPixels.getAsInt(50)); + } return m; } @@ -688,11 +780,13 @@ public void keyReleased(int key) { zoomIn.addActionListener(e -> { iv.setZoom(iv.getZoom() + 1); overlay.setZoom(iv.getZoom()); + overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, img)); }); zoomOut.addActionListener(e -> { iv.setZoom(iv.getZoom() - 1); overlay.setZoom(iv.getZoom()); + overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, img)); }); left.addActionListener(e -> { @@ -733,7 +827,7 @@ private byte[] imageToByteArray(Image img) throws IOException { return bo.toByteArray(); } - byte[] createSkinFile(ImageSettings imPortrait, ImageSettings imLandscape, Picker nativeTheme, Picker platformName, OnOffSwitch tablet, TextField systemFontFamily, TextField proportionalFontFamily, TextField monospaceFontFamily, TextField smallFontSize, TextField mediumFontSize, TextField largeFontSize, TextField pixelRatio, Picker overrideNamePrimary, Picker overrideNameSecondary, Picker overrideNameLast) { + byte[] createSkinFile(ImageSettings imPortrait, ImageSettings imLandscape, Picker nativeTheme, Picker platformName, OnOffSwitch tablet, TextField systemFontFamily, TextField proportionalFontFamily, TextField monospaceFontFamily, TextField smallFontSize, TextField mediumFontSize, TextField largeFontSize, TextField pixelRatio, Picker overrideNamePrimary, Picker overrideNameSecondary, Picker overrideNameLast, TextField safePortraitX, TextField safePortraitY, TextField safePortraitWidth, TextField safePortraitHeight, TextField safeLandscapeX, TextField safeLandscapeY, TextField safeLandscapeWidth, TextField safeLandscapeHeight) { Image portrait = imPortrait.getSkinImage(); Image landscape = imLandscape.getSkinImage(); if (portrait == null) { @@ -789,14 +883,14 @@ byte[] createSkinFile(ImageSettings imPortrait, ImageSettings imLandscape, Picke props.put("overrideNames", overrideNamePrimary.getSelectedString() + "," + overrideNameSecondary.getSelectedString() + "," + overrideNameLast.getSelectedString()); - props.put("safePortraitX", "" + imPortrait.getScreenX()); - props.put("safePortraitY", "" + imPortrait.getScreenY()); - props.put("safePortraitWidth", "" + imPortrait.getScreenWidth()); - props.put("safePortraitHeight", "" + imPortrait.getScreenHeight()); - props.put("safeLandscapeX", "" + imLandscape.getScreenX()); - props.put("safeLandscapeY", "" + imLandscape.getScreenY()); - props.put("safeLandscapeWidth", "" + imLandscape.getScreenWidth()); - props.put("safeLandscapeHeight", "" + imLandscape.getScreenHeight()); + props.put("safePortraitX", safePortraitX.getText()); + props.put("safePortraitY", safePortraitY.getText()); + props.put("safePortraitWidth", safePortraitWidth.getText()); + props.put("safePortraitHeight", safePortraitHeight.getText()); + props.put("safeLandscapeX", safeLandscapeX.getText()); + props.put("safeLandscapeY", safeLandscapeY.getText()); + props.put("safeLandscapeWidth", safeLandscapeWidth.getText()); + props.put("safeLandscapeHeight", safeLandscapeHeight.getText()); ze = new ZipEntry("skin.properties"); zos.putNextEntry(ze); From 65d3404b76704cc769eb675ee559db64cb458b77 Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Fri, 17 Apr 2026 23:02:57 +0300 Subject: [PATCH 22/55] Add flood-fill screen selection and safe-area preview controls --- .../tools/skindesigner/SkinDesigner.java | 249 ++++++++++++++---- 1 file changed, 201 insertions(+), 48 deletions(-) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 0de757229d..1560d6f3f1 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -124,26 +124,6 @@ public void runApp() { overrideNameLast.setRenderingPrototype("XXXXXXXX"); autoSave(overrideNameLast, "overrideNameLast"); - TextField safePortraitX = new TextField("40", "Safe Portrait X", 8, TextField.NUMERIC); - TextField safePortraitY = new TextField("40", "Safe Portrait Y", 8, TextField.NUMERIC); - TextField safePortraitWidth = new TextField("320", "Safe Portrait Width", 8, TextField.NUMERIC); - TextField safePortraitHeight = new TextField("480", "Safe Portrait Height", 8, TextField.NUMERIC); - TextField safeLandscapeX = new TextField("40", "Safe Landscape X", 8, TextField.NUMERIC); - TextField safeLandscapeY = new TextField("40", "Safe Landscape Y", 8, TextField.NUMERIC); - TextField safeLandscapeWidth = new TextField("480", "Safe Landscape Width", 8, TextField.NUMERIC); - TextField safeLandscapeHeight = new TextField("320", "Safe Landscape Height", 8, TextField.NUMERIC); - styleFields(safePortraitX, safePortraitY, safePortraitWidth, safePortraitHeight, - safeLandscapeX, safeLandscapeY, safeLandscapeWidth, safeLandscapeHeight); - autoSave(safePortraitX, "safePortraitX"); - autoSave(safePortraitY, "safePortraitY"); - autoSave(safePortraitWidth, "safePortraitWidth"); - autoSave(safePortraitHeight, "safePortraitHeight"); - autoSave(safeLandscapeX, "safeLandscapeX"); - autoSave(safeLandscapeY, "safeLandscapeY"); - autoSave(safeLandscapeWidth, "safeLandscapeWidth"); - autoSave(safeLandscapeHeight, "safeLandscapeHeight"); - - Container settingsContainer = BoxLayout.encloseY( labeledFieldTitle("Native Theme"), nativeTheme, @@ -165,11 +145,7 @@ public void runApp() { labeledFieldTitle(pixelRatio.getHint()), pixelRatio, labeledFieldTitle("Platform Overrides"), - BoxLayout.encloseX(overrideNamePrimary, overrideNameSecondary, overrideNameLast), - labeledFieldTitle("Safe Area Portrait (X/Y/Width/Height)"), - GridLayout.encloseIn(4, safePortraitX, safePortraitY, safePortraitWidth, safePortraitHeight), - labeledFieldTitle("Safe Area Landscape (X/Y/Width/Height)"), - GridLayout.encloseIn(4, safeLandscapeX, safeLandscapeY, safeLandscapeWidth, safeLandscapeHeight) + BoxLayout.encloseX(overrideNamePrimary, overrideNameSecondary, overrideNameLast) ); settingsContainer.setUIID("SkinDesignerCard"); settingsContainer.setScrollableY(true); @@ -183,9 +159,7 @@ public void runApp() { Runnable saveAction = () -> { byte[] data = createSkinFile(imPortraitRef[0], imLandscapeRef[0], nativeTheme, platformName, tablet, systemFontFamily, proportionalFontFamily, monospaceFontFamily, smallFontSize, mediumFontSize, largeFontSize, - pixelRatio, overrideNamePrimary, overrideNameSecondary, overrideNameLast, - safePortraitX, safePortraitY, safePortraitWidth, safePortraitHeight, - safeLandscapeX, safeLandscapeY, safeLandscapeWidth, safeLandscapeHeight); + pixelRatio, overrideNamePrimary, overrideNameSecondary, overrideNameLast); if(data != null) { FileSystemStorage fs = FileSystemStorage.getInstance(); try(OutputStream os = fs.openOutputStream(fs.getAppHomePath() + "skin-file.skin")) { @@ -385,6 +359,10 @@ interface ImageSettings { int getScreenY(); int getScreenWidth(); int getScreenHeight(); + int getSafeX(); + int getSafeY(); + int getSafeWidth(); + int getSafeHeight(); } private void autoSave(TextArea ta, String preferencesKey) { @@ -454,6 +432,11 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid final TextField screenHeightPixels = new TextField("480", "Height", 8, TextField.NUMERIC); final TextField screenPositionX = new TextField("40", "X", 8, TextField.NUMERIC); final TextField screenPositionY = new TextField("40", "Y", 8, TextField.NUMERIC); + final TextField safeX = new TextField("40", "Safe X", 8, TextField.NUMERIC); + final TextField safeY = new TextField("40", "Safe Y", 8, TextField.NUMERIC); + final TextField safeWidth = new TextField("320", "Safe Width", 8, TextField.NUMERIC); + final TextField safeHeight = new TextField("480", "Safe Height", 8, TextField.NUMERIC); + final TextField floodTolerance = new TextField("24", "Tolerance", 4, TextField.NUMERIC); if("lan".equals(prefix) && Preferences.get("lanX", null) == null) { String portraitX = Preferences.get("portX", null); String portraitY = Preferences.get("portY", null); @@ -464,17 +447,32 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid screenPositionY.setText(portraitX); screenWidthPixels.setText(portraitHeight); screenHeightPixels.setText(portraitWidth); + safeX.setText(portraitY); + safeY.setText(portraitX); + safeWidth.setText(portraitHeight); + safeHeight.setText(portraitWidth); } } styleFields(screenWidthPixels, screenHeightPixels, screenPositionX, screenPositionY); + styleFields(safeX, safeY, safeWidth, safeHeight, floodTolerance); autoSave(screenWidthPixels, prefix + "Width"); autoSave(screenHeightPixels, prefix + "Height"); autoSave(screenPositionX, prefix + "X"); autoSave(screenPositionY, prefix + "Y"); + autoSave(safeX, prefix + "SafeX"); + autoSave(safeY, prefix + "SafeY"); + autoSave(safeWidth, prefix + "SafeWidth"); + autoSave(safeHeight, prefix + "SafeHeight"); + autoSave(floodTolerance, prefix + "FloodTolerance"); vl.addConstraint(screenWidthPixels, new NumericConstraint(false, 20, 5000, "Screen size must be a valid integer in the 20-5000 range")). addConstraint(screenHeightPixels, new NumericConstraint(false, 20, 5000, "Screen size must be a valid integer in the 20-5000 range")). addConstraint(screenPositionX, new NumericConstraint(false, 0, 5000, "Screen position must be a valid integer in the 0-5000 range")). - addConstraint(screenPositionY, new NumericConstraint(false, 0, 5000, "Screen position must be a valid integer in the 0-5000 range")); + addConstraint(screenPositionY, new NumericConstraint(false, 0, 5000, "Screen position must be a valid integer in the 0-5000 range")). + addConstraint(safeX, new NumericConstraint(false, 0, 5000, "Safe area X must be a valid integer in the 0-5000 range")). + addConstraint(safeY, new NumericConstraint(false, 0, 5000, "Safe area Y must be a valid integer in the 0-5000 range")). + addConstraint(safeWidth, new NumericConstraint(false, 1, 5000, "Safe area width must be a valid integer in the 1-5000 range")). + addConstraint(safeHeight, new NumericConstraint(false, 1, 5000, "Safe area height must be a valid integer in the 1-5000 range")). + addConstraint(floodTolerance, new NumericConstraint(false, 0, 441, "Tolerance must be 0-441")); if("lan".equals(prefix)) { String portraitX = Preferences.get("portX", null); String portraitY = Preferences.get("portY", null); @@ -487,6 +485,10 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid screenPositionY.setText(portraitX); screenWidthPixels.setText(portraitHeight); screenHeightPixels.setText(portraitWidth); + safeX.setText(portraitY); + safeY.setText(portraitX); + safeWidth.setText(portraitHeight); + safeHeight.setText(portraitWidth); } } @@ -497,6 +499,10 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid aimPosition(sl.getIcon(), screenPositionX, screenPositionY, + safeX, + safeY, + safeWidth, + safeHeight, screenWidthPixels.getAsInt(768), screenHeightPixels.getAsInt(1024))); @@ -509,6 +515,30 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid saveButton.addActionListener(e -> saveCallback.run()); ScaleImageLabel maskLabel = new ScaleImageLabel(); + Button detectScreenButton = new Button("Detect Screen by Color"); + detectScreenButton.setUIID("SkinDesignerActionButton"); + detectScreenButton.addActionListener(e -> { + Image source = sl.getIcon(); + if(source == null) { + ToastBar.showErrorMessage("Please select a skin image first"); + return; + } + Image generatedMask = createFloodFillMask(source, + screenPositionX.getAsInt(0), + screenPositionY.getAsInt(0), + floodTolerance.getAsInt(24)); + if(generatedMask != null) { + maskLabel.setIcon(generatedMask); + maskLabel.getParent().revalidate(); + try(OutputStream os = Storage.getInstance().createOutputStream(prefix + ".mask.png")) { + ImageIO.getImageIO().save(generatedMask, os, ImageIO.FORMAT_PNG, 1); + } catch(IOException err) { + Log.e(err); + ToastBar.showErrorMessage("Error saving generated mask: " + err.getMessage()); + } + } + }); + Button maskPicker = new Button("Select Screen Mask (Optional)"); maskPicker.setUIID("SkinDesignerActionButton"); maskPicker.addActionListener((e) -> { @@ -539,6 +569,9 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid BorderLayout.center(labeledFieldTitle("Screen Position (X/Y/Width/Height)")). add(BorderLayout.EAST, BoxLayout.encloseX(aim, helpButton, saveButton)), GridLayout.encloseIn(4, screenPositionX, screenPositionY, screenWidthPixels, screenHeightPixels), + labeledFieldTitle("Safe Area (X/Y/Width/Height)"), + GridLayout.encloseIn(4, safeX, safeY, safeWidth, safeHeight), + BorderLayout.center(detectScreenButton).add(BorderLayout.EAST, floodTolerance), maskPicker, maskLabel, sl); @@ -626,9 +659,101 @@ public int getScreenWidth() { public int getScreenHeight() { return screenHeightPixels.getAsInt(50); } + + @Override + public int getSafeX() { + return safeX.getAsInt(getScreenX()); + } + + @Override + public int getSafeY() { + return safeY.getAsInt(getScreenY()); + } + + @Override + public int getSafeWidth() { + return safeWidth.getAsInt(getScreenWidth()); + } + + @Override + public int getSafeHeight() { + return safeHeight.getAsInt(getScreenHeight()); + } }; } + private Image createFloodFillMask(Image source, int seedX, int seedY, int tolerance) { + int width = source.getWidth(); + int height = source.getHeight(); + if(seedX < 0 || seedY < 0 || seedX >= width || seedY >= height) { + ToastBar.showErrorMessage("Seed point is outside image bounds"); + return null; + } + int[] src = source.getRGB(); + int[] mask = new int[src.length]; + for(int i = 0; i < mask.length; i++) { + mask[i] = 0xffffffff; + } + boolean[] visited = new boolean[src.length]; + int[] queue = new int[src.length]; + int head = 0; + int tail = 0; + int seedIdx = seedY * width + seedX; + int seedColor = src[seedIdx]; + queue[tail++] = seedIdx; + visited[seedIdx] = true; + while(head < tail) { + int idx = queue[head++]; + int px = idx % width; + int py = idx / width; + if(colorDistance(src[idx], seedColor) <= tolerance) { + mask[idx] = 0xff000000; + if(px > 0) { + int n = idx - 1; + if(!visited[n]) { + visited[n] = true; + queue[tail++] = n; + } + } + if(px < width - 1) { + int n = idx + 1; + if(!visited[n]) { + visited[n] = true; + queue[tail++] = n; + } + } + if(py > 0) { + int n = idx - width; + if(!visited[n]) { + visited[n] = true; + queue[tail++] = n; + } + } + if(py < height - 1) { + int n = idx + width; + if(!visited[n]) { + visited[n] = true; + queue[tail++] = n; + } + } + } + } + return Image.createImage(mask, width, height); + } + + private int colorDistance(int c1, int c2) { + int r1 = (c1 >> 16) & 0xff; + int g1 = (c1 >> 8) & 0xff; + int b1 = c1 & 0xff; + int r2 = (c2 >> 16) & 0xff; + int g2 = (c2 >> 8) & 0xff; + int b2 = c2 & 0xff; + int dr = r1 - r2; + int dg = g1 - g2; + int db = b1 - b2; + return (int)Math.sqrt(dr * dr + dg * dg + db * db); + } + private void showHelpForm(Form backForm) { BrowserComponent help = new BrowserComponent(); help.setURL("jar:///help.html?theme=" + (websiteDarkMode ? "dark" : "light")); @@ -645,19 +770,47 @@ private void showHelpForm(Form backForm) { helpForm.show(); } - private Image createMute(int x, int y, int w, int h, Image img) { + private Image createMute(int x, int y, int w, int h, int safeX, int safeY, int safeW, int safeH, Image img) { Image mute = Image.createImage(img.getWidth(), img.getHeight(), 0); Graphics g = mute.getGraphics(); g.setAlpha(150); g.setColor(0); g.fillRect(x, y, w, h); + g.setAlpha(80); + int checker = 12; + for(int yy = y; yy < y + h; yy += checker) { + for(int xx = x; xx < x + w; xx += checker) { + boolean dark = (((xx - x) / checker) + ((yy - y) / checker)) % 2 == 0; + g.setColor(dark ? 0x999999 : 0xcccccc); + g.fillRect(xx, yy, Math.min(checker, x + w - xx), Math.min(checker, y + h - yy)); + } + } + g.setColor(0xff0000); + int safeRight = safeX + safeW; + int safeBottom = safeY + safeH; + int screenRight = x + w; + int screenBottom = y + h; + if(safeY > y) { + g.fillRect(x, y, w, Math.max(0, safeY - y)); + } + if(safeX > x) { + g.fillRect(x, safeY, Math.max(0, safeX - x), Math.max(0, safeH)); + } + if(safeRight < screenRight) { + g.fillRect(safeRight, safeY, Math.max(0, screenRight - safeRight), Math.max(0, safeH)); + } + if(safeBottom < screenBottom) { + g.fillRect(x, safeBottom, w, Math.max(0, screenBottom - safeBottom)); + } g.setColor(0xff); g.drawRect(x, y, w, h); + g.setColor(0xff0000); + g.drawRect(safeX, safeY, safeW, safeH); g.setAlpha(255); return mute; } - void aimPosition(final Image img, final TextField x, final TextField y, final int w, final int h) { + void aimPosition(final Image img, final TextField x, final TextField y, final TextField safeX, final TextField safeY, final TextField safeW, final TextField safeH, final int w, final int h) { if(img == null) { ToastBar.showErrorMessage("You need to pick a skin image first"); return; @@ -680,7 +833,7 @@ void aimPosition(final Image img, final TextField x, final TextField y, final in topActions.setUIID("SkinDesignerTabBar"); editPosition.add(BorderLayout.NORTH, topActions); - Image mute = createMute(x.getAsInt(0), y.getAsInt(0), w, h, img); + Image mute = createMute(x.getAsInt(0), y.getAsInt(0), w, h, safeX.getAsInt(x.getAsInt(0)), safeY.getAsInt(y.getAsInt(0)), safeW.getAsInt(w), safeH.getAsInt(h), img); class oo extends ImageViewer { private int lastDragX = -1; private int lastDragY = -1; @@ -716,7 +869,7 @@ public void pointerDragged(int xPos, int yPos) { int newY = Math.min(maxY, Math.max(0, y.getAsInt(0) + dy)); x.setText("" + newX); y.setText("" + newY); - setImageNoReposition(createMute(newX, newY, w, h, img)); + setImageNoReposition(createMute(newX, newY, w, h, safeX.getAsInt(newX), safeY.getAsInt(newY), safeW.getAsInt(w), safeH.getAsInt(h), img)); lastDragX = xPos; lastDragY = yPos; } @@ -780,37 +933,37 @@ public void keyReleased(int key) { zoomIn.addActionListener(e -> { iv.setZoom(iv.getZoom() + 1); overlay.setZoom(iv.getZoom()); - overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, img)); + overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, safeX.getAsInt(x.getAsInt(0)), safeY.getAsInt(y.getAsInt(0)), safeW.getAsInt(w), safeH.getAsInt(h), img)); }); zoomOut.addActionListener(e -> { iv.setZoom(iv.getZoom() - 1); overlay.setZoom(iv.getZoom()); - overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, img)); + overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, safeX.getAsInt(x.getAsInt(0)), safeY.getAsInt(y.getAsInt(0)), safeW.getAsInt(w), safeH.getAsInt(h), img)); }); left.addActionListener(e -> { int newX = x.getAsInt(0) - 1; x.setText("" + newX); - overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, img)); + overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, safeX.getAsInt(x.getAsInt(0)), safeY.getAsInt(y.getAsInt(0)), safeW.getAsInt(w), safeH.getAsInt(h), img)); }); right.addActionListener(e -> { int newX = x.getAsInt(0) + 1; x.setText("" + newX); - overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, img)); + overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, safeX.getAsInt(x.getAsInt(0)), safeY.getAsInt(y.getAsInt(0)), safeW.getAsInt(w), safeH.getAsInt(h), img)); }); up.addActionListener(e -> { int newY = y.getAsInt(0) - 1; y.setText("" + newY); - overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, img)); + overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, safeX.getAsInt(x.getAsInt(0)), safeY.getAsInt(y.getAsInt(0)), safeW.getAsInt(w), safeH.getAsInt(h), img)); }); down.addActionListener(e -> { int newY = y.getAsInt(0) + 1; y.setText("" + newY); - overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, img)); + overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, safeX.getAsInt(x.getAsInt(0)), safeY.getAsInt(y.getAsInt(0)), safeW.getAsInt(w), safeH.getAsInt(h), img)); }); editPosition.add(BorderLayout.CENTER, LayeredLayout.encloseIn(iv, overlay, @@ -827,7 +980,7 @@ private byte[] imageToByteArray(Image img) throws IOException { return bo.toByteArray(); } - byte[] createSkinFile(ImageSettings imPortrait, ImageSettings imLandscape, Picker nativeTheme, Picker platformName, OnOffSwitch tablet, TextField systemFontFamily, TextField proportionalFontFamily, TextField monospaceFontFamily, TextField smallFontSize, TextField mediumFontSize, TextField largeFontSize, TextField pixelRatio, Picker overrideNamePrimary, Picker overrideNameSecondary, Picker overrideNameLast, TextField safePortraitX, TextField safePortraitY, TextField safePortraitWidth, TextField safePortraitHeight, TextField safeLandscapeX, TextField safeLandscapeY, TextField safeLandscapeWidth, TextField safeLandscapeHeight) { + byte[] createSkinFile(ImageSettings imPortrait, ImageSettings imLandscape, Picker nativeTheme, Picker platformName, OnOffSwitch tablet, TextField systemFontFamily, TextField proportionalFontFamily, TextField monospaceFontFamily, TextField smallFontSize, TextField mediumFontSize, TextField largeFontSize, TextField pixelRatio, Picker overrideNamePrimary, Picker overrideNameSecondary, Picker overrideNameLast) { Image portrait = imPortrait.getSkinImage(); Image landscape = imLandscape.getSkinImage(); if (portrait == null) { @@ -883,14 +1036,14 @@ byte[] createSkinFile(ImageSettings imPortrait, ImageSettings imLandscape, Picke props.put("overrideNames", overrideNamePrimary.getSelectedString() + "," + overrideNameSecondary.getSelectedString() + "," + overrideNameLast.getSelectedString()); - props.put("safePortraitX", safePortraitX.getText()); - props.put("safePortraitY", safePortraitY.getText()); - props.put("safePortraitWidth", safePortraitWidth.getText()); - props.put("safePortraitHeight", safePortraitHeight.getText()); - props.put("safeLandscapeX", safeLandscapeX.getText()); - props.put("safeLandscapeY", safeLandscapeY.getText()); - props.put("safeLandscapeWidth", safeLandscapeWidth.getText()); - props.put("safeLandscapeHeight", safeLandscapeHeight.getText()); + props.put("safePortraitX", "" + imPortrait.getSafeX()); + props.put("safePortraitY", "" + imPortrait.getSafeY()); + props.put("safePortraitWidth", "" + imPortrait.getSafeWidth()); + props.put("safePortraitHeight", "" + imPortrait.getSafeHeight()); + props.put("safeLandscapeX", "" + imLandscape.getSafeX()); + props.put("safeLandscapeY", "" + imLandscape.getSafeY()); + props.put("safeLandscapeWidth", "" + imLandscape.getSafeWidth()); + props.put("safeLandscapeHeight", "" + imLandscape.getSafeHeight()); ze = new ZipEntry("skin.properties"); zos.putNextEntry(ze); From 6c59a7031e964b97667e98f4ed01f65abf27713b Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Sat, 18 Apr 2026 13:25:59 +0300 Subject: [PATCH 23/55] Refine screen detection UX and split-pane layout --- .../tools/skindesigner/SkinDesigner.java | 38 +++++++++++++------ 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 1560d6f3f1..7bef9c1fcd 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -4,6 +4,7 @@ import com.codename1.components.ImageViewer; import com.codename1.components.OnOffSwitch; import com.codename1.components.ScaleImageLabel; +import com.codename1.components.SplitPane; import com.codename1.components.ToastBar; import com.codename1.io.FileSystemStorage; import com.codename1.ui.Display; @@ -436,7 +437,7 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid final TextField safeY = new TextField("40", "Safe Y", 8, TextField.NUMERIC); final TextField safeWidth = new TextField("320", "Safe Width", 8, TextField.NUMERIC); final TextField safeHeight = new TextField("480", "Safe Height", 8, TextField.NUMERIC); - final TextField floodTolerance = new TextField("24", "Tolerance", 4, TextField.NUMERIC); + final TextField floodTolerance = new TextField("24", "Color Tol (0-441)", 4, TextField.NUMERIC); if("lan".equals(prefix) && Preferences.get("lanX", null) == null) { String portraitX = Preferences.get("portX", null); String portraitY = Preferences.get("portY", null); @@ -523,9 +524,11 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid ToastBar.showErrorMessage("Please select a skin image first"); return; } + int seedX = screenPositionX.getAsInt(0) + (screenWidthPixels.getAsInt(0) / 2); + int seedY = screenPositionY.getAsInt(0) + (screenHeightPixels.getAsInt(0) / 2); Image generatedMask = createFloodFillMask(source, - screenPositionX.getAsInt(0), - screenPositionY.getAsInt(0), + seedX, + seedY, floodTolerance.getAsInt(24)); if(generatedMask != null) { maskLabel.setIcon(generatedMask); @@ -565,18 +568,31 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid } } - final Container cnt = BoxLayout.encloseY(imagePicker, - BorderLayout.center(labeledFieldTitle("Screen Position (X/Y/Width/Height)")). - add(BorderLayout.EAST, BoxLayout.encloseX(aim, helpButton, saveButton)), + Container actionButtons = FlowLayout.encloseCenter(aim, helpButton, saveButton); + Container detectionButtons = FlowLayout.encloseCenter(detectScreenButton, floodTolerance, maskPicker); + Label detectionHint = new Label("Uses flood-fill from the screen center"); + detectionHint.setUIID("SkinDesignerFieldLabel"); + Container controls = BoxLayout.encloseY( + imagePicker, + labeledFieldTitle("Screen Position (X/Y/Width/Height)"), GridLayout.encloseIn(4, screenPositionX, screenPositionY, screenWidthPixels, screenHeightPixels), labeledFieldTitle("Safe Area (X/Y/Width/Height)"), GridLayout.encloseIn(4, safeX, safeY, safeWidth, safeHeight), - BorderLayout.center(detectScreenButton).add(BorderLayout.EAST, floodTolerance), - maskPicker, - maskLabel, - sl); + labeledFieldTitle("Screen Detection"), + detectionHint, + detectionButtons, + actionButtons + ); + controls.setUIID("SkinDesignerCard"); + controls.setScrollableY(true); + Container preview = BoxLayout.encloseY(maskLabel, sl); + preview.setUIID("SkinDesignerCard"); + preview.setScrollableY(true); + + int splitType = Display.getInstance().isPortrait() ? SplitPane.HORIZONTAL_SPLIT : SplitPane.VERTICAL_SPLIT; + Component split = new SplitPane(splitType, controls, preview, "35%", "45%", "55%"); + final Container cnt = BorderLayout.center(split); cnt.setUIID("SkinDesignerCard"); - cnt.setScrollableY(true); return new ImageSettings() { @Override public Container getContainer() { From 74702341e475ebf0b2cce414d02f6f2a9f3cb575 Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Sat, 18 Apr 2026 19:06:07 +0300 Subject: [PATCH 24/55] Fix split orientation and tighten flood-fill detection --- .../tools/skindesigner/SkinDesigner.java | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 7bef9c1fcd..5f3b4baa67 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -45,9 +45,8 @@ import net.sf.zipme.ZipOutputStream; public class SkinDesigner extends Lifecycle { - private static final String[] NATIVE_THEMES = {"iOS 7+", "iOS 6", "Android 4 +","Android 2.x", "Windows"}; - private static final String[] NATIVE_THEME_FILES = {"iOS7Theme.res", "iPhoneTheme.res", - "android_holo_light.res","androidTheme.res", "winTheme.res"}; + private static final String[] NATIVE_THEMES = {"iOS", "Android", "Windows"}; + private static final String[] NATIVE_THEME_FILES = {"iOS7Theme.res", "android_holo_light.res", "winTheme.res"}; private boolean websiteDarkMode; @Override @@ -589,7 +588,7 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid preview.setUIID("SkinDesignerCard"); preview.setScrollableY(true); - int splitType = Display.getInstance().isPortrait() ? SplitPane.HORIZONTAL_SPLIT : SplitPane.VERTICAL_SPLIT; + int splitType = "lan".equals(prefix) ? SplitPane.VERTICAL_SPLIT : SplitPane.HORIZONTAL_SPLIT; Component split = new SplitPane(splitType, controls, preview, "35%", "45%", "55%"); final Container cnt = BorderLayout.center(split); cnt.setUIID("SkinDesignerCard"); @@ -716,13 +715,17 @@ private Image createFloodFillMask(Image source, int seedX, int seedY, int tolera int tail = 0; int seedIdx = seedY * width + seedX; int seedColor = src[seedIdx]; + if(((seedColor >>> 24) & 0xff) < 16) { + ToastBar.showErrorMessage("Detected seed point is transparent. Adjust screen position first."); + return null; + } queue[tail++] = seedIdx; visited[seedIdx] = true; while(head < tail) { int idx = queue[head++]; int px = idx % width; int py = idx / width; - if(colorDistance(src[idx], seedColor) <= tolerance) { + if(colorMatch(src[idx], seedColor, tolerance)) { mask[idx] = 0xff000000; if(px > 0) { int n = idx - 1; @@ -757,17 +760,22 @@ private Image createFloodFillMask(Image source, int seedX, int seedY, int tolera return Image.createImage(mask, width, height); } - private int colorDistance(int c1, int c2) { + private boolean colorMatch(int c1, int c2, int tolerance) { + int a1 = (c1 >>> 24) & 0xff; + int a2 = (c2 >>> 24) & 0xff; + if(a1 < 16) { + return false; + } int r1 = (c1 >> 16) & 0xff; int g1 = (c1 >> 8) & 0xff; int b1 = c1 & 0xff; int r2 = (c2 >> 16) & 0xff; int g2 = (c2 >> 8) & 0xff; int b2 = c2 & 0xff; - int dr = r1 - r2; - int dg = g1 - g2; - int db = b1 - b2; - return (int)Math.sqrt(dr * dr + dg * dg + db * db); + return Math.abs(a1 - a2) <= tolerance && + Math.abs(r1 - r2) <= tolerance && + Math.abs(g1 - g2) <= tolerance && + Math.abs(b1 - b2) <= tolerance; } private void showHelpForm(Form backForm) { From c15de560c484ce62d06b8d65e1179560ec5b788b Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Sat, 18 Apr 2026 20:58:45 +0300 Subject: [PATCH 25/55] Make mask usage opt-in and handle transparent flood-fill seeds --- .../tools/skindesigner/SkinDesigner.java | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 5f3b4baa67..87f69ccfb3 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -515,6 +515,10 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid saveButton.addActionListener(e -> saveCallback.run()); ScaleImageLabel maskLabel = new ScaleImageLabel(); + OnOffSwitch useMask = new OnOffSwitch(); + useMask.setValue(false); + useMask.setUIID("SkinDesignerField"); + autoSave(useMask, prefix + "UseMask"); Button detectScreenButton = new Button("Detect Screen by Color"); detectScreenButton.setUIID("SkinDesignerActionButton"); detectScreenButton.addActionListener(e -> { @@ -531,6 +535,7 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid floodTolerance.getAsInt(24)); if(generatedMask != null) { maskLabel.setIcon(generatedMask); + useMask.setValue(true); maskLabel.getParent().revalidate(); try(OutputStream os = Storage.getInstance().createOutputStream(prefix + ".mask.png")) { ImageIO.getImageIO().save(generatedMask, os, ImageIO.FORMAT_PNG, 1); @@ -550,6 +555,7 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid String fileName = (String)ee.getSource(); Image mask = Image.createImage(fileName); maskLabel.setIcon(mask); + useMask.setValue(true); maskLabel.getParent().revalidate(); Util.copy(FileSystemStorage.getInstance().openInputStream(fileName), Storage.getInstance().createOutputStream(prefix + ".mask.png")); @@ -566,9 +572,19 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid Log.e(err); } } + Button clearMask = new Button("Clear Mask"); + clearMask.setUIID("SkinDesignerActionButton"); + clearMask.addActionListener(e -> { + maskLabel.setIcon(null); + useMask.setValue(false); + Storage.getInstance().deleteStorageFile(prefix + ".mask.png"); + if(maskLabel.getParent() != null) { + maskLabel.getParent().revalidate(); + } + }); Container actionButtons = FlowLayout.encloseCenter(aim, helpButton, saveButton); - Container detectionButtons = FlowLayout.encloseCenter(detectScreenButton, floodTolerance, maskPicker); + Container detectionButtons = FlowLayout.encloseCenter(detectScreenButton, floodTolerance, maskPicker, clearMask); Label detectionHint = new Label("Uses flood-fill from the screen center"); detectionHint.setUIID("SkinDesignerFieldLabel"); Container controls = BoxLayout.encloseY( @@ -580,6 +596,7 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid labeledFieldTitle("Screen Detection"), detectionHint, detectionButtons, + BorderLayout.center(labeledFieldTitle("Use Screen Mask")).add(BorderLayout.EAST, useMask), actionButtons ); controls.setUIID("SkinDesignerCard"); @@ -605,7 +622,7 @@ public Image getSkinImage() { int width = img.getWidth(); int height = img.getHeight(); Image mask = maskLabel.getIcon(); - if(mask != null && mask.getWidth() == width && mask.getHeight() == height) { + if(useMask.isValue() && mask != null && mask.getWidth() == width && mask.getHeight() == height) { int[] maskRgb = mask.getRGB(); for(int i = 0 ; i < maskRgb.length ; i++) { if(maskRgb[i] != 0xff000000) { @@ -637,7 +654,7 @@ public Image createSkinOverlay() { Graphics g = m.getGraphics(); g.setColor(0); Image mask = maskLabel.getIcon(); - if(mask != null && mask.getWidth() == skinImage.getWidth() && mask.getHeight() == skinImage.getHeight()) { + if(useMask.isValue() && mask != null && mask.getWidth() == skinImage.getWidth() && mask.getHeight() == skinImage.getHeight()) { int[] maskRgb = mask.getRGB(); int w = mask.getWidth(); int h = mask.getHeight(); @@ -715,10 +732,6 @@ private Image createFloodFillMask(Image source, int seedX, int seedY, int tolera int tail = 0; int seedIdx = seedY * width + seedX; int seedColor = src[seedIdx]; - if(((seedColor >>> 24) & 0xff) < 16) { - ToastBar.showErrorMessage("Detected seed point is transparent. Adjust screen position first."); - return null; - } queue[tail++] = seedIdx; visited[seedIdx] = true; while(head < tail) { @@ -763,8 +776,8 @@ private Image createFloodFillMask(Image source, int seedX, int seedY, int tolera private boolean colorMatch(int c1, int c2, int tolerance) { int a1 = (c1 >>> 24) & 0xff; int a2 = (c2 >>> 24) & 0xff; - if(a1 < 16) { - return false; + if(a2 < 16) { + return a1 < 16; } int r1 = (c1 >> 16) & 0xff; int g1 = (c1 >> 8) & 0xff; From d6342a1528cca381ef87be8502564631c8baa1a7 Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Sun, 19 Apr 2026 13:09:16 +0300 Subject: [PATCH 26/55] Make mask opt-in in UI and move safe area with pan --- .../tools/skindesigner/SkinDesigner.java | 65 +++++++------------ 1 file changed, 24 insertions(+), 41 deletions(-) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 87f69ccfb3..e1d1ccc7b0 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -546,25 +546,6 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid } }); - Button maskPicker = new Button("Select Screen Mask (Optional)"); - maskPicker.setUIID("SkinDesignerActionButton"); - maskPicker.addActionListener((e) -> { - Display.getInstance().openGallery((ee) -> { - if(ee != null && ee.getSource() != null) { - try { - String fileName = (String)ee.getSource(); - Image mask = Image.createImage(fileName); - maskLabel.setIcon(mask); - useMask.setValue(true); - maskLabel.getParent().revalidate(); - Util.copy(FileSystemStorage.getInstance().openInputStream(fileName), - Storage.getInstance().createOutputStream(prefix + ".mask.png")); - } catch(IOException err) { - ToastBar.showErrorMessage("Error Loading Mask: " + err); - } - } - }, Display.GALLERY_IMAGE); - }); if(Storage.getInstance().exists(prefix + ".mask.png")) { try(InputStream is = Storage.getInstance().createInputStream(prefix + ".mask.png")) { maskLabel.setIcon(Image.createImage(is)); @@ -572,36 +553,22 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid Log.e(err); } } - Button clearMask = new Button("Clear Mask"); - clearMask.setUIID("SkinDesignerActionButton"); - clearMask.addActionListener(e -> { - maskLabel.setIcon(null); - useMask.setValue(false); - Storage.getInstance().deleteStorageFile(prefix + ".mask.png"); - if(maskLabel.getParent() != null) { - maskLabel.getParent().revalidate(); - } - }); Container actionButtons = FlowLayout.encloseCenter(aim, helpButton, saveButton); - Container detectionButtons = FlowLayout.encloseCenter(detectScreenButton, floodTolerance, maskPicker, clearMask); - Label detectionHint = new Label("Uses flood-fill from the screen center"); - detectionHint.setUIID("SkinDesignerFieldLabel"); + Container detectionButtons = FlowLayout.encloseCenter(detectScreenButton, floodTolerance, useMask); Container controls = BoxLayout.encloseY( imagePicker, labeledFieldTitle("Screen Position (X/Y/Width/Height)"), GridLayout.encloseIn(4, screenPositionX, screenPositionY, screenWidthPixels, screenHeightPixels), labeledFieldTitle("Safe Area (X/Y/Width/Height)"), GridLayout.encloseIn(4, safeX, safeY, safeWidth, safeHeight), - labeledFieldTitle("Screen Detection"), - detectionHint, + labeledFieldTitle("Screen Mask Detection"), detectionButtons, - BorderLayout.center(labeledFieldTitle("Use Screen Mask")).add(BorderLayout.EAST, useMask), actionButtons ); controls.setUIID("SkinDesignerCard"); controls.setScrollableY(true); - Container preview = BoxLayout.encloseY(maskLabel, sl); + Container preview = BoxLayout.encloseY(sl); preview.setUIID("SkinDesignerCard"); preview.setScrollableY(true); @@ -904,9 +871,17 @@ public void pointerDragged(int xPos, int yPos) { int maxY = Math.max(0, img.getHeight() - h); int newX = Math.min(maxX, Math.max(0, x.getAsInt(0) + dx)); int newY = Math.min(maxY, Math.max(0, y.getAsInt(0) + dy)); + int safeWidthValue = safeW.getAsInt(w); + int safeHeightValue = safeH.getAsInt(h); + int safeMaxX = Math.max(0, img.getWidth() - safeWidthValue); + int safeMaxY = Math.max(0, img.getHeight() - safeHeightValue); + int newSafeX = Math.min(safeMaxX, Math.max(0, safeX.getAsInt(newX) + dx)); + int newSafeY = Math.min(safeMaxY, Math.max(0, safeY.getAsInt(newY) + dy)); x.setText("" + newX); y.setText("" + newY); - setImageNoReposition(createMute(newX, newY, w, h, safeX.getAsInt(newX), safeY.getAsInt(newY), safeW.getAsInt(w), safeH.getAsInt(h), img)); + safeX.setText("" + newSafeX); + safeY.setText("" + newSafeY); + setImageNoReposition(createMute(newX, newY, w, h, newSafeX, newSafeY, safeWidthValue, safeHeightValue, img)); lastDragX = xPos; lastDragY = yPos; } @@ -980,26 +955,34 @@ public void keyReleased(int key) { }); left.addActionListener(e -> { - int newX = x.getAsInt(0) - 1; + int newX = Math.max(0, x.getAsInt(0) - 1); x.setText("" + newX); + int safeMaxX = Math.max(0, img.getWidth() - safeW.getAsInt(w)); + safeX.setText("" + Math.max(0, Math.min(safeMaxX, safeX.getAsInt(0) - 1))); overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, safeX.getAsInt(x.getAsInt(0)), safeY.getAsInt(y.getAsInt(0)), safeW.getAsInt(w), safeH.getAsInt(h), img)); }); right.addActionListener(e -> { - int newX = x.getAsInt(0) + 1; + int newX = Math.min(Math.max(0, img.getWidth() - w), x.getAsInt(0) + 1); x.setText("" + newX); + int safeMaxX = Math.max(0, img.getWidth() - safeW.getAsInt(w)); + safeX.setText("" + Math.max(0, Math.min(safeMaxX, safeX.getAsInt(0) + 1))); overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, safeX.getAsInt(x.getAsInt(0)), safeY.getAsInt(y.getAsInt(0)), safeW.getAsInt(w), safeH.getAsInt(h), img)); }); up.addActionListener(e -> { - int newY = y.getAsInt(0) - 1; + int newY = Math.max(0, y.getAsInt(0) - 1); y.setText("" + newY); + int safeMaxY = Math.max(0, img.getHeight() - safeH.getAsInt(h)); + safeY.setText("" + Math.max(0, Math.min(safeMaxY, safeY.getAsInt(0) - 1))); overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, safeX.getAsInt(x.getAsInt(0)), safeY.getAsInt(y.getAsInt(0)), safeW.getAsInt(w), safeH.getAsInt(h), img)); }); down.addActionListener(e -> { - int newY = y.getAsInt(0) + 1; + int newY = Math.min(Math.max(0, img.getHeight() - h), y.getAsInt(0) + 1); y.setText("" + newY); + int safeMaxY = Math.max(0, img.getHeight() - safeH.getAsInt(h)); + safeY.setText("" + Math.max(0, Math.min(safeMaxY, safeY.getAsInt(0) + 1))); overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, safeX.getAsInt(x.getAsInt(0)), safeY.getAsInt(y.getAsInt(0)), safeW.getAsInt(w), safeH.getAsInt(h), img)); }); From aa80cc5dcc3a2e2466690f7d2257d95b1275fa9d Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Mon, 20 Apr 2026 07:52:59 +0300 Subject: [PATCH 27/55] Rewrite aim form to fix freezes, pan, and zoom drift Replace the stacked ImageViewer + overlay with a single custom Component. Eliminate per-drag full-image allocation from createMute, add Screen/Safe/Pan mode toggles so the safe area can be moved independently, and let zoom operate on one shared view so overlay and skin no longer desync. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../tools/skindesigner/SkinDesigner.java | 515 ++++++++++++------ 1 file changed, 339 insertions(+), 176 deletions(-) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index e1d1ccc7b0..897adc387d 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -1,7 +1,6 @@ package com.codename1.tools.skindesigner; import com.codename1.system.Lifecycle; -import com.codename1.components.ImageViewer; import com.codename1.components.OnOffSwitch; import com.codename1.components.ScaleImageLabel; import com.codename1.components.SplitPane; @@ -31,7 +30,6 @@ import com.codename1.ui.layouts.BoxLayout; import com.codename1.ui.layouts.FlowLayout; import com.codename1.ui.layouts.GridLayout; -import com.codename1.ui.layouts.LayeredLayout; import com.codename1.ui.spinner.Picker; import com.codename1.ui.util.ImageIO; import com.codename1.ui.util.UITimer; @@ -774,44 +772,306 @@ private void showHelpForm(Form backForm) { helpForm.show(); } - private Image createMute(int x, int y, int w, int h, int safeX, int safeY, int safeW, int safeH, Image img) { - Image mute = Image.createImage(img.getWidth(), img.getHeight(), 0); - Graphics g = mute.getGraphics(); - g.setAlpha(150); - g.setColor(0); - g.fillRect(x, y, w, h); - g.setAlpha(80); - int checker = 12; - for(int yy = y; yy < y + h; yy += checker) { - for(int xx = x; xx < x + w; xx += checker) { - boolean dark = (((xx - x) / checker) + ((yy - y) / checker)) % 2 == 0; - g.setColor(dark ? 0x999999 : 0xcccccc); - g.fillRect(xx, yy, Math.min(checker, x + w - xx), Math.min(checker, y + h - yy)); + static final int AIM_MODE_SCREEN = 0; + static final int AIM_MODE_SAFE = 1; + static final int AIM_MODE_PAN = 2; + + final class AimView extends Component { + private final Image img; + private final int imgW; + private final int imgH; + private final int screenW; + private final int screenH; + private final TextField xField; + private final TextField yField; + private final TextField safeXField; + private final TextField safeYField; + private final TextField safeWField; + private final TextField safeHField; + private int mode = AIM_MODE_SCREEN; + private float zoomMul = 1f; + private float panNX = 0.5f; + private float panNY = 0.5f; + private int lastPX = -1; + private int lastPY = -1; + + AimView(Image img, TextField xField, TextField yField, TextField safeXField, TextField safeYField, + TextField safeWField, TextField safeHField, int screenW, int screenH) { + this.img = img; + this.imgW = img.getWidth(); + this.imgH = img.getHeight(); + this.xField = xField; + this.yField = yField; + this.safeXField = safeXField; + this.safeYField = safeYField; + this.safeWField = safeWField; + this.safeHField = safeHField; + this.screenW = screenW; + this.screenH = screenH; + setUIID("SkinDesignerCard"); + setFocusable(true); + } + + void setMode(int mode) { + this.mode = mode; + } + + int getMode() { + return mode; + } + + void zoomIn() { + float nz = Math.min(8f, zoomMul * 1.5f); + if (nz != zoomMul) { + zoomMul = nz; + repaint(); + } + } + + void zoomOut() { + float nz = Math.max(1f, zoomMul / 1.5f); + if (nz != zoomMul) { + zoomMul = nz; + if (zoomMul <= 1f) { + panNX = 0.5f; + panNY = 0.5f; + } + repaint(); + } + } + + void nudge(int dx, int dy) { + applyDelta(dx, dy); + repaint(); + } + + private float currentScale() { + int vw = getWidth(); + int vh = getHeight(); + if (vw <= 0 || vh <= 0 || imgW <= 0 || imgH <= 0) { + return 0f; } + float fit = Math.min(((float) vw) / imgW, ((float) vh) / imgH); + return fit * zoomMul; } - g.setColor(0xff0000); - int safeRight = safeX + safeW; - int safeBottom = safeY + safeH; - int screenRight = x + w; - int screenBottom = y + h; - if(safeY > y) { - g.fillRect(x, y, w, Math.max(0, safeY - y)); + + private int drawOriginX(float scale) { + int vw = getWidth(); + int drawW = Math.max(1, Math.round(imgW * scale)); + if (drawW <= vw) { + return getX() + (vw - drawW) / 2; + } + int raw = getX() + vw / 2 - Math.round(panNX * drawW); + int min = getX() + vw - drawW; + int max = getX(); + return Math.max(min, Math.min(max, raw)); } - if(safeX > x) { - g.fillRect(x, safeY, Math.max(0, safeX - x), Math.max(0, safeH)); + + private int drawOriginY(float scale) { + int vh = getHeight(); + int drawH = Math.max(1, Math.round(imgH * scale)); + if (drawH <= vh) { + return getY() + (vh - drawH) / 2; + } + int raw = getY() + vh / 2 - Math.round(panNY * drawH); + int min = getY() + vh - drawH; + int max = getY(); + return Math.max(min, Math.min(max, raw)); } - if(safeRight < screenRight) { - g.fillRect(safeRight, safeY, Math.max(0, screenRight - safeRight), Math.max(0, safeH)); + + private int clamp(int v, int lo, int hi) { + if (hi < lo) { + hi = lo; + } + return Math.max(lo, Math.min(hi, v)); } - if(safeBottom < screenBottom) { - g.fillRect(x, safeBottom, w, Math.max(0, screenBottom - safeBottom)); + + private void applyDelta(int dImgX, int dImgY) { + if (dImgX == 0 && dImgY == 0) { + return; + } + if (mode == AIM_MODE_PAN) { + if (zoomMul > 1f) { + float scale = currentScale(); + if (scale > 0f) { + float drawW = imgW * scale; + float drawH = imgH * scale; + float vw = getWidth(); + float vh = getHeight(); + if (drawW > vw) { + panNX = Math.max(0f, Math.min(1f, panNX - (dImgX * scale) / (drawW - vw))); + } + if (drawH > vh) { + panNY = Math.max(0f, Math.min(1f, panNY - (dImgY * scale) / (drawH - vh))); + } + } + } + return; + } + if (mode == AIM_MODE_SAFE) { + int saw = safeWField.getAsInt(screenW); + int sah = safeHField.getAsInt(screenH); + int curX = safeXField.getAsInt(0); + int curY = safeYField.getAsInt(0); + int newX = clamp(curX + dImgX, 0, imgW - saw); + int newY = clamp(curY + dImgY, 0, imgH - sah); + if (newX != curX) { + safeXField.setText("" + newX); + } + if (newY != curY) { + safeYField.setText("" + newY); + } + return; + } + int curX = xField.getAsInt(0); + int curY = yField.getAsInt(0); + int newX = clamp(curX + dImgX, 0, imgW - screenW); + int newY = clamp(curY + dImgY, 0, imgH - screenH); + int actualDx = newX - curX; + int actualDy = newY - curY; + if (actualDx != 0) { + xField.setText("" + newX); + } + if (actualDy != 0) { + yField.setText("" + newY); + } + if (actualDx != 0 || actualDy != 0) { + int saw = safeWField.getAsInt(screenW); + int sah = safeHField.getAsInt(screenH); + int curSafeX = safeXField.getAsInt(curX); + int curSafeY = safeYField.getAsInt(curY); + int newSafeX = clamp(curSafeX + actualDx, 0, imgW - saw); + int newSafeY = clamp(curSafeY + actualDy, 0, imgH - sah); + if (newSafeX != curSafeX) { + safeXField.setText("" + newSafeX); + } + if (newSafeY != curSafeY) { + safeYField.setText("" + newSafeY); + } + } + } + + @Override + public void pointerPressed(int x, int y) { + lastPX = x; + lastPY = y; + } + + @Override + public void pointerReleased(int x, int y) { + lastPX = -1; + lastPY = -1; + } + + @Override + public void pointerDragged(int x, int y) { + if (lastPX < 0 || lastPY < 0) { + lastPX = x; + lastPY = y; + return; + } + int dpx = x - lastPX; + int dpy = y - lastPY; + float scale = currentScale(); + if (scale <= 0f) { + lastPX = x; + lastPY = y; + return; + } + int dImgX = Math.round(dpx / scale); + int dImgY = Math.round(dpy / scale); + if (dImgX == 0 && dImgY == 0) { + return; + } + applyDelta(dImgX, dImgY); + lastPX = x; + lastPY = y; + repaint(); + } + + @Override + public void paint(Graphics g) { + super.paint(g); + float scale = currentScale(); + if (scale <= 0f) { + return; + } + int drawW = Math.max(1, Math.round(imgW * scale)); + int drawH = Math.max(1, Math.round(imgH * scale)); + int drawX = drawOriginX(scale); + int drawY = drawOriginY(scale); + + int[] clip = g.getClip(); + g.pushClip(); + g.clipRect(getX(), getY(), getWidth(), getHeight()); + + g.drawImage(img, drawX, drawY, drawW, drawH); + + int screenImgX = xField.getAsInt(0); + int screenImgY = yField.getAsInt(0); + int safeImgX = safeXField.getAsInt(screenImgX); + int safeImgY = safeYField.getAsInt(screenImgY); + int safeImgW = safeWField.getAsInt(screenW); + int safeImgH = safeHField.getAsInt(screenH); + + int sx = drawX + Math.round(screenImgX * scale); + int sy = drawY + Math.round(screenImgY * scale); + int sw = Math.max(1, Math.round(screenW * scale)); + int sh = Math.max(1, Math.round(screenH * scale)); + int fx = drawX + Math.round(safeImgX * scale); + int fy = drawY + Math.round(safeImgY * scale); + int fw = Math.max(1, Math.round(safeImgW * scale)); + int fh = Math.max(1, Math.round(safeImgH * scale)); + + int oldAlpha = g.getAlpha(); + int oldColor = g.getColor(); + + g.setAlpha(150); + g.setColor(0); + g.fillRect(sx, sy, sw, sh); + + g.setAlpha(80); + int checker = Math.max(4, Math.round(12f * scale)); + for (int yy = sy; yy < sy + sh; yy += checker) { + for (int xx = sx; xx < sx + sw; xx += checker) { + boolean dark = (((xx - sx) / checker) + ((yy - sy) / checker)) % 2 == 0; + g.setColor(dark ? 0x999999 : 0xcccccc); + int cw = Math.min(checker, sx + sw - xx); + int ch = Math.min(checker, sy + sh - yy); + g.fillRect(xx, yy, cw, ch); + } + } + + g.setAlpha(150); + g.setColor(0xff0000); + int safeRight = fx + fw; + int safeBottom = fy + fh; + int screenRight = sx + sw; + int screenBottom = sy + sh; + if (fy > sy) { + g.fillRect(sx, sy, sw, Math.max(0, fy - sy)); + } + if (fx > sx) { + g.fillRect(sx, fy, Math.max(0, fx - sx), Math.max(0, fh)); + } + if (safeRight < screenRight) { + g.fillRect(safeRight, fy, Math.max(0, screenRight - safeRight), Math.max(0, fh)); + } + if (safeBottom < screenBottom) { + g.fillRect(sx, safeBottom, sw, Math.max(0, screenBottom - safeBottom)); + } + + g.setAlpha(255); + g.setColor(mode == AIM_MODE_SCREEN ? 0x2f6bff : 0x00ffff); + g.drawRect(sx, sy, sw, sh); + g.setColor(mode == AIM_MODE_SAFE ? 0xffaa00 : 0xff0000); + g.drawRect(fx, fy, fw, fh); + + g.setAlpha(oldAlpha); + g.setColor(oldColor); + g.popClip(); + g.setClip(clip); } - g.setColor(0xff); - g.drawRect(x, y, w, h); - g.setColor(0xff0000); - g.drawRect(safeX, safeY, safeW, safeH); - g.setAlpha(255); - return mute; } void aimPosition(final Image img, final TextField x, final TextField y, final TextField safeX, final TextField safeY, final TextField safeW, final TextField safeH, final int w, final int h) { @@ -819,115 +1079,46 @@ void aimPosition(final Image img, final TextField x, final TextField y, final Te ToastBar.showErrorMessage("You need to pick a skin image first"); return; } - String originalX = x.getText(); - String originalY = y.getText(); - Form editPosition = new Form("", new BorderLayout()); + final String originalX = x.getText(); + final String originalY = y.getText(); + final String originalSafeX = safeX.getText(); + final String originalSafeY = safeY.getText(); + final Form editPosition = new Form("", new BorderLayout()); editPosition.setUIID("SkinDesignerForm"); Button done = new Button("Done"); styleActionButton(done, FontImage.MATERIAL_CHECK); - done.addActionListener(e -> x.getComponentForm().showBack()); + done.addActionListener(e -> editPosition.showBack()); Button cancel = new Button("Cancel"); styleActionButton(cancel, FontImage.MATERIAL_CANCEL); cancel.addActionListener(e -> { x.setText(originalX); y.setText(originalY); - x.getComponentForm().showBack(); + safeX.setText(originalSafeX); + safeY.setText(originalSafeY); + editPosition.showBack(); }); Container topActions = GridLayout.encloseIn(2, cancel, done); topActions.setUIID("SkinDesignerTabBar"); editPosition.add(BorderLayout.NORTH, topActions); - Image mute = createMute(x.getAsInt(0), y.getAsInt(0), w, h, safeX.getAsInt(x.getAsInt(0)), safeY.getAsInt(y.getAsInt(0)), safeW.getAsInt(w), safeH.getAsInt(h), img); - class oo extends ImageViewer { - private int lastDragX = -1; - private int lastDragY = -1; - - public oo(Image img) { - super(img); - } - @Override - public boolean pinch(float scale) { - return super.pinch(scale); - } - - @Override - public void pointerPressed(int xPos, int yPos) { - super.pointerPressed(xPos, yPos); - lastDragX = xPos; - lastDragY = yPos; - } - - @Override - public void pointerDragged(int xPos, int yPos) { - if(lastDragX < 0 || lastDragY < 0) { - lastDragX = xPos; - lastDragY = yPos; - return; - } - int dx = Math.round((xPos - lastDragX) / getZoom()); - int dy = Math.round((yPos - lastDragY) / getZoom()); - if(dx != 0 || dy != 0) { - int maxX = Math.max(0, img.getWidth() - w); - int maxY = Math.max(0, img.getHeight() - h); - int newX = Math.min(maxX, Math.max(0, x.getAsInt(0) + dx)); - int newY = Math.min(maxY, Math.max(0, y.getAsInt(0) + dy)); - int safeWidthValue = safeW.getAsInt(w); - int safeHeightValue = safeH.getAsInt(h); - int safeMaxX = Math.max(0, img.getWidth() - safeWidthValue); - int safeMaxY = Math.max(0, img.getHeight() - safeHeightValue); - int newSafeX = Math.min(safeMaxX, Math.max(0, safeX.getAsInt(newX) + dx)); - int newSafeY = Math.min(safeMaxY, Math.max(0, safeY.getAsInt(newY) + dy)); - x.setText("" + newX); - y.setText("" + newY); - safeX.setText("" + newSafeX); - safeY.setText("" + newSafeY); - setImageNoReposition(createMute(newX, newY, w, h, newSafeX, newSafeY, safeWidthValue, safeHeightValue, img)); - lastDragX = xPos; - lastDragY = yPos; - } - } - - @Override - public void pointerReleased(int xPos, int yPos) { - super.pointerReleased(xPos, yPos); - lastDragX = -1; - lastDragY = -1; - } + final AimView view = new AimView(img, x, y, safeX, safeY, safeW, safeH, w, h); + + Button modeScreen = new Button("Screen"); + Button modeSafe = new Button("Safe"); + Button modePan = new Button("Pan"); + final Button[] modeButtons = { modeScreen, modeSafe, modePan }; + final int[] modeValues = { AIM_MODE_SCREEN, AIM_MODE_SAFE, AIM_MODE_PAN }; + updateModeButtons(modeButtons, view.getMode()); + for (int i = 0; i < modeButtons.length; i++) { + final int target = modeValues[i]; + modeButtons[i].addActionListener(e -> { + view.setMode(target); + updateModeButtons(modeButtons, target); + view.repaint(); + }); } - final oo overlay = new oo(mute); - ImageViewer iv = new ImageViewer(img) { - @Override - public void pointerDragged(int x, int y) { - super.pointerDragged(x, y); - overlay.pointerDragged(x, y); - } - - @Override - protected boolean pinch(float scale) { - boolean b = super.pinch(scale); - overlay.pinch(scale); - return b; - } - - @Override - public void pointerPressed(int x, int y) { - super.pointerPressed(x, y); - overlay.pointerPressed(x, y); - } - - @Override - public void pointerReleased(int x, int y) { - super.pointerReleased(x, y); - overlay.pointerReleased(x, y); - } - - @Override - public void keyReleased(int key) { - super.keyReleased(key); - overlay.keyReleased(key); - } - }; - overlay.setFocusable(false); + Container modeBar = GridLayout.encloseIn(3, modeScreen, modeSafe, modePan); + modeBar.setUIID("SkinDesignerTabBar"); Button zoomIn = new Button(); Button zoomOut = new Button(); @@ -942,57 +1133,29 @@ public void keyReleased(int key) { FontImage.setMaterialIcon(up, FontImage.MATERIAL_KEYBOARD_ARROW_UP, 3); FontImage.setMaterialIcon(down, FontImage.MATERIAL_KEYBOARD_ARROW_DOWN, 3); - zoomIn.addActionListener(e -> { - iv.setZoom(iv.getZoom() + 1); - overlay.setZoom(iv.getZoom()); - overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, safeX.getAsInt(x.getAsInt(0)), safeY.getAsInt(y.getAsInt(0)), safeW.getAsInt(w), safeH.getAsInt(h), img)); - }); - - zoomOut.addActionListener(e -> { - iv.setZoom(iv.getZoom() - 1); - overlay.setZoom(iv.getZoom()); - overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, safeX.getAsInt(x.getAsInt(0)), safeY.getAsInt(y.getAsInt(0)), safeW.getAsInt(w), safeH.getAsInt(h), img)); - }); - - left.addActionListener(e -> { - int newX = Math.max(0, x.getAsInt(0) - 1); - x.setText("" + newX); - int safeMaxX = Math.max(0, img.getWidth() - safeW.getAsInt(w)); - safeX.setText("" + Math.max(0, Math.min(safeMaxX, safeX.getAsInt(0) - 1))); - overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, safeX.getAsInt(x.getAsInt(0)), safeY.getAsInt(y.getAsInt(0)), safeW.getAsInt(w), safeH.getAsInt(h), img)); - }); - - right.addActionListener(e -> { - int newX = Math.min(Math.max(0, img.getWidth() - w), x.getAsInt(0) + 1); - x.setText("" + newX); - int safeMaxX = Math.max(0, img.getWidth() - safeW.getAsInt(w)); - safeX.setText("" + Math.max(0, Math.min(safeMaxX, safeX.getAsInt(0) + 1))); - overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, safeX.getAsInt(x.getAsInt(0)), safeY.getAsInt(y.getAsInt(0)), safeW.getAsInt(w), safeH.getAsInt(h), img)); - }); - - up.addActionListener(e -> { - int newY = Math.max(0, y.getAsInt(0) - 1); - y.setText("" + newY); - int safeMaxY = Math.max(0, img.getHeight() - safeH.getAsInt(h)); - safeY.setText("" + Math.max(0, Math.min(safeMaxY, safeY.getAsInt(0) - 1))); - overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, safeX.getAsInt(x.getAsInt(0)), safeY.getAsInt(y.getAsInt(0)), safeW.getAsInt(w), safeH.getAsInt(h), img)); - }); - - down.addActionListener(e -> { - int newY = Math.min(Math.max(0, img.getHeight() - h), y.getAsInt(0) + 1); - y.setText("" + newY); - int safeMaxY = Math.max(0, img.getHeight() - safeH.getAsInt(h)); - safeY.setText("" + Math.max(0, Math.min(safeMaxY, safeY.getAsInt(0) + 1))); - overlay.setImageNoReposition(createMute(x.getAsInt(0), y.getAsInt(0), w, h, safeX.getAsInt(x.getAsInt(0)), safeY.getAsInt(y.getAsInt(0)), safeW.getAsInt(w), safeH.getAsInt(h), img)); - }); - - editPosition.add(BorderLayout.CENTER, LayeredLayout.encloseIn(iv, overlay, - BorderLayout.south(GridLayout.encloseIn(6, zoomIn, zoomOut, left, right, up, down)))); + zoomIn.addActionListener(e -> view.zoomIn()); + zoomOut.addActionListener(e -> view.zoomOut()); + left.addActionListener(e -> view.nudge(-1, 0)); + right.addActionListener(e -> view.nudge(1, 0)); + up.addActionListener(e -> view.nudge(0, -1)); + down.addActionListener(e -> view.nudge(0, 1)); + + Container navBar = GridLayout.encloseIn(6, zoomIn, zoomOut, left, right, up, down); + Container south = BoxLayout.encloseY(modeBar, navBar); + editPosition.add(BorderLayout.CENTER, view); + editPosition.add(BorderLayout.SOUTH, south); applyWebsiteTheme(editPosition, websiteDarkMode); - editPosition.show(); } + private void updateModeButtons(Button[] buttons, int selectedMode) { + for (int i = 0; i < buttons.length; i++) { + boolean selected = i == selectedMode; + String base = selected ? "SkinDesignerTabButtonSelected" : "SkinDesignerTabButton"; + buttons[i].setUIID(websiteDarkMode ? base + "Dark" : base); + } + } + private byte[] imageToByteArray(Image img) throws IOException { ByteArrayOutputStream bo = new ByteArrayOutputStream(); ImageIO.getImageIO().save(img, bo, ImageIO.FORMAT_PNG, 1); From b4c37b94fdaf157c56328dfc85af632781d26cdf Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Mon, 20 Apr 2026 16:57:59 +0300 Subject: [PATCH 28/55] Make safe area opt-in and polish aim form controls Add a 'Use Safe Area' toggle on each image card; when off, the safe area fields disable and the save file uses the screen values for safe area. When on, defaults clamp safe area to stay inside the screen and the aim form constrains safe-mode drags to the screen rect. Polish the aim form: style all nav buttons consistently with center alignment, give every control a tooltip, show a ToastBar hint when switching modes (especially Pan), give the form a title, and wire a back command to the cancel action so ESC / system back still exits cleanly even if the Cancel button is tapped through content. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../tools/skindesigner/SkinDesigner.java | 203 +++++++++++++----- 1 file changed, 151 insertions(+), 52 deletions(-) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 897adc387d..0d7e579ea6 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -403,6 +403,7 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid ScaleImageLabel sl = new ScaleImageLabel(img); Button imagePicker = new Button("Select Image"); imagePicker.setUIID("SkinDesignerActionButton"); + imagePicker.setTooltip("Choose a skin image from your gallery"); imagePicker.addActionListener((e) -> { Display.getInstance().openGallery((ee) -> { if(ee != null && ee.getSource() != null) { @@ -490,8 +491,47 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid } } + final OnOffSwitch useSafeArea = new OnOffSwitch(); + useSafeArea.setUIID("SkinDesignerField"); + useSafeArea.setValue(false); + useSafeArea.setTooltip("Enable a separate safe area inside the screen"); + autoSave(useSafeArea, prefix + "UseSafeArea"); + Runnable applySafeEnabled = () -> { + boolean enabled = useSafeArea.isValue(); + safeX.setEnabled(enabled); + safeY.setEnabled(enabled); + safeWidth.setEnabled(enabled); + safeHeight.setEnabled(enabled); + }; + applySafeEnabled.run(); + useSafeArea.addActionListener(e -> { + boolean enabled = useSafeArea.isValue(); + if (enabled) { + int sx = screenPositionX.getAsInt(0); + int sy = screenPositionY.getAsInt(0); + int sw = screenWidthPixels.getAsInt(0); + int sh = screenHeightPixels.getAsInt(0); + int curX = safeX.getAsInt(sx); + int curY = safeY.getAsInt(sy); + int curW = safeWidth.getAsInt(sw); + int curH = safeHeight.getAsInt(sh); + if (curW < 1 || curW > sw) { curW = sw; } + if (curH < 1 || curH > sh) { curH = sh; } + if (curX < sx) { curX = sx; } + if (curY < sy) { curY = sy; } + if (curX + curW > sx + sw) { curX = sx + sw - curW; } + if (curY + curH > sy + sh) { curY = sy + sh - curH; } + safeX.setText("" + curX); + safeY.setText("" + curY); + safeWidth.setText("" + curW); + safeHeight.setText("" + curH); + } + applySafeEnabled.run(); + }); + Button aim = new Button(); styleIconActionButton(aim, FontImage.MATERIAL_PAN_TOOL); + aim.setTooltip("Visually position the screen and safe area"); aim.addActionListener(e -> aimPosition(sl.getIcon(), @@ -502,23 +542,28 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid safeWidth, safeHeight, screenWidthPixels.getAsInt(768), - screenHeightPixels.getAsInt(1024))); + screenHeightPixels.getAsInt(1024), + useSafeArea)); Button helpButton = new Button(); styleIconActionButton(helpButton, FontImage.MATERIAL_HELP); + helpButton.setTooltip("Open help"); helpButton.addActionListener(e -> helpCallback.run()); Button saveButton = new Button(); styleIconActionButton(saveButton, FontImage.MATERIAL_SAVE); + saveButton.setTooltip("Save the skin file"); saveButton.addActionListener(e -> saveCallback.run()); ScaleImageLabel maskLabel = new ScaleImageLabel(); OnOffSwitch useMask = new OnOffSwitch(); useMask.setValue(false); useMask.setUIID("SkinDesignerField"); + useMask.setTooltip("Use the detected mask instead of a simple rectangle"); autoSave(useMask, prefix + "UseMask"); Button detectScreenButton = new Button("Detect Screen by Color"); detectScreenButton.setUIID("SkinDesignerActionButton"); + detectScreenButton.setTooltip("Auto-detect the screen area via flood-fill from the center pixel"); detectScreenButton.addActionListener(e -> { Image source = sl.getIcon(); if(source == null) { @@ -554,11 +599,13 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid Container actionButtons = FlowLayout.encloseCenter(aim, helpButton, saveButton); Container detectionButtons = FlowLayout.encloseCenter(detectScreenButton, floodTolerance, useMask); + Container safeAreaHeader = BorderLayout.center(labeledFieldTitle("Safe Area (X/Y/Width/Height)")) + .add(BorderLayout.EAST, useSafeArea); Container controls = BoxLayout.encloseY( imagePicker, labeledFieldTitle("Screen Position (X/Y/Width/Height)"), GridLayout.encloseIn(4, screenPositionX, screenPositionY, screenWidthPixels, screenHeightPixels), - labeledFieldTitle("Safe Area (X/Y/Width/Height)"), + safeAreaHeader, GridLayout.encloseIn(4, safeX, safeY, safeWidth, safeHeight), labeledFieldTitle("Screen Mask Detection"), detectionButtons, @@ -659,22 +706,22 @@ public int getScreenHeight() { @Override public int getSafeX() { - return safeX.getAsInt(getScreenX()); + return useSafeArea.isValue() ? safeX.getAsInt(getScreenX()) : getScreenX(); } @Override public int getSafeY() { - return safeY.getAsInt(getScreenY()); + return useSafeArea.isValue() ? safeY.getAsInt(getScreenY()) : getScreenY(); } @Override public int getSafeWidth() { - return safeWidth.getAsInt(getScreenWidth()); + return useSafeArea.isValue() ? safeWidth.getAsInt(getScreenWidth()) : getScreenWidth(); } @Override public int getSafeHeight() { - return safeHeight.getAsInt(getScreenHeight()); + return useSafeArea.isValue() ? safeHeight.getAsInt(getScreenHeight()) : getScreenHeight(); } }; } @@ -788,6 +835,7 @@ final class AimView extends Component { private final TextField safeYField; private final TextField safeWField; private final TextField safeHField; + private final OnOffSwitch useSafeArea; private int mode = AIM_MODE_SCREEN; private float zoomMul = 1f; private float panNX = 0.5f; @@ -796,7 +844,7 @@ final class AimView extends Component { private int lastPY = -1; AimView(Image img, TextField xField, TextField yField, TextField safeXField, TextField safeYField, - TextField safeWField, TextField safeHField, int screenW, int screenH) { + TextField safeWField, TextField safeHField, int screenW, int screenH, OnOffSwitch useSafeArea) { this.img = img; this.imgW = img.getWidth(); this.imgH = img.getHeight(); @@ -808,10 +856,15 @@ final class AimView extends Component { this.safeHField = safeHField; this.screenW = screenW; this.screenH = screenH; + this.useSafeArea = useSafeArea; setUIID("SkinDesignerCard"); setFocusable(true); } + boolean isSafeAreaEnabled() { + return useSafeArea != null && useSafeArea.isValue(); + } + void setMode(int mode) { this.mode = mode; } @@ -909,12 +962,17 @@ private void applyDelta(int dImgX, int dImgY) { return; } if (mode == AIM_MODE_SAFE) { - int saw = safeWField.getAsInt(screenW); - int sah = safeHField.getAsInt(screenH); - int curX = safeXField.getAsInt(0); - int curY = safeYField.getAsInt(0); - int newX = clamp(curX + dImgX, 0, imgW - saw); - int newY = clamp(curY + dImgY, 0, imgH - sah); + if (!isSafeAreaEnabled()) { + return; + } + int sx = xField.getAsInt(0); + int sy = yField.getAsInt(0); + int saw = Math.min(safeWField.getAsInt(screenW), screenW); + int sah = Math.min(safeHField.getAsInt(screenH), screenH); + int curX = safeXField.getAsInt(sx); + int curY = safeYField.getAsInt(sy); + int newX = clamp(curX + dImgX, sx, sx + screenW - saw); + int newY = clamp(curY + dImgY, sy, sy + screenH - sah); if (newX != curX) { safeXField.setText("" + newX); } @@ -935,13 +993,13 @@ private void applyDelta(int dImgX, int dImgY) { if (actualDy != 0) { yField.setText("" + newY); } - if (actualDx != 0 || actualDy != 0) { - int saw = safeWField.getAsInt(screenW); - int sah = safeHField.getAsInt(screenH); + if ((actualDx != 0 || actualDy != 0) && isSafeAreaEnabled()) { + int saw = Math.min(safeWField.getAsInt(screenW), screenW); + int sah = Math.min(safeHField.getAsInt(screenH), screenH); int curSafeX = safeXField.getAsInt(curX); int curSafeY = safeYField.getAsInt(curY); - int newSafeX = clamp(curSafeX + actualDx, 0, imgW - saw); - int newSafeY = clamp(curSafeY + actualDy, 0, imgH - sah); + int newSafeX = clamp(curSafeX + actualDx, newX, newX + screenW - saw); + int newSafeY = clamp(curSafeY + actualDy, newY, newY + screenH - sah); if (newSafeX != curSafeX) { safeXField.setText("" + newSafeX); } @@ -1009,10 +1067,11 @@ public void paint(Graphics g) { int screenImgX = xField.getAsInt(0); int screenImgY = yField.getAsInt(0); - int safeImgX = safeXField.getAsInt(screenImgX); - int safeImgY = safeYField.getAsInt(screenImgY); - int safeImgW = safeWField.getAsInt(screenW); - int safeImgH = safeHField.getAsInt(screenH); + boolean safeOn = isSafeAreaEnabled(); + int safeImgX = safeOn ? safeXField.getAsInt(screenImgX) : screenImgX; + int safeImgY = safeOn ? safeYField.getAsInt(screenImgY) : screenImgY; + int safeImgW = safeOn ? safeWField.getAsInt(screenW) : screenW; + int safeImgH = safeOn ? safeHField.getAsInt(screenH) : screenH; int sx = drawX + Math.round(screenImgX * scale); int sy = drawY + Math.round(screenImgY * scale); @@ -1042,30 +1101,34 @@ public void paint(Graphics g) { } } - g.setAlpha(150); - g.setColor(0xff0000); - int safeRight = fx + fw; - int safeBottom = fy + fh; - int screenRight = sx + sw; - int screenBottom = sy + sh; - if (fy > sy) { - g.fillRect(sx, sy, sw, Math.max(0, fy - sy)); - } - if (fx > sx) { - g.fillRect(sx, fy, Math.max(0, fx - sx), Math.max(0, fh)); - } - if (safeRight < screenRight) { - g.fillRect(safeRight, fy, Math.max(0, screenRight - safeRight), Math.max(0, fh)); - } - if (safeBottom < screenBottom) { - g.fillRect(sx, safeBottom, sw, Math.max(0, screenBottom - safeBottom)); + if (safeOn) { + g.setAlpha(150); + g.setColor(0xff0000); + int safeRight = fx + fw; + int safeBottom = fy + fh; + int screenRight = sx + sw; + int screenBottom = sy + sh; + if (fy > sy) { + g.fillRect(sx, sy, sw, Math.max(0, fy - sy)); + } + if (fx > sx) { + g.fillRect(sx, fy, Math.max(0, fx - sx), Math.max(0, fh)); + } + if (safeRight < screenRight) { + g.fillRect(safeRight, fy, Math.max(0, screenRight - safeRight), Math.max(0, fh)); + } + if (safeBottom < screenBottom) { + g.fillRect(sx, safeBottom, sw, Math.max(0, screenBottom - safeBottom)); + } } g.setAlpha(255); g.setColor(mode == AIM_MODE_SCREEN ? 0x2f6bff : 0x00ffff); g.drawRect(sx, sy, sw, sh); - g.setColor(mode == AIM_MODE_SAFE ? 0xffaa00 : 0xff0000); - g.drawRect(fx, fy, fw, fh); + if (safeOn) { + g.setColor(mode == AIM_MODE_SAFE ? 0xffaa00 : 0xff0000); + g.drawRect(fx, fy, fw, fh); + } g.setAlpha(oldAlpha); g.setColor(oldColor); @@ -1074,7 +1137,7 @@ public void paint(Graphics g) { } } - void aimPosition(final Image img, final TextField x, final TextField y, final TextField safeX, final TextField safeY, final TextField safeW, final TextField safeH, final int w, final int h) { + void aimPosition(final Image img, final TextField x, final TextField y, final TextField safeX, final TextField safeY, final TextField safeW, final TextField safeH, final int w, final int h, final OnOffSwitch useSafeArea) { if(img == null) { ToastBar.showErrorMessage("You need to pick a skin image first"); return; @@ -1083,29 +1146,49 @@ void aimPosition(final Image img, final TextField x, final TextField y, final Te final String originalY = y.getText(); final String originalSafeX = safeX.getText(); final String originalSafeY = safeY.getText(); - final Form editPosition = new Form("", new BorderLayout()); + final Form editPosition = new Form("Positioning", new BorderLayout()); editPosition.setUIID("SkinDesignerForm"); + + final AimView view = new AimView(img, x, y, safeX, safeY, safeW, safeH, w, h, useSafeArea); + Button done = new Button("Done"); styleActionButton(done, FontImage.MATERIAL_CHECK); + done.setTooltip("Keep changes and return"); done.addActionListener(e -> editPosition.showBack()); Button cancel = new Button("Cancel"); styleActionButton(cancel, FontImage.MATERIAL_CANCEL); - cancel.addActionListener(e -> { + cancel.setTooltip("Discard changes and return"); + Runnable cancelAction = () -> { x.setText(originalX); y.setText(originalY); safeX.setText(originalSafeX); safeY.setText(originalSafeY); editPosition.showBack(); + }; + cancel.addActionListener(e -> cancelAction.run()); + editPosition.setBackCommand(new com.codename1.ui.Command("Cancel") { + @Override + public void actionPerformed(com.codename1.ui.events.ActionEvent evt) { + cancelAction.run(); + } }); + Container topActions = GridLayout.encloseIn(2, cancel, done); topActions.setUIID("SkinDesignerTabBar"); editPosition.add(BorderLayout.NORTH, topActions); - final AimView view = new AimView(img, x, y, safeX, safeY, safeW, safeH, w, h); - + final boolean safeEnabled = useSafeArea != null && useSafeArea.isValue(); Button modeScreen = new Button("Screen"); Button modeSafe = new Button("Safe"); Button modePan = new Button("Pan"); + modeScreen.setTooltip("Drag to reposition the screen area"); + modeSafe.setTooltip(safeEnabled + ? "Drag to adjust the safe area within the screen" + : "Enable 'Use Safe Area' on the previous screen to edit safe area"); + modePan.setTooltip("Drag to scroll the zoomed view"); + if (!safeEnabled) { + modeSafe.setEnabled(false); + } final Button[] modeButtons = { modeScreen, modeSafe, modePan }; final int[] modeValues = { AIM_MODE_SCREEN, AIM_MODE_SAFE, AIM_MODE_PAN }; updateModeButtons(modeButtons, view.getMode()); @@ -1114,6 +1197,16 @@ void aimPosition(final Image img, final TextField x, final TextField y, final Te modeButtons[i].addActionListener(e -> { view.setMode(target); updateModeButtons(modeButtons, target); + if (target == AIM_MODE_PAN) { + ToastBar.showMessage("Pan mode: zoom in and drag to scroll the view", + FontImage.MATERIAL_PAN_TOOL, 2500); + } else if (target == AIM_MODE_SAFE) { + ToastBar.showMessage("Safe mode: drag to adjust the safe area inside the screen", + FontImage.MATERIAL_CROP_FREE, 2500); + } else if (target == AIM_MODE_SCREEN) { + ToastBar.showMessage("Screen mode: drag to reposition the screen area", + FontImage.MATERIAL_STAY_CURRENT_PORTRAIT, 2000); + } view.repaint(); }); } @@ -1126,12 +1219,18 @@ void aimPosition(final Image img, final TextField x, final TextField y, final Te Button right = new Button(); Button up = new Button(); Button down = new Button(); - FontImage.setMaterialIcon(zoomIn, FontImage.MATERIAL_ZOOM_IN, 3); - FontImage.setMaterialIcon(zoomOut, FontImage.MATERIAL_ZOOM_OUT, 3); - FontImage.setMaterialIcon(left, FontImage.MATERIAL_KEYBOARD_ARROW_LEFT, 3); - FontImage.setMaterialIcon(right, FontImage.MATERIAL_KEYBOARD_ARROW_RIGHT, 3); - FontImage.setMaterialIcon(up, FontImage.MATERIAL_KEYBOARD_ARROW_UP, 3); - FontImage.setMaterialIcon(down, FontImage.MATERIAL_KEYBOARD_ARROW_DOWN, 3); + styleIconActionButton(zoomIn, FontImage.MATERIAL_ZOOM_IN); + styleIconActionButton(zoomOut, FontImage.MATERIAL_ZOOM_OUT); + styleIconActionButton(left, FontImage.MATERIAL_KEYBOARD_ARROW_LEFT); + styleIconActionButton(right, FontImage.MATERIAL_KEYBOARD_ARROW_RIGHT); + styleIconActionButton(up, FontImage.MATERIAL_KEYBOARD_ARROW_UP); + styleIconActionButton(down, FontImage.MATERIAL_KEYBOARD_ARROW_DOWN); + zoomIn.setTooltip("Zoom in"); + zoomOut.setTooltip("Zoom out"); + left.setTooltip("Nudge left (1 px)"); + right.setTooltip("Nudge right (1 px)"); + up.setTooltip("Nudge up (1 px)"); + down.setTooltip("Nudge down (1 px)"); zoomIn.addActionListener(e -> view.zoomIn()); zoomOut.addActionListener(e -> view.zoomOut()); From 3ed9338f49ac5ac14cc0d45da719f1dc6deb5bc0 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Mon, 20 Apr 2026 21:19:48 +0300 Subject: [PATCH 29/55] Fix aim form navigation, drop Pan, allow numeric + resize edits - Save the calling form on entry and call previousForm.showBack() on Done/Cancel. Form.showBack() re-shows the form it is called on, so calling it on the aim form was a no-op; that is why Done and Cancel appeared unresponsive. - Remove the Pan mode button and constant. Zoom in/out now auto-center the view on the currently active rectangle, which covers the use case Pan mode was supposed to address. - Add mirrored X / Y / W / H TextFields inside the aim form for both screen and safe area. Edits commit to the main form fields and the view repaints; drags/nudges propagate back into the mirror fields. - Add drag-to-resize on the safe area: press near an edge or corner to resize, press in the interior to move. Draw small handles at the corners and edge midpoints when Safe mode is active. - Show a single entry ToastBar when the aim form opens that explains how to drag, resize, and enter numeric values. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../tools/skindesigner/SkinDesigner.java | 439 +++++++++++++----- 1 file changed, 313 insertions(+), 126 deletions(-) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 0d7e579ea6..c3137e1241 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -537,12 +537,12 @@ private ImageSettings createImageSettings(String imageFile, String prefix, Valid aimPosition(sl.getIcon(), screenPositionX, screenPositionY, + screenWidthPixels, + screenHeightPixels, safeX, safeY, safeWidth, safeHeight, - screenWidthPixels.getAsInt(768), - screenHeightPixels.getAsInt(1024), useSafeArea)); Button helpButton = new Button(); @@ -821,46 +821,76 @@ private void showHelpForm(Form backForm) { static final int AIM_MODE_SCREEN = 0; static final int AIM_MODE_SAFE = 1; - static final int AIM_MODE_PAN = 2; + + static final int DRAG_NONE = 0; + static final int DRAG_MOVE = 1; + static final int DRAG_N = 1 << 1; + static final int DRAG_S = 1 << 2; + static final int DRAG_W = 1 << 3; + static final int DRAG_E = 1 << 4; + static final int MIN_SAFE_SIZE = 10; final class AimView extends Component { private final Image img; private final int imgW; private final int imgH; - private final int screenW; - private final int screenH; private final TextField xField; private final TextField yField; + private final TextField screenWField; + private final TextField screenHField; private final TextField safeXField; private final TextField safeYField; private final TextField safeWField; private final TextField safeHField; private final OnOffSwitch useSafeArea; + private Runnable onChange; private int mode = AIM_MODE_SCREEN; private float zoomMul = 1f; private float panNX = 0.5f; private float panNY = 0.5f; private int lastPX = -1; private int lastPY = -1; + private int dragOp = DRAG_NONE; - AimView(Image img, TextField xField, TextField yField, TextField safeXField, TextField safeYField, - TextField safeWField, TextField safeHField, int screenW, int screenH, OnOffSwitch useSafeArea) { + AimView(Image img, TextField xField, TextField yField, + TextField screenWField, TextField screenHField, + TextField safeXField, TextField safeYField, + TextField safeWField, TextField safeHField, + OnOffSwitch useSafeArea) { this.img = img; this.imgW = img.getWidth(); this.imgH = img.getHeight(); this.xField = xField; this.yField = yField; + this.screenWField = screenWField; + this.screenHField = screenHField; this.safeXField = safeXField; this.safeYField = safeYField; this.safeWField = safeWField; this.safeHField = safeHField; - this.screenW = screenW; - this.screenH = screenH; this.useSafeArea = useSafeArea; setUIID("SkinDesignerCard"); setFocusable(true); } + void setOnChange(Runnable onChange) { + this.onChange = onChange; + } + + private void notifyChanged() { + if (onChange != null) { + onChange.run(); + } + } + + int screenW() { + return Math.max(1, screenWField.getAsInt(1)); + } + + int screenH() { + return Math.max(1, screenHField.getAsInt(1)); + } + boolean isSafeAreaEnabled() { return useSafeArea != null && useSafeArea.isValue(); } @@ -877,6 +907,7 @@ void zoomIn() { float nz = Math.min(8f, zoomMul * 1.5f); if (nz != zoomMul) { zoomMul = nz; + centerOnActiveRect(); repaint(); } } @@ -888,13 +919,35 @@ void zoomOut() { if (zoomMul <= 1f) { panNX = 0.5f; panNY = 0.5f; + } else { + centerOnActiveRect(); } repaint(); } } + private void centerOnActiveRect() { + int cx, cy; + if (mode == AIM_MODE_SAFE && isSafeAreaEnabled()) { + cx = safeXField.getAsInt(0) + safeWField.getAsInt(screenW()) / 2; + cy = safeYField.getAsInt(0) + safeHField.getAsInt(screenH()) / 2; + } else { + cx = xField.getAsInt(0) + screenW() / 2; + cy = yField.getAsInt(0) + screenH() / 2; + } + if (imgW > 0) { + panNX = Math.max(0f, Math.min(1f, ((float) cx) / imgW)); + } + if (imgH > 0) { + panNY = Math.max(0f, Math.min(1f, ((float) cy) / imgH)); + } + } + void nudge(int dx, int dy) { + int savedOp = dragOp; + dragOp = DRAG_MOVE; applyDelta(dx, dy); + dragOp = savedOp; repaint(); } @@ -940,85 +993,133 @@ private int clamp(int v, int lo, int hi) { } private void applyDelta(int dImgX, int dImgY) { - if (dImgX == 0 && dImgY == 0) { - return; - } - if (mode == AIM_MODE_PAN) { - if (zoomMul > 1f) { - float scale = currentScale(); - if (scale > 0f) { - float drawW = imgW * scale; - float drawH = imgH * scale; - float vw = getWidth(); - float vh = getHeight(); - if (drawW > vw) { - panNX = Math.max(0f, Math.min(1f, panNX - (dImgX * scale) / (drawW - vw))); - } - if (drawH > vh) { - panNY = Math.max(0f, Math.min(1f, panNY - (dImgY * scale) / (drawH - vh))); - } - } - } + if (dImgX == 0 && dImgY == 0 || dragOp == DRAG_NONE) { return; } + int sW = screenW(); + int sH = screenH(); if (mode == AIM_MODE_SAFE) { if (!isSafeAreaEnabled()) { return; } - int sx = xField.getAsInt(0); - int sy = yField.getAsInt(0); - int saw = Math.min(safeWField.getAsInt(screenW), screenW); - int sah = Math.min(safeHField.getAsInt(screenH), screenH); - int curX = safeXField.getAsInt(sx); - int curY = safeYField.getAsInt(sy); - int newX = clamp(curX + dImgX, sx, sx + screenW - saw); - int newY = clamp(curY + dImgY, sy, sy + screenH - sah); - if (newX != curX) { - safeXField.setText("" + newX); - } - if (newY != curY) { - safeYField.setText("" + newY); - } + int boundsX = xField.getAsInt(0); + int boundsY = yField.getAsInt(0); + int boundsW = sW; + int boundsH = sH; + int curX = safeXField.getAsInt(boundsX); + int curY = safeYField.getAsInt(boundsY); + int curW = Math.min(safeWField.getAsInt(boundsW), boundsW); + int curH = Math.min(safeHField.getAsInt(boundsH), boundsH); + int[] rect = applyResize(curX, curY, curW, curH, dImgX, dImgY, + boundsX, boundsY, boundsW, boundsH); + boolean changed = false; + if (rect[0] != curX) { safeXField.setText("" + rect[0]); changed = true; } + if (rect[1] != curY) { safeYField.setText("" + rect[1]); changed = true; } + if (rect[2] != curW) { safeWField.setText("" + rect[2]); changed = true; } + if (rect[3] != curH) { safeHField.setText("" + rect[3]); changed = true; } + if (changed) { notifyChanged(); } return; } int curX = xField.getAsInt(0); int curY = yField.getAsInt(0); - int newX = clamp(curX + dImgX, 0, imgW - screenW); - int newY = clamp(curY + dImgY, 0, imgH - screenH); + int newX = clamp(curX + dImgX, 0, imgW - sW); + int newY = clamp(curY + dImgY, 0, imgH - sH); int actualDx = newX - curX; int actualDy = newY - curY; - if (actualDx != 0) { - xField.setText("" + newX); - } - if (actualDy != 0) { - yField.setText("" + newY); - } + boolean changed = false; + if (actualDx != 0) { xField.setText("" + newX); changed = true; } + if (actualDy != 0) { yField.setText("" + newY); changed = true; } if ((actualDx != 0 || actualDy != 0) && isSafeAreaEnabled()) { - int saw = Math.min(safeWField.getAsInt(screenW), screenW); - int sah = Math.min(safeHField.getAsInt(screenH), screenH); + int saw = Math.min(safeWField.getAsInt(sW), sW); + int sah = Math.min(safeHField.getAsInt(sH), sH); int curSafeX = safeXField.getAsInt(curX); int curSafeY = safeYField.getAsInt(curY); - int newSafeX = clamp(curSafeX + actualDx, newX, newX + screenW - saw); - int newSafeY = clamp(curSafeY + actualDy, newY, newY + screenH - sah); - if (newSafeX != curSafeX) { - safeXField.setText("" + newSafeX); - } - if (newSafeY != curSafeY) { - safeYField.setText("" + newSafeY); - } + int newSafeX = clamp(curSafeX + actualDx, newX, newX + sW - saw); + int newSafeY = clamp(curSafeY + actualDy, newY, newY + sH - sah); + if (newSafeX != curSafeX) { safeXField.setText("" + newSafeX); changed = true; } + if (newSafeY != curSafeY) { safeYField.setText("" + newSafeY); changed = true; } + } + if (changed) { notifyChanged(); } + } + + private int[] applyResize(int curX, int curY, int curW, int curH, int dx, int dy, + int boundsX, int boundsY, int boundsW, int boundsH) { + boolean moveLeft = (dragOp & DRAG_W) != 0 || dragOp == DRAG_MOVE; + boolean moveRight = (dragOp & DRAG_E) != 0 || dragOp == DRAG_MOVE; + boolean moveTop = (dragOp & DRAG_N) != 0 || dragOp == DRAG_MOVE; + boolean moveBottom = (dragOp & DRAG_S) != 0 || dragOp == DRAG_MOVE; + int left = curX; + int right = curX + curW; + int top = curY; + int bottom = curY + curH; + if (moveLeft) { left += dx; } + if (moveRight) { right += dx; } + if (moveTop) { top += dy; } + if (moveBottom) { bottom += dy; } + int minX = boundsX; + int minY = boundsY; + int maxX = boundsX + boundsW; + int maxY = boundsY + boundsH; + if (left < minX) { left = minX; if (moveLeft && !moveRight && right < left + MIN_SAFE_SIZE) right = left + MIN_SAFE_SIZE; } + if (right > maxX) { right = maxX; if (moveRight && !moveLeft && left > right - MIN_SAFE_SIZE) left = right - MIN_SAFE_SIZE; } + if (top < minY) { top = minY; if (moveTop && !moveBottom && bottom < top + MIN_SAFE_SIZE) bottom = top + MIN_SAFE_SIZE; } + if (bottom > maxY) { bottom = maxY; if (moveBottom && !moveTop && top > bottom - MIN_SAFE_SIZE) top = bottom - MIN_SAFE_SIZE; } + if (right - left < MIN_SAFE_SIZE) { + if (moveLeft && !moveRight) { left = right - MIN_SAFE_SIZE; } + else if (moveRight && !moveLeft) { right = left + MIN_SAFE_SIZE; } + } + if (bottom - top < MIN_SAFE_SIZE) { + if (moveTop && !moveBottom) { top = bottom - MIN_SAFE_SIZE; } + else if (moveBottom && !moveTop) { bottom = top + MIN_SAFE_SIZE; } } + if (dragOp == DRAG_MOVE) { + int w = right - left; + int h = bottom - top; + left = clamp(left, minX, maxX - w); + top = clamp(top, minY, maxY - h); + right = left + w; + bottom = top + h; + } + return new int[] { left, top, right - left, bottom - top }; } @Override public void pointerPressed(int x, int y) { lastPX = x; lastPY = y; + dragOp = hitTestDragOp(x, y); } @Override public void pointerReleased(int x, int y) { lastPX = -1; lastPY = -1; + dragOp = DRAG_NONE; + } + + private int hitTestDragOp(int px, int py) { + if (mode == AIM_MODE_SAFE && isSafeAreaEnabled()) { + float scale = currentScale(); + if (scale <= 0f) { return DRAG_MOVE; } + int drawX = drawOriginX(scale); + int drawY = drawOriginY(scale); + int sX = drawX + Math.round(safeXField.getAsInt(0) * scale); + int sY = drawY + Math.round(safeYField.getAsInt(0) * scale); + int sW = Math.max(1, Math.round(safeWField.getAsInt(screenW()) * scale)); + int sH = Math.max(1, Math.round(safeHField.getAsInt(screenH()) * scale)); + int zone = Math.max(8, Display.getInstance().convertToPixels(2.5f)); + boolean nearLeft = px >= sX - zone && px <= sX + zone; + boolean nearRight = px >= sX + sW - zone && px <= sX + sW + zone; + boolean nearTop = py >= sY - zone && py <= sY + zone; + boolean nearBottom = py >= sY + sH - zone && py <= sY + sH + zone; + int op = 0; + if (nearLeft) { op |= DRAG_W; } + if (nearRight) { op |= DRAG_E; } + if (nearTop) { op |= DRAG_N; } + if (nearBottom) { op |= DRAG_S; } + if (op != 0) { return op; } + } + return DRAG_MOVE; } @Override @@ -1065,18 +1166,20 @@ public void paint(Graphics g) { g.drawImage(img, drawX, drawY, drawW, drawH); + int sW = screenW(); + int sH = screenH(); int screenImgX = xField.getAsInt(0); int screenImgY = yField.getAsInt(0); boolean safeOn = isSafeAreaEnabled(); int safeImgX = safeOn ? safeXField.getAsInt(screenImgX) : screenImgX; int safeImgY = safeOn ? safeYField.getAsInt(screenImgY) : screenImgY; - int safeImgW = safeOn ? safeWField.getAsInt(screenW) : screenW; - int safeImgH = safeOn ? safeHField.getAsInt(screenH) : screenH; + int safeImgW = safeOn ? safeWField.getAsInt(sW) : sW; + int safeImgH = safeOn ? safeHField.getAsInt(sH) : sH; int sx = drawX + Math.round(screenImgX * scale); int sy = drawY + Math.round(screenImgY * scale); - int sw = Math.max(1, Math.round(screenW * scale)); - int sh = Math.max(1, Math.round(screenH * scale)); + int sw = Math.max(1, Math.round(sW * scale)); + int sh = Math.max(1, Math.round(sH * scale)); int fx = drawX + Math.round(safeImgX * scale); int fy = drawY + Math.round(safeImgY * scale); int fw = Math.max(1, Math.round(safeImgW * scale)); @@ -1128,6 +1231,18 @@ public void paint(Graphics g) { if (safeOn) { g.setColor(mode == AIM_MODE_SAFE ? 0xffaa00 : 0xff0000); g.drawRect(fx, fy, fw, fh); + if (mode == AIM_MODE_SAFE) { + int handle = Math.max(6, Display.getInstance().convertToPixels(2f)); + int half = handle / 2; + g.fillRect(fx - half, fy - half, handle, handle); + g.fillRect(fx + fw - half, fy - half, handle, handle); + g.fillRect(fx - half, fy + fh - half, handle, handle); + g.fillRect(fx + fw - half, fy + fh - half, handle, handle); + g.fillRect(fx + fw / 2 - half, fy - half, handle, handle); + g.fillRect(fx + fw / 2 - half, fy + fh - half, handle, handle); + g.fillRect(fx - half, fy + fh / 2 - half, handle, handle); + g.fillRect(fx + fw - half, fy + fh / 2 - half, handle, handle); + } } g.setAlpha(oldAlpha); @@ -1137,33 +1252,84 @@ public void paint(Graphics g) { } } - void aimPosition(final Image img, final TextField x, final TextField y, final TextField safeX, final TextField safeY, final TextField safeW, final TextField safeH, final int w, final int h, final OnOffSwitch useSafeArea) { + void aimPosition(final Image img, + final TextField screenX, final TextField screenY, + final TextField screenW, final TextField screenH, + final TextField safeX, final TextField safeY, + final TextField safeW, final TextField safeH, + final OnOffSwitch useSafeArea) { if(img == null) { ToastBar.showErrorMessage("You need to pick a skin image first"); return; } - final String originalX = x.getText(); - final String originalY = y.getText(); - final String originalSafeX = safeX.getText(); - final String originalSafeY = safeY.getText(); + final Form previousForm = Display.getInstance().getCurrent(); + final boolean safeEnabled = useSafeArea != null && useSafeArea.isValue(); final Form editPosition = new Form("Positioning", new BorderLayout()); editPosition.setUIID("SkinDesignerForm"); - final AimView view = new AimView(img, x, y, safeX, safeY, safeW, safeH, w, h, useSafeArea); + final AimView view = new AimView(img, screenX, screenY, screenW, screenH, + safeX, safeY, safeW, safeH, useSafeArea); + + final TextField aimScreenX = numericMirror(screenX); + final TextField aimScreenY = numericMirror(screenY); + final TextField aimScreenW = numericMirror(screenW); + final TextField aimScreenH = numericMirror(screenH); + final TextField aimSafeX = numericMirror(safeX); + final TextField aimSafeY = numericMirror(safeY); + final TextField aimSafeW = numericMirror(safeW); + final TextField aimSafeH = numericMirror(safeH); + if (!safeEnabled) { + aimSafeX.setEnabled(false); + aimSafeY.setEnabled(false); + aimSafeW.setEnabled(false); + aimSafeH.setEnabled(false); + } + Runnable refreshAimFields = () -> { + syncMirror(aimScreenX, screenX); + syncMirror(aimScreenY, screenY); + syncMirror(aimScreenW, screenW); + syncMirror(aimScreenH, screenH); + syncMirror(aimSafeX, safeX); + syncMirror(aimSafeY, safeY); + syncMirror(aimSafeW, safeW); + syncMirror(aimSafeH, safeH); + }; + view.setOnChange(refreshAimFields); + bindAimToMain(aimScreenX, screenX, view); + bindAimToMain(aimScreenY, screenY, view); + bindAimToMain(aimScreenW, screenW, view); + bindAimToMain(aimScreenH, screenH, view); + bindAimToMain(aimSafeX, safeX, view); + bindAimToMain(aimSafeY, safeY, view); + bindAimToMain(aimSafeW, safeW, view); + bindAimToMain(aimSafeH, safeH, view); + + final String originalScreenX = screenX.getText(); + final String originalScreenY = screenY.getText(); + final String originalScreenW = screenW.getText(); + final String originalScreenH = screenH.getText(); + final String originalSafeX = safeX.getText(); + final String originalSafeY = safeY.getText(); + final String originalSafeW = safeW.getText(); + final String originalSafeH = safeH.getText(); Button done = new Button("Done"); styleActionButton(done, FontImage.MATERIAL_CHECK); done.setTooltip("Keep changes and return"); - done.addActionListener(e -> editPosition.showBack()); + done.addActionListener(e -> previousForm.showBack()); Button cancel = new Button("Cancel"); styleActionButton(cancel, FontImage.MATERIAL_CANCEL); cancel.setTooltip("Discard changes and return"); Runnable cancelAction = () -> { - x.setText(originalX); - y.setText(originalY); + screenX.setText(originalScreenX); + screenY.setText(originalScreenY); + screenW.setText(originalScreenW); + screenH.setText(originalScreenH); safeX.setText(originalSafeX); safeY.setText(originalSafeY); - editPosition.showBack(); + safeW.setText(originalSafeW); + safeH.setText(originalSafeH); + previousForm.showBack(); }; cancel.addActionListener(e -> cancelAction.run()); editPosition.setBackCommand(new com.codename1.ui.Command("Cancel") { @@ -1177,74 +1343,95 @@ public void actionPerformed(com.codename1.ui.events.ActionEvent evt) { topActions.setUIID("SkinDesignerTabBar"); editPosition.add(BorderLayout.NORTH, topActions); - final boolean safeEnabled = useSafeArea != null && useSafeArea.isValue(); - Button modeScreen = new Button("Screen"); - Button modeSafe = new Button("Safe"); - Button modePan = new Button("Pan"); - modeScreen.setTooltip("Drag to reposition the screen area"); - modeSafe.setTooltip(safeEnabled - ? "Drag to adjust the safe area within the screen" - : "Enable 'Use Safe Area' on the previous screen to edit safe area"); - modePan.setTooltip("Drag to scroll the zoomed view"); - if (!safeEnabled) { - modeSafe.setEnabled(false); + Container south = new Container(new BoxLayout(BoxLayout.Y_AXIS)); + if (safeEnabled) { + Button modeScreen = new Button("Screen"); + Button modeSafe = new Button("Safe"); + modeScreen.setTooltip("Drag to reposition the screen area"); + modeSafe.setTooltip("Drag inside to move the safe area; drag its edges or corners to resize"); + final Button[] modeButtons = { modeScreen, modeSafe }; + final int[] modeValues = { AIM_MODE_SCREEN, AIM_MODE_SAFE }; + updateModeButtons(modeButtons, view.getMode()); + for (int i = 0; i < modeButtons.length; i++) { + final int target = modeValues[i]; + modeButtons[i].addActionListener(e -> { + view.setMode(target); + updateModeButtons(modeButtons, target); + view.repaint(); + }); + } + Container modeBar = GridLayout.encloseIn(2, modeScreen, modeSafe); + modeBar.setUIID("SkinDesignerTabBar"); + south.add(modeBar); } - final Button[] modeButtons = { modeScreen, modeSafe, modePan }; - final int[] modeValues = { AIM_MODE_SCREEN, AIM_MODE_SAFE, AIM_MODE_PAN }; - updateModeButtons(modeButtons, view.getMode()); - for (int i = 0; i < modeButtons.length; i++) { - final int target = modeValues[i]; - modeButtons[i].addActionListener(e -> { - view.setMode(target); - updateModeButtons(modeButtons, target); - if (target == AIM_MODE_PAN) { - ToastBar.showMessage("Pan mode: zoom in and drag to scroll the view", - FontImage.MATERIAL_PAN_TOOL, 2500); - } else if (target == AIM_MODE_SAFE) { - ToastBar.showMessage("Safe mode: drag to adjust the safe area inside the screen", - FontImage.MATERIAL_CROP_FREE, 2500); - } else if (target == AIM_MODE_SCREEN) { - ToastBar.showMessage("Screen mode: drag to reposition the screen area", - FontImage.MATERIAL_STAY_CURRENT_PORTRAIT, 2000); - } - view.repaint(); - }); + + south.add(labeledFieldTitle("Screen (X / Y / W / H)")); + south.add(GridLayout.encloseIn(4, aimScreenX, aimScreenY, aimScreenW, aimScreenH)); + if (safeEnabled) { + south.add(labeledFieldTitle("Safe (X / Y / W / H)")); + south.add(GridLayout.encloseIn(4, aimSafeX, aimSafeY, aimSafeW, aimSafeH)); } - Container modeBar = GridLayout.encloseIn(3, modeScreen, modeSafe, modePan); - modeBar.setUIID("SkinDesignerTabBar"); Button zoomIn = new Button(); Button zoomOut = new Button(); - Button left = new Button(); - Button right = new Button(); - Button up = new Button(); - Button down = new Button(); + Button leftBtn = new Button(); + Button rightBtn = new Button(); + Button upBtn = new Button(); + Button downBtn = new Button(); styleIconActionButton(zoomIn, FontImage.MATERIAL_ZOOM_IN); styleIconActionButton(zoomOut, FontImage.MATERIAL_ZOOM_OUT); - styleIconActionButton(left, FontImage.MATERIAL_KEYBOARD_ARROW_LEFT); - styleIconActionButton(right, FontImage.MATERIAL_KEYBOARD_ARROW_RIGHT); - styleIconActionButton(up, FontImage.MATERIAL_KEYBOARD_ARROW_UP); - styleIconActionButton(down, FontImage.MATERIAL_KEYBOARD_ARROW_DOWN); - zoomIn.setTooltip("Zoom in"); + styleIconActionButton(leftBtn, FontImage.MATERIAL_KEYBOARD_ARROW_LEFT); + styleIconActionButton(rightBtn, FontImage.MATERIAL_KEYBOARD_ARROW_RIGHT); + styleIconActionButton(upBtn, FontImage.MATERIAL_KEYBOARD_ARROW_UP); + styleIconActionButton(downBtn, FontImage.MATERIAL_KEYBOARD_ARROW_DOWN); + zoomIn.setTooltip("Zoom in (centers on the active rectangle)"); zoomOut.setTooltip("Zoom out"); - left.setTooltip("Nudge left (1 px)"); - right.setTooltip("Nudge right (1 px)"); - up.setTooltip("Nudge up (1 px)"); - down.setTooltip("Nudge down (1 px)"); + leftBtn.setTooltip("Nudge the active rectangle 1 px left"); + rightBtn.setTooltip("Nudge the active rectangle 1 px right"); + upBtn.setTooltip("Nudge the active rectangle 1 px up"); + downBtn.setTooltip("Nudge the active rectangle 1 px down"); zoomIn.addActionListener(e -> view.zoomIn()); zoomOut.addActionListener(e -> view.zoomOut()); - left.addActionListener(e -> view.nudge(-1, 0)); - right.addActionListener(e -> view.nudge(1, 0)); - up.addActionListener(e -> view.nudge(0, -1)); - down.addActionListener(e -> view.nudge(0, 1)); + leftBtn.addActionListener(e -> { view.nudge(-1, 0); refreshAimFields.run(); }); + rightBtn.addActionListener(e -> { view.nudge(1, 0); refreshAimFields.run(); }); + upBtn.addActionListener(e -> { view.nudge(0, -1); refreshAimFields.run(); }); + downBtn.addActionListener(e -> { view.nudge(0, 1); refreshAimFields.run(); }); + + Container navBar = GridLayout.encloseIn(6, zoomOut, zoomIn, leftBtn, rightBtn, upBtn, downBtn); + south.add(navBar); - Container navBar = GridLayout.encloseIn(6, zoomIn, zoomOut, left, right, up, down); - Container south = BoxLayout.encloseY(modeBar, navBar); editPosition.add(BorderLayout.CENTER, view); editPosition.add(BorderLayout.SOUTH, south); applyWebsiteTheme(editPosition, websiteDarkMode); editPosition.show(); + + String intro = safeEnabled + ? "Drag the screen or safe rectangle to move it. Drag safe-area edges or corners to resize. Use the fields below for exact values." + : "Drag the screen rectangle to move it. Use the X / Y / W / H fields below for exact values."; + ToastBar.showMessage(intro, FontImage.MATERIAL_INFO, 6000); + } + + private TextField numericMirror(TextField source) { + TextField t = new TextField(source.getText(), source.getHint(), 6, TextField.NUMERIC); + t.setUIID("SkinDesignerField"); + return t; + } + + private void syncMirror(TextField mirror, TextField source) { + if (!source.getText().equals(mirror.getText())) { + mirror.setText(source.getText()); + } + } + + private void bindAimToMain(final TextField mirror, final TextField main, final AimView view) { + mirror.addActionListener(e -> { + String text = mirror.getText(); + if (!main.getText().equals(text)) { + main.setText(text); + } + view.repaint(); + }); } private void updateModeButtons(Button[] buttons, int selectedMode) { From d6e8f9503d21f8c6855f2b7682cfff25c5533bc2 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Thu, 30 Apr 2026 17:23:47 +0300 Subject: [PATCH 30/55] Complete redesign of the app --- .../skin-designer-devices-update.yml | 80 + .../common/src/main/css/theme.css | 1065 ++++++- .../tools/skindesigner/DeviceDatabase.java | 253 ++ .../tools/skindesigner/DevicePreview.java | 194 ++ .../tools/skindesigner/SkinDesigner.java | 2674 ++++++++--------- .../tools/skindesigner/SkinModel.java | 131 + .../common/src/main/resources/devices.json | 1 + .../skindesigner/tools/devicedb/.gitignore | 3 + scripts/skindesigner/tools/devicedb/README.md | 102 + .../tools/devicedb/build_devices_json.py | 435 +++ 10 files changed, 3497 insertions(+), 1441 deletions(-) create mode 100644 .github/workflows/skin-designer-devices-update.yml create mode 100644 scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/DeviceDatabase.java create mode 100644 scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/DevicePreview.java create mode 100644 scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinModel.java create mode 100644 scripts/skindesigner/common/src/main/resources/devices.json create mode 100644 scripts/skindesigner/tools/devicedb/.gitignore create mode 100644 scripts/skindesigner/tools/devicedb/README.md create mode 100755 scripts/skindesigner/tools/devicedb/build_devices_json.py diff --git a/.github/workflows/skin-designer-devices-update.yml b/.github/workflows/skin-designer-devices-update.yml new file mode 100644 index 0000000000..8bc988cec1 --- /dev/null +++ b/.github/workflows/skin-designer-devices-update.yml @@ -0,0 +1,80 @@ +name: Skin Designer Device DB Update + +on: + schedule: + # Monthly on the 1st at 06:30 UTC. The scrape walks ~18 brands × ~10 + # listing pages × phones per page; with a 1.5 s polite delay it tends + # to finish in 30-60 minutes. + - cron: '30 6 1 * *' + workflow_dispatch: + pull_request: + paths: + - '.github/workflows/skin-designer-devices-update.yml' + - 'scripts/skindesigner/tools/devicedb/build_devices_json.py' + +permissions: + actions: write + contents: write + pull-requests: write + +jobs: + update-device-db: + runs-on: ubuntu-latest + timeout-minutes: 90 + + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.x' + + - name: Restore HTML scrape cache + uses: actions/cache@v4 + with: + path: scripts/skindesigner/tools/devicedb/cache + key: skin-designer-devicedb-cache-${{ github.run_id }} + restore-keys: | + skin-designer-devicedb-cache- + + - name: Scrape GSMArena → devices.json + # --delay 1.5 keeps us at <1 req/sec averaged with jitter, which + # is well under GSMArena's per-IP rate limit. The cache directory + # is restored from the previous run so unchanged phone pages + # don't get re-fetched. + run: | + python3 scripts/skindesigner/tools/devicedb/build_devices_json.py \ + --delay 1.5 --max-pages 12 + + - name: Show diff (PR mode) + if: github.event_name == 'pull_request' + run: | + if git diff --quiet -- scripts/skindesigner/common/src/main/resources/devices.json; then + echo "Device DB is already up to date." + else + git --no-pager diff --stat -- scripts/skindesigner/common/src/main/resources/devices.json + fi + + - name: Create pull request + if: github.event_name != 'pull_request' + uses: peter-evans/create-pull-request@v7 + with: + commit-message: "Refresh Skin Designer device database" + title: "Refresh Skin Designer device database" + body: | + ## Summary + - Regenerates `scripts/skindesigner/common/src/main/resources/devices.json` + by scraping GSMArena directly. The script merges fresh records + into the existing catalog so historical entries survive partial + scrapes. + + This PR is created automatically by the monthly device DB update + workflow. Skip the merge if the diff is empty or only churn. + base: master + branch: automation/skin-designer-device-db + delete-branch: true + labels: | + dependencies + automation diff --git a/scripts/skindesigner/common/src/main/css/theme.css b/scripts/skindesigner/common/src/main/css/theme.css index 273bfecb08..ea4729efef 100644 --- a/scripts/skindesigner/common/src/main/css/theme.css +++ b/scripts/skindesigner/common/src/main/css/theme.css @@ -1,211 +1,1078 @@ +/* ========================================================================== + Skin Designer — wizard styling + Mapped from /tmp/skin-designer/project/assets/{tokens,app}.css onto the + Codename One CSS subset. Each design token shows up here as a UIID; the + *Dark variants are toggled at runtime by themedUiid() in SkinDesigner.java. + ========================================================================== */ + #Constants { includeNativeBool: true; defaultSourceDPIInt: "0"; useLargerTextScaleBool: true; } +/* --- Form / shell ---------------------------------------------------- */ + SkinDesignerForm { - background: #eef3ff; + background: #f3f4f7; } - SkinDesignerFormDark { - background: #0a111d; + background: #071b4d; } -SkinDesignerTabsContainer { - background: #eef3ff; - border: none; +SkinDesignerBody { + background: #f3f4f7; + padding: 0; +} +SkinDesignerBodyDark { + background: #071b4d; } -SkinDesignerTabsContainerDark { - background: #0a111d; - border: none; +Toolbar { background: #ffffff; } +ToolbarDark { background: #102b66; } +Title { color: #112247; background: #ffffff; font-family: "native:MainLight"; } +TitleDark { color: #f5f8ff; background: #102b66; font-family: "native:MainLight"; } +Command { color: #112247; background: transparent; } +CommandDark { color: #f5f8ff; background: transparent; } + +/* --- Topbar ---------------------------------------------------------- */ + +SkinDesignerTopbar { + background: #ffffff; + border-bottom: 1px solid #d9dee8; + padding: 0.6mm 1.6mm; +} +SkinDesignerTopbarDark { + background: #102b66; + border-bottom: 1px solid #4c6ea8; + padding: 0.6mm 1.6mm; } -SkinDesignerTabBar { - background: #eef3ff; - border: none; - padding: 0.4mm; +SkinDesignerBrand { padding: 0; } +SkinDesignerBrandDark { padding: 0; } + +SkinDesignerBrandLogo { + color: #ffffff; + background: #2a8a8a; + border-radius: 1.4mm; + padding: 0.6mm 0.9mm; + margin: 0.2mm 0.6mm; + font-size: 2.4mm; + font-family: "native:MainBold"; + text-align: center; +} +SkinDesignerBrandLogoDark { + color: #ffffff; + background: #3bc5c5; + border-radius: 1.4mm; + padding: 0.6mm 0.9mm; + margin: 0.2mm 0.6mm; + font-size: 2.4mm; + font-family: "native:MainBold"; + text-align: center; } -SkinDesignerTabBarDark { - background: #0a111d; - border: none; - padding: 0.4mm; +SkinDesignerBrandTitle { + color: #112247; + font-size: 3.4mm; + font-family: "native:MainBold"; + padding: 0.6mm; +} +SkinDesignerBrandTitleDark { + color: #f5f8ff; + font-size: 3.4mm; + font-family: "native:MainBold"; + padding: 0.6mm; } -SkinDesignerTabButton { - background: #f3f4f7; +/* --- Stepper --------------------------------------------------------- */ + +SkinDesignerStepper { + background: transparent; + padding: 0; +} +SkinDesignerStepperDark { background: transparent; padding: 0; } + +SkinDesignerStepperItemActive, +SkinDesignerStepperItemDone, +SkinDesignerStepperItemPending { + background: transparent; + padding: 0.6mm 1.4mm; + margin: 0; + border-radius: 6mm; +} +SkinDesignerStepperItemActive { background: #e8f0ff; } +SkinDesignerStepperItemActiveDark { background: rgba(77,134,255,0.16); padding: 0.6mm 1.4mm; margin: 0; border-radius: 6mm; } +SkinDesignerStepperItemDoneDark { background: transparent; padding: 0.6mm 1.4mm; margin: 0; border-radius: 6mm; } +SkinDesignerStepperItemPendingDark { background: transparent; padding: 0.6mm 1.4mm; margin: 0; border-radius: 6mm; } + +SkinDesignerStepperNumActive { + background: #2f6bff; + color: #ffffff; + border-radius: 4mm; + padding: 0.4mm; + margin: 0 0.6mm 0 0; + font-size: 2.2mm; + font-family: "native:MainBold"; + text-align: center; +} +SkinDesignerStepperNumActiveDark { + background: #4d86ff; + color: #ffffff; + border-radius: 4mm; + padding: 0.4mm; + margin: 0 0.6mm 0 0; + font-size: 2.2mm; + font-family: "native:MainBold"; + text-align: center; +} +SkinDesignerStepperNumDone { + background: #b8d532; color: #112247; - border: 1px solid #d9dee8; - margin: 0.2mm; - padding: 0.9mm; + border-radius: 4mm; + padding: 0.4mm; + margin: 0 0.6mm 0 0; + font-size: 2.2mm; + font-family: "native:MainBold"; + text-align: center; +} +SkinDesignerStepperNumDoneDark { + background: #b8d532; + color: #0a2460; + border-radius: 4mm; + padding: 0.4mm; + margin: 0 0.6mm 0 0; + font-size: 2.2mm; + font-family: "native:MainBold"; + text-align: center; +} +SkinDesignerStepperNumPending { + background: #d9dee8; + color: #ffffff; + border-radius: 4mm; + padding: 0.4mm; + margin: 0 0.6mm 0 0; + font-size: 2.2mm; + font-family: "native:MainLight"; + text-align: center; +} +SkinDesignerStepperNumPendingDark { + background: #4c6ea8; + color: #102b66; + border-radius: 4mm; + padding: 0.4mm; + margin: 0 0.6mm 0 0; + font-size: 2.2mm; + font-family: "native:MainLight"; + text-align: center; } -SkinDesignerTabButtonDark { - background: #102b66; +SkinDesignerStepperLabelActive { + color: #2f6bff; + font-size: 2.6mm; + font-family: "native:MainBold"; + padding: 0; +} +SkinDesignerStepperLabelActiveDark { + color: #4d86ff; + font-size: 2.6mm; + font-family: "native:MainBold"; + padding: 0; +} +SkinDesignerStepperLabelDone { + color: #112247; + font-size: 2.6mm; + font-family: "native:MainLight"; + padding: 0; +} +SkinDesignerStepperLabelDoneDark { color: #f5f8ff; - border: 1px solid #4c6ea8; - margin: 0.2mm; - padding: 0.9mm; + font-size: 2.6mm; + font-family: "native:MainLight"; + padding: 0; +} +SkinDesignerStepperLabelPending { + color: #7f8aa3; + font-size: 2.6mm; + font-family: "native:MainLight"; + padding: 0; +} +SkinDesignerStepperLabelPendingDark { + color: #a8b8da; + font-size: 2.6mm; + font-family: "native:MainLight"; + padding: 0; } -SkinDesignerTabButtonSelected { +SkinDesignerStepperSep { + background: #d9dee8; + padding: 0; + margin: 0 0.5mm; + color: transparent; + font-size: 0.6mm; +} +SkinDesignerStepperSepDark { background: #4c6ea8; padding: 0; margin: 0 0.5mm; color: transparent; font-size: 0.6mm; } + +SkinDesignerWizardNav { background: transparent; padding: 0; } +SkinDesignerWizardNavDark { background: transparent; padding: 0; } + +/* --- Status bar ------------------------------------------------------ */ + +SkinDesignerStatusbar { background: #ffffff; - color: #112247; - border: 2px solid #2f6bff; - margin: 0.2mm; - padding: 0.9mm; + border-top: 1px solid #d9dee8; + padding: 0.4mm 1.4mm; +} +SkinDesignerStatusbarDark { + background: #102b66; + border-top: 1px solid #4c6ea8; + padding: 0.4mm 1.4mm; } -SkinDesignerTabButtonSelectedDark { - background: #163575; - color: #f5f8ff; - border: 2px solid #4d86ff; - margin: 0.2mm; - padding: 0.9mm; +SkinDesignerStatusName, +SkinDesignerStatusSpec { + color: #7f8aa3; + font-size: 2.4mm; + font-family: "native:MainLight"; + padding: 0.2mm 0; } +SkinDesignerStatusNameDark, +SkinDesignerStatusSpecDark { + color: #a8b8da; + font-size: 2.4mm; + font-family: "native:MainLight"; + padding: 0.2mm 0; +} + +/* --- Step container -------------------------------------------------- */ -Toolbar { - background: #eef3ff; +SkinDesignerStepRoot { + background: #f3f4f7; + padding: 0; } +SkinDesignerStepRootDark { background: #071b4d; padding: 0; } -ToolbarDark { - background: #0a111d; +SkinDesignerStepHead { + background: transparent; + padding: 4mm 4mm 1mm 4mm; } +SkinDesignerStepHeadDark { background: transparent; padding: 4mm 4mm 1mm 4mm; } + +SkinDesignerStepHeadInner { background: transparent; padding: 0; } +SkinDesignerStepHeadInnerDark { background: transparent; padding: 0; } -Title { +SkinDesignerStepBody { + background: transparent; + padding: 1mm 3mm; +} +SkinDesignerStepBodyDark { background: transparent; padding: 1mm 3mm; } + +SkinDesignerStepScroll { + background: transparent; + padding: 0; +} +SkinDesignerStepScrollDark { background: transparent; padding: 0; } + +SkinDesignerH1 { + color: #112247; + font-size: 5.6mm; + font-family: "native:MainBold"; + padding: 0.6mm 0; + text-align: center; +} +SkinDesignerH1Dark { + color: #f5f8ff; + font-size: 5.6mm; + font-family: "native:MainBold"; + padding: 0.6mm 0; + text-align: center; +} +SkinDesignerH3 { color: #112247; - background: #eef3ff; + font-size: 3.6mm; + font-family: "native:MainBold"; + padding: 0.4mm 0; +} +SkinDesignerH3Dark { + color: #f5f8ff; + font-size: 3.6mm; + font-family: "native:MainBold"; + padding: 0.4mm 0; +} +SkinDesignerSub { + color: #7f8aa3; + font-size: 2.8mm; font-family: "native:MainLight"; + padding: 0.4mm 0 1mm 0; + text-align: center; } +SkinDesignerSubDark { + color: #a8b8da; + font-size: 2.8mm; + font-family: "native:MainLight"; + padding: 0.4mm 0 1mm 0; + text-align: center; +} + +/* --- Buttons --------------------------------------------------------- */ -TitleDark { +SkinDesignerPrimaryButton { + color: #ffffff; + background: #2f6bff; + border: 1px solid #2f6bff; + border-radius: 1.4mm; + padding: 1mm 2.4mm; + margin: 0.4mm; + font-family: "native:MainBold"; + font-size: 2.8mm; + text-align: center; +} +SkinDesignerPrimaryButtonDark { + color: #ffffff; + background: #4d86ff; + border: 1px solid #4d86ff; + border-radius: 1.4mm; + padding: 1mm 2.4mm; + margin: 0.4mm; + font-family: "native:MainBold"; + font-size: 2.8mm; + text-align: center; +} +SkinDesignerSecondaryButton { + color: #112247; + background: #ffffff; + border: 1px solid #d9dee8; + border-radius: 1.4mm; + padding: 1mm 2.4mm; + margin: 0.4mm; + font-family: "native:MainLight"; + font-size: 2.8mm; + text-align: center; +} +SkinDesignerSecondaryButtonDark { color: #f5f8ff; - background: #0a111d; + background: #102b66; + border: 1px solid #4c6ea8; + border-radius: 1.4mm; + padding: 1mm 2.4mm; + margin: 0.4mm; font-family: "native:MainLight"; + font-size: 2.8mm; + text-align: center; } - -Command { +SkinDesignerGhostButton { color: #112247; background: transparent; + border: none; + padding: 1mm 2mm; + margin: 0.4mm; + font-family: "native:MainLight"; + font-size: 2.6mm; } - -CommandDark { +SkinDesignerGhostButtonDark { color: #f5f8ff; background: transparent; + border: none; + padding: 1mm 2mm; + margin: 0.4mm; + font-family: "native:MainLight"; + font-size: 2.6mm; +} +SkinDesignerIconButton { + color: #7f8aa3; + background: transparent; + border: none; + padding: 0.6mm; + margin: 0; + font-size: 2.4mm; +} +SkinDesignerIconButtonDark { + color: #a8b8da; + background: transparent; + border: none; + padding: 0.6mm; + margin: 0; + font-size: 2.4mm; } -Tab { - background: #f3f4f7; +SkinDesignerFooter { + background: #ffffff; + border-top: 1px solid #d9dee8; + padding: 1.2mm 2.4mm; +} +SkinDesignerFooterDark { + background: #102b66; + border-top: 1px solid #4c6ea8; + padding: 1.2mm 2.4mm; +} + +/* --- Search / filter chips ------------------------------------------ */ + +SkinDesignerSearchField { color: #112247; + background: #ffffff; border: 1px solid #d9dee8; + border-radius: 1.4mm; + padding: 1.2mm; + margin: 0.6mm; font-family: "native:MainLight"; - font-size: 2.8mm; - text-align: center; + font-size: 3mm; +} +SkinDesignerSearchFieldDark { + color: #f5f8ff; + background: #0e2a61; + border: 1px solid #4c6ea8; + border-radius: 1.4mm; + padding: 1.2mm; + margin: 0.6mm; + font-family: "native:MainLight"; + font-size: 3mm; +} + +SkinDesignerFilterRow { + background: transparent; + padding: 0; margin: 0; - padding: 0.8mm; } +SkinDesignerFilterRowDark { background: transparent; padding: 0; margin: 0; } -TabDark { +SkinDesignerFilterTag { + color: #7f8aa3; + background: #ffffff; + border: 1px solid #d9dee8; + border-radius: 6mm; + padding: 0.6mm 2mm; + margin: 0.3mm; + font-family: "native:MainLight"; + font-size: 2.4mm; +} +SkinDesignerFilterTagDark { + color: #a8b8da; background: #102b66; - color: #f5f8ff; border: 1px solid #4c6ea8; + border-radius: 6mm; + padding: 0.6mm 2mm; + margin: 0.3mm; font-family: "native:MainLight"; - font-size: 2.8mm; - text-align: center; + font-size: 2.4mm; +} +SkinDesignerFilterTagActive { + color: #ffffff; + background: #2f6bff; + border: 1px solid #2f6bff; + border-radius: 6mm; + padding: 0.6mm 2mm; + margin: 0.3mm; + font-family: "native:MainBold"; + font-size: 2.4mm; +} +SkinDesignerFilterTagActiveDark { + color: #ffffff; + background: #4d86ff; + border: 1px solid #4d86ff; + border-radius: 6mm; + padding: 0.6mm 2mm; + margin: 0.3mm; + font-family: "native:MainBold"; + font-size: 2.4mm; +} + +SkinDesignerGroupLabel { + color: #7f8aa3; + font-size: 2.2mm; + font-family: "native:MainBold"; + padding: 1.2mm 1mm 0.4mm 1mm; + margin: 0; + background: transparent; +} +SkinDesignerGroupLabelDark { color: #a8b8da; font-size: 2.2mm; font-family: "native:MainBold"; padding: 1.2mm 1mm 0.4mm 1mm; margin: 0; background: transparent; } + +SkinDesignerCardRow { + background: transparent; + padding: 0 0.5mm; margin: 0; - padding: 0.8mm; } +SkinDesignerCardRowDark { background: transparent; padding: 0 0.5mm; margin: 0; } -TabSelected { +/* --- Device cards --------------------------------------------------- */ + +SkinDesignerDeviceGrid { + background: transparent; + padding: 0 2mm; +} +SkinDesignerDeviceGridDark { background: transparent; padding: 0 2mm; } + +SkinDesignerDeviceCard { + background: #ffffff; + border: 1px solid #d9dee8; + border-radius: 2.4mm; + padding: 1.6mm; + margin: 0.5mm; +} +SkinDesignerDeviceCardDark { + background: #102b66; + border: 1px solid #4c6ea8; + border-radius: 2.4mm; + padding: 1.6mm; + margin: 0.5mm; +} +SkinDesignerDeviceCardSelected { background: #ffffff; - color: #112247; border: 2px solid #2f6bff; + border-radius: 2.4mm; + padding: 1.6mm; + margin: 0.5mm; +} +SkinDesignerDeviceCardSelectedDark { + background: #102b66; + border: 2px solid #4d86ff; + border-radius: 2.4mm; + padding: 1.6mm; + margin: 0.5mm; } -TabSelectedDark { - background: #163575; +SkinDesignerOsMark { + color: #112247; + background: #f7f8fb; + border-radius: 1.4mm; + padding: 0.6mm; + margin: 0 0.6mm 0 0; + font-size: 2.6mm; + text-align: center; +} +SkinDesignerOsMarkDark { color: #f5f8ff; - border: 2px solid #4d86ff; + background: #163575; + border-radius: 1.4mm; + padding: 0.6mm; + margin: 0 0.6mm 0 0; + font-size: 2.6mm; + text-align: center; } -TabsContainer { - background: #eef3ff; +SkinDesignerDeviceName { + color: #112247; + font-size: 2.8mm; + font-family: "native:MainBold"; + padding: 0.4mm; +} +SkinDesignerDeviceNameDark { + color: #f5f8ff; + font-size: 2.8mm; + font-family: "native:MainBold"; + padding: 0.4mm; +} +SkinDesignerDeviceSpec { + color: #7f8aa3; + font-size: 2.2mm; + font-family: "native:MainLight"; + padding: 0.4mm; } +SkinDesignerDeviceSpecDark { + color: #a8b8da; + font-size: 2.2mm; + font-family: "native:MainLight"; + padding: 0.4mm; +} +SkinDesignerDeviceCheck { + color: #2f6bff; + background: transparent; + padding: 0; + font-size: 3mm; +} +SkinDesignerDeviceCheckDark { + color: #4d86ff; + background: transparent; + padding: 0; + font-size: 3mm; +} + +/* --- Source step ---------------------------------------------------- */ -TabsContainerDark { - background: #0a111d; +SkinDesignerSourceRow { + background: transparent; + padding: 1mm 4mm; } +SkinDesignerSourceRowDark { background: transparent; padding: 1mm 4mm; } -SkinDesignerCard { +SkinDesignerSourceCard { background: #ffffff; border: 1px solid #d9dee8; - border-radius: 2mm; + border-radius: 3mm; + padding: 4mm; margin: 1mm; - padding: 1.2mm; } - -SkinDesignerCardDark { +SkinDesignerSourceCardDark { background: #102b66; border: 1px solid #4c6ea8; - border-radius: 2mm; + border-radius: 3mm; + padding: 4mm; margin: 1mm; - padding: 1.2mm; } -SkinDesignerFieldLabel { +SkinDesignerSourceIll { + background: #f7f8fb; + color: #7f8aa3; + padding: 6mm; + margin: 0 0 2mm 0; + border-radius: 2mm; + text-align: center; + font-size: 8mm; +} +SkinDesignerSourceIllDark { + background: #163575; + color: #a8b8da; + padding: 6mm; + margin: 0 0 2mm 0; + border-radius: 2mm; + text-align: center; + font-size: 8mm; +} +SkinDesignerSourceP { + color: #7f8aa3; + font-size: 2.6mm; + font-family: "native:MainLight"; + padding: 0.4mm; +} +SkinDesignerSourcePDark { + color: #a8b8da; + font-size: 2.6mm; + font-family: "native:MainLight"; + padding: 0.4mm; +} + +/* --- Editor / stage / sidebar --------------------------------------- */ + +SkinDesignerStage { + background: #fafafc; + padding: 0; +} +SkinDesignerStageDark { background: #112f70; padding: 0; } + +SkinDesignerStageChips { + background: transparent; + padding: 0.5mm; +} +SkinDesignerStageChipsDark { background: transparent; padding: 0.5mm; } + +SkinDesignerInfoChip { + background: #ffffff; + border: 1px solid #d9dee8; + border-radius: 1.4mm; + padding: 0.6mm 1.4mm; + margin: 0.5mm; + font-size: 2.2mm; +} +SkinDesignerInfoChipDark { + background: #102b66; + border: 1px solid #4c6ea8; + border-radius: 1.4mm; + padding: 0.6mm 1.4mm; + margin: 0.5mm; + font-size: 2.2mm; +} +SkinDesignerChipKey { + color: #7f8aa3; + font-size: 2.2mm; + font-family: "native:MainLight"; + padding: 0 0.4mm 0 0; +} +SkinDesignerChipKeyDark { color: #a8b8da; font-size: 2.2mm; font-family: "native:MainLight"; padding: 0 0.4mm 0 0; } +SkinDesignerChipValue { color: #112247; + font-size: 2.2mm; + font-family: "native:MainBold"; + padding: 0; +} +SkinDesignerChipValueDark { color: #f5f8ff; font-size: 2.2mm; font-family: "native:MainBold"; padding: 0; } + +DevicePreview { + background: transparent; + padding: 4mm; +} +DevicePreviewDark { background: transparent; padding: 4mm; } + +SkinDesignerSidebar { + background: #ffffff; + border-left: 1px solid #d9dee8; + padding: 0; +} +SkinDesignerSidebarDark { + background: #102b66; + border-left: 1px solid #4c6ea8; + padding: 0; +} + +SkinDesignerSidebarTabs { + background: #ffffff; + border-bottom: 1px solid #d9dee8; + padding: 0; +} +SkinDesignerSidebarTabsDark { + background: #102b66; + border-bottom: 1px solid #4c6ea8; + padding: 0; +} + +SkinDesignerSidebarTab { + color: #7f8aa3; + background: transparent; + border: none; + border-bottom: 2px solid transparent; + padding: 1.6mm 1mm; + margin: 0; font-family: "native:MainLight"; - font-size: 2.8mm; + font-size: 2.6mm; + text-align: center; +} +SkinDesignerSidebarTabDark { + color: #a8b8da; + background: transparent; + border: none; + border-bottom: 2px solid transparent; + padding: 1.6mm 1mm; margin: 0; - padding: 0.8mm 0.3mm 0.2mm 0.3mm; + font-family: "native:MainLight"; + font-size: 2.6mm; + text-align: center; +} +SkinDesignerSidebarTabActive { + color: #2f6bff; + background: transparent; + border: none; + border-bottom: 2px solid #2f6bff; + padding: 1.6mm 1mm; + margin: 0; + font-family: "native:MainBold"; + font-size: 2.6mm; + text-align: center; +} +SkinDesignerSidebarTabActiveDark { + color: #4d86ff; + background: transparent; + border: none; + border-bottom: 2px solid #4d86ff; + padding: 1.6mm 1mm; + margin: 0; + font-family: "native:MainBold"; + font-size: 2.6mm; + text-align: center; +} + +SkinDesignerSidebarBody { + background: #ffffff; + padding: 2mm; +} +SkinDesignerSidebarBodyDark { background: #102b66; padding: 2mm; } + +SkinDesignerSidebarFoot { + background: #ffffff; + border-top: 1px solid #d9dee8; + padding: 1.4mm 2mm; +} +SkinDesignerSidebarFootDark { + background: #102b66; + border-top: 1px solid #4c6ea8; + padding: 1.4mm 2mm; +} + +/* --- Sections / fields --------------------------------------------- */ + +SkinDesignerSectionLabel { + color: #7f8aa3; + font-size: 2.2mm; + font-family: "native:MainBold"; + padding: 1.4mm 0 0.6mm 0; +} +SkinDesignerSectionLabelDark { + color: #a8b8da; + font-size: 2.2mm; + font-family: "native:MainBold"; + padding: 1.4mm 0 0.6mm 0; +} + +SkinDesignerHelpBlock { + color: #a0a8ba; + background: #f7f8fb; + border-radius: 1.4mm; + padding: 1.4mm 1.8mm; + margin: 0 0 1.4mm 0; + font-size: 2.2mm; + font-family: "native:MainLight"; +} +SkinDesignerHelpBlockDark { + color: #7e93bc; + background: #163575; + border-radius: 1.4mm; + padding: 1.4mm 1.8mm; + margin: 0 0 1.4mm 0; + font-size: 2.2mm; + font-family: "native:MainLight"; +} + +SkinDesignerEmptyHint { + color: #a0a8ba; background: transparent; + padding: 2mm; + margin: 0; + font-size: 2.4mm; + font-family: "native:MainLight"; + text-align: center; } +SkinDesignerEmptyHintDark { color: #7e93bc; background: transparent; padding: 2mm; margin: 0; font-size: 2.4mm; font-family: "native:MainLight"; text-align: center; } +SkinDesignerFieldLabel { + color: #7f8aa3; + font-size: 2.2mm; + font-family: "native:MainLight"; + padding: 0.4mm 0; + margin: 0; +} SkinDesignerFieldLabelDark { - color: #f5f8ff; + color: #a8b8da; + font-size: 2.2mm; font-family: "native:MainLight"; - font-size: 2.8mm; + padding: 0.4mm 0; margin: 0; - padding: 0.8mm 0.3mm 0.2mm 0.3mm; - background: transparent; } SkinDesignerField { color: #112247; background: #ffffff; border: 1px solid #d9dee8; - padding: 1mm; + border-radius: 1.4mm; + padding: 1mm 1.4mm; + margin: 0.3mm; font-family: "native:MainLight"; - font-size: 3mm; + font-size: 2.6mm; } - SkinDesignerFieldDark { color: #f5f8ff; + background: #0e2a61; + border: 1px solid #4c6ea8; + border-radius: 1.4mm; + padding: 1mm 1.4mm; + margin: 0.3mm; + font-family: "native:MainLight"; + font-size: 2.6mm; +} + +SkinDesignerFieldReadonly { + color: #7f8aa3; + background: #f7f8fb; + border: 1px solid #d9dee8; + border-radius: 1.4mm; + padding: 1mm 1.4mm; + margin: 0.3mm; + font-family: "native:MainLight"; + font-size: 2.6mm; +} +SkinDesignerFieldReadonlyDark { + color: #a8b8da; background: #163575; border: 1px solid #4c6ea8; - padding: 1mm; + border-radius: 1.4mm; + padding: 1mm 1.4mm; + margin: 0.3mm; font-family: "native:MainLight"; - font-size: 3mm; + font-size: 2.6mm; } -SkinDesignerActionButton { - color: #ffffff; - background: #2f6bff; - border: none; - padding: 0.9mm 1.4mm; +SkinDesignerFieldRow { background: transparent; padding: 0; margin: 0.4mm 0; } +SkinDesignerFieldRowDark { background: transparent; padding: 0; margin: 0.4mm 0; } +SkinDesignerFieldGrid { background: transparent; padding: 0; margin: 0.4mm 0; } +SkinDesignerFieldGridDark { background: transparent; padding: 0; margin: 0.4mm 0; } + +/* --- Preset tiles -------------------------------------------------- */ + +SkinDesignerPresetGrid { background: transparent; padding: 0; } +SkinDesignerPresetGridDark { background: transparent; padding: 0; } + +SkinDesignerPreset { + background: #f7f8fb; + border: 1px solid #d9dee8; + border-radius: 2mm; + padding: 1.6mm 1mm; + margin: 0.3mm; +} +SkinDesignerPresetDark { + background: #163575; + border: 1px solid #4c6ea8; + border-radius: 2mm; + padding: 1.6mm 1mm; + margin: 0.3mm; +} +SkinDesignerPresetSelected { + background: #e8f0ff; + border: 2px solid #2f6bff; + border-radius: 2mm; + padding: 1.6mm 1mm; + margin: 0.3mm; +} +SkinDesignerPresetSelectedDark { + background: rgba(77,134,255,0.16); + border: 2px solid #4d86ff; + border-radius: 2mm; + padding: 1.6mm 1mm; + margin: 0.3mm; +} +SkinDesignerPresetIcon { + color: #112247; + background: transparent; + padding: 0.4mm; +} +SkinDesignerPresetIconDark { color: #f5f8ff; background: transparent; padding: 0.4mm; } +SkinDesignerPresetLabel { + color: #7f8aa3; + font-size: 2mm; font-family: "native:MainLight"; - font-size: 2.7mm; + padding: 0.4mm; text-align: center; } +SkinDesignerPresetLabelDark { color: #a8b8da; font-size: 2mm; font-family: "native:MainLight"; padding: 0.4mm; text-align: center; } -SkinDesignerActionButtonDark { +/* --- Cutout list --------------------------------------------------- */ + +SkinDesignerCutoutRow { + background: #f7f8fb; + border: 1px solid #d9dee8; + border-radius: 1.4mm; + padding: 1mm 1.4mm; + margin: 0.3mm 0; +} +SkinDesignerCutoutRowDark { + background: #163575; + border: 1px solid #4c6ea8; + border-radius: 1.4mm; + padding: 1mm 1.4mm; + margin: 0.3mm 0; +} +SkinDesignerCutoutRowSelected { + background: #e8f0ff; + border: 1px solid #2f6bff; + border-radius: 1.4mm; + padding: 1mm 1.4mm; + margin: 0.3mm 0; +} +SkinDesignerCutoutRowSelectedDark { + background: rgba(77,134,255,0.16); + border: 1px solid #4d86ff; + border-radius: 1.4mm; + padding: 1mm 1.4mm; + margin: 0.3mm 0; +} +SkinDesignerCutoutSwatch { + background: #112247; + color: #112247; + border-radius: 0.8mm; + padding: 0.6mm; + margin: 0 0.6mm 0 0; + font-size: 1mm; +} +SkinDesignerCutoutSwatchDark { + background: #f5f8ff; color: #f5f8ff; - background: #4d86ff; - border: none; - padding: 0.9mm 1.4mm; + border-radius: 0.8mm; + padding: 0.6mm; + margin: 0 0.6mm 0 0; + font-size: 1mm; +} +SkinDesignerCutoutName { + color: #112247; + font-size: 2.6mm; + font-family: "native:MainBold"; + padding: 0.4mm; +} +SkinDesignerCutoutNameDark { color: #f5f8ff; font-size: 2.6mm; font-family: "native:MainBold"; padding: 0.4mm; } +SkinDesignerCutoutType { + color: #7f8aa3; font-family: "native:MainLight"; - font-size: 2.7mm; + font-size: 2mm; + padding: 0 0.6mm; +} +SkinDesignerCutoutTypeDark { color: #a8b8da; font-family: "native:MainLight"; font-size: 2mm; padding: 0 0.6mm; } + +SkinDesignerCutoutEditor { + background: #e8f0ff; + border-radius: 1.4mm; + padding: 1.4mm; + margin: 0.4mm 0; +} +SkinDesignerCutoutEditorDark { + background: rgba(77,134,255,0.16); + border-radius: 1.4mm; + padding: 1.4mm; + margin: 0.4mm 0; +} + +/* --- Done step ----------------------------------------------------- */ + +SkinDesignerDoneRoot { + background: #f3f4f7; + padding: 8mm 4mm; +} +SkinDesignerDoneRootDark { + background: #071b4d; + padding: 8mm 4mm; +} +SkinDesignerDoneCheck { + background: #b8d532; + color: #112247; + border-radius: 12mm; + padding: 4mm; + margin: 1mm; + font-size: 8mm; text-align: center; } +SkinDesignerDoneCheckDark { + background: #b8d532; + color: #0a2460; + border-radius: 12mm; + padding: 4mm; + margin: 1mm; + font-size: 8mm; + text-align: center; +} + +SkinDesignerSummary { + background: #ffffff; + border: 1px solid #d9dee8; + border-radius: 2.4mm; + padding: 4mm; + margin: 2mm; + font-size: 2.6mm; +} +SkinDesignerSummaryDark { + background: #102b66; + border: 1px solid #4c6ea8; + border-radius: 2.4mm; + padding: 4mm; + margin: 2mm; + font-size: 2.6mm; +} +SkinDesignerSummaryRow { + background: transparent; + border-bottom: 1px solid #d9dee8; + padding: 1mm 0; + margin: 0; +} +SkinDesignerSummaryRowDark { + background: transparent; + border-bottom: 1px solid #4c6ea8; + padding: 1mm 0; + margin: 0; +} +SkinDesignerSummaryKey { + color: #7f8aa3; + font-size: 2.6mm; + font-family: "native:MainLight"; + padding: 0.4mm; +} +SkinDesignerSummaryKeyDark { color: #a8b8da; font-size: 2.6mm; font-family: "native:MainLight"; padding: 0.4mm; } +SkinDesignerSummaryValue { + color: #112247; + font-size: 2.6mm; + font-family: "native:MainBold"; + padding: 0.4mm; +} +SkinDesignerSummaryValueDark { color: #f5f8ff; font-size: 2.6mm; font-family: "native:MainBold"; padding: 0.4mm; } diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/DeviceDatabase.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/DeviceDatabase.java new file mode 100644 index 0000000000..7a3b3c90a5 --- /dev/null +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/DeviceDatabase.java @@ -0,0 +1,253 @@ +package com.codename1.tools.skindesigner; + +import com.codename1.io.JSONParser; +import com.codename1.io.Log; +import com.codename1.ui.Display; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; + +/** + * Bundled device database loaded from {@code /devices.json} at startup. + * + * The JSON catalog is generated by + * {@code tools/devicedb/build_devices_json.py} from a public GSMArena dump + * and refreshed by CI on a schedule. Bundling it avoids any runtime fetch, + * which would hit CORS in the JavaScript port. + */ +public final class DeviceDatabase { + public static final String FORM_PHONE = "Phone"; + public static final String FORM_TABLET = "Tablet"; + public static final String FORM_FOLDABLE = "Foldable"; + + public static final class Device { + public final String id; + public final String brand; + public final String os; + public final int year; + public final String form; + public final String name; + public final int resolutionW; + public final int resolutionH; + public final double screenSize; + public final int ppi; + public final String platformName; + public final boolean hasNotch; + public final boolean hasIsland; + public final boolean hasHole; + public final boolean hasHomeIndicator; + public final int safeTop; + public final int safeBottom; + public final int safeLeft; + public final int safeRight; + public final String systemFont; + public final String proportionalFont; + public final String monoFont; + public final int fontSmall; + public final int fontMedium; + public final int fontLarge; + public final boolean tablet; + + Device(String id, String brand, String os, int year, String form, String name, + int rw, int rh, double screenSize, int ppi, + String platformName, + boolean hasNotch, boolean hasIsland, boolean hasHole, boolean hasHomeIndicator, + int safeTop, int safeBottom, int safeLeft, int safeRight, + String systemFont, String proportionalFont, String monoFont, + int fontSmall, int fontMedium, int fontLarge, + boolean tablet) { + this.id = id; + this.brand = brand; + this.os = os; + this.year = year; + this.form = form; + this.name = name; + this.resolutionW = rw; + this.resolutionH = rh; + this.screenSize = screenSize; + this.ppi = ppi; + this.platformName = platformName; + this.hasNotch = hasNotch; + this.hasIsland = hasIsland; + this.hasHole = hasHole; + this.hasHomeIndicator = hasHomeIndicator; + this.safeTop = safeTop; + this.safeBottom = safeBottom; + this.safeLeft = safeLeft; + this.safeRight = safeRight; + this.systemFont = systemFont; + this.proportionalFont = proportionalFont; + this.monoFont = monoFont; + this.fontSmall = fontSmall; + this.fontMedium = fontMedium; + this.fontLarge = fontLarge; + this.tablet = tablet; + } + + public boolean matchesFormFilter(String filter) { + if (filter == null || "all".equals(filter)) return true; + if ("phone".equals(filter)) return FORM_PHONE.equals(form); + if ("tablet".equals(filter)) return FORM_TABLET.equals(form); + if ("fold".equals(filter)) return FORM_FOLDABLE.equals(form); + return true; + } + + public boolean matchesQuery(String query) { + if (query == null || query.isEmpty()) return true; + String q = query.toLowerCase(); + return name.toLowerCase().contains(q) || brand.toLowerCase().contains(q); + } + } + + private static List CACHE; + private static List BRANDS_CACHE; + + /** Bundled JSON resource path; loaded once and cached. */ + public static synchronized List all() { + if (CACHE == null) { + CACHE = load(); + } + return CACHE; + } + + /** Distinct brand names ordered by descending device count. */ + public static synchronized List brands() { + if (BRANDS_CACHE == null) { + Set seen = new TreeSet<>(); + for (Device d : all()) seen.add(d.brand); + BRANDS_CACHE = new ArrayList<>(seen); + } + return BRANDS_CACHE; + } + + public static Device findById(String id) { + if (id == null) return null; + for (Device d : all()) { + if (id.equals(d.id)) return d; + } + return null; + } + + @SuppressWarnings("unchecked") + private static List load() { + InputStream is = Display.getInstance().getResourceAsStream( + DeviceDatabase.class, "/devices.json"); + if (is == null) { + Log.p("devices.json missing — falling back to empty device list"); + return Collections.emptyList(); + } + try (InputStreamReader r = new InputStreamReader(is, "UTF-8")) { + JSONParser p = new JSONParser(); + Map root = p.parseJSON(r); + Object arr = root.get("devices"); + if (!(arr instanceof List)) { + return Collections.emptyList(); + } + List> raw = (List>) arr; + List out = new ArrayList<>(raw.size()); + for (Map m : raw) { + Device d = parseDevice(m); + if (d != null) out.add(d); + } + // Sort by year desc, then brand, then name + Collections.sort(out, new Comparator() { + @Override + public int compare(Device a, Device b) { + int c = Integer.compare(b.year, a.year); + if (c != 0) return c; + c = a.brand.compareToIgnoreCase(b.brand); + if (c != 0) return c; + return a.name.compareToIgnoreCase(b.name); + } + }); + return Collections.unmodifiableList(out); + } catch (IOException err) { + Log.e(err); + return Collections.emptyList(); + } + } + + @SuppressWarnings("unchecked") + private static Device parseDevice(Map m) { + try { + String id = str(m, "id", ""); + String brand = str(m, "brand", "Unknown"); + String name = str(m, "name", "?"); + String os = str(m, "os", ""); + int year = num(m, "year", 0); + String form = str(m, "form", FORM_PHONE); + int w = num(m, "w", 0); + int h = num(m, "h", 0); + int ppi = num(m, "ppi", 0); + double inches = numDouble(m, "inches", 0); + String platform = str(m, "platform", "and"); + boolean tablet = bool(m, "tablet", false); + boolean hasNotch = bool(m, "hasNotch", false); + boolean hasIsland = bool(m, "hasIsland", false); + boolean hasHole = bool(m, "hasHole", false); + boolean hasHome = bool(m, "hasHome", false); + int safeTop = num(m, "safeTop", 0); + int safeBottom = num(m, "safeBottom", 0); + + Map fonts = m.get("fonts") instanceof Map + ? (Map) m.get("fonts") + : Collections.emptyMap(); + String sysFont = str(fonts, "system", "Helvetica"); + String propFont = str(fonts, "prop", sysFont); + String monoFont = str(fonts, "mono", "Courier"); + int sm = num(fonts, "small", 12); + int md = num(fonts, "medium", 15); + int lg = num(fonts, "large", 22); + + if (id.isEmpty()) id = (brand + "_" + name).toLowerCase(); + if (w <= 0 || h <= 0 || ppi <= 0) return null; + return new Device(id, brand, os, year, form, name, w, h, inches, ppi, platform, + hasNotch, hasIsland, hasHole, hasHome, + safeTop, safeBottom, 0, 0, + sysFont, propFont, monoFont, sm, md, lg, tablet); + } catch (Exception err) { + Log.e(err); + return null; + } + } + + private static String str(Map m, String key, String def) { + Object v = m.get(key); + if (v == null) return def; + return v.toString(); + } + + private static int num(Map m, String key, int def) { + Object v = m.get(key); + if (v == null) return def; + if (v instanceof Number) return ((Number) v).intValue(); + try { return Integer.parseInt(v.toString()); } catch (NumberFormatException nfe) { + try { return (int) Double.parseDouble(v.toString()); } catch (NumberFormatException nfe2) { return def; } + } + } + + private static double numDouble(Map m, String key, double def) { + Object v = m.get(key); + if (v == null) return def; + if (v instanceof Number) return ((Number) v).doubleValue(); + try { return Double.parseDouble(v.toString()); } catch (NumberFormatException nfe) { return def; } + } + + private static boolean bool(Map m, String key, boolean def) { + Object v = m.get(key); + if (v == null) return def; + if (v instanceof Boolean) return (Boolean) v; + String s = v.toString().toLowerCase(); + return "true".equals(s) || "1".equals(s) || "yes".equals(s); + } + + private DeviceDatabase() {} +} diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/DevicePreview.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/DevicePreview.java new file mode 100644 index 0000000000..6d0cac4e85 --- /dev/null +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/DevicePreview.java @@ -0,0 +1,194 @@ +package com.codename1.tools.skindesigner; + +import com.codename1.ui.CN; +import com.codename1.ui.Component; +import com.codename1.ui.Graphics; +import com.codename1.ui.Image; +import com.codename1.ui.geom.Dimension; +import java.util.List; + +/** + * Live device preview rendered onto a CN1 {@link Component}. Mirrors the + * {@code DeviceSvg} React component from the design — rounded body, screen + * tint, cutouts and home indicator. When a body image is supplied (image + * source) it is drawn instead of the gradient body and clipped to the + * rounded shape. + */ +public final class DevicePreview extends Component { + static final int VB_W = 320; + static final int VB_H = 620; + + private SkinModel skin; + private Image bodyImage; + private final boolean fixedSize; + + public DevicePreview() { + this(false); + } + + public DevicePreview(boolean fixedSize) { + this.fixedSize = fixedSize; + setUIID("DevicePreview"); + setFocusable(false); + } + + public void setSkin(SkinModel skin) { + this.skin = skin; + repaint(); + } + + public void setBodyImage(Image bodyImage) { + this.bodyImage = bodyImage; + repaint(); + } + + @Override + protected Dimension calcPreferredSize() { + if (fixedSize) { + return new Dimension(CN.convertToPixels(40), CN.convertToPixels(78)); + } + return new Dimension(CN.convertToPixels(60), CN.convertToPixels(110)); + } + + @Override + public void paint(Graphics g) { + if (skin == null) { + return; + } + int w = getInnerWidth(); + int h = getInnerHeight(); + int x = getX() + getStyle().getPaddingLeftNoRTL(); + int y = getY() + getStyle().getPaddingTop(); + if (w <= 4 || h <= 4) { + return; + } + + // Fit a 320x620 viewbox into the available area. + float scale = Math.min(((float) w) / VB_W, ((float) h) / VB_H); + int drawW = Math.max(1, Math.round(VB_W * scale)); + int drawH = Math.max(1, Math.round(VB_H * scale)); + int drawX = x + (w - drawW) / 2; + int drawY = y + (h - drawH) / 2; + + int bezel = Math.round(skin.bezel * scale); + int cornerR = Math.round(skin.cornerR * scale); + int screenX = drawX + bezel; + int screenY = drawY + bezel; + int screenW = drawW - bezel * 2; + int screenH = drawH - bezel * 2; + int screenR = Math.max(2, cornerR - Math.round(8 * scale)); + + int[] origClip = g.getClip(); + g.pushClip(); + g.clipRect(x, y, w, h); + + // Body + if (bodyImage != null) { + int oldClip[] = g.getClip(); + g.pushClip(); + clipRoundRect(g, drawX, drawY, drawW, drawH, cornerR); + g.drawImage(bodyImage, drawX, drawY, drawW, drawH); + g.popClip(); + g.setClip(oldClip); + } else { + // Faux gradient using two color fills + outline, to avoid relying on RadialGradient + g.setColor(0x121822); + fillRoundRect(g, drawX, drawY, drawW, drawH, cornerR); + g.setColor(0x2a2f3a); + int inset = Math.max(1, Math.round(4 * scale)); + int oldAlpha = g.getAlpha(); + g.setAlpha(180); + fillRoundRect(g, drawX + inset, drawY + inset, drawW - inset * 2, drawH - inset * 2, Math.max(0, cornerR - inset)); + g.setAlpha(oldAlpha); + } + + // Screen tint + g.setColor(0x1E3A8A); + int oldA = g.getAlpha(); + g.setAlpha(230); + fillRoundRect(g, screenX, screenY, screenW, screenH, screenR); + g.setColor(0x2A8A8A); + g.setAlpha(80); + fillRoundRect(g, screenX, screenY, screenW, screenH, screenR); + g.setAlpha(oldA); + + // Cutouts overlay (relative to top-center of screen) + int cx = drawX + drawW / 2; + if (skin.cutouts != null) { + List cutouts = skin.cutouts; + for (SkinModel.Cutout c : cutouts) { + drawCutout(g, c, scale, cx, screenY); + } + } + + // Screen dashed outline + g.setColor(0x2F6BFF); + int dashAlpha = (int) (255 * 0.7f); + int prev = g.getAlpha(); + g.setAlpha(dashAlpha); + drawDashedRoundRect(g, screenX, screenY, screenW, screenH, screenR, Math.max(2, Math.round(4 * scale)), Math.max(1, Math.round(3 * scale))); + g.setAlpha(prev); + + // Home indicator + if (skin.homeIndicator) { + g.setColor(0xffffff); + int hiW = Math.round(100 * scale); + int hiH = Math.max(2, Math.round(4 * scale)); + int hx = cx - hiW / 2; + int hy = drawY + drawH - bezel - Math.round(10 * scale); + int hiA = g.getAlpha(); + g.setAlpha((int) (255 * 0.7f)); + fillRoundRect(g, hx, hy, hiW, hiH, hiH / 2); + g.setAlpha(hiA); + } + + g.popClip(); + g.setClip(origClip); + } + + private void drawCutout(Graphics g, SkinModel.Cutout c, float scale, int cx, int screenTopY) { + g.setColor(0x000000); + int cw = Math.round(c.w * scale); + int ch = Math.round(c.h * scale); + int ox = cx + Math.round(c.x * scale); + int oy = screenTopY + Math.round(c.y * scale); + if (SkinModel.CUTOUT_NOTCH.equals(c.type)) { + int x0 = ox - cw / 2; + int rad = Math.max(2, Math.round(8 * scale)); + // Top straight portion + g.fillRect(x0, screenTopY, cw, ch - rad); + // Bottom rounded portion (use round rect, clipping the top half off via overdrawing top) + g.fillRoundRect(x0, screenTopY + ch - rad * 2, cw, rad * 2, rad * 2, rad * 2); + // Cover the top half of the round rect + g.fillRect(x0, screenTopY, cw, ch - rad); + } else if (SkinModel.CUTOUT_ISLAND.equals(c.type)) { + int x0 = ox - cw / 2; + fillRoundRect(g, x0, oy, cw, ch, ch); + } else if (SkinModel.CUTOUT_HOLE.equals(c.type)) { + int r = cw / 2; + g.fillArc(ox - r, oy, cw, ch, 0, 360); + } + } + + /** + * fillRoundRect with corner radius in pixels (CN1 takes diameter for arc width). + */ + private static void fillRoundRect(Graphics g, int x, int y, int w, int h, int radius) { + if (w <= 0 || h <= 0) return; + int d = Math.max(0, Math.min(radius * 2, Math.min(w, h))); + g.fillRoundRect(x, y, w, h, d, d); + } + + private static void clipRoundRect(Graphics g, int x, int y, int w, int h, int radius) { + // CN1 clipRect is rectangular; approximate by clipping to bounding box only. + // The body image sits inside a rounded gradient; image source mostly fits the + // bezel region so the rectangular clip is acceptable. + g.clipRect(x, y, w, h); + } + + private static void drawDashedRoundRect(Graphics g, int x, int y, int w, int h, int radius, int dash, int gap) { + // CN1 doesn't expose dashed strokes — approximate with a solid round outline. + int d = Math.max(0, Math.min(radius * 2, Math.min(w, h))); + g.drawRoundRect(x, y, w - 1, h - 1, d, d); + } +} diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index c3137e1241..544aa20821 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -1,1526 +1,1516 @@ package com.codename1.tools.skindesigner; -import com.codename1.system.Lifecycle; import com.codename1.components.OnOffSwitch; -import com.codename1.components.ScaleImageLabel; -import com.codename1.components.SplitPane; import com.codename1.components.ToastBar; import com.codename1.io.FileSystemStorage; -import com.codename1.ui.Display; -import com.codename1.ui.CN; -import com.codename1.ui.Form; -import com.codename1.ui.Label; import com.codename1.io.Log; import com.codename1.io.Preferences; import com.codename1.io.Properties; import com.codename1.io.Storage; import com.codename1.io.Util; -import com.codename1.ui.BrowserComponent; +import com.codename1.system.Lifecycle; import com.codename1.ui.Button; +import com.codename1.ui.CN; import com.codename1.ui.Component; import com.codename1.ui.Container; +import com.codename1.ui.Display; import com.codename1.ui.FontImage; +import com.codename1.ui.Form; import com.codename1.ui.Graphics; import com.codename1.ui.Image; -import com.codename1.ui.Tabs; -import com.codename1.ui.TextArea; +import com.codename1.ui.Label; import com.codename1.ui.TextField; -import com.codename1.ui.geom.Rectangle; import com.codename1.ui.layouts.BorderLayout; import com.codename1.ui.layouts.BoxLayout; import com.codename1.ui.layouts.FlowLayout; import com.codename1.ui.layouts.GridLayout; -import com.codename1.ui.spinner.Picker; +import com.codename1.ui.layouts.LayeredLayout; import com.codename1.ui.util.ImageIO; import com.codename1.ui.util.UITimer; -import com.codename1.ui.validation.NumericConstraint; -import com.codename1.ui.validation.Validator; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import net.sf.zipme.ZipEntry; import net.sf.zipme.ZipOutputStream; +/** + * Wizard-style skin designer. + * + * Step 0 — pick a device from {@link DeviceDatabase}. + * Step 1 — pick a starting source (shape preset, uploaded image, or blank). + * Step 2 — editor with live preview and a sidebar (Shape / Cutouts / Info). + * Step 3 — done summary; the .skin file is written and a JS-port download + * dialog is triggered. + */ public class SkinDesigner extends Lifecycle { - private static final String[] NATIVE_THEMES = {"iOS", "Android", "Windows"}; - private static final String[] NATIVE_THEME_FILES = {"iOS7Theme.res", "android_holo_light.res", "winTheme.res"}; + private static final String PREF_STEP = "wiz.step"; + private static final String PREF_DEVICE = "wiz.deviceId"; + private static final String PREF_SOURCE = "wiz.source"; + private static final String PREF_HAS_IMAGE = "wiz.hasImage"; + private static final String IMAGE_STORAGE = "wiz.image.png"; + + private static final int STEP_DEVICE = 0; + private static final int STEP_SOURCE = 1; + private static final int STEP_EDIT = 2; + private static final int STEP_DONE = 3; + private boolean websiteDarkMode; + private Form form; + private int step; + private DeviceDatabase.Device device; + private String source; + private SkinModel skin = new SkinModel(); + private Image bodyImage; + private Container bodyHolder; + private Container header; + private Container statusbar; + private Label statusName; + private Label statusSpec; + private Container stepperRow; + private Container wizardNav; @Override public void runApp() { CN.setProperty("platformHint.javascript.beforeUnloadMessage", null); - Form skinDesignerForm = new Form("Skin Designer", new BorderLayout()); - skinDesignerForm.setTitle(""); - skinDesignerForm.setUIID("SkinDesignerForm"); - Validator vl = new Validator(); - final Tabs details = new Tabs(); - details.getTabsContainer().setUIID("SkinDesignerTabsContainer"); - details.getTabsContainer().setScrollableX(false); - final ImageSettings[] imPortraitRef = new ImageSettings[1]; - final ImageSettings[] imLandscapeRef = new ImageSettings[1]; - - skinDesignerForm.add(BorderLayout.CENTER, details); - - Picker nativeTheme = new Picker(); - nativeTheme.setUIID("SkinDesignerField"); - nativeTheme.setStrings(NATIVE_THEMES); - nativeTheme.setSelectedString(NATIVE_THEMES[0]); - nativeTheme.setRenderingPrototype("XXXXXXXXXXXXXXXXXXX"); - autoSave(nativeTheme, "nativeTheme"); - - Picker platformName = new Picker(); - platformName.setUIID("SkinDesignerField"); - platformName.setStrings("ios", "and", "win","rim", "se"); - platformName.setSelectedString("ios"); - platformName.setRenderingPrototype("XXXX"); - autoSave(platformName, "platformName"); - - OnOffSwitch tablet = new OnOffSwitch(); - tablet.setUIID("SkinDesignerField"); - tablet.setValue(false); - autoSave(tablet, "tablet"); - - TextField systemFontFamily = new TextField("Helvetica", "System Font Family", 20, TextField.ANY); - TextField proportionalFontFamily = new TextField("Helvetica", "Proportional Font Family", 20, TextField.ANY); - TextField monospaceFontFamily = new TextField("Courier", "Monospace Font Family", 20, TextField.ANY); - styleFields(systemFontFamily, proportionalFontFamily, monospaceFontFamily); - autoSave(systemFontFamily, "systemFontFamily"); - autoSave(proportionalFontFamily, "proportionalFontFamily"); - autoSave(monospaceFontFamily, "monospaceFontFamily"); - - TextField smallFontSize = new TextField("11", "Small Font Size", 20, TextField.NUMERIC); - TextField mediumFontSize = new TextField("14", "Medium Font Size", 20, TextField.NUMERIC); - TextField largeFontSize = new TextField("20", "Large Font Size", 20, TextField.NUMERIC); - styleFields(smallFontSize, mediumFontSize, largeFontSize); - autoSave(smallFontSize, "smallFontSize"); - autoSave(mediumFontSize, "mediumFontSize"); - autoSave(largeFontSize, "largeFontSize"); - - TextField pixelRatio = new TextField("6.4173236936575", "Pixel Ratio - pixels per millimeter", 20, TextField.DECIMAL); - pixelRatio.setUIID("SkinDesignerField"); - autoSave(pixelRatio, "pixelRatio"); - - Picker overrideNamePrimary = new Picker(); - overrideNamePrimary.setUIID("SkinDesignerField"); - overrideNamePrimary.setStrings("phone", "tablet", "desktop"); - overrideNamePrimary.setSelectedString("phone"); - overrideNamePrimary.setRenderingPrototype("XXXXXXXX"); - autoSave(overrideNamePrimary, "overrideNamePrimary"); - - Picker overrideNameSecondary = new Picker(); - overrideNameSecondary.setUIID("SkinDesignerField"); - overrideNameSecondary.setStrings("ios", "android", "windows"); - overrideNameSecondary.setSelectedString("ios"); - overrideNameSecondary.setRenderingPrototype("XXXXXXXX"); - autoSave(overrideNameSecondary, "overrideNameSecondary"); - - Picker overrideNameLast = new Picker(); - overrideNameLast.setUIID("SkinDesignerField"); - overrideNameLast.setStrings("iphone", "ipad", "android-phone", "android-tablet", "desktop"); - overrideNameLast.setSelectedString("iphone"); - overrideNameLast.setRenderingPrototype("XXXXXXXX"); - autoSave(overrideNameLast, "overrideNameLast"); - - Container settingsContainer = BoxLayout.encloseY( - labeledFieldTitle("Native Theme"), - nativeTheme, - labeledFieldTitle("Platform Name"), - platformName, - BorderLayout.center(labeledFieldTitle("Tablet")).add(BorderLayout.EAST, tablet), - labeledFieldTitle(systemFontFamily.getHint()), - systemFontFamily, - labeledFieldTitle(proportionalFontFamily.getHint()), - proportionalFontFamily, - labeledFieldTitle(monospaceFontFamily.getHint()), - monospaceFontFamily, - labeledFieldTitle(smallFontSize.getHint()), - smallFontSize, - labeledFieldTitle(mediumFontSize.getHint()), - mediumFontSize, - labeledFieldTitle(largeFontSize.getHint()), - largeFontSize, - labeledFieldTitle(pixelRatio.getHint()), - pixelRatio, - labeledFieldTitle("Platform Overrides"), - BoxLayout.encloseX(overrideNamePrimary, overrideNameSecondary, overrideNameLast) - ); - settingsContainer.setUIID("SkinDesignerCard"); - settingsContainer.setScrollableY(true); - - vl.addConstraint(smallFontSize, new NumericConstraint(false, 5, 400, "Font size must be a valid integer in the 5-400 range")). - addConstraint(mediumFontSize, new NumericConstraint(false, 5, 400, "Font size must be a valid integer in the 5-400 range")). - addConstraint(largeFontSize, new NumericConstraint(false, 5, 400, "Font size must be a valid integer in the 5-400 range")). - addConstraint(pixelRatio, new NumericConstraint(true, 0.1, 60, "PixelRatio is a positive decimal size in the range of 0.1 to 60")). - setShowErrorMessageForFocusedComponent(true); - - Runnable saveAction = () -> { - byte[] data = createSkinFile(imPortraitRef[0], imLandscapeRef[0], nativeTheme, platformName, tablet, systemFontFamily, - proportionalFontFamily, monospaceFontFamily, smallFontSize, mediumFontSize, largeFontSize, - pixelRatio, overrideNamePrimary, overrideNameSecondary, overrideNameLast); - if(data != null) { - FileSystemStorage fs = FileSystemStorage.getInstance(); - try(OutputStream os = fs.openOutputStream(fs.getAppHomePath() + "skin-file.skin")) { - os.write(data); - } catch(IOException err) { - Log.e(err); - ToastBar.showErrorMessage("Error wring skin file " + err); - } - // in the JavaScript port this will trigger the download dialog - Display.getInstance().execute(fs.getAppHomePath() + "skin-file.skin"); - } - }; - - imPortraitRef[0] = createImageSettings("/skin.png", "port", vl, () -> showHelpForm(skinDesignerForm), saveAction); - imLandscapeRef[0] = createImageSettings("/skin_l.png", "lan", vl, () -> showHelpForm(skinDesignerForm), saveAction); - ImageSettings imPortrait = imPortraitRef[0]; - ImageSettings imLandscape = imLandscapeRef[0]; - details.addTab("Portrait", FontImage.MATERIAL_STAY_CURRENT_PORTRAIT, 4.5f, imPortrait.getContainer()); - details.addTab("Landscape", FontImage.MATERIAL_STAY_CURRENT_LANDSCAPE, 4.5f, imLandscape.getContainer()); - details.addTab("Settings", FontImage.MATERIAL_SETTINGS, 3.5f, settingsContainer); + websiteDarkMode = readThemeFromUrl(); + Display.getInstance().setDarkMode(websiteDarkMode); - skinDesignerForm.show(); - initThemeFromUrl(skinDesignerForm, details); - } + form = new Form("Skin Designer", new BorderLayout()); + form.setUIID("SkinDesignerForm"); + form.setTitle(""); - private Label labeledFieldTitle(String text) { - Label label = new Label(text); - label.setUIID("SkinDesignerFieldLabel"); - return label; - } + loadState(); - private void styleFields(TextField... fields) { - for (TextField field : fields) { - field.setUIID("SkinDesignerField"); - } - } + header = buildHeader(); + bodyHolder = new Container(new BorderLayout()); + bodyHolder.setUIID("SkinDesignerBody"); + statusbar = buildStatusbar(); - private void styleActionButton(Button button, char materialIcon) { - button.setUIID("SkinDesignerActionButton"); - FontImage.setMaterialIcon(button, materialIcon); - button.getAllStyles().setAlignment(Component.CENTER); - button.setGap(CN.convertToPixels(0.7f)); - } + form.add(BorderLayout.NORTH, header); + form.add(BorderLayout.CENTER, bodyHolder); + form.add(BorderLayout.SOUTH, statusbar); - private void styleIconActionButton(Button button, char materialIcon) { - styleActionButton(button, materialIcon); - button.setText(""); - button.setGap(0); - } + renderStep(); + form.show(); - private void initThemeFromUrl(Form form, Tabs details) { - websiteDarkMode = readThemeFromUrl(); - Display.getInstance().setDarkMode(websiteDarkMode); - applyWebsiteTheme(form, websiteDarkMode); - applyTabsTheme(details, websiteDarkMode); - form.refreshTheme(); UITimer.timer(900, true, form, () -> { boolean dark = readThemeFromUrl(); if (dark != websiteDarkMode) { websiteDarkMode = dark; Display.getInstance().setDarkMode(dark); - applyWebsiteTheme(form, dark); - applyTabsTheme(details, dark); + applyDarkRecursive(form); form.refreshTheme(); } }); } - private void applyTabsTheme(Tabs tabs, boolean dark) { - if (tabs == null) { - return; + // ==================================================================== + // State persistence + // ==================================================================== + + private void loadState() { + step = Preferences.get(PREF_STEP, STEP_DEVICE); + String id = Preferences.get(PREF_DEVICE, null); + device = DeviceDatabase.findById(id); + source = Preferences.get(PREF_SOURCE, null); + skin.load(); + if (device != null && skin.name == null) { + skin.resetForDevice(device); } - String tabsUiid = dark ? "SkinDesignerTabsContainerDark" : "SkinDesignerTabsContainer"; - String tabUiid = dark ? "TabDark" : "Tab"; - tabs.setUIID(tabsUiid); - tabs.setTabUIID(tabUiid); - Container tabsContainer = tabs.getTabsContainer(); - for (int i = 0; i < tabsContainer.getComponentCount(); i++) { - tabsContainer.getComponentAt(i).setUIID(tabUiid); + if (Preferences.get(PREF_HAS_IMAGE, false) && Storage.getInstance().exists(IMAGE_STORAGE)) { + try (InputStream is = Storage.getInstance().createInputStream(IMAGE_STORAGE)) { + bodyImage = Image.createImage(is); + } catch (IOException err) { + Log.e(err); + } } - tabs.refreshTheme(); - tabs.revalidate(); - } - - private boolean readThemeFromUrl() { - String href = CN.getProperty("browser.window.location.href", ""); - String theme = queryParam(href, "theme"); - if ("dark".equalsIgnoreCase(theme)) { - return true; + if (step >= STEP_SOURCE && device == null) { + step = STEP_DEVICE; } - if ("light".equalsIgnoreCase(theme)) { - return false; + if (step >= STEP_EDIT && source == null) { + step = STEP_SOURCE; } - return Display.getInstance().isDarkMode(); } - private String queryParam(String href, String name) { - if (href == null || href.length() == 0) { - return null; - } - int queryStart = href.indexOf('?'); - if (queryStart < 0 || queryStart == href.length() - 1) { - return null; - } - String query = href.substring(queryStart + 1); - int hash = query.indexOf('#'); - if (hash >= 0) { - query = query.substring(0, hash); - } - String prefix = name + "="; - String[] pairs = Util.split(query, "&"); - for (String pair : pairs) { - if (pair.startsWith(prefix) && pair.length() > prefix.length()) { - return pair.substring(prefix.length()); - } - } - return null; + private void saveState() { + Preferences.set(PREF_STEP, step); + Preferences.set(PREF_DEVICE, device == null ? null : device.id); + Preferences.set(PREF_SOURCE, source); + Preferences.set(PREF_HAS_IMAGE, bodyImage != null); + skin.save(); } - private void applyWebsiteTheme(Container component, boolean dark) { - for (int i = 0; i < component.getComponentCount(); i++) { - Component child = component.getComponentAt(i); - String uiid = child.getUIID(); - String themed = themedUiid(uiid, dark); - if (uiid != null && !uiid.equals(themed)) { - child.setUIID(themed); - } - if (child instanceof Container) { - applyWebsiteTheme((Container) child, dark); - } - } - String containerUiid = component.getUIID(); - String themedContainer = themedUiid(containerUiid, dark); - if (containerUiid != null && !containerUiid.equals(themedContainer)) { - component.setUIID(themedContainer); - } + private void restart() { + step = STEP_DEVICE; + device = null; + source = null; + skin = new SkinModel(); + bodyImage = null; + Storage.getInstance().deleteStorageFile(IMAGE_STORAGE); + Preferences.delete(PREF_STEP); + Preferences.delete(PREF_DEVICE); + Preferences.delete(PREF_SOURCE); + Preferences.delete(PREF_HAS_IMAGE); + SkinModel.clearPersisted(); + renderStep(); } - private String themedUiid(String uiid, boolean dark) { - if (uiid == null || uiid.length() == 0) { - return uiid; + // ==================================================================== + // Header / statusbar + // ==================================================================== + + private Container buildHeader() { + Label logo = new Label("CN1"); + logo.setUIID("SkinDesignerBrandLogo"); + Label title = new Label("Skin Designer"); + title.setUIID("SkinDesignerBrandTitle"); + Container brand = BoxLayout.encloseX(logo, title); + brand.setUIID("SkinDesignerBrand"); + + stepperRow = new Container(new BoxLayout(BoxLayout.X_AXIS)); + stepperRow.setUIID("SkinDesignerStepper"); + rebuildStepper(); + + wizardNav = new Container(new FlowLayout(Component.RIGHT)); + wizardNav.setUIID("SkinDesignerWizardNav"); + + Container topbar = new Container(new BorderLayout()); + topbar.setUIID("SkinDesignerTopbar"); + topbar.add(BorderLayout.WEST, brand); + topbar.add(BorderLayout.CENTER, FlowLayout.encloseCenter(stepperRow)); + topbar.add(BorderLayout.EAST, wizardNav); + return topbar; + } + + private void rebuildStepper() { + if (stepperRow == null) { + return; } - if (dark) { - if (uiid.endsWith("Dark")) { - return uiid; + stepperRow.removeAll(); + String[] labels = { "Device", "Start from", "Editor", "Save" }; + for (int i = 0; i < labels.length; i++) { + if (i > 0) { + Label sep = new Label(" "); + sep.setUIID("SkinDesignerStepperSep"); + stepperRow.add(sep); } - switch (uiid) { - case "SkinDesignerForm": - case "SkinDesignerTabsContainer": - case "SkinDesignerCard": - case "SkinDesignerField": - case "SkinDesignerFieldLabel": - case "SkinDesignerTabBar": - case "SkinDesignerTabButton": - case "SkinDesignerTabButtonSelected": - case "Toolbar": - case "Title": - case "Command": - case "Tab": - case "TabSelected": - case "TabsContainer": - return uiid + "Dark"; - default: - return uiid; + String state = i == step ? "Active" : (i < step ? "Done" : "Pending"); + Label num = new Label(i < step ? "" : String.valueOf(i + 1)); + num.setUIID("SkinDesignerStepperNum" + state); + if (i < step) { + FontImage.setMaterialIcon(num, FontImage.MATERIAL_CHECK); } + Label text = new Label(labels[i]); + text.setUIID("SkinDesignerStepperLabel" + state); + Container item = BoxLayout.encloseX(num, text); + item.setUIID("SkinDesignerStepperItem" + state); + stepperRow.add(item); } - if (!uiid.endsWith("Dark")) { - return uiid; + stepperRow.revalidate(); + } + + private void rebuildWizardNav() { + if (wizardNav == null) { + return; } - String base = uiid.substring(0, uiid.length() - "Dark".length()); - switch (base) { - case "SkinDesignerForm": - case "SkinDesignerTabsContainer": - case "SkinDesignerCard": - case "SkinDesignerField": - case "SkinDesignerFieldLabel": - case "SkinDesignerTabBar": - case "SkinDesignerTabButton": - case "SkinDesignerTabButtonSelected": - case "Toolbar": - case "Title": - case "Command": - case "Tab": - case "TabSelected": - case "TabsContainer": - return base; - default: - return uiid; + wizardNav.removeAll(); + if (step > STEP_DEVICE && step < STEP_DONE) { + Button reset = new Button("Start over"); + reset.setUIID("SkinDesignerGhostButton"); + reset.addActionListener(e -> restart()); + wizardNav.add(reset); } + wizardNav.revalidate(); } - interface ImageSettings { - Container getContainer(); - Image createSkinOverlay(); - Image getSkinImage(); - int getScreenX(); - int getScreenY(); - int getScreenWidth(); - int getScreenHeight(); - int getSafeX(); - int getSafeY(); - int getSafeWidth(); - int getSafeHeight(); - } - - private void autoSave(TextArea ta, String preferencesKey) { - String val = Preferences.get(preferencesKey, null); - if(val != null) { - ta.setText(val); - } - ta.addActionListener(e -> { - Preferences.set(preferencesKey, ta.getText()); - }); + private Container buildStatusbar() { + statusName = new Label("Ready"); + statusName.setUIID("SkinDesignerStatusName"); + statusSpec = new Label(""); + statusSpec.setUIID("SkinDesignerStatusSpec"); + Container bar = new Container(new BorderLayout()); + bar.setUIID("SkinDesignerStatusbar"); + bar.add(BorderLayout.WEST, statusName); + bar.add(BorderLayout.EAST, statusSpec); + return bar; } - private void autoSave(OnOffSwitch o, String preferencesKey) { - boolean val = Preferences.get(preferencesKey, o.isValue()); - if(val != o.isValue()) { - o.setValue(val); + private void updateStatusbar() { + if (device == null) { + statusName.setText("Ready"); + statusSpec.setText(""); + } else { + statusName.setText(skin.name + ".skin"); + statusSpec.setText(device.resolutionW + " × " + device.resolutionH + + " · " + device.ppi + " ppi · Saved locally"); } - o.addActionListener(e -> { - Preferences.set(preferencesKey, o.isValue()); - }); + statusName.getParent().revalidate(); } - private void autoSave(Picker p, String preferencesKey) { - String val = Preferences.get(preferencesKey, null); - if(val != null) { - p.setSelectedString(val); + // ==================================================================== + // Step rendering + // ==================================================================== + + private void renderStep() { + if (skin == null) { + skin = new SkinModel(); } - p.addActionListener(e -> { - Preferences.set(preferencesKey, p.getSelectedString()); - }); + if (device != null && (skin.name == null || skin.name.isEmpty())) { + skin.resetForDevice(device); + } + bodyHolder.removeAll(); + switch (step) { + case STEP_DEVICE: + bodyHolder.add(BorderLayout.CENTER, buildDeviceStep()); + break; + case STEP_SOURCE: + bodyHolder.add(BorderLayout.CENTER, buildSourceStep()); + break; + case STEP_EDIT: + bodyHolder.add(BorderLayout.CENTER, buildEditorStep()); + break; + case STEP_DONE: + bodyHolder.add(BorderLayout.CENTER, buildDoneStep()); + break; + } + rebuildStepper(); + rebuildWizardNav(); + updateStatusbar(); + applyDarkRecursive(form); + bodyHolder.revalidate(); + saveState(); } - private ImageSettings createImageSettings(String imageFile, String prefix, Validator vl, Runnable helpCallback, Runnable saveCallback) { - Image img = null; - try { - img = Image.createImage(Display.getInstance().getResourceAsStream(getClass(), imageFile)); - } catch(IOException err) { - Log.e(err); - } - ScaleImageLabel sl = new ScaleImageLabel(img); - Button imagePicker = new Button("Select Image"); - imagePicker.setUIID("SkinDesignerActionButton"); - imagePicker.setTooltip("Choose a skin image from your gallery"); - imagePicker.addActionListener((e) -> { - Display.getInstance().openGallery((ee) -> { - if(ee != null && ee.getSource() != null) { - try { - String fileName = (String)ee.getSource(); - sl.setIcon(Image.createImage(fileName)); - sl.getParent().revalidate(); - Util.copy(FileSystemStorage.getInstance().openInputStream(fileName), - Storage.getInstance().createOutputStream(prefix + ".png")); - } catch(IOException err) { - ToastBar.showErrorMessage("Error Loading Image: " + err); - } + private void goToStep(int s) { + step = Math.max(STEP_DEVICE, Math.min(STEP_DONE, s)); + renderStep(); + } + + // ==================================================================== + // Step 0 — pick device + // ==================================================================== + + private Container buildDeviceStep() { + Container root = new Container(new BorderLayout()); + root.setUIID("SkinDesignerStepRoot"); + + Container heading = new Container(new BoxLayout(BoxLayout.Y_AXIS)); + heading.setUIID("SkinDesignerStepHead"); + Label h1 = new Label("Which device is this skin for?"); + h1.setUIID("SkinDesignerH1"); + Label sub = new Label("Pick your device. We'll prefill resolution, PPI, safe-area insets, and fonts."); + sub.setUIID("SkinDesignerSub"); + heading.add(h1); + heading.add(sub); + + TextField search = new TextField("", "Search devices…", 24, TextField.ANY); + search.setUIID("SkinDesignerSearchField"); + + String[] filterIds = { "all", "phone", "tablet", "fold" }; + String[] filterLabels = { "All", "Phones", "Tablets", "Foldables" }; + final String[] activeFilter = { "all" }; + Button[] filters = new Button[filterIds.length]; + Container filterRow = new Container(new FlowLayout(Component.CENTER)); + filterRow.setUIID("SkinDesignerFilterRow"); + + Container grid = new Container(new BoxLayout(BoxLayout.Y_AXIS)); + grid.setUIID("SkinDesignerDeviceGrid"); + grid.setScrollableY(true); + + Runnable refresh = () -> rebuildDeviceGrid(grid, search.getText(), activeFilter[0]); + + for (int i = 0; i < filterIds.length; i++) { + final String id = filterIds[i]; + Button b = new Button(filterLabels[i]); + b.setUIID("all".equals(id) ? "SkinDesignerFilterTagActive" : "SkinDesignerFilterTag"); + b.addActionListener(e -> { + activeFilter[0] = id; + for (int j = 0; j < filters.length; j++) { + filters[j].setUIID(filterIds[j].equals(id) ? "SkinDesignerFilterTagActive" : "SkinDesignerFilterTag"); } - }, Display.GALLERY_IMAGE); - }); - if(Storage.getInstance().exists(prefix + ".png")) { - try(InputStream is = Storage.getInstance().createInputStream(prefix + ".png")) { - sl.setIcon(Image.createImage(is)); - } catch(IOException err) { - Log.e(err); - } + refresh.run(); + }); + filters[i] = b; + filterRow.add(b); } - final TextField screenWidthPixels = new TextField("320", "Width", 8, TextField.NUMERIC); - final TextField screenHeightPixels = new TextField("480", "Height", 8, TextField.NUMERIC); - final TextField screenPositionX = new TextField("40", "X", 8, TextField.NUMERIC); - final TextField screenPositionY = new TextField("40", "Y", 8, TextField.NUMERIC); - final TextField safeX = new TextField("40", "Safe X", 8, TextField.NUMERIC); - final TextField safeY = new TextField("40", "Safe Y", 8, TextField.NUMERIC); - final TextField safeWidth = new TextField("320", "Safe Width", 8, TextField.NUMERIC); - final TextField safeHeight = new TextField("480", "Safe Height", 8, TextField.NUMERIC); - final TextField floodTolerance = new TextField("24", "Color Tol (0-441)", 4, TextField.NUMERIC); - if("lan".equals(prefix) && Preferences.get("lanX", null) == null) { - String portraitX = Preferences.get("portX", null); - String portraitY = Preferences.get("portY", null); - String portraitWidth = Preferences.get("portWidth", null); - String portraitHeight = Preferences.get("portHeight", null); - if(portraitX != null && portraitY != null && portraitWidth != null && portraitHeight != null) { - screenPositionX.setText(portraitY); - screenPositionY.setText(portraitX); - screenWidthPixels.setText(portraitHeight); - screenHeightPixels.setText(portraitWidth); - safeX.setText(portraitY); - safeY.setText(portraitX); - safeWidth.setText(portraitHeight); - safeHeight.setText(portraitWidth); + search.addActionListener(e -> refresh.run()); + search.addDataChangedListener((type, index) -> refresh.run()); + + Container topInner = BoxLayout.encloseY(heading, FlowLayout.encloseCenter(search), filterRow); + topInner.setUIID("SkinDesignerStepHeadInner"); + + // Footer with Continue button + Button cont = new Button("Continue"); + cont.setUIID("SkinDesignerPrimaryButton"); + FontImage.setMaterialIcon(cont, FontImage.MATERIAL_CHEVRON_RIGHT); + cont.setTextPosition(Component.LEFT); + cont.setEnabled(device != null); + cont.addActionListener(e -> { + if (device != null) { + goToStep(STEP_SOURCE); } + }); + Container footer = FlowLayout.encloseRight(cont); + footer.setUIID("SkinDesignerFooter"); + + rebuildDeviceGrid(grid, "", "all"); + + Container scroll = new Container(new BorderLayout()); + scroll.setUIID("SkinDesignerStepScroll"); + scroll.add(BorderLayout.NORTH, topInner); + scroll.add(BorderLayout.CENTER, grid); + + // Keep a handle to refresh footer enabled state as devices are selected + bodyHolder.putClientProperty("deviceContinue", cont); + + root.add(BorderLayout.CENTER, scroll); + root.add(BorderLayout.SOUTH, footer); + return root; + } + + private void rebuildDeviceGrid(Container grid, String query, String filter) { + grid.removeAll(); + Map> grouped = new LinkedHashMap<>(); + for (DeviceDatabase.Device d : DeviceDatabase.all()) { + if (!d.matchesFormFilter(filter)) continue; + if (!d.matchesQuery(query)) continue; + List bucket = grouped.get(d.brand); + if (bucket == null) { + bucket = new ArrayList<>(); + grouped.put(d.brand, bucket); + } + bucket.add(d); + } + if (grouped.isEmpty()) { + Label none = new Label("No devices match"); + none.setUIID("SkinDesignerEmptyHint"); + grid.add(none); + grid.revalidate(); + return; } - styleFields(screenWidthPixels, screenHeightPixels, screenPositionX, screenPositionY); - styleFields(safeX, safeY, safeWidth, safeHeight, floodTolerance); - autoSave(screenWidthPixels, prefix + "Width"); - autoSave(screenHeightPixels, prefix + "Height"); - autoSave(screenPositionX, prefix + "X"); - autoSave(screenPositionY, prefix + "Y"); - autoSave(safeX, prefix + "SafeX"); - autoSave(safeY, prefix + "SafeY"); - autoSave(safeWidth, prefix + "SafeWidth"); - autoSave(safeHeight, prefix + "SafeHeight"); - autoSave(floodTolerance, prefix + "FloodTolerance"); - vl.addConstraint(screenWidthPixels, new NumericConstraint(false, 20, 5000, "Screen size must be a valid integer in the 20-5000 range")). - addConstraint(screenHeightPixels, new NumericConstraint(false, 20, 5000, "Screen size must be a valid integer in the 20-5000 range")). - addConstraint(screenPositionX, new NumericConstraint(false, 0, 5000, "Screen position must be a valid integer in the 0-5000 range")). - addConstraint(screenPositionY, new NumericConstraint(false, 0, 5000, "Screen position must be a valid integer in the 0-5000 range")). - addConstraint(safeX, new NumericConstraint(false, 0, 5000, "Safe area X must be a valid integer in the 0-5000 range")). - addConstraint(safeY, new NumericConstraint(false, 0, 5000, "Safe area Y must be a valid integer in the 0-5000 range")). - addConstraint(safeWidth, new NumericConstraint(false, 1, 5000, "Safe area width must be a valid integer in the 1-5000 range")). - addConstraint(safeHeight, new NumericConstraint(false, 1, 5000, "Safe area height must be a valid integer in the 1-5000 range")). - addConstraint(floodTolerance, new NumericConstraint(false, 0, 441, "Tolerance must be 0-441")); - if("lan".equals(prefix)) { - String portraitX = Preferences.get("portX", null); - String portraitY = Preferences.get("portY", null); - String portraitWidth = Preferences.get("portWidth", null); - String portraitHeight = Preferences.get("portHeight", null); - if(portraitX != null && portraitY != null && portraitWidth != null && portraitHeight != null && - portraitX.equals(screenPositionX.getText()) && portraitY.equals(screenPositionY.getText()) && - portraitWidth.equals(screenWidthPixels.getText()) && portraitHeight.equals(screenHeightPixels.getText())) { - screenPositionX.setText(portraitY); - screenPositionY.setText(portraitX); - screenWidthPixels.setText(portraitHeight); - screenHeightPixels.setText(portraitWidth); - safeX.setText(portraitY); - safeY.setText(portraitX); - safeWidth.setText(portraitHeight); - safeHeight.setText(portraitWidth); + for (Map.Entry> entry : grouped.entrySet()) { + Label brand = new Label(entry.getKey() + " · " + entry.getValue().size()); + brand.setUIID("SkinDesignerGroupLabel"); + grid.add(brand); + Container row = new Container(new GridLayout(1, Math.max(1, gridColumns()))); + row.setUIID("SkinDesignerCardRow"); + int col = 0; + int columns = Math.max(1, gridColumns()); + for (DeviceDatabase.Device d : entry.getValue()) { + if (col >= columns) { + grid.add(row); + row = new Container(new GridLayout(1, columns)); + row.setUIID("SkinDesignerCardRow"); + col = 0; + } + row.add(buildDeviceCard(d)); + col++; + } + // pad row so last items align left + while (col < columns) { + row.add(new Label(" ")); + col++; } + grid.add(row); } + grid.revalidate(); + } - final OnOffSwitch useSafeArea = new OnOffSwitch(); - useSafeArea.setUIID("SkinDesignerField"); - useSafeArea.setValue(false); - useSafeArea.setTooltip("Enable a separate safe area inside the screen"); - autoSave(useSafeArea, prefix + "UseSafeArea"); - Runnable applySafeEnabled = () -> { - boolean enabled = useSafeArea.isValue(); - safeX.setEnabled(enabled); - safeY.setEnabled(enabled); - safeWidth.setEnabled(enabled); - safeHeight.setEnabled(enabled); - }; - applySafeEnabled.run(); - useSafeArea.addActionListener(e -> { - boolean enabled = useSafeArea.isValue(); - if (enabled) { - int sx = screenPositionX.getAsInt(0); - int sy = screenPositionY.getAsInt(0); - int sw = screenWidthPixels.getAsInt(0); - int sh = screenHeightPixels.getAsInt(0); - int curX = safeX.getAsInt(sx); - int curY = safeY.getAsInt(sy); - int curW = safeWidth.getAsInt(sw); - int curH = safeHeight.getAsInt(sh); - if (curW < 1 || curW > sw) { curW = sw; } - if (curH < 1 || curH > sh) { curH = sh; } - if (curX < sx) { curX = sx; } - if (curY < sy) { curY = sy; } - if (curX + curW > sx + sw) { curX = sx + sw - curW; } - if (curY + curH > sy + sh) { curY = sy + sh - curH; } - safeX.setText("" + curX); - safeY.setText("" + curY); - safeWidth.setText("" + curW); - safeHeight.setText("" + curH); + private int gridColumns() { + int w = Display.getInstance().getDisplayWidth(); + int cardW = CN.convertToPixels(50); + return Math.max(1, w / cardW); + } + + private Container buildDeviceCard(DeviceDatabase.Device d) { + Container card = new Container(new BoxLayout(BoxLayout.Y_AXIS)); + boolean selected = device != null && device.id.equals(d.id); + card.setUIID(selected ? "SkinDesignerDeviceCardSelected" : "SkinDesignerDeviceCard"); + + Label osMark = new Label(); + osMark.setUIID("SkinDesignerOsMark"); + FontImage.setMaterialIcon(osMark, "ios".equals(d.platformName) + ? FontImage.MATERIAL_PHONE_IPHONE + : FontImage.MATERIAL_PHONE_ANDROID); + Label name = new Label(d.name); + name.setUIID("SkinDesignerDeviceName"); + Container top = new Container(new BorderLayout()); + top.add(BorderLayout.WEST, osMark); + top.add(BorderLayout.CENTER, name); + if (selected) { + Label check = new Label(); + check.setUIID("SkinDesignerDeviceCheck"); + FontImage.setMaterialIcon(check, FontImage.MATERIAL_CHECK); + top.add(BorderLayout.EAST, check); + } + card.add(top); + + Label spec = new Label(d.resolutionW + "×" + d.resolutionH + + " · " + d.ppi + "ppi · " + d.screenSize + "\""); + spec.setUIID("SkinDesignerDeviceSpec"); + card.add(spec); + + card.setLeadComponent(name); + card.addPointerReleasedListener(e -> { + device = d; + skin.resetForDevice(d); + Button cont = (Button) bodyHolder.getClientProperty("deviceContinue"); + if (cont != null) { + cont.setEnabled(true); } - applySafeEnabled.run(); + renderStep(); }); + return card; + } - Button aim = new Button(); - styleIconActionButton(aim, FontImage.MATERIAL_PAN_TOOL); - aim.setTooltip("Visually position the screen and safe area"); - - aim.addActionListener(e -> - aimPosition(sl.getIcon(), - screenPositionX, - screenPositionY, - screenWidthPixels, - screenHeightPixels, - safeX, - safeY, - safeWidth, - safeHeight, - useSafeArea)); - - Button helpButton = new Button(); - styleIconActionButton(helpButton, FontImage.MATERIAL_HELP); - helpButton.setTooltip("Open help"); - helpButton.addActionListener(e -> helpCallback.run()); - - Button saveButton = new Button(); - styleIconActionButton(saveButton, FontImage.MATERIAL_SAVE); - saveButton.setTooltip("Save the skin file"); - saveButton.addActionListener(e -> saveCallback.run()); - - ScaleImageLabel maskLabel = new ScaleImageLabel(); - OnOffSwitch useMask = new OnOffSwitch(); - useMask.setValue(false); - useMask.setUIID("SkinDesignerField"); - useMask.setTooltip("Use the detected mask instead of a simple rectangle"); - autoSave(useMask, prefix + "UseMask"); - Button detectScreenButton = new Button("Detect Screen by Color"); - detectScreenButton.setUIID("SkinDesignerActionButton"); - detectScreenButton.setTooltip("Auto-detect the screen area via flood-fill from the center pixel"); - detectScreenButton.addActionListener(e -> { - Image source = sl.getIcon(); - if(source == null) { - ToastBar.showErrorMessage("Please select a skin image first"); - return; - } - int seedX = screenPositionX.getAsInt(0) + (screenWidthPixels.getAsInt(0) / 2); - int seedY = screenPositionY.getAsInt(0) + (screenHeightPixels.getAsInt(0) / 2); - Image generatedMask = createFloodFillMask(source, - seedX, - seedY, - floodTolerance.getAsInt(24)); - if(generatedMask != null) { - maskLabel.setIcon(generatedMask); - useMask.setValue(true); - maskLabel.getParent().revalidate(); - try(OutputStream os = Storage.getInstance().createOutputStream(prefix + ".mask.png")) { - ImageIO.getImageIO().save(generatedMask, os, ImageIO.FORMAT_PNG, 1); - } catch(IOException err) { - Log.e(err); - ToastBar.showErrorMessage("Error saving generated mask: " + err.getMessage()); + // ==================================================================== + // Step 1 — pick source + // ==================================================================== + + private Container buildSourceStep() { + Container root = new Container(new BorderLayout()); + root.setUIID("SkinDesignerStepRoot"); + + Label h1 = new Label("How would you like to start?"); + h1.setUIID("SkinDesignerH1"); + Label sub = new Label("Build a skin for " + device.name + "."); + sub.setUIID("SkinDesignerSub"); + Container heading = BoxLayout.encloseY(h1, sub); + heading.setUIID("SkinDesignerStepHead"); + + Container cards = new Container(new GridLayout(1, 3)); + cards.setUIID("SkinDesignerSourceRow"); + cards.add(buildSourceCard("Pick a shape", + "Start from a common phone silhouette and tweak dimensions and cutouts.", + FontImage.MATERIAL_PHONE_IPHONE, + SkinModel.SOURCE_SHAPE)); + cards.add(buildSourceCard("Upload an image", + "Use a render or photo of the device. Position the screen rectangle and mark cutouts on top.", + FontImage.MATERIAL_IMAGE, + SkinModel.SOURCE_IMAGE)); + cards.add(buildSourceCard("Blank rectangle", + "Plain outline with the screen filling the whole skin. Useful when you don't need any cutouts.", + FontImage.MATERIAL_CROP_DIN, + SkinModel.SOURCE_BLANK)); + + Container body = BoxLayout.encloseY(heading, cards); + body.setScrollableY(true); + body.setUIID("SkinDesignerStepBody"); + + Button back = new Button("Back"); + back.setUIID("SkinDesignerSecondaryButton"); + FontImage.setMaterialIcon(back, FontImage.MATERIAL_CHEVRON_LEFT); + back.addActionListener(e -> goToStep(STEP_DEVICE)); + Container footer = FlowLayout.encloseIn(back); + footer.setUIID("SkinDesignerFooter"); + + root.add(BorderLayout.CENTER, body); + root.add(BorderLayout.SOUTH, footer); + return root; + } + + private Container buildSourceCard(String title, String desc, char icon, String sourceId) { + Container card = new Container(new BoxLayout(BoxLayout.Y_AXIS)); + card.setUIID("SkinDesignerSourceCard"); + + Label illustration = new Label(); + illustration.setUIID("SkinDesignerSourceIll"); + FontImage.setMaterialIcon(illustration, icon, 8.0f); + card.add(illustration); + + Label h3 = new Label(title); + h3.setUIID("SkinDesignerH3"); + card.add(h3); + + Label p = new Label(desc); + p.setUIID("SkinDesignerSourceP"); + card.add(p); + + card.setLeadComponent(h3); + card.addPointerReleasedListener(e -> { + source = sourceId; + if (SkinModel.SOURCE_BLANK.equals(sourceId)) { + skin.cutouts.clear(); + skin.bezel = 0; + skin.cornerR = 4; + skin.homeIndicator = false; + } else if (SkinModel.SOURCE_IMAGE.equals(sourceId)) { + if (bodyImage == null) { + pickImage(() -> goToStep(STEP_EDIT)); + return; } } + goToStep(STEP_EDIT); }); + return card; + } - if(Storage.getInstance().exists(prefix + ".mask.png")) { - try(InputStream is = Storage.getInstance().createInputStream(prefix + ".mask.png")) { - maskLabel.setIcon(Image.createImage(is)); - } catch(IOException err) { - Log.e(err); - } - } + // ==================================================================== + // Step 2 — editor + // ==================================================================== - Container actionButtons = FlowLayout.encloseCenter(aim, helpButton, saveButton); - Container detectionButtons = FlowLayout.encloseCenter(detectScreenButton, floodTolerance, useMask); - Container safeAreaHeader = BorderLayout.center(labeledFieldTitle("Safe Area (X/Y/Width/Height)")) - .add(BorderLayout.EAST, useSafeArea); - Container controls = BoxLayout.encloseY( - imagePicker, - labeledFieldTitle("Screen Position (X/Y/Width/Height)"), - GridLayout.encloseIn(4, screenPositionX, screenPositionY, screenWidthPixels, screenHeightPixels), - safeAreaHeader, - GridLayout.encloseIn(4, safeX, safeY, safeWidth, safeHeight), - labeledFieldTitle("Screen Mask Detection"), - detectionButtons, - actionButtons - ); - controls.setUIID("SkinDesignerCard"); - controls.setScrollableY(true); - Container preview = BoxLayout.encloseY(sl); - preview.setUIID("SkinDesignerCard"); - preview.setScrollableY(true); - - int splitType = "lan".equals(prefix) ? SplitPane.VERTICAL_SPLIT : SplitPane.HORIZONTAL_SPLIT; - Component split = new SplitPane(splitType, controls, preview, "35%", "45%", "55%"); - final Container cnt = BorderLayout.center(split); - cnt.setUIID("SkinDesignerCard"); - return new ImageSettings() { - @Override - public Container getContainer() { - return cnt; - } + private DevicePreview livePreview; + private Container cutoutListHolder; + private int selectedCutout = -1; - @Override - public Image getSkinImage() { - Image img = sl.getIcon(); - int[] data = img.getRGB(); - int width = img.getWidth(); - int height = img.getHeight(); - Image mask = maskLabel.getIcon(); - if(useMask.isValue() && mask != null && mask.getWidth() == width && mask.getHeight() == height) { - int[] maskRgb = mask.getRGB(); - for(int i = 0 ; i < maskRgb.length ; i++) { - if(maskRgb[i] != 0xff000000) { - data[i] = 0; - } - } - } else { - Rectangle screen = new Rectangle(screenPositionX.getAsInt(0), screenPositionY.getAsInt(0), - screenWidthPixels.getAsInt(50), screenHeightPixels.getAsInt(50)); - for(int x = 0 ; x < width ; x++) { - for(int y = 0 ; y < height ; y++) { - if(screen.contains(x, y, 1, 1)) { - data[y * width + x] = 0; - } - } - } - } + private Container buildEditorStep() { + Container root = new Container(new BorderLayout()); + root.setUIID("SkinDesignerStepRoot"); - return Image.createImage(data, width, height); - } + livePreview = new DevicePreview(false); + livePreview.setSkin(skin); + if (SkinModel.SOURCE_IMAGE.equals(source) && bodyImage != null) { + livePreview.setBodyImage(bodyImage); + } - @Override - public Image createSkinOverlay() { - Image skinImage = getSkinImage(); - if(skinImage == null) { - return null; - } - Image m = Image.createImage(skinImage.getWidth(), skinImage.getHeight(), 0); - Graphics g = m.getGraphics(); - g.setColor(0); - Image mask = maskLabel.getIcon(); - if(useMask.isValue() && mask != null && mask.getWidth() == skinImage.getWidth() && mask.getHeight() == skinImage.getHeight()) { - int[] maskRgb = mask.getRGB(); - int w = mask.getWidth(); - int h = mask.getHeight(); - for(int x = 0; x < w; x++) { - for(int y = 0; y < h; y++) { - if(maskRgb[y * w + x] == 0xff000000) { - g.drawLine(x, y, x, y); - } - } - } - } else { - g.fillRect(screenPositionX.getAsInt(0), screenPositionY.getAsInt(0), - screenWidthPixels.getAsInt(50), screenHeightPixels.getAsInt(50)); + Container stage = new Container(new LayeredLayout()); + stage.setUIID("SkinDesignerStage"); + Container previewWrap = new Container(new FlowLayout(Component.CENTER, Component.CENTER)); + previewWrap.add(livePreview); + stage.add(previewWrap); + + Container chips = new Container(new BoxLayout(BoxLayout.X_AXIS)); + chips.setUIID("SkinDesignerStageChips"); + chips.add(infoChip("Screen", device.resolutionW + "×" + device.resolutionH)); + chips.add(infoChip("Cutouts", String.valueOf(skin.cutouts.size()))); + Container chipsLayer = new Container(new FlowLayout(Component.LEFT, Component.TOP)); + chipsLayer.add(chips); + stage.add(chipsLayer); + + Container sidebar = buildSidebar(); + + // Use a 65/35 split via a container with computed widths + Container split = new Container(new BorderLayout()); + split.add(BorderLayout.CENTER, stage); + split.add(BorderLayout.EAST, sidebar); + sidebar.setPreferredW(CN.convertToPixels(60)); + + root.add(BorderLayout.CENTER, split); + return root; + } + + private Container infoChip(String label, String value) { + Label k = new Label(label); + k.setUIID("SkinDesignerChipKey"); + Label v = new Label(value); + v.setUIID("SkinDesignerChipValue"); + Container chip = BoxLayout.encloseX(k, v); + chip.setUIID("SkinDesignerInfoChip"); + return chip; + } + + private final String[] sidebarTabIds = { "shape", "cutouts", "info" }; + private String activeSidebarTab = "shape"; + private Container sidebarBody; + + private Container buildSidebar() { + Container sidebar = new Container(new BorderLayout()); + sidebar.setUIID("SkinDesignerSidebar"); + + Container tabs = new Container(new GridLayout(1, sidebarTabIds.length)); + tabs.setUIID("SkinDesignerSidebarTabs"); + Button[] tabBtns = new Button[sidebarTabIds.length]; + String[] tabLabels = { "Shape", "Cutouts", "Info" }; + for (int i = 0; i < sidebarTabIds.length; i++) { + final String id = sidebarTabIds[i]; + Button t = new Button(tabLabels[i]); + t.setUIID(id.equals(activeSidebarTab) ? "SkinDesignerSidebarTabActive" : "SkinDesignerSidebarTab"); + t.addActionListener(e -> { + activeSidebarTab = id; + for (int j = 0; j < tabBtns.length; j++) { + tabBtns[j].setUIID(sidebarTabIds[j].equals(id) + ? "SkinDesignerSidebarTabActive" + : "SkinDesignerSidebarTab"); } - return m; - } + rebuildSidebarBody(); + }); + tabBtns[i] = t; + tabs.add(t); + } - @Override - public int getScreenX() { - return screenPositionX.getAsInt(0); - } + sidebarBody = new Container(new BoxLayout(BoxLayout.Y_AXIS)); + sidebarBody.setUIID("SkinDesignerSidebarBody"); + sidebarBody.setScrollableY(true); + rebuildSidebarBody(); + + Button back = new Button("Back"); + back.setUIID("SkinDesignerSecondaryButton"); + FontImage.setMaterialIcon(back, FontImage.MATERIAL_CHEVRON_LEFT); + back.addActionListener(e -> goToStep(STEP_SOURCE)); + + Button finish = new Button("Finish"); + finish.setUIID("SkinDesignerPrimaryButton"); + FontImage.setMaterialIcon(finish, FontImage.MATERIAL_CHEVRON_RIGHT); + finish.setTextPosition(Component.LEFT); + finish.addActionListener(e -> goToStep(STEP_DONE)); + + Container foot = new Container(new BorderLayout()); + foot.setUIID("SkinDesignerSidebarFoot"); + foot.add(BorderLayout.WEST, back); + foot.add(BorderLayout.EAST, finish); + + sidebar.add(BorderLayout.NORTH, tabs); + sidebar.add(BorderLayout.CENTER, sidebarBody); + sidebar.add(BorderLayout.SOUTH, foot); + return sidebar; + } - @Override - public int getScreenY() { - return screenPositionY.getAsInt(0); - } + private void rebuildSidebarBody() { + sidebarBody.removeAll(); + if ("shape".equals(activeSidebarTab)) { + buildShapeTab(sidebarBody); + } else if ("cutouts".equals(activeSidebarTab)) { + buildCutoutsTab(sidebarBody); + } else { + buildInfoTab(sidebarBody); + } + sidebarBody.revalidate(); + applyDarkRecursive(sidebarBody); + } - @Override - public int getScreenWidth() { - return screenWidthPixels.getAsInt(50); - } + private void buildShapeTab(Container parent) { + if (SkinModel.SOURCE_SHAPE.equals(source)) { + parent.add(sectionLabel("PRESET")); + parent.add(buildPresetGrid()); + } else if (SkinModel.SOURCE_IMAGE.equals(source)) { + Label help = new Label("Upload a device image. The screen rectangle and cutouts will be positioned on top."); + help.setUIID("SkinDesignerHelpBlock"); + parent.add(help); + Button upload = new Button(bodyImage != null ? "Replace image" : "Upload image"); + upload.setUIID("SkinDesignerSecondaryButton"); + FontImage.setMaterialIcon(upload, FontImage.MATERIAL_FILE_UPLOAD); + upload.addActionListener(e -> pickImage(() -> { + livePreview.setBodyImage(bodyImage); + rebuildSidebarBody(); + })); + parent.add(upload); + } - @Override - public int getScreenHeight() { - return screenHeightPixels.getAsInt(50); - } + parent.add(sectionLabel("DIMENSIONS")); + parent.add(numericPair("Corner radius", "px", skin.cornerR, v -> { + skin.cornerR = Math.max(0, v); + livePreview.repaint(); + saveState(); + }, "Bezel", "px", skin.bezel, v -> { + skin.bezel = Math.max(0, v); + livePreview.repaint(); + saveState(); + })); + + parent.add(boolPair("Home indicator", skin.homeIndicator, v -> { + skin.homeIndicator = v; + livePreview.repaint(); + saveState(); + })); + } - @Override - public int getSafeX() { - return useSafeArea.isValue() ? safeX.getAsInt(getScreenX()) : getScreenX(); - } + private Container buildPresetGrid() { + // Mirrors SHAPE_PRESETS in Editor.jsx + String[][] presets = { + { "rr", "Rounded rect" }, + { "notch", "Notch" }, + { "island", "Dynamic Island" }, + { "hole", "Punch-hole" }, + { "holeCorner", "Corner hole" }, + { "classic", "Classic (home)" }, + }; + Container row = new Container(new GridLayout(2, 3)); + row.setUIID("SkinDesignerPresetGrid"); + for (String[] preset : presets) { + row.add(buildPresetTile(preset[0], preset[1])); + } + return row; + } - @Override - public int getSafeY() { - return useSafeArea.isValue() ? safeY.getAsInt(getScreenY()) : getScreenY(); - } + private Container buildPresetTile(String id, String label) { + Container tile = new Container(new BoxLayout(BoxLayout.Y_AXIS)); + tile.setUIID(id.equals(skin.presetId) ? "SkinDesignerPresetSelected" : "SkinDesignerPreset"); + PresetIcon icon = new PresetIcon(id); + icon.setUIID("SkinDesignerPresetIcon"); + tile.add(icon); + Label lbl = new Label(label); + lbl.setUIID("SkinDesignerPresetLabel"); + tile.add(lbl); + tile.setLeadComponent(lbl); + tile.addPointerReleasedListener(e -> { + applyPreset(id); + rebuildSidebarBody(); + livePreview.setSkin(skin); + livePreview.repaint(); + saveState(); + }); + return tile; + } - @Override - public int getSafeWidth() { - return useSafeArea.isValue() ? safeWidth.getAsInt(getScreenWidth()) : getScreenWidth(); - } + private void applyPreset(String id) { + skin.presetId = id; + skin.cutouts = new ArrayList<>(); + switch (id) { + case "rr": + skin.cornerR = 40; skin.bezel = 40; skin.homeIndicator = true; + break; + case "notch": + skin.cornerR = 44; skin.bezel = 28; skin.homeIndicator = true; + skin.cutouts.add(new SkinModel.Cutout(SkinModel.CUTOUT_NOTCH, 180, 30, 0, 0, "Notch")); + break; + case "island": + skin.cornerR = 48; skin.bezel = 22; skin.homeIndicator = true; + skin.cutouts.add(new SkinModel.Cutout(SkinModel.CUTOUT_ISLAND, 120, 35, 0, 14, "Dynamic Island")); + break; + case "hole": + skin.cornerR = 36; skin.bezel = 24; skin.homeIndicator = true; + skin.cutouts.add(new SkinModel.Cutout(SkinModel.CUTOUT_HOLE, 28, 28, 0, 20, "Camera")); + break; + case "holeCorner": + skin.cornerR = 32; skin.bezel = 22; skin.homeIndicator = true; + skin.cutouts.add(new SkinModel.Cutout(SkinModel.CUTOUT_HOLE, 26, 26, -100, 18, "Camera")); + break; + case "classic": + skin.cornerR = 20; skin.bezel = 64; skin.homeIndicator = false; + break; + } + } - @Override - public int getSafeHeight() { - return useSafeArea.isValue() ? safeHeight.getAsInt(getScreenHeight()) : getScreenHeight(); - } - }; + private void buildCutoutsTab(Container parent) { + Label help = new Label("Cutouts (notch, island, camera hole) hide rendering and ignore touch input. Positions are relative to the top-center of the screen."); + help.setUIID("SkinDesignerHelpBlock"); + parent.add(help); + + parent.add(sectionLabel("CUTOUTS (" + skin.cutouts.size() + ")")); + cutoutListHolder = new Container(new BoxLayout(BoxLayout.Y_AXIS)); + rebuildCutoutList(); + parent.add(cutoutListHolder); + + Container addRow = new Container(new GridLayout(1, 3)); + addRow.add(addCutoutBtn("Notch", SkinModel.CUTOUT_NOTCH)); + addRow.add(addCutoutBtn("Island", SkinModel.CUTOUT_ISLAND)); + addRow.add(addCutoutBtn("Hole", SkinModel.CUTOUT_HOLE)); + parent.add(addRow); } - private Image createFloodFillMask(Image source, int seedX, int seedY, int tolerance) { - int width = source.getWidth(); - int height = source.getHeight(); - if(seedX < 0 || seedY < 0 || seedX >= width || seedY >= height) { - ToastBar.showErrorMessage("Seed point is outside image bounds"); - return null; + private void rebuildCutoutList() { + cutoutListHolder.removeAll(); + if (skin.cutouts.isEmpty()) { + Label none = new Label("None. Add one below."); + none.setUIID("SkinDesignerEmptyHint"); + cutoutListHolder.add(none); } - int[] src = source.getRGB(); - int[] mask = new int[src.length]; - for(int i = 0; i < mask.length; i++) { - mask[i] = 0xffffffff; + for (int i = 0; i < skin.cutouts.size(); i++) { + cutoutListHolder.add(buildCutoutRow(i)); } - boolean[] visited = new boolean[src.length]; - int[] queue = new int[src.length]; - int head = 0; - int tail = 0; - int seedIdx = seedY * width + seedX; - int seedColor = src[seedIdx]; - queue[tail++] = seedIdx; - visited[seedIdx] = true; - while(head < tail) { - int idx = queue[head++]; - int px = idx % width; - int py = idx / width; - if(colorMatch(src[idx], seedColor, tolerance)) { - mask[idx] = 0xff000000; - if(px > 0) { - int n = idx - 1; - if(!visited[n]) { - visited[n] = true; - queue[tail++] = n; - } - } - if(px < width - 1) { - int n = idx + 1; - if(!visited[n]) { - visited[n] = true; - queue[tail++] = n; - } - } - if(py > 0) { - int n = idx - width; - if(!visited[n]) { - visited[n] = true; - queue[tail++] = n; - } - } - if(py < height - 1) { - int n = idx + width; - if(!visited[n]) { - visited[n] = true; - queue[tail++] = n; - } - } - } + if (selectedCutout >= 0 && selectedCutout < skin.cutouts.size()) { + cutoutListHolder.add(buildCutoutEditor(selectedCutout)); } - return Image.createImage(mask, width, height); + cutoutListHolder.revalidate(); + applyDarkRecursive(cutoutListHolder); } - private boolean colorMatch(int c1, int c2, int tolerance) { - int a1 = (c1 >>> 24) & 0xff; - int a2 = (c2 >>> 24) & 0xff; - if(a2 < 16) { - return a1 < 16; - } - int r1 = (c1 >> 16) & 0xff; - int g1 = (c1 >> 8) & 0xff; - int b1 = c1 & 0xff; - int r2 = (c2 >> 16) & 0xff; - int g2 = (c2 >> 8) & 0xff; - int b2 = c2 & 0xff; - return Math.abs(a1 - a2) <= tolerance && - Math.abs(r1 - r2) <= tolerance && - Math.abs(g1 - g2) <= tolerance && - Math.abs(b1 - b2) <= tolerance; - } - - private void showHelpForm(Form backForm) { - BrowserComponent help = new BrowserComponent(); - help.setURL("jar:///help.html?theme=" + (websiteDarkMode ? "dark" : "light")); - Form helpForm = new Form("Help", new BorderLayout()); - helpForm.setUIID("SkinDesignerForm"); - helpForm.add(BorderLayout.CENTER, help); - Button back = new Button(); - styleIconActionButton(back, FontImage.MATERIAL_ARROW_BACK); - back.addActionListener(ee -> backForm.showBack()); - Container helpActions = FlowLayout.encloseRight(back); - helpActions.setUIID("SkinDesignerTabBar"); - helpForm.add(BorderLayout.NORTH, helpActions); - applyWebsiteTheme(helpForm, websiteDarkMode); - helpForm.show(); - } - - static final int AIM_MODE_SCREEN = 0; - static final int AIM_MODE_SAFE = 1; - - static final int DRAG_NONE = 0; - static final int DRAG_MOVE = 1; - static final int DRAG_N = 1 << 1; - static final int DRAG_S = 1 << 2; - static final int DRAG_W = 1 << 3; - static final int DRAG_E = 1 << 4; - static final int MIN_SAFE_SIZE = 10; - - final class AimView extends Component { - private final Image img; - private final int imgW; - private final int imgH; - private final TextField xField; - private final TextField yField; - private final TextField screenWField; - private final TextField screenHField; - private final TextField safeXField; - private final TextField safeYField; - private final TextField safeWField; - private final TextField safeHField; - private final OnOffSwitch useSafeArea; - private Runnable onChange; - private int mode = AIM_MODE_SCREEN; - private float zoomMul = 1f; - private float panNX = 0.5f; - private float panNY = 0.5f; - private int lastPX = -1; - private int lastPY = -1; - private int dragOp = DRAG_NONE; - - AimView(Image img, TextField xField, TextField yField, - TextField screenWField, TextField screenHField, - TextField safeXField, TextField safeYField, - TextField safeWField, TextField safeHField, - OnOffSwitch useSafeArea) { - this.img = img; - this.imgW = img.getWidth(); - this.imgH = img.getHeight(); - this.xField = xField; - this.yField = yField; - this.screenWField = screenWField; - this.screenHField = screenHField; - this.safeXField = safeXField; - this.safeYField = safeYField; - this.safeWField = safeWField; - this.safeHField = safeHField; - this.useSafeArea = useSafeArea; - setUIID("SkinDesignerCard"); - setFocusable(true); - } + private Container buildCutoutRow(int idx) { + SkinModel.Cutout c = skin.cutouts.get(idx); + boolean sel = idx == selectedCutout; + Container row = new Container(new BorderLayout()); + row.setUIID(sel ? "SkinDesignerCutoutRowSelected" : "SkinDesignerCutoutRow"); + Label sw = new Label(" "); + sw.setUIID("SkinDesignerCutoutSwatch"); + Label name = new Label(c.name); + name.setUIID("SkinDesignerCutoutName"); + Label type = new Label(c.type); + type.setUIID("SkinDesignerCutoutType"); + Button rm = new Button(); + rm.setUIID("SkinDesignerIconButton"); + FontImage.setMaterialIcon(rm, FontImage.MATERIAL_CLOSE); + rm.addActionListener(e -> { + skin.cutouts.remove(idx); + if (selectedCutout == idx) selectedCutout = -1; + else if (selectedCutout > idx) selectedCutout--; + saveState(); + rebuildSidebarBody(); + livePreview.repaint(); + }); + Container left = BoxLayout.encloseX(sw, name); + Container right = BoxLayout.encloseX(type, rm); + row.add(BorderLayout.WEST, left); + row.add(BorderLayout.EAST, right); + row.setLeadComponent(name); + row.addPointerReleasedListener(e -> { + selectedCutout = (selectedCutout == idx) ? -1 : idx; + rebuildCutoutList(); + }); + return row; + } - void setOnChange(Runnable onChange) { - this.onChange = onChange; - } + private Container buildCutoutEditor(int idx) { + SkinModel.Cutout c = skin.cutouts.get(idx); + Container editor = new Container(new BoxLayout(BoxLayout.Y_AXIS)); + editor.setUIID("SkinDesignerCutoutEditor"); + editor.add(numericPair("Width", "px", c.w, v -> { c.w = Math.max(1, v); livePreview.repaint(); saveState(); }, + "Height", "px", c.h, v -> { c.h = Math.max(1, v); livePreview.repaint(); saveState(); })); + editor.add(numericPair("Offset X", "px", c.x, v -> { c.x = v; livePreview.repaint(); saveState(); }, + "Offset Y", "px", c.y, v -> { c.y = v; livePreview.repaint(); saveState(); })); + return editor; + } - private void notifyChanged() { - if (onChange != null) { - onChange.run(); + private Button addCutoutBtn(String label, String type) { + Button b = new Button(label); + b.setUIID("SkinDesignerSecondaryButton"); + FontImage.setMaterialIcon(b, FontImage.MATERIAL_ADD); + b.addActionListener(e -> { + SkinModel.Cutout nc; + switch (type) { + case SkinModel.CUTOUT_NOTCH: + nc = new SkinModel.Cutout(type, 180, 30, 0, 0, "Notch"); break; + case SkinModel.CUTOUT_ISLAND: + nc = new SkinModel.Cutout(type, 120, 35, 0, 14, "Dynamic Island"); break; + default: + nc = new SkinModel.Cutout(SkinModel.CUTOUT_HOLE, 28, 28, 0, 20, "Camera"); break; } - } + skin.cutouts.add(nc); + selectedCutout = skin.cutouts.size() - 1; + saveState(); + rebuildSidebarBody(); + livePreview.repaint(); + }); + return b; + } - int screenW() { - return Math.max(1, screenWField.getAsInt(1)); - } + private void buildInfoTab(Container parent) { + parent.add(sectionLabel("SKIN")); + TextField nameField = new TextField(skin.name, "Name", 32, TextField.ANY); + nameField.setUIID("SkinDesignerField"); + nameField.addDataChangedListener((type, idx) -> { + skin.name = nameField.getText(); + updateStatusbar(); + saveState(); + }); + parent.add(fieldRow("Name", nameField)); + + parent.add(sectionLabel("DEVICE (from library)")); + parent.add(numericPair("Width", "px", device.resolutionW, null, + "Height", "px", device.resolutionH, null)); + // CN1 wants pixel ratio as pixels per millimeter — derive from PPI. + int ppmm100 = (int) Math.round((device.ppi / 25.4) * 100); + parent.add(numericPair("PPI", "", device.ppi, null, + "Px/mm × 100", "", ppmm100, null)); + + parent.add(sectionLabel("SAFE AREA")); + parent.add(numericPair("Top", "px", skin.safeTop, v -> { skin.safeTop = Math.max(0, v); saveState(); }, + "Bottom", "px", skin.safeBottom, v -> { skin.safeBottom = Math.max(0, v); saveState(); })); + } - int screenH() { - return Math.max(1, screenHField.getAsInt(1)); - } + private Label sectionLabel(String text) { + Label lbl = new Label(text); + lbl.setUIID("SkinDesignerSectionLabel"); + return lbl; + } - boolean isSafeAreaEnabled() { - return useSafeArea != null && useSafeArea.isValue(); - } + private Container fieldRow(String labelText, Component field) { + Label l = new Label(labelText); + l.setUIID("SkinDesignerFieldLabel"); + Container c = BoxLayout.encloseY(l, field); + c.setUIID("SkinDesignerFieldRow"); + return c; + } - void setMode(int mode) { - this.mode = mode; + private Container boolPair(String label, boolean value, BooleanSetter setter) { + Label l = new Label(label); + l.setUIID("SkinDesignerFieldLabel"); + OnOffSwitch sw = new OnOffSwitch(); + sw.setUIID("SkinDesignerField"); + sw.setValue(value); + if (setter != null) { + sw.addActionListener(e -> setter.set(sw.isValue())); } + Container c = new Container(new BorderLayout()); + c.setUIID("SkinDesignerFieldRow"); + c.add(BorderLayout.CENTER, l); + c.add(BorderLayout.EAST, sw); + return c; + } - int getMode() { - return mode; + private Container numericPair(String label1, String unit1, int value1, IntSetter setter1, + String label2, String unit2, int value2, IntSetter setter2) { + Container row = new Container(new GridLayout(1, 2)); + row.setUIID("SkinDesignerFieldGrid"); + row.add(numericField(label1, unit1, value1, setter1)); + row.add(numericField(label2, unit2, value2, setter2)); + return row; + } + + private Container numericField(String label, String unit, int value, IntSetter setter) { + Label l = new Label(unit == null || unit.isEmpty() ? label : label + " (" + unit + ")"); + l.setUIID("SkinDesignerFieldLabel"); + TextField tf = new TextField(String.valueOf(value), label, 6, TextField.NUMERIC); + tf.setUIID(setter == null ? "SkinDesignerFieldReadonly" : "SkinDesignerField"); + tf.setEditable(setter != null); + if (setter != null) { + tf.addDataChangedListener((type, idx) -> { + String t = tf.getText(); + int v; + try { + v = Integer.parseInt(t.length() == 0 ? "0" : t); + } catch (NumberFormatException nfe) { + return; + } + setter.set(v); + }); } + Container c = BoxLayout.encloseY(l, tf); + c.setUIID("SkinDesignerFieldRow"); + return c; + } - void zoomIn() { - float nz = Math.min(8f, zoomMul * 1.5f); - if (nz != zoomMul) { - zoomMul = nz; - centerOnActiveRect(); - repaint(); + interface IntSetter { void set(int v); } + interface BooleanSetter { void set(boolean v); } + + // ==================================================================== + // Step 3 — done summary + save + // ==================================================================== + + private Container buildDoneStep() { + // Build the .skin file once when arriving at this step + byte[] data = createSkinBytes(); + boolean savedOk = false; + if (data != null) { + FileSystemStorage fs = FileSystemStorage.getInstance(); + String outPath = fs.getAppHomePath() + sanitize(skin.name) + ".skin"; + try (OutputStream os = fs.openOutputStream(outPath)) { + os.write(data); + savedOk = true; + // In the JS port this triggers the download dialog + Display.getInstance().execute(outPath); + } catch (IOException err) { + Log.e(err); + ToastBar.showErrorMessage("Error saving skin: " + err); } } - void zoomOut() { - float nz = Math.max(1f, zoomMul / 1.5f); - if (nz != zoomMul) { - zoomMul = nz; - if (zoomMul <= 1f) { - panNX = 0.5f; - panNY = 0.5f; - } else { - centerOnActiveRect(); + Container root = new Container(new BoxLayout(BoxLayout.Y_AXIS)); + root.setUIID("SkinDesignerDoneRoot"); + + Label check = new Label(); + check.setUIID("SkinDesignerDoneCheck"); + FontImage.setMaterialIcon(check, FontImage.MATERIAL_CHECK, 8.0f); + Container checkWrap = FlowLayout.encloseCenter(check); + root.add(checkWrap); + + Label h1 = new Label(savedOk ? "Skin saved" : "Skin ready"); + h1.setUIID("SkinDesignerH1"); + root.add(FlowLayout.encloseCenter(h1)); + + Label msg = new Label(savedOk + ? "Your skin has been saved locally. You can go back and tweak it, or start a new one." + : "Your skin is ready. Use the buttons below to adjust or start a new one."); + msg.setUIID("SkinDesignerSub"); + root.add(FlowLayout.encloseCenter(msg)); + + Container summary = new Container(new BoxLayout(BoxLayout.Y_AXIS)); + summary.setUIID("SkinDesignerSummary"); + summary.add(summaryRow("Name", skin.name)); + summary.add(summaryRow("Device", device.name)); + summary.add(summaryRow("Resolution", device.resolutionW + " × " + device.resolutionH)); + summary.add(summaryRow("Cutouts", String.valueOf(skin.cutouts.size()))); + summary.add(summaryRow("Source", source)); + root.add(FlowLayout.encloseCenter(summary)); + + Button back = new Button("Back to editor"); + back.setUIID("SkinDesignerSecondaryButton"); + FontImage.setMaterialIcon(back, FontImage.MATERIAL_CHEVRON_LEFT); + back.addActionListener(e -> goToStep(STEP_EDIT)); + + Button restart = new Button("New skin"); + restart.setUIID("SkinDesignerPrimaryButton"); + restart.addActionListener(e -> restart()); + + Container actions = new Container(new FlowLayout(Component.CENTER)); + actions.add(back); + actions.add(restart); + root.add(actions); + + Container scroll = new Container(new BorderLayout()); + scroll.setScrollableY(true); + scroll.add(BorderLayout.CENTER, root); + return scroll; + } + + private Container summaryRow(String k, String v) { + Label kl = new Label(k); + kl.setUIID("SkinDesignerSummaryKey"); + Label vl = new Label(v); + vl.setUIID("SkinDesignerSummaryValue"); + Container row = new Container(new BorderLayout()); + row.setUIID("SkinDesignerSummaryRow"); + row.add(BorderLayout.WEST, kl); + row.add(BorderLayout.EAST, vl); + return row; + } + + // ==================================================================== + // Image upload + // ==================================================================== + + private void pickImage(Runnable onDone) { + Display.getInstance().openGallery((ee) -> { + if (ee != null && ee.getSource() != null) { + try { + String fileName = (String) ee.getSource(); + bodyImage = Image.createImage(fileName); + Util.copy(FileSystemStorage.getInstance().openInputStream(fileName), + Storage.getInstance().createOutputStream(IMAGE_STORAGE)); + saveState(); + } catch (IOException err) { + Log.e(err); + ToastBar.showErrorMessage("Error loading image: " + err); } - repaint(); } - } + if (onDone != null) onDone.run(); + }, Display.GALLERY_IMAGE); + } - private void centerOnActiveRect() { - int cx, cy; - if (mode == AIM_MODE_SAFE && isSafeAreaEnabled()) { - cx = safeXField.getAsInt(0) + safeWField.getAsInt(screenW()) / 2; - cy = safeYField.getAsInt(0) + safeHField.getAsInt(screenH()) / 2; - } else { - cx = xField.getAsInt(0) + screenW() / 2; - cy = yField.getAsInt(0) + screenH() / 2; - } - if (imgW > 0) { - panNX = Math.max(0f, Math.min(1f, ((float) cx) / imgW)); - } - if (imgH > 0) { - panNY = Math.max(0f, Math.min(1f, ((float) cy) / imgH)); - } - } + // ==================================================================== + // Skin file generation + // ==================================================================== - void nudge(int dx, int dy) { - int savedOp = dragOp; - dragOp = DRAG_MOVE; - applyDelta(dx, dy); - dragOp = savedOp; - repaint(); - } + private byte[] createSkinBytes() { + try { + Image portrait = generatePortraitImage(); + Image landscape = rotate90(portrait); + Image overlayPortrait = generateOverlay(portrait.getWidth(), portrait.getHeight(), + skinBezelInPx(portrait.getWidth(), portrait.getHeight())); + Image overlayLandscape = rotate90(overlayPortrait); + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + try (ZipOutputStream zos = new ZipOutputStream(bos)) { + writeEntry(zos, "skin.png", imageBytes(portrait)); + writeEntry(zos, "skin_l.png", imageBytes(landscape)); + writeEntry(zos, "skin_map.png", imageBytes(overlayPortrait)); + writeEntry(zos, "skin_map_l.png", imageBytes(overlayLandscape)); + + String themeFile = pickNativeThemeFile(device); + InputStream is = Display.getInstance().getResourceAsStream(getClass(), "/" + themeFile); + if (is != null) { + zos.putNextEntry(new ZipEntry(themeFile)); + Util.copyNoClose(is, zos, 8192); + } - private float currentScale() { - int vw = getWidth(); - int vh = getHeight(); - if (vw <= 0 || vh <= 0 || imgW <= 0 || imgH <= 0) { - return 0f; + Properties props = buildProperties(portrait.getWidth(), portrait.getHeight()); + zos.putNextEntry(new ZipEntry("skin.properties")); + props.store(zos, "Created by the Codename One skin designer"); } - float fit = Math.min(((float) vw) / imgW, ((float) vh) / imgH); - return fit * zoomMul; + return bos.toByteArray(); + } catch (IOException err) { + Log.e(err); + ToastBar.showErrorMessage("Error generating skin: " + err); + return null; } + } - private int drawOriginX(float scale) { - int vw = getWidth(); - int drawW = Math.max(1, Math.round(imgW * scale)); - if (drawW <= vw) { - return getX() + (vw - drawW) / 2; - } - int raw = getX() + vw / 2 - Math.round(panNX * drawW); - int min = getX() + vw - drawW; - int max = getX(); - return Math.max(min, Math.min(max, raw)); - } + private void writeEntry(ZipOutputStream zos, String name, byte[] data) throws IOException { + zos.putNextEntry(new ZipEntry(name)); + zos.write(data); + } - private int drawOriginY(float scale) { - int vh = getHeight(); - int drawH = Math.max(1, Math.round(imgH * scale)); - if (drawH <= vh) { - return getY() + (vh - drawH) / 2; - } - int raw = getY() + vh / 2 - Math.round(panNY * drawH); - int min = getY() + vh - drawH; - int max = getY(); - return Math.max(min, Math.min(max, raw)); + private byte[] imageBytes(Image img) throws IOException { + ByteArrayOutputStream bo = new ByteArrayOutputStream(); + ImageIO.getImageIO().save(img, bo, ImageIO.FORMAT_PNG, 1); + return bo.toByteArray(); + } + + private int skinBezelInPx(int totalW, int totalH) { + // Bezel is stored relative to the design's 320×620 viewbox; scale up to + // device pixels so screen position lands at (bezel, bezel) within the + // generated image. + return Math.round(((float) skin.bezel / DevicePreview.VB_W) * totalW); + } + + private int skinCornerInPx(int totalW) { + return Math.round(((float) skin.cornerR / DevicePreview.VB_W) * totalW); + } + + /** + * Produces a portrait skin image whose dimensions are + * {@code device.resolution + 2 * bezelPx}. The screen rectangle (an area + * with alpha=0) starts at (bezelPx, bezelPx) and spans the full device + * resolution. + */ + private Image generatePortraitImage() { + if (SkinModel.SOURCE_IMAGE.equals(source) && bodyImage != null) { + return generateImageBased(); } + // Resolve bezel/corner from the design viewbox into device-pixel space. + // Use a sensible fixed bezel (in device px) so that on large devices the + // frame stays modest. The user-facing bezel value (in viewbox px) is + // remapped onto a per-device device-pixel value. + float framePxScale = ((float) device.resolutionW) / DevicePreview.VB_W; + int bezelPx = Math.round(skin.bezel * framePxScale); + int cornerPx = Math.round(skin.cornerR * framePxScale); + int totalW = device.resolutionW + bezelPx * 2; + int totalH = device.resolutionH + bezelPx * 2; + + // Start with a solid dark frame + Image base = Image.createImage(totalW, totalH, 0xff121822); + Graphics g = base.getGraphics(); + g.setAntiAliased(true); + + // Inner highlight to fake a gradient edge + g.setColor(0x2a2f3a); + int inset = Math.max(1, totalW / 200); + g.fillRoundRect(inset, inset, totalW - inset * 2, totalH - inset * 2, + Math.max(0, (cornerPx - inset) * 2), Math.max(0, (cornerPx - inset) * 2)); + + // Carve the rounded shape: paint outside the round-rect transparent + int[] data = base.getRGB(); + applyRoundRectAlphaMask(data, totalW, totalH, 0, 0, totalW, totalH, cornerPx); + + // Carve the screen (alpha=0 inside) + carveScreenRect(data, totalW, totalH, bezelPx, bezelPx, + device.resolutionW, device.resolutionH); + + // Carve cutouts (still alpha=0) + applyCutouts(data, totalW, totalH, bezelPx, bezelPx, + device.resolutionW, device.resolutionH, framePxScale); + + return Image.createImage(data, totalW, totalH); + } - private int clamp(int v, int lo, int hi) { - if (hi < lo) { - hi = lo; + private Image generateImageBased() { + // Fit the uploaded image into a (device.resolutionW + 2*bezelPx) canvas + float framePxScale = ((float) device.resolutionW) / DevicePreview.VB_W; + int bezelPx = Math.round(skin.bezel * framePxScale); + int cornerPx = Math.round(skin.cornerR * framePxScale); + int totalW = device.resolutionW + bezelPx * 2; + int totalH = device.resolutionH + bezelPx * 2; + + Image canvas = Image.createImage(totalW, totalH, 0); + Graphics g = canvas.getGraphics(); + g.setAntiAliased(true); + Image scaled = bodyImage.scaledLargerRatio(totalW, totalH); + int dx = (totalW - scaled.getWidth()) / 2; + int dy = (totalH - scaled.getHeight()) / 2; + g.drawImage(scaled, dx, dy); + + int[] data = canvas.getRGB(); + applyRoundRectAlphaMask(data, totalW, totalH, 0, 0, totalW, totalH, cornerPx); + carveScreenRect(data, totalW, totalH, bezelPx, bezelPx, + device.resolutionW, device.resolutionH); + applyCutouts(data, totalW, totalH, bezelPx, bezelPx, + device.resolutionW, device.resolutionH, framePxScale); + return Image.createImage(data, totalW, totalH); + } + + private Image generateOverlay(int totalW, int totalH, int bezelPx) { + Image overlay = Image.createImage(totalW, totalH, 0); + Graphics g = overlay.getGraphics(); + g.setColor(0x000000); + g.fillRect(bezelPx, bezelPx, device.resolutionW, device.resolutionH); + return overlay; + } + + private void carveScreenRect(int[] data, int w, int h, int x, int y, int rw, int rh) { + int x2 = Math.min(w, x + rw); + int y2 = Math.min(h, y + rh); + for (int yy = Math.max(0, y); yy < y2; yy++) { + int row = yy * w; + for (int xx = Math.max(0, x); xx < x2; xx++) { + data[row + xx] = 0; } - return Math.max(lo, Math.min(hi, v)); } + } - private void applyDelta(int dImgX, int dImgY) { - if (dImgX == 0 && dImgY == 0 || dragOp == DRAG_NONE) { - return; - } - int sW = screenW(); - int sH = screenH(); - if (mode == AIM_MODE_SAFE) { - if (!isSafeAreaEnabled()) { - return; + private void applyRoundRectAlphaMask(int[] data, int w, int h, + int x, int y, int rw, int rh, int radius) { + if (radius <= 0) return; + int r = Math.min(radius, Math.min(rw, rh) / 2); + int r2 = r * r; + int[][] corners = { + { x + r, y + r, -1, -1 }, + { x + rw - r - 1, y + r, +1, -1 }, + { x + r, y + rh - r - 1, -1, +1 }, + { x + rw - r - 1, y + rh - r - 1, +1, +1 }, + }; + for (int[] c : corners) { + int cx = c[0], cy = c[1], dx = c[2], dy = c[3]; + for (int yy = 0; yy < r; yy++) { + for (int xx = 0; xx < r; xx++) { + int px = cx + dx * xx; + int py = cy + dy * yy; + if (px < 0 || py < 0 || px >= w || py >= h) continue; + int distSq = xx * xx + yy * yy; + if (distSq > r2) { + data[py * w + px] = 0; + } } - int boundsX = xField.getAsInt(0); - int boundsY = yField.getAsInt(0); - int boundsW = sW; - int boundsH = sH; - int curX = safeXField.getAsInt(boundsX); - int curY = safeYField.getAsInt(boundsY); - int curW = Math.min(safeWField.getAsInt(boundsW), boundsW); - int curH = Math.min(safeHField.getAsInt(boundsH), boundsH); - int[] rect = applyResize(curX, curY, curW, curH, dImgX, dImgY, - boundsX, boundsY, boundsW, boundsH); - boolean changed = false; - if (rect[0] != curX) { safeXField.setText("" + rect[0]); changed = true; } - if (rect[1] != curY) { safeYField.setText("" + rect[1]); changed = true; } - if (rect[2] != curW) { safeWField.setText("" + rect[2]); changed = true; } - if (rect[3] != curH) { safeHField.setText("" + rect[3]); changed = true; } - if (changed) { notifyChanged(); } - return; - } - int curX = xField.getAsInt(0); - int curY = yField.getAsInt(0); - int newX = clamp(curX + dImgX, 0, imgW - sW); - int newY = clamp(curY + dImgY, 0, imgH - sH); - int actualDx = newX - curX; - int actualDy = newY - curY; - boolean changed = false; - if (actualDx != 0) { xField.setText("" + newX); changed = true; } - if (actualDy != 0) { yField.setText("" + newY); changed = true; } - if ((actualDx != 0 || actualDy != 0) && isSafeAreaEnabled()) { - int saw = Math.min(safeWField.getAsInt(sW), sW); - int sah = Math.min(safeHField.getAsInt(sH), sH); - int curSafeX = safeXField.getAsInt(curX); - int curSafeY = safeYField.getAsInt(curY); - int newSafeX = clamp(curSafeX + actualDx, newX, newX + sW - saw); - int newSafeY = clamp(curSafeY + actualDy, newY, newY + sH - sah); - if (newSafeX != curSafeX) { safeXField.setText("" + newSafeX); changed = true; } - if (newSafeY != curSafeY) { safeYField.setText("" + newSafeY); changed = true; } } - if (changed) { notifyChanged(); } } + } - private int[] applyResize(int curX, int curY, int curW, int curH, int dx, int dy, - int boundsX, int boundsY, int boundsW, int boundsH) { - boolean moveLeft = (dragOp & DRAG_W) != 0 || dragOp == DRAG_MOVE; - boolean moveRight = (dragOp & DRAG_E) != 0 || dragOp == DRAG_MOVE; - boolean moveTop = (dragOp & DRAG_N) != 0 || dragOp == DRAG_MOVE; - boolean moveBottom = (dragOp & DRAG_S) != 0 || dragOp == DRAG_MOVE; - int left = curX; - int right = curX + curW; - int top = curY; - int bottom = curY + curH; - if (moveLeft) { left += dx; } - if (moveRight) { right += dx; } - if (moveTop) { top += dy; } - if (moveBottom) { bottom += dy; } - int minX = boundsX; - int minY = boundsY; - int maxX = boundsX + boundsW; - int maxY = boundsY + boundsH; - if (left < minX) { left = minX; if (moveLeft && !moveRight && right < left + MIN_SAFE_SIZE) right = left + MIN_SAFE_SIZE; } - if (right > maxX) { right = maxX; if (moveRight && !moveLeft && left > right - MIN_SAFE_SIZE) left = right - MIN_SAFE_SIZE; } - if (top < minY) { top = minY; if (moveTop && !moveBottom && bottom < top + MIN_SAFE_SIZE) bottom = top + MIN_SAFE_SIZE; } - if (bottom > maxY) { bottom = maxY; if (moveBottom && !moveTop && top > bottom - MIN_SAFE_SIZE) top = bottom - MIN_SAFE_SIZE; } - if (right - left < MIN_SAFE_SIZE) { - if (moveLeft && !moveRight) { left = right - MIN_SAFE_SIZE; } - else if (moveRight && !moveLeft) { right = left + MIN_SAFE_SIZE; } - } - if (bottom - top < MIN_SAFE_SIZE) { - if (moveTop && !moveBottom) { top = bottom - MIN_SAFE_SIZE; } - else if (moveBottom && !moveTop) { bottom = top + MIN_SAFE_SIZE; } - } - if (dragOp == DRAG_MOVE) { - int w = right - left; - int h = bottom - top; - left = clamp(left, minX, maxX - w); - top = clamp(top, minY, maxY - h); - right = left + w; - bottom = top + h; + private void applyCutouts(int[] data, int w, int h, + int screenX, int screenY, int sw, int sh, float scale) { + int cx = screenX + sw / 2; + for (SkinModel.Cutout c : skin.cutouts) { + int cw = Math.round(c.w * scale); + int ch = Math.round(c.h * scale); + int ox = cx + Math.round(c.x * scale); + int oy = screenY + Math.round(c.y * scale); + if (SkinModel.CUTOUT_NOTCH.equals(c.type)) { + int x0 = ox - cw / 2; + fillRect(data, w, h, x0, screenY, cw, ch); + } else if (SkinModel.CUTOUT_ISLAND.equals(c.type)) { + int x0 = ox - cw / 2; + fillRoundedRect(data, w, h, x0, oy, cw, ch, ch / 2); + } else if (SkinModel.CUTOUT_HOLE.equals(c.type)) { + int r = cw / 2; + fillCircle(data, w, h, ox, oy + ch / 2, r); } - return new int[] { left, top, right - left, bottom - top }; - } - - @Override - public void pointerPressed(int x, int y) { - lastPX = x; - lastPY = y; - dragOp = hitTestDragOp(x, y); - } - - @Override - public void pointerReleased(int x, int y) { - lastPX = -1; - lastPY = -1; - dragOp = DRAG_NONE; } + } - private int hitTestDragOp(int px, int py) { - if (mode == AIM_MODE_SAFE && isSafeAreaEnabled()) { - float scale = currentScale(); - if (scale <= 0f) { return DRAG_MOVE; } - int drawX = drawOriginX(scale); - int drawY = drawOriginY(scale); - int sX = drawX + Math.round(safeXField.getAsInt(0) * scale); - int sY = drawY + Math.round(safeYField.getAsInt(0) * scale); - int sW = Math.max(1, Math.round(safeWField.getAsInt(screenW()) * scale)); - int sH = Math.max(1, Math.round(safeHField.getAsInt(screenH()) * scale)); - int zone = Math.max(8, Display.getInstance().convertToPixels(2.5f)); - boolean nearLeft = px >= sX - zone && px <= sX + zone; - boolean nearRight = px >= sX + sW - zone && px <= sX + sW + zone; - boolean nearTop = py >= sY - zone && py <= sY + zone; - boolean nearBottom = py >= sY + sH - zone && py <= sY + sH + zone; - int op = 0; - if (nearLeft) { op |= DRAG_W; } - if (nearRight) { op |= DRAG_E; } - if (nearTop) { op |= DRAG_N; } - if (nearBottom) { op |= DRAG_S; } - if (op != 0) { return op; } + private void fillRect(int[] data, int w, int h, int x, int y, int rw, int rh) { + int x2 = Math.min(w, x + rw); + int y2 = Math.min(h, y + rh); + for (int yy = Math.max(0, y); yy < y2; yy++) { + for (int xx = Math.max(0, x); xx < x2; xx++) { + data[yy * w + xx] = 0xff000000; } - return DRAG_MOVE; } + } - @Override - public void pointerDragged(int x, int y) { - if (lastPX < 0 || lastPY < 0) { - lastPX = x; - lastPY = y; - return; - } - int dpx = x - lastPX; - int dpy = y - lastPY; - float scale = currentScale(); - if (scale <= 0f) { - lastPX = x; - lastPY = y; - return; - } - int dImgX = Math.round(dpx / scale); - int dImgY = Math.round(dpy / scale); - if (dImgX == 0 && dImgY == 0) { - return; + private void fillCircle(int[] data, int w, int h, int cx, int cy, int r) { + int r2 = r * r; + for (int yy = Math.max(0, cy - r); yy < Math.min(h, cy + r + 1); yy++) { + int dy = yy - cy; + for (int xx = Math.max(0, cx - r); xx < Math.min(w, cx + r + 1); xx++) { + int dx = xx - cx; + if (dx * dx + dy * dy <= r2) { + data[yy * w + xx] = 0xff000000; + } } - applyDelta(dImgX, dImgY); - lastPX = x; - lastPY = y; - repaint(); } + } - @Override - public void paint(Graphics g) { - super.paint(g); - float scale = currentScale(); - if (scale <= 0f) { - return; - } - int drawW = Math.max(1, Math.round(imgW * scale)); - int drawH = Math.max(1, Math.round(imgH * scale)); - int drawX = drawOriginX(scale); - int drawY = drawOriginY(scale); - - int[] clip = g.getClip(); - g.pushClip(); - g.clipRect(getX(), getY(), getWidth(), getHeight()); - - g.drawImage(img, drawX, drawY, drawW, drawH); - - int sW = screenW(); - int sH = screenH(); - int screenImgX = xField.getAsInt(0); - int screenImgY = yField.getAsInt(0); - boolean safeOn = isSafeAreaEnabled(); - int safeImgX = safeOn ? safeXField.getAsInt(screenImgX) : screenImgX; - int safeImgY = safeOn ? safeYField.getAsInt(screenImgY) : screenImgY; - int safeImgW = safeOn ? safeWField.getAsInt(sW) : sW; - int safeImgH = safeOn ? safeHField.getAsInt(sH) : sH; - - int sx = drawX + Math.round(screenImgX * scale); - int sy = drawY + Math.round(screenImgY * scale); - int sw = Math.max(1, Math.round(sW * scale)); - int sh = Math.max(1, Math.round(sH * scale)); - int fx = drawX + Math.round(safeImgX * scale); - int fy = drawY + Math.round(safeImgY * scale); - int fw = Math.max(1, Math.round(safeImgW * scale)); - int fh = Math.max(1, Math.round(safeImgH * scale)); - - int oldAlpha = g.getAlpha(); - int oldColor = g.getColor(); - - g.setAlpha(150); - g.setColor(0); - g.fillRect(sx, sy, sw, sh); - - g.setAlpha(80); - int checker = Math.max(4, Math.round(12f * scale)); - for (int yy = sy; yy < sy + sh; yy += checker) { - for (int xx = sx; xx < sx + sw; xx += checker) { - boolean dark = (((xx - sx) / checker) + ((yy - sy) / checker)) % 2 == 0; - g.setColor(dark ? 0x999999 : 0xcccccc); - int cw = Math.min(checker, sx + sw - xx); - int ch = Math.min(checker, sy + sh - yy); - g.fillRect(xx, yy, cw, ch); + private void fillRoundedRect(int[] data, int w, int h, int x, int y, int rw, int rh, int r) { + int x2 = Math.min(w, x + rw); + int y2 = Math.min(h, y + rh); + for (int yy = Math.max(0, y); yy < y2; yy++) { + for (int xx = Math.max(0, x); xx < x2; xx++) { + int dx = xx - x; + int dy = yy - y; + int rrw = rw - 1; + int rrh = rh - 1; + int cdx, cdy; + if (dx < r && dy < r) { cdx = r - dx; cdy = r - dy; } + else if (dx > rrw - r && dy < r) { cdx = dx - (rrw - r); cdy = r - dy; } + else if (dx < r && dy > rrh - r) { cdx = r - dx; cdy = dy - (rrh - r); } + else if (dx > rrw - r && dy > rrh - r) { cdx = dx - (rrw - r); cdy = dy - (rrh - r); } + else { data[yy * w + xx] = 0xff000000; continue; } + if (cdx * cdx + cdy * cdy <= r * r) { + data[yy * w + xx] = 0xff000000; } } + } + } - if (safeOn) { - g.setAlpha(150); - g.setColor(0xff0000); - int safeRight = fx + fw; - int safeBottom = fy + fh; - int screenRight = sx + sw; - int screenBottom = sy + sh; - if (fy > sy) { - g.fillRect(sx, sy, sw, Math.max(0, fy - sy)); - } - if (fx > sx) { - g.fillRect(sx, fy, Math.max(0, fx - sx), Math.max(0, fh)); - } - if (safeRight < screenRight) { - g.fillRect(safeRight, fy, Math.max(0, screenRight - safeRight), Math.max(0, fh)); - } - if (safeBottom < screenBottom) { - g.fillRect(sx, safeBottom, sw, Math.max(0, screenBottom - safeBottom)); - } - } + private Image rotate90(Image src) { + return src.rotate90Degrees(true); + } - g.setAlpha(255); - g.setColor(mode == AIM_MODE_SCREEN ? 0x2f6bff : 0x00ffff); - g.drawRect(sx, sy, sw, sh); - if (safeOn) { - g.setColor(mode == AIM_MODE_SAFE ? 0xffaa00 : 0xff0000); - g.drawRect(fx, fy, fw, fh); - if (mode == AIM_MODE_SAFE) { - int handle = Math.max(6, Display.getInstance().convertToPixels(2f)); - int half = handle / 2; - g.fillRect(fx - half, fy - half, handle, handle); - g.fillRect(fx + fw - half, fy - half, handle, handle); - g.fillRect(fx - half, fy + fh - half, handle, handle); - g.fillRect(fx + fw - half, fy + fh - half, handle, handle); - g.fillRect(fx + fw / 2 - half, fy - half, handle, handle); - g.fillRect(fx + fw / 2 - half, fy + fh - half, handle, handle); - g.fillRect(fx - half, fy + fh / 2 - half, handle, handle); - g.fillRect(fx + fw - half, fy + fh / 2 - half, handle, handle); - } - } + private Properties buildProperties(int totalW, int totalH) { + Properties p = new Properties(); + p.put("touch", "true"); + p.put("platformName", device.platformName); + p.put("tablet", String.valueOf(device.tablet)); + p.put("systemFontFamily", device.systemFont); + p.put("proportionalFontFamily", device.proportionalFont); + p.put("monospaceFontFamily", device.monoFont); + p.put("smallFontSize", String.valueOf(device.fontSmall)); + p.put("mediumFontSize", String.valueOf(device.fontMedium)); + p.put("largeFontSize", String.valueOf(device.fontLarge)); + // CN1's pixelRatio is *pixels per millimeter*; convert from PPI. + double ppmm = device.ppi / 25.4; + p.put("pixelRatio", String.valueOf(ppmm)); + p.put("overrideNames", overrideNames(device)); + + int bezelPx = skinBezelInPx(totalW, totalH); + int safeTopPx = Math.round(skin.safeTop * ((float) device.resolutionW / DevicePreview.VB_W)); + int safeBottomPx = Math.round(skin.safeBottom * ((float) device.resolutionW / DevicePreview.VB_W)); + int safeX = bezelPx; + int safeY = bezelPx + safeTopPx; + int safeW = device.resolutionW; + int safeH = Math.max(1, device.resolutionH - safeTopPx - safeBottomPx); + + p.put("safePortraitX", String.valueOf(safeX)); + p.put("safePortraitY", String.valueOf(safeY)); + p.put("safePortraitWidth", String.valueOf(safeW)); + p.put("safePortraitHeight", String.valueOf(safeH)); + // Landscape is portrait rotated 90° clockwise — swap accordingly + int landTotalW = totalH; + int landTotalH = totalW; + int landSafeX = bezelPx + safeBottomPx; // bottom edge becomes left + int landSafeY = bezelPx; + int landSafeW = Math.max(1, device.resolutionH - safeTopPx - safeBottomPx); + int landSafeH = device.resolutionW; + // Suppress unused-var warnings on totals + if (landTotalW + landTotalH == 0) {} // no-op + p.put("safeLandscapeX", String.valueOf(landSafeX)); + p.put("safeLandscapeY", String.valueOf(landSafeY)); + p.put("safeLandscapeWidth", String.valueOf(landSafeW)); + p.put("safeLandscapeHeight", String.valueOf(landSafeH)); + return p; + } - g.setAlpha(oldAlpha); - g.setColor(oldColor); - g.popClip(); - g.setClip(clip); + private String overrideNames(DeviceDatabase.Device d) { + String form = d.tablet ? "tablet" : "phone"; + String os; + String last; + if ("ios".equals(d.platformName)) { + os = "ios"; + last = d.tablet ? "ipad" : "iphone"; + } else if ("and".equals(d.platformName)) { + os = "android"; + last = d.tablet ? "android-tablet" : "android-phone"; + } else { + os = "windows"; + last = "desktop"; } + return form + "," + os + "," + last; } - void aimPosition(final Image img, - final TextField screenX, final TextField screenY, - final TextField screenW, final TextField screenH, - final TextField safeX, final TextField safeY, - final TextField safeW, final TextField safeH, - final OnOffSwitch useSafeArea) { - if(img == null) { - ToastBar.showErrorMessage("You need to pick a skin image first"); - return; - } - final Form previousForm = Display.getInstance().getCurrent(); - final boolean safeEnabled = useSafeArea != null && useSafeArea.isValue(); - final Form editPosition = new Form("Positioning", new BorderLayout()); - editPosition.setUIID("SkinDesignerForm"); - - final AimView view = new AimView(img, screenX, screenY, screenW, screenH, - safeX, safeY, safeW, safeH, useSafeArea); - - final TextField aimScreenX = numericMirror(screenX); - final TextField aimScreenY = numericMirror(screenY); - final TextField aimScreenW = numericMirror(screenW); - final TextField aimScreenH = numericMirror(screenH); - final TextField aimSafeX = numericMirror(safeX); - final TextField aimSafeY = numericMirror(safeY); - final TextField aimSafeW = numericMirror(safeW); - final TextField aimSafeH = numericMirror(safeH); - if (!safeEnabled) { - aimSafeX.setEnabled(false); - aimSafeY.setEnabled(false); - aimSafeW.setEnabled(false); - aimSafeH.setEnabled(false); - } - Runnable refreshAimFields = () -> { - syncMirror(aimScreenX, screenX); - syncMirror(aimScreenY, screenY); - syncMirror(aimScreenW, screenW); - syncMirror(aimScreenH, screenH); - syncMirror(aimSafeX, safeX); - syncMirror(aimSafeY, safeY); - syncMirror(aimSafeW, safeW); - syncMirror(aimSafeH, safeH); - }; - view.setOnChange(refreshAimFields); - bindAimToMain(aimScreenX, screenX, view); - bindAimToMain(aimScreenY, screenY, view); - bindAimToMain(aimScreenW, screenW, view); - bindAimToMain(aimScreenH, screenH, view); - bindAimToMain(aimSafeX, safeX, view); - bindAimToMain(aimSafeY, safeY, view); - bindAimToMain(aimSafeW, safeW, view); - bindAimToMain(aimSafeH, safeH, view); - - final String originalScreenX = screenX.getText(); - final String originalScreenY = screenY.getText(); - final String originalScreenW = screenW.getText(); - final String originalScreenH = screenH.getText(); - final String originalSafeX = safeX.getText(); - final String originalSafeY = safeY.getText(); - final String originalSafeW = safeW.getText(); - final String originalSafeH = safeH.getText(); - - Button done = new Button("Done"); - styleActionButton(done, FontImage.MATERIAL_CHECK); - done.setTooltip("Keep changes and return"); - done.addActionListener(e -> previousForm.showBack()); - Button cancel = new Button("Cancel"); - styleActionButton(cancel, FontImage.MATERIAL_CANCEL); - cancel.setTooltip("Discard changes and return"); - Runnable cancelAction = () -> { - screenX.setText(originalScreenX); - screenY.setText(originalScreenY); - screenW.setText(originalScreenW); - screenH.setText(originalScreenH); - safeX.setText(originalSafeX); - safeY.setText(originalSafeY); - safeW.setText(originalSafeW); - safeH.setText(originalSafeH); - previousForm.showBack(); - }; - cancel.addActionListener(e -> cancelAction.run()); - editPosition.setBackCommand(new com.codename1.ui.Command("Cancel") { - @Override - public void actionPerformed(com.codename1.ui.events.ActionEvent evt) { - cancelAction.run(); - } - }); + private String pickNativeThemeFile(DeviceDatabase.Device d) { + if ("ios".equals(d.platformName)) return "iOS7Theme.res"; + if ("and".equals(d.platformName)) return "android_holo_light.res"; + return "winTheme.res"; + } - Container topActions = GridLayout.encloseIn(2, cancel, done); - topActions.setUIID("SkinDesignerTabBar"); - editPosition.add(BorderLayout.NORTH, topActions); - - Container south = new Container(new BoxLayout(BoxLayout.Y_AXIS)); - if (safeEnabled) { - Button modeScreen = new Button("Screen"); - Button modeSafe = new Button("Safe"); - modeScreen.setTooltip("Drag to reposition the screen area"); - modeSafe.setTooltip("Drag inside to move the safe area; drag its edges or corners to resize"); - final Button[] modeButtons = { modeScreen, modeSafe }; - final int[] modeValues = { AIM_MODE_SCREEN, AIM_MODE_SAFE }; - updateModeButtons(modeButtons, view.getMode()); - for (int i = 0; i < modeButtons.length; i++) { - final int target = modeValues[i]; - modeButtons[i].addActionListener(e -> { - view.setMode(target); - updateModeButtons(modeButtons, target); - view.repaint(); - }); + private static String sanitize(String name) { + if (name == null || name.isEmpty()) return "skin"; + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < name.length(); i++) { + char c = name.charAt(i); + if (isAsciiAlphanumeric(c) || c == '-' || c == '_') { + sb.append(c); + } else if (c == ' ') { + sb.append('-'); } - Container modeBar = GridLayout.encloseIn(2, modeScreen, modeSafe); - modeBar.setUIID("SkinDesignerTabBar"); - south.add(modeBar); } + if (sb.length() == 0) sb.append("skin"); + return sb.toString(); + } - south.add(labeledFieldTitle("Screen (X / Y / W / H)")); - south.add(GridLayout.encloseIn(4, aimScreenX, aimScreenY, aimScreenW, aimScreenH)); - if (safeEnabled) { - south.add(labeledFieldTitle("Safe (X / Y / W / H)")); - south.add(GridLayout.encloseIn(4, aimSafeX, aimSafeY, aimSafeW, aimSafeH)); - } + private static boolean isAsciiAlphanumeric(char c) { + return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); + } - Button zoomIn = new Button(); - Button zoomOut = new Button(); - Button leftBtn = new Button(); - Button rightBtn = new Button(); - Button upBtn = new Button(); - Button downBtn = new Button(); - styleIconActionButton(zoomIn, FontImage.MATERIAL_ZOOM_IN); - styleIconActionButton(zoomOut, FontImage.MATERIAL_ZOOM_OUT); - styleIconActionButton(leftBtn, FontImage.MATERIAL_KEYBOARD_ARROW_LEFT); - styleIconActionButton(rightBtn, FontImage.MATERIAL_KEYBOARD_ARROW_RIGHT); - styleIconActionButton(upBtn, FontImage.MATERIAL_KEYBOARD_ARROW_UP); - styleIconActionButton(downBtn, FontImage.MATERIAL_KEYBOARD_ARROW_DOWN); - zoomIn.setTooltip("Zoom in (centers on the active rectangle)"); - zoomOut.setTooltip("Zoom out"); - leftBtn.setTooltip("Nudge the active rectangle 1 px left"); - rightBtn.setTooltip("Nudge the active rectangle 1 px right"); - upBtn.setTooltip("Nudge the active rectangle 1 px up"); - downBtn.setTooltip("Nudge the active rectangle 1 px down"); - - zoomIn.addActionListener(e -> view.zoomIn()); - zoomOut.addActionListener(e -> view.zoomOut()); - leftBtn.addActionListener(e -> { view.nudge(-1, 0); refreshAimFields.run(); }); - rightBtn.addActionListener(e -> { view.nudge(1, 0); refreshAimFields.run(); }); - upBtn.addActionListener(e -> { view.nudge(0, -1); refreshAimFields.run(); }); - downBtn.addActionListener(e -> { view.nudge(0, 1); refreshAimFields.run(); }); - - Container navBar = GridLayout.encloseIn(6, zoomOut, zoomIn, leftBtn, rightBtn, upBtn, downBtn); - south.add(navBar); - - editPosition.add(BorderLayout.CENTER, view); - editPosition.add(BorderLayout.SOUTH, south); - applyWebsiteTheme(editPosition, websiteDarkMode); - editPosition.show(); - - String intro = safeEnabled - ? "Drag the screen or safe rectangle to move it. Drag safe-area edges or corners to resize. Use the fields below for exact values." - : "Drag the screen rectangle to move it. Use the X / Y / W / H fields below for exact values."; - ToastBar.showMessage(intro, FontImage.MATERIAL_INFO, 6000); - } - - private TextField numericMirror(TextField source) { - TextField t = new TextField(source.getText(), source.getHint(), 6, TextField.NUMERIC); - t.setUIID("SkinDesignerField"); - return t; - } - - private void syncMirror(TextField mirror, TextField source) { - if (!source.getText().equals(mirror.getText())) { - mirror.setText(source.getText()); - } + // ==================================================================== + // Theming helpers (light/dark via URL ?theme=) + // ==================================================================== + + private boolean readThemeFromUrl() { + String href = CN.getProperty("browser.window.location.href", ""); + String theme = queryParam(href, "theme"); + if ("dark".equalsIgnoreCase(theme)) return true; + if ("light".equalsIgnoreCase(theme)) return false; + return Display.getInstance().isDarkMode(); } - private void bindAimToMain(final TextField mirror, final TextField main, final AimView view) { - mirror.addActionListener(e -> { - String text = mirror.getText(); - if (!main.getText().equals(text)) { - main.setText(text); + private String queryParam(String href, String name) { + if (href == null || href.length() == 0) return null; + int q = href.indexOf('?'); + if (q < 0 || q == href.length() - 1) return null; + String query = href.substring(q + 1); + int hash = query.indexOf('#'); + if (hash >= 0) query = query.substring(0, hash); + String prefix = name + "="; + for (String pair : Util.split(query, "&")) { + if (pair.startsWith(prefix) && pair.length() > prefix.length()) { + return pair.substring(prefix.length()); } - view.repaint(); - }); + } + return null; } - private void updateModeButtons(Button[] buttons, int selectedMode) { - for (int i = 0; i < buttons.length; i++) { - boolean selected = i == selectedMode; - String base = selected ? "SkinDesignerTabButtonSelected" : "SkinDesignerTabButton"; - buttons[i].setUIID(websiteDarkMode ? base + "Dark" : base); + private void applyDarkRecursive(Component c) { + String uiid = c.getUIID(); + if (uiid != null) { + String themed = themedUiid(uiid, websiteDarkMode); + if (!uiid.equals(themed)) { + c.setUIID(themed); + } + } + if (c instanceof Container) { + Container container = (Container) c; + for (int i = 0; i < container.getComponentCount(); i++) { + applyDarkRecursive(container.getComponentAt(i)); + } } } - private byte[] imageToByteArray(Image img) throws IOException { - ByteArrayOutputStream bo = new ByteArrayOutputStream(); - ImageIO.getImageIO().save(img, bo, ImageIO.FORMAT_PNG, 1); - bo.close(); - return bo.toByteArray(); + private String themedUiid(String uiid, boolean dark) { + if (uiid == null || uiid.isEmpty()) return uiid; + if (!uiid.startsWith("SkinDesigner")) return uiid; + if (dark) { + return uiid.endsWith("Dark") ? uiid : uiid + "Dark"; + } + return uiid.endsWith("Dark") ? uiid.substring(0, uiid.length() - 4) : uiid; } - byte[] createSkinFile(ImageSettings imPortrait, ImageSettings imLandscape, Picker nativeTheme, Picker platformName, OnOffSwitch tablet, TextField systemFontFamily, TextField proportionalFontFamily, TextField monospaceFontFamily, TextField smallFontSize, TextField mediumFontSize, TextField largeFontSize, TextField pixelRatio, Picker overrideNamePrimary, Picker overrideNameSecondary, Picker overrideNameLast) { - Image portrait = imPortrait.getSkinImage(); - Image landscape = imLandscape.getSkinImage(); - if (portrait == null) { - ToastBar.showErrorMessage("Missing portrait skin image"); - return null; - } - if (landscape == null) { - ToastBar.showErrorMessage("Missing landscape skin image"); - return null; + // ==================================================================== + // Preset icons + // ==================================================================== + + /** Tiny inline icon for the shape-preset tiles. */ + static final class PresetIcon extends Component { + private final String id; + PresetIcon(String id) { this.id = id; } + @Override + protected com.codename1.ui.geom.Dimension calcPreferredSize() { + int s = CN.convertToPixels(8); + return new com.codename1.ui.geom.Dimension(s, (int) (s * 1.5f)); } - Image overlayPortrait = imPortrait.createSkinOverlay(); - Image overlayLandscape = imLandscape.createSkinOverlay(); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - try(ZipOutputStream zos = new ZipOutputStream(bos)) { - ZipEntry ze = new ZipEntry("skin.png"); - zos.putNextEntry(ze); - zos.write(imageToByteArray(portrait)); - - ze = new ZipEntry("skin_l.png"); - zos.putNextEntry(ze); - zos.write(imageToByteArray(landscape)); - - ze = new ZipEntry("skin_map.png"); - zos.putNextEntry(ze); - zos.write(imageToByteArray(overlayPortrait)); - - ze = new ZipEntry("skin_map_l.png"); - zos.putNextEntry(ze); - zos.write(imageToByteArray(overlayLandscape)); - - String theme = nativeTheme.getSelectedString(); - for(int iter = 0 ; iter < NATIVE_THEMES.length ; iter++) { - if(NATIVE_THEMES[iter].equals(theme)) { - ze = new ZipEntry(NATIVE_THEME_FILES[iter]); - zos.putNextEntry(ze); - InputStream is = Display.getInstance().getResourceAsStream(getClass(), "/" + NATIVE_THEME_FILES[iter]); - Util.copyNoClose(is, zos, 8192); + @Override + public void paint(Graphics g) { + int w = getWidth(), h = getHeight(); + int pad = Math.max(1, w / 12); + g.setColor(0x7F8AA3); + int rx = getX() + pad, ry = getY() + pad; + int rw = w - pad * 2, rh = h - pad * 2; + int corner = "classic".equals(id) ? rw / 8 : rw / 4; + g.drawRoundRect(rx, ry, rw, rh, corner * 2, corner * 2); + g.setColor(0x112247); + switch (id) { + case "notch": { + int nw = rw / 3, nh = rh / 14; + g.fillRoundRect(rx + (rw - nw) / 2, ry + 2, nw, nh, nh, nh); + break; + } + case "island": { + int iw = rw / 3, ih = rh / 18; + g.fillRoundRect(rx + (rw - iw) / 2, ry + ih, iw, ih, ih, ih); + break; + } + case "hole": { + int r = rw / 12; + g.fillArc(rx + rw / 2 - r, ry + r * 2, r * 2, r * 2, 0, 360); break; } + case "holeCorner": { + int r = rw / 14; + g.fillArc(rx + r * 2, ry + r * 2, r * 2, r * 2, 0, 360); + break; + } + case "classic": { + int r = rw / 18; + g.drawArc(rx + rw / 2 - r, ry + rh - r * 3, r * 2, r * 2, 0, 360); + break; + } + default: + break; } - - Properties props = new Properties(); - props.put("touch", "true"); - props.put("platformName", platformName.getSelectedString()); - props.put("tablet", "" + tablet.isValue()); - props.put("systemFontFamily", systemFontFamily.getText()); - props.put("proportionalFontFamily", proportionalFontFamily.getText()); - props.put("monospaceFontFamily", monospaceFontFamily.getText()); - props.put("smallFontSize", smallFontSize.getText()); - props.put("mediumFontSize", mediumFontSize.getText()); - props.put("largeFontSize", largeFontSize.getText()); - props.put("pixelRatio", pixelRatio.getText()); - props.put("overrideNames", overrideNamePrimary.getSelectedString() + "," + - overrideNameSecondary.getSelectedString() + "," + - overrideNameLast.getSelectedString()); - props.put("safePortraitX", "" + imPortrait.getSafeX()); - props.put("safePortraitY", "" + imPortrait.getSafeY()); - props.put("safePortraitWidth", "" + imPortrait.getSafeWidth()); - props.put("safePortraitHeight", "" + imPortrait.getSafeHeight()); - props.put("safeLandscapeX", "" + imLandscape.getSafeX()); - props.put("safeLandscapeY", "" + imLandscape.getSafeY()); - props.put("safeLandscapeWidth", "" + imLandscape.getSafeWidth()); - props.put("safeLandscapeHeight", "" + imLandscape.getSafeHeight()); - - ze = new ZipEntry("skin.properties"); - zos.putNextEntry(ze); - props.store(zos, "Created by the Codename One skin designer see https://www.codenameone.com/"); - } catch(IOException err) { - Log.e(err); - ToastBar.showErrorMessage("Error while saving file: " + err); } - return bos.toByteArray(); } + } diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinModel.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinModel.java new file mode 100644 index 0000000000..b4115c1533 --- /dev/null +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinModel.java @@ -0,0 +1,131 @@ +package com.codename1.tools.skindesigner; + +import com.codename1.io.Preferences; +import java.util.ArrayList; +import java.util.List; + +/** + * In-memory model of the skin currently being designed. Mirrors the React + * design's {@code skin} state. Persists itself to {@link Preferences} so the + * wizard survives a reload, mirroring the localStorage behavior of the + * design. + */ +public final class SkinModel { + public static final String SOURCE_SHAPE = "shape"; + public static final String SOURCE_IMAGE = "image"; + public static final String SOURCE_BLANK = "blank"; + + public static final String CUTOUT_NOTCH = "notch"; + public static final String CUTOUT_ISLAND = "island"; + public static final String CUTOUT_HOLE = "hole"; + + public static final class Cutout { + public String type; + public int w, h, x, y; + public String name; + + public Cutout(String type, int w, int h, int x, int y, String name) { + this.type = type; + this.w = w; + this.h = h; + this.x = x; + this.y = y; + this.name = name; + } + } + + public String presetId = "rr"; + public String name = "My skin"; + public int cornerR = 40; + public int bezel = 40; + public boolean homeIndicator = true; + public List cutouts = new ArrayList<>(); + public int safeTop = 40; + public int safeBottom = 0; + + private static final String P = "wiz.skin."; + + public void resetForDevice(DeviceDatabase.Device d) { + presetId = "rr"; + name = d == null ? "My skin" : d.name + " skin"; + cornerR = 40; + bezel = 40; + homeIndicator = d == null || d.hasHomeIndicator; + cutouts = new ArrayList<>(); + safeTop = d == null ? 40 : d.safeTop; + safeBottom = d == null ? 0 : d.safeBottom; + if (d != null) { + if (d.hasIsland) { + cutouts.add(new Cutout(CUTOUT_ISLAND, 120, 35, 0, 14, "Dynamic Island")); + presetId = "island"; + } else if (d.hasNotch) { + cutouts.add(new Cutout(CUTOUT_NOTCH, 180, 30, 0, 0, "Notch")); + presetId = "notch"; + } else if (d.hasHole) { + cutouts.add(new Cutout(CUTOUT_HOLE, 28, 28, 0, 20, "Camera")); + presetId = "hole"; + } else if (!d.hasHomeIndicator) { + presetId = "classic"; + cornerR = 20; + bezel = 64; + } + } + } + + public void save() { + Preferences.set(P + "presetId", presetId); + Preferences.set(P + "name", name); + Preferences.set(P + "cornerR", cornerR); + Preferences.set(P + "bezel", bezel); + Preferences.set(P + "homeIndicator", homeIndicator); + Preferences.set(P + "safeTop", safeTop); + Preferences.set(P + "safeBottom", safeBottom); + Preferences.set(P + "cutoutCount", cutouts.size()); + for (int i = 0; i < cutouts.size(); i++) { + Cutout c = cutouts.get(i); + String k = P + "cut." + i + "."; + Preferences.set(k + "type", c.type); + Preferences.set(k + "w", c.w); + Preferences.set(k + "h", c.h); + Preferences.set(k + "x", c.x); + Preferences.set(k + "y", c.y); + Preferences.set(k + "name", c.name); + } + } + + public void load() { + presetId = Preferences.get(P + "presetId", presetId); + name = Preferences.get(P + "name", name); + cornerR = Preferences.get(P + "cornerR", cornerR); + bezel = Preferences.get(P + "bezel", bezel); + homeIndicator = Preferences.get(P + "homeIndicator", homeIndicator); + safeTop = Preferences.get(P + "safeTop", safeTop); + safeBottom = Preferences.get(P + "safeBottom", safeBottom); + int n = Preferences.get(P + "cutoutCount", 0); + cutouts = new ArrayList<>(); + for (int i = 0; i < n; i++) { + String k = P + "cut." + i + "."; + Cutout c = new Cutout( + Preferences.get(k + "type", CUTOUT_HOLE), + Preferences.get(k + "w", 28), + Preferences.get(k + "h", 28), + Preferences.get(k + "x", 0), + Preferences.get(k + "y", 20), + Preferences.get(k + "name", "Cutout")); + cutouts.add(c); + } + } + + public static void clearPersisted() { + for (String key : new String[]{"presetId", "name", "cornerR", "bezel", + "homeIndicator", "safeTop", "safeBottom", "cutoutCount"}) { + Preferences.delete(P + key); + } + for (int i = 0; i < 32; i++) { + String k = P + "cut." + i + "."; + for (String f : new String[]{"type", "w", "h", "x", "y", "name"}) { + Preferences.delete(k + f); + } + } + } +} diff --git a/scripts/skindesigner/common/src/main/resources/devices.json b/scripts/skindesigner/common/src/main/resources/devices.json new file mode 100644 index 0000000000..708bec4219 --- /dev/null +++ b/scripts/skindesigner/common/src/main/resources/devices.json @@ -0,0 +1 @@ +{"version":1,"generator":"build_devices_json.py","source":"/tmp/khalsci.csv","sourceFormat":"khalsci","count":5072,"devices":[{"id":"apple_apple_ipad_air_11_2024","brand":"Apple","name":"Apple iPad Air 11 (2024)","os":"iPadOS 17.4, upgradable to iPadOS 18","year":2024,"form":"Tablet","tablet":true,"w":1640,"h":2360,"ppi":264,"inches":11.0,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_ipad_air_13_2024","brand":"Apple","name":"Apple iPad Air 13 (2024)","os":"iPadOS 17.5.1, upgradable to iPadOS 18","year":2024,"form":"Tablet","tablet":true,"w":2048,"h":2732,"ppi":264,"inches":13.0,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_ipad_pro_11_2024","brand":"Apple","name":"Apple iPad Pro 11 (2024)","os":"iPadOS 17.5.1, upgradable to iPadOS 18","year":2024,"form":"Tablet","tablet":true,"w":1668,"h":2420,"ppi":264,"inches":11.0,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_ipad_pro_13_2024","brand":"Apple","name":"Apple iPad Pro 13 (2024)","os":"iPadOS 17.5.1, upgradable to iPadOS 18","year":2024,"form":"Tablet","tablet":true,"w":2064,"h":2752,"ppi":264,"inches":13.0,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_iphone_16","brand":"Apple","name":"Apple iPhone 16","os":"iOS 18","year":2024,"form":"Phone","tablet":false,"w":1179,"h":2556,"ppi":460,"inches":6.1,"platform":"ios","hasNotch":false,"hasIsland":true,"hasHole":false,"hasHome":true,"safeTop":59,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_16_plus","brand":"Apple","name":"Apple iPhone 16 Plus","os":"iOS 18","year":2024,"form":"Phone","tablet":false,"w":1290,"h":2796,"ppi":460,"inches":6.7,"platform":"ios","hasNotch":false,"hasIsland":true,"hasHole":false,"hasHome":true,"safeTop":59,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_16_pro","brand":"Apple","name":"Apple iPhone 16 Pro","os":"iOS 18","year":2024,"form":"Phone","tablet":false,"w":1206,"h":2622,"ppi":460,"inches":6.3,"platform":"ios","hasNotch":false,"hasIsland":true,"hasHole":false,"hasHome":true,"safeTop":59,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_16_pro_max","brand":"Apple","name":"Apple iPhone 16 Pro Max","os":"iOS 18","year":2024,"form":"Phone","tablet":false,"w":1320,"h":2868,"ppi":460,"inches":6.9,"platform":"ios","hasNotch":false,"hasIsland":true,"hasHole":false,"hasHome":true,"safeTop":59,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"asus_asus_rog_phone_8","brand":"Asus","name":"Asus ROG Phone 8","os":"Android 14, up to 2 major Android upgrades","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_rog_phone_8_pro","brand":"Asus","name":"Asus ROG Phone 8 Pro","os":"Android 14, up to 2 major Android upgrades","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_11_ultra","brand":"Asus","name":"Asus Zenfone 11 Ultra","os":"Android 14, up to 2 major Android upgrades","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bl8000","brand":"Blackview","name":"Blackview BL8000","os":"Android 13, Doke-OS 4.0","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bl9000","brand":"Blackview","name":"Blackview BL9000","os":"Android 13, Doke-OS 4.0","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bl9000_pro","brand":"Blackview","name":"Blackview BL9000 Pro","os":"Android 14, Doke-OS 4.0","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bv8100","brand":"Blackview","name":"Blackview BV8100","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_color_8","brand":"Blackview","name":"Blackview Color 8","os":"Android 13, Doke OS 4.0","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_hero_10","brand":"Blackview","name":"Blackview Hero 10","os":"Android 13, DokeOS 4","year":2024,"form":"Foldable","tablet":false,"w":1080,"h":2560,"ppi":403,"inches":6.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_mega_1","brand":"Blackview","name":"Blackview Mega 1","os":"Android 13, DokeOS_P 4.0","year":2024,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":203,"inches":11.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_16_pro","brand":"Blackview","name":"Blackview Tab 16 Pro","os":"Android 14","year":2024,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":206,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_a1","brand":"Cubot","name":"Cubot A1","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_a10","brand":"Cubot","name":"Cubot A10","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_a20","brand":"Cubot","name":"Cubot A20","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_hafury_meet","brand":"Cubot","name":"Cubot Hafury Meet","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_hafury_v1","brand":"Cubot","name":"Cubot Hafury V1","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_kingkong_ace_3","brand":"Cubot","name":"Cubot KingKong Ace 3","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_kingkong_ax","brand":"Cubot","name":"Cubot KingKong AX","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_kingkong_es","brand":"Cubot","name":"Cubot KingKong ES","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_kingkong_power_3","brand":"Cubot","name":"Cubot KingKong Power 3","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":393,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_kingkong_star_2","brand":"Cubot","name":"Cubot KingKong Star 2","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_kingkong_x","brand":"Cubot","name":"Cubot KingKong X","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_max_5","brand":"Cubot","name":"Cubot Max 5","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":387,"inches":6.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_tab_50","brand":"Cubot","name":"Cubot Tab 50","os":"Android 13","year":2024,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":224,"inches":10.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_tab_60","brand":"Cubot","name":"Cubot Tab 60","os":"Android 13","year":2024,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_x1","brand":"Cubot","name":"Cubot X1","os":"Proprietary OS","year":2024,"form":"Phone","tablet":false,"w":410,"h":502,"ppi":304,"inches":2.13,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_x90","brand":"Cubot","name":"Cubot X90","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_blade10","brand":"Doogee","name":"Doogee Blade10","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_blade10_max","brand":"Doogee","name":"Doogee Blade10 Max","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_blade10_pro","brand":"Doogee","name":"Doogee Blade10 Pro","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_blade10_ultra","brand":"Doogee","name":"Doogee Blade10 Ultra","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_dk10","brand":"Doogee","name":"Doogee DK10","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_n55","brand":"Doogee","name":"Doogee N55","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_n55_pro","brand":"Doogee","name":"Doogee N55 Pro","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s_cyber","brand":"Doogee","name":"Doogee S Cyber","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s_punk","brand":"Doogee","name":"Doogee S Punk","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s118","brand":"Doogee","name":"Doogee S118","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s200","brand":"Doogee","name":"Doogee S200","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_t30_max","brand":"Doogee","name":"Doogee T30 Max","os":"Android 14","year":2024,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":243,"inches":12.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_v_max_plus","brand":"Doogee","name":"Doogee V Max Plus","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_v20s","brand":"Doogee","name":"Doogee V20S","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":410,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_h67g","brand":"Energizer","name":"Energizer H67G","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_hard_case_p28k","brand":"Energizer","name":"Energizer Hard Case P28K","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_u683s","brand":"Energizer","name":"Energizer U683S","os":"Android 13 (Go edition)","year":2024,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_ultimate_65g","brand":"Energizer","name":"Energizer Ultimate 65G","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_ultimate_u652s","brand":"Energizer","name":"Energizer Ultimate U652S","os":"Android 13 (Go edition)","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_8a","brand":"Google","name":"Google Pixel 8a","os":"Android 14, up to 7 major Android upgrades","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":430,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_9","brand":"Google","name":"Google Pixel 9","os":"Android 14, up to 7 major Android upgrades","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2424,"ppi":422,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_9_pro","brand":"Google","name":"Google Pixel 9 Pro","os":"Android 14, up to 7 major Android upgrades","year":2024,"form":"Phone","tablet":false,"w":1280,"h":2856,"ppi":495,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_9_pro_fold","brand":"Google","name":"Google Pixel 9 Pro Fold","os":"Android 14, up to 7 major Android upgrades","year":2024,"form":"Foldable","tablet":true,"w":2076,"h":2152,"ppi":373,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_9_pro_xl","brand":"Google","name":"Google Pixel 9 Pro XL","os":"Android 14, up to 7 major Android upgrades","year":2024,"form":"Phone","tablet":false,"w":1344,"h":2992,"ppi":486,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_200","brand":"Honor","name":"Honor 200","os":"Android 14, MagicOS 8","year":2024,"form":"Phone","tablet":false,"w":1200,"h":2664,"ppi":436,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_200_lite","brand":"Honor","name":"Honor 200 Lite","os":"Android 14, MagicOS 8","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_200_pro","brand":"Honor","name":"Honor 200 Pro","os":"Android 14, up to 4 major Android upgrades, MagicOS 8","year":2024,"form":"Phone","tablet":false,"w":1224,"h":2700,"ppi":437,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_200_smart","brand":"Honor","name":"Honor 200 Smart","os":"Android 14, Magic OS 8","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":389,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_90_smart","brand":"Honor","name":"Honor 90 Smart","os":"Android 13, Magic OS 7.2","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":389,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_choice_watch","brand":"Honor","name":"Honor Choice Watch","os":"Proprietary OS","year":2024,"form":"Phone","tablet":false,"w":410,"h":502,"ppi":332,"inches":1.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic_v_flip","brand":"Honor","name":"Honor Magic V Flip","os":"Android 14, MagicOS 8","year":2024,"form":"Foldable","tablet":false,"w":1080,"h":2520,"ppi":403,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic_v2_rsr_porsche_design","brand":"Honor","name":"Honor Magic V2 RSR Porsche Design","os":"Android 13, upgradable to Android 14, MagicOS 8","year":2024,"form":"Foldable","tablet":true,"w":2156,"h":2344,"ppi":402,"inches":7.92,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic_v3","brand":"Honor","name":"Honor Magic V3","os":"Android 14, MagicOS 8.0.1","year":2024,"form":"Foldable","tablet":true,"w":2156,"h":2344,"ppi":402,"inches":7.92,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic_vs3","brand":"Honor","name":"Honor Magic Vs3","os":"Android 14, MagicOS 8.0.1","year":2024,"form":"Foldable","tablet":true,"w":2156,"h":2344,"ppi":402,"inches":7.92,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic6","brand":"Honor","name":"Honor Magic6","os":"Android 14, MagicOS 8","year":2024,"form":"Phone","tablet":false,"w":1264,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic6_pro","brand":"Honor","name":"Honor Magic6 Pro","os":"Android 14, up to 4 major Android upgrades, MagicOS 8","year":2024,"form":"Phone","tablet":false,"w":1280,"h":2800,"ppi":453,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic6_rsr_porsche_design","brand":"Honor","name":"Honor Magic6 RSR Porsche Design","os":"Android 14, MagicOS 8","year":2024,"form":"Phone","tablet":false,"w":1280,"h":2800,"ppi":453,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic6_ultimate","brand":"Honor","name":"Honor Magic6 Ultimate","os":"Android 14, MagicOS 8","year":2024,"form":"Phone","tablet":false,"w":1280,"h":2800,"ppi":453,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magicpad_2_12.3","brand":"Honor","name":"Honor MagicPad 2 12.3","os":"Android 14, MagicOS 8.0.1","year":2024,"form":"Tablet","tablet":true,"w":1920,"h":3000,"ppi":290,"inches":12.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_pad_9_pro","brand":"Honor","name":"Honor Pad 9 Pro","os":"Android 14, Magic OS 8.1","year":2024,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":249,"inches":12.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_pad_x8a","brand":"Honor","name":"Honor Pad X8a","os":"Android 14, MagicOS 8","year":2024,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":206,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play_60_plus","brand":"Honor","name":"Honor Play 60 Plus","os":"Android 14, Magic OS 8","year":2024,"form":"Phone","tablet":false,"w":720,"h":1610,"ppi":261,"inches":6.77,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x50_gt","brand":"Honor","name":"Honor X50 GT","os":"Android 13, MagicOS 7.2","year":2024,"form":"Phone","tablet":false,"w":1220,"h":2652,"ppi":431,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x60i","brand":"Honor","name":"Honor X60i","os":"Android 14, MagicOS 8","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x6b","brand":"Honor","name":"Honor X6b","os":"Android 14, Magic OS 8","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x7b_5g","brand":"Honor","name":"Honor X7b 5G","os":"Android 13, Magic OS 7.2","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":389,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x7b_5g_50_mp","brand":"Honor","name":"Honor X7b 5G (50 MP)","os":"Android 13, Magic OS 7.2","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":389,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_a101_plus","brand":"Htc","name":"HTC A101 Plus","os":"Android 14","year":2024,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":207,"inches":10.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_u24_pro","brand":"Htc","name":"HTC U24 Pro","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2436,"ppi":392,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_enjoy_70z","brand":"Huawei","name":"Huawei Enjoy 70z","os":"HarmonyOS 4.0","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_xt_ultimate","brand":"Huawei","name":"Huawei Mate XT Ultimate","os":"HarmonyOS 4.2 (China)","year":2024,"form":"Foldable","tablet":true,"w":2232,"h":3184,"ppi":381,"inches":10.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_11.5_s","brand":"Huawei","name":"Huawei MatePad 11.5 S","os":"Harmony OS 4.2","year":2024,"form":"Tablet","tablet":true,"w":1840,"h":2800,"ppi":291,"inches":11.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_12_x","brand":"Huawei","name":"Huawei MatePad 12 X","os":"HarmonyOS 4.2","year":2024,"form":"Tablet","tablet":true,"w":2800,"h":1840,"ppi":279,"inches":12.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_air_2024","brand":"Huawei","name":"Huawei MatePad Air (2024)","os":"HarmonyOS 4.2","year":2024,"form":"Tablet","tablet":true,"w":2800,"h":1840,"ppi":279,"inches":12.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_pro_12.2_2024","brand":"Huawei","name":"Huawei MatePad Pro 12.2 (2024)","os":"HarmonyOS 4.2","year":2024,"form":"Tablet","tablet":true,"w":2800,"h":1840,"ppi":275,"inches":12.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_se_11","brand":"Huawei","name":"Huawei MatePad SE 11","os":"HarmonyOS 2.0","year":2024,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":206,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_12_se","brand":"Huawei","name":"Huawei nova 12 SE","os":"EMUI 14, no Google Play Services","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_12i","brand":"Huawei","name":"Huawei nova 12i","os":"EMUI 14, no Google Play Services","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":391,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_12s","brand":"Huawei","name":"Huawei nova 12s","os":"EMUI 14, no Google Play Services","year":2024,"form":"Phone","tablet":false,"w":1084,"h":2412,"ppi":395,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_flip","brand":"Huawei","name":"Huawei nova Flip","os":"HarmonyOS 4.2","year":2024,"form":"Foldable","tablet":false,"w":1136,"h":2690,"ppi":421,"inches":6.94,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_y72","brand":"Huawei","name":"Huawei nova Y72","os":"EMUI 12","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_pocket_2","brand":"Huawei","name":"Huawei Pocket 2","os":"HarmonyOS 4.0","year":2024,"form":"Foldable","tablet":false,"w":1136,"h":2690,"ppi":420,"inches":6.94,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_pura_70","brand":"Huawei","name":"Huawei Pura 70","os":"EMUI 14.2 (International), HarmonyOS 4.2 (China)","year":2024,"form":"Phone","tablet":false,"w":1256,"h":2760,"ppi":460,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_pura_70_pro","brand":"Huawei","name":"Huawei Pura 70 Pro","os":"EMUI 14.2 (International), HarmonyOS 4.2 (China)","year":2024,"form":"Phone","tablet":false,"w":1260,"h":2844,"ppi":460,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_pura_70_pro+","brand":"Huawei","name":"Huawei Pura 70 Pro+","os":"HarmonyOS 4.2","year":2024,"form":"Phone","tablet":false,"w":1260,"h":2844,"ppi":460,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_pura_70_ultra","brand":"Huawei","name":"Huawei Pura 70 Ultra","os":"EMUI 14.2 (International), HarmonyOS 4.2 (China)","year":2024,"form":"Phone","tablet":false,"w":1260,"h":2844,"ppi":460,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_gt_20_pro","brand":"Infinix","name":"Infinix GT 20 Pro","os":"Android 14, XOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2436,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_50","brand":"Infinix","name":"Infinix Hot 50","os":"Android 14, XOS 14.5","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":262,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_50_4g","brand":"Infinix","name":"Infinix Hot 50 4G","os":"Android 14, XOS 14.5","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_50i","brand":"Infinix","name":"Infinix Hot 50i","os":"Android 14, XOS 14.5","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":262,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_40_5g","brand":"Infinix","name":"Infinix Note 40 5G","os":"Android 14, XOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2436,"ppi":393,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_40_pro","brand":"Infinix","name":"Infinix Note 40 Pro","os":"Android 14, XOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2436,"ppi":393,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_40_pro_4g","brand":"Infinix","name":"Infinix Note 40 Pro 4G","os":"Android 14, XOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2436,"ppi":393,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_40_pro+","brand":"Infinix","name":"Infinix Note 40 Pro+","os":"Android 14, up to 2 major Android upgrades, XOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2436,"ppi":393,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_40x_5g","brand":"Infinix","name":"Infinix Note 40X 5G","os":"Android 14, XOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart_8_india","brand":"Infinix","name":"Infinix Smart 8 (India)","os":"Android 13 (Go edition), XOS 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart_8_plus","brand":"Infinix","name":"Infinix Smart 8 Plus","os":"Android 13 (Go edition), XOS 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart_8_pro","brand":"Infinix","name":"Infinix Smart 8 Pro","os":"Android 13 (Go edition), XOS 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart_9","brand":"Infinix","name":"Infinix Smart 9","os":"Android 14 (Go edition), XOS 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":262,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_xpad","brand":"Infinix","name":"Infinix Xpad","os":"Android 14, XOS 14","year":2024,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":206,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_zero_40","brand":"Infinix","name":"Infinix Zero 40","os":"Android 14, up to 2 major Android upgrades, XOS 14.5","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2436,"ppi":393,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_zero_40_4g","brand":"Infinix","name":"Infinix Zero 40 4G","os":"Android 14, up to 2 major Android upgrades, XOS 14.5","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2436,"ppi":393,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_zero_flip","brand":"Infinix","name":"Infinix Zero Flip","os":"Android 14, up to 2 major Android upgrades, XOS 14.5","year":2024,"form":"Foldable","tablet":false,"w":1080,"h":2640,"ppi":413,"inches":6.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_a50","brand":"Itel","name":"itel A50","os":"Android 14 (Go edition)","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_a50c","brand":"Itel","name":"itel A50C","os":"Android 14 (Go edition)","year":2024,"form":"Phone","tablet":false,"w":540,"h":1208,"ppi":202,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_a80","brand":"Itel","name":"itel A80","os":"Android 14, itel OS 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":262,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_p55","brand":"Itel","name":"itel P55","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_p55+","brand":"Itel","name":"itel P55+","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_p65","brand":"Itel","name":"itel P65","os":"Android 14, itel OS 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":262,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_rs4","brand":"Itel","name":"itel RS4","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_s24","brand":"Itel","name":"itel S24","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_vistatab_30","brand":"Itel","name":"itel VistaTab 30","os":"Android 13","year":2024,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":206,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_legion_tab","brand":"Lenovo","name":"Lenovo Legion Tab","os":"Android 13","year":2024,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":343,"inches":8.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_k11_plus","brand":"Lenovo","name":"Lenovo Tab K11 Plus","os":"Android 14","year":2024,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":204,"inches":11.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_m11","brand":"Lenovo","name":"Lenovo Tab M11","os":"Android 13","year":2024,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":206,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_plus","brand":"Lenovo","name":"Lenovo Tab Plus","os":"Android 14","year":2024,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":203,"inches":11.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_21_note","brand":"Meizu","name":"Meizu 21 Note","os":"Flyme OS","year":2024,"form":"Phone","tablet":false,"w":1264,"h":2780,"ppi":450,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_21_pro","brand":"Meizu","name":"Meizu 21 Pro","os":"Android, Flyme","year":2024,"form":"Phone","tablet":false,"w":1368,"h":3192,"ppi":512,"inches":6.79,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_blue_20","brand":"Meizu","name":"Meizu Blue 20","os":"Flyme AIOS","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":404,"inches":6.52,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"meizu_meizu_lucky_08","brand":"Meizu","name":"Meizu Lucky 08","os":"Flyme AIOS","year":2024,"form":"Phone","tablet":false,"w":1264,"h":2780,"ppi":450,"inches":6.78,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"meizu_meizu_note_21","brand":"Meizu","name":"Meizu Note 21","os":"Flyme OS","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_note_21_pro","brand":"Meizu","name":"Meizu Note 21 Pro","os":"Flyme OS","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_2024","brand":"Motorola","name":"Motorola Edge (2024)","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_50","brand":"Motorola","name":"Motorola Edge 50","os":"Android 14, up to 5 major Android upgrades","year":2024,"form":"Phone","tablet":false,"w":1220,"h":2712,"ppi":446,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_50_fusion","brand":"Motorola","name":"Motorola Edge 50 Fusion","os":"Android 14, up to 3 major Android upgrades","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_50_neo","brand":"Motorola","name":"Motorola Edge 50 Neo","os":"Android 14, up to 5 major Android upgrades","year":2024,"form":"Phone","tablet":false,"w":1256,"h":2760,"ppi":474,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_50_pro","brand":"Motorola","name":"Motorola Edge 50 Pro","os":"Android 14, up to 3 major Android upgrades","year":2024,"form":"Phone","tablet":false,"w":1220,"h":2712,"ppi":446,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_50_ultra","brand":"Motorola","name":"Motorola Edge 50 Ultra","os":"Android 14, up to 3 major Android upgrades","year":2024,"form":"Phone","tablet":false,"w":1220,"h":2712,"ppi":446,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e14","brand":"Motorola","name":"Motorola Moto E14","os":"Android 14 (Go edition)","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_2024","brand":"Motorola","name":"Motorola Moto G (2024)","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_play_2024","brand":"Motorola","name":"Motorola Moto G Play (2024)","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_power_2024","brand":"Motorola","name":"Motorola Moto G Power (2024)","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_stylus_5g_2024","brand":"Motorola","name":"Motorola Moto G Stylus 5G (2024)","os":"Android 14, up to 1 major Android upgrades","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g04","brand":"Motorola","name":"Motorola Moto G04","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g04s","brand":"Motorola","name":"Motorola Moto G04s","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g24","brand":"Motorola","name":"Motorola Moto G24","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g24_power","brand":"Motorola","name":"Motorola Moto G24 Power","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g35","brand":"Motorola","name":"Motorola Moto G35","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g45","brand":"Motorola","name":"Motorola Moto G45","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g55","brand":"Motorola","name":"Motorola Moto G55","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.49,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g64","brand":"Motorola","name":"Motorola Moto G64","os":"Android 14, planned upgrade to Android 15","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g75","brand":"Motorola","name":"Motorola Moto G75","os":"Android 14, up to 5 major Android upgrades","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":387,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g85","brand":"Motorola","name":"Motorola Moto G85","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_s50","brand":"Motorola","name":"Motorola Moto S50","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1272,"h":2670,"ppi":460,"inches":6.36,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_x50_ultra","brand":"Motorola","name":"Motorola Moto X50 Ultra","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1220,"h":2712,"ppi":444,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_razr_2024","brand":"Motorola","name":"Motorola razr 2024","os":"Android 14","year":2024,"form":"Foldable","tablet":false,"w":1080,"h":2640,"ppi":413,"inches":6.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_razr_50","brand":"Motorola","name":"Motorola Razr 50","os":"Android 14","year":2024,"form":"Foldable","tablet":false,"w":1080,"h":2640,"ppi":413,"inches":6.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_razr_50_ultra","brand":"Motorola","name":"Motorola Razr 50 Ultra","os":"Android 14, up to 3 major Android upgrades","year":2024,"form":"Foldable","tablet":false,"w":1080,"h":2640,"ppi":413,"inches":6.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_razr+_2024","brand":"Motorola","name":"Motorola razr+ 2024","os":"Android 14","year":2024,"form":"Foldable","tablet":false,"w":1080,"h":2640,"ppi":413,"inches":6.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_s50_neo","brand":"Motorola","name":"Motorola S50 Neo","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_thinkphone_25","brand":"Motorola","name":"Motorola ThinkPhone 25","os":"Android 14, up to 5 major Android upgrades","year":2024,"form":"Phone","tablet":false,"w":1220,"h":2670,"ppi":462,"inches":6.36,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nothing_nothing_cmf_phone_1","brand":"Nothing","name":"Nothing CMF Phone 1","os":"Android 14, up to 2 major Android upgrades","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nothing_nothing_phone_2a","brand":"Nothing","name":"Nothing Phone (2a)","os":"Android 14, up to 3 major Android upgrades, Nothing OS 2.6","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nothing_nothing_phone_2a_plus","brand":"Nothing","name":"Nothing Phone (2a) Plus","os":"Android 14, up to 3 major Android upgrades, Nothing OS 2.6","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":395,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_12r","brand":"Oneplus","name":"OnePlus 12R","os":"Android 14, up to 3 major Android upgrades, OxygenOS 14","year":2024,"form":"Phone","tablet":false,"w":1264,"h":2780,"ppi":450,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_ace_3","brand":"Oneplus","name":"OnePlus Ace 3","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":1264,"h":2780,"ppi":450,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_ace_3_pro","brand":"Oneplus","name":"OnePlus Ace 3 Pro","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":1264,"h":2780,"ppi":450,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_ace_3v","brand":"Oneplus","name":"OnePlus Ace 3V","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":1240,"h":2772,"ppi":451,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_nord_4","brand":"Oneplus","name":"OnePlus Nord 4","os":"Android 14, up to 4 major Android upgrades, OxygenOS 14.1","year":2024,"form":"Phone","tablet":false,"w":1240,"h":2772,"ppi":450,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_nord_ce4","brand":"Oneplus","name":"OnePlus Nord CE4","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_nord_ce4_lite","brand":"Oneplus","name":"OnePlus Nord CE4 Lite","os":"Android 14, OxygenOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_nord_ce4_lite_india","brand":"Oneplus","name":"OnePlus Nord CE4 Lite (India)","os":"Android 14, OxygenOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_nord_n30_se","brand":"Oneplus","name":"OnePlus Nord N30 SE","os":"Android 13, OxygenOS 13.1","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_pad_2","brand":"Oneplus","name":"OnePlus Pad 2","os":"Android 14, OxygenOS 14.1","year":2024,"form":"Tablet","tablet":true,"w":2120,"h":3000,"ppi":304,"inches":12.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_pad_pro","brand":"Oneplus","name":"OnePlus Pad Pro","os":"Android 14, OxygenOS 14.1","year":2024,"form":"Tablet","tablet":true,"w":2120,"h":3000,"ppi":304,"inches":12.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a3","brand":"Oppo","name":"Oppo A3","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1604,"ppi":264,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a3_china","brand":"Oppo","name":"Oppo A3 (China)","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a3_4g","brand":"Oppo","name":"Oppo A3 4G","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1604,"ppi":264,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a3_pro","brand":"Oppo","name":"Oppo A3 Pro","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1604,"ppi":264,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a3_pro_china","brand":"Oppo","name":"Oppo A3 Pro (China)","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a3x","brand":"Oppo","name":"Oppo A3x","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1604,"ppi":264,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a3x_china","brand":"Oppo","name":"Oppo A3x (China)","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1604,"ppi":264,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a3x_4g","brand":"Oppo","name":"Oppo A3x 4G","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1604,"ppi":264,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a60","brand":"Oppo","name":"Oppo A60","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1604,"ppi":264,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a80","brand":"Oppo","name":"Oppo A80","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1604,"ppi":264,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f25_pro","brand":"Oppo","name":"Oppo F25 Pro","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f27","brand":"Oppo","name":"Oppo F27","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f27_pro+","brand":"Oppo","name":"Oppo F27 Pro+","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_x7","brand":"Oppo","name":"Oppo Find X7","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":1264,"h":2780,"ppi":450,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_x7_ultra","brand":"Oppo","name":"Oppo Find X7 Ultra","os":"Android 14, up to 4 major Android upgrades, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":1440,"h":3168,"ppi":510,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_k12","brand":"Oppo","name":"Oppo K12","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_k12x","brand":"Oppo","name":"Oppo K12x","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1604,"ppi":264,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_k12x_china","brand":"Oppo","name":"Oppo K12x (China)","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_pad_neo","brand":"Oppo","name":"Oppo Pad Neo","os":"Android 13, ColorOS 13.2","year":2024,"form":"Tablet","tablet":true,"w":1720,"h":2408,"ppi":260,"inches":11.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno11","brand":"Oppo","name":"Oppo Reno11","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno11_f","brand":"Oppo","name":"Oppo Reno11 F","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno11_pro","brand":"Oppo","name":"Oppo Reno11 Pro","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno12","brand":"Oppo","name":"Oppo Reno12","os":"Android 14, up to 3 major Android upgrades, ColorOS 14.1","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno12_china","brand":"Oppo","name":"Oppo Reno12 (China)","os":"Android 14, ColorOS 14.1","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno12_f","brand":"Oppo","name":"Oppo Reno12 F","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno12_f_4g","brand":"Oppo","name":"Oppo Reno12 F 4G","os":"Android 14, ColorOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno12_pro","brand":"Oppo","name":"Oppo Reno12 Pro","os":"Android 14, up to 3 major Android upgrades, ColorOS 14.1","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno12_pro_china","brand":"Oppo","name":"Oppo Reno12 Pro (China)","os":"Android 14, ColorOS 14.1","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_bt80","brand":"Oukitel","name":"Oukitel BT80","os":"Proprietary OS","year":2024,"form":"Phone","tablet":false,"w":410,"h":502,"ppi":304,"inches":2.13,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_c37","brand":"Oukitel","name":"Oukitel C37","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_c38","brand":"Oukitel","name":"Oukitel C38","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_c50","brand":"Oukitel","name":"Oukitel C50","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":258,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_c51","brand":"Oukitel","name":"Oukitel C51","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":258,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_c53","brand":"Oukitel","name":"Oukitel C53","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_g1","brand":"Oukitel","name":"Oukitel G1","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":576,"h":1280,"ppi":215,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_g2","brand":"Oukitel","name":"Oukitel G2","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":576,"h":1156,"ppi":215,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_ot11","brand":"Oukitel","name":"Oukitel OT11","os":"Android 14","year":2024,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":137,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_ot12","brand":"Oukitel","name":"Oukitel OT12","os":"Android 14","year":2024,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":137,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_ot6","brand":"Oukitel","name":"Oukitel OT6","os":"Android 13","year":2024,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_ot8","brand":"Oukitel","name":"Oukitel OT8","os":"Android 13","year":2024,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":206,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_rt8","brand":"Oukitel","name":"Oukitel RT8","os":"Android 13","year":2024,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":206,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_rt9","brand":"Oukitel","name":"Oukitel RT9","os":"Android 14","year":2024,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp28_e","brand":"Oukitel","name":"Oukitel WP28 E","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp28_s","brand":"Oukitel","name":"Oukitel WP28 S","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp32_pro","brand":"Oukitel","name":"Oukitel WP32 Pro","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":576,"h":1152,"ppi":215,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp33_pro","brand":"Oukitel","name":"Oukitel WP33 Pro","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp35","brand":"Oukitel","name":"Oukitel WP35","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp36","brand":"Oukitel","name":"Oukitel WP36","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp38","brand":"Oukitel","name":"Oukitel WP38","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp39","brand":"Oukitel","name":"Oukitel WP39","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp50","brand":"Oukitel","name":"Oukitel WP50","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp52","brand":"Oukitel","name":"Oukitel WP52","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_12","brand":"Realme","name":"Realme 12","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_12_4g","brand":"Realme","name":"Realme 12 4G","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_12_lite","brand":"Realme","name":"Realme 12 Lite","os":"Android 14, Realme UI","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_12_pro","brand":"Realme","name":"Realme 12 Pro","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_12_pro+","brand":"Realme","name":"Realme 12 Pro+","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_12+","brand":"Realme","name":"Realme 12+","os":"Android 14, up to 2 major Android upgrades, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_12x","brand":"Realme","name":"Realme 12x","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":720,"h":1604,"ppi":264,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_12x_india","brand":"Realme","name":"Realme 12x (India)","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_13","brand":"Realme","name":"Realme 13","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_13_4g","brand":"Realme","name":"Realme 13 4G","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_13_pro","brand":"Realme","name":"Realme 13 Pro","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_13_pro+","brand":"Realme","name":"Realme 13 Pro+","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_13+","brand":"Realme","name":"Realme 13+","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c51s","brand":"Realme","name":"Realme C51s","os":"Android 13, Realme UI","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c61","brand":"Realme","name":"Realme C61","os":"Android 14, Realme UI","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c61_india","brand":"Realme","name":"Realme C61 (India)","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c63","brand":"Realme","name":"Realme C63","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c63_5g","brand":"Realme","name":"Realme C63 5G","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":720,"h":1604,"ppi":264,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c65","brand":"Realme","name":"Realme C65","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":720,"h":1604,"ppi":264,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c65_5g","brand":"Realme","name":"Realme C65 5G","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":720,"h":1604,"ppi":264,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt_6","brand":"Realme","name":"Realme GT 6","os":"Android 14, up to 3 major Android upgrades, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":1264,"h":2780,"ppi":450,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt_neo6","brand":"Realme","name":"Realme GT Neo6","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":1264,"h":2780,"ppi":450,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt_neo6_se","brand":"Realme","name":"Realme GT Neo6 SE","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":1264,"h":2780,"ppi":450,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt6_china","brand":"Realme","name":"Realme GT6 (China)","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":1264,"h":2780,"ppi":450,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_70","brand":"Realme","name":"Realme Narzo 70","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_70_pro","brand":"Realme","name":"Realme Narzo 70 Pro","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_70_turbo","brand":"Realme","name":"Realme Narzo 70 Turbo","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_70x","brand":"Realme","name":"Realme Narzo 70x","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_n61","brand":"Realme","name":"Realme Narzo N61","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_n63","brand":"Realme","name":"Realme Narzo N63","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_n65","brand":"Realme","name":"Realme Narzo N65","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":720,"h":1604,"ppi":264,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_note_50","brand":"Realme","name":"Realme Note 50","os":"Android 13, Realme UI T","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_note_60","brand":"Realme","name":"Realme Note 60","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_p1","brand":"Realme","name":"Realme P1","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_p1_pro","brand":"Realme","name":"Realme P1 Pro","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_p2_pro","brand":"Realme","name":"Realme P2 Pro","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_pad_2_lite","brand":"Realme","name":"Realme Pad 2 Lite","os":"Android 14, Realme UI 5.0 for Pad","year":2024,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":207,"inches":10.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_v60","brand":"Realme","name":"Realme V60","os":"Android 14, Realme UI 5.0","year":2024,"form":"Phone","tablet":false,"w":720,"h":1604,"ppi":264,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a06","brand":"Samsung","name":"Samsung Galaxy A06","os":"Android 14, up to 2 major Android upgrades","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":262,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a16_5g","brand":"Samsung","name":"Samsung Galaxy A16 5G","os":"Android 14, up to 6 major Android upgrades, One UI 6.1","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":385,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a35","brand":"Samsung","name":"Samsung Galaxy A35","os":"Android 14, up to 4 major Android upgrades, One UI 6.1","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":390,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a55","brand":"Samsung","name":"Samsung Galaxy A55","os":"Android 14, up to 4 major Android upgrades, One UI 6.1","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":390,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_c55","brand":"Samsung","name":"Samsung Galaxy C55","os":"Android 14, One UI 6.1","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_f05","brand":"Samsung","name":"Samsung Galaxy F05","os":"Android 14, up to 2 major Android upgrades, One UI Core 6.0","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":262,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_f14_4g","brand":"Samsung","name":"Samsung Galaxy F14 4G","os":"Android 14, up to 2 major Android upgrades, One UI 6.1","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_f15","brand":"Samsung","name":"Samsung Galaxy F15","os":"Android 14, One UI 6","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":390,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_f55","brand":"Samsung","name":"Samsung Galaxy F55","os":"Android 14, One UI 6.1","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m05","brand":"Samsung","name":"Samsung Galaxy M05","os":"Android 14, up to 2 major Android upgrades, One UI Core 6.0","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":262,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m14_4g","brand":"Samsung","name":"Samsung Galaxy M14 4G","os":"Android 13, One UI 5.1","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m15","brand":"Samsung","name":"Samsung Galaxy M15","os":"Android 14, One UI 6","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":396,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m35","brand":"Samsung","name":"Samsung Galaxy M35","os":"Android 14, One UI 6.1","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":390,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m55","brand":"Samsung","name":"Samsung Galaxy M55","os":"Android 14, One UI 6.1","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m55s","brand":"Samsung","name":"Samsung Galaxy M55s","os":"Android 14, up to 4 major Android upgrades, One UI 6.1","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s24","brand":"Samsung","name":"Samsung Galaxy S24","os":"Android 14, up to 7 major Android upgrades, One UI 6.1.1","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":416,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s24_fe","brand":"Samsung","name":"Samsung Galaxy S24 FE","os":"Android 14, One UI 6.1","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":385,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s24_ultra","brand":"Samsung","name":"Samsung Galaxy S24 Ultra","os":"Android 14, up to 7 major Android upgrades, One UI 6.1.1","year":2024,"form":"Phone","tablet":false,"w":1440,"h":3120,"ppi":505,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s24+","brand":"Samsung","name":"Samsung Galaxy S24+","os":"Android 14, up to 7 major Android upgrades, One UI 6.1.1","year":2024,"form":"Phone","tablet":false,"w":1440,"h":3120,"ppi":513,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_active5","brand":"Samsung","name":"Samsung Galaxy Tab Active5","os":"Android 14, One UI 6","year":2024,"form":"Tablet","tablet":true,"w":1920,"h":1200,"ppi":283,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s10_ultra","brand":"Samsung","name":"Samsung Galaxy Tab S10 Ultra","os":"Android 14, One UI 6.1","year":2024,"form":"Tablet","tablet":true,"w":1848,"h":2960,"ppi":239,"inches":14.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s10+","brand":"Samsung","name":"Samsung Galaxy Tab S10+","os":"Android 14, One UI 6.1","year":2024,"form":"Tablet","tablet":true,"w":1752,"h":2800,"ppi":266,"inches":12.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s6_lite_2024","brand":"Samsung","name":"Samsung Galaxy Tab S6 Lite (2024)","os":"Android 14, One UI 6.1","year":2024,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":224,"inches":10.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_watch_ultra","brand":"Samsung","name":"Samsung Galaxy Watch Ultra","os":"Android Wear OS 5, One UI Watch 6","year":2024,"form":"Phone","tablet":false,"w":480,"h":480,"ppi":327,"inches":1.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_watch7","brand":"Samsung","name":"Samsung Galaxy Watch7","os":"Android Wear OS 5, One UI Watch 6","year":2024,"form":"Phone","tablet":false,"w":480,"h":480,"ppi":327,"inches":1.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_xcover7","brand":"Samsung","name":"Samsung Galaxy XCover7","os":"Android 14, One UI 6","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_z_flip6","brand":"Samsung","name":"Samsung Galaxy Z Flip6","os":"Android 14, One UI 6.1.1","year":2024,"form":"Foldable","tablet":false,"w":1080,"h":2640,"ppi":426,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_z_fold6","brand":"Samsung","name":"Samsung Galaxy Z Fold6","os":"Android 14, up to 4 major Android upgrades, One UI 6.1.1","year":2024,"form":"Foldable","tablet":true,"w":1856,"h":2160,"ppi":374,"inches":7.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_sense8","brand":"Sharp","name":"Sharp Aquos sense8","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":422,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_1_vi","brand":"Sony","name":"Sony Xperia 1 VI","os":"Android 14, up to 3 major Android upgrades","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":396,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_10_vi","brand":"Sony","name":"Sony Xperia 10 VI","os":"Android 14, up to 3 major Android upgrades","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2520,"ppi":449,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_50_5g","brand":"Tcl","name":"TCL 50 5G","os":"Android 14, planned upgrade to Android 15","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_50_le","brand":"Tcl","name":"TCL 50 LE","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_50_nxtpaper","brand":"Tcl","name":"TCL 50 NxtPaper","os":"Android 14, up to 2 major Android upgrades","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_50_pro_nxtpaper","brand":"Tcl","name":"TCL 50 Pro NxtPaper","os":"Android 14, up to 2 major Android upgrades","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_50_se","brand":"Tcl","name":"TCL 50 SE","os":"Android 14, planned upgrade to Android 15","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_50_xe","brand":"Tcl","name":"TCL 50 XE","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_50_xe_nxtpaper","brand":"Tcl","name":"TCL 50 XE NxtPaper","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_50_xl","brand":"Tcl","name":"TCL 50 XL","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_50_xl_nxtpaper","brand":"Tcl","name":"TCL 50 XL NxtPaper","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_505","brand":"Tcl","name":"TCL 505","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_nxtpaper_14","brand":"Tcl","name":"TCL NxtPaper 14","os":"Android 14","year":2024,"form":"Tablet","tablet":true,"w":1600,"h":2400,"ppi":236,"inches":12.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_tab_10_nxtpaper","brand":"Tcl","name":"TCL Tab 10 NxtPaper","os":"Android 14","year":2024,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":224,"inches":10.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_tab_10l_gen_3","brand":"Tcl","name":"TCL Tab 10L Gen 3","os":"Android 14","year":2024,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_camon_30","brand":"Tecno","name":"Tecno Camon 30","os":"Android 14, up to 2 major Android upgrades, HIOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2436,"ppi":393,"inches":6.78,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_30_5g","brand":"Tecno","name":"Tecno Camon 30 5G","os":"Android 14, up to 2 major Android upgrades, HIOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2436,"ppi":393,"inches":6.78,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_30_premier","brand":"Tecno","name":"Tecno Camon 30 Premier","os":"Android 14, up to 2 major Android upgrades, HIOS 14","year":2024,"form":"Phone","tablet":false,"w":1264,"h":2780,"ppi":451,"inches":6.77,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_30_pro","brand":"Tecno","name":"Tecno Camon 30 Pro","os":"Android 14, up to 2 major Android upgrades, HIOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2436,"ppi":393,"inches":6.78,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_30s_pro","brand":"Tecno","name":"Tecno Camon 30S Pro","os":"Android 14, up to 2 major Android upgrades, HIOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2436,"ppi":393,"inches":6.78,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_phantom_v_flip2","brand":"Tecno","name":"Tecno Phantom V Flip2","os":"Android 14, HIOS 14","year":2024,"form":"Foldable","tablet":false,"w":1080,"h":2640,"ppi":413,"inches":6.9,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_phantom_v_fold2","brand":"Tecno","name":"Tecno Phantom V Fold2","os":"Android 14, up to 2 major Android upgrades, HiOS 14 Fold","year":2024,"form":"Foldable","tablet":true,"w":2000,"h":2296,"ppi":388,"inches":7.85,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"tecno_tecno_pop_9","brand":"Tecno","name":"Tecno Pop 9","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_pova_6","brand":"Tecno","name":"Tecno Pova 6","os":"Android 14, HIOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pova_6_neo","brand":"Tecno","name":"Tecno Pova 6 Neo","os":"Android 14, HIOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pova_6_neo_5g","brand":"Tecno","name":"Tecno Pova 6 Neo 5G","os":"Android 14, HIOS 14.5","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":263,"inches":6.67,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pova_6_pro","brand":"Tecno","name":"Tecno Pova 6 Pro","os":"Android 14, HIOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2436,"ppi":393,"inches":6.78,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_20_pro_5g","brand":"Tecno","name":"Tecno Spark 20 Pro 5G","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_spark_20p","brand":"Tecno","name":"Tecno Spark 20P","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_spark_30","brand":"Tecno","name":"Tecno Spark 30","os":"Android 14, HIOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_30_5g","brand":"Tecno","name":"Tecno Spark 30 5G","os":"Android 14, HIOS 14.5","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":263,"inches":6.67,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_30_pro","brand":"Tecno","name":"Tecno Spark 30 Pro","os":"Android 14, HIOS 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2436,"ppi":393,"inches":6.78,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_30c","brand":"Tecno","name":"Tecno Spark 30C","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":263,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_spark_30c_5g","brand":"Tecno","name":"Tecno Spark 30C 5G","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":263,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_spark_go_1","brand":"Tecno","name":"Tecno Spark Go 1","os":"Android 14 (Go edition), HIOS 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":263,"inches":6.67,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"ulefone__ulefone_armor_25t","brand":"Ulefone_","name":"Ulefone Armor 25T","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_25t_pro","brand":"Ulefone_","name":"Ulefone Armor 25T Pro","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_26_ultra","brand":"Ulefone_","name":"Ulefone Armor 26 Ultra","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_26_ultra_walkie-talkie","brand":"Ulefone_","name":"Ulefone Armor 26 Ultra Walkie-talkie","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_27_pro","brand":"Ulefone_","name":"Ulefone Armor 27 Pro","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_27t_pro","brand":"Ulefone_","name":"Ulefone Armor 27T Pro","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_28_ultra","brand":"Ulefone_","name":"Ulefone Armor 28 Ultra","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_mini_20t_pro","brand":"Ulefone_","name":"Ulefone Armor Mini 20T Pro","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":373,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_pad_3_pro","brand":"Ulefone_","name":"Ulefone Armor Pad 3 Pro","os":"Android 13","year":2024,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":225,"inches":10.36,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_pad_pro","brand":"Ulefone_","name":"Ulefone Armor Pad Pro","os":"Android 13","year":2024,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_note_17_pro","brand":"Ulefone_","name":"Ulefone Note 17 Pro","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_note_18_ultra","brand":"Ulefone_","name":"Ulefone Note 18 Ultra","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_power_armor_16s","brand":"Ulefone_","name":"Ulefone Power Armor 16S","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":271,"inches":5.93,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_tab_a11_pro","brand":"Ulefone_","name":"Ulefone Tab A11 Pro","os":"Android 14","year":2024,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":206,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_a15t","brand":"Umidigi","name":"Umidigi A15T","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1650,"ppi":269,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_bison_x20","brand":"Umidigi","name":"Umidigi Bison X20","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g1_tab_mini","brand":"Umidigi","name":"Umidigi G1 Tab Mini","os":"Android 14","year":2024,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g3_tab_ultra","brand":"Umidigi","name":"Umidigi G3 Tab Ultra","os":"Android 13","year":2024,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g6_5g","brand":"Umidigi","name":"Umidigi G6 5G","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1616,"ppi":269,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g7_tab_pro","brand":"Umidigi","name":"Umidigi G7 Tab Pro","os":"Android 13","year":2024,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":206,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g9_5g","brand":"Umidigi","name":"Umidigi G9 5G","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g9_tab","brand":"Umidigi","name":"Umidigi G9 Tab","os":"Android 14","year":2024,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":137,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g9a","brand":"Umidigi","name":"Umidigi G9A","os":"Android 14 (Go edition)","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g9c","brand":"Umidigi","name":"Umidigi G9C","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g9t","brand":"Umidigi","name":"Umidigi G9T","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_g2","brand":"Vivo","name":"vivo G2","os":"Android 13, OriginOS 3","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo9_pro","brand":"Vivo","name":"vivo iQOO Neo9 Pro","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo9s_pro","brand":"Vivo","name":"vivo iQOO Neo9S Pro","os":"Android 14, OriginOS 4","year":2024,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo9s_pro+","brand":"Vivo","name":"vivo iQOO Neo9S Pro+","os":"Android 14, OriginOS 4","year":2024,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_pad2","brand":"Vivo","name":"vivo iQOO Pad2","os":"Android 14, OriginOS 4","year":2024,"form":"Tablet","tablet":true,"w":1968,"h":2800,"ppi":283,"inches":12.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_pad2_pro","brand":"Vivo","name":"vivo iQOO Pad2 Pro","os":"Android 14, OriginOS 4","year":2024,"form":"Tablet","tablet":true,"w":2064,"h":3096,"ppi":286,"inches":13.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z9","brand":"Vivo","name":"vivo iQOO Z9","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z9_china","brand":"Vivo","name":"vivo iQOO Z9 (China)","os":"Android 14, OriginOS 4","year":2024,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z9_lite","brand":"Vivo","name":"vivo iQOO Z9 Lite","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z9_turbo","brand":"Vivo","name":"vivo iQOO Z9 Turbo","os":"Android 14, OriginOS 4","year":2024,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z9_turbo+","brand":"Vivo","name":"vivo iQOO Z9 Turbo+","os":"Android 14, OriginOS 4","year":2024,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z9s","brand":"Vivo","name":"vivo iQOO Z9s","os":"Android 14, up to 2 major Android upgrades, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2392,"ppi":388,"inches":6.77,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z9s_pro","brand":"Vivo","name":"vivo iQOO Z9s Pro","os":"Android 14, up to 2 major Android upgrades, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2392,"ppi":388,"inches":6.77,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z9x","brand":"Vivo","name":"vivo iQOO Z9x","os":"Android 14, OriginOS 4","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":393,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_pad3","brand":"Vivo","name":"vivo Pad3","os":"Android 14, OriginOS 4","year":2024,"form":"Tablet","tablet":true,"w":1968,"h":2800,"ppi":283,"inches":12.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_pad3_pro","brand":"Vivo","name":"vivo Pad3 Pro","os":"Android 14, OriginOS 4","year":2024,"form":"Tablet","tablet":true,"w":2064,"h":3096,"ppi":286,"inches":13.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s19","brand":"Vivo","name":"vivo S19","os":"Android 14, OriginOS 4","year":2024,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s19_pro","brand":"Vivo","name":"vivo S19 Pro","os":"Android 14, OriginOS 4","year":2024,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_t3","brand":"Vivo","name":"vivo T3","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_t3_lite","brand":"Vivo","name":"vivo T3 Lite","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_t3_pro","brand":"Vivo","name":"vivo T3 Pro","os":"Android 14, up to 2 major Android upgrades, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2392,"ppi":388,"inches":6.77,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_t3_ultra","brand":"Vivo","name":"vivo T3 Ultra","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_t3x","brand":"Vivo","name":"vivo T3x","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":393,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v30","brand":"Vivo","name":"vivo V30","os":"Android 14, up to 2 major Android upgrades, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v30_lite_me","brand":"Vivo","name":"vivo V30 Lite (ME)","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v30_lite_4g","brand":"Vivo","name":"vivo V30 Lite 4G","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v30_pro","brand":"Vivo","name":"vivo V30 Pro","os":"Android 14, up to 2 major Android upgrades, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v30_se","brand":"Vivo","name":"vivo V30 SE","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v30e","brand":"Vivo","name":"vivo V30e","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v40","brand":"Vivo","name":"vivo V40","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v40_lite","brand":"Vivo","name":"vivo V40 Lite","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v40_lite_idn","brand":"Vivo","name":"vivo V40 Lite (IDN)","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v40_pro","brand":"Vivo","name":"vivo V40 Pro","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v40_se","brand":"Vivo","name":"vivo V40 SE","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v40e","brand":"Vivo","name":"vivo V40e","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2392,"ppi":388,"inches":6.77,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x_fold3","brand":"Vivo","name":"vivo X Fold3","os":"Android 14, OriginOS 4","year":2024,"form":"Foldable","tablet":true,"w":2200,"h":2480,"ppi":413,"inches":8.03,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x_fold3_pro","brand":"Vivo","name":"vivo X Fold3 Pro","os":"Android 14, up to Android 15, Funtouch 15 (International), O","year":2024,"form":"Foldable","tablet":true,"w":2200,"h":2480,"ppi":413,"inches":8.03,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x100_ultra","brand":"Vivo","name":"vivo X100 Ultra","os":"Android 14, OriginOS 4","year":2024,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":517,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x100s","brand":"Vivo","name":"vivo X100s","os":"Android 14, OriginOS 4","year":2024,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x100s_pro","brand":"Vivo","name":"vivo X100s Pro","os":"Android 14, OriginOS 4","year":2024,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y03","brand":"Vivo","name":"vivo Y03","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y03t","brand":"Vivo","name":"vivo Y03t","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y100_idn","brand":"Vivo","name":"vivo Y100 (IDN)","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y100_4g","brand":"Vivo","name":"vivo Y100 4G","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y100t","brand":"Vivo","name":"vivo Y100t","os":"Android 13, OriginOS 3","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":395,"inches":6.64,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y18","brand":"Vivo","name":"vivo Y18","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y18_india","brand":"Vivo","name":"vivo Y18 (India)","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y18e","brand":"Vivo","name":"vivo Y18e","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y18i","brand":"Vivo","name":"vivo Y18i","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y200_china","brand":"Vivo","name":"vivo Y200 (China)","os":"Android 14, OriginOS 4","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y200_gt","brand":"Vivo","name":"vivo Y200 GT","os":"Android 14, OriginOS 4","year":2024,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y200_pro","brand":"Vivo","name":"vivo Y200 Pro","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y200e","brand":"Vivo","name":"vivo Y200e","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y200i","brand":"Vivo","name":"vivo Y200i","os":"Android 14, OriginOS 4","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":393,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y200t","brand":"Vivo","name":"vivo Y200t","os":"Android 14, OriginOS 4","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":393,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y28","brand":"Vivo","name":"vivo Y28","os":"Android 13, Funtouch 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y28_4g","brand":"Vivo","name":"vivo Y28 4G","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1608,"ppi":264,"inches":6.68,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y28s","brand":"Vivo","name":"vivo Y28s","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y300_pro","brand":"Vivo","name":"vivo Y300 Pro","os":"Android 14, OriginOS 4","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2392,"ppi":388,"inches":6.77,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y37","brand":"Vivo","name":"vivo Y37","os":"Android 14, OriginOS 4","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y37_pro","brand":"Vivo","name":"vivo Y37 Pro","os":"Android 14, OriginOS 4","year":2024,"form":"Phone","tablet":false,"w":720,"h":1608,"ppi":264,"inches":6.68,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y38","brand":"Vivo","name":"vivo Y38","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":264,"inches":6.68,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y58","brand":"Vivo","name":"vivo Y58","os":"Android 14, Funtouch 14","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":393,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_14_civi","brand":"Xiaomi","name":"Xiaomi 14 Civi","os":"Android 14, HyperOS","year":2024,"form":"Phone","tablet":false,"w":1236,"h":2750,"ppi":460,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_14_ultra","brand":"Xiaomi","name":"Xiaomi 14 Ultra","os":"Android 14, up to 4 major Android upgrades, HyperOS","year":2024,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":522,"inches":6.73,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_14t","brand":"Xiaomi","name":"Xiaomi 14T","os":"Android 14, HyperOS","year":2024,"form":"Phone","tablet":false,"w":1220,"h":2712,"ppi":446,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_14t_pro","brand":"Xiaomi","name":"Xiaomi 14T Pro","os":"Android 14, HyperOS","year":2024,"form":"Phone","tablet":false,"w":1220,"h":2712,"ppi":446,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mix_flip","brand":"Xiaomi","name":"Xiaomi Mix Flip","os":"Android 14, HyperOS","year":2024,"form":"Foldable","tablet":false,"w":1224,"h":2912,"ppi":460,"inches":6.86,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mix_fold_4","brand":"Xiaomi","name":"Xiaomi Mix Fold 4","os":"Android 14, HyperOS","year":2024,"form":"Foldable","tablet":true,"w":2224,"h":2488,"ppi":418,"inches":7.98,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_pad_6s_pro_12.4","brand":"Xiaomi","name":"Xiaomi Pad 6S Pro 12.4","os":"Android 14, up to 3 major Android upgrades, HyperOS","year":2024,"form":"Tablet","tablet":true,"w":2032,"h":3048,"ppi":295,"inches":12.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_c61","brand":"Xiaomi","name":"Xiaomi Poco C61","os":"Android 14, MIUI","year":2024,"form":"Phone","tablet":false,"w":720,"h":1650,"ppi":268,"inches":6.71,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_f6","brand":"Xiaomi","name":"Xiaomi Poco F6","os":"Android 14, up to 3 major Android upgrades, HyperOS","year":2024,"form":"Phone","tablet":false,"w":1220,"h":2712,"ppi":446,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_f6_pro","brand":"Xiaomi","name":"Xiaomi Poco F6 Pro","os":"Android 14, up to 3 major Android upgrades, HyperOS","year":2024,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":526,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_m6_4g","brand":"Xiaomi","name":"Xiaomi Poco M6 4G","os":"Android 14, HyperOS","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.79,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_m6_plus","brand":"Xiaomi","name":"Xiaomi Poco M6 Plus","os":"Android 14, up to 2 major Android upgrades, HyperOS","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.79,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_m6_pro","brand":"Xiaomi","name":"Xiaomi Poco M6 Pro","os":"Android 13, MIUI 14, planned upgrade to Android 14, HyperOS","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_pad","brand":"Xiaomi","name":"Xiaomi Poco Pad","os":"Android 14, HyperOS","year":2024,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":249,"inches":12.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_pad_5g","brand":"Xiaomi","name":"Xiaomi Poco Pad 5G","os":"Android 14, HyperOS","year":2024,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":249,"inches":12.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_x6","brand":"Xiaomi","name":"Xiaomi Poco X6","os":"Android 13, up to 3 major Android upgrades, HyperOS","year":2024,"form":"Phone","tablet":false,"w":1220,"h":2712,"ppi":446,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_x6_neo","brand":"Xiaomi","name":"Xiaomi Poco X6 Neo","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_x6_pro","brand":"Xiaomi","name":"Xiaomi Poco X6 Pro","os":"Android 14, up to 3 major Android upgrades, HyperOS","year":2024,"form":"Phone","tablet":false,"w":1220,"h":2712,"ppi":446,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_13","brand":"Xiaomi","name":"Xiaomi Redmi 13","os":"Android 14, HyperOS","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.79,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_13_5g","brand":"Xiaomi","name":"Xiaomi Redmi 13 5G","os":"Android 14, HyperOS, up to 2 major Android upgrades","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.79,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_14c","brand":"Xiaomi","name":"Xiaomi Redmi 14C","os":"Android 14, HyperOS","year":2024,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":260,"inches":6.88,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_14r","brand":"Xiaomi","name":"Xiaomi Redmi 14R","os":"Android 14, HyperOS","year":2024,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":260,"inches":6.88,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_a3","brand":"Xiaomi","name":"Xiaomi Redmi A3","os":"Android 14, MIUI","year":2024,"form":"Phone","tablet":false,"w":720,"h":1650,"ppi":268,"inches":6.71,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_a3x","brand":"Xiaomi","name":"Xiaomi Redmi A3x","os":"Android 14, up to 2 major Android upgrades, MIUI","year":2024,"form":"Phone","tablet":false,"w":720,"h":1650,"ppi":268,"inches":6.71,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k70_ultra","brand":"Xiaomi","name":"Xiaomi Redmi K70 Ultra","os":"Android 14, HyperOS","year":2024,"form":"Phone","tablet":false,"w":1220,"h":2712,"ppi":446,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_13","brand":"Xiaomi","name":"Xiaomi Redmi Note 13","os":"Android 13, up to 3 major Android upgrades, HyperOS","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_13_4g","brand":"Xiaomi","name":"Xiaomi Redmi Note 13 4G","os":"Android 13, up to 3 major Android upgrades, HyperOS","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_13_pro_4g","brand":"Xiaomi","name":"Xiaomi Redmi Note 13 Pro 4G","os":"Android 13, up to 3 major Android upgrades, HyperOS","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_13r","brand":"Xiaomi","name":"Xiaomi Redmi Note 13R","os":"Android 14, HyperOS","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.79,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_14","brand":"Xiaomi","name":"Xiaomi Redmi Note 14","os":"Android 14, HyperOS","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_14_pro","brand":"Xiaomi","name":"Xiaomi Redmi Note 14 Pro","os":"Android 14, up to 3 major Android upgrades, HyperOS","year":2024,"form":"Phone","tablet":false,"w":1220,"h":2712,"ppi":446,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_14_pro+","brand":"Xiaomi","name":"Xiaomi Redmi Note 14 Pro+","os":"Android 14, up to 3 major Android upgrades, HyperOS","year":2024,"form":"Phone","tablet":false,"w":1220,"h":2712,"ppi":446,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_pad_pro","brand":"Xiaomi","name":"Xiaomi Redmi Pad Pro","os":"Android 14, HyperOS","year":2024,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":249,"inches":12.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_pad_pro_5g","brand":"Xiaomi","name":"Xiaomi Redmi Pad Pro 5G","os":"Android 14, HyperOS","year":2024,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":249,"inches":12.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_pad_se_8.7","brand":"Xiaomi","name":"Xiaomi Redmi Pad SE 8.7","os":"Android 14, HyperOS","year":2024,"form":"Tablet","tablet":true,"w":800,"h":1340,"ppi":179,"inches":8.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_turbo_3","brand":"Xiaomi","name":"Xiaomi Redmi Turbo 3","os":"Android 14, HyperOS","year":2024,"form":"Phone","tablet":false,"w":1220,"h":2712,"ppi":446,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_watch_5_lite","brand":"Xiaomi","name":"Xiaomi Redmi Watch 5 Lite","os":"HyperOS","year":2024,"form":"Phone","tablet":false,"w":410,"h":502,"ppi":331,"inches":1.96,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_60","brand":"Zte","name":"ZTE Axon 60","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_60_lite","brand":"Zte","name":"ZTE Axon 60 Lite","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_60_ultra","brand":"Zte","name":"ZTE Axon 60 Ultra","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a75","brand":"Zte","name":"ZTE Blade A75","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a75_4g","brand":"Zte","name":"ZTE Blade A75 4G","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v60_design","brand":"Zte","name":"ZTE Blade V60 Design","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_flip","brand":"Zte","name":"ZTE nubia Flip","os":"Android 13","year":2024,"form":"Foldable","tablet":false,"w":1188,"h":2790,"ppi":439,"inches":6.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_focus","brand":"Zte","name":"ZTE nubia Focus","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_focus_pro","brand":"Zte","name":"ZTE nubia Focus Pro","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_music","brand":"Zte","name":"ZTE nubia Music","os":"Android 14","year":2024,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_neo_2","brand":"Zte","name":"ZTE nubia Neo 2","os":"Android 13","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_pad_3d_ii","brand":"Zte","name":"ZTE nubia Pad 3D II","os":"Android 14","year":2024,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":249,"inches":12.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_9s_pro","brand":"Zte","name":"ZTE nubia Red Magic 9S Pro","os":"Android 14, Redmagic OS 9.5","year":2024,"form":"Phone","tablet":false,"w":1116,"h":2480,"ppi":400,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_9s_pro+","brand":"Zte","name":"ZTE nubia Red Magic 9S Pro+","os":"Android 14, Redmagic OS 9.5","year":2024,"form":"Phone","tablet":false,"w":1116,"h":2480,"ppi":400,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_nova","brand":"Zte","name":"ZTE nubia Red Magic Nova","os":"Android 14, Redmagic OS 9.5","year":2024,"form":"Tablet","tablet":true,"w":1800,"h":2880,"ppi":312,"inches":10.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z60_ultra_leading","brand":"Zte","name":"ZTE nubia Z60 Ultra Leading","os":"Android 14, MyOS 14 (International), MyOS 14.5 (China)","year":2024,"form":"Phone","tablet":false,"w":1116,"h":2480,"ppi":400,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z60s_pro","brand":"Zte","name":"ZTE nubia Z60S Pro","os":"Android 14, MyOS 14 (International), MyOS 14.5 (China)","year":2024,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":452,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_voyage_3d","brand":"Zte","name":"ZTE Voyage 3D","os":"Android 13, MyOS 13","year":2024,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"apple_apple_iphone_15","brand":"Apple","name":"Apple iPhone 15","os":"iOS 17, upgradable to iOS 18","year":2023,"form":"Phone","tablet":false,"w":1179,"h":2556,"ppi":461,"inches":6.1,"platform":"ios","hasNotch":false,"hasIsland":true,"hasHole":false,"hasHome":true,"safeTop":59,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_15_plus","brand":"Apple","name":"Apple iPhone 15 Plus","os":"iOS 17, upgradable to iOS 18","year":2023,"form":"Phone","tablet":false,"w":1290,"h":2796,"ppi":460,"inches":6.7,"platform":"ios","hasNotch":false,"hasIsland":true,"hasHole":false,"hasHome":true,"safeTop":59,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_15_pro","brand":"Apple","name":"Apple iPhone 15 Pro","os":"iOS 17, upgradable to iOS 18","year":2023,"form":"Phone","tablet":false,"w":1179,"h":2556,"ppi":461,"inches":6.1,"platform":"ios","hasNotch":false,"hasIsland":true,"hasHole":false,"hasHome":true,"safeTop":59,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_15_pro_max","brand":"Apple","name":"Apple iPhone 15 Pro Max","os":"iOS 17, upgradable to iOS 18","year":2023,"form":"Phone","tablet":false,"w":1290,"h":2796,"ppi":460,"inches":6.7,"platform":"ios","hasNotch":false,"hasIsland":true,"hasHole":false,"hasHome":true,"safeTop":59,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"asus_asus_rog_phone_7","brand":"Asus","name":"Asus ROG Phone 7","os":"Android 13, up to 2 major Android upgrades","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2448,"ppi":395,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_rog_phone_7_ultimate","brand":"Asus","name":"Asus ROG Phone 7 Ultimate","os":"Android 13, up to 2 major Android upgrades","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2448,"ppi":395,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_10","brand":"Asus","name":"Asus Zenfone 10","os":"Android 13, up to 2 major Android upgrades","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":445,"inches":5.92,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_a200_pro","brand":"Blackview","name":"Blackview A200 Pro","os":"Android 13, Doke OS 4.0","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_a53","brand":"Blackview","name":"Blackview A53","os":"Android 12, Doke OS 3.0","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_a53_pro","brand":"Blackview","name":"Blackview A53 Pro","os":"Android 12, Doke OS 3.0","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_a96","brand":"Blackview","name":"Blackview A96","os":"Android 13, Doke OS 3.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_active_8_pro","brand":"Blackview","name":"Blackview Active 8 Pro","os":"Android 12, Doke OS_P 3.0","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":225,"inches":10.36,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bv5300_pro","brand":"Blackview","name":"Blackview BV5300 Pro","os":"Android 12, DokeOS 3.1","year":2023,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bv6200_pro","brand":"Blackview","name":"Blackview BV6200 Pro","os":"Android 13, Doke OS 3.1","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bv8900","brand":"Blackview","name":"Blackview BV8900","os":"Android 13, Doke-OS 3.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":406,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bv9300","brand":"Blackview","name":"Blackview BV9300","os":"Android 12, Doke-OS 3.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":391,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_n6000","brand":"Blackview","name":"Blackview N6000","os":"Android 13, DokeOS 3.1","year":2023,"form":"Phone","tablet":false,"w":540,"h":1200,"ppi":306,"inches":4.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_shark_8","brand":"Blackview","name":"Blackview Shark 8","os":"Android 13, Doke OS 4.0","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_11_se","brand":"Blackview","name":"Blackview Tab 11 SE","os":"Android 12, Doke OS_P 3.0","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":225,"inches":10.36,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_11_wifi","brand":"Blackview","name":"Blackview Tab 11 WiFi","os":"Android 12, DokeOS_P 3.0","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":225,"inches":10.36,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_12_pro","brand":"Blackview","name":"Blackview Tab 12 Pro","os":"Android 12, DokeOS_P 3.0","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_16","brand":"Blackview","name":"Blackview Tab 16","os":"Android 12, Doke OS_P 3.0","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":212,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_18","brand":"Blackview","name":"Blackview Tab 18","os":"Android 13, Doke OS_P 4.0","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":194,"inches":12.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_5","brand":"Blackview","name":"Blackview Tab 5","os":"Android 12, Doke OS Go 3.0","year":2023,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_50_wifi","brand":"Blackview","name":"Blackview Tab 50 WiFi","os":"Android 13, DokeOS_P 3.0","year":2023,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_60","brand":"Blackview","name":"Blackview Tab 60","os":"Android 13, Doke OS_P 3.0","year":2023,"form":"Tablet","tablet":true,"w":800,"h":1340,"ppi":180,"inches":8.68,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_70_wifi","brand":"Blackview","name":"Blackview Tab 70 WiFi","os":"Android 13, DokeOS_P 3.0","year":2023,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_8_wifi","brand":"Blackview","name":"Blackview Tab 8 WiFi","os":"Android 12, DokeOS_P 3.0","year":2023,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_80","brand":"Blackview","name":"Blackview Tab 80","os":"Android 13, Doke OS_P 3.0","year":2023,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cat_cat_s75","brand":"Cat","name":"Cat S75","os":"Android 12","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_kingkong_8","brand":"Cubot","name":"Cubot KingKong 8","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":270,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_kingkong_9","brand":"Cubot","name":"Cubot KingKong 9","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_kingkong_power","brand":"Cubot","name":"Cubot KingKong Power","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_kingkong_star","brand":"Cubot","name":"Cubot KingKong Star","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_note_21","brand":"Cubot","name":"Cubot Note 21","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_note_40","brand":"Cubot","name":"Cubot Note 40","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_note_50","brand":"Cubot","name":"Cubot Note 50","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_p80","brand":"Cubot","name":"Cubot P80","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_tab_20","brand":"Cubot","name":"Cubot Tab 20","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_tab_40","brand":"Cubot","name":"Cubot Tab 40","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":224,"inches":10.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_tab_kingkong","brand":"Cubot","name":"Cubot Tab KingKong","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_x70","brand":"Cubot","name":"Cubot X70","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_n50","brand":"Doogee","name":"Doogee N50","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_n50_pro","brand":"Doogee","name":"Doogee N50 Pro","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_n50s","brand":"Doogee","name":"Doogee N50S","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_r10","brand":"Doogee","name":"Doogee R10","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":225,"inches":10.36,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s100","brand":"Doogee","name":"Doogee S100","os":"Android 12","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s100_pro","brand":"Doogee","name":"Doogee S100 Pro","os":"Android 12","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s110","brand":"Doogee","name":"Doogee S110","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":400,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s41_max","brand":"Doogee","name":"Doogee S41 Max","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s41_plus","brand":"Doogee","name":"Doogee S41 Plus","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s41_pro","brand":"Doogee","name":"Doogee S41 Pro","os":"Android 12","year":2023,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s41t","brand":"Doogee","name":"Doogee S41T","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_smini","brand":"Doogee","name":"Doogee Smini","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":480,"h":1170,"ppi":281,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_t10e","brand":"Doogee","name":"Doogee T10E","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_t10plus","brand":"Doogee","name":"Doogee T10Plus","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":216,"inches":10.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_t10pro","brand":"Doogee","name":"Doogee T10Pro","os":"Android 12","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_t10s","brand":"Doogee","name":"Doogee T10S","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_t20_ultra","brand":"Doogee","name":"Doogee T20 Ultra","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":194,"inches":12.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_t20mini","brand":"Doogee","name":"Doogee T20mini","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":270,"inches":8.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_t20mini_kid","brand":"Doogee","name":"Doogee T20mini Kid","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":1820,"ppi":260,"inches":8.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_t20mini_pro","brand":"Doogee","name":"Doogee T20mini Pro","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":270,"inches":8.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_t20s","brand":"Doogee","name":"Doogee T20S","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":218,"inches":10.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_t30_pro","brand":"Doogee","name":"Doogee T30 Pro","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":274,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_t30_ultra","brand":"Doogee","name":"Doogee T30 Ultra","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":274,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_u10","brand":"Doogee","name":"Doogee U10","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_u10_pro","brand":"Doogee","name":"Doogee U10 Pro","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_u9","brand":"Doogee","name":"Doogee U9","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_v_max","brand":"Doogee","name":"Doogee V Max","os":"Android 12","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_v20_pro","brand":"Doogee","name":"Doogee V20 Pro","os":"Android 12","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_v30_pro","brand":"Doogee","name":"Doogee V30 Pro","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_v30t","brand":"Doogee","name":"Doogee V30T","os":"Android 12","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_v31gt","brand":"Doogee","name":"Doogee V31GT","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":400,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_u506s","brand":"Energizer","name":"Energizer U506S","os":"Android 13 (Go edition)","year":2023,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_7a","brand":"Google","name":"Google Pixel 7a","os":"Android 13, up to 3 major Android upgrades","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":429,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_8","brand":"Google","name":"Google Pixel 8","os":"Android 14, up to 7 major Android upgrades","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":428,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_8_pro","brand":"Google","name":"Google Pixel 8 Pro","os":"Android 14, up to 7 major Android upgrades","year":2023,"form":"Phone","tablet":false,"w":1344,"h":2992,"ppi":489,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_fold","brand":"Google","name":"Google Pixel Fold","os":"Android 13, upgradable to Android 14","year":2023,"form":"Foldable","tablet":true,"w":1840,"h":2208,"ppi":378,"inches":7.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_tablet","brand":"Google","name":"Google Pixel Tablet","os":"Android 13, upgradable to Android 14","year":2023,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":276,"inches":10.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_100","brand":"Honor","name":"Honor 100","os":"Android 13, MagicOS 7.2","year":2023,"form":"Phone","tablet":false,"w":1200,"h":2664,"ppi":436,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_100_pro","brand":"Honor","name":"Honor 100 Pro","os":"Android 13, MagicOS 7.2","year":2023,"form":"Phone","tablet":false,"w":1224,"h":2700,"ppi":437,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_70_lite","brand":"Honor","name":"Honor 70 Lite","os":"Android 12, upgradable to Android 14, Magic UI 8","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_80_pro_flat","brand":"Honor","name":"Honor 80 Pro Flat","os":"Android 12, MagicOS 7","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_90","brand":"Honor","name":"Honor 90","os":"Android 13, MagicOS 7.1","year":2023,"form":"Phone","tablet":false,"w":1200,"h":2664,"ppi":435,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_90_gt","brand":"Honor","name":"Honor 90 GT","os":"Android 13, MagicOS 7.2","year":2023,"form":"Phone","tablet":false,"w":1200,"h":2664,"ppi":436,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_90_lite","brand":"Honor","name":"Honor 90 Lite","os":"Android 13, Magic OS 7.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":391,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_90_pro","brand":"Honor","name":"Honor 90 Pro","os":"Android 13, MagicOS 7.1","year":2023,"form":"Phone","tablet":false,"w":1224,"h":2700,"ppi":437,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic_v2","brand":"Honor","name":"Honor Magic V2","os":"Android 13, upgradable to Android 14, MagicOS 8","year":2023,"form":"Foldable","tablet":true,"w":2156,"h":2344,"ppi":402,"inches":7.92,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic_vs2","brand":"Honor","name":"Honor Magic Vs2","os":"Android 13, MagicOS 7.2","year":2023,"form":"Foldable","tablet":true,"w":2156,"h":2344,"ppi":402,"inches":7.92,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic5","brand":"Honor","name":"Honor Magic5","os":"Android 13, MagicOS 7.1","year":2023,"form":"Phone","tablet":false,"w":1224,"h":2688,"ppi":439,"inches":6.73,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic5_lite","brand":"Honor","name":"Honor Magic5 Lite","os":"Android 12, upgradable to Android 13, MagicOS 7.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic5_pro","brand":"Honor","name":"Honor Magic5 Pro","os":"Android 13, upgradable to Android 14, MagicOS 8","year":2023,"form":"Phone","tablet":false,"w":1312,"h":2848,"ppi":460,"inches":6.81,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic5_ultimate","brand":"Honor","name":"Honor Magic5 Ultimate","os":"Android 13, MagicOS 7.1","year":2023,"form":"Phone","tablet":false,"w":1312,"h":2848,"ppi":460,"inches":6.81,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic6_lite","brand":"Honor","name":"Honor Magic6 Lite","os":"Android 13, Magic OS 7.2","year":2023,"form":"Phone","tablet":false,"w":1220,"h":2652,"ppi":431,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magicpad_13","brand":"Honor","name":"Honor MagicPad 13","os":"Android 13, MagicOS 7.2","year":2023,"form":"Tablet","tablet":true,"w":1840,"h":2880,"ppi":263,"inches":13.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_pad_9","brand":"Honor","name":"Honor Pad 9","os":"Android 13, up to 1 major Android upgrades, Magic OS 7.2","year":2023,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":249,"inches":12.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_pad_v8","brand":"Honor","name":"Honor Pad V8","os":"Android 12, MagicOS 6.1","year":2023,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":274,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_pad_x8_pro","brand":"Honor","name":"Honor Pad X8 Pro","os":"Android 13, MagicOS 7.1","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":203,"inches":11.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_pad_x9","brand":"Honor","name":"Honor Pad X9","os":"Android 13, MagicOS 7.1","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":203,"inches":11.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play_40","brand":"Honor","name":"Honor Play 40","os":"Android 13, Magic OS 7.1","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play_50_plus","brand":"Honor","name":"Honor Play 50 Plus","os":"Android 13, MagicOS 7.2","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":389,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play_8t","brand":"Honor","name":"Honor Play 8T","os":"Android 13, MagicOS 7.2","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":389,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play7t","brand":"Honor","name":"Honor Play7T","os":"Android 12, Magic UI 6.1","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play7t_pro","brand":"Honor","name":"Honor Play7T Pro","os":"Android 12, Magic UI 6.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":391,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_v_purse","brand":"Honor","name":"Honor V Purse","os":"Android 13, MagicOS 7.2","year":2023,"form":"Foldable","tablet":true,"w":2016,"h":2348,"ppi":401,"inches":7.71,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x40_gt_racing","brand":"Honor","name":"Honor X40 GT Racing","os":"Android 13, Magic OS 7.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":385,"inches":6.81,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x5","brand":"Honor","name":"Honor X5","os":"Android 12 (Go edition)","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x5_plus","brand":"Honor","name":"Honor X5 Plus","os":"Android 13, MagicOS 7.1","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x50","brand":"Honor","name":"Honor X50","os":"Android 13, Magic OS 7.1","year":2023,"form":"Phone","tablet":false,"w":1220,"h":2652,"ppi":431,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x50_pro","brand":"Honor","name":"Honor X50 Pro","os":"Android 14","year":2023,"form":"Phone","tablet":false,"w":1220,"h":2652,"ppi":431,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x50i","brand":"Honor","name":"Honor X50i","os":"Android 13, Magic OS 7.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":391,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x50i+","brand":"Honor","name":"Honor X50i+","os":"Android 13, MagicOS 7.2","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x6a","brand":"Honor","name":"Honor X6a","os":"Android 13, Magic OS 7.1","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x7a","brand":"Honor","name":"Honor X7a","os":"Android 12, Magic UI 6.1","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x7b","brand":"Honor","name":"Honor X7b","os":"Android 13, upgradable to Android 14, MagicOS 8","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":389,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x8a","brand":"Honor","name":"Honor X8a","os":"Android 12, Magic UI 6.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":391,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x8b","brand":"Honor","name":"Honor X8b","os":"Android 13, MagicOS 7.2","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x9a","brand":"Honor","name":"Honor X9a","os":"Android 12, upgradable to Android 13, MagicOS 7","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x9b","brand":"Honor","name":"Honor X9b","os":"Android 13, Magic OS 7.2","year":2023,"form":"Phone","tablet":false,"w":1220,"h":2652,"ppi":431,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_a102","brand":"Htc","name":"HTC A102","os":"Android 12","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":212,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_a103","brand":"Htc","name":"HTC A103","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_a103_plus","brand":"Htc","name":"HTC A103 Plus","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_a104","brand":"Htc","name":"HTC A104","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":225,"inches":10.36,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_u23","brand":"Htc","name":"HTC U23","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_u23_pro","brand":"Htc","name":"HTC U23 Pro","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_wildfire_e_star","brand":"Htc","name":"HTC Wildfire E star","os":"Android 12 (Go edition)","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_wildfire_e2_play","brand":"Htc","name":"HTC Wildfire E2 Play","os":"Android 12","year":2023,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_wildfire_e3_lite","brand":"Htc","name":"HTC Wildfire E3 lite","os":"Android 12","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_enjoy_60","brand":"Huawei","name":"Huawei Enjoy 60","os":"HarmonyOS 3.0","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_enjoy_60x","brand":"Huawei","name":"Huawei Enjoy 60X","os":"HarmonyOS 3.0","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":376,"inches":6.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_enjoy_70","brand":"Huawei","name":"Huawei Enjoy 70","os":"HarmonyOS 4.0","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_60","brand":"Huawei","name":"Huawei Mate 60","os":"HarmonyOS 4.0 (China)","year":2023,"form":"Phone","tablet":false,"w":1216,"h":2688,"ppi":441,"inches":6.69,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_60_pro","brand":"Huawei","name":"Huawei Mate 60 Pro","os":"HarmonyOS 4.0 (China)","year":2023,"form":"Phone","tablet":false,"w":1260,"h":2720,"ppi":440,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_60_pro+","brand":"Huawei","name":"Huawei Mate 60 Pro+","os":"HarmonyOS 4.0 (China)","year":2023,"form":"Phone","tablet":false,"w":1260,"h":2720,"ppi":440,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_60_rs_ultimate","brand":"Huawei","name":"Huawei Mate 60 RS Ultimate","os":"HarmonyOS 4.0 (China)","year":2023,"form":"Phone","tablet":false,"w":1260,"h":2720,"ppi":440,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_x3","brand":"Huawei","name":"Huawei Mate X3","os":"HarmonyOS 3.1 (China), EMUI 13.1 (Europe), no Google Play Se","year":2023,"form":"Foldable","tablet":true,"w":2224,"h":2496,"ppi":426,"inches":7.85,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_x5","brand":"Huawei","name":"Huawei Mate X5","os":"HarmonyOS 4.0 (China), EMUI (Europe), no Google Play Service","year":2023,"form":"Foldable","tablet":true,"w":2224,"h":2496,"ppi":426,"inches":7.85,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_11_2023","brand":"Huawei","name":"Huawei MatePad 11 (2023)","os":"HarmonyOS 3.1","year":2023,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":275,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_11.5","brand":"Huawei","name":"Huawei MatePad 11.5","os":"Harmony OS 3.1","year":2023,"form":"Tablet","tablet":true,"w":1440,"h":2200,"ppi":229,"inches":11.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_air","brand":"Huawei","name":"Huawei MatePad Air","os":"HarmonyOS 3.1","year":2023,"form":"Tablet","tablet":true,"w":2800,"h":1840,"ppi":291,"inches":11.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_pro_11_2024","brand":"Huawei","name":"Huawei MatePad Pro 11 (2024)","os":"HarmonyOS 4.0","year":2023,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":274,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_pro_13.2","brand":"Huawei","name":"Huawei MatePad Pro 13.2","os":"Harmony OS 4.0","year":2023,"form":"Tablet","tablet":true,"w":2880,"h":1920,"ppi":262,"inches":13.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_10_youth","brand":"Huawei","name":"Huawei nova 10 Youth","os":"HarmonyOS 2.0","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":387,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_11","brand":"Huawei","name":"Huawei nova 11","os":"HarmonyOS 3.0","year":2023,"form":"Phone","tablet":false,"w":1084,"h":2412,"ppi":391,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_11_pro","brand":"Huawei","name":"Huawei nova 11 Pro","os":"HarmonyOS 3.0","year":2023,"form":"Phone","tablet":false,"w":1200,"h":2652,"ppi":429,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_11_se","brand":"Huawei","name":"Huawei nova 11 SE","os":"HarmonyOS 4.0","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_11_ultra","brand":"Huawei","name":"Huawei nova 11 Ultra","os":"HarmonyOS 3.0","year":2023,"form":"Phone","tablet":false,"w":1200,"h":2652,"ppi":429,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_11i","brand":"Huawei","name":"Huawei nova 11i","os":"EMUI 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":385,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_12","brand":"Huawei","name":"Huawei nova 12","os":"HarmonyOS 4.0","year":2023,"form":"Phone","tablet":false,"w":1084,"h":2412,"ppi":395,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_12_lite","brand":"Huawei","name":"Huawei nova 12 Lite","os":"HarmonyOS 4.0","year":2023,"form":"Phone","tablet":false,"w":1084,"h":2412,"ppi":395,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_12_pro","brand":"Huawei","name":"Huawei nova 12 Pro","os":"HarmonyOS 4.0","year":2023,"form":"Phone","tablet":false,"w":1224,"h":2776,"ppi":449,"inches":6.76,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_12_ultra","brand":"Huawei","name":"Huawei nova 12 Ultra","os":"HarmonyOS 4.0","year":2023,"form":"Phone","tablet":false,"w":1224,"h":2776,"ppi":449,"inches":6.76,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_y71","brand":"Huawei","name":"Huawei nova Y71","os":"EMUI 12, no Google Play Services","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_y91","brand":"Huawei","name":"Huawei nova Y91","os":"EMUI 13, no Google Play Services","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":376,"inches":6.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p60","brand":"Huawei","name":"Huawei P60","os":"HarmonyOS 3.1 (China), EMUI 13.1 (Europe), no Google Play Se","year":2023,"form":"Phone","tablet":false,"w":1220,"h":2700,"ppi":444,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p60_art","brand":"Huawei","name":"Huawei P60 Art","os":"HarmonyOS 3.1 (China), EMUI 13.1 (International)","year":2023,"form":"Phone","tablet":false,"w":1220,"h":2700,"ppi":444,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p60_pro","brand":"Huawei","name":"Huawei P60 Pro","os":"HarmonyOS 3.1 (China), EMUI 13.1 (Europe), no Google Play Se","year":2023,"form":"Phone","tablet":false,"w":1220,"h":2700,"ppi":444,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_gt_10_pro","brand":"Infinix","name":"Infinix GT 10 Pro","os":"Android 13, up to 1 major Android upgrades, XOS 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_30","brand":"Infinix","name":"Infinix Hot 30","os":"Android 13, XOS 12.6","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_30_5g","brand":"Infinix","name":"Infinix Hot 30 5G","os":"Android 13, XOS 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_30_play_nfc","brand":"Infinix","name":"Infinix Hot 30 Play NFC","os":"Android 13, XOS 12.6","year":2023,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_30i","brand":"Infinix","name":"Infinix Hot 30i","os":"Android 12, XOS 10.6","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_40","brand":"Infinix","name":"Infinix Hot 40","os":"Android 13, XOS 13.5","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_40_pro","brand":"Infinix","name":"Infinix Hot 40 Pro","os":"Android 13, XOS 13.5","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_40i","brand":"Infinix","name":"Infinix Hot 40i","os":"Android 13, XOS 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_30","brand":"Infinix","name":"Infinix Note 30","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_30_5g","brand":"Infinix","name":"Infinix Note 30 5G","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_30_pro","brand":"Infinix","name":"Infinix Note 30 Pro","os":"Android 13, XOS 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_30_vip","brand":"Infinix","name":"Infinix Note 30 VIP","os":"Android 13, XOS 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_30i","brand":"Infinix","name":"Infinix Note 30i","os":"Android 13, XOS 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.66,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart_7","brand":"Infinix","name":"Infinix Smart 7","os":"Android 12","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart_7_india","brand":"Infinix","name":"Infinix Smart 7 (India)","os":"Android 12, XOS 12","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart_7_hd","brand":"Infinix","name":"Infinix Smart 7 HD","os":"Android 12 (Go edition)","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart_8","brand":"Infinix","name":"Infinix Smart 8","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart_8_hd","brand":"Infinix","name":"Infinix Smart 8 HD","os":"Android 13, XOS 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_zero_30","brand":"Infinix","name":"Infinix Zero 30","os":"Android 13, XOS 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_zero_30_4g","brand":"Infinix","name":"Infinix Zero 30 4G","os":"Android 13, XOS 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_a04","brand":"Itel","name":"itel A04","os":"Android (Go edition)","year":2023,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":170,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_a05s","brand":"Itel","name":"itel A05s","os":"Android 12 (Go edition)","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_a60s","brand":"Itel","name":"itel A60s","os":"Android 12","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_a70","brand":"Itel","name":"itel A70","os":"Android 13 (Go edition)","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_p40","brand":"Itel","name":"itel P40","os":"Android 12 (Go edition)","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_p40+","brand":"Itel","name":"itel P40+","os":"Android 12 or 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_p55_5g","brand":"Itel","name":"itel P55 5G","os":"Android 13, itel OS 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_pad_one","brand":"Itel","name":"itel Pad One","os":"Android 12 (Go edition)","year":2023,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_s18_pro","brand":"Itel","name":"itel S18 Pro","os":"Android, itel OS 8.6","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_s23","brand":"Itel","name":"itel S23","os":"Android 12","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_s23+","brand":"Itel","name":"itel S23+","os":"Android 13, itel OS 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_legion_y700_2023","brand":"Lenovo","name":"Lenovo Legion Y700 (2023)","os":"Android 13, ZUI 14","year":2023,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":343,"inches":8.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_extreme","brand":"Lenovo","name":"Lenovo Tab Extreme","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1876,"h":3000,"ppi":244,"inches":14.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_m10","brand":"Lenovo","name":"Lenovo Tab M10","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":220,"inches":10.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_m8_4th_gen","brand":"Lenovo","name":"Lenovo Tab M8 (4th Gen)","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_p12","brand":"Lenovo","name":"Lenovo Tab P12","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1840,"h":2944,"ppi":273,"inches":12.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_20","brand":"Meizu","name":"Meizu 20","os":"Android 13, Flyme 10","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_20_classic","brand":"Meizu","name":"Meizu 20 Classic","os":"Android 13, Flyme 10","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_20_infinity","brand":"Meizu","name":"Meizu 20 Infinity","os":"Android 13, Flyme 10","year":2023,"form":"Phone","tablet":false,"w":1368,"h":3192,"ppi":511,"inches":6.79,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_20_pro","brand":"Meizu","name":"Meizu 20 Pro","os":"Android 13, Flyme 10","year":2023,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":515,"inches":6.81,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_21","brand":"Meizu","name":"Meizu 21","os":"Android 13, Flyme 10.5","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":393,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_defy_2","brand":"Motorola","name":"Motorola Defy 2","os":"Android 12","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_2023","brand":"Motorola","name":"Motorola Edge (2023)","os":"Android 13, planned upgrade to Android 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_40","brand":"Motorola","name":"Motorola Edge 40","os":"Android 13, up to 2 major Android upgrades","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_40_neo","brand":"Motorola","name":"Motorola Edge 40 Neo","os":"Android 13, up to 2 major Android upgrades","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_40_pro","brand":"Motorola","name":"Motorola Edge 40 Pro","os":"Android 13, up to 3 major Android upgrades","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":394,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge+_2023","brand":"Motorola","name":"Motorola Edge+ (2023)","os":"Android 13, upgradable to Android 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e13","brand":"Motorola","name":"Motorola Moto E13","os":"Android 13 (Go edition)","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_2023","brand":"Motorola","name":"Motorola Moto G (2023)","os":"Android 13, planned upgrade to Android 14","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_power_5g","brand":"Motorola","name":"Motorola Moto G Power 5G","os":"Android 13, upgradable to Android 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_stylus_2023","brand":"Motorola","name":"Motorola Moto G Stylus (2023)","os":"Android 13, planned upgrade to Android 14","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_stylus_5g_2023","brand":"Motorola","name":"Motorola Moto G Stylus 5G (2023)","os":"Android 13, planned upgrade to Android 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":399,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g13","brand":"Motorola","name":"Motorola Moto G13","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g14","brand":"Motorola","name":"Motorola Moto G14","os":"Android 13, planned upgrade to Android 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g23","brand":"Motorola","name":"Motorola Moto G23","os":"Android 13, planned upgrade to Android 14","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g34","brand":"Motorola","name":"Motorola Moto G34","os":"Android 13 or Android 14","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g54","brand":"Motorola","name":"Motorola Moto G54","os":"Android 13, planned upgrade to Android 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g54_power","brand":"Motorola","name":"Motorola Moto G54 Power","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g73","brand":"Motorola","name":"Motorola Moto G73","os":"Android 13, planned upgrade to Android 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g84","brand":"Motorola","name":"Motorola Moto G84","os":"Android 13, planned upgrade to Android 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_razr_40","brand":"Motorola","name":"Motorola Razr 40","os":"Android 13, up to 3 major Android upgrades","year":2023,"form":"Foldable","tablet":false,"w":1080,"h":2640,"ppi":413,"inches":6.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_razr_40_ultra","brand":"Motorola","name":"Motorola Razr 40 Ultra","os":"Android 13, up to 3 major Android upgrades","year":2023,"form":"Foldable","tablet":false,"w":1080,"h":2640,"ppi":413,"inches":6.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_thinkphone","brand":"Motorola","name":"Motorola ThinkPhone","os":"Android 13, planned upgrade to Android 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":399,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c02","brand":"Nokia","name":"Nokia C02","os":"Android 12 (Go edition)","year":2023,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c110","brand":"Nokia","name":"Nokia C110","os":"Android 12","year":2023,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":273,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c12","brand":"Nokia","name":"Nokia C12","os":"Android 12 (Go edition)","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":278,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c12_plus","brand":"Nokia","name":"Nokia C12 Plus","os":"Android 12 (Go edition)","year":2023,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":267,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c12_pro","brand":"Nokia","name":"Nokia C12 Pro","os":"Android 12 (Go edition)","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":278,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c210","brand":"Nokia","name":"Nokia C210","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":273,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c22","brand":"Nokia","name":"Nokia C22","os":"Android 13 (Go edition)","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c300","brand":"Nokia","name":"Nokia C300","os":"Android 12","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c32","brand":"Nokia","name":"Nokia C32","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_g22","brand":"Nokia","name":"Nokia G22","os":"Android 12","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_g310","brand":"Nokia","name":"Nokia G310","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_g42","brand":"Nokia","name":"Nokia G42","os":"Android 13, upgradable to Android 14","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_xr21","brand":"Nokia","name":"Nokia XR21","os":"Android 12","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":406,"inches":6.49,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nothing_nothing_phone_2","brand":"Nothing","name":"Nothing Phone (2)","os":"Android 13, up to 3 major Android upgrades, Nothing OS 2.6","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_11","brand":"Oneplus","name":"OnePlus 11","os":"Android 13, upgradable to Android 14, OxygenOS 14 (Internati","year":2023,"form":"Phone","tablet":false,"w":1440,"h":3216,"ppi":525,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_11r","brand":"Oneplus","name":"OnePlus 11R","os":"Android 13, OxygenOS 13","year":2023,"form":"Phone","tablet":false,"w":1240,"h":2772,"ppi":451,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_12","brand":"Oneplus","name":"OnePlus 12","os":"Android 14, up to 4 major Android upgrades, OxygenOS 14 (Int","year":2023,"form":"Phone","tablet":false,"w":1440,"h":3168,"ppi":510,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_ace_2","brand":"Oneplus","name":"OnePlus Ace 2","os":"Android 13, ColorOS 13","year":2023,"form":"Phone","tablet":false,"w":1240,"h":2772,"ppi":451,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_ace_2_pro","brand":"Oneplus","name":"OnePlus Ace 2 Pro","os":"Android 13, ColorOS 13.1","year":2023,"form":"Phone","tablet":false,"w":1240,"h":2772,"ppi":451,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_ace_2v","brand":"Oneplus","name":"OnePlus Ace 2V","os":"Android 13, ColorOS 13","year":2023,"form":"Phone","tablet":false,"w":1240,"h":2772,"ppi":451,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_nord_3","brand":"Oneplus","name":"OnePlus Nord 3","os":"Android 13, up to 3 major Android upgrades, OxygenOS 14","year":2023,"form":"Phone","tablet":false,"w":1240,"h":2772,"ppi":451,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_nord_ce_3_lite","brand":"Oneplus","name":"OnePlus Nord CE 3 Lite","os":"Android 13, OxygenOS 13.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":391,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_nord_ce3","brand":"Oneplus","name":"OnePlus Nord CE3","os":"Android 13, OxygenOS 13.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_nord_n30","brand":"Oneplus","name":"OnePlus Nord N30","os":"Android 13, OxygenOS 13.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":391,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_open","brand":"Oneplus","name":"OnePlus Open","os":"Android 13, upgradable to Android 14, OxygenOS 14","year":2023,"form":"Foldable","tablet":true,"w":2268,"h":2440,"ppi":426,"inches":7.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_pad","brand":"Oneplus","name":"OnePlus Pad","os":"Android 13, OxygenOS 13.1","year":2023,"form":"Tablet","tablet":true,"w":2000,"h":2800,"ppi":296,"inches":11.61,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_pad_go","brand":"Oneplus","name":"OnePlus Pad Go","os":"Android 13, OxygenOS 13.2","year":2023,"form":"Tablet","tablet":true,"w":1720,"h":2408,"ppi":260,"inches":11.35,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a1","brand":"Oppo","name":"Oppo A1","os":"Android 13, ColorOS 13.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a18","brand":"Oppo","name":"Oppo A18","os":"Android 13, upgradable to Android 14, ColorOS 14","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a1x","brand":"Oppo","name":"Oppo A1x","os":"Android 12, ColorOS 12.1","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a2","brand":"Oppo","name":"Oppo A2","os":"Android 13, ColorOS 13.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a2_pro","brand":"Oppo","name":"Oppo A2 Pro","os":"Android 13, ColorOS 13.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a2x","brand":"Oppo","name":"Oppo A2x","os":"Android 13, ColorOS 13.1","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a38","brand":"Oppo","name":"Oppo A38","os":"Android 13, upgradable to Android 14, ColorOS 14","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a56s","brand":"Oppo","name":"Oppo A56s","os":"Android 12, ColorOS 12.1","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a58_4g","brand":"Oppo","name":"Oppo A58 4G","os":"Android 13, upgradable to Android 14, ColorOS 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a59","brand":"Oppo","name":"Oppo A59","os":"Android 13, ColorOS 13.1","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a78","brand":"Oppo","name":"Oppo A78","os":"Android 12, upgradable to Android 14, ColorOS 14","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a78_4g","brand":"Oppo","name":"Oppo A78 4G","os":"Android 13, ColorOS 13.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a79","brand":"Oppo","name":"Oppo A79","os":"Android 13, ColorOS 13.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a98","brand":"Oppo","name":"Oppo A98","os":"Android 13, upgradable to Android 14, ColorOS 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f23","brand":"Oppo","name":"Oppo F23","os":"Android 13, upgradable to Android 14, ColorOS 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_n3","brand":"Oppo","name":"Oppo Find N3","os":"Android 13, upgradable to Android 14, ColorOS 14","year":2023,"form":"Foldable","tablet":true,"w":2268,"h":2440,"ppi":426,"inches":7.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_n3_flip","brand":"Oppo","name":"Oppo Find N3 Flip","os":"Android 13, up to 4 major Android upgrades, ColorOS 14","year":2023,"form":"Foldable","tablet":false,"w":1080,"h":2520,"ppi":403,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_x6","brand":"Oppo","name":"Oppo Find X6","os":"Android 13, ColorOS 13.1","year":2023,"form":"Phone","tablet":false,"w":1240,"h":2772,"ppi":451,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_x6_pro","brand":"Oppo","name":"Oppo Find X6 Pro","os":"Android 13, up to 4 major Android upgrades, ColorOS 14","year":2023,"form":"Phone","tablet":false,"w":1440,"h":3168,"ppi":510,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_k11","brand":"Oppo","name":"Oppo K11","os":"Android 13, ColorOS 13.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_k11x","brand":"Oppo","name":"Oppo K11x","os":"Android 13, ColorOS 13.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_pad_2","brand":"Oppo","name":"Oppo Pad 2","os":"Android 13, ColorOS 13.1","year":2023,"form":"Tablet","tablet":true,"w":2000,"h":2800,"ppi":296,"inches":11.61,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_pad_air2","brand":"Oppo","name":"Oppo Pad Air2","os":"Android 13, ColorOS 13.2","year":2023,"form":"Tablet","tablet":true,"w":1720,"h":2408,"ppi":260,"inches":11.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno10","brand":"Oppo","name":"Oppo Reno10","os":"Android 13, upgradable to Android 14, ColorOS 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno10_china","brand":"Oppo","name":"Oppo Reno10 (China)","os":"Android 13, upgradable to Android 14, ColorOS 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno10_pro","brand":"Oppo","name":"Oppo Reno10 Pro","os":"Android 13, upgradable to Android 14, ColorOS 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno10_pro_china","brand":"Oppo","name":"Oppo Reno10 Pro (China)","os":"Android 13, upgradable to Android 14, ColorOS 14","year":2023,"form":"Phone","tablet":false,"w":1240,"h":2772,"ppi":451,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno10_pro+","brand":"Oppo","name":"Oppo Reno10 Pro+","os":"Android 13, upgradable to Android 14, ColorOS 14","year":2023,"form":"Phone","tablet":false,"w":1240,"h":2772,"ppi":451,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno11_china","brand":"Oppo","name":"Oppo Reno11 (China)","os":"Android 14, ColorOS 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno11_pro_china","brand":"Oppo","name":"Oppo Reno11 Pro (China)","os":"Android 14, ColorOS 14","year":2023,"form":"Phone","tablet":false,"w":1240,"h":2772,"ppi":451,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno8_t","brand":"Oppo","name":"Oppo Reno8 T","os":"Android 13, upgradable to Android 14, ColorOS 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno8_t_5g","brand":"Oppo","name":"Oppo Reno8 T 5G","os":"Android 13, upgradable to Android 14, ColorOS 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_watch_4_pro","brand":"Oppo","name":"Oppo Watch 4 Pro","os":"ColorOS Watch 3.0 - China","year":2023,"form":"Phone","tablet":false,"w":378,"h":496,"ppi":327,"inches":1.91,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_bt20","brand":"Oukitel","name":"Oukitel BT20","os":"Proprietary OS","year":2023,"form":"Phone","tablet":false,"w":410,"h":502,"ppi":331,"inches":1.96,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_c32","brand":"Oukitel","name":"Oukitel C32","os":"Android 12","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_c33","brand":"Oukitel","name":"Oukitel C33","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":258,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_c35","brand":"Oukitel","name":"Oukitel C35","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":267,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_c36","brand":"Oukitel","name":"Oukitel C36","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_k16","brand":"Oukitel","name":"Oukitel K16","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":420,"inches":3.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_okt3","brand":"Oukitel","name":"Oukitel OKT3","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":215,"inches":10.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_ot5","brand":"Oukitel","name":"Oukitel OT5","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":194,"inches":12.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_rt5","brand":"Oukitel","name":"Oukitel RT5","os":"Android","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_rt6","brand":"Oukitel","name":"Oukitel RT6","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_rt7_5g","brand":"Oukitel","name":"Oukitel RT7 5G","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp21_ultra","brand":"Oukitel","name":"Oukitel WP21 Ultra","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp22","brand":"Oukitel","name":"Oukitel WP22","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp23","brand":"Oukitel","name":"Oukitel WP23","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp23pro","brand":"Oukitel","name":"Oukitel WP23Pro","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp26","brand":"Oukitel","name":"Oukitel WP26","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp27","brand":"Oukitel","name":"Oukitel WP27","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp28","brand":"Oukitel","name":"Oukitel WP28","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp30_pro","brand":"Oukitel","name":"Oukitel WP30 Pro","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp32","brand":"Oukitel","name":"Oukitel WP32","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":271,"inches":5.93,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_10t","brand":"Realme","name":"Realme 10T","os":"Android 12, Realme UI 3.0","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_11","brand":"Realme","name":"Realme 11","os":"Android 13, Realme UI 4.0","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_11_china","brand":"Realme","name":"Realme 11 (China)","os":"Android 13, Realme UI 4.0","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_11_4g","brand":"Realme","name":"Realme 11 4G","os":"Android 12, Realme UI 3.0","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_11_pro","brand":"Realme","name":"Realme 11 Pro","os":"Android 13, up to 2 major Android upgrades, Realme UI 5.0","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_11_pro+","brand":"Realme","name":"Realme 11 Pro+","os":"Android 13, up to 2 major Android upgrades, Realme UI 5.0","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_11x","brand":"Realme","name":"Realme 11x","os":"Android 13, Realme UI 4.0","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c33_2023","brand":"Realme","name":"Realme C33 2023","os":"Android 12, Realme UI S","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c51","brand":"Realme","name":"Realme C51","os":"Android 13, Realme UI T","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c53","brand":"Realme","name":"Realme C53","os":"Android 13, Realme UI T","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":390,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c53_india","brand":"Realme","name":"Realme C53 (India)","os":"Android 13, Realme UI","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":390,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c55","brand":"Realme","name":"Realme C55","os":"Android 13, Realme UI 4.0","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c67","brand":"Realme","name":"Realme C67","os":"Android 13, Realme UI 4.0","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c67_4g","brand":"Realme","name":"Realme C67 4G","os":"Android 14, Realme UI","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt_neo_5","brand":"Realme","name":"Realme GT Neo 5","os":"Android 13, Realme UI 4.0","year":2023,"form":"Phone","tablet":false,"w":1240,"h":2772,"ppi":451,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt_neo_5_240w","brand":"Realme","name":"Realme GT Neo 5 240W","os":"Android 13, Realme UI 4.0","year":2023,"form":"Phone","tablet":false,"w":1240,"h":2772,"ppi":451,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt_neo5_se","brand":"Realme","name":"Realme GT Neo5 SE","os":"Android 13, Realme UI 4.0","year":2023,"form":"Phone","tablet":false,"w":1240,"h":2772,"ppi":451,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt3","brand":"Realme","name":"Realme GT3","os":"Android 13, upgradable to Android 14, Realme UI 5.0","year":2023,"form":"Phone","tablet":false,"w":1240,"h":2772,"ppi":451,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt5","brand":"Realme","name":"Realme GT5","os":"Android 13, Realme UI 4.0","year":2023,"form":"Phone","tablet":false,"w":1240,"h":2772,"ppi":451,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt5_240w","brand":"Realme","name":"Realme GT5 240W","os":"Android 13, Realme UI 4.0","year":2023,"form":"Phone","tablet":false,"w":1240,"h":2772,"ppi":451,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt5_pro","brand":"Realme","name":"Realme GT5 Pro","os":"Android 14, Realme UI 5.0","year":2023,"form":"Phone","tablet":false,"w":1264,"h":2780,"ppi":450,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_60","brand":"Realme","name":"Realme Narzo 60","os":"Android 13, Realme UI 4.0","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_60_pro","brand":"Realme","name":"Realme Narzo 60 Pro","os":"Android 13, Realme UI 4.0","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_60x","brand":"Realme","name":"Realme Narzo 60x","os":"Android 13, Realme UI 4.0","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_n53","brand":"Realme","name":"Realme Narzo N53","os":"Android 13, Realme UI T","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":390,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_n55","brand":"Realme","name":"Realme Narzo N55","os":"Android 13, Realme UI 4.0","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_pad_2","brand":"Realme","name":"Realme Pad 2","os":"Android 13 or Android 14, Realme UI 4","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":203,"inches":11.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_v30","brand":"Realme","name":"Realme V30","os":"Android 12, Realme UI 3.0","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_v50s","brand":"Realme","name":"Realme V50s","os":"Android 13, Realme UI 4.0","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a05","brand":"Samsung","name":"Samsung Galaxy A05","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":262,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a05s","brand":"Samsung","name":"Samsung Galaxy A05s","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a14","brand":"Samsung","name":"Samsung Galaxy A14","os":"Android 13, One UI Core 5","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a14_5g","brand":"Samsung","name":"Samsung Galaxy A14 5G","os":"Android 13, upgradable to Android 14, One UI Core 6","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a15","brand":"Samsung","name":"Samsung Galaxy A15","os":"Android 14, up to 3 major Android upgrades, One UI 6.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":396,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a15_5g","brand":"Samsung","name":"Samsung Galaxy A15 5G","os":"Android 14, up to 3 major Android upgrades, One UI 6.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":396,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a24_4g","brand":"Samsung","name":"Samsung Galaxy A24 4G","os":"Android 13, up to 4 major Android upgrades, One UI 6","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":396,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a25","brand":"Samsung","name":"Samsung Galaxy A25","os":"Android 14, up to 4 major Android upgrades, One UI 6.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":396,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a34","brand":"Samsung","name":"Samsung Galaxy A34","os":"Android 13, up to 4 major Android upgrades, One UI 6.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":390,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a54","brand":"Samsung","name":"Samsung Galaxy A54","os":"Android 13, up to 4 major Android upgrades, One UI 6.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_f04","brand":"Samsung","name":"Samsung Galaxy F04","os":"Android 12, One UI","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_f14","brand":"Samsung","name":"Samsung Galaxy F14","os":"Android 13, One UI Core 5.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_f34","brand":"Samsung","name":"Samsung Galaxy F34","os":"Android 13, One UI 5.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":396,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_f54","brand":"Samsung","name":"Samsung Galaxy F54","os":"Android 13, up to 4 major Android upgrades, One UI 5.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m14","brand":"Samsung","name":"Samsung Galaxy M14","os":"Android 13, One UI core 5.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m34_5g","brand":"Samsung","name":"Samsung Galaxy M34 5G","os":"Android 13, upgradable to Android 14, One UI 6","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":396,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m54","brand":"Samsung","name":"Samsung Galaxy M54","os":"Android 13, One UI 5.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s23","brand":"Samsung","name":"Samsung Galaxy S23","os":"Android 13, up to 4 major Android upgrades, One UI 6.1.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":425,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s23_fe","brand":"Samsung","name":"Samsung Galaxy S23 FE","os":"Android 13, up to 4 major Android upgrades, One UI 6.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s23_ultra","brand":"Samsung","name":"Samsung Galaxy S23 Ultra","os":"Android 13, up to 4 major Android upgrades, One UI 6.1.1","year":2023,"form":"Phone","tablet":false,"w":1440,"h":3088,"ppi":500,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s23+","brand":"Samsung","name":"Samsung Galaxy S23+","os":"Android 13, up to 4 major Android upgrades, One UI 6.1.1","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":393,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_a9","brand":"Samsung","name":"Samsung Galaxy Tab A9","os":"Android 13, upgradable to Android 14, One UI 6.1","year":2023,"form":"Tablet","tablet":true,"w":800,"h":1340,"ppi":179,"inches":8.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_a9+","brand":"Samsung","name":"Samsung Galaxy Tab A9+","os":"Android 13, upgradable to Android 14, One UI 6.1","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":206,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s9","brand":"Samsung","name":"Samsung Galaxy Tab S9","os":"Android 13, up to 4 major Android upgrades, One UI 6","year":2023,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":274,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s9_fe","brand":"Samsung","name":"Samsung Galaxy Tab S9 FE","os":"Android 13, up to 4 major Android upgrades, One UI 6","year":2023,"form":"Tablet","tablet":true,"w":1440,"h":2304,"ppi":249,"inches":10.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s9_fe+","brand":"Samsung","name":"Samsung Galaxy Tab S9 FE+","os":"Android 13, up to 4 major Android upgrades, One UI 6","year":2023,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":243,"inches":12.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s9_ultra","brand":"Samsung","name":"Samsung Galaxy Tab S9 Ultra","os":"Android 13, up to 4 major Android upgrades, One UI 6","year":2023,"form":"Tablet","tablet":true,"w":1848,"h":2960,"ppi":239,"inches":14.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s9+","brand":"Samsung","name":"Samsung Galaxy Tab S9+","os":"Android 13, up to 4 major Android upgrades, One UI 6","year":2023,"form":"Tablet","tablet":true,"w":1752,"h":2800,"ppi":266,"inches":12.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_watch6","brand":"Samsung","name":"Samsung Galaxy Watch6","os":"Android Wear OS 4, One UI Watch 5","year":2023,"form":"Phone","tablet":false,"w":480,"h":480,"ppi":327,"inches":1.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_watch6_classic","brand":"Samsung","name":"Samsung Galaxy Watch6 Classic","os":"Android Wear OS 4, One UI Watch 5","year":2023,"form":"Phone","tablet":false,"w":480,"h":480,"ppi":453,"inches":1.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_z_flip5","brand":"Samsung","name":"Samsung Galaxy Z Flip5","os":"Android 13, upgradable to Android 14, One UI 6.1.1","year":2023,"form":"Foldable","tablet":false,"w":1080,"h":2640,"ppi":425,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_z_fold5","brand":"Samsung","name":"Samsung Galaxy Z Fold5","os":"Android 13, up to 4 major Android upgrades, One UI 6.1.1","year":2023,"form":"Foldable","tablet":true,"w":1812,"h":2176,"ppi":373,"inches":7.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_r7s","brand":"Sharp","name":"Sharp Aquos R7s","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1260,"h":2730,"ppi":456,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_r8s","brand":"Sharp","name":"Sharp Aquos R8s","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_r8s_pro","brand":"Sharp","name":"Sharp Aquos R8s pro","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1260,"h":2730,"ppi":456,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_sense7","brand":"Sharp","name":"Sharp Aquos sense7","os":"Android 12, upgradable to Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2432,"ppi":436,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_sense7_plus","brand":"Sharp","name":"Sharp Aquos sense7 plus","os":"Android 12, upgradable to Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_v7_plus","brand":"Sharp","name":"Sharp Aquos V7 Plus","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_1_v","brand":"Sony","name":"Sony Xperia 1 V","os":"Android 13, upgradable to Android 14","year":2023,"form":"Phone","tablet":false,"w":1644,"h":3840,"ppi":643,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_10_v","brand":"Sony","name":"Sony Xperia 10 V","os":"Android 13, upgradable to Android 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2520,"ppi":449,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_5_v","brand":"Sony","name":"Sony Xperia 5 V","os":"Android 13, upgradable to Android 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2520,"ppi":449,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_40_nxtpaper","brand":"Tcl","name":"TCL 40 NxtPaper","os":"Android 13, TCL UI","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_40_nxtpaper_5g","brand":"Tcl","name":"TCL 40 NxtPaper 5G","os":"Android 13, TCL UI","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_40_se","brand":"Tcl","name":"TCL 40 SE","os":"Android 13, TCL UI 5.0","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_40_x","brand":"Tcl","name":"TCL 40 X","os":"Android 13, TCL UI","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_40_xe","brand":"Tcl","name":"TCL 40 XE","os":"Android 13, TCL UI","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_40_xl","brand":"Tcl","name":"TCL 40 XL","os":"Android 13, TCL UI","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_403","brand":"Tcl","name":"TCL 403","os":"Android 12 (Go edition)","year":2023,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":179,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_406","brand":"Tcl","name":"TCL 406","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_408","brand":"Tcl","name":"TCL 408","os":"Android 12","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_ion_x","brand":"Tcl","name":"TCL Ion X","os":"Android, TCL UI","year":2023,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":268,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_nxtpaper_11","brand":"Tcl","name":"TCL NxtPaper 11","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":213,"inches":10.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_nxtpaper_12_pro","brand":"Tcl","name":"TCL NxtPaper 12 Pro","os":"Android 12","year":2023,"form":"Tablet","tablet":true,"w":1440,"h":2160,"ppi":213,"inches":12.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_tab_10_gen2","brand":"Tcl","name":"TCL Tab 10 Gen2","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":225,"inches":10.36,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_tab_10l_gen2","brand":"Tcl","name":"TCL Tab 10L Gen2","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_tab_11","brand":"Tcl","name":"TCL Tab 11","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":213,"inches":10.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_camon_20","brand":"Tecno","name":"Tecno Camon 20","os":"Android 13, HIOS 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_20_premier","brand":"Tecno","name":"Tecno Camon 20 Premier","os":"Android 13, HIOS 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_20_pro","brand":"Tecno","name":"Tecno Camon 20 Pro","os":"Android 13, HIOS 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_20_pro_5g","brand":"Tecno","name":"Tecno Camon 20 Pro 5G","os":"Android 13, HIOS 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_20s_pro_5g","brand":"Tecno","name":"Tecno Camon 20s Pro 5G","os":"Android 13, HIOS 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_phantom_v_flip","brand":"Tecno","name":"Tecno Phantom V Flip","os":"Android 13, HIOS 13.5","year":2023,"form":"Foldable","tablet":false,"w":1080,"h":2640,"ppi":413,"inches":6.9,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_phantom_v_fold","brand":"Tecno","name":"Tecno Phantom V Fold","os":"Android 13, HiOS 13 Fold","year":2023,"form":"Foldable","tablet":true,"w":2000,"h":2296,"ppi":388,"inches":7.85,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"tecno_tecno_pop_7","brand":"Tecno","name":"Tecno Pop 7","os":"Android 12 (Go edition)","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_pop_7_pro","brand":"Tecno","name":"Tecno Pop 7 Pro","os":"Android 12, HIOS 12","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pop_8","brand":"Tecno","name":"Tecno Pop 8","os":"Android 13 (Go edition)","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_pova_5","brand":"Tecno","name":"Tecno Pova 5","os":"Android 13, HIOS 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pova_5_pro","brand":"Tecno","name":"Tecno Pova 5 Pro","os":"Android 13, upgradable to Android 14, HIOS 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pova_neo_3","brand":"Tecno","name":"Tecno Pova Neo 3","os":"Android 13, HIOS","year":2023,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.82,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_10","brand":"Tecno","name":"Tecno Spark 10","os":"Android 13, HIOS 12","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_10_5g","brand":"Tecno","name":"Tecno Spark 10 5G","os":"Android 13, HIOS 12.6","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_10_pro","brand":"Tecno","name":"Tecno Spark 10 Pro","os":"Android 13, HIOS 12.6","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.8,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_10c","brand":"Tecno","name":"Tecno Spark 10C","os":"Android 12, HIOS 8.6","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_20","brand":"Tecno","name":"Tecno Spark 20","os":"Android 13, HIOS 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_20_pro","brand":"Tecno","name":"Tecno Spark 20 Pro","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_spark_20_pro+","brand":"Tecno","name":"Tecno Spark 20 Pro+","os":"Android 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2436,"ppi":393,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_spark_20c","brand":"Tecno","name":"Tecno Spark 20C","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_spark_go_2023","brand":"Tecno","name":"Tecno Spark Go 2023","os":"Android 12, HIOS 12","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":267,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_go_2024","brand":"Tecno","name":"Tecno Spark Go 2024","os":"Android 13 (Go edition), HIOS 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"ulefone__ulefone_armor_21","brand":"Ulefone_","name":"Ulefone Armor 21","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_22","brand":"Ulefone_","name":"Ulefone Armor 22","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_23_ultra","brand":"Ulefone_","name":"Ulefone Armor 23 Ultra","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_24","brand":"Ulefone_","name":"Ulefone Armor 24","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_pad","brand":"Ulefone_","name":"Ulefone Armor Pad","os":"Android 12","year":2023,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_pad_2","brand":"Ulefone_","name":"Ulefone Armor Pad 2","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":212,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_x12","brand":"Ulefone_","name":"Ulefone Armor X12","os":"Android 13 (Go edition)","year":2023,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_x12_pro","brand":"Ulefone_","name":"Ulefone Armor X12 Pro","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_x13","brand":"Ulefone_","name":"Ulefone Armor X13","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_note_15","brand":"Ulefone_","name":"Ulefone Note 15","os":"Android 12 (Go edition)","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":282,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_note_16_pro","brand":"Ulefone_","name":"Ulefone Note 16 Pro","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_power_armor_18_ultra","brand":"Ulefone_","name":"Ulefone Power Armor 18 Ultra","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_power_armor_18t_ultra","brand":"Ulefone_","name":"Ulefone Power Armor 18T Ultra","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_power_armor_19t","brand":"Ulefone_","name":"Ulefone Power Armor 19T","os":"Android 12","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_power_armor_20wt","brand":"Ulefone_","name":"Ulefone Power Armor 20WT","os":"Android 12","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":427,"inches":5.65,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_power_armor_x11","brand":"Ulefone_","name":"Ulefone Power Armor X11","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_tab_a8","brand":"Ulefone_","name":"Ulefone Tab A8","os":"Android 12","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_a15","brand":"Umidigi","name":"Umidigi A15","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1650,"ppi":269,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_a15_tab","brand":"Umidigi","name":"Umidigi A15 Tab","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":212,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_a15c","brand":"Umidigi","name":"Umidigi A15C","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1650,"ppi":269,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_active_t1","brand":"Umidigi","name":"Umidigi Active T1","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":212,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_c1_plus","brand":"Umidigi","name":"Umidigi C1 Plus","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_c2","brand":"Umidigi","name":"Umidigi C2","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_f3_pro","brand":"Umidigi","name":"Umidigi F3 Pro","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g1_plus","brand":"Umidigi","name":"Umidigi G1 Plus","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g1_tab","brand":"Umidigi","name":"Umidigi G1 Tab","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g2","brand":"Umidigi","name":"Umidigi G2","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g2_tab","brand":"Umidigi","name":"Umidigi G2 Tab","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g3","brand":"Umidigi","name":"Umidigi G3","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g3_max","brand":"Umidigi","name":"Umidigi G3 Max","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g3_plus","brand":"Umidigi","name":"Umidigi G3 Plus","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g5","brand":"Umidigi","name":"Umidigi G5","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g5_mecha","brand":"Umidigi","name":"Umidigi G5 Mecha","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g5_tab","brand":"Umidigi","name":"Umidigi G5 Tab","os":"Android 13","year":2023,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g5a","brand":"Umidigi","name":"Umidigi G5A","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_11s","brand":"Vivo","name":"vivo iQOO 11S","os":"Android 13, OriginOS 3 (China)","year":2023,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":518,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_12","brand":"Vivo","name":"vivo iQOO 12","os":"Android 14, up to 2 major Android upgrades, Funtouch 15 (Int","year":2023,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_12_pro","brand":"Vivo","name":"vivo iQOO 12 Pro","os":"Android 14, up to 2 major Android upgrades, Funtouch 14 (Int","year":2023,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":518,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo_7","brand":"Vivo","name":"vivo iQOO Neo 7","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo_7_pro","brand":"Vivo","name":"vivo iQOO Neo 7 Pro","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo8","brand":"Vivo","name":"vivo iQOO Neo8","os":"Android 13, Funtouch 13 or OriginOS 3 (China)","year":2023,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo8_pro","brand":"Vivo","name":"vivo iQOO Neo8 Pro","os":"Android 13, Funtouch 13 or OriginOS 3 (China)","year":2023,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo9","brand":"Vivo","name":"vivo iQOO Neo9","os":"Android 14, OriginOS 4","year":2023,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo9_pro_china","brand":"Vivo","name":"vivo iQOO Neo9 Pro (China)","os":"Android 14, OriginOS 4","year":2023,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_pad","brand":"Vivo","name":"vivo iQOO Pad","os":"Android 13, OriginOS 3","year":2023,"form":"Tablet","tablet":true,"w":1968,"h":2800,"ppi":283,"inches":12.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z7","brand":"Vivo","name":"vivo iQOO Z7","os":"Android 13, upgradable to Android 14, Funtouch 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":413,"inches":6.38,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z7_china","brand":"Vivo","name":"vivo iQOO Z7 (China)","os":"Android 13, OriginOS 3","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":395,"inches":6.64,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z7_pro","brand":"Vivo","name":"vivo iQOO Z7 Pro","os":"Android 13, planned upgrade to Android 14, Funtouch 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z7i","brand":"Vivo","name":"vivo iQOO Z7i","os":"Android 13, OriginOS Ocean","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z7s","brand":"Vivo","name":"vivo iQOO Z7s","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":413,"inches":6.38,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z7x","brand":"Vivo","name":"vivo iQOO Z7x","os":"Android 13, Funtouch 13 (Global), Origin OS 3 (China)","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":395,"inches":6.64,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z8_china","brand":"Vivo","name":"vivo iQOO Z8 (China)","os":"Android 13, OriginOS 3","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":395,"inches":6.64,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z8x","brand":"Vivo","name":"vivo iQOO Z8x","os":"Android 13, OriginOS 3","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":395,"inches":6.64,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_pad_air","brand":"Vivo","name":"vivo Pad Air","os":"Android 13, OriginOS 3","year":2023,"form":"Tablet","tablet":true,"w":1840,"h":2800,"ppi":291,"inches":11.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_pad2","brand":"Vivo","name":"vivo Pad2","os":"Android 13, OriginOS 3","year":2023,"form":"Tablet","tablet":true,"w":1968,"h":2800,"ppi":284,"inches":12.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s17","brand":"Vivo","name":"vivo S17","os":"Android 13, OriginOS 3","year":2023,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s17_pro","brand":"Vivo","name":"vivo S17 Pro","os":"Android 13, OriginOS 3","year":2023,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":452,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s17e","brand":"Vivo","name":"vivo S17e","os":"Android 13, OriginOS 3","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s17t","brand":"Vivo","name":"vivo S17t","os":"Android 13, OriginOS 3","year":2023,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s18","brand":"Vivo","name":"vivo S18","os":"Android 14, OriginOS 4","year":2023,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s18_pro","brand":"Vivo","name":"vivo S18 Pro","os":"Android 14, OriginOS 4","year":2023,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s18e","brand":"Vivo","name":"vivo S18e","os":"Android 14, OriginOS 4","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_t2","brand":"Vivo","name":"vivo T2","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":398,"inches":6.62,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_t2_india","brand":"Vivo","name":"vivo T2 (India)","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":413,"inches":6.38,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_t2_pro","brand":"Vivo","name":"vivo T2 Pro","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_t2x_india","brand":"Vivo","name":"vivo T2x (India)","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v27","brand":"Vivo","name":"vivo V27","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v27_pro","brand":"Vivo","name":"vivo V27 Pro","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v27e","brand":"Vivo","name":"vivo V27e","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":398,"inches":6.62,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v29","brand":"Vivo","name":"vivo V29","os":"Android 13, up to 3 major Android upgrades, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v29_lite","brand":"Vivo","name":"vivo V29 Lite","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v29_pro","brand":"Vivo","name":"vivo V29 Pro","os":"Android 13, up to 3 major Android upgrades, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v29e","brand":"Vivo","name":"vivo V29e","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v29e_india","brand":"Vivo","name":"vivo V29e (India)","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v30_lite","brand":"Vivo","name":"vivo V30 Lite","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x_flip","brand":"Vivo","name":"vivo X Flip","os":"Android 13, OriginOS 3","year":2023,"form":"Foldable","tablet":false,"w":1080,"h":2520,"ppi":407,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x_fold2","brand":"Vivo","name":"vivo X Fold2","os":"Android 13, OriginOS 3","year":2023,"form":"Foldable","tablet":true,"w":1916,"h":2160,"ppi":360,"inches":8.03,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x100","brand":"Vivo","name":"vivo X100","os":"Android 14, Funtouch 14 (International), OriginOS 4 (China)","year":2023,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":452,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x100_pro","brand":"Vivo","name":"vivo X100 Pro","os":"Android 14, up to Android 15, Funtouch 15 (International), O","year":2023,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":452,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x90s","brand":"Vivo","name":"vivo X90s","os":"Android 13, OriginOS 3","year":2023,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y02a","brand":"Vivo","name":"vivo Y02A","os":"Android 12 (Go edition), Funtouch 12","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y02t","brand":"Vivo","name":"vivo Y02t","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y100","brand":"Vivo","name":"vivo Y100","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":413,"inches":6.38,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y100_china","brand":"Vivo","name":"vivo Y100 (China)","os":"Android 13, OriginOS 3","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y100i","brand":"Vivo","name":"vivo Y100i","os":"Android 13, OriginOS 3","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":395,"inches":6.64,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y11_2023","brand":"Vivo","name":"vivo Y11 (2023)","os":"Android 12, OriginOS Ocean","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y17s","brand":"Vivo","name":"vivo Y17s","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y200","brand":"Vivo","name":"vivo Y200","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y27","brand":"Vivo","name":"vivo Y27","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":395,"inches":6.64,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y27_5g","brand":"Vivo","name":"vivo Y27 5G","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":395,"inches":6.64,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y27s","brand":"Vivo","name":"vivo Y27s","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":395,"inches":6.64,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y35+","brand":"Vivo","name":"vivo Y35+","os":"Android 13, OriginOS 3","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":395,"inches":6.64,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y36","brand":"Vivo","name":"vivo Y36","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":395,"inches":6.64,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y36_india","brand":"Vivo","name":"vivo Y36 (India)","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":395,"inches":6.64,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y36_5g","brand":"Vivo","name":"vivo Y36 5G","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":395,"inches":6.64,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y36i","brand":"Vivo","name":"vivo Y36i","os":"Android 13, OriginOS 3","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y55s_2023","brand":"Vivo","name":"vivo Y55s (2023)","os":"Android 12, Funtouch 12","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y56","brand":"Vivo","name":"vivo Y56","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y77t","brand":"Vivo","name":"vivo Y77t","os":"Android 13, OriginOS 3","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":395,"inches":6.64,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y78","brand":"Vivo","name":"vivo Y78","os":"Android 13, Funtouch 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y78_china","brand":"Vivo","name":"vivo Y78 (China)","os":"Android 13, OriginOS 3","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":395,"inches":6.64,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y78+","brand":"Vivo","name":"vivo Y78+","os":"Android 13, OriginOS 3","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y78t","brand":"Vivo","name":"vivo Y78t","os":"Android 13, OriginOS 3","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":395,"inches":6.64,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_13_lite","brand":"Xiaomi","name":"Xiaomi 13 Lite","os":"Android 12, MIUI 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_13_ultra","brand":"Xiaomi","name":"Xiaomi 13 Ultra","os":"Android 13, upgradable to Android 14, HyperOS","year":2023,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":522,"inches":6.73,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_13t","brand":"Xiaomi","name":"Xiaomi 13T","os":"Android 13, up to 4 major Android upgrades, HyperOS","year":2023,"form":"Phone","tablet":false,"w":1220,"h":2712,"ppi":446,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_13t_pro","brand":"Xiaomi","name":"Xiaomi 13T Pro","os":"Android 13, up to 4 major Android upgrades, HyperOS","year":2023,"form":"Phone","tablet":false,"w":1220,"h":2712,"ppi":446,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_14","brand":"Xiaomi","name":"Xiaomi 14","os":"Android 14, up to 4 major Android upgrades, HyperOS","year":2023,"form":"Phone","tablet":false,"w":1200,"h":2670,"ppi":460,"inches":6.36,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_14_pro","brand":"Xiaomi","name":"Xiaomi 14 Pro","os":"Android 14, HyperOS","year":2023,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":522,"inches":6.73,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_civi_3","brand":"Xiaomi","name":"Xiaomi Civi 3","os":"Android 13, MIUI 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mix_fold_3","brand":"Xiaomi","name":"Xiaomi Mix Fold 3","os":"Android 13, MIUI Fold 14","year":2023,"form":"Foldable","tablet":true,"w":1916,"h":2160,"ppi":360,"inches":8.03,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_pad_6","brand":"Xiaomi","name":"Xiaomi Pad 6","os":"Android 13, MIUI Pad 14","year":2023,"form":"Tablet","tablet":true,"w":1800,"h":2880,"ppi":309,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_pad_6_max_14","brand":"Xiaomi","name":"Xiaomi Pad 6 Max 14","os":"Android 13, MIUI Pad 14","year":2023,"form":"Tablet","tablet":true,"w":1800,"h":2880,"ppi":242,"inches":14.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_pad_6_pro","brand":"Xiaomi","name":"Xiaomi Pad 6 Pro","os":"Android 13, MIUI 14","year":2023,"form":"Tablet","tablet":true,"w":1800,"h":2880,"ppi":309,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_c50","brand":"Xiaomi","name":"Xiaomi Poco C50","os":"Android 12 (Go edition)","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_c51","brand":"Xiaomi","name":"Xiaomi Poco C51","os":"Android 13 (Go edition), MIUI","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_c55","brand":"Xiaomi","name":"Xiaomi Poco C55","os":"Android 12, MIUI 13 for POCO","year":2023,"form":"Phone","tablet":false,"w":720,"h":1650,"ppi":268,"inches":6.71,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_c65","brand":"Xiaomi","name":"Xiaomi Poco C65","os":"Android 13, MIUI 14 for POCO","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_f5","brand":"Xiaomi","name":"Xiaomi Poco F5","os":"Android 13, upgradable to Android 14, HyperOS","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_f5_pro","brand":"Xiaomi","name":"Xiaomi Poco F5 Pro","os":"Android 13, MIUI 14 for POCO","year":2023,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":526,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_m6","brand":"Xiaomi","name":"Xiaomi Poco M6","os":"Android 13, MIUI 14","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_m6_pro_5g","brand":"Xiaomi","name":"Xiaomi Poco M6 Pro 5G","os":"Android 13, MIUI 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.79,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_x5","brand":"Xiaomi","name":"Xiaomi Poco X5","os":"Android 12, MIUI 13 for POCO","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_x5_pro","brand":"Xiaomi","name":"Xiaomi Poco X5 Pro","os":"Android 12, upgradable to Android 13, MIUI 14 for POCO","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_12","brand":"Xiaomi","name":"Xiaomi Redmi 12","os":"Android 13, upgradable to Android 14, HyperOS","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.79,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_12_5g","brand":"Xiaomi","name":"Xiaomi Redmi 12 5G","os":"Android 13, upgradable to Android 14, HyperOS","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.79,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_13c","brand":"Xiaomi","name":"Xiaomi Redmi 13C","os":"Android 13, MIUI 14","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_13c_5g","brand":"Xiaomi","name":"Xiaomi Redmi 13C 5G","os":"Android 13, MIUI 14","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_13r","brand":"Xiaomi","name":"Xiaomi Redmi 13R","os":"Android 13, MIUI 14","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_a2","brand":"Xiaomi","name":"Xiaomi Redmi A2","os":"Android 12 or 13 (Go edition), MIUI","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_a2+","brand":"Xiaomi","name":"Xiaomi Redmi A2+","os":"Android 12 or 13 (Go edition), MIUI","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k60_ultra","brand":"Xiaomi","name":"Xiaomi Redmi K60 Ultra","os":"Android 13, MIUI 14","year":2023,"form":"Phone","tablet":false,"w":1220,"h":2712,"ppi":446,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k70","brand":"Xiaomi","name":"Xiaomi Redmi K70","os":"Android 14, HyperOS","year":2023,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":526,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k70_pro","brand":"Xiaomi","name":"Xiaomi Redmi K70 Pro","os":"Android 14, HyperOS","year":2023,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":526,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k70e","brand":"Xiaomi","name":"Xiaomi Redmi K70E","os":"Android 14, HyperOS","year":2023,"form":"Phone","tablet":false,"w":1220,"h":2712,"ppi":446,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_12_4g","brand":"Xiaomi","name":"Xiaomi Redmi Note 12 4G","os":"Android 13, upgradable to Android 14, HyperOS","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_12_pro_4g","brand":"Xiaomi","name":"Xiaomi Redmi Note 12 Pro 4G","os":"Android 11, MIUI 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_12_turbo","brand":"Xiaomi","name":"Xiaomi Redmi Note 12 Turbo","os":"Android 13, MIUI 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_12r","brand":"Xiaomi","name":"Xiaomi Redmi Note 12R","os":"Android 13, MIUI 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.79,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_12r_pro","brand":"Xiaomi","name":"Xiaomi Redmi Note 12R Pro","os":"Android 13, MIUI 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_12s","brand":"Xiaomi","name":"Xiaomi Redmi Note 12S","os":"Android 13, MIUI 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_12t_pro","brand":"Xiaomi","name":"Xiaomi Redmi Note 12T Pro","os":"Android 13, MIUI 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":407,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_13_china","brand":"Xiaomi","name":"Xiaomi Redmi Note 13 (China)","os":"Android 13, MIUI 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_13_pro","brand":"Xiaomi","name":"Xiaomi Redmi Note 13 Pro","os":"Android 13, up to 3 major Android upgrades, HyperOS","year":2023,"form":"Phone","tablet":false,"w":1220,"h":2712,"ppi":446,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_13_pro+","brand":"Xiaomi","name":"Xiaomi Redmi Note 13 Pro+","os":"Android 13, up to 3 major Android upgrades, HyperOS","year":2023,"form":"Phone","tablet":false,"w":1220,"h":2712,"ppi":446,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_13r_pro","brand":"Xiaomi","name":"Xiaomi Redmi Note 13R Pro","os":"Android 13, MIUI 14","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_pad_se","brand":"Xiaomi","name":"Xiaomi Redmi Pad SE","os":"Android 13, MIUI Pad 14","year":2023,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":207,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_50_ultra","brand":"Zte","name":"ZTE Axon 50 Ultra","os":"Android 12, MyOS 12","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_pad","brand":"Zte","name":"ZTE Axon Pad","os":"Android 13, MyOS 13","year":2023,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":249,"inches":12.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a54","brand":"Zte","name":"ZTE Blade A54","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a73","brand":"Zte","name":"ZTE Blade A73","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a73_5g","brand":"Zte","name":"ZTE Blade A73 5G","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v50","brand":"Zte","name":"ZTE Blade V50","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v50_design","brand":"Zte","name":"ZTE Blade V50 Design","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v50_design_4g","brand":"Zte","name":"ZTE Blade V50 Design 4G","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v50_vita","brand":"Zte","name":"ZTE Blade V50 Vita","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_neo","brand":"Zte","name":"ZTE nubia Neo","os":"Android 13","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_pad_3d","brand":"Zte","name":"ZTE nubia Pad 3D","os":"Android 12L","year":2023,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":243,"inches":12.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_8s_pro","brand":"Zte","name":"ZTE nubia Red Magic 8S Pro","os":"Android 13, Redmagic OS 8","year":2023,"form":"Phone","tablet":false,"w":1116,"h":2480,"ppi":400,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_8s_pro+","brand":"Zte","name":"ZTE nubia Red Magic 8S Pro+","os":"Android 13, Redmagic OS 8","year":2023,"form":"Phone","tablet":false,"w":1116,"h":2480,"ppi":400,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_9_pro","brand":"Zte","name":"ZTE nubia Red Magic 9 Pro","os":"Android 14, Redmagic OS 9","year":2023,"form":"Phone","tablet":false,"w":1116,"h":2480,"ppi":400,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_9_pro+","brand":"Zte","name":"ZTE nubia Red Magic 9 Pro+","os":"Android 14, Redmagic OS 9","year":2023,"form":"Phone","tablet":false,"w":1116,"h":2480,"ppi":400,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_tablet","brand":"Zte","name":"ZTE nubia Red Magic Tablet","os":"Android 13, Redmagic OS 8","year":2023,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":249,"inches":12.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z50_ultra","brand":"Zte","name":"ZTE nubia Z50 Ultra","os":"Android 13, MyOS 13","year":2023,"form":"Phone","tablet":false,"w":1116,"h":2480,"ppi":400,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z50s_pro","brand":"Zte","name":"ZTE nubia Z50S Pro","os":"Android 13, MyOS 13","year":2023,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":452,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z60_ultra","brand":"Zte","name":"ZTE nubia Z60 Ultra","os":"Android 14, MyOS 14","year":2023,"form":"Phone","tablet":false,"w":1116,"h":2480,"ppi":400,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_v70","brand":"Zte","name":"ZTE V70","os":"Android 11, MyOS 11.5","year":2023,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_1b_2022","brand":"Alcatel","name":"alcatel 1B (2022)","os":"Android 11 (Go edition)","year":2022,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"apple_apple_ipad_2022","brand":"Apple","name":"Apple iPad (2022)","os":"iPadOS 16.1, upgradable to iPadOS 18","year":2022,"form":"Tablet","tablet":true,"w":1640,"h":2360,"ppi":264,"inches":10.9,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_ipad_air_2022","brand":"Apple","name":"Apple iPad Air (2022)","os":"iPadOS 15.4, upgradable to iPadOS 18","year":2022,"form":"Tablet","tablet":true,"w":1640,"h":2360,"ppi":264,"inches":10.9,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_ipad_pro_11_2022","brand":"Apple","name":"Apple iPad Pro 11 (2022)","os":"iPadOS 16.1, upgradable to iPadOS 18","year":2022,"form":"Tablet","tablet":true,"w":1668,"h":2388,"ppi":265,"inches":11.0,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_ipad_pro_12.9_2022","brand":"Apple","name":"Apple iPad Pro 12.9 (2022)","os":"iPadOS 16.1, upgradable to iPadOS 18","year":2022,"form":"Tablet","tablet":true,"w":2048,"h":2732,"ppi":265,"inches":12.9,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_iphone_14","brand":"Apple","name":"Apple iPhone 14","os":"iOS 16, upgradable to iOS 18","year":2022,"form":"Phone","tablet":false,"w":1170,"h":2532,"ppi":460,"inches":6.1,"platform":"ios","hasNotch":true,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":47,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_14_plus","brand":"Apple","name":"Apple iPhone 14 Plus","os":"iOS 16, upgradable to iOS 18","year":2022,"form":"Phone","tablet":false,"w":1284,"h":2778,"ppi":458,"inches":6.7,"platform":"ios","hasNotch":true,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":47,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_14_pro","brand":"Apple","name":"Apple iPhone 14 Pro","os":"iOS 16, upgradable to iOS 18","year":2022,"form":"Phone","tablet":false,"w":1179,"h":2556,"ppi":460,"inches":6.1,"platform":"ios","hasNotch":false,"hasIsland":true,"hasHole":false,"hasHome":true,"safeTop":59,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_14_pro_max","brand":"Apple","name":"Apple iPhone 14 Pro Max","os":"iOS 16, upgradable to iOS 18","year":2022,"form":"Phone","tablet":false,"w":1290,"h":2796,"ppi":460,"inches":6.7,"platform":"ios","hasNotch":false,"hasIsland":true,"hasHole":false,"hasHome":true,"safeTop":59,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_se_2022","brand":"Apple","name":"Apple iPhone SE (2022)","os":"iOS 15.4, upgradable to iOS 18","year":2022,"form":"Phone","tablet":false,"w":750,"h":1334,"ppi":326,"inches":4.7,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"asus_asus_rog_phone_6","brand":"Asus","name":"Asus ROG Phone 6","os":"Android 12, upgradable to Android 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2448,"ppi":395,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_rog_phone_6_batman_edition","brand":"Asus","name":"Asus ROG Phone 6 Batman Edition","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2448,"ppi":395,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_rog_phone_6_diablo_immortal_edition","brand":"Asus","name":"Asus ROG Phone 6 Diablo Immortal Edition","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2448,"ppi":395,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_rog_phone_6_pro","brand":"Asus","name":"Asus ROG Phone 6 Pro","os":"Android 12, upgradable to Android 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2448,"ppi":395,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_rog_phone_6d","brand":"Asus","name":"Asus ROG Phone 6D","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2448,"ppi":395,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_rog_phone_6d_ultimate","brand":"Asus","name":"Asus ROG Phone 6D Ultimate","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2448,"ppi":395,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_9","brand":"Asus","name":"Asus Zenfone 9","os":"Android 12, upgradable to Android 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":445,"inches":5.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_a50","brand":"Blackview","name":"Blackview A50","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":286,"inches":6.01,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_a52","brand":"Blackview","name":"Blackview A52","os":"Android 12, Doke OS G0 3.0","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_a55_pro","brand":"Blackview","name":"Blackview A55 Pro","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_a85","brand":"Blackview","name":"Blackview A85","os":"Android 12, Doke OS 3.0","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":272,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_a95","brand":"Blackview","name":"Blackview A95","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bl8800","brand":"Blackview","name":"Blackview BL8800","os":"Android 11, Doke-OS 3.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bl8800_pro","brand":"Blackview","name":"Blackview BL8800 Pro","os":"Android 11, Doke-OS 3.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bv5200","brand":"Blackview","name":"Blackview BV5200","os":"Android 12, Doke-OS 3.0","year":2022,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bv5200_pro","brand":"Blackview","name":"Blackview BV5200 Pro","os":"Android 12, Doke-OS 3.0","year":2022,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bv7100","brand":"Blackview","name":"Blackview BV7100","os":"Android 12, Doke-OS 3.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bv7200","brand":"Blackview","name":"Blackview BV7200","os":"Android 12, Doke-OS 3.0","year":2022,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bv9200","brand":"Blackview","name":"Blackview BV9200","os":"Android 12, Doke-OS 3.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_12","brand":"Blackview","name":"Blackview Tab 12","os":"Android 11","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_13","brand":"Blackview","name":"Blackview Tab 13","os":"Android 12, Doke OS_P 3.0","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_15","brand":"Blackview","name":"Blackview Tab 15","os":"Android 12, Doke OS_P 3.0","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":216,"inches":10.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_7","brand":"Blackview","name":"Blackview Tab 7","os":"Android 11","year":2022,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cat_cat_s53","brand":"Cat","name":"Cat S53","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_j20","brand":"Cubot","name":"Cubot J20","os":"Android 12 (Go edition)","year":2022,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":245,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_kingkong_5","brand":"Cubot","name":"Cubot KingKong 5","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":286,"inches":6.01,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_kingkong_6","brand":"Cubot","name":"Cubot KingKong 6","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_kingkong_7","brand":"Cubot","name":"Cubot KingKong 7","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2300,"ppi":400,"inches":6.36,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_kingkong_mini_2_pro","brand":"Cubot","name":"Cubot KingKong Mini 2 Pro","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":540,"h":1080,"ppi":302,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_kingkong_mini_3","brand":"Cubot","name":"Cubot KingKong Mini 3","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":480,"h":1170,"ppi":281,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_note_30","brand":"Cubot","name":"Cubot Note 30","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_note_8","brand":"Cubot","name":"Cubot Note 8","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":442,"h":960,"ppi":192,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_p50","brand":"Cubot","name":"Cubot P50","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_p60","brand":"Cubot","name":"Cubot P60","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_pocket","brand":"Cubot","name":"Cubot Pocket","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":540,"h":1080,"ppi":302,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_pocket_3","brand":"Cubot","name":"Cubot Pocket 3","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":480,"h":1170,"ppi":281,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_tab_30","brand":"Cubot","name":"Cubot Tab 30","os":"Android 11","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s51","brand":"Doogee","name":"Doogee S51","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":268,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s61","brand":"Doogee","name":"Doogee S61","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":268,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s61_pro","brand":"Doogee","name":"Doogee S61 Pro","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":268,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s89","brand":"Doogee","name":"Doogee S89","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s89_pro","brand":"Doogee","name":"Doogee S89 Pro","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s96_gt","brand":"Doogee","name":"Doogee S96 GT","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s98","brand":"Doogee","name":"Doogee S98","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s98_pro","brand":"Doogee","name":"Doogee S98 Pro","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s99","brand":"Doogee","name":"Doogee S99","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_t10","brand":"Doogee","name":"Doogee T10","os":"Android 12","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_t20","brand":"Doogee","name":"Doogee T20","os":"Android 12","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":224,"inches":10.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_v11","brand":"Doogee","name":"Doogee V11","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":269,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_v30","brand":"Doogee","name":"Doogee V30","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_x97","brand":"Doogee","name":"Doogee X97","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":268,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_x97_pro","brand":"Doogee","name":"Doogee X97 Pro","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":268,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_x98","brand":"Doogee","name":"Doogee X98","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_x98_pro","brand":"Doogee","name":"Doogee X98 Pro","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_ultimate_u505s","brand":"Energizer","name":"Energizer Ultimate U505s","os":"Android 11 (Go edition)","year":2022,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_ultimate_u608s","brand":"Energizer","name":"Energizer Ultimate U608s","os":"Android 12 (Go edition)","year":2022,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":277,"inches":6.08,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_6a","brand":"Google","name":"Google Pixel 6a","os":"Android 12, upgradable to Android 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":429,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_7","brand":"Google","name":"Google Pixel 7","os":"Android 13, upgradable to Android 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":416,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_7_pro","brand":"Google","name":"Google Pixel 7 Pro","os":"Android 13, upgradable to Android 14","year":2022,"form":"Phone","tablet":false,"w":1440,"h":3120,"ppi":512,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_60_se","brand":"Honor","name":"Honor 60 SE","os":"Android 11, Magic UI 5.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_70","brand":"Honor","name":"Honor 70","os":"Android 12, Magic UI 6.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_70_pro","brand":"Honor","name":"Honor 70 Pro","os":"Android 12, Magic UI 6.1","year":2022,"form":"Phone","tablet":false,"w":1200,"h":2652,"ppi":429,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_70_pro+","brand":"Honor","name":"Honor 70 Pro+","os":"Android 12, Magic UI 6.1","year":2022,"form":"Phone","tablet":false,"w":1200,"h":2652,"ppi":429,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_80","brand":"Honor","name":"Honor 80","os":"Android 12, MagicOS 7","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":444,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_80_gt","brand":"Honor","name":"Honor 80 GT","os":"Android 12, MagicOS 7","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_80_pro","brand":"Honor","name":"Honor 80 Pro","os":"Android 12, MagicOS 7","year":2022,"form":"Phone","tablet":false,"w":1224,"h":2700,"ppi":437,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_80_se","brand":"Honor","name":"Honor 80 SE","os":"Android 12, MagicOS 7","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":444,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic_v","brand":"Honor","name":"Honor Magic V","os":"Android 12, Magic UI 6","year":2022,"form":"Foldable","tablet":true,"w":1984,"h":2272,"ppi":381,"inches":7.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic_vs","brand":"Honor","name":"Honor Magic Vs","os":"Android 13, MagicOS 7.1 - International","year":2022,"form":"Foldable","tablet":true,"w":1984,"h":2272,"ppi":382,"inches":7.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic_vs_ultimate","brand":"Honor","name":"Honor Magic Vs Ultimate","os":"Android 12, MagicOS 7","year":2022,"form":"Foldable","tablet":true,"w":1984,"h":2272,"ppi":382,"inches":7.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic4","brand":"Honor","name":"Honor Magic4","os":"Android 12, Magic UI 6","year":2022,"form":"Phone","tablet":false,"w":1224,"h":2664,"ppi":431,"inches":6.81,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic4_lite","brand":"Honor","name":"Honor Magic4 Lite","os":"Android 11, Magic UI 4.2","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":385,"inches":6.81,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic4_pro","brand":"Honor","name":"Honor Magic4 Pro","os":"Android 12, Magic UI 6","year":2022,"form":"Phone","tablet":false,"w":1312,"h":2848,"ppi":460,"inches":6.81,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic4_ultimate","brand":"Honor","name":"Honor Magic4 Ultimate","os":"Android 12, Magic UI 6","year":2022,"form":"Phone","tablet":false,"w":1312,"h":2848,"ppi":460,"inches":6.81,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_pad_8","brand":"Honor","name":"Honor Pad 8","os":"Android 12, Magic UI 6.1","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":194,"inches":12.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_pad_v8_pro","brand":"Honor","name":"Honor Pad V8 Pro","os":"Android 12, MagicOS 7","year":2022,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":249,"inches":12.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_pad_x8","brand":"Honor","name":"Honor Pad X8","os":"Android 10, Magic UI 4","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_pad_x8_lite","brand":"Honor","name":"Honor Pad X8 Lite","os":"Android 12, Magic UI 6.1","year":2022,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":156,"inches":9.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play_30","brand":"Honor","name":"Honor Play 30","os":"Android 11, Magic UI 5.0","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play_40_plus","brand":"Honor","name":"Honor Play 40 Plus","os":"Android 12, Magic UI 6.1","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play6c","brand":"Honor","name":"Honor Play6C","os":"Android 11, Magic UI 5","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play6t","brand":"Honor","name":"Honor Play6T","os":"Android 11, Magic UI 5.0","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play6t_pro","brand":"Honor","name":"Honor Play6T Pro","os":"Android 11, Magic UI 5.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":391,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x40","brand":"Honor","name":"Honor X40","os":"Android 12, Magic UI 6.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x40_gt","brand":"Honor","name":"Honor X40 GT","os":"Android 12, Magic UI 6.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":385,"inches":6.81,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x40i","brand":"Honor","name":"Honor X40i","os":"Android 12, Magic UI 6.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":391,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x6","brand":"Honor","name":"Honor X6","os":"Android 12, Magic UI 6.1","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x7","brand":"Honor","name":"Honor X7","os":"Android 11, Magic UI 4.2","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x8","brand":"Honor","name":"Honor X8","os":"Android 11, Magic UI 4.2","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":391,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x8_5g","brand":"Honor","name":"Honor X8 5G","os":"Android 11, Magic UI 4.2","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x9","brand":"Honor","name":"Honor X9","os":"Android 11, Magic UI 4.2","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":385,"inches":6.81,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x9_5g","brand":"Honor","name":"Honor X9 5G","os":"Android 11, Magic UI 4.2","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":385,"inches":6.81,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_a101","brand":"Htc","name":"HTC A101","os":"Android 11","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_22_pro","brand":"Htc","name":"HTC Desire 22 Pro","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_wildfire_e_plus","brand":"Htc","name":"HTC Wildfire E plus","os":"Android 12 (Go edition)","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_enjoy_50z","brand":"Huawei","name":"Huawei Enjoy 50z","os":"HarmonyOS 2.0","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_50","brand":"Huawei","name":"Huawei Mate 50","os":"EMUI 13 (International); HarmonyOS 3.0 (China)","year":2022,"form":"Phone","tablet":false,"w":1224,"h":2700,"ppi":442,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_50_pro","brand":"Huawei","name":"Huawei Mate 50 Pro","os":"EMUI 13 (International); HarmonyOS 3.0 (China)","year":2022,"form":"Phone","tablet":false,"w":1212,"h":2616,"ppi":428,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_50_rs_porsche_design","brand":"Huawei","name":"Huawei Mate 50 RS Porsche Design","os":"HarmonyOS 3.0","year":2022,"form":"Phone","tablet":false,"w":1212,"h":2616,"ppi":428,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_50e","brand":"Huawei","name":"Huawei Mate 50E","os":"HarmonyOS 3.0","year":2022,"form":"Phone","tablet":false,"w":1224,"h":2700,"ppi":442,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_xs_2","brand":"Huawei","name":"Huawei Mate Xs 2","os":"EMUI 12, no Google Play Services (International); HarmonyOS ","year":2022,"form":"Foldable","tablet":true,"w":2200,"h":2480,"ppi":424,"inches":7.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_10.4_2022","brand":"Huawei","name":"Huawei MatePad 10.4 (2022)","os":"Android 10, EMUI 10.1, no Google Play Services","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":224,"inches":10.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_c5e","brand":"Huawei","name":"Huawei MatePad C5e","os":"Android 10, EMUI 10.1","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_pro_11_2022","brand":"Huawei","name":"Huawei MatePad Pro 11 (2022)","os":"HarmonyOS 3.0","year":2022,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":274,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_se","brand":"Huawei","name":"Huawei MatePad SE","os":"HarmonyOS 2.0","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_10","brand":"Huawei","name":"Huawei nova 10","os":"HarmonyOS 2.0 (China), EMUI 12 (Europe), no Google Play Serv","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_10_pro","brand":"Huawei","name":"Huawei nova 10 Pro","os":"HarmonyOS 2.0","year":2022,"form":"Phone","tablet":false,"w":1200,"h":2652,"ppi":429,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_10_se","brand":"Huawei","name":"Huawei nova 10 SE","os":"EMUI 12, no Google Play Services","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_10z","brand":"Huawei","name":"Huawei nova 10z","os":"HarmonyOS 2.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":399,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_9_se","brand":"Huawei","name":"Huawei nova 9 SE","os":"Android 11, EMUI 12, no Google Play Services","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":387,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_9_se_5g","brand":"Huawei","name":"Huawei nova 9 SE 5G","os":"Android 11, EMUI 12, no Google Play Services","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":387,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_y61","brand":"Huawei","name":"Huawei nova Y61","os":"EMUI 12, no Google Play Services","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_y70_plus","brand":"Huawei","name":"Huawei nova Y70 Plus","os":"EMUI 12, no Google Play Services","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_y90","brand":"Huawei","name":"Huawei nova Y90","os":"EMUI 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":391,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p50e","brand":"Huawei","name":"Huawei P50E","os":"HarmonyOS 2.0","year":2022,"form":"Phone","tablet":false,"w":1224,"h":2700,"ppi":456,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_pocket_s","brand":"Huawei","name":"Huawei Pocket S","os":"HarmonyOS 3.0","year":2022,"form":"Foldable","tablet":false,"w":1188,"h":2790,"ppi":442,"inches":6.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_11_2022","brand":"Infinix","name":"Infinix Hot 11 2022","os":"Android 11, XOS 7.6","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_11s_nfc","brand":"Infinix","name":"Infinix Hot 11s NFC","os":"Android 11, XOS 7.6","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_12","brand":"Infinix","name":"Infinix Hot 12","os":"Android 12, XOS 10.6","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":259,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_12_play","brand":"Infinix","name":"Infinix Hot 12 Play","os":"Android 11, XOS 10","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":259,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_12_play_nfc","brand":"Infinix","name":"Infinix Hot 12 Play NFC","os":"Android 11, XOS 10","year":2022,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_12_pro","brand":"Infinix","name":"Infinix Hot 12 Pro","os":"Android 12, XOS 10.6","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_12i","brand":"Infinix","name":"Infinix Hot 12i","os":"Android 11, XOS 7.6","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_20","brand":"Infinix","name":"Infinix Hot 20","os":"Android 12, XOS 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_20_5g","brand":"Infinix","name":"Infinix Hot 20 5G","os":"Android 12, XOS 10.6","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_20_play","brand":"Infinix","name":"Infinix Hot 20 Play","os":"Android 12, XOS 10.6","year":2022,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_20i","brand":"Infinix","name":"Infinix Hot 20i","os":"Android 12 or Android 12 (Go edition), XOS 10.6","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_20s","brand":"Infinix","name":"Infinix Hot 20S","os":"Android 12, XOS 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_12","brand":"Infinix","name":"Infinix Note 12","os":"Android 11, XOS 10.6","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_12_2023","brand":"Infinix","name":"Infinix Note 12 (2023)","os":"Android 12, XOS 10.6","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_12_5g","brand":"Infinix","name":"Infinix Note 12 5G","os":"Android 12, XOS 10.6","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_12_g96","brand":"Infinix","name":"Infinix Note 12 G96","os":"Android 12, XOS 10.6","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_12_pro","brand":"Infinix","name":"Infinix Note 12 Pro","os":"Android 12, XOS 10.6","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_12_pro_5g","brand":"Infinix","name":"Infinix Note 12 Pro 5G","os":"Android 12, XOS 10.6","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_12_vip","brand":"Infinix","name":"Infinix Note 12 VIP","os":"Android 12, XOS 10.5","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_12i","brand":"Infinix","name":"Infinix Note 12i","os":"Android 12, XOS 10.6","year":2022,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_12i_2022","brand":"Infinix","name":"Infinix Note 12i 2022","os":"Android 12, XOS 10.6","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart_6_hd","brand":"Infinix","name":"Infinix Smart 6 HD","os":"Android 11 (Go edition), XOS 7.6","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart_6_plus_india","brand":"Infinix","name":"Infinix Smart 6 Plus (India)","os":"Android 12 (Go edition)","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":257,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_zero_20","brand":"Infinix","name":"Infinix Zero 20","os":"Android 12, XOS 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_zero_5g","brand":"Infinix","name":"Infinix Zero 5G","os":"Android 11, upgradable to Android 12, XOS 10.6","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_zero_5g_2023","brand":"Infinix","name":"Infinix Zero 5G 2023","os":"Android 12, upgradable to Android 13, XOS 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_zero_ultra","brand":"Infinix","name":"Infinix Zero Ultra","os":"Android 12, XOS 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":387,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_a27","brand":"Itel","name":"itel A27","os":"Android 11 (Go edition)","year":2022,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":197,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_a49","brand":"Itel","name":"itel A49","os":"Android 11 (Go edition)","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_a60","brand":"Itel","name":"itel A60","os":"Android 11 or 12 (Go edition)","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_p38","brand":"Itel","name":"itel P38","os":"Android 11 (Go edition)","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_p38_pro","brand":"Itel","name":"itel P38 Pro","os":"Android 11 (Go edition)","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":260,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_s18","brand":"Itel","name":"itel S18","os":"Android 11 (Go edition)","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_vision_3","brand":"Itel","name":"itel Vision 3","os":"Android 11 (Go edition)","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_vision_3_turbo","brand":"Itel","name":"itel Vision 3 Turbo","os":"Android 11 (Go edition)","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k14_plus","brand":"Lenovo","name":"Lenovo K14 Plus","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_legion_y70","brand":"Lenovo","name":"Lenovo Legion Y70","os":"Android 12, ZUI 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_legion_y700","brand":"Lenovo","name":"Lenovo Legion Y700","os":"Android 12, ZUI 13","year":2022,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":343,"inches":8.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_legion_y90","brand":"Lenovo","name":"Lenovo Legion Y90","os":"Android 12, ZUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":388,"inches":6.92,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_pad_pro_2022","brand":"Lenovo","name":"Lenovo Pad Pro 2022","os":"Android 12, ZUI 14","year":2022,"form":"Tablet","tablet":true,"w":1536,"h":2560,"ppi":267,"inches":11.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_m10_gen_3","brand":"Lenovo","name":"Lenovo Tab M10 Gen 3","os":"Android 11, upgradable to Android 12","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_m10_plus_3rd_gen","brand":"Lenovo","name":"Lenovo Tab M10 Plus (3rd Gen)","os":"Android 12","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":220,"inches":10.61,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_m9","brand":"Lenovo","name":"Lenovo Tab M9","os":"Android 12","year":2022,"form":"Tablet","tablet":true,"w":800,"h":1340,"ppi":173,"inches":9.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_p11_gen_2","brand":"Lenovo","name":"Lenovo Tab P11 Gen 2","os":"Android 12L","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":203,"inches":11.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_p11_pro_gen_2","brand":"Lenovo","name":"Lenovo Tab P11 Pro Gen 2","os":"Android 12, upgradable to Android 13","year":2022,"form":"Tablet","tablet":true,"w":1536,"h":2560,"ppi":267,"inches":11.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_ultra_tab","brand":"Lg","name":"LG Ultra Tab","os":"Android 12","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":225,"inches":10.35,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_in_2c","brand":"Micromax","name":"Micromax In 2c","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_in_note_2","brand":"Micromax","name":"Micromax In note 2","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_2022","brand":"Motorola","name":"Motorola Edge (2022)","os":"Android 12, up to Android 13, planned upgrade to Android 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":399,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_30","brand":"Motorola","name":"Motorola Edge 30","os":"Android 12, up to Android 13, planned upgrade to Android 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_30_fusion","brand":"Motorola","name":"Motorola Edge 30 Fusion","os":"Android 12, up to Android 13, planned upgrade to Android 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_30_neo","brand":"Motorola","name":"Motorola Edge 30 Neo","os":"Android 12, up to Android 15","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":419,"inches":6.28,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_30_pro","brand":"Motorola","name":"Motorola Edge 30 Pro","os":"Android 12, up to Android 13, planned upgrade to Android 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_30_ultra","brand":"Motorola","name":"Motorola Edge 30 Ultra","os":"Android 12, up to Android 13, planned upgrade to Android 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge+_5g_uw_2022","brand":"Motorola","name":"Motorola Edge+ 5G UW (2022)","os":"Android 12, up to Android 13, planned upgrade to Android 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e22","brand":"Motorola","name":"Motorola Moto E22","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e22i","brand":"Motorola","name":"Motorola Moto E22i","os":"Android 12 (Go edition)","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e22s","brand":"Motorola","name":"Motorola Moto E22s","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e32","brand":"Motorola","name":"Motorola Moto E32","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":268,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e32_india","brand":"Motorola","name":"Motorola Moto E32 (India)","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e32s","brand":"Motorola","name":"Motorola Moto E32s","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_2022","brand":"Motorola","name":"Motorola Moto G (2022)","os":"Android 12, planned upgrade to Android 13","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_play_2023","brand":"Motorola","name":"Motorola Moto G Play (2023)","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_stylus_2022","brand":"Motorola","name":"Motorola Moto G Stylus (2022)","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_stylus_5g_2022","brand":"Motorola","name":"Motorola Moto G Stylus 5G (2022)","os":"Android 12, planned upgrade to Android 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g22","brand":"Motorola","name":"Motorola Moto G22","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":268,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g32","brand":"Motorola","name":"Motorola Moto G32","os":"Android 12, upgradable to Android 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g42","brand":"Motorola","name":"Motorola Moto G42","os":"Android 12, planned upgrade to Android 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g52","brand":"Motorola","name":"Motorola Moto G52","os":"Android 12, planned upgrade to Android 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g53","brand":"Motorola","name":"Motorola Moto G53","os":"Android 13, planned upgrade to Android 14","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g62_india","brand":"Motorola","name":"Motorola Moto G62 (India)","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g62_5g","brand":"Motorola","name":"Motorola Moto G62 5G","os":"Android 12, upgradable to Android 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g71s","brand":"Motorola","name":"Motorola Moto G71s","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2440,"ppi":404,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g72","brand":"Motorola","name":"Motorola Moto G72","os":"Android 12, planned upgrade to Android 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g82","brand":"Motorola","name":"Motorola Moto G82","os":"Android 12, upgradable to Android 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_s30_pro","brand":"Motorola","name":"Motorola Moto S30 Pro","os":"Android 12, MYUI 4.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_tab_g62","brand":"Motorola","name":"Motorola Moto Tab G62","os":"Android 12, upgradable to Android 13","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":220,"inches":10.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_tab_g70","brand":"Motorola","name":"Motorola Moto Tab G70","os":"Android 11","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":212,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_x30_pro","brand":"Motorola","name":"Motorola Moto X30 Pro","os":"Android 12, MYUI 4.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_x40","brand":"Motorola","name":"Motorola Moto X40","os":"Android 13, upgradable to Android 14, MYUI 6.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_razr_2022","brand":"Motorola","name":"Motorola Razr 2022","os":"Android 13, planned upgrade to Android 14","year":2022,"form":"Foldable","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c100","brand":"Nokia","name":"Nokia C100","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c2_2nd_edition","brand":"Nokia","name":"Nokia C2 2nd Edition","os":"Android 11 (Go edition)","year":2022,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":188,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c200","brand":"Nokia","name":"Nokia C200","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.09,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c21","brand":"Nokia","name":"Nokia C21","os":"Android 11 (Go edition)","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c21_plus","brand":"Nokia","name":"Nokia C21 Plus","os":"Android 11 (Go edition)","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c31","brand":"Nokia","name":"Nokia C31","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_g100","brand":"Nokia","name":"Nokia G100","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_g11","brand":"Nokia","name":"Nokia G11","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_g11_plus","brand":"Nokia","name":"Nokia G11 Plus","os":"Android 12, upgradable to Android 13","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_g21","brand":"Nokia","name":"Nokia G21","os":"Android 11, upgradable to Android 13","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_g400","brand":"Nokia","name":"Nokia G400","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_g60","brand":"Nokia","name":"Nokia G60","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_t10","brand":"Nokia","name":"Nokia T10","os":"Android 12, upgradable to Android 13","year":2022,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_t21","brand":"Nokia","name":"Nokia T21","os":"Android 12, upgradable to Android 13","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":224,"inches":10.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_x30","brand":"Nokia","name":"Nokia X30","os":"Android 12, upgradable to Android 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nothing_nothing_phone_1","brand":"Nothing","name":"Nothing Phone (1)","os":"Android 12, up to 3 major Android upgrades, Nothing OS 2.5.5","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_10_pro","brand":"Oneplus","name":"OnePlus 10 Pro","os":"Android 12, upgradable to Android 14, OxygenOS 14 (Internati","year":2022,"form":"Phone","tablet":false,"w":1440,"h":3216,"ppi":525,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_10r","brand":"Oneplus","name":"OnePlus 10R","os":"Android 12, upgradable to Android 13, OxygenOS 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_10r_150w","brand":"Oneplus","name":"OnePlus 10R 150W","os":"Android 12, upgradable to Android 13, OxygenOS 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_10t","brand":"Oneplus","name":"OnePlus 10T","os":"Android 12, OxygenOS 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_ace","brand":"Oneplus","name":"OnePlus Ace","os":"Android 12, ColorOS 12.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_ace_pro","brand":"Oneplus","name":"OnePlus Ace Pro","os":"Android 12, ColorOS 12.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_ace_racing","brand":"Oneplus","name":"OnePlus Ace Racing","os":"Android 12, ColorOS 12.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":401,"inches":6.59,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_nord_2t","brand":"Oneplus","name":"OnePlus Nord 2T","os":"Android 12, upgradable to Android 14, OxygenOS 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_nord_ce_2_5g","brand":"Oneplus","name":"OnePlus Nord CE 2 5G","os":"Android 11, upgradable to Android 13, OxygenOS 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_nord_ce_2_lite_5g","brand":"Oneplus","name":"OnePlus Nord CE 2 Lite 5G","os":"Android 12, upgradable to Android 13, OxygenOS 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":401,"inches":6.59,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_nord_n20_5g","brand":"Oneplus","name":"OnePlus Nord N20 5G","os":"Android 11, OxygenOS 11","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_nord_n20_se","brand":"Oneplus","name":"OnePlus Nord N20 SE","os":"Android 12, OxygenOS 12.1","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_nord_n300","brand":"Oneplus","name":"OnePlus Nord N300","os":"Android 12, OxygenOS","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a1_pro","brand":"Oppo","name":"Oppo A1 Pro","os":"Android 13, ColorOS 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a16e","brand":"Oppo","name":"Oppo A16e","os":"Android 11, ColorOS 11.1","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a17","brand":"Oppo","name":"Oppo A17","os":"Android 12, ColorOS 12.1","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a17k","brand":"Oppo","name":"Oppo A17k","os":"Android 12, ColorOS 12.1","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a36","brand":"Oppo","name":"Oppo A36","os":"Android 11, ColorOS 11.1","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a55s","brand":"Oppo","name":"Oppo A55s","os":"Android 11, ColorOS 11.1","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a57","brand":"Oppo","name":"Oppo A57","os":"Android 12, ColorOS 12.1","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a57_4g","brand":"Oppo","name":"Oppo A57 4G","os":"Android 12, upgradable to Android 14, ColorOS 14","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a57e","brand":"Oppo","name":"Oppo A57e","os":"Android 12, ColorOS 12.1","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a57s","brand":"Oppo","name":"Oppo A57s","os":"Android 12, ColorOS 12.1","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a58_china","brand":"Oppo","name":"Oppo A58 (China)","os":"Android 12, ColorOS 12.1","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a58x","brand":"Oppo","name":"Oppo A58x","os":"Android 12, ColorOS 12.1","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a76","brand":"Oppo","name":"Oppo A76","os":"Android 11, ColorOS 11.1","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a77","brand":"Oppo","name":"Oppo A77","os":"Android 12, upgradable to Android 14, ColorOS 14","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a77_4g","brand":"Oppo","name":"Oppo A77 4G","os":"Android 12, upgradable to Android 14, ColorOS 14","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a77s","brand":"Oppo","name":"Oppo A77s","os":"Android 12, upgradable to Android 14, ColorOS 14","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a96","brand":"Oppo","name":"Oppo A96","os":"Android 11, ColorOS 11.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":401,"inches":6.59,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a96_china","brand":"Oppo","name":"Oppo A96 (China)","os":"Android 11, ColorOS 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a97","brand":"Oppo","name":"Oppo A97","os":"Android 12, ColorOS 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f21_pro","brand":"Oppo","name":"Oppo F21 Pro","os":"Android 12, upgradable to Android 14, ColorOS 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f21_pro_5g","brand":"Oppo","name":"Oppo F21 Pro 5G","os":"Android 12, upgradable to Android 14, ColorOS 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_n2","brand":"Oppo","name":"Oppo Find N2","os":"Android 13, ColorOS 13","year":2022,"form":"Foldable","tablet":true,"w":1792,"h":1920,"ppi":370,"inches":7.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_n2_flip","brand":"Oppo","name":"Oppo Find N2 Flip","os":"Android 13, up to 4 major Android upgrades, ColorOS 14","year":2022,"form":"Foldable","tablet":false,"w":1080,"h":2520,"ppi":403,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_x5","brand":"Oppo","name":"Oppo Find X5","os":"Android 12, upgradable to Android 14, ColorOS 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_x5_lite","brand":"Oppo","name":"Oppo Find X5 Lite","os":"Android 11, ColorOS 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_x5_pro","brand":"Oppo","name":"Oppo Find X5 Pro","os":"Android 12, upgradable to Android 14, ColorOS 14","year":2022,"form":"Phone","tablet":false,"w":1440,"h":3216,"ppi":525,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_k10","brand":"Oppo","name":"Oppo K10","os":"Android 11, ColorOS 11.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":401,"inches":6.59,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_k10_5g","brand":"Oppo","name":"Oppo K10 5G","os":"Android 12, ColorOS 12.1","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_k10_5g_china","brand":"Oppo","name":"Oppo K10 5G (China)","os":"Android 12, ColorOS 12.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":401,"inches":6.59,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_k10_pro","brand":"Oppo","name":"Oppo K10 Pro","os":"Android 12, ColorOS 12.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":397,"inches":6.62,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_k10x","brand":"Oppo","name":"Oppo K10x","os":"Android 12, ColorOS 12.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":401,"inches":6.59,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_pad","brand":"Oppo","name":"Oppo Pad","os":"Android 11, ColorOS 12","year":2022,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":274,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_pad_air","brand":"Oppo","name":"Oppo Pad Air","os":"Android 12, ColorOS 12","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":225,"inches":10.36,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno6_lite","brand":"Oppo","name":"Oppo Reno6 Lite","os":"Android 11, ColorOS 11.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno7","brand":"Oppo","name":"Oppo Reno7","os":"Android 12, upgradable to Android 14, ColorOS 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno7_5g","brand":"Oppo","name":"Oppo Reno7 5G","os":"Android 11, upgradable to Android 13, ColorOS 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno7_lite","brand":"Oppo","name":"Oppo Reno7 Lite","os":"Android 11, ColorOS 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno7_z_5g","brand":"Oppo","name":"Oppo Reno7 Z 5G","os":"Android 12, ColorOS 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno8","brand":"Oppo","name":"Oppo Reno8","os":"Android 12, upgradable to Android 14, ColorOS 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno8_china","brand":"Oppo","name":"Oppo Reno8 (China)","os":"Android 12, upgradable to Android 14, ColorOS 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno8_4g","brand":"Oppo","name":"Oppo Reno8 4G","os":"Android 12, ColorOS 12.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno8_lite","brand":"Oppo","name":"Oppo Reno8 Lite","os":"Android 11, ColorOS 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno8_pro","brand":"Oppo","name":"Oppo Reno8 Pro","os":"Android 12, upgradable to Android 14, ColorOS 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno8_pro_china","brand":"Oppo","name":"Oppo Reno8 Pro (China)","os":"Android 12, upgradable to Android 14, ColorOS 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":397,"inches":6.62,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno8_pro+","brand":"Oppo","name":"Oppo Reno8 Pro+","os":"Android 12, upgradable to Android 14, ColorOS 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno8_z","brand":"Oppo","name":"Oppo Reno8 Z","os":"Android 12, ColorOS 12.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno9","brand":"Oppo","name":"Oppo Reno9","os":"Android 13, ColorOS 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno9_pro","brand":"Oppo","name":"Oppo Reno9 Pro","os":"Android 13, ColorOS 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno9_pro+","brand":"Oppo","name":"Oppo Reno9 Pro+","os":"Android 13, ColorOS 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_watch_3_pro","brand":"Oppo","name":"Oppo Watch 3 Pro","os":"Android Wear OS - International","year":2022,"form":"Phone","tablet":false,"w":378,"h":496,"ppi":327,"inches":1.91,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_c31","brand":"Oukitel","name":"Oukitel C31","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_c31_pro","brand":"Oukitel","name":"Oukitel C31 Pro","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_rt2","brand":"Oukitel","name":"Oukitel RT2","os":"Android 12","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_rt3","brand":"Oukitel","name":"Oukitel RT3","os":"Android 12","year":2022,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp18_pro","brand":"Oukitel","name":"Oukitel WP18 Pro","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":271,"inches":5.93,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp19","brand":"Oukitel","name":"Oukitel WP19","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp20","brand":"Oukitel","name":"Oukitel WP20","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":271,"inches":5.93,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_10","brand":"Realme","name":"Realme 10","os":"Android 12, Realme UI 3.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_10_5g","brand":"Realme","name":"Realme 10 5G","os":"Android 12, Realme UI 3.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_10_pro","brand":"Realme","name":"Realme 10 Pro","os":"Android 13, upgradable to Android 14, Realme UI 5.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":392,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_10_pro+","brand":"Realme","name":"Realme 10 Pro+","os":"Android 13, Realme UI 4.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_10s","brand":"Realme","name":"Realme 10s","os":"Android 12, Realme UI 3.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_9","brand":"Realme","name":"Realme 9","os":"Android 12, Realme UI 3.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_9_5g","brand":"Realme","name":"Realme 9 5G","os":"Android 12, Realme UI 3.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_9_5g_india","brand":"Realme","name":"Realme 9 5G (India)","os":"Android 11, Realme UI 2.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_9_5g_speed","brand":"Realme","name":"Realme 9 5G Speed","os":"Android 11, upgradable to Android 12, Realme UI 3.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_9_pro","brand":"Realme","name":"Realme 9 Pro","os":"Android 12, upgradable to Android 13, Realme UI 4.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_9_pro+","brand":"Realme","name":"Realme 9 Pro+","os":"Android 12, upgradable to Android 13, Realme UI 4.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_9i","brand":"Realme","name":"Realme 9i","os":"Android 11, upgradable to Android 13, Realme UI 4","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_9i_5g","brand":"Realme","name":"Realme 9i 5G","os":"Android 12, upgradable to Android 13, Realme UI 4.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c30","brand":"Realme","name":"Realme C30","os":"Android 11, Realme UI Go","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c30s","brand":"Realme","name":"Realme C30s","os":"Android 12, Realme UI Go","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c31","brand":"Realme","name":"Realme C31","os":"Android 11, Realme UI 2.0","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c33","brand":"Realme","name":"Realme C33","os":"Android 12, Realme UI S","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c35","brand":"Realme","name":"Realme C35","os":"Android 11, Realme UI 2.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt_neo_3","brand":"Realme","name":"Realme GT Neo 3","os":"Android 12, upgradable to Android 13, Realme UI 3.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt_neo_3_150w","brand":"Realme","name":"Realme GT Neo 3 150W","os":"Android 12, upgradable to Android 13, Realme UI 3.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt_neo_3t","brand":"Realme","name":"Realme GT Neo 3T","os":"Android 12, upgradable to Android 13, Realme UI 4.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":398,"inches":6.62,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt2","brand":"Realme","name":"Realme GT2","os":"Android 12, Realme UI 3.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":398,"inches":6.62,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt2_explorer_master","brand":"Realme","name":"Realme GT2 Explorer Master","os":"Android 12, Realme UI 3.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt2_pro","brand":"Realme","name":"Realme GT2 Pro","os":"Android 12, upgradable to Android 13, Realme UI 4.0","year":2022,"form":"Phone","tablet":false,"w":1440,"h":3216,"ppi":526,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_50","brand":"Realme","name":"Realme Narzo 50","os":"Android 11, Realme UI 2.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_50_5g","brand":"Realme","name":"Realme Narzo 50 5G","os":"Android 12, Realme UI 3.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_50_pro","brand":"Realme","name":"Realme Narzo 50 Pro","os":"Android 12, upgradable to Android 13, Realme UI 4.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_50a_prime","brand":"Realme","name":"Realme Narzo 50A Prime","os":"Android 11, Realme UI 2.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_50i_prime","brand":"Realme","name":"Realme Narzo 50i Prime","os":"Android 11, Realme UI Go","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_pad_mini","brand":"Realme","name":"Realme Pad Mini","os":"Android 11","year":2022,"form":"Tablet","tablet":true,"w":800,"h":1340,"ppi":179,"inches":8.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_pad_x","brand":"Realme","name":"Realme Pad X","os":"Android, Realme UI 3.0","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":213,"inches":10.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_q5","brand":"Realme","name":"Realme Q5","os":"Android 12, Realme UI 3.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_q5_pro","brand":"Realme","name":"Realme Q5 Pro","os":"Android 12, Realme UI 3.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":398,"inches":6.62,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_q5i","brand":"Realme","name":"Realme Q5i","os":"Android 12, Realme UI 3.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_v20","brand":"Realme","name":"Realme V20","os":"Android 12, ColorOS 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_v23","brand":"Realme","name":"Realme V23","os":"Android 12, Realme UI 3.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_v23i","brand":"Realme","name":"Realme V23i","os":"Android 12, ColorOS 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":268,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_v25","brand":"Realme","name":"Realme V25","os":"Android 12, Realme UI 3.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a04","brand":"Samsung","name":"Samsung Galaxy A04","os":"Android 12, upgradable to Android 13, One UI Core 5.0","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a04e","brand":"Samsung","name":"Samsung Galaxy A04e","os":"Android 12, One UI Core 4.1","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a04s","brand":"Samsung","name":"Samsung Galaxy A04s","os":"Android 12, upgradable to Android 14, One UI 6.1","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a13","brand":"Samsung","name":"Samsung Galaxy A13","os":"Android 12, upgradable to Android 13, One UI 5.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a13_sm-a137","brand":"Samsung","name":"Samsung Galaxy A13 (SM-A137)","os":"Android 12, upgradable to Android 13, One UI 5.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a23","brand":"Samsung","name":"Samsung Galaxy A23","os":"Android 12, upgradable to Android 14, One UI 6.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a23_5g","brand":"Samsung","name":"Samsung Galaxy A23 5G","os":"Android 12, upgradable to Android 14, One UI 6","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a33_5g","brand":"Samsung","name":"Samsung Galaxy A33 5G","os":"Android 12, up to 4 major Android upgrades, One UI 6.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a53_5g","brand":"Samsung","name":"Samsung Galaxy A53 5G","os":"Android 12, up to 4 major Android upgrades, One UI 6","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a73_5g","brand":"Samsung","name":"Samsung Galaxy A73 5G","os":"Android 12, up to 4 major Android upgrades, One UI 6.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_f13","brand":"Samsung","name":"Samsung Galaxy F13","os":"Android 12, upgradable to Android 13, One UI Core 5","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_f23","brand":"Samsung","name":"Samsung Galaxy F23","os":"Android 12, upgradable to Android 14, One UI 6","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m04","brand":"Samsung","name":"Samsung Galaxy M04","os":"Android 12, One UI Core 4.1","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m13","brand":"Samsung","name":"Samsung Galaxy M13","os":"Android 12, One UI Core 4.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m13_india","brand":"Samsung","name":"Samsung Galaxy M13 (India)","os":"Android 12, One UI Core 4","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m13_5g","brand":"Samsung","name":"Samsung Galaxy M13 5G","os":"Android 12, One UI Core 4","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m23","brand":"Samsung","name":"Samsung Galaxy M23","os":"Android 12, upgradable to Android 13, One UI 5.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m33","brand":"Samsung","name":"Samsung Galaxy M33","os":"Android 12, One UI 4.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m53","brand":"Samsung","name":"Samsung Galaxy M53","os":"Android 12, upgradable to Android 13, One UI 5.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s20_fe_2022","brand":"Samsung","name":"Samsung Galaxy S20 FE 2022","os":"Android 12, One UI 4.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s21_fe_5g","brand":"Samsung","name":"Samsung Galaxy S21 FE 5G","os":"Android 12, up to 4 major Android upgrades, One UI 6.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s22_5g","brand":"Samsung","name":"Samsung Galaxy S22 5G","os":"Android 12, up to 4 major Android upgrades, One UI 6.1.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":425,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s22_ultra_5g","brand":"Samsung","name":"Samsung Galaxy S22 Ultra 5G","os":"Android 12, up to 4 major Android upgrades, One UI 6.1.1","year":2022,"form":"Phone","tablet":false,"w":1440,"h":3088,"ppi":500,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s22+_5g","brand":"Samsung","name":"Samsung Galaxy S22+ 5G","os":"Android 12, up to 4 major Android upgrades, One UI 6.1.1","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":393,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_a7_10.4_2022","brand":"Samsung","name":"Samsung Galaxy Tab A7 10.4 (2022)","os":"Android 12, One UI 4","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":224,"inches":10.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_active4_pro","brand":"Samsung","name":"Samsung Galaxy Tab Active4 Pro","os":"Android 12, upgradable to Android 13","year":2022,"form":"Tablet","tablet":true,"w":1920,"h":1200,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s6_lite_2022","brand":"Samsung","name":"Samsung Galaxy Tab S6 Lite (2022)","os":"Android 12, upgradable to Android 14, One UI 6","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":224,"inches":10.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s8","brand":"Samsung","name":"Samsung Galaxy Tab S8","os":"Android 12, up to 4 major Android upgrades, One UI 6.1.1","year":2022,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":274,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s8_ultra","brand":"Samsung","name":"Samsung Galaxy Tab S8 Ultra","os":"Android 12, up to 4 major Android upgrades, One UI 6.1.1","year":2022,"form":"Tablet","tablet":true,"w":1848,"h":2960,"ppi":240,"inches":14.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s8+","brand":"Samsung","name":"Samsung Galaxy Tab S8+","os":"Android 12, up to 4 major Android upgrades, One UI 6.1.1","year":2022,"form":"Tablet","tablet":true,"w":1752,"h":2800,"ppi":266,"inches":12.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_xcover6_pro","brand":"Samsung","name":"Samsung Galaxy XCover6 Pro","os":"Android 12, upgradable to Android 14, One UI 6","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_z_flip4","brand":"Samsung","name":"Samsung Galaxy Z Flip4","os":"Android 12, upgradable to Android 14, One UI 6.1.1","year":2022,"form":"Foldable","tablet":false,"w":1080,"h":2640,"ppi":426,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_z_fold4","brand":"Samsung","name":"Samsung Galaxy Z Fold4","os":"Android 12L, up to 4 major Android upgrades, One UI 6.1.1","year":2022,"form":"Foldable","tablet":true,"w":1812,"h":2176,"ppi":373,"inches":7.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_v6","brand":"Sharp","name":"Sharp Aquos V6","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_v6_plus","brand":"Sharp","name":"Sharp Aquos V6 Plus","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_wish","brand":"Sharp","name":"Sharp Aquos wish","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":295,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_1_iv","brand":"Sony","name":"Sony Xperia 1 IV","os":"Android 12, upgradable to Android 13","year":2022,"form":"Phone","tablet":false,"w":1644,"h":3840,"ppi":643,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_10_iv","brand":"Sony","name":"Sony Xperia 10 IV","os":"Android 12, upgradable to Android 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2520,"ppi":457,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_5_iv","brand":"Sony","name":"Sony Xperia 5 IV","os":"Android 12, upgradable to Android 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2520,"ppi":449,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_30","brand":"Tcl","name":"TCL 30","os":"Android 12, TCL UI 4.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_30_5g","brand":"Tcl","name":"TCL 30 5G","os":"Android 12, TCL UI 4.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_30_le","brand":"Tcl","name":"TCL 30 LE","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_30_se","brand":"Tcl","name":"TCL 30 SE","os":"Android 12, TCL UI 4.0","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_30_v_5g","brand":"Tcl","name":"TCL 30 V 5G","os":"Android 11, TCL UI","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_30_xe_5g","brand":"Tcl","name":"TCL 30 XE 5G","os":"Android 11, TCL UI","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_30_xl","brand":"Tcl","name":"TCL 30 XL","os":"Android 12, TCL UI 3.0","year":2022,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_30+","brand":"Tcl","name":"TCL 30+","os":"Android 12, TCL UI 4.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_305","brand":"Tcl","name":"TCL 305","os":"Android 11 (Go edition), TCL UI","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_306","brand":"Tcl","name":"TCL 306","os":"Android 12, TCL UI","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_30e","brand":"Tcl","name":"TCL 30E","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_405","brand":"Tcl","name":"TCL 405","os":"Android 12 (Go edition), TCL UI","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_40r","brand":"Tcl","name":"TCL 40R","os":"Android 12, TCL UI 4.0","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_nxtpaper_10s","brand":"Tcl","name":"TCL NxtPaper 10s","os":"Android 11","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_stylus","brand":"Tcl","name":"TCL Stylus","os":"Android 12, TCL UI 4.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.81,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_tab_10_hd_4g","brand":"Tcl","name":"TCL Tab 10 HD 4G","os":"Android 11","year":2022,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_tab_10l","brand":"Tcl","name":"TCL Tab 10L","os":"Android 11","year":2022,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_tab_10s_5g","brand":"Tcl","name":"TCL Tab 10s 5G","os":"Android 12","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_tab_8_4g","brand":"Tcl","name":"TCL Tab 8 4G","os":"Android 11","year":2022,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_camon_19","brand":"Tecno","name":"Tecno Camon 19","os":"Android 12, HIOS 8.6","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_19_neo","brand":"Tecno","name":"Tecno Camon 19 Neo","os":"Android 12, HIOS 8.6","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_19_pro","brand":"Tecno","name":"Tecno Camon 19 Pro","os":"Android 12, HIOS 8.6","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_phantom_x2","brand":"Tecno","name":"Tecno Phantom X2","os":"Android 12, HIOS 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":387,"inches":6.8,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_phantom_x2_pro","brand":"Tecno","name":"Tecno Phantom X2 Pro","os":"Android 12, HIOS 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":387,"inches":6.8,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pop_5_pro","brand":"Tecno","name":"Tecno Pop 5 Pro","os":"Android 11 (Go edition), HiOS 7.6","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pop_5s","brand":"Tecno","name":"Tecno Pop 5S","os":"Android 10 (Go edition), HiOS","year":2022,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":295,"inches":5.7,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pop_5x","brand":"Tecno","name":"Tecno Pop 5X","os":"Android 10 (Go edition), HiOS","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pop_6","brand":"Tecno","name":"Tecno Pop 6","os":"Android 11 (Go edition), HiOS","year":2022,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pop_6_go","brand":"Tecno","name":"Tecno Pop 6 Go","os":"Android 11 (Go edition), HiOS","year":2022,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":179,"inches":6.0,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pop_6_pro","brand":"Tecno","name":"Tecno Pop 6 Pro","os":"Android 12 (Go edition), HiOS 8.6","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":269,"inches":6.56,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pova_3","brand":"Tecno","name":"Tecno Pova 3","os":"Android 11, HIOS","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":389,"inches":6.9,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pova_4","brand":"Tecno","name":"Tecno Pova 4","os":"Android 12, HIOS 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":257,"inches":6.82,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pova_4_pro","brand":"Tecno","name":"Tecno Pova 4 Pro","os":"Android 12, HIOS","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":403,"inches":6.66,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pova_neo_2","brand":"Tecno","name":"Tecno Pova Neo 2","os":"Android 12, HIOS 8.6","year":2022,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.82,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pova_neo_5g","brand":"Tecno","name":"Tecno Pova Neo 5G","os":"Android 12, HIOS 8.6","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_8c","brand":"Tecno","name":"Tecno Spark 8C","os":"Android 11 (Go edition), HiOS 7.6","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":267,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_9","brand":"Tecno","name":"Tecno Spark 9","os":"Android 12, HIOS 8.6","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_9_pro","brand":"Tecno","name":"Tecno Spark 9 Pro","os":"Android 12, HIOS 8.6","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":403,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_9t","brand":"Tecno","name":"Tecno Spark 9T","os":"Android 12, HIOS 8.6","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_9t_india","brand":"Tecno","name":"Tecno Spark 9T (India)","os":"Android 11, HIOS 7.6","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"ulefone__ulefone_armor_15","brand":"Ulefone_","name":"Ulefone Armor 15","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_17_pro","brand":"Ulefone_","name":"Ulefone Armor 17 Pro","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_x10_pro","brand":"Ulefone_","name":"Ulefone Armor X10 Pro","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_x6_pro","brand":"Ulefone_","name":"Ulefone Armor X6 Pro","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_note_10p","brand":"Ulefone_","name":"Ulefone Note 10P","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_note_12","brand":"Ulefone_","name":"Ulefone Note 12","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_note_14","brand":"Ulefone_","name":"Ulefone Note 14","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_note_6t","brand":"Ulefone_","name":"Ulefone Note 6T","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_power_armor_14_pro","brand":"Ulefone_","name":"Ulefone Power Armor 14 Pro","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_power_armor_16_pro","brand":"Ulefone_","name":"Ulefone Power Armor 16 Pro","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":271,"inches":5.93,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_power_armor_18","brand":"Ulefone_","name":"Ulefone Power Armor 18","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_power_armor_18t","brand":"Ulefone_","name":"Ulefone Power Armor 18T","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_power_armor_19","brand":"Ulefone_","name":"Ulefone Power Armor 19","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_power_armor_x11_pro","brand":"Ulefone_","name":"Ulefone Power Armor X11 Pro","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_a13","brand":"Umidigi","name":"Umidigi A13","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1650,"ppi":269,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_a13_pro","brand":"Umidigi","name":"Umidigi A13 Pro","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1650,"ppi":269,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_a13_pro_5g","brand":"Umidigi","name":"Umidigi A13 Pro 5G","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_a13_pro_max","brand":"Umidigi","name":"Umidigi A13 Pro Max","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_a13s","brand":"Umidigi","name":"Umidigi A13S","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1650,"ppi":269,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_bison_2","brand":"Umidigi","name":"Umidigi Bison 2","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_bison_2_pro","brand":"Umidigi","name":"Umidigi Bison 2 Pro","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_bison_gt2","brand":"Umidigi","name":"Umidigi Bison GT2","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_bison_gt2_5g","brand":"Umidigi","name":"Umidigi Bison GT2 5G","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_bison_gt2_pro","brand":"Umidigi","name":"Umidigi Bison GT2 Pro","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_bison_gt2_pro_5g","brand":"Umidigi","name":"Umidigi Bison GT2 Pro 5G","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_c1","brand":"Umidigi","name":"Umidigi C1","os":"Android 13","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_c1_max","brand":"Umidigi","name":"Umidigi C1 Max","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_f3","brand":"Umidigi","name":"Umidigi F3","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1650,"ppi":269,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_f3_5g","brand":"Umidigi","name":"Umidigi F3 5G","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1650,"ppi":269,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_f3_se","brand":"Umidigi","name":"Umidigi F3 SE","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1650,"ppi":269,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_f3s","brand":"Umidigi","name":"Umidigi F3S","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1650,"ppi":269,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g1","brand":"Umidigi","name":"Umidigi G1","os":"Android 13","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g1_max","brand":"Umidigi","name":"Umidigi G1 Max","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_power_7","brand":"Umidigi","name":"Umidigi Power 7","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1650,"ppi":269,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_power_7_max","brand":"Umidigi","name":"Umidigi Power 7 Max","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1650,"ppi":269,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_power_7s","brand":"Umidigi","name":"Umidigi Power 7S","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1650,"ppi":269,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_10","brand":"Vivo","name":"vivo iQOO 10","os":"Android 12, OriginOS Ocean","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_10_pro","brand":"Vivo","name":"vivo iQOO 10 Pro","os":"Android 12, Funtouch 12 (International), OriginOS Ocean (Chi","year":2022,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":518,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_11","brand":"Vivo","name":"vivo iQOO 11","os":"Android 13, upgradable to Android 14, Funtouch 14 (Internati","year":2022,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":518,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_11_pro","brand":"Vivo","name":"vivo iQOO 11 Pro","os":"Android 13, Funtouch 13 (International), OriginOS 3 (China)","year":2022,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":518,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_9","brand":"Vivo","name":"vivo iQOO 9","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":398,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_9_china","brand":"Vivo","name":"vivo iQOO 9 (China)","os":"Android 12, OriginOS Ocean","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_9_pro","brand":"Vivo","name":"vivo iQOO 9 Pro","os":"Android 12, Funtouch 12 (International), OriginOS Ocean (Chi","year":2022,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":518,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_9_se","brand":"Vivo","name":"vivo iQOO 9 SE","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":398,"inches":6.62,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_9t","brand":"Vivo","name":"vivo iQOO 9T","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo_6","brand":"Vivo","name":"vivo iQOO Neo 6","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":398,"inches":6.62,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo6_china","brand":"Vivo","name":"vivo iQOO Neo6 (China)","os":"Android 12, OriginOS Ocean","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":398,"inches":6.62,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo6_se","brand":"Vivo","name":"vivo iQOO Neo6 SE","os":"Android 12, OriginOS Ocean","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":398,"inches":6.62,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo7_china","brand":"Vivo","name":"vivo iQOO Neo7 (China)","os":"Android 13, OriginOS Ocean","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo7_racing","brand":"Vivo","name":"vivo iQOO Neo7 Racing","os":"Android 13, OriginOS 3","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo7_se","brand":"Vivo","name":"vivo iQOO Neo7 SE","os":"Android 13, OriginOS 3","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_u5e","brand":"Vivo","name":"vivo iQOO U5e","os":"Android 12, OriginOS Ocean","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_u5x","brand":"Vivo","name":"vivo iQOO U5x","os":"Android 11, OriginOS Ocean","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z6","brand":"Vivo","name":"vivo iQOO Z6","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z6_china","brand":"Vivo","name":"vivo iQOO Z6 (China)","os":"Android 12, OriginOS Ocean","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":396,"inches":6.64,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z6_44w","brand":"Vivo","name":"vivo iQOO Z6 44W","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z6_lite","brand":"Vivo","name":"vivo iQOO Z6 Lite","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z6_pro","brand":"Vivo","name":"vivo iQOO Z6 Pro","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2404,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z6x","brand":"Vivo","name":"vivo iQOO Z6x","os":"Android 11, OriginOS Ocean","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_pad","brand":"Vivo","name":"vivo Pad","os":"Android 12, OriginOS HD","year":2022,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":274,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s15","brand":"Vivo","name":"vivo S15","os":"Android 12, OriginOS Ocean","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":398,"inches":6.62,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s15_pro","brand":"Vivo","name":"vivo S15 Pro","os":"Android 12, OriginOS Ocean","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":398,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s15e","brand":"Vivo","name":"vivo S15e","os":"Android 11, OriginOS Ocean","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2404,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s16","brand":"Vivo","name":"vivo S16","os":"Android 13, OriginOS 3","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s16_pro","brand":"Vivo","name":"vivo S16 Pro","os":"Android 13, OriginOS 3","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s16e","brand":"Vivo","name":"vivo S16e","os":"Android 11, OriginOS Ocean","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":398,"inches":6.62,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_t1_snapdragon_680","brand":"Vivo","name":"vivo T1 (Snapdragon 680)","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_t1_snapdragon_778g","brand":"Vivo","name":"vivo T1 (Snapdragon 778G)","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2404,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_t1_5g","brand":"Vivo","name":"vivo T1 5G","os":"Android 11, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_t1_pro","brand":"Vivo","name":"vivo T1 Pro","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2404,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_t1x_india","brand":"Vivo","name":"vivo T1x (India)","os":"Android, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_t1x_4g","brand":"Vivo","name":"vivo T1x 4G","os":"Android, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_t2_china","brand":"Vivo","name":"vivo T2 (China)","os":"Android 12, OriginOS Ocean","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":398,"inches":6.62,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_t2x","brand":"Vivo","name":"vivo T2x","os":"Android 12, OriginOS 2.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v21s","brand":"Vivo","name":"vivo V21s","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2404,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v23_5g","brand":"Vivo","name":"vivo V23 5G","os":"Android 12, upgradable to Android 14, Funtouch 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v23_pro","brand":"Vivo","name":"vivo V23 Pro","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":398,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v25","brand":"Vivo","name":"vivo V25","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2404,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v25_pro","brand":"Vivo","name":"vivo V25 Pro","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":398,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v25e","brand":"Vivo","name":"vivo V25e","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2404,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x_fold","brand":"Vivo","name":"vivo X Fold","os":"Android 12, OriginOS Ocean","year":2022,"form":"Foldable","tablet":true,"w":1916,"h":2160,"ppi":360,"inches":8.03,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x_fold+","brand":"Vivo","name":"vivo X Fold+","os":"Android 12, OriginOS Ocean","year":2022,"form":"Foldable","tablet":true,"w":1916,"h":2160,"ppi":360,"inches":8.03,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x_note","brand":"Vivo","name":"vivo X Note","os":"Android 12, OriginOS Ocean","year":2022,"form":"Tablet","tablet":true,"w":1440,"h":3080,"ppi":486,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x80","brand":"Vivo","name":"vivo X80","os":"Android 12, upgradable to Android 14, Funtouch 14 (Global), ","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x80_lite","brand":"Vivo","name":"vivo X80 Lite","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2404,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x80_pro","brand":"Vivo","name":"vivo X80 Pro","os":"Android 12, upgradable to Android 14, Funtouch 14 (Global), ","year":2022,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":517,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x80_pro+","brand":"Vivo","name":"vivo X80 Pro+","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":518,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x90","brand":"Vivo","name":"vivo X90","os":"Android 13, Funtouch 13 (Global), OriginOS 3 (China)","year":2022,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":452,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x90_pro","brand":"Vivo","name":"vivo X90 Pro","os":"Android 13, upgradable to Android 14, Funtouch 14 (Global), ","year":2022,"form":"Phone","tablet":false,"w":1260,"h":2800,"ppi":453,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x90_pro+","brand":"Vivo","name":"vivo X90 Pro+","os":"Android 13, Funtouch (Global), OriginOS 3 (China)","year":2022,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":517,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y01","brand":"Vivo","name":"vivo Y01","os":"Android 11 (Go edition), Funtouch 11.1","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y02","brand":"Vivo","name":"vivo Y02","os":"Android 12 (Go edition), Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y02s","brand":"Vivo","name":"vivo Y02s","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y16","brand":"Vivo","name":"vivo Y16","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y21a","brand":"Vivo","name":"vivo Y21a","os":"Android 11, Funtouch 11.1","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y21e","brand":"Vivo","name":"vivo Y21e","os":"Android 11, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y21g","brand":"Vivo","name":"vivo Y21G","os":"Android 11, Funtouch 11.1","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y21t","brand":"Vivo","name":"vivo Y21t","os":"Android 11, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y21t_india","brand":"Vivo","name":"vivo Y21t (India)","os":"Android 11, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y22","brand":"Vivo","name":"vivo Y22","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":270,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y22s","brand":"Vivo","name":"vivo Y22s","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1612,"ppi":270,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y30_5g","brand":"Vivo","name":"vivo Y30 5G","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y33e","brand":"Vivo","name":"vivo Y33e","os":"Android 12, OriginOS Ocean","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y33s_5g","brand":"Vivo","name":"vivo Y33s 5G","os":"Android 12, OriginOS Ocean","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y33t","brand":"Vivo","name":"vivo Y33t","os":"Android 11, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y35","brand":"Vivo","name":"vivo Y35","os":"Android 11, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y35_5g","brand":"Vivo","name":"vivo Y35 5G","os":"Android 13, OriginOS Ocean","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y52t","brand":"Vivo","name":"vivo Y52t","os":"Android 12, OriginOS Ocean","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y55","brand":"Vivo","name":"vivo Y55","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y55_5g","brand":"Vivo","name":"vivo Y55 5G","os":"Android 11, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y72t","brand":"Vivo","name":"vivo Y72t","os":"Android 11, OriginOS 11","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y73t","brand":"Vivo","name":"vivo Y73t","os":"Android 11, OriginOS 11","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y75","brand":"Vivo","name":"vivo Y75","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y75_5g","brand":"Vivo","name":"vivo Y75 5G","os":"Android 11, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y75s","brand":"Vivo","name":"vivo Y75s","os":"Android 11, OriginOS Ocean","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y77","brand":"Vivo","name":"vivo Y77","os":"Android 12, Funtouch 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y77_china","brand":"Vivo","name":"vivo Y77 (China)","os":"Android 12, OriginOS Ocean","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":395,"inches":6.64,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y77e","brand":"Vivo","name":"vivo Y77e","os":"Android 12, OriginOS Ocean","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y77e_t1","brand":"Vivo","name":"vivo Y77e (t1)","os":"Android 12, OriginOS Ocean","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_11i","brand":"Xiaomi","name":"Xiaomi 11i","os":"Android 11, upgradable to Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_11i_hypercharge_5g","brand":"Xiaomi","name":"Xiaomi 11i HyperCharge 5G","os":"Android 11, upgradable to Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_12_pro_dimensity","brand":"Xiaomi","name":"Xiaomi 12 Pro (Dimensity)","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":521,"inches":6.73,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_12s","brand":"Xiaomi","name":"Xiaomi 12S","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":419,"inches":6.28,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_12s_pro","brand":"Xiaomi","name":"Xiaomi 12S Pro","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":521,"inches":6.73,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_12s_ultra","brand":"Xiaomi","name":"Xiaomi 12S Ultra","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":522,"inches":6.73,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_12t","brand":"Xiaomi","name":"Xiaomi 12T","os":"Android 12, upgradable to Android 14, MIUI 14","year":2022,"form":"Phone","tablet":false,"w":1220,"h":2712,"ppi":446,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_12t_pro","brand":"Xiaomi","name":"Xiaomi 12T Pro","os":"Android 12, upgradable to Android 14, HyperOS","year":2022,"form":"Phone","tablet":false,"w":1220,"h":2712,"ppi":446,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_13","brand":"Xiaomi","name":"Xiaomi 13","os":"Android 13, upgradable to Android 14, MIUI 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":414,"inches":6.36,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_13_pro","brand":"Xiaomi","name":"Xiaomi 13 Pro","os":"Android 13, upgradable to Android 14, HyperOS","year":2022,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":522,"inches":6.73,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_black_shark_5","brand":"Xiaomi","name":"Xiaomi Black Shark 5","os":"Android 12, Joy UI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_black_shark_5_pro","brand":"Xiaomi","name":"Xiaomi Black Shark 5 Pro","os":"Android 12, Joy UI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_black_shark_5_rs","brand":"Xiaomi","name":"Xiaomi Black Shark 5 RS","os":"Android 12, Joy UI 12.8","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_civi_1s","brand":"Xiaomi","name":"Xiaomi Civi 1S","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_civi_2","brand":"Xiaomi","name":"Xiaomi Civi 2","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mix_fold_2","brand":"Xiaomi","name":"Xiaomi Mix Fold 2","os":"Android 12, MIUI Fold 13","year":2022,"form":"Foldable","tablet":true,"w":1914,"h":2160,"ppi":360,"inches":8.02,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_pad_5_pro_12.4","brand":"Xiaomi","name":"Xiaomi Pad 5 Pro 12.4","os":"Android 12, MIUI Pad 13","year":2022,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":243,"inches":12.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_c40","brand":"Xiaomi","name":"Xiaomi Poco C40","os":"Android 11, MIUI 13 for POCO","year":2022,"form":"Phone","tablet":false,"w":720,"h":1650,"ppi":268,"inches":6.71,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_f4","brand":"Xiaomi","name":"Xiaomi Poco F4","os":"Android 12, upgradable to Android 13, MIUI 14.2 for POCO","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_f4_gt","brand":"Xiaomi","name":"Xiaomi Poco F4 GT","os":"Android 12, upgradable to Android 13, MIUI 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_m4_5g","brand":"Xiaomi","name":"Xiaomi Poco M4 5G","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_m4_5g_india","brand":"Xiaomi","name":"Xiaomi Poco M4 5G (India)","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_m4_pro","brand":"Xiaomi","name":"Xiaomi Poco M4 Pro","os":"Android 11, MIUI 13 for POCO","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_m5","brand":"Xiaomi","name":"Xiaomi Poco M5","os":"Android 12, upgradable to Android 14, HyperOS","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_m5_india","brand":"Xiaomi","name":"Xiaomi Poco M5 (India)","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":400,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_m5s","brand":"Xiaomi","name":"Xiaomi Poco M5s","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_x4_gt","brand":"Xiaomi","name":"Xiaomi Poco X4 GT","os":"Android 12, MIUI 13 for POCO","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":407,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_x4_pro_5g","brand":"Xiaomi","name":"Xiaomi Poco X4 Pro 5G","os":"Android 11, MIUI 13 for POCO","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_10_india","brand":"Xiaomi","name":"Xiaomi Redmi 10 (India)","os":"Android 11, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":720,"h":1650,"ppi":269,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_10_2022","brand":"Xiaomi","name":"Xiaomi Redmi 10 2022","os":"Android 11, MIUI 12.5","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_10_5g","brand":"Xiaomi","name":"Xiaomi Redmi 10 5G","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_10_power","brand":"Xiaomi","name":"Xiaomi Redmi 10 Power","os":"Android 11, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":720,"h":1650,"ppi":269,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_10_prime_2022","brand":"Xiaomi","name":"Xiaomi Redmi 10 Prime 2022","os":"Android 11, MIUI 12.5","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_10a","brand":"Xiaomi","name":"Xiaomi Redmi 10A","os":"Android 11, MIUI 12.5","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_10c","brand":"Xiaomi","name":"Xiaomi Redmi 10C","os":"Android 11, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":720,"h":1650,"ppi":268,"inches":6.71,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_11_prime","brand":"Xiaomi","name":"Xiaomi Redmi 11 Prime","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_11_prime_5g","brand":"Xiaomi","name":"Xiaomi Redmi 11 Prime 5G","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_12c","brand":"Xiaomi","name":"Xiaomi Redmi 12C","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":720,"h":1650,"ppi":268,"inches":6.71,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_a1","brand":"Xiaomi","name":"Xiaomi Redmi A1","os":"Android 12 (Go edition), MIUI 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_a1+","brand":"Xiaomi","name":"Xiaomi Redmi A1+","os":"Android 12 (Go edition), MIUI 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k40s","brand":"Xiaomi","name":"Xiaomi Redmi K40S","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k50","brand":"Xiaomi","name":"Xiaomi Redmi K50","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":526,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k50_gaming","brand":"Xiaomi","name":"Xiaomi Redmi K50 Gaming","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k50_pro","brand":"Xiaomi","name":"Xiaomi Redmi K50 Pro","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":526,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k50_ultra","brand":"Xiaomi","name":"Xiaomi Redmi K50 Ultra","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1220,"h":2712,"ppi":446,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k50i","brand":"Xiaomi","name":"Xiaomi Redmi K50i","os":"Android 12, upgradable to Android 13, MIUI 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":407,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k60","brand":"Xiaomi","name":"Xiaomi Redmi K60","os":"Android 13, MIUI 14","year":2022,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":526,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k60_pro","brand":"Xiaomi","name":"Xiaomi Redmi K60 Pro","os":"Android 13, MIUI 14","year":2022,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":526,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k60e","brand":"Xiaomi","name":"Xiaomi Redmi K60E","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":526,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_11","brand":"Xiaomi","name":"Xiaomi Redmi Note 11","os":"Android 11, upgradable to Android 13, MIUI 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_11_pro","brand":"Xiaomi","name":"Xiaomi Redmi Note 11 Pro","os":"Android 11, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_11_pro_5g","brand":"Xiaomi","name":"Xiaomi Redmi Note 11 Pro 5G","os":"Android 11, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_11_pro+_5g_india","brand":"Xiaomi","name":"Xiaomi Redmi Note 11 Pro+ 5G (India)","os":"Android 11, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_11_se_india","brand":"Xiaomi","name":"Xiaomi Redmi Note 11 SE (India)","os":"Android 11, MIUI 12.5","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_11e","brand":"Xiaomi","name":"Xiaomi Redmi Note 11E","os":"Android 11, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_11e_pro","brand":"Xiaomi","name":"Xiaomi Redmi Note 11E Pro","os":"Android 11, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_11s","brand":"Xiaomi","name":"Xiaomi Redmi Note 11S","os":"Android 11, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_11s_5g","brand":"Xiaomi","name":"Xiaomi Redmi Note 11S 5G","os":"Android 11, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":399,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_11se","brand":"Xiaomi","name":"Xiaomi Redmi Note 11SE","os":"Android 11, MIUI 12.5","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_11t_pro","brand":"Xiaomi","name":"Xiaomi Redmi Note 11T Pro","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":407,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_11t_pro+","brand":"Xiaomi","name":"Xiaomi Redmi Note 11T Pro+","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":407,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_12","brand":"Xiaomi","name":"Xiaomi Redmi Note 12","os":"Android 12, MIUI 14 (International), MIUI 13 (India)","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_12_china","brand":"Xiaomi","name":"Xiaomi Redmi Note 12 (China)","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_12_discovery","brand":"Xiaomi","name":"Xiaomi Redmi Note 12 Discovery","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_12_pro","brand":"Xiaomi","name":"Xiaomi Redmi Note 12 Pro","os":"Android 12, MIUI 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_12_pro_speed","brand":"Xiaomi","name":"Xiaomi Redmi Note 12 Pro Speed","os":"Android 13, MIUI 14","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_12_pro+","brand":"Xiaomi","name":"Xiaomi Redmi Note 12 Pro+","os":"Android 12, upgradable to Android 14, HyperOS","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_pad","brand":"Xiaomi","name":"Xiaomi Redmi Pad","os":"Android 12, upgradable to Android 13, MIUI 14","year":2022,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":220,"inches":10.61,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_watch_s1_pro","brand":"Xiaomi","name":"Xiaomi Watch S1 Pro","os":"MIUI Watch OS","year":2022,"form":"Phone","tablet":false,"w":480,"h":480,"ppi":462,"inches":1.47,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_30s","brand":"Zte","name":"ZTE Axon 30S","os":"Android 12, MyOS 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":400,"inches":6.92,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_40_pro","brand":"Zte","name":"ZTE Axon 40 Pro","os":"Android 12, MyOS 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_40_se","brand":"Zte","name":"ZTE Axon 40 SE","os":"Android 12, MyOS 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_40_ultra","brand":"Zte","name":"ZTE Axon 40 Ultra","os":"Android 12, upgradable to Android 13, MyOS 13","year":2022,"form":"Phone","tablet":false,"w":1116,"h":2480,"ppi":400,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_40_ultra_space_edition","brand":"Zte","name":"ZTE Axon 40 Ultra Space Edition","os":"Android 12, MyOS 12","year":2022,"form":"Phone","tablet":false,"w":1116,"h":2480,"ppi":400,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a3_plus","brand":"Zte","name":"ZTE Blade A3 Plus","os":"Android 11 (Go edition)","year":2022,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":215,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a52","brand":"Zte","name":"ZTE Blade A52","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a52_lite","brand":"Zte","name":"ZTE Blade A52 Lite","os":"Android 11 (Go edition)","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a72","brand":"Zte","name":"ZTE Blade A72","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":390,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a72_5g","brand":"Zte","name":"ZTE Blade A72 5G","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a72s","brand":"Zte","name":"ZTE Blade A72s","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v40","brand":"Zte","name":"ZTE Blade V40","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v40_design","brand":"Zte","name":"ZTE Blade V40 Design","os":"Android 12, MyOS 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v40_pro","brand":"Zte","name":"ZTE Blade V40 Pro","os":"Android 11","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v40_vita","brand":"Zte","name":"ZTE Blade V40 Vita","os":"Android 12","year":2022,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.75,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v40s","brand":"Zte","name":"ZTE Blade V40s","os":"Android 12, MyOS 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v41_vita","brand":"Zte","name":"ZTE Blade V41 Vita","os":"Android 12, MyOS 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_7","brand":"Zte","name":"ZTE nubia Red Magic 7","os":"Android 12, Redmagic 5.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":387,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_7_pro","brand":"Zte","name":"ZTE nubia Red Magic 7 Pro","os":"Android 12, Redmagic 5.0","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":387,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_7s","brand":"Zte","name":"ZTE nubia Red Magic 7S","os":"Android 12, Redmagic 5.5","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":387,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_7s_pro","brand":"Zte","name":"ZTE nubia Red Magic 7S Pro","os":"Android 12, Redmagic 5.5","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":387,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_8_pro","brand":"Zte","name":"ZTE nubia Red Magic 8 Pro","os":"Android 13, Redmagic OS 6","year":2022,"form":"Phone","tablet":false,"w":1116,"h":2480,"ppi":400,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_8_pro+","brand":"Zte","name":"ZTE nubia Red Magic 8 Pro+","os":"Android 13, Redmagic OS 6","year":2022,"form":"Phone","tablet":false,"w":1116,"h":2480,"ppi":400,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z40_pro","brand":"Zte","name":"ZTE nubia Z40 Pro","os":"Android 12, MyOS 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z40s_pro","brand":"Zte","name":"ZTE nubia Z40S Pro","os":"Android 12, MyOS 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z50","brand":"Zte","name":"ZTE nubia Z50","os":"Android 13, MyOS 13","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_voyage_40_pro+","brand":"Zte","name":"ZTE Voyage 40 Pro+","os":"Android 12, MyOS 12","year":2022,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_1_2021","brand":"Alcatel","name":"alcatel 1 (2021)","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":215,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_1l_2021","brand":"Alcatel","name":"alcatel 1L (2021)","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_1l_pro_2021","brand":"Alcatel","name":"alcatel 1L Pro (2021)","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_1s_2021","brand":"Alcatel","name":"alcatel 1S (2021)","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_1v_2021","brand":"Alcatel","name":"alcatel 1V (2021)","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_3l_2021","brand":"Alcatel","name":"alcatel 3L (2021)","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"apple_apple_ipad_10.2_2021","brand":"Apple","name":"Apple iPad 10.2 (2021)","os":"iPadOS 15, upgradable to iPadOS 18","year":2021,"form":"Tablet","tablet":true,"w":1620,"h":2160,"ppi":265,"inches":10.2,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_ipad_mini_2021","brand":"Apple","name":"Apple iPad mini (2021)","os":"iPadOS 15, upgradable to iPadOS 18","year":2021,"form":"Tablet","tablet":true,"w":1488,"h":2266,"ppi":327,"inches":8.3,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_ipad_pro_11_2021","brand":"Apple","name":"Apple iPad Pro 11 (2021)","os":"iPadOS 14.5.1, upgradable to iPadOS 18","year":2021,"form":"Tablet","tablet":true,"w":1668,"h":2388,"ppi":265,"inches":11.0,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_ipad_pro_12.9_2021","brand":"Apple","name":"Apple iPad Pro 12.9 (2021)","os":"iPadOS 14.5.1, upgradable to iPadOS 18","year":2021,"form":"Tablet","tablet":true,"w":2048,"h":2732,"ppi":265,"inches":12.9,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_iphone_13","brand":"Apple","name":"Apple iPhone 13","os":"iOS 15, upgradable to iOS 18","year":2021,"form":"Phone","tablet":false,"w":1170,"h":2532,"ppi":460,"inches":6.1,"platform":"ios","hasNotch":true,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":47,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_13_mini","brand":"Apple","name":"Apple iPhone 13 mini","os":"iOS 15, upgradable to iOS 18","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":476,"inches":5.4,"platform":"ios","hasNotch":true,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":47,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_13_pro","brand":"Apple","name":"Apple iPhone 13 Pro","os":"iOS 15, upgradable to iOS 18","year":2021,"form":"Phone","tablet":false,"w":1170,"h":2532,"ppi":460,"inches":6.1,"platform":"ios","hasNotch":true,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":47,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_13_pro_max","brand":"Apple","name":"Apple iPhone 13 Pro Max","os":"iOS 15, upgradable to iOS 18","year":2021,"form":"Phone","tablet":false,"w":1284,"h":2778,"ppi":458,"inches":6.7,"platform":"ios","hasNotch":true,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":47,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"asus_asus_rog_phone_5","brand":"Asus","name":"Asus ROG Phone 5","os":"Android 11, upgradable to Android 12, ROG UI","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2448,"ppi":395,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_rog_phone_5_pro","brand":"Asus","name":"Asus ROG Phone 5 Pro","os":"Android 11, ROG UI","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2448,"ppi":395,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_rog_phone_5_ultimate","brand":"Asus","name":"Asus ROG Phone 5 Ultimate","os":"Android 11, ROG UI","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2448,"ppi":395,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_rog_phone_5s","brand":"Asus","name":"Asus ROG Phone 5s","os":"Android 11, upgradable to Android 12, ROG UI","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2448,"ppi":395,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_rog_phone_5s_pro","brand":"Asus","name":"Asus ROG Phone 5s Pro","os":"Android 11, ROG UI","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2448,"ppi":395,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_smartphone_for_snapdragon_insiders","brand":"Asus","name":"Asus Smartphone for Snapdragon Insiders","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_8","brand":"Asus","name":"Asus Zenfone 8","os":"Android 11, upgradable to Android 13","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":446,"inches":5.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_8_flip","brand":"Asus","name":"Asus Zenfone 8 Flip","os":"Android 11, upgradable to Android 13","year":2021,"form":"Foldable","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_a100","brand":"Blackview","name":"Blackview A100","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_a55","brand":"Blackview","name":"Blackview A55","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_a70","brand":"Blackview","name":"Blackview A70","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_a70_pro","brand":"Blackview","name":"Blackview A70 Pro","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_a80s","brand":"Blackview","name":"Blackview A80s","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_a90","brand":"Blackview","name":"Blackview A90","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":269,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bl5000","brand":"Blackview","name":"Blackview BL5000","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2300,"ppi":400,"inches":6.36,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bv4900s","brand":"Blackview","name":"Blackview BV4900s","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bv6600","brand":"Blackview","name":"Blackview BV6600","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bv6600_pro","brand":"Blackview","name":"Blackview BV6600 Pro","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bv6600e","brand":"Blackview","name":"Blackview BV6600E","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bv8800","brand":"Blackview","name":"Blackview BV8800","os":"Android 11, Doke-OS 3.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_10","brand":"Blackview","name":"Blackview Tab 10","os":"Android 11","year":2021,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_10_pro","brand":"Blackview","name":"Blackview Tab 10 Pro","os":"Android 11","year":2021,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_11","brand":"Blackview","name":"Blackview Tab 11","os":"Android 11","year":2021,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":225,"inches":10.36,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_6","brand":"Blackview","name":"Blackview Tab 6","os":"Android 11","year":2021,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_8e","brand":"Blackview","name":"Blackview Tab 8E","os":"Android 10","year":2021,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_9","brand":"Blackview","name":"Blackview Tab 9","os":"Android 10","year":2021,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cat_cat_s22_flip","brand":"Cat","name":"Cat S22 Flip","os":"Android 11 (Go edition)","year":2021,"form":"Foldable","tablet":false,"w":480,"h":640,"ppi":286,"inches":2.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cat_cat_s42_h+","brand":"Cat","name":"Cat S42 H+","os":"Android 10, planned upgrade to Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cat_cat_s62","brand":"Cat","name":"Cat S62","os":"Android 10, upgradable to Android 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":424,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_j10","brand":"Cubot","name":"Cubot J10","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":245,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_kingkong_5_pro","brand":"Cubot","name":"Cubot KingKong 5 Pro","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":286,"inches":6.01,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_max_3","brand":"Cubot","name":"Cubot Max 3","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":258,"inches":6.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_tab_10","brand":"Cubot","name":"Cubot Tab 10","os":"Android 11","year":2021,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_x50","brand":"Cubot","name":"Cubot X50","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_n40_pro","brand":"Doogee","name":"Doogee N40 Pro","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s35","brand":"Doogee","name":"Doogee S35","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s35t","brand":"Doogee","name":"Doogee S35T","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s59_pro","brand":"Doogee","name":"Doogee S59 Pro","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":295,"inches":5.71,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s86","brand":"Doogee","name":"Doogee S86","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s86_pro","brand":"Doogee","name":"Doogee S86 Pro","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s88_plus","brand":"Doogee","name":"Doogee S88 Plus","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s97_pro","brand":"Doogee","name":"Doogee S97 Pro","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":269,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_v10","brand":"Doogee","name":"Doogee V10","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":269,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_x93","brand":"Doogee","name":"Doogee X93","os":"Android 10 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":600,"h":1280,"ppi":232,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_x95_pro","brand":"Doogee","name":"Doogee X95 Pro","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":540,"h":1200,"ppi":202,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_x96","brand":"Doogee","name":"Doogee X96","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_x96_pro","brand":"Doogee","name":"Doogee X96 Pro","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_hard_case_g5","brand":"Energizer","name":"Energizer Hard Case G5","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_hardcase_h621s","brand":"Energizer","name":"Energizer Hardcase H621S","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_u680s","brand":"Energizer","name":"Energizer U680S","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_5a_5g","brand":"Google","name":"Google Pixel 5a 5G","os":"Android 11, upgradable to Android 14","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":415,"inches":6.34,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_6","brand":"Google","name":"Google Pixel 6","os":"Android 12, upgradable to Android 14","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_6_pro","brand":"Google","name":"Google Pixel 6 Pro","os":"Android 12, upgradable to Android 14","year":2021,"form":"Phone","tablet":false,"w":1440,"h":3120,"ppi":512,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_50","brand":"Honor","name":"Honor 50","os":"Android 11, Magic UI 4.2","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":392,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_50_lite","brand":"Honor","name":"Honor 50 Lite","os":"Android 11, Magic UI 4.2","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":391,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_50_pro","brand":"Honor","name":"Honor 50 Pro","os":"Android 11, Magic UI 4.2, Google Play Services","year":2021,"form":"Phone","tablet":false,"w":1236,"h":2676,"ppi":439,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_50_se","brand":"Honor","name":"Honor 50 SE","os":"Android 11, Magic UI 4.2","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":387,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_60","brand":"Honor","name":"Honor 60","os":"Android 11, Magic UI 5.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_60_pro","brand":"Honor","name":"Honor 60 Pro","os":"Android 11, Magic UI 5.0","year":2021,"form":"Phone","tablet":false,"w":1200,"h":2652,"ppi":429,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic3","brand":"Honor","name":"Honor Magic3","os":"Android 11, Magic UI 5","year":2021,"form":"Phone","tablet":false,"w":1344,"h":2772,"ppi":456,"inches":6.76,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic3_pro","brand":"Honor","name":"Honor Magic3 Pro","os":"Android 11, Magic UI 5","year":2021,"form":"Phone","tablet":false,"w":1344,"h":2772,"ppi":456,"inches":6.76,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic3_pro+","brand":"Honor","name":"Honor Magic3 Pro+","os":"Android 11, Magic UI 5","year":2021,"form":"Phone","tablet":false,"w":1344,"h":2772,"ppi":456,"inches":6.76,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play_20","brand":"Honor","name":"Honor Play 20","os":"Android 10, Magic UI 4.0, no Google Play Services","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play_30_plus","brand":"Honor","name":"Honor Play 30 Plus","os":"Android 11, Magic UI 5.0","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":260,"inches":6.74,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play_5t_pro","brand":"Honor","name":"Honor Play 5T Pro","os":"Android 11, Magic UI 4.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":399,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play_5t_youth","brand":"Honor","name":"Honor Play 5T Youth","os":"Android 10, Magic UI 4.0, no Google Play Services","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play5_5g","brand":"Honor","name":"Honor Play5 5G","os":"Android 10, Magic UI 4.0, no Google Play Services","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":403,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play5_youth","brand":"Honor","name":"Honor Play5 Youth","os":"Android 11, Magic UI 4.2","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":391,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_tab_7","brand":"Honor","name":"Honor Tab 7","os":"Android 10, Magic UI 4.1, no Google Play Services","year":2021,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_tablet_v7","brand":"Honor","name":"Honor Tablet V7","os":"Android 11, Magic UI 5.0","year":2021,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":224,"inches":10.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_tablet_v7_pro","brand":"Honor","name":"Honor Tablet V7 Pro","os":"Android 11, Magic UI 5.0","year":2021,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":274,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_tablet_x7","brand":"Honor","name":"Honor Tablet X7","os":"Android 10, Magic UI 4.0, no Google Play Services","year":2021,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_v40_5g","brand":"Honor","name":"Honor V40 5G","os":"Android 10, Magic UI 4.0, no Google Play Services","year":2021,"form":"Phone","tablet":false,"w":1236,"h":2676,"ppi":440,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_v40_lite","brand":"Honor","name":"Honor V40 Lite","os":"Android 10, Magic UI 4.0, no Google Play Services","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":392,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_view40","brand":"Honor","name":"Honor View40","os":"Android 10, with Google Play Services (unconfirmed)","year":2021,"form":"Phone","tablet":false,"w":1236,"h":2676,"ppi":439,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x20","brand":"Honor","name":"Honor X20","os":"Android 11, Magic UI 4.2","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":391,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x20_se","brand":"Honor","name":"Honor X20 SE","os":"Android 11, Magic UI 4.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":399,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x30","brand":"Honor","name":"Honor X30","os":"Android 11, Magic UI 5.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":385,"inches":6.81,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x30_max","brand":"Honor","name":"Honor X30 Max","os":"Android 11, Magic UI 5.0","year":2021,"form":"Tablet","tablet":true,"w":1080,"h":2280,"ppi":356,"inches":7.09,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x30i","brand":"Honor","name":"Honor X30i","os":"Android 11, Magic UI 5.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2388,"ppi":391,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_21_pro_5g","brand":"Htc","name":"HTC Desire 21 Pro 5G","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_wildfire_e2_plus","brand":"Htc","name":"HTC Wildfire E2 Plus","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_wildfire_e3","brand":"Htc","name":"HTC Wildfire E3","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":264,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_enjoy_20e","brand":"Huawei","name":"Huawei Enjoy 20e","os":"HarmonyOS 2.0 (China), EMUI 10.1 (International), no Google ","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":278,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_40_pro_4g","brand":"Huawei","name":"Huawei Mate 40 Pro 4G","os":"HarmonyOS 2.0","year":2021,"form":"Phone","tablet":false,"w":1344,"h":2772,"ppi":456,"inches":6.76,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_40e","brand":"Huawei","name":"Huawei Mate 40E","os":"Android 10, EMUI 11, no Google Play Services","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":402,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_40e_4g","brand":"Huawei","name":"Huawei Mate 40E 4G","os":"HarmonyOS 2.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":402,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_x2","brand":"Huawei","name":"Huawei Mate X2","os":"Android 10, EMUI 11, no Google Play Services","year":2021,"form":"Foldable","tablet":true,"w":2200,"h":2480,"ppi":413,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_x2_4g","brand":"Huawei","name":"Huawei Mate X2 4G","os":"HarmonyOS 2.0","year":2021,"form":"Foldable","tablet":true,"w":2200,"h":2480,"ppi":414,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_11_2021","brand":"Huawei","name":"Huawei MatePad 11 (2021)","os":"HarmonyOS 2.0, upgradable to 3.0","year":2021,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":276,"inches":10.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_pro_10.8_2021","brand":"Huawei","name":"Huawei MatePad Pro 10.8 (2021)","os":"HarmonyOS 2.0","year":2021,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":280,"inches":10.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_pro_12.6_2021","brand":"Huawei","name":"Huawei MatePad Pro 12.6 (2021)","os":"HarmonyOS 2.0","year":2021,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":240,"inches":12.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_t_10","brand":"Huawei","name":"Huawei MatePad T 10","os":"Android 10, EMUI 10.1, no Google Play Services","year":2021,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":156,"inches":9.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_8","brand":"Huawei","name":"Huawei nova 8","os":"Android 11, EMUI 12, no Google Play Services","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":392,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_8_pro_4g","brand":"Huawei","name":"Huawei nova 8 Pro 4G","os":"Android 10, EMUI 11, no Google Play Services","year":2021,"form":"Phone","tablet":false,"w":1236,"h":2676,"ppi":439,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_8_se_4g","brand":"Huawei","name":"Huawei nova 8 SE 4G","os":"HarmonyOS 2.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_8_se_youth","brand":"Huawei","name":"Huawei nova 8 SE Youth","os":"Android 10, EMUI 10.1, no Google Play Services","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":399,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_8i","brand":"Huawei","name":"Huawei nova 8i","os":"Android 10, EMUI 11, no Google Play Services","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":391,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_9","brand":"Huawei","name":"Huawei nova 9","os":"HarmonyOS 2.0 (China), EMUI 12 (Europe), no Google Play Serv","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":392,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_9_pro","brand":"Huawei","name":"Huawei nova 9 Pro","os":"HarmonyOS 2.0","year":2021,"form":"Phone","tablet":false,"w":1236,"h":2676,"ppi":439,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_y60","brand":"Huawei","name":"Huawei nova Y60","os":"Android 10, EMUI 11, no Google Play Services","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p40_4g","brand":"Huawei","name":"Huawei P40 4G","os":"Android 10, EMUI, no Google Play Services","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":422,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p50","brand":"Huawei","name":"Huawei P50","os":"HarmonyOS 2.0","year":2021,"form":"Phone","tablet":false,"w":1224,"h":2700,"ppi":458,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p50_pocket","brand":"Huawei","name":"Huawei P50 Pocket","os":"HarmonyOS 2.0 (China), EMUI 12 (Europe), no Google Play Serv","year":2021,"form":"Foldable","tablet":false,"w":1188,"h":2790,"ppi":442,"inches":6.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p50_pro","brand":"Huawei","name":"Huawei P50 Pro","os":"HarmonyOS 2.0 (China), EMUI 14.2 (Europe), no Google Play Se","year":2021,"form":"Phone","tablet":false,"w":1228,"h":2700,"ppi":450,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_10_play","brand":"Infinix","name":"Infinix Hot 10 Play","os":"Android 10 (Go edition), XOS 7","year":2021,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_10i","brand":"Infinix","name":"Infinix Hot 10i","os":"Android 11, XOS 7.5","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_10s","brand":"Infinix","name":"Infinix Hot 10s","os":"Android 11, XOS 7.6","year":2021,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_10s_nfc","brand":"Infinix","name":"Infinix Hot 10s NFC","os":"Android 11, XOS 7.6","year":2021,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_10t","brand":"Infinix","name":"Infinix Hot 10T","os":"Android 11, XOS 7.6","year":2021,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_11","brand":"Infinix","name":"Infinix Hot 11","os":"Android 11, XOS 7.6","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_11_play","brand":"Infinix","name":"Infinix Hot 11 Play","os":"Android 11, XOS 7.6","year":2021,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_11s","brand":"Infinix","name":"Infinix Hot 11s","os":"Android 11, XOS 7.6","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2480,"ppi":399,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_10","brand":"Infinix","name":"Infinix Note 10","os":"Android 11, XOS 7.6","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":387,"inches":6.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_10_pro","brand":"Infinix","name":"Infinix Note 10 Pro","os":"Android 11, XOS 7.6","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":387,"inches":6.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_10_pro_nfc","brand":"Infinix","name":"Infinix Note 10 Pro NFC","os":"Android 11, XOS 7.6","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":387,"inches":6.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_11","brand":"Infinix","name":"Infinix Note 11","os":"Android 11, XOS 10","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_11_pro","brand":"Infinix","name":"Infinix Note 11 Pro","os":"Android 11, XOS 10","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":387,"inches":6.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_11i","brand":"Infinix","name":"Infinix Note 11i","os":"Android 11, XOS 7.6","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":387,"inches":6.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_11s","brand":"Infinix","name":"Infinix Note 11s","os":"Android 11, XOS 10","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":387,"inches":6.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart_5_india","brand":"Infinix","name":"Infinix Smart 5 (India)","os":"Android 10 (Go edition), XOS 7","year":2021,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart_5_pro","brand":"Infinix","name":"Infinix Smart 5 Pro","os":"Android 11 (Go edition), XOS 7.6","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart_6","brand":"Infinix","name":"Infinix Smart 6","os":"Android 11 (Go edition), XOS 7.6","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_zero_x","brand":"Infinix","name":"Infinix Zero X","os":"Android 11, XOS 7.6","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_zero_x_neo","brand":"Infinix","name":"Infinix Zero X Neo","os":"Android 11, XOS 7.6","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":396,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_zero_x_pro","brand":"Infinix","name":"Infinix Zero X Pro","os":"Android 11, XOS 10","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_a23_pro","brand":"Itel","name":"itel A23 Pro","os":"Android 10 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_a48","brand":"Itel","name":"itel A48","os":"Android 10 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":288,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_vision_2","brand":"Itel","name":"itel Vision 2","os":"Android 10 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_vision_2s","brand":"Itel","name":"itel Vision 2S","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k13","brand":"Lenovo","name":"Lenovo K13","os":"Android 10 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k13_note","brand":"Lenovo","name":"Lenovo K13 Note","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k13_pro","brand":"Lenovo","name":"Lenovo K13 Pro","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_legion_2_pro","brand":"Lenovo","name":"Lenovo Legion 2 Pro","os":"Android 11, Legion OS","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":388,"inches":6.92,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_legion_duel_2","brand":"Lenovo","name":"Lenovo Legion Duel 2","os":"Android 11, ZUI 12.5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":388,"inches":6.92,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_pad","brand":"Lenovo","name":"Lenovo Pad","os":"Android 11, ZUI 12.5","year":2021,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":212,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_pad_plus","brand":"Lenovo","name":"Lenovo Pad Plus","os":"Android 11, ZUI 12.5","year":2021,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":212,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_pad_pro","brand":"Lenovo","name":"Lenovo Pad Pro","os":"Android 11, ZUI 12.5","year":2021,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":263,"inches":11.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_k10","brand":"Lenovo","name":"Lenovo Tab K10","os":"Android 11","year":2021,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":220,"inches":10.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_m7_3rd_gen","brand":"Lenovo","name":"Lenovo Tab M7 (3rd Gen)","os":"Android 11 (Go edition)","year":2021,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_m8_3rd_gen","brand":"Lenovo","name":"Lenovo Tab M8 (3rd Gen)","os":"Android 11 (Go edition) - 2 GB RAM version","year":2021,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_p11","brand":"Lenovo","name":"Lenovo Tab P11","os":"Android 10","year":2021,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":212,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_p11_5g","brand":"Lenovo","name":"Lenovo Tab P11 5G","os":"Android 11","year":2021,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":212,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_p11_plus","brand":"Lenovo","name":"Lenovo Tab P11 Plus","os":"Android 11","year":2021,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":212,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_p12_pro","brand":"Lenovo","name":"Lenovo Tab P12 Pro","os":"Android 11","year":2021,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":240,"inches":12.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_yoga_tab_11","brand":"Lenovo","name":"Lenovo Yoga Tab 11","os":"Android 11","year":2021,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":212,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_yoga_tab_13","brand":"Lenovo","name":"Lenovo Yoga Tab 13","os":"Android 11, ZUI 12.5","year":2021,"form":"Tablet","tablet":true,"w":1350,"h":2160,"ppi":196,"inches":13.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_w41","brand":"Lg","name":"LG W41","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":900,"h":1600,"ppi":280,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_w41_pro","brand":"Lg","name":"LG W41 Pro","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":900,"h":1600,"ppi":280,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_w41+","brand":"Lg","name":"LG W41+","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":900,"h":1600,"ppi":280,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_18","brand":"Meizu","name":"Meizu 18","os":"Android 11, Flyme 9","year":2021,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":563,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_18_pro","brand":"Meizu","name":"Meizu 18 Pro","os":"Android 11, Flyme 9","year":2021,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":526,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_18s","brand":"Meizu","name":"Meizu 18s","os":"Android 11, Flyme 9.2","year":2021,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":563,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_18s_pro","brand":"Meizu","name":"Meizu 18s Pro","os":"Android 11, Flyme 9.2","year":2021,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":526,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_18x","brand":"Meizu","name":"Meizu 18x","os":"Android 11, Flyme 9.2","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_in_1","brand":"Micromax","name":"Micromax In 1","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_in_2b","brand":"Micromax","name":"Micromax In 2b","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_surface_duo_2","brand":"Microsoft","name":"Microsoft Surface Duo 2","os":"Android 11","year":2021,"form":"Tablet","tablet":true,"w":1892,"h":2688,"ppi":401,"inches":8.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_defy_2021","brand":"Motorola","name":"Motorola Defy (2021)","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_2021","brand":"Motorola","name":"Motorola Edge (2021)","os":"Android 11, planned upgrade to Android 13","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_20","brand":"Motorola","name":"Motorola Edge 20","os":"Android 11, upgradable to Android 12, planned upgrade to And","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":385,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_20_fusion","brand":"Motorola","name":"Motorola Edge 20 Fusion","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_20_lite","brand":"Motorola","name":"Motorola Edge 20 Lite","os":"Android 11, planned upgrade to Android 13","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":385,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_20_pro","brand":"Motorola","name":"Motorola Edge 20 Pro","os":"Android 11, planned upgrade to Android 13","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":385,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_5g_uw_2021","brand":"Motorola","name":"Motorola Edge 5G UW (2021)","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_s","brand":"Motorola","name":"Motorola Edge S","os":"Android 11, upgradable to Android 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2520,"ppi":409,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_s30","brand":"Motorola","name":"Motorola Edge S30","os":"Android 11, MYUI 2.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge_x30","brand":"Motorola","name":"Motorola Edge X30","os":"Android 12, MYUI 3.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_g_pure","brand":"Motorola","name":"Motorola G Pure","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e20","brand":"Motorola","name":"Motorola Moto E20","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e30","brand":"Motorola","name":"Motorola Moto E30","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e40","brand":"Motorola","name":"Motorola Moto E40","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e6i","brand":"Motorola","name":"Motorola Moto E6i","os":"Android 10 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e7_power","brand":"Motorola","name":"Motorola Moto E7 Power","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e7i_power","brand":"Motorola","name":"Motorola Moto E7i Power","os":"Android 10 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_play_2021","brand":"Motorola","name":"Motorola Moto G Play (2021)","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_power_2021","brand":"Motorola","name":"Motorola Moto G Power (2021)","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_power_2022","brand":"Motorola","name":"Motorola Moto G Power (2022)","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_stylus_2021","brand":"Motorola","name":"Motorola Moto G Stylus (2021)","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":386,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_stylus_5g","brand":"Motorola","name":"Motorola Moto G Stylus 5G","os":"Android 11, upgradable to Android 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":387,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g10_power","brand":"Motorola","name":"Motorola Moto G10 Power","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g100","brand":"Motorola","name":"Motorola Moto G100","os":"Android 11, upgradable to Android 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2520,"ppi":409,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g20","brand":"Motorola","name":"Motorola Moto G20","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g200_5g","brand":"Motorola","name":"Motorola Moto G200 5G","os":"Android 11, upgradable to Android 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g30","brand":"Motorola","name":"Motorola Moto G30","os":"Android 11, upgradable to Android 12","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g31","brand":"Motorola","name":"Motorola Moto G31","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g40_fusion","brand":"Motorola","name":"Motorola Moto G40 Fusion","os":"Android 11, upgradable to Android 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g41","brand":"Motorola","name":"Motorola Moto G41","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g50","brand":"Motorola","name":"Motorola Moto G50","os":"Android 11, upgradable to Android 12","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g50_5g","brand":"Motorola","name":"Motorola Moto G50 5G","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g51_5g","brand":"Motorola","name":"Motorola Moto G51 5G","os":"Android 11, upgradable to Android 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":387,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g60","brand":"Motorola","name":"Motorola Moto G60","os":"Android 11, upgradable to Android 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g60s","brand":"Motorola","name":"Motorola Moto G60S","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g71_5g","brand":"Motorola","name":"Motorola Moto G71 5G","os":"Android 11, upgradable to Android 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_one_5g_ace","brand":"Motorola","name":"Motorola One 5G Ace","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_one_5g_uw_ace","brand":"Motorola","name":"Motorola one 5G UW ace","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_tab_g20","brand":"Motorola","name":"Motorola Tab G20","os":"Android 11","year":2021,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_1.4","brand":"Nokia","name":"Nokia 1.4","os":"Android 10 (Go edition), planned upgrade to Android 11 (Go e","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c01_plus","brand":"Nokia","name":"Nokia C01 Plus","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c1_2nd_edition","brand":"Nokia","name":"Nokia C1 2nd Edition","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c20","brand":"Nokia","name":"Nokia C20","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c20_plus","brand":"Nokia","name":"Nokia C20 Plus","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c30","brand":"Nokia","name":"Nokia C30","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":257,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_g","brand":"Nokia","name":"Nokia G","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":269,"inches":6.38,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_g10","brand":"Nokia","name":"Nokia G10","os":"Android 11, upgradable to Android 13","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_g20","brand":"Nokia","name":"Nokia G20","os":"Android 11, upgradable to Android 13","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_g300","brand":"Nokia","name":"Nokia G300","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_g50","brand":"Nokia","name":"Nokia G50","os":"Android 11, upgradable to Android 12, planned upgrade to And","year":2021,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":252,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_t20","brand":"Nokia","name":"Nokia T20","os":"Android 11, upgradable to Android 13","year":2021,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":224,"inches":10.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_x10","brand":"Nokia","name":"Nokia X10","os":"Android 11, upgradable to Android 14","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_x100","brand":"Nokia","name":"Nokia X100","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_x20","brand":"Nokia","name":"Nokia X20","os":"Android 11, upgradable to Android 14","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_xr20","brand":"Nokia","name":"Nokia XR20","os":"Android 11, upgradable to Android 13","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_9","brand":"Oneplus","name":"OnePlus 9","os":"Android 11, upgradable to Android 13, OxygenOS 13","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_9_pro","brand":"Oneplus","name":"OnePlus 9 Pro","os":"Android 11, upgradable to Android 14, OxygenOS 14","year":2021,"form":"Phone","tablet":false,"w":1440,"h":3216,"ppi":525,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_9r","brand":"Oneplus","name":"OnePlus 9R","os":"Android 10, upgradable to Android 13, OxygenOS 13","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_9rt_5g","brand":"Oneplus","name":"OnePlus 9RT 5G","os":"Android 11, upgradable to Android 13, OxygenOS 13","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":397,"inches":6.62,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_nord_2_5g","brand":"Oneplus","name":"OnePlus Nord 2 5G","os":"Android 11, upgradable to Android 13, OxygenOS 13","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_nord_ce_5g","brand":"Oneplus","name":"OnePlus Nord CE 5G","os":"Android 11, upgradable to Android 13, OxygenOS 13","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":410,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_nord_n200_5g","brand":"Oneplus","name":"OnePlus Nord N200 5G","os":"Android 11, OxygenOS 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.49,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a11s","brand":"Oppo","name":"Oppo A11s","os":"Android 10, ColorOS 7.2","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a16","brand":"Oppo","name":"Oppo A16","os":"Android 11, upgradable to Android 12, ColorOS 12","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a16k","brand":"Oppo","name":"Oppo A16K","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a16s","brand":"Oppo","name":"Oppo A16s","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a35","brand":"Oppo","name":"Oppo A35","os":"Android 10, ColorOS 7.2","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a53s_5g","brand":"Oppo","name":"Oppo A53s 5G","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a54","brand":"Oppo","name":"Oppo A54","os":"Android 10, ColorOS 7.2","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a54_5g","brand":"Oppo","name":"Oppo A54 5G","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a54s","brand":"Oppo","name":"Oppo A54s","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a55","brand":"Oppo","name":"Oppo A55","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a55_5g","brand":"Oppo","name":"Oppo A55 5G","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a56_5g","brand":"Oppo","name":"Oppo A56 5G","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a74","brand":"Oppo","name":"Oppo A74","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a74_5g","brand":"Oppo","name":"Oppo A74 5G","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a93_5g","brand":"Oppo","name":"Oppo A93 5G","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a93s_5g","brand":"Oppo","name":"Oppo A93s 5G","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a94","brand":"Oppo","name":"Oppo A94","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a94_5g","brand":"Oppo","name":"Oppo A94 5G","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a95","brand":"Oppo","name":"Oppo A95","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a95_5g","brand":"Oppo","name":"Oppo A95 5G","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f19","brand":"Oppo","name":"Oppo F19","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f19_pro","brand":"Oppo","name":"Oppo F19 Pro","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f19_pro+_5g","brand":"Oppo","name":"Oppo F19 Pro+ 5G","os":"Android 11, upgradable to Android 12, ColorOS 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f19s","brand":"Oppo","name":"Oppo F19s","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_n","brand":"Oppo","name":"Oppo Find N","os":"Android 11, ColorOS 12","year":2021,"form":"Foldable","tablet":true,"w":1792,"h":1920,"ppi":370,"inches":7.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_x3","brand":"Oppo","name":"Oppo Find X3","os":"Android 11, upgradable to Android 13, ColorOS 13","year":2021,"form":"Phone","tablet":false,"w":1440,"h":3216,"ppi":525,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_x3_lite","brand":"Oppo","name":"Oppo Find X3 Lite","os":"Android 11, upgradable to Android 13, ColorOS 13","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":410,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_x3_neo","brand":"Oppo","name":"Oppo Find X3 Neo","os":"Android 11, upgradable to Android 12, ColorOS","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_x3_pro","brand":"Oppo","name":"Oppo Find X3 Pro","os":"Android 11, upgradable to Android 14, ColorOS 14","year":2021,"form":"Phone","tablet":false,"w":1440,"h":3216,"ppi":525,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_k9","brand":"Oppo","name":"Oppo K9","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_k9_pro","brand":"Oppo","name":"Oppo K9 Pro","os":"Android 11, ColorOS 11.3","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_k9s","brand":"Oppo","name":"Oppo K9s","os":"Android 11, ColorOS 11.2","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":401,"inches":6.59,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_k9x","brand":"Oppo","name":"Oppo K9x","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.49,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno5_f","brand":"Oppo","name":"Oppo Reno5 F","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno5_k","brand":"Oppo","name":"Oppo Reno5 K","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno5_lite","brand":"Oppo","name":"Oppo Reno5 Lite","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno5_z","brand":"Oppo","name":"Oppo Reno5 Z","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno6","brand":"Oppo","name":"Oppo Reno6","os":"Android 11, ColorOS 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno6_5g","brand":"Oppo","name":"Oppo Reno6 5G","os":"Android 11, upgradable to Android 12, ColorOS 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno6_pro_5g","brand":"Oppo","name":"Oppo Reno6 Pro 5G","os":"Android 11, upgradable to Android 12, ColorOS 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno6_pro_5g_snapdragon","brand":"Oppo","name":"Oppo Reno6 Pro 5G (Snapdragon)","os":"Android 11, upgradable to Android 12, ColorOS 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno6_pro+_5g","brand":"Oppo","name":"Oppo Reno6 Pro+ 5G","os":"Android 11, upgradable to Android 12, ColorOS 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno6_z","brand":"Oppo","name":"Oppo Reno6 Z","os":"Android 11, upgradable to Android 12, ColorOS 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno7_5g_china","brand":"Oppo","name":"Oppo Reno7 5G (China)","os":"Android 11, ColorOS 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno7_pro_5g","brand":"Oppo","name":"Oppo Reno7 Pro 5G","os":"Android 11, upgradable to Android 13, ColorOS 13","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno7_se_5g","brand":"Oppo","name":"Oppo Reno7 SE 5G","os":"Android 11, ColorOS 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_rt1","brand":"Oukitel","name":"Oukitel RT1","os":"Android 11","year":2021,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oukitel_oukitel_wp17","brand":"Oukitel","name":"Oukitel WP17","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":388,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_8","brand":"Realme","name":"Realme 8","os":"Android 11, Realme UI 2.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_8_5g","brand":"Realme","name":"Realme 8 5G","os":"Android 11, upgradable to Android 12, Realme UI 3.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_8_pro","brand":"Realme","name":"Realme 8 Pro","os":"Android 11, upgradable to Android 12, Realme UI 3.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_8i","brand":"Realme","name":"Realme 8i","os":"Android 11, Realme UI 2.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_8s_5g","brand":"Realme","name":"Realme 8s 5G","os":"Android 11, Realme UI 2.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c11_2021","brand":"Realme","name":"Realme C11 (2021)","os":"Android 11, Realme Go UI","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c20","brand":"Realme","name":"Realme C20","os":"Android 10, Realme UI","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c20a","brand":"Realme","name":"Realme C20A","os":"Android 10, Realme UI","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c21","brand":"Realme","name":"Realme C21","os":"Android 10, Realme UI","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c21y","brand":"Realme","name":"Realme C21Y","os":"Android 10/ Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c25","brand":"Realme","name":"Realme C25","os":"Android 11, Realme UI 2.0","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c25s","brand":"Realme","name":"Realme C25s","os":"Android 11, Realme UI 2.0","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c25y","brand":"Realme","name":"Realme C25Y","os":"Android 11, Realme UI R","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt_5g","brand":"Realme","name":"Realme GT 5G","os":"Android 11, upgradable to Android 14, Realme UI 5.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt_explorer_master","brand":"Realme","name":"Realme GT Explorer Master","os":"Android 11, Realme UI 2.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt_master","brand":"Realme","name":"Realme GT Master","os":"Android 11, upgradable to Android 13, Realme UI 4.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt_neo","brand":"Realme","name":"Realme GT Neo","os":"Android 11, Realme UI 2.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt_neo_flash","brand":"Realme","name":"Realme GT Neo Flash","os":"Android 11, Realme UI 2.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt_neo2","brand":"Realme","name":"Realme GT Neo2","os":"Android 11, upgradable to Android 12, Realme UI 3.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":398,"inches":6.62,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_gt_neo2t","brand":"Realme","name":"Realme GT Neo2T","os":"Android 11, Realme UI 2.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_30","brand":"Realme","name":"Realme Narzo 30","os":"Android 11, Realme UI 2.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_30_5g","brand":"Realme","name":"Realme Narzo 30 5G","os":"Android 11, upgradable to Android 12, Realme UI 3.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_30_pro_5g","brand":"Realme","name":"Realme Narzo 30 Pro 5G","os":"Android 10, Realme UI","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_30a","brand":"Realme","name":"Realme Narzo 30A","os":"Android 10, Realme UI","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_50a","brand":"Realme","name":"Realme Narzo 50A","os":"Android 11, Realme UI 2.0","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_50i","brand":"Realme","name":"Realme Narzo 50i","os":"Android 11, Realme Go UI","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_pad","brand":"Realme","name":"Realme Pad","os":"Android 11","year":2021,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":224,"inches":10.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_q3_5g","brand":"Realme","name":"Realme Q3 5G","os":"Android 11, Realme UI 2.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_q3_pro_5g","brand":"Realme","name":"Realme Q3 Pro 5G","os":"Android 11, Realme UI 2.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_q3_pro_carnival","brand":"Realme","name":"Realme Q3 Pro Carnival","os":"Android 11, Realme UI 2.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_q3i_5g","brand":"Realme","name":"Realme Q3i 5G","os":"Android 11, Realme UI 2.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_q3s","brand":"Realme","name":"Realme Q3s","os":"Android 11, Realme UI 2.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":401,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_q3t","brand":"Realme","name":"Realme Q3t","os":"Android 11, Realme UI 2.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2412,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_v11_5g","brand":"Realme","name":"Realme V11 5G","os":"Android 11, Realme UI 2.0","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_v11s_5g","brand":"Realme","name":"Realme V11s 5G","os":"Android 11, Realme UI 2.0","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_v13_5g","brand":"Realme","name":"Realme V13 5G","os":"Android 11, Realme UI 2.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_v15_5g","brand":"Realme","name":"Realme V15 5G","os":"Android 10, Realme UI","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_x7_india","brand":"Realme","name":"Realme X7 (India)","os":"Android 10, Realme UI","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_x7_max_5g","brand":"Realme","name":"Realme X7 Max 5G","os":"Android 11, upgradable to Android 13, Realme UI 4","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_x7_pro_ultra","brand":"Realme","name":"Realme X7 Pro Ultra","os":"Android 11, Realme UI 2.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a02","brand":"Samsung","name":"Samsung Galaxy A02","os":"Android 10, upgradable to Android 11, One UI Core 3.1","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a03","brand":"Samsung","name":"Samsung Galaxy A03","os":"Android 11, upgradable to Android 13, One UI core 5","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a03_core","brand":"Samsung","name":"Samsung Galaxy A03 Core","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a03s","brand":"Samsung","name":"Samsung Galaxy A03s","os":"Android 11, upgradable to Android 12, One UI 4.1 Core","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a12_india","brand":"Samsung","name":"Samsung Galaxy A12 (India)","os":"Android 11, upgradable to Android 13, One UI 5.1","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a12_nacho","brand":"Samsung","name":"Samsung Galaxy A12 Nacho","os":"Android 11, upgradable to Android 13, One UI 5.1","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a13_5g","brand":"Samsung","name":"Samsung Galaxy A13 5G","os":"Android 11, upgradable to Android 14, One UI 6","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a22","brand":"Samsung","name":"Samsung Galaxy A22","os":"Android 11, upgradable to Android 13, One UI 5","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":274,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a22_5g","brand":"Samsung","name":"Samsung Galaxy A22 5G","os":"Android 11, upgradable to Android 13, One UI core 5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":399,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a32","brand":"Samsung","name":"Samsung Galaxy A32","os":"Android 11, upgradable to Android 13, One UI 5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a32_5g","brand":"Samsung","name":"Samsung Galaxy A32 5G","os":"Android 11, upgradable to Android 13, One UI 5","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a52","brand":"Samsung","name":"Samsung Galaxy A52","os":"Android 11, upgradable to Android 14, One UI 6.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":407,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a52_5g","brand":"Samsung","name":"Samsung Galaxy A52 5G","os":"Android 11, upgradable to Android 14, One UI 6.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":407,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a52s_5g","brand":"Samsung","name":"Samsung Galaxy A52s 5G","os":"Android 11, upgradable to Android 14, One UI 6","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a72","brand":"Samsung","name":"Samsung Galaxy A72","os":"Android 11, upgradable to Android 12, One UI 4.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_f02s","brand":"Samsung","name":"Samsung Galaxy F02s","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_f12","brand":"Samsung","name":"Samsung Galaxy F12","os":"Android 11, upgradable to Android 13, One UI 5","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_f22","brand":"Samsung","name":"Samsung Galaxy F22","os":"Android 11, upgradable to Android 13, One UI core 5.1","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":274,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_f42_5g","brand":"Samsung","name":"Samsung Galaxy F42 5G","os":"Android 11, upgradable to Android 13, One UI core 5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_f52_5g","brand":"Samsung","name":"Samsung Galaxy F52 5G","os":"Android 11, One UI 3.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_f62","brand":"Samsung","name":"Samsung Galaxy F62","os":"Android 11, upgradable to Android 13, One UI 5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m02","brand":"Samsung","name":"Samsung Galaxy M02","os":"Android 10, One UI 2.0","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m02s","brand":"Samsung","name":"Samsung Galaxy M02s","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m12","brand":"Samsung","name":"Samsung Galaxy M12","os":"Android 11, One UI Core 3.1","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m12_india","brand":"Samsung","name":"Samsung Galaxy M12 (India)","os":"Android 11, One UI 3.1","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m21_2021","brand":"Samsung","name":"Samsung Galaxy M21 2021","os":"Android 11, One UI 3.1 Core","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m22","brand":"Samsung","name":"Samsung Galaxy M22","os":"Android 11, upgradable to Android 13, One UI Core 5.1","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":274,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m32","brand":"Samsung","name":"Samsung Galaxy M32","os":"Android 11, upgradable to Android 13, One UI 5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m32_5g","brand":"Samsung","name":"Samsung Galaxy M32 5G","os":"Android 11, upgradable to Android 13, One UI 5","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m42_5g","brand":"Samsung","name":"Samsung Galaxy M42 5G","os":"Android 11, upgradable to Android 13, One UI 5.1","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m52_5g","brand":"Samsung","name":"Samsung Galaxy M52 5G","os":"Android 11, upgradable to Android 13, One UI 5.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m62","brand":"Samsung","name":"Samsung Galaxy M62","os":"Android 11, upgradable to Android 13, One UI 5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_quantum_2","brand":"Samsung","name":"Samsung Galaxy Quantum 2","os":"Android 11, One UI 3.1","year":2021,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":524,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s21_5g","brand":"Samsung","name":"Samsung Galaxy S21 5G","os":"Android 11, up to 4 major Android upgrades, One UI 6.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":421,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s21_ultra_5g","brand":"Samsung","name":"Samsung Galaxy S21 Ultra 5G","os":"Android 11, up to 4 major Android upgrades, One UI 6.1","year":2021,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":515,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s21+_5g","brand":"Samsung","name":"Samsung Galaxy S21+ 5G","os":"Android 11, up to 4 major Android upgrades, One UI 6.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_a7_lite","brand":"Samsung","name":"Samsung Galaxy Tab A7 Lite","os":"Android 11, upgradable to Android 14, One UI 6.1","year":2021,"form":"Tablet","tablet":true,"w":800,"h":1340,"ppi":179,"inches":8.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_a8_10.5_2021","brand":"Samsung","name":"Samsung Galaxy Tab A8 10.5 (2021)","os":"Android 11, upgradable to Android 14, One UI 6","year":2021,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":216,"inches":10.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s7_fe","brand":"Samsung","name":"Samsung Galaxy Tab S7 FE","os":"Android 11, upgradable to Android 14, One UI 6","year":2021,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":243,"inches":12.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_xcover_5","brand":"Samsung","name":"Samsung Galaxy XCover 5","os":"Android 11, upgradable to Android 14, One UI 6.1","year":2021,"form":"Phone","tablet":false,"w":720,"h":1480,"ppi":311,"inches":5.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_z_flip3_5g","brand":"Samsung","name":"Samsung Galaxy Z Flip3 5G","os":"Android 11, upgradable to Android 14, One UI 6.1","year":2021,"form":"Foldable","tablet":false,"w":1080,"h":2640,"ppi":426,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_z_fold3_5g","brand":"Samsung","name":"Samsung Galaxy Z Fold3 5G","os":"Android 11, up to 4 major Android upgrades, One UI 6.1","year":2021,"form":"Foldable","tablet":true,"w":1768,"h":2208,"ppi":374,"inches":7.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_zero6","brand":"Sharp","name":"Sharp Aquos zero6","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_1_iii","brand":"Sony","name":"Sony Xperia 1 III","os":"Android 11, upgradable to Android 13","year":2021,"form":"Phone","tablet":false,"w":1644,"h":3840,"ppi":643,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_10_iii","brand":"Sony","name":"Sony Xperia 10 III","os":"Android 11, upgradable to Android 13","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2520,"ppi":457,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_10_iii_lite","brand":"Sony","name":"Sony Xperia 10 III Lite","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2520,"ppi":457,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_5_iii","brand":"Sony","name":"Sony Xperia 5 III","os":"Android 11, upgradable to Android 13","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2520,"ppi":449,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_pro-i","brand":"Sony","name":"Sony Xperia Pro-I","os":"Android 11, upgradable to Android 13","year":2021,"form":"Phone","tablet":false,"w":1644,"h":3840,"ppi":643,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_20_pro_5g","brand":"Tcl","name":"TCL 20 Pro 5G","os":"Android 11, TCL UI","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_20_r_5g","brand":"Tcl","name":"TCL 20 R 5G","os":"Android 11, TCL UI","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_20_se","brand":"Tcl","name":"TCL 20 SE","os":"Android 11, upgradable to Android 12, TCL UI","year":2021,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_20_xe","brand":"Tcl","name":"TCL 20 XE","os":"Android 11, TCL UI 3.0","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_205","brand":"Tcl","name":"TCL 205","os":"Android 11 (Go edition), TCL UI","year":2021,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_20b","brand":"Tcl","name":"TCL 20B","os":"Android 11, TCL UI","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_20e","brand":"Tcl","name":"TCL 20E","os":"Android 11, TCL UI","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_20l","brand":"Tcl","name":"TCL 20L","os":"Android 11, TCL UI","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_20l+","brand":"Tcl","name":"TCL 20L+","os":"Android 11, TCL UI","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_20s","brand":"Tcl","name":"TCL 20S","os":"Android 11, TCL UI","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_20y","brand":"Tcl","name":"TCL 20Y","os":"Android 11, TCL UI","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_a3","brand":"Tcl","name":"TCL A3","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_a30","brand":"Tcl","name":"TCL A30","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_l10_pro","brand":"Tcl","name":"TCL L10 Pro","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_nxtpaper","brand":"Tcl","name":"TCL NxtPaper","os":"Android 10","year":2021,"form":"Tablet","tablet":true,"w":1080,"h":1440,"ppi":203,"inches":8.88,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_tab_10s","brand":"Tcl","name":"TCL Tab 10s","os":"Android 10","year":2021,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_camon_17","brand":"Tecno","name":"Tecno Camon 17","os":"Android 11, HIOS 7.6","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_17_pro","brand":"Tecno","name":"Tecno Camon 17 Pro","os":"Android 11, HIOS 7.6","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_17p","brand":"Tecno","name":"Tecno Camon 17P","os":"Android 11, HIOS 7.6","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_18","brand":"Tecno","name":"Tecno Camon 18","os":"Android 11, HIOS 8.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_18_p","brand":"Tecno","name":"Tecno Camon 18 P","os":"Android 11, HIOS 8.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_18_premier","brand":"Tecno","name":"Tecno Camon 18 Premier","os":"Android 11, HIOS 8.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_18i","brand":"Tecno","name":"Tecno Camon 18i","os":"Android 11, HIOS 7.6","year":2021,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":271,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_phantom_x","brand":"Tecno","name":"Tecno Phantom X","os":"Android 11, HIOS 7.6","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":385,"inches":6.7,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pop_5","brand":"Tecno","name":"Tecno Pop 5","os":"Android 10 (Go edition), HIOS","year":2021,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pop_5_lte","brand":"Tecno","name":"Tecno Pop 5 LTE","os":"Android 11, HIOS 7.6","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pop_5c","brand":"Tecno","name":"Tecno Pop 5c","os":"Android 10 (Go edition), HIOS","year":2021,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pova_2","brand":"Tecno","name":"Tecno Pova 2","os":"Android 11, HIOS 7.6","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":389,"inches":6.9,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pova_5g","brand":"Tecno","name":"Tecno Pova 5G","os":"Android 11, HIOS 8.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":389,"inches":6.9,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pova_neo","brand":"Tecno","name":"Tecno Pova Neo","os":"Android 11, HIOS 7.6","year":2021,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.8,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_7","brand":"Tecno","name":"Tecno Spark 7","os":"Android 11, HIOS 7.5","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_7_pro","brand":"Tecno","name":"Tecno Spark 7 Pro","os":"Android 11, HIOS 7.5","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_7p","brand":"Tecno","name":"Tecno Spark 7P","os":"Android 11, HIOS 7.5","year":2021,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.8,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_7t","brand":"Tecno","name":"Tecno Spark 7T","os":"Android 11, HIOS 7.6","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_8","brand":"Tecno","name":"Tecno Spark 8","os":"Android 11 (Go edition), HIOS 7.6","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_8_pro","brand":"Tecno","name":"Tecno Spark 8 Pro","os":"Android 11, HIOS 7.6","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_8p","brand":"Tecno","name":"Tecno Spark 8P","os":"Android 11, HIOS 7.6","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_8t","brand":"Tecno","name":"Tecno Spark 8T","os":"Android 11, HIOS 7.6","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_go_2021","brand":"Tecno","name":"Tecno Spark Go 2021","os":"Android 10 (Go edition), HiOS 6.2","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_go_2022","brand":"Tecno","name":"Tecno Spark Go 2022","os":"Android 11 (Go edition), HiOS 7.6","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"ulefone__ulefone_armor_11_5g","brand":"Ulefone_","name":"Ulefone Armor 11 5G","os":"Android 10, planned upgrade to Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_11t_5g","brand":"Ulefone_","name":"Ulefone Armor 11T 5G","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_12_5g","brand":"Ulefone_","name":"Ulefone Armor 12 5G","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":264,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_8_pro","brand":"Ulefone_","name":"Ulefone Armor 8 Pro","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_x10","brand":"Ulefone_","name":"Ulefone Armor X10","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_x8i","brand":"Ulefone_","name":"Ulefone Armor X8i","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_x9","brand":"Ulefone_","name":"Ulefone Armor X9","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_x9_pro","brand":"Ulefone_","name":"Ulefone Armor X9 Pro","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_note_10","brand":"Ulefone_","name":"Ulefone Note 10","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_note_11p","brand":"Ulefone_","name":"Ulefone Note 11P","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":268,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_note_12p","brand":"Ulefone_","name":"Ulefone Note 12P","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_note_13p","brand":"Ulefone_","name":"Ulefone Note 13P","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_note_6","brand":"Ulefone_","name":"Ulefone Note 6","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_note_6p","brand":"Ulefone_","name":"Ulefone Note 6P","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_power_armor_13","brand":"Ulefone_","name":"Ulefone Power Armor 13","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":386,"inches":6.81,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_power_armor_14","brand":"Ulefone_","name":"Ulefone Power Armor 14","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_tab_a7","brand":"Ulefone_","name":"Ulefone Tab A7","os":"Android 11","year":2021,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_a11","brand":"Umidigi","name":"Umidigi A11","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_a11_pro_max","brand":"Umidigi","name":"Umidigi A11 Pro Max","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_a11_tab","brand":"Umidigi","name":"Umidigi A11 Tab","os":"Android 11","year":2021,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":224,"inches":10.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_a9","brand":"Umidigi","name":"Umidigi A9","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_a9_pro_2021","brand":"Umidigi","name":"Umidigi A9 Pro 2021","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_bison_pro","brand":"Umidigi","name":"Umidigi Bison Pro","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_bison_x10","brand":"Umidigi","name":"Umidigi Bison X10","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_bison_x10_pro","brand":"Umidigi","name":"Umidigi Bison X10 Pro","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_bison_x10g","brand":"Umidigi","name":"Umidigi Bison X10G","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_bison_x10g_nfc","brand":"Umidigi","name":"Umidigi Bison X10G NFC","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_bison_x10s","brand":"Umidigi","name":"Umidigi Bison X10S","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_bison_x10s_nfc","brand":"Umidigi","name":"Umidigi Bison X10S NFC","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_g3_tab","brand":"Umidigi","name":"Umidigi G3 Tab","os":"Android 13","year":2021,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_power_5","brand":"Umidigi","name":"Umidigi Power 5","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_power_5s","brand":"Umidigi","name":"Umidigi Power 5S","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_7","brand":"Vivo","name":"vivo iQOO 7","os":"Android 11, Funtouch 11.1 (International), OriginOS 1.0 (Chi","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":394,"inches":6.62,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_7_india","brand":"Vivo","name":"vivo iQOO 7 (India)","os":"Android 11, Funtouch 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":398,"inches":6.62,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_8","brand":"Vivo","name":"vivo iQOO 8","os":"Android 11, OriginOS 1.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":398,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_8_pro","brand":"Vivo","name":"vivo iQOO 8 Pro","os":"Android 11, OriginOS 1.0","year":2021,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":518,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo5","brand":"Vivo","name":"vivo iQOO Neo5","os":"Android 11, OriginOS 1.0 for iQOO","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":398,"inches":6.62,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo5_lite","brand":"Vivo","name":"vivo iQOO Neo5 Lite","os":"Android 11, OriginOS 1.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":402,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo5_s","brand":"Vivo","name":"vivo iQOO Neo5 S","os":"Android 11, OriginOS Ocean","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":398,"inches":6.62,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo5_se","brand":"Vivo","name":"vivo iQOO Neo5 SE","os":"Android 11, OriginOS Ocean","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_u3x","brand":"Vivo","name":"vivo iQOO U3x","os":"Android 11, OriginOS 1.0 for iQOO","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_u5","brand":"Vivo","name":"vivo iQOO U5","os":"Android 12, OriginOS Ocean","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z3","brand":"Vivo","name":"vivo iQOO Z3","os":"Android 11, Funtouch 11.1 (International), OriginOS 1.0 for ","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z5","brand":"Vivo","name":"vivo iQOO Z5","os":"Android 11, Funtouch 12 (International), OriginOS for iQOO 1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z5x","brand":"Vivo","name":"vivo iQOO Z5x","os":"Android 11, OriginOS 1.0 for iQOO","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s10","brand":"Vivo","name":"vivo S10","os":"Android 11, OriginOS 1.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s10_pro","brand":"Vivo","name":"vivo S10 Pro","os":"Android 11, OriginOS 1.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s10e","brand":"Vivo","name":"vivo S10e","os":"Android 11, OriginOS 1.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s12","brand":"Vivo","name":"vivo S12","os":"Android 11, OriginOS Ocean","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s12_pro","brand":"Vivo","name":"vivo S12 Pro","os":"Android 11, OriginOS Ocean","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":401,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s7t","brand":"Vivo","name":"vivo S7t","os":"Android 11, OriginOS 1.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s9","brand":"Vivo","name":"vivo S9","os":"Android 11, OriginOS 1.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s9e","brand":"Vivo","name":"vivo S9e","os":"Android 11, OriginOS 1.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2404,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_t1","brand":"Vivo","name":"vivo T1","os":"Android 11, OriginOS","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_t1x","brand":"Vivo","name":"vivo T1x","os":"Android 11, OriginOS","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v21","brand":"Vivo","name":"vivo V21","os":"Android 11, Funtouch 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v21_5g","brand":"Vivo","name":"vivo V21 5G","os":"Android 11, Funtouch 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v21e","brand":"Vivo","name":"vivo V21e","os":"Android 11, Funtouch 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v21e_5g","brand":"Vivo","name":"vivo V21e 5G","os":"Android 11, Funtouch 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v23e","brand":"Vivo","name":"vivo V23e","os":"Android 11, Funtouch 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v23e_5g","brand":"Vivo","name":"vivo V23e 5G","os":"Android 11, Funtouch 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x60","brand":"Vivo","name":"vivo X60","os":"Android 11, Funtouch 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":398,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x60_pro","brand":"Vivo","name":"vivo X60 Pro","os":"Android 11, Funtouch 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":398,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x60_pro+","brand":"Vivo","name":"vivo X60 Pro+","os":"Android 11, Funtouch 12 (International), OriginOS 1.0 (China","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":398,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x60s","brand":"Vivo","name":"vivo X60s","os":"Android 11, OriginOS 1.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":398,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x60t","brand":"Vivo","name":"vivo X60t","os":"Android 11, OriginOS 1.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":398,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x60t_pro+","brand":"Vivo","name":"vivo X60t Pro+","os":"Android 11, OriginOS 1.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":398,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x70","brand":"Vivo","name":"vivo X70","os":"Android 11, upgradable to Android 14, Funtouch OS 14 (Intern","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":398,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x70_pro","brand":"Vivo","name":"vivo X70 Pro","os":"Android 11, upgradable to Android 14, Funtouch OS 14 (Intern","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":398,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x70_pro+","brand":"Vivo","name":"vivo X70 Pro+","os":"Android 11, upgradable to Android 14, Funtouch OS 14 (Intern","year":2021,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":517,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y12a","brand":"Vivo","name":"vivo Y12a","os":"Android 11, Funtouch 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y12s_2021","brand":"Vivo","name":"vivo Y12s 2021","os":"Android 11, Funtouch 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y15a","brand":"Vivo","name":"vivo Y15a","os":"Android 11, Funtouch 11.1","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y15s","brand":"Vivo","name":"vivo Y15s","os":"Android 11 (Go edition), Funtouch 11.1 - vivo 15s","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y20g","brand":"Vivo","name":"vivo Y20g","os":"Android 10, Funtouch 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y20s_[g]","brand":"Vivo","name":"vivo Y20s [G]","os":"Android 11, Funtouch 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y20t","brand":"Vivo","name":"vivo Y20t","os":"Android 11, Funtouch 11.1","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y21","brand":"Vivo","name":"vivo Y21","os":"Android 11, Funtouch 11.1","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y21s","brand":"Vivo","name":"vivo Y21s","os":"Android 11, Funtouch 11.1","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y30g","brand":"Vivo","name":"vivo Y30g","os":"Android 11, OriginOS 1.0","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y31","brand":"Vivo","name":"vivo Y31","os":"Android 11, Funtouch 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y31s","brand":"Vivo","name":"vivo Y31s","os":"Android 11, Funtouch 10.5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y32","brand":"Vivo","name":"vivo Y32","os":"Android 11, OriginOS 1.0","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y33","brand":"Vivo","name":"vivo Y33","os":"Android 11, Funtouch 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y33s","brand":"Vivo","name":"vivo Y33s","os":"Android 11, Funtouch 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y3s_2021","brand":"Vivo","name":"vivo Y3s (2021)","os":"Android 11 (Go edition), Funtouch 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y50t","brand":"Vivo","name":"vivo Y50t","os":"Android 10, OriginOS","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y51a","brand":"Vivo","name":"vivo Y51a","os":"Android 11, upgradable to Android 12, Funtouch 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y52_5g","brand":"Vivo","name":"vivo Y52 5G","os":"Android 11, Funtouch 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y53s","brand":"Vivo","name":"vivo Y53s","os":"Android 11, OriginOS 1.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y53s_4g","brand":"Vivo","name":"vivo Y53s 4G","os":"Android 11, Funtouch 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y54s","brand":"Vivo","name":"vivo Y54s","os":"Android 11, OriginOS 1.0","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y55s_2021","brand":"Vivo","name":"vivo Y55s (2021)","os":"Android 11, OriginOS","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y70t","brand":"Vivo","name":"vivo Y70t","os":"Android 10, Funtouch 10.5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y71t","brand":"Vivo","name":"vivo Y71t","os":"Android 11, OriginOS 1.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y72_5g","brand":"Vivo","name":"vivo Y72 5G","os":"Android 11, Funtouch 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y72_5g_india","brand":"Vivo","name":"vivo Y72 5G (India)","os":"Android 11, Funtouch 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y73","brand":"Vivo","name":"vivo Y73","os":"Android 11, Funtouch 11.1","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y74s","brand":"Vivo","name":"vivo Y74s","os":"Android 11, OriginOS","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y76_5g","brand":"Vivo","name":"vivo Y76 5G","os":"Android 11, Funtouch 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y76s","brand":"Vivo","name":"vivo Y76s","os":"Android 11, OriginOS","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_11_lite_5g_ne","brand":"Xiaomi","name":"Xiaomi 11 Lite 5G NE","os":"Android 11, upgradable to Android 12, MIUI 13","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_11t","brand":"Xiaomi","name":"Xiaomi 11T","os":"Android 11, upgradable to Android 13, MIUI 14","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_11t_pro","brand":"Xiaomi","name":"Xiaomi 11T Pro","os":"Android 11, upgradable to Android 13, MIUI 14","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_12","brand":"Xiaomi","name":"Xiaomi 12","os":"Android 12, MIUI 13","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":419,"inches":6.28,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_12_pro","brand":"Xiaomi","name":"Xiaomi 12 Pro","os":"Android 12, MIUI 13","year":2021,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":521,"inches":6.73,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_12x","brand":"Xiaomi","name":"Xiaomi 12X","os":"Android 11, MIUI 13","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":419,"inches":6.28,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_black_shark_4","brand":"Xiaomi","name":"Xiaomi Black Shark 4","os":"Android 11, Joy UI 12.5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_black_shark_4_pro","brand":"Xiaomi","name":"Xiaomi Black Shark 4 Pro","os":"Android 11, Joy UI 12.5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_black_shark_4s","brand":"Xiaomi","name":"Xiaomi Black Shark 4S","os":"Android 11, Joy UI 12.8","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_black_shark_4s_pro","brand":"Xiaomi","name":"Xiaomi Black Shark 4S Pro","os":"Android 11, Joy UI 12.8","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_civi","brand":"Xiaomi","name":"Xiaomi Civi","os":"Android 11, MIUI 12.5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_10i_5g","brand":"Xiaomi","name":"Xiaomi Mi 10i 5G","os":"Android 10, MIUI 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_10s","brand":"Xiaomi","name":"Xiaomi Mi 10S","os":"Android 11, MIUI 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":386,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_11_lite","brand":"Xiaomi","name":"Xiaomi Mi 11 Lite","os":"Android 11, MIUI 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_11_lite_5g","brand":"Xiaomi","name":"Xiaomi Mi 11 Lite 5G","os":"Android 11, upgradable to Android 13, MIUI 14","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_11_pro","brand":"Xiaomi","name":"Xiaomi Mi 11 Pro","os":"Android 11, MIUI 12.5","year":2021,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":515,"inches":6.81,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_11_ultra","brand":"Xiaomi","name":"Xiaomi Mi 11 Ultra","os":"Android 11, upgradable to Android 13, MIUI 14","year":2021,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":515,"inches":6.81,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_11i","brand":"Xiaomi","name":"Xiaomi Mi 11i","os":"Android 11, MIUI 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_11x","brand":"Xiaomi","name":"Xiaomi Mi 11X","os":"Android 11, MIUI 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_11x_pro","brand":"Xiaomi","name":"Xiaomi Mi 11X Pro","os":"Android 11, MIUI 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_mix_fold","brand":"Xiaomi","name":"Xiaomi Mi Mix Fold","os":"Android 10, MIUI 12","year":2021,"form":"Foldable","tablet":true,"w":1860,"h":2480,"ppi":387,"inches":8.01,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mix_4","brand":"Xiaomi","name":"Xiaomi Mix 4","os":"Android 11, MIUI 12.5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_pad_5","brand":"Xiaomi","name":"Xiaomi Pad 5","os":"Android 11, upgradable to Android 13, MIUI 14","year":2021,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":274,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_pad_5_pro","brand":"Xiaomi","name":"Xiaomi Pad 5 Pro","os":"Android 11, upgradable to Android 13, MIUI 14","year":2021,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":274,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_c31","brand":"Xiaomi","name":"Xiaomi Poco C31","os":"Android 10, MIUI 12","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_f3","brand":"Xiaomi","name":"Xiaomi Poco F3","os":"Android 11, upgradable to Android 13, HyperOS","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_f3_gt","brand":"Xiaomi","name":"Xiaomi Poco F3 GT","os":"Android 11, upgradable to Android 12, MIUI 13 for POCO","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_m2_reloaded","brand":"Xiaomi","name":"Xiaomi Poco M2 Reloaded","os":"Android 10, MIUI 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_m3_pro","brand":"Xiaomi","name":"Xiaomi Poco M3 Pro","os":"Android 11, MIUI 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_m3_pro_5g","brand":"Xiaomi","name":"Xiaomi Poco M3 Pro 5G","os":"Android 11, MIUI 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_m4_pro_5g","brand":"Xiaomi","name":"Xiaomi Poco M4 Pro 5G","os":"Android 11, upgradable to Android 12, MIUI 13","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":399,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_x3_gt","brand":"Xiaomi","name":"Xiaomi Poco X3 GT","os":"Android 11, MIUI 12.5 for POCO","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":399,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_x3_pro","brand":"Xiaomi","name":"Xiaomi Poco X3 Pro","os":"Android 11, upgradable to Android 12, MIUI 13 for POCO","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_10","brand":"Xiaomi","name":"Xiaomi Redmi 10","os":"Android 11, MIUI 12.5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_10_prime","brand":"Xiaomi","name":"Xiaomi Redmi 10 Prime","os":"Android 11, MIUI 12.5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_9_activ","brand":"Xiaomi","name":"Xiaomi Redmi 9 Activ","os":"Android 10, MIUI 12","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_9a_sport","brand":"Xiaomi","name":"Xiaomi Redmi 9A Sport","os":"Android 10, MIUI 12","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_9i_sport","brand":"Xiaomi","name":"Xiaomi Redmi 9i Sport","os":"Android 10, MIUI 12","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_9t","brand":"Xiaomi","name":"Xiaomi Redmi 9T","os":"Android 10, MIUI 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k40","brand":"Xiaomi","name":"Xiaomi Redmi K40","os":"Android 11, MIUI 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k40_gaming","brand":"Xiaomi","name":"Xiaomi Redmi K40 Gaming","os":"Android 11, MIUI 12.5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k40_pro","brand":"Xiaomi","name":"Xiaomi Redmi K40 Pro","os":"Android 11, MIUI 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k40_pro+","brand":"Xiaomi","name":"Xiaomi Redmi K40 Pro+","os":"Android 11, MIUI 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_10","brand":"Xiaomi","name":"Xiaomi Redmi Note 10","os":"Android 11, upgradable to Android 12, MIUI 14","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_10_5g","brand":"Xiaomi","name":"Xiaomi Redmi Note 10 5G","os":"Android 11, MIUI 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_10_lite","brand":"Xiaomi","name":"Xiaomi Redmi Note 10 Lite","os":"Android 10, MIUI 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_10_pro","brand":"Xiaomi","name":"Xiaomi Redmi Note 10 Pro","os":"Android 11, upgradable to Android 13, MIUI 14","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_10_pro_china","brand":"Xiaomi","name":"Xiaomi Redmi Note 10 Pro (China)","os":"Android 11, MIUI 12.5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":399,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_10_pro_india","brand":"Xiaomi","name":"Xiaomi Redmi Note 10 Pro (India)","os":"Android 11, MIUI 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_10_pro_max","brand":"Xiaomi","name":"Xiaomi Redmi Note 10 Pro Max","os":"Android 11, MIUI 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_10s","brand":"Xiaomi","name":"Xiaomi Redmi Note 10S","os":"Android 11, upgradable to Android 13, MIUI 14","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_10t_5g","brand":"Xiaomi","name":"Xiaomi Redmi Note 10T 5G","os":"Android 11, MIUI 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_11_china","brand":"Xiaomi","name":"Xiaomi Redmi Note 11 (China)","os":"Android 11, MIUI 12.5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":399,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_11_4g","brand":"Xiaomi","name":"Xiaomi Redmi Note 11 4G","os":"Android 11, MIUI 12.5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_11_pro_china","brand":"Xiaomi","name":"Xiaomi Redmi Note 11 Pro (China)","os":"Android 11, MIUI 12.5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_11_pro+_5g","brand":"Xiaomi","name":"Xiaomi Redmi Note 11 Pro+ 5G","os":"Android 11, MIUI 12.5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_11t_5g","brand":"Xiaomi","name":"Xiaomi Redmi Note 11T 5G","os":"Android 11, MIUI 12.5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":399,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_8_2021","brand":"Xiaomi","name":"Xiaomi Redmi Note 8 2021","os":"Android 11, MIUI 12.5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_9t","brand":"Xiaomi","name":"Xiaomi Redmi Note 9T","os":"Android 10, MIUI 12","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_avid_589","brand":"Zte","name":"ZTE Avid 589","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_30_5g","brand":"Zte","name":"ZTE Axon 30 5G","os":"Android 11, MyOS 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":400,"inches":6.92,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_30_pro_5g","brand":"Zte","name":"ZTE Axon 30 Pro 5G","os":"Android 11, MyOS 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_30_ultra_5g","brand":"Zte","name":"ZTE Axon 30 Ultra 5G","os":"Android 11, MyOS 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_11_prime","brand":"Zte","name":"ZTE Blade 11 Prime","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a31_lite","brand":"Zte","name":"ZTE Blade A31 Lite","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":215,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a31_plus","brand":"Zte","name":"ZTE Blade A31 Plus","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":179,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a51","brand":"Zte","name":"ZTE Blade A51","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a71","brand":"Zte","name":"ZTE Blade A71","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a7p","brand":"Zte","name":"ZTE Blade A7P","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_l9","brand":"Zte","name":"ZTE Blade L9","os":"Android 11 (Go edition)","year":2021,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":215,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v30","brand":"Zte","name":"ZTE Blade V30","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v30_vita","brand":"Zte","name":"ZTE Blade V30 Vita","os":"Android 11","year":2021,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":288,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_x1_5g","brand":"Zte","name":"ZTE Blade X1 5G","os":"Android 10","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":396,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_6","brand":"Zte","name":"ZTE nubia Red Magic 6","os":"Android 11, Redmagic 4.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":387,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_6_pro","brand":"Zte","name":"ZTE nubia Red Magic 6 Pro","os":"Android 11, Redmagic 4.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":387,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_6r","brand":"Zte","name":"ZTE nubia Red Magic 6R","os":"Android 11, Redmagic 4.0","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_6s","brand":"Zte","name":"ZTE nubia Red Magic 6s","os":"Android 11, Redmagic 4.5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":387,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_6s_pro","brand":"Zte","name":"ZTE nubia Red Magic 6s Pro","os":"Android 11, Redmagic 4.5","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":387,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z30_pro","brand":"Zte","name":"ZTE nubia Z30 Pro","os":"Android 11, nubia UI 9","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_s30","brand":"Zte","name":"ZTE S30","os":"Android 11, MyOS 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_s30_pro","brand":"Zte","name":"ZTE S30 Pro","os":"Android 11, MyOS 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_s30_se","brand":"Zte","name":"ZTE S30 SE","os":"Android 11, MyOS 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_voyage_20_pro","brand":"Zte","name":"ZTE Voyage 20 Pro","os":"Android 11, MyOS 11","year":2021,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_1b_2020","brand":"Alcatel","name":"alcatel 1B (2020)","os":"Android 10 (Go edition)","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_1s_2020","brand":"Alcatel","name":"alcatel 1S (2020)","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_1se_2020","brand":"Alcatel","name":"alcatel 1SE (2020)","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_1v_2020","brand":"Alcatel","name":"alcatel 1V (2020)","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_3l_2020","brand":"Alcatel","name":"alcatel 3L (2020)","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_3t10_2020","brand":"Alcatel","name":"alcatel 3T10 2020","os":"Android 10","year":2020,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_3x_2020","brand":"Alcatel","name":"alcatel 3X (2020)","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"apple_apple_ipad_10.2_2020","brand":"Apple","name":"Apple iPad 10.2 (2020)","os":"iPadOS 14, upgradable to iPadOS 18","year":2020,"form":"Tablet","tablet":true,"w":1620,"h":2160,"ppi":264,"inches":10.2,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_ipad_air_2020","brand":"Apple","name":"Apple iPad Air (2020)","os":"iPadOS 14.1, upgradable to iPadOS 18","year":2020,"form":"Tablet","tablet":true,"w":1640,"h":2360,"ppi":264,"inches":10.9,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_ipad_pro_11_2020","brand":"Apple","name":"Apple iPad Pro 11 (2020)","os":"iPadOS 13.4, upgradable to iPadOS 18","year":2020,"form":"Tablet","tablet":true,"w":1668,"h":2388,"ppi":265,"inches":11.0,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_ipad_pro_12.9_2020","brand":"Apple","name":"Apple iPad Pro 12.9 (2020)","os":"iPadOS 13.4, upgradable to iPadOS 18","year":2020,"form":"Tablet","tablet":true,"w":2048,"h":2732,"ppi":265,"inches":12.9,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_iphone_12","brand":"Apple","name":"Apple iPhone 12","os":"iOS 14.1, upgradable to iOS 18","year":2020,"form":"Phone","tablet":false,"w":1170,"h":2532,"ppi":460,"inches":6.1,"platform":"ios","hasNotch":true,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":47,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_12_mini","brand":"Apple","name":"Apple iPhone 12 mini","os":"iOS 14.1, upgradable to iOS 18","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":476,"inches":5.4,"platform":"ios","hasNotch":true,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":47,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_12_pro","brand":"Apple","name":"Apple iPhone 12 Pro","os":"iOS 14.1, upgradable to iOS 18","year":2020,"form":"Phone","tablet":false,"w":1170,"h":2532,"ppi":460,"inches":6.1,"platform":"ios","hasNotch":true,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":47,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_12_pro_max","brand":"Apple","name":"Apple iPhone 12 Pro Max","os":"iOS 14.1, upgradable to iOS 18","year":2020,"form":"Phone","tablet":false,"w":1284,"h":2778,"ppi":458,"inches":6.7,"platform":"ios","hasNotch":true,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":47,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_se_2020","brand":"Apple","name":"Apple iPhone SE (2020)","os":"iOS 13, upgradable to iOS 18","year":2020,"form":"Phone","tablet":false,"w":750,"h":1334,"ppi":326,"inches":4.7,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"asus_asus_rog_phone_3","brand":"Asus","name":"Asus ROG Phone 3","os":"Android 10, upgradable to Android 12, ROG UI","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":391,"inches":6.59,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_rog_phone_3_strix","brand":"Asus","name":"Asus ROG Phone 3 Strix","os":"Android 10, ROG UI","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":391,"inches":6.59,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_7","brand":"Asus","name":"Asus Zenfone 7","os":"Android 10, upgradable to Android 12, ZenUI","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_7_pro","brand":"Asus","name":"Asus Zenfone 7 Pro","os":"Android 10, upgradable to Android 12, ZenUI","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_a80_plus","brand":"Blackview","name":"Blackview A80 Plus","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":265,"inches":6.49,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bl6000_pro","brand":"Blackview","name":"Blackview BL6000 Pro","os":"Android 10, upgradable to Android 11","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2300,"ppi":400,"inches":6.36,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bv4900","brand":"Blackview","name":"Blackview BV4900","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bv4900_pro","brand":"Blackview","name":"Blackview BV4900 Pro","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bv5100","brand":"Blackview","name":"Blackview BV5100","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bv6300_pro","brand":"Blackview","name":"Blackview BV6300 Pro","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bv9900e","brand":"Blackview","name":"Blackview BV9900E","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":432,"inches":5.84,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_tab_8","brand":"Blackview","name":"Blackview Tab 8","os":"Android 10","year":2020,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cat_cat_s42","brand":"Cat","name":"Cat S42","os":"Android 10, planned upgrade to Android 11","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cat_cat_s62_pro","brand":"Cat","name":"Cat S62 Pro","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":424,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_c20","brand":"Cubot","name":"Cubot C20","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2246,"ppi":403,"inches":6.18,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_c30","brand":"Cubot","name":"Cubot C30","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2310,"ppi":398,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_j8","brand":"Cubot","name":"Cubot J8","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":442,"h":960,"ppi":192,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_j9","brand":"Cubot","name":"Cubot J9","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_kingkong_cs","brand":"Cubot","name":"Cubot KingKong CS","os":"Android 10 (Go edition)","year":2020,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_kingkong_mini_2","brand":"Cubot","name":"Cubot KingKong Mini 2","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":540,"h":1080,"ppi":302,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_note_20","brand":"Cubot","name":"Cubot Note 20","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_note_20_pro","brand":"Cubot","name":"Cubot Note 20 Pro","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_note_7","brand":"Cubot","name":"Cubot Note 7","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":442,"h":960,"ppi":192,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_p30","brand":"Cubot","name":"Cubot P30","os":"Android 9.0 (Pie)","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_p40","brand":"Cubot","name":"Cubot P40","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_quest","brand":"Cubot","name":"Cubot Quest","os":"Android 9.0 (Pie)","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_quest_lite","brand":"Cubot","name":"Cubot Quest Lite","os":"Android 9.0 (Pie)","year":2020,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_x19","brand":"Cubot","name":"Cubot X19","os":"Android 9.0 (Pie)","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":407,"inches":5.93,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_x19s","brand":"Cubot","name":"Cubot X19S","os":"Android 9.0 (Pie)","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":407,"inches":5.93,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_x20","brand":"Cubot","name":"Cubot X20","os":"Android 9.0 (Pie)","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_x20_pro","brand":"Cubot","name":"Cubot X20 Pro","os":"Android 9.0 (Pie)","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cubot_cubot_x30","brand":"Cubot","name":"Cubot X30","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2310,"ppi":398,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_n20_pro","brand":"Doogee","name":"Doogee N20 Pro","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":400,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_n30","brand":"Doogee","name":"Doogee N30","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":268,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s40_pro","brand":"Doogee","name":"Doogee S40 Pro","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s58_pro","brand":"Doogee","name":"Doogee S58 Pro","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":295,"inches":5.71,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s59","brand":"Doogee","name":"Doogee S59","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":295,"inches":5.71,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s88_pro","brand":"Doogee","name":"Doogee S88 Pro","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_s96_pro","brand":"Doogee","name":"Doogee S96 Pro","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"doogee_doogee_x95","brand":"Doogee","name":"Doogee X95","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":540,"h":1200,"ppi":202,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_hardcase_h620s","brand":"Energizer","name":"Energizer Hardcase H620S","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":260,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_ultimate_u710s","brand":"Energizer","name":"Energizer Ultimate U710S","os":"Android 9.0 (Pie)","year":2020,"form":"Tablet","tablet":true,"w":1080,"h":2244,"ppi":350,"inches":7.12,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_4a","brand":"Google","name":"Google Pixel 4a","os":"Android 10, upgradable to Android 13","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":443,"inches":5.81,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_4a_5g","brand":"Google","name":"Google Pixel 4a 5G","os":"Android 11, upgradable to Android 14","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":413,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_5","brand":"Google","name":"Google Pixel 5","os":"Android 11, upgradable to Android 14","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":432,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_10x_lite","brand":"Honor","name":"Honor 10X Lite","os":"Android 10, Magic UI 3.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_20e","brand":"Honor","name":"Honor 20e","os":"Android 9.0 (Pie), EMUI 9.1, Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":415,"inches":6.21,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_30","brand":"Honor","name":"Honor 30","os":"Android 10, Magic UI 3, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":403,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_30_pro","brand":"Honor","name":"Honor 30 Pro","os":"Android 10, Magic UI 3, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":392,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_30_pro+","brand":"Honor","name":"Honor 30 Pro+","os":"Android 10, Magic UI 3, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":392,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_30_youth","brand":"Honor","name":"Honor 30 Youth","os":"Android 10, Magic UI 3.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_30i","brand":"Honor","name":"Honor 30i","os":"Android 10, Magic UI 2.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":418,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_30s","brand":"Honor","name":"Honor 30S","os":"Android 10, Magic UI 3, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_8a_2020","brand":"Honor","name":"Honor 8A 2020","os":"Android 9.0 (Pie), EMUI 9","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.09,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_8a_prime","brand":"Honor","name":"Honor 8A Prime","os":"Android 9.0 (Pie), EMUI 9","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.09,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_8s_2020","brand":"Honor","name":"Honor 8S 2020","os":"Android 9.0 (Pie), EMUI 9, Google Play Services","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":295,"inches":5.71,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_9a","brand":"Honor","name":"Honor 9A","os":"Android 10, Magic UI 3.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":278,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_9c","brand":"Honor","name":"Honor 9C","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":269,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_9s","brand":"Honor","name":"Honor 9S","os":"Android 10, Magic UI 3.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_9x_lite","brand":"Honor","name":"Honor 9X Lite","os":"Android 9.0 (Pie), EMUI 9.1, Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":397,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_pad_6","brand":"Honor","name":"Honor Pad 6","os":"Android 10, Magic UI 3.1, no Google Play Services","year":2020,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_pad_x6","brand":"Honor","name":"Honor Pad X6","os":"Android 10, Magic UI 3.1, no Google Play Services","year":2020,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":156,"inches":9.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play_4t","brand":"Honor","name":"Honor Play 4T","os":"Android 10, Magic UI 3, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":269,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play_4t_pro","brand":"Honor","name":"Honor Play 4T Pro","os":"Android 10, Magic UI 2, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":418,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play_9a","brand":"Honor","name":"Honor Play 9A","os":"Android 10, Magic UI 3.0, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":278,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play4","brand":"Honor","name":"Honor Play4","os":"Android 10, Magic UI 3.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":386,"inches":6.81,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play4_pro","brand":"Honor","name":"Honor Play4 Pro","os":"Android 10, Magic UI 3.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":401,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_v6","brand":"Honor","name":"Honor V6","os":"Android 10, Magic UI 3.1, no Google Play Services","year":2020,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":224,"inches":10.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_view30","brand":"Honor","name":"Honor View30","os":"Android 10, Magic UI 3, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":401,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_view30_pro","brand":"Honor","name":"Honor View30 Pro","os":"Android 10, Magic UI 3, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":400,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x10_5g","brand":"Honor","name":"Honor X10 5G","os":"Android 10, Magic UI 3.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":397,"inches":6.63,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_x10_max_5g","brand":"Honor","name":"Honor X10 Max 5G","os":"Android 10, Magic UI 3.1, no Google Play Services","year":2020,"form":"Tablet","tablet":true,"w":1080,"h":2280,"ppi":356,"inches":7.09,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_20_pro","brand":"Htc","name":"HTC Desire 20 Pro","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":396,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_20+","brand":"Htc","name":"HTC Desire 20+","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_u20_5g","brand":"Htc","name":"HTC U20 5G","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":387,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_wildfire_e1_lite","brand":"Htc","name":"HTC Wildfire E1 lite","os":"Android 10 (Go edition)","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_wildfire_e2","brand":"Htc","name":"HTC Wildfire E2","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":276,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_wildfire_r70","brand":"Htc","name":"HTC Wildfire R70","os":"Android 9 (Pie)","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":263,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_enjoy_10e","brand":"Huawei","name":"Huawei Enjoy 10e","os":"Android 10, EMUI 10, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":278,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_enjoy_20_5g","brand":"Huawei","name":"Huawei Enjoy 20 5G","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_enjoy_20_plus_5g","brand":"Huawei","name":"Huawei Enjoy 20 Plus 5G","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":397,"inches":6.63,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_enjoy_20_pro","brand":"Huawei","name":"Huawei Enjoy 20 Pro","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_enjoy_20_se","brand":"Huawei","name":"Huawei Enjoy 20 SE","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_enjoy_tablet_2","brand":"Huawei","name":"Huawei Enjoy Tablet 2","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_enjoy_z_5g","brand":"Huawei","name":"Huawei Enjoy Z 5G","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_30e_pro_5g","brand":"Huawei","name":"Huawei Mate 30E Pro 5G","os":"Android 10, EMUI 11, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1176,"h":2400,"ppi":409,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_40","brand":"Huawei","name":"Huawei Mate 40","os":"Android 10, EMUI 11, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":402,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_40_pro","brand":"Huawei","name":"Huawei Mate 40 Pro","os":"Android 10, EMUI 11, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1344,"h":2772,"ppi":456,"inches":6.76,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_40_pro+","brand":"Huawei","name":"Huawei Mate 40 Pro+","os":"Android 10, EMUI 11, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1344,"h":2772,"ppi":456,"inches":6.76,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_40_rs_porsche_design","brand":"Huawei","name":"Huawei Mate 40 RS Porsche Design","os":"Android 10, EMUI 11, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1344,"h":2772,"ppi":456,"inches":6.76,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_xs","brand":"Huawei","name":"Huawei Mate Xs","os":"Android 10, EMUI 10, no Google Play Services","year":2020,"form":"Foldable","tablet":true,"w":2200,"h":2480,"ppi":414,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_10.4","brand":"Huawei","name":"Huawei MatePad 10.4","os":"Android 10, EMUI 10, no Google Play Services","year":2020,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":224,"inches":10.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_10.8","brand":"Huawei","name":"Huawei MatePad 10.8","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":280,"inches":10.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_5g","brand":"Huawei","name":"Huawei MatePad 5G","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":224,"inches":10.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_pro_10.8_5g_2019","brand":"Huawei","name":"Huawei MatePad Pro 10.8 5G (2019)","os":"Android 10, EMUI 10, no Google Play Services","year":2020,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":280,"inches":10.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_t_10s","brand":"Huawei","name":"Huawei MatePad T 10s","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_t8","brand":"Huawei","name":"Huawei MatePad T8","os":"Android 10, EMUI 10, no Google Play Services","year":2020,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_7_5g","brand":"Huawei","name":"Huawei nova 7 5G","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":403,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_7_pro_5g","brand":"Huawei","name":"Huawei nova 7 Pro 5G","os":"Android 10, EMUI 10, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":392,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_7_se","brand":"Huawei","name":"Huawei nova 7 SE","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_7_se_5g_youth","brand":"Huawei","name":"Huawei nova 7 SE 5G Youth","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_7i","brand":"Huawei","name":"Huawei nova 7i","os":"Android 10, EMUI 10, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2310,"ppi":398,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_8_5g","brand":"Huawei","name":"Huawei nova 8 5G","os":"Android 10, EMUI 11, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":392,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_8_pro_5g","brand":"Huawei","name":"Huawei nova 8 Pro 5G","os":"Android 10, EMUI 11, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1236,"h":2676,"ppi":439,"inches":6.72,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_8_se","brand":"Huawei","name":"Huawei nova 8 SE","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":403,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p_smart_2020","brand":"Huawei","name":"Huawei P smart 2020","os":"Android 9.0 (Pie), EMUI 9.1, Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":415,"inches":6.21,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p_smart_2021","brand":"Huawei","name":"Huawei P smart 2021","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p_smart_s","brand":"Huawei","name":"Huawei P Smart S","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":418,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p30_lite_new_edition","brand":"Huawei","name":"Huawei P30 lite New Edition","os":"Android 9.0 (Pie), upgradable to Android 10, EMUI 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2312,"ppi":415,"inches":6.15,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p30_pro_new_edition","brand":"Huawei","name":"Huawei P30 Pro New Edition","os":"Android 10, EMUI 10.1, Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":398,"inches":6.47,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p40","brand":"Huawei","name":"Huawei P40","os":"Android 10, EMUI 12, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":422,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p40_lite","brand":"Huawei","name":"Huawei P40 lite","os":"Android 10, EMUI 10, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2310,"ppi":398,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p40_lite_5g","brand":"Huawei","name":"Huawei P40 lite 5G","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p40_lite_e","brand":"Huawei","name":"Huawei P40 lite E","os":"Android 9.0 (Pie), EMUI 9, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":269,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p40_pro","brand":"Huawei","name":"Huawei P40 Pro","os":"Android 10, EMUI 12, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1200,"h":2640,"ppi":441,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p40_pro+","brand":"Huawei","name":"Huawei P40 Pro+","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1200,"h":2640,"ppi":441,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y5p","brand":"Huawei","name":"Huawei Y5p","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y6p","brand":"Huawei","name":"Huawei Y6p","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":278,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y6s_2019","brand":"Huawei","name":"Huawei Y6s (2019)","os":"Android 9.0 (Pie), EMUI 9.1","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.09,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y7a","brand":"Huawei","name":"Huawei Y7a","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y7p","brand":"Huawei","name":"Huawei Y7p","os":"Android 9.0 (Pie), EMUI 9, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":269,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y8p","brand":"Huawei","name":"Huawei Y8p","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":418,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y8s","brand":"Huawei","name":"Huawei Y8s","os":"Android 9.0 (Pie), EMUI 9.1, Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":396,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y9a","brand":"Huawei","name":"Huawei Y9a","os":"Android 10, EMUI 10.1, no Google Play Services","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":397,"inches":6.63,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_10","brand":"Infinix","name":"Infinix Hot 10","os":"Android 10, XOS 6.0","year":2020,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":264,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_10_lite","brand":"Infinix","name":"Infinix Hot 10 Lite","os":"Android 10 (Go edition)","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_9","brand":"Infinix","name":"Infinix Hot 9","os":"Android 10, XOS 6.0","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_9_play","brand":"Infinix","name":"Infinix Hot 9 Play","os":"Android 9.0 Pie (Go edition) - 32/2GB","year":2020,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.82,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_9_pro","brand":"Infinix","name":"Infinix Hot 9 Pro","os":"Android 10, XOS 6.0","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_7","brand":"Infinix","name":"Infinix Note 7","os":"Android 10, XOS 6.0","year":2020,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":258,"inches":6.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_7_lite","brand":"Infinix","name":"Infinix Note 7 Lite","os":"Android 10, XOS 6.0","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_8","brand":"Infinix","name":"Infinix Note 8","os":"Android 10, XOS 7.1","year":2020,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":258,"inches":6.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_8i","brand":"Infinix","name":"Infinix Note 8i","os":"Android 10, XOS 7.1","year":2020,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":264,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_s5_pro","brand":"Infinix","name":"Infinix S5 Pro","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_s5_pro_16+32","brand":"Infinix","name":"Infinix S5 Pro (16+32)","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_s5_pro_48+40","brand":"Infinix","name":"Infinix S5 Pro (48+40)","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart_5","brand":"Infinix","name":"Infinix Smart 5","os":"Android 10 (Go edition)","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart_hd_2021","brand":"Infinix","name":"Infinix Smart HD 2021","os":"Android 10 (Go edition), XOS 6.2","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_zero_8","brand":"Infinix","name":"Infinix Zero 8","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":392,"inches":6.85,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_zero_8i","brand":"Infinix","name":"Infinix Zero 8i","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":392,"inches":6.85,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"itel_itel_a25","brand":"Itel","name":"itel A25","os":"Android 9.0 (Pie)","year":2020,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a8_2020","brand":"Lenovo","name":"Lenovo A8 2020","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":259,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k12_china","brand":"Lenovo","name":"Lenovo K12 (China)","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k12_pro","brand":"Lenovo","name":"Lenovo K12 Pro","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k7","brand":"Lenovo","name":"Lenovo K7","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":276,"inches":6.09,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_legion_duel","brand":"Lenovo","name":"Lenovo Legion Duel","os":"Android 10, Legion OS/ ZUI12","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":388,"inches":6.65,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_legion_pro","brand":"Lenovo","name":"Lenovo Legion Pro","os":"Android 10, Legion OS/ ZUI12","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":388,"inches":6.65,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_m10_fhd_rel","brand":"Lenovo","name":"Lenovo M10 FHD REL","os":"Android 9.0 (Pie)","year":2020,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_m10_plus","brand":"Lenovo","name":"Lenovo M10 Plus","os":"Android 9.0 (Pie)","year":2020,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":220,"inches":10.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_m10_hd_gen_2","brand":"Lenovo","name":"Lenovo Tab M10 HD Gen 2","os":"Android 10","year":2020,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_p11_pro","brand":"Lenovo","name":"Lenovo Tab P11 Pro","os":"Android 10","year":2020,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":263,"inches":11.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k22","brand":"Lg","name":"LG K22","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k31","brand":"Lg","name":"LG K31","os":"Android 10, LG UX 9.1","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":295,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k41s","brand":"Lg","name":"LG K41S","os":"Android 9.0 (Pie)","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":268,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k42","brand":"Lg","name":"LG K42","os":"Android 10, upgradable to Android 11","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k51s","brand":"Lg","name":"LG K51S","os":"Android 9.0 (Pie)","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":282,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k52","brand":"Lg","name":"LG K52","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k61","brand":"Lg","name":"LG K61","os":"Android 9.0 (Pie)","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":394,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k62","brand":"Lg","name":"LG K62","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k71","brand":"Lg","name":"LG K71","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k92_5g","brand":"Lg","name":"LG K92 5G","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_q31","brand":"Lg","name":"LG Q31","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":295,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_q51","brand":"Lg","name":"LG Q51","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":259,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_q52","brand":"Lg","name":"LG Q52","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_q61","brand":"Lg","name":"LG Q61","os":"Android 9.0 (Pie)","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_q92_5g","brand":"Lg","name":"LG Q92 5G","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_stylo_6","brand":"Lg","name":"LG Stylo 6","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_v60_thinq_5g","brand":"Lg","name":"LG V60 ThinQ 5G","os":"Android 10, upgradable to Android 13","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_v60_thinq_5g_uw","brand":"Lg","name":"LG V60 ThinQ 5G UW","os":"Android 10, upgradable to Android 13","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_velvet","brand":"Lg","name":"LG Velvet","os":"Android 10, upgradable to Android 11, LG UX 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_velvet_5g","brand":"Lg","name":"LG Velvet 5G","os":"Android 10, upgradable to Android 13, LG UX","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_velvet_5g_uw","brand":"Lg","name":"LG Velvet 5G UW","os":"Android 10, upgradable to Android 11, LG UX","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_w10_alpha","brand":"Lg","name":"LG W10 Alpha","os":"Android 9.0 (Pie)","year":2020,"form":"Phone","tablet":false,"w":720,"h":1512,"ppi":293,"inches":5.71,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_w11","brand":"Lg","name":"LG W11","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_w31","brand":"Lg","name":"LG W31","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_w31+","brand":"Lg","name":"LG W31+","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_wing_5g","brand":"Lg","name":"LG Wing 5G","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":395,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_17","brand":"Meizu","name":"Meizu 17","os":"Android 10, Flyme 8.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":390,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_17_pro","brand":"Meizu","name":"Meizu 17 Pro","os":"Android 10, Flyme 8.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":390,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_in_1b","brand":"Micromax","name":"Micromax In 1b","os":"Android 10 (Go edition)","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_in_note_1","brand":"Micromax","name":"Micromax In note 1","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_surface_duo","brand":"Microsoft","name":"Microsoft Surface Duo","os":"Android 10, upgradable to Android 12","year":2020,"form":"Tablet","tablet":true,"w":1800,"h":2700,"ppi":401,"inches":8.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge","brand":"Motorola","name":"Motorola Edge","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":385,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_edge+_2020","brand":"Motorola","name":"Motorola Edge+ (2020)","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":385,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e_2020","brand":"Motorola","name":"Motorola Moto E (2020)","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e6s_2020","brand":"Motorola","name":"Motorola Moto E6s (2020)","os":"Android 9.0 (Pie)","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e7","brand":"Motorola","name":"Motorola Moto E7","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e7_plus","brand":"Motorola","name":"Motorola Moto E7 Plus","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_5g","brand":"Motorola","name":"Motorola Moto G 5G","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_5g_plus","brand":"Motorola","name":"Motorola Moto G 5G Plus","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2520,"ppi":409,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_fast","brand":"Motorola","name":"Motorola Moto G Fast","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":268,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_power","brand":"Motorola","name":"Motorola Moto G Power","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2300,"ppi":399,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_pro","brand":"Motorola","name":"Motorola Moto G Pro","os":"Android 10, upgradable to Android 12, Android One","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2300,"ppi":399,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_stylus","brand":"Motorola","name":"Motorola Moto G Stylus","os":"Android 10, upgradable to Android 11","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2300,"ppi":399,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g8","brand":"Motorola","name":"Motorola Moto G8","os":"Android 10, upgradable to Android 11","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":268,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g8_power","brand":"Motorola","name":"Motorola Moto G8 Power","os":"Android 10, upgradable to Android 11","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2300,"ppi":399,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g8_power_lite","brand":"Motorola","name":"Motorola Moto G8 Power Lite","os":"Android 9.0 (Pie)","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g9_india","brand":"Motorola","name":"Motorola Moto G9 (India)","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g9_play","brand":"Motorola","name":"Motorola Moto G9 Play","os":"Android 10, upgradable to Android 11","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g9_plus","brand":"Motorola","name":"Motorola Moto G9 Plus","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":386,"inches":6.81,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g9_power","brand":"Motorola","name":"Motorola Moto G9 Power","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_one_5g","brand":"Motorola","name":"Motorola One 5G","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2520,"ppi":409,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_one_5g_uw","brand":"Motorola","name":"Motorola One 5G UW","os":"Android 10, upgradable to Android 11","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2520,"ppi":409,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_one_fusion","brand":"Motorola","name":"Motorola One Fusion","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_one_fusion+","brand":"Motorola","name":"Motorola One Fusion+","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":396,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_one_vision_plus","brand":"Motorola","name":"Motorola One Vision Plus","os":"Android 9.0 (Pie), upgradable to Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":400,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_razr_5g","brand":"Motorola","name":"Motorola Razr 5G","os":"Android 10, upgradable to Android 11","year":2020,"form":"Foldable","tablet":false,"w":876,"h":2142,"ppi":373,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_1.3","brand":"Nokia","name":"Nokia 1.3","os":"Android 10 (Go edition), upgradable to Android 11 (Go editio","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":295,"inches":5.71,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_2_v_tella","brand":"Nokia","name":"Nokia 2 V Tella","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_2.4","brand":"Nokia","name":"Nokia 2.4","os":"Android 10, upgradable to Android 11","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_3_v","brand":"Nokia","name":"Nokia 3 V","os":"Android 9.0 (Pie), upgradable to Android 10, Android One","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":269,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_3.4","brand":"Nokia","name":"Nokia 3.4","os":"Android 10, upgradable to Android 11","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":269,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_5.3","brand":"Nokia","name":"Nokia 5.3","os":"Android 10, upgradable to Android 11, Android One","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":268,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_5.4","brand":"Nokia","name":"Nokia 5.4","os":"Android 10, upgradable to Android 12","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":269,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_8_v_5g_uw","brand":"Nokia","name":"Nokia 8 V 5G UW","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":386,"inches":6.81,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_8.3_5g","brand":"Nokia","name":"Nokia 8.3 5G","os":"Android 10, upgradable to Android 12, Android One","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":386,"inches":6.81,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c1_plus","brand":"Nokia","name":"Nokia C1 Plus","os":"Android 10 (Go edition)","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c2","brand":"Nokia","name":"Nokia C2","os":"Android 9.0 Pie (Go edition)","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c2_tava","brand":"Nokia","name":"Nokia C2 Tava","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c2_tennen","brand":"Nokia","name":"Nokia C2 Tennen","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c3","brand":"Nokia","name":"Nokia C3","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":269,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c5_endi","brand":"Nokia","name":"Nokia C5 Endi","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_8","brand":"Oneplus","name":"OnePlus 8","os":"Android 10, upgradable to Android 13, OxygenOS 13","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_8_5g_t-mobile","brand":"Oneplus","name":"OnePlus 8 5G (T-Mobile)","os":"Android 10, OxygenOS 10.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_8_5g_uw_verizon","brand":"Oneplus","name":"OnePlus 8 5G UW (Verizon)","os":"Android 10, OxygenOS 10.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_8_pro","brand":"Oneplus","name":"OnePlus 8 Pro","os":"Android 10, upgradable to Android 13, OxygenOS 13","year":2020,"form":"Phone","tablet":false,"w":1440,"h":3168,"ppi":513,"inches":6.78,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_8t","brand":"Oneplus","name":"OnePlus 8T","os":"Android 11, upgradable to Android 14, OxygenOS 14","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_8t+_5g","brand":"Oneplus","name":"OnePlus 8T+ 5G","os":"Android 11, OxygenOS 11","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_nord","brand":"Oneplus","name":"OnePlus Nord","os":"Android 10, upgradable to Android 12, OxygenOS 12","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":408,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_nord_n10_5g","brand":"Oneplus","name":"OnePlus Nord N10 5G","os":"Android 10, OxygenOS 10.5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":406,"inches":6.49,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_nord_n100","brand":"Oneplus","name":"OnePlus Nord N100","os":"Android 10, OxygenOS 10.5.9","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a11k","brand":"Oppo","name":"Oppo A11k","os":"Android 9.0 (Pie), ColorOS 6.1","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a12","brand":"Oppo","name":"Oppo A12","os":"Android 9.0 (Pie), ColorOS 6.1","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a12e","brand":"Oppo","name":"Oppo A12e","os":"Android 8.1 (Oreo), ColorOS 5.1","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a12s","brand":"Oppo","name":"Oppo A12s","os":"Android 9.0 (Pie), ColorOS 6.1","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a15","brand":"Oppo","name":"Oppo A15","os":"Android 10, ColorOS 7.2","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a15s","brand":"Oppo","name":"Oppo A15s","os":"Android 10, ColorOS 7.2","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a31","brand":"Oppo","name":"Oppo A31","os":"Android 9.0 (Pie), ColorOS 6.1","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a32","brand":"Oppo","name":"Oppo A32","os":"Android 10, ColorOS 7.2","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a33_2020","brand":"Oppo","name":"Oppo A33 (2020)","os":"Android 10, ColorOS 7.2","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a52","brand":"Oppo","name":"Oppo A52","os":"Android 10, ColorOS 7.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a53","brand":"Oppo","name":"Oppo A53","os":"Android 10, upgradable to Android 11","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a53_5g","brand":"Oppo","name":"Oppo A53 5G","os":"Android 10, ColorOS 7.2","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a53s","brand":"Oppo","name":"Oppo A53s","os":"Android 10, ColorOS 7.2","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a72","brand":"Oppo","name":"Oppo A72","os":"Android 10, ColorOS 7.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a72_5g","brand":"Oppo","name":"Oppo A72 5G","os":"Android 10, ColorOS 7.2","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a73","brand":"Oppo","name":"Oppo A73","os":"Android 10, ColorOS 7.2","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a73_5g","brand":"Oppo","name":"Oppo A73 5G","os":"Android 10, upgradable to Android 12, ColorOS 12","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a92","brand":"Oppo","name":"Oppo A92","os":"Android 10, ColorOS 7.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a92s","brand":"Oppo","name":"Oppo A92s","os":"Android 10, ColorOS 7.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":401,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a93","brand":"Oppo","name":"Oppo A93","os":"Android 10, ColorOS 7.2","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_ace2","brand":"Oppo","name":"Oppo Ace2","os":"Android 10, ColorOS 7.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f15","brand":"Oppo","name":"Oppo F15","os":"Android 9.0 (Pie), upgradable to Android 11, ColorOS 11.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":408,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f17","brand":"Oppo","name":"Oppo F17","os":"Android 10, ColorOS 7.2","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f17_pro","brand":"Oppo","name":"Oppo F17 Pro","os":"Android 10, ColorOS 7.2","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":408,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_x2","brand":"Oppo","name":"Oppo Find X2","os":"Android 10, ColorOS 7.1","year":2020,"form":"Phone","tablet":false,"w":1440,"h":3168,"ppi":513,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_x2_lite","brand":"Oppo","name":"Oppo Find X2 Lite","os":"Android 10, ColorOS 7","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":408,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_x2_neo","brand":"Oppo","name":"Oppo Find X2 Neo","os":"Android 10, ColorOS 7","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_x2_pro","brand":"Oppo","name":"Oppo Find X2 Pro","os":"Android 10, ColorOS 7.1","year":2020,"form":"Phone","tablet":false,"w":1440,"h":3168,"ppi":513,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_k7_5g","brand":"Oppo","name":"Oppo K7 5G","os":"Android 10, ColorOS 7","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_k7x","brand":"Oppo","name":"Oppo K7x","os":"Android 10, ColorOS 7.2","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno3","brand":"Oppo","name":"Oppo Reno3","os":"Android 10, ColorOS 7","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno3_pro","brand":"Oppo","name":"Oppo Reno3 Pro","os":"Android 10, ColorOS 7","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno3_youth","brand":"Oppo","name":"Oppo Reno3 Youth","os":"Android 10, ColorOS 7","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno4","brand":"Oppo","name":"Oppo Reno4","os":"Android 10, ColorOS 7.2","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno4_5g","brand":"Oppo","name":"Oppo Reno4 5G","os":"Android 10, ColorOS 7.2","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno4_f","brand":"Oppo","name":"Oppo Reno4 F","os":"Android 10, ColorOS 7.2","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno4_lite","brand":"Oppo","name":"Oppo Reno4 Lite","os":"Android 10, ColorOS 7.2","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno4_pro","brand":"Oppo","name":"Oppo Reno4 Pro","os":"Android 10, ColorOS 7.2","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno4_pro_5g","brand":"Oppo","name":"Oppo Reno4 Pro 5G","os":"Android 10, ColorOS 7.2","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno4_se","brand":"Oppo","name":"Oppo Reno4 SE","os":"Android 10, ColorOS 7.2","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno4_z_5g","brand":"Oppo","name":"Oppo Reno4 Z 5G","os":"Android 10, upgradable to Android 11, ColorOS 11.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":401,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno5_4g","brand":"Oppo","name":"Oppo Reno5 4G","os":"Android 11, upgradable to Android 12, ColorOS 12","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno5_5g","brand":"Oppo","name":"Oppo Reno5 5G","os":"Android 11, upgradable to Android 12, ColorOS 12","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno5_pro_5g","brand":"Oppo","name":"Oppo Reno5 Pro 5G","os":"Android 11, upgradable to Android 12, ColorOS 12","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno5_pro+_5g","brand":"Oppo","name":"Oppo Reno5 Pro+ 5G","os":"Android 11, ColorOS 11.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_5i","brand":"Realme","name":"Realme 5i","os":"Android 9.0 (Pie), upgradable to Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_6","brand":"Realme","name":"Realme 6","os":"Android 10, upgradable to Android 11, Realme UI","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_6_pro","brand":"Realme","name":"Realme 6 Pro","os":"Android 10, upgradable to Android 11, Realme UI 2.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":399,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_6i","brand":"Realme","name":"Realme 6i","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_6i_india","brand":"Realme","name":"Realme 6i (India)","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_6s","brand":"Realme","name":"Realme 6S","os":"Android 11, Realme UI 2.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_7","brand":"Realme","name":"Realme 7","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_7_asia","brand":"Realme","name":"Realme 7 (Asia)","os":"Android 10, upgradable to Android 11, Realme UI 2.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_7_5g","brand":"Realme","name":"Realme 7 5G","os":"Android 10, upgradable to Android 12, Realme UI 3.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_7_pro","brand":"Realme","name":"Realme 7 Pro","os":"Android 10, upgradable to Android 12, Realme UI 3.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_7i","brand":"Realme","name":"Realme 7i","os":"Android 10, upgradable to Android 11, Realme UI 2.0","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_7i_global","brand":"Realme","name":"Realme 7i (Global)","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c11","brand":"Realme","name":"Realme C11","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":264,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c12","brand":"Realme","name":"Realme C12","os":"Android 10, upgradable to Android 11, Realme UI 2.0","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":264,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c15","brand":"Realme","name":"Realme C15","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c15_qualcomm_edition","brand":"Realme","name":"Realme C15 Qualcomm Edition","os":"Android 10, upgradable to Android 11, Realme UI 2.0","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c17","brand":"Realme","name":"Realme C17","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c2s","brand":"Realme","name":"Realme C2s","os":"Android 9.0 (Pie), ColorOS 6.1","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c3","brand":"Realme","name":"Realme C3","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c3_3_cameras","brand":"Realme","name":"Realme C3 (3 cameras)","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c3i","brand":"Realme","name":"Realme C3i","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo","brand":"Realme","name":"Realme Narzo","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_10","brand":"Realme","name":"Realme Narzo 10","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_10a","brand":"Realme","name":"Realme Narzo 10A","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_20","brand":"Realme","name":"Realme Narzo 20","os":"Android 10, upgradable to Android 11, Realme UI 2.0","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_20_pro","brand":"Realme","name":"Realme Narzo 20 Pro","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_narzo_20a","brand":"Realme","name":"Realme Narzo 20A","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_q2","brand":"Realme","name":"Realme Q2","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_q2_pro","brand":"Realme","name":"Realme Q2 Pro","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_q2i","brand":"Realme","name":"Realme Q2i","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_v3","brand":"Realme","name":"Realme V3","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_v5_5g","brand":"Realme","name":"Realme V5 5G","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_x3","brand":"Realme","name":"Realme X3","os":"Android 10, upgradable to Android 11, Realme UI 2.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":399,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_x3_superzoom","brand":"Realme","name":"Realme X3 SuperZoom","os":"Android 10, upgradable to Android 11, Realme UI 2.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":399,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_x50_5g","brand":"Realme","name":"Realme X50 5G","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":401,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_x50_5g_china","brand":"Realme","name":"Realme X50 5G (China)","os":"Android 10, ColorOS 7","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":401,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_x50_pro_5g","brand":"Realme","name":"Realme X50 Pro 5G","os":"Android 10, upgradable to Android 11, Realme UI 2.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_x50_pro_player","brand":"Realme","name":"Realme X50 Pro Player","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_x50m_5g","brand":"Realme","name":"Realme X50m 5G","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":399,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_x7","brand":"Realme","name":"Realme X7","os":"Android 10, Realme UI","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_x7_pro","brand":"Realme","name":"Realme X7 Pro","os":"Android 10, upgradable to Android 11, Realme UI 2.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a_quantum","brand":"Samsung","name":"Samsung Galaxy A Quantum","os":"Android 10, One UI 2","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a01_core","brand":"Samsung","name":"Samsung Galaxy A01 Core","os":"Android 10 (Go edition)","year":2020,"form":"Phone","tablet":false,"w":720,"h":1480,"ppi":311,"inches":5.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a02s","brand":"Samsung","name":"Samsung Galaxy A02s","os":"Android 10, upgradable to Android 12, One UI 4.1","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a11","brand":"Samsung","name":"Samsung Galaxy A11","os":"Android 10, upgradable to Android 12, One UI Core 4.1","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":268,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a12","brand":"Samsung","name":"Samsung Galaxy A12","os":"Android 10, upgradable to Android 12, One UI 4.1","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a21","brand":"Samsung","name":"Samsung Galaxy A21","os":"Android 10, One UI 2.0","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a21s","brand":"Samsung","name":"Samsung Galaxy A21s","os":"Android 10, upgradable to Android 12, One UI 4.1","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a31","brand":"Samsung","name":"Samsung Galaxy A31","os":"Android 10, up to Android 12, One UI 4.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":411,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a41","brand":"Samsung","name":"Samsung Galaxy A41","os":"Android 10, upgradable to Android 12, One UI 4.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":431,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a42_5g","brand":"Samsung","name":"Samsung Galaxy A42 5G","os":"Android 10, upgradable to Android 13, One UI 5","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a51_5g","brand":"Samsung","name":"Samsung Galaxy A51 5G","os":"Android 10, upgradable to Android 13, One UI 5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a51_5g_uw","brand":"Samsung","name":"Samsung Galaxy A51 5G UW","os":"Android 10, One UI 2","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a71_5g","brand":"Samsung","name":"Samsung Galaxy A71 5G","os":"Android 10, upgradable to Android 13, One UI 5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a71_5g_uw","brand":"Samsung","name":"Samsung Galaxy A71 5G UW","os":"Android 10, One UI 2.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_f41","brand":"Samsung","name":"Samsung Galaxy F41","os":"Android 10, upgradable to Android 11, One UI 3.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j2_core_2020","brand":"Samsung","name":"Samsung Galaxy J2 Core (2020)","os":"Android 8.1 Oreo (Go edition)","year":2020,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m01","brand":"Samsung","name":"Samsung Galaxy M01","os":"Android 10, upgradable to Android 11, One UI 3.1","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":294,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m01_core","brand":"Samsung","name":"Samsung Galaxy M01 Core","os":"Android 10 (Go edition)","year":2020,"form":"Phone","tablet":false,"w":720,"h":1480,"ppi":311,"inches":5.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m01s","brand":"Samsung","name":"Samsung Galaxy M01s","os":"Android 9.0 (Pie), upgradable to Android 10, One UI 2.1","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m11","brand":"Samsung","name":"Samsung Galaxy M11","os":"Android 10, upgradable to Android 12, One UI 4.1","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":268,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m21","brand":"Samsung","name":"Samsung Galaxy M21","os":"Android 10, upgradable to Android 11, One UI 3.1 Core","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m21s","brand":"Samsung","name":"Samsung Galaxy M21s","os":"Android 10, One UI 2.5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m31","brand":"Samsung","name":"Samsung Galaxy M31","os":"Android 10, upgradable to Android 12, One UI 4.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m31_prime","brand":"Samsung","name":"Samsung Galaxy M31 Prime","os":"Android 10, One UI 2.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m31s","brand":"Samsung","name":"Samsung Galaxy M31s","os":"Android 10, upgradable to Android 12, One UI 4.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m51","brand":"Samsung","name":"Samsung Galaxy M51","os":"Android 10, upgradable to Android 12, One UI 4.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note10_lite","brand":"Samsung","name":"Samsung Galaxy Note10 Lite","os":"Android 10, upgradable to Android 13, One UI 5.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note20","brand":"Samsung","name":"Samsung Galaxy Note20","os":"Android 10, upgradable to Android 13, One UI 5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note20_5g","brand":"Samsung","name":"Samsung Galaxy Note20 5G","os":"Android 10, upgradable to Android 13, One UI 5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note20_ultra","brand":"Samsung","name":"Samsung Galaxy Note20 Ultra","os":"Android 10, upgradable to Android 13, One UI 5","year":2020,"form":"Phone","tablet":false,"w":1440,"h":3088,"ppi":496,"inches":6.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note20_ultra_5g","brand":"Samsung","name":"Samsung Galaxy Note20 Ultra 5G","os":"Android 10, upgradable to Android 13, One UI 5","year":2020,"form":"Phone","tablet":false,"w":1440,"h":3088,"ppi":496,"inches":6.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s10_lite","brand":"Samsung","name":"Samsung Galaxy S10 Lite","os":"Android 10, upgradable to Android 13, One UI 5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":394,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s20","brand":"Samsung","name":"Samsung Galaxy S20","os":"Android 10, upgradable to Android 13, One UI 5","year":2020,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":563,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s20_5g","brand":"Samsung","name":"Samsung Galaxy S20 5G","os":"Android 10, upgradable to Android 13, One UI 5.1","year":2020,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":563,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s20_5g_uw","brand":"Samsung","name":"Samsung Galaxy S20 5G UW","os":"Android 10, One UI 2.5","year":2020,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":566,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s20_fe","brand":"Samsung","name":"Samsung Galaxy S20 FE","os":"Android 10, upgradable to Android 13, One UI 5.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":407,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s20_fe_5g","brand":"Samsung","name":"Samsung Galaxy S20 FE 5G","os":"Android 10, upgradable to Android 13, One UI 5.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":407,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s20_ultra","brand":"Samsung","name":"Samsung Galaxy S20 Ultra","os":"Android 10, upgradable to Android 13, One UI 5","year":2020,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":511,"inches":6.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s20_ultra_5g","brand":"Samsung","name":"Samsung Galaxy S20 Ultra 5G","os":"Android 10, upgradable to Android 13, One UI 5.1","year":2020,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":511,"inches":6.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s20+","brand":"Samsung","name":"Samsung Galaxy S20+","os":"Android 10, upgradable to Android 13, One UI 5","year":2020,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":525,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s20+_5g","brand":"Samsung","name":"Samsung Galaxy S20+ 5G","os":"Android 10, upgradable to Android 13, One UI 5.1","year":2020,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":525,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_a_8.4_2020","brand":"Samsung","name":"Samsung Galaxy Tab A 8.4 (2020)","os":"Android 10, upgradable to Android 11, One UI 3.1","year":2020,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":270,"inches":8.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_a7_10.4_2020","brand":"Samsung","name":"Samsung Galaxy Tab A7 10.4 (2020)","os":"Android 10, upgradable to Android 12, One UI 4","year":2020,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":224,"inches":10.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_active3","brand":"Samsung","name":"Samsung Galaxy Tab Active3","os":"Android 10, upgradable to Android 12, One UI 4.1","year":2020,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":283,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s6_5g","brand":"Samsung","name":"Samsung Galaxy Tab S6 5G","os":"Android 10, One UI 2","year":2020,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":287,"inches":10.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s6_lite_2020","brand":"Samsung","name":"Samsung Galaxy Tab S6 Lite (2020)","os":"Android 10, upgradable to Android 13, One UI 5","year":2020,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":224,"inches":10.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s7","brand":"Samsung","name":"Samsung Galaxy Tab S7","os":"Android 10, upgradable to Android 13, One UI 5.1","year":2020,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":274,"inches":11.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s7+","brand":"Samsung","name":"Samsung Galaxy Tab S7+","os":"Android 10, upgradable to Android 13, One UI 5.1","year":2020,"form":"Tablet","tablet":true,"w":1752,"h":2800,"ppi":266,"inches":12.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_xcover_pro","brand":"Samsung","name":"Samsung Galaxy XCover Pro","os":"Android 10, upgradable to Android 13, One UI 5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_z_flip","brand":"Samsung","name":"Samsung Galaxy Z Flip","os":"Android 10, upgradable to Android 12, One UI 4.1.1","year":2020,"form":"Foldable","tablet":false,"w":1080,"h":2636,"ppi":425,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_z_flip_5g","brand":"Samsung","name":"Samsung Galaxy Z Flip 5G","os":"Android 10, upgradable to Android 13, One UI 5","year":2020,"form":"Foldable","tablet":false,"w":1080,"h":2636,"ppi":425,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_z_fold2_5g","brand":"Samsung","name":"Samsung Galaxy Z Fold2 5G","os":"Android 10, up to Android 13, One UI 5.1.1","year":2020,"form":"Foldable","tablet":true,"w":1768,"h":2208,"ppi":373,"inches":7.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_r5g","brand":"Sharp","name":"Sharp Aquos R5G","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1440,"h":3168,"ppi":544,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_sense4_plus","brand":"Sharp","name":"Sharp Aquos sense4 plus","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_sense5g","brand":"Sharp","name":"Sharp Aquos sense5G","os":"Android 11","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":435,"inches":5.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_zero_2","brand":"Sharp","name":"Sharp Aquos Zero 2","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_1_ii","brand":"Sony","name":"Sony Xperia 1 II","os":"Android 10, upgradable to Android 12","year":2020,"form":"Phone","tablet":false,"w":1644,"h":3840,"ppi":643,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_10_ii","brand":"Sony","name":"Sony Xperia 10 II","os":"Android 10, upgradable to Android 12","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2520,"ppi":457,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_5_ii","brand":"Sony","name":"Sony Xperia 5 II","os":"Android 10, upgradable to Android 12","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2520,"ppi":449,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_l4","brand":"Sony","name":"Sony Xperia L4","os":"Android 9.0 (Pie)","year":2020,"form":"Phone","tablet":false,"w":720,"h":1680,"ppi":295,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_pro","brand":"Sony","name":"Sony Xperia Pro","os":"Android 10, upgradable to Android 12","year":2020,"form":"Phone","tablet":false,"w":1644,"h":3840,"ppi":643,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_10_5g","brand":"Tcl","name":"TCL 10 5G","os":"Android 10, TCL UI","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_10_5g_uw","brand":"Tcl","name":"TCL 10 5G UW","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_10_plus","brand":"Tcl","name":"TCL 10 Plus","os":"Android 10, TCL UI","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":398,"inches":6.47,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_10_pro","brand":"Tcl","name":"TCL 10 Pro","os":"Android 10, planned upgrade to Android 11, TCL UI","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":398,"inches":6.47,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_10_se","brand":"Tcl","name":"TCL 10 SE","os":"Android 10, TCL UI","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_10_tabmax","brand":"Tcl","name":"TCL 10 TabMax","os":"Android 10, TCL UI","year":2020,"form":"Tablet","tablet":true,"w":1200,"h":2000,"ppi":225,"inches":10.36,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_10_tabmid","brand":"Tcl","name":"TCL 10 TabMid","os":"Android 10, TCL UI","year":2020,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":283,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_10l","brand":"Tcl","name":"TCL 10L","os":"Android 10, upgradable to Android 11, TCL UI","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_20_5g","brand":"Tcl","name":"TCL 20 5G","os":"Android 10, TCL UI","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_camon_15","brand":"Tecno","name":"Tecno Camon 15","os":"Android 10, HIOS 6.0","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_15_air","brand":"Tecno","name":"Tecno Camon 15 Air","os":"Android 10, HIOS 6.0","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_15_premier","brand":"Tecno","name":"Tecno Camon 15 Premier","os":"Android 10, HIOS 6.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":390,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_15_pro","brand":"Tecno","name":"Tecno Camon 15 Pro","os":"Android 10, HIOS 6.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":390,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_16","brand":"Tecno","name":"Tecno Camon 16","os":"Android 10, HIOS 6.0","year":2020,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.8,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_16_premier","brand":"Tecno","name":"Tecno Camon 16 Premier","os":"Android 10, HIOS 6.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":392,"inches":6.85,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_16_pro","brand":"Tecno","name":"Tecno Camon 16 Pro","os":"Android 10, HIOS 7.0","year":2020,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.8,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_16_s","brand":"Tecno","name":"Tecno Camon 16 S","os":"Android 10, HIOS 6.2","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pop_4","brand":"Tecno","name":"Tecno Pop 4","os":"Android 10 (Go edition), HIOS","year":2020,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":179,"inches":6.0,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pouvoir_4","brand":"Tecno","name":"Tecno Pouvoir 4","os":"Android 10, HIOS 6.0","year":2020,"form":"Tablet","tablet":true,"w":720,"h":1640,"ppi":256,"inches":7.0,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"tecno_tecno_pouvoir_4_pro","brand":"Tecno","name":"Tecno Pouvoir 4 Pro","os":"Android 10, HIOS 6.0","year":2020,"form":"Tablet","tablet":true,"w":720,"h":1640,"ppi":256,"inches":7.0,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"tecno_tecno_pova","brand":"Tecno","name":"Tecno Pova","os":"Android 10, HIOS 7.0","year":2020,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.8,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_5","brand":"Tecno","name":"Tecno Spark 5","os":"Android 10, HIOS 6.1","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_5_air","brand":"Tecno","name":"Tecno Spark 5 Air","os":"Android 10 (Go edition), HIOS 6.0","year":2020,"form":"Tablet","tablet":true,"w":720,"h":1640,"ppi":256,"inches":7.0,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"tecno_tecno_spark_5_pro","brand":"Tecno","name":"Tecno Spark 5 pro","os":"Android 10, HIOS 6.1","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_6","brand":"Tecno","name":"Tecno Spark 6","os":"Android 10, HIOS 7.0","year":2020,"form":"Phone","tablet":false,"w":720,"h":1640,"ppi":263,"inches":6.8,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_6_air","brand":"Tecno","name":"Tecno Spark 6 Air","os":"Android 10 (Go edition), HiOS 6.2","year":2020,"form":"Tablet","tablet":true,"w":720,"h":1640,"ppi":256,"inches":7.0,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"tecno_tecno_spark_6_go","brand":"Tecno","name":"Tecno Spark 6 Go","os":"Android 10 (Go edition), HIOS 6.2","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_go_2020","brand":"Tecno","name":"Tecno Spark Go 2020","os":"Android 10 (Go edition), HIOS 6.2","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_power_2","brand":"Tecno","name":"Tecno Spark Power 2","os":"Android 10, HIOS 6.1","year":2020,"form":"Tablet","tablet":true,"w":720,"h":1640,"ppi":256,"inches":7.0,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"ulefone__ulefone_armor_10_5g","brand":"Ulefone_","name":"Ulefone Armor 10 5G","os":"Android 10, planned upgrade to Android 11","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_7e","brand":"Ulefone_","name":"Ulefone Armor 7E","os":"Android 9.0 (Pie)","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_8","brand":"Ulefone_","name":"Ulefone Armor 8","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_8_5g","brand":"Ulefone_","name":"Ulefone Armor 8 5G","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_9","brand":"Ulefone_","name":"Ulefone Armor 9","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_9e","brand":"Ulefone_","name":"Ulefone Armor 9E","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_x5_pro","brand":"Ulefone_","name":"Ulefone Armor X5 Pro","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_x7","brand":"Ulefone_","name":"Ulefone Armor X7","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_x7_pro","brand":"Ulefone_","name":"Ulefone Armor X7 Pro","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_x8","brand":"Ulefone_","name":"Ulefone Armor X8","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_note_7t","brand":"Ulefone_","name":"Ulefone Note 7T","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":600,"h":1280,"ppi":232,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_note_8","brand":"Ulefone_","name":"Ulefone Note 8","os":"Android 10 (Go edition)","year":2020,"form":"Phone","tablet":false,"w":442,"h":960,"ppi":192,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_note_8p","brand":"Ulefone_","name":"Ulefone Note 8P","os":"Android 10 (Go edition)","year":2020,"form":"Phone","tablet":false,"w":442,"h":960,"ppi":192,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_note_9p","brand":"Ulefone_","name":"Ulefone Note 9P","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_a9_pro","brand":"Umidigi","name":"Umidigi A9 Pro","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_bison","brand":"Umidigi","name":"Umidigi Bison","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_3_5g","brand":"Vivo","name":"vivo iQOO 3 5G","os":"Android 10, iQOO UI 1.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_5_5g","brand":"Vivo","name":"vivo iQOO 5 5G","os":"Android 10, IQOO UI 1.5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":398,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_5_pro_5g","brand":"Vivo","name":"vivo iQOO 5 Pro 5G","os":"Android 10, IQOO UI 1.5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":398,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo3_5g","brand":"Vivo","name":"vivo iQOO Neo3 5G","os":"Android 10, iQOO UI 1.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":402,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_u1","brand":"Vivo","name":"vivo iQOO U1","os":"Android 10, iQOO UI 1.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_u1x","brand":"Vivo","name":"vivo iQOO U1x","os":"Android 10, IQOO UI 1.0","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_u3","brand":"Vivo","name":"vivo iQOO U3","os":"Android 10, IQOO UI 1.5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z1","brand":"Vivo","name":"vivo iQOO Z1","os":"Android 10, iQOO UI 1.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":402,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_z1x","brand":"Vivo","name":"vivo iQOO Z1x","os":"Android 10, iQOO UI 1.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":400,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_nex_3s_5g","brand":"Vivo","name":"vivo NEX 3S 5G","os":"Android 10, Funtouch 10.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2256,"ppi":363,"inches":6.89,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s1_prime","brand":"Vivo","name":"vivo S1 Prime","os":"Android 9.0 (Pie), Funtouch 9.2","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":404,"inches":6.38,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s6_5g","brand":"Vivo","name":"vivo S6 5G","os":"Android 10, Funtouch 10.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s7","brand":"Vivo","name":"vivo S7","os":"Android 10, Funtouch 10.5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s7e","brand":"Vivo","name":"vivo S7e","os":"Android 10, Funtouch 10.5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v19","brand":"Vivo","name":"vivo V19","os":"Android 10, Funtouch 10.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v19_indonesia","brand":"Vivo","name":"vivo V19 (Indonesia)","os":"Android 10, Funtouch 10.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v19_neo","brand":"Vivo","name":"vivo V19 Neo","os":"Android 9.0 (Pie), Funtouch 9.2","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v20","brand":"Vivo","name":"vivo V20","os":"Android 11, Funtouch 11","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v20_2021","brand":"Vivo","name":"vivo V20 2021","os":"Android 11, upgradable to Android 12, Funtouch 12","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v20_pro","brand":"Vivo","name":"vivo V20 Pro","os":"Android 10, upgradable to Android 11, Funtouch 11","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v20_se","brand":"Vivo","name":"vivo V20 SE","os":"Android 10, Funtouch 11","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x50","brand":"Vivo","name":"vivo X50","os":"Android 10, Funtouch 10.5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":398,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x50_5g","brand":"Vivo","name":"vivo X50 5G","os":"Android 10, Funtouch 10.5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":398,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x50_lite","brand":"Vivo","name":"vivo X50 Lite","os":"Android 10, Funtouch 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":404,"inches":6.38,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x50_pro","brand":"Vivo","name":"vivo X50 Pro","os":"Android 10, Funtouch 10.5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":398,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x50_pro+","brand":"Vivo","name":"vivo X50 Pro+","os":"Android 10, Funtouch 10.5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":398,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x50e","brand":"Vivo","name":"vivo X50e","os":"Android 10, Funtouch 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x60_china","brand":"Vivo","name":"vivo X60 (China)","os":"Android 11, OriginOS 1.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":398,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x60_pro_china","brand":"Vivo","name":"vivo X60 Pro (China)","os":"Android 11, OriginOS 1.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2376,"ppi":398,"inches":6.56,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y11s","brand":"Vivo","name":"vivo Y11s","os":"Android 10, Funtouch 11","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y12i","brand":"Vivo","name":"vivo Y12i","os":"Android 9.0 (Pie), Funtouch 9.1","year":2020,"form":"Phone","tablet":false,"w":720,"h":1544,"ppi":268,"inches":6.35,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y12s","brand":"Vivo","name":"vivo Y12s","os":"Android 10, Funtouch 11","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y1s","brand":"Vivo","name":"vivo Y1s","os":"Android 10, Funtouch 10.5","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y20","brand":"Vivo","name":"vivo Y20","os":"Android 10, Funtouch 10.5","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y20_2021","brand":"Vivo","name":"vivo Y20 2021","os":"Android 10, Funtouch 11","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y20a","brand":"Vivo","name":"vivo Y20a","os":"Android 10, Funtouch 11","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y20i","brand":"Vivo","name":"vivo Y20i","os":"Android 10, Funtouch 10.5","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y20s","brand":"Vivo","name":"vivo Y20s","os":"Android 10, Funtouch 10.5 or Funtouch 11","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y30","brand":"Vivo","name":"vivo Y30","os":"Android 10, Funtouch 10.0","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":266,"inches":6.47,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y30_china","brand":"Vivo","name":"vivo Y30 (China)","os":"Android 10, Funtouch 10.5","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y30_standard","brand":"Vivo","name":"vivo Y30 Standard","os":"Android 10, Funtouch 10.5","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.51,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y3s","brand":"Vivo","name":"vivo Y3s","os":"Android 9.0 (Pie), Funtouch 9","year":2020,"form":"Phone","tablet":false,"w":720,"h":1544,"ppi":268,"inches":6.35,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y50","brand":"Vivo","name":"vivo Y50","os":"Android 10, Funtouch 10.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":403,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y51_2020,_december","brand":"Vivo","name":"vivo Y51 (2020, December)","os":"Android 11, Funtouch 11","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y51_2020,_september","brand":"Vivo","name":"vivo Y51 (2020, September)","os":"Android 10, Funtouch 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":404,"inches":6.38,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y51s","brand":"Vivo","name":"vivo Y51s","os":"Android 10, Funtouch 10.5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y52s","brand":"Vivo","name":"vivo Y52s","os":"Android 10, Funtouch 10.5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2408,"ppi":401,"inches":6.58,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y70","brand":"Vivo","name":"vivo Y70","os":"Android 10, Funtouch 11","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y70s","brand":"Vivo","name":"vivo Y70s","os":"Android 10, Funtouch 10.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y73s","brand":"Vivo","name":"vivo Y73s","os":"Android 10, Funtouch 10.5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_z5x_2020","brand":"Vivo","name":"vivo Z5x (2020)","os":"Android 9.0 (Pie), upgradable to Android 10, Funtouch 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_z6_5g","brand":"Vivo","name":"vivo Z6 5G","os":"Android 10, Funtouch 10.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":401,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_black_shark_3","brand":"Xiaomi","name":"Xiaomi Black Shark 3","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_black_shark_3_pro","brand":"Xiaomi","name":"Xiaomi Black Shark 3 Pro","os":"Android 10","year":2020,"form":"Tablet","tablet":true,"w":1440,"h":3120,"ppi":484,"inches":7.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_black_shark_3s","brand":"Xiaomi","name":"Xiaomi Black Shark 3S","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_10_5g","brand":"Xiaomi","name":"Xiaomi Mi 10 5G","os":"Android 10, upgradable to Android 13, MIUI 14","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":386,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_10_lite_5g","brand":"Xiaomi","name":"Xiaomi Mi 10 Lite 5G","os":"Android 10, MIUI 12","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":401,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_10_pro_5g","brand":"Xiaomi","name":"Xiaomi Mi 10 Pro 5G","os":"Android 10, upgradable to Android 13, MIUI 14","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":386,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_10_ultra","brand":"Xiaomi","name":"Xiaomi Mi 10 Ultra","os":"Android 10, MIUI 12.5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":386,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_10_youth_5g","brand":"Xiaomi","name":"Xiaomi Mi 10 Youth 5G","os":"Android 10, MIUI 11","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":401,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_10t_5g","brand":"Xiaomi","name":"Xiaomi Mi 10T 5G","os":"Android 10, upgradable to Android 11, MIUI 12.5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_10t_lite_5g","brand":"Xiaomi","name":"Xiaomi Mi 10T Lite 5G","os":"Android 10, MIUI 12","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_10t_pro_5g","brand":"Xiaomi","name":"Xiaomi Mi 10T Pro 5G","os":"Android 10, upgradable to Android 11, MIUI 12.5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_11","brand":"Xiaomi","name":"Xiaomi Mi 11","os":"Android 11, upgradable to Android 14, HyperOS","year":2020,"form":"Phone","tablet":false,"w":1440,"h":3200,"ppi":515,"inches":6.81,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_note_10_lite","brand":"Xiaomi","name":"Xiaomi Mi Note 10 Lite","os":"Android 10, upgradable to Android 11, MIUI 12.5 E","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":398,"inches":6.47,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_c3","brand":"Xiaomi","name":"Xiaomi Poco C3","os":"Android 10, MIUI 12","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_f2_pro","brand":"Xiaomi","name":"Xiaomi Poco F2 Pro","os":"Android 10, upgradable to Android 12, MIUI 14","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_m2","brand":"Xiaomi","name":"Xiaomi Poco M2","os":"Android 10, MIUI 12","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_m2_pro","brand":"Xiaomi","name":"Xiaomi Poco M2 Pro","os":"Android 10, MIUI 12","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_m3","brand":"Xiaomi","name":"Xiaomi Poco M3","os":"Android 10, MIUI 12","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_x2","brand":"Xiaomi","name":"Xiaomi Poco X2","os":"Android 10, upgradable to Android 11, MIUI 12.5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_x3","brand":"Xiaomi","name":"Xiaomi Poco X3","os":"Android 10, MIUI 12","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_poco_x3_nfc","brand":"Xiaomi","name":"Xiaomi Poco X3 NFC","os":"Android 10, upgradable to Android 12, MIUI 14","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_10x_4g","brand":"Xiaomi","name":"Xiaomi Redmi 10X 4G","os":"Android 10, MIUI 11","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_10x_5g","brand":"Xiaomi","name":"Xiaomi Redmi 10X 5G","os":"Android 10, MIUI 11","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":401,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_10x_pro_5g","brand":"Xiaomi","name":"Xiaomi Redmi 10X Pro 5G","os":"Android 10, MIUI 11","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":401,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_8a_dual","brand":"Xiaomi","name":"Xiaomi Redmi 8A Dual","os":"Android 9.0 (Pie), upgradable to Android 10, MIUI 12","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_8a_pro","brand":"Xiaomi","name":"Xiaomi Redmi 8A Pro","os":"Android 9.0 (Pie), planned upgrade to Android 10, MIUI 12","year":2020,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_9","brand":"Xiaomi","name":"Xiaomi Redmi 9","os":"Android 10, upgradable to Android 12, MIUI 13","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_9_india","brand":"Xiaomi","name":"Xiaomi Redmi 9 (India)","os":"Android 10, MIUI 12","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_9_power","brand":"Xiaomi","name":"Xiaomi Redmi 9 Power","os":"Android 10, MIUI 12","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_9_prime","brand":"Xiaomi","name":"Xiaomi Redmi 9 Prime","os":"Android 10, MIUI 11","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_9a","brand":"Xiaomi","name":"Xiaomi Redmi 9A","os":"Android 10, up to Android 11, MIUI 12","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_9at","brand":"Xiaomi","name":"Xiaomi Redmi 9AT","os":"Android 10, MIUI 12","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_9c","brand":"Xiaomi","name":"Xiaomi Redmi 9C","os":"Android 10, MIUI 12","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_9c_nfc","brand":"Xiaomi","name":"Xiaomi Redmi 9C NFC","os":"Android 10, MIUI 12","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_9i","brand":"Xiaomi","name":"Xiaomi Redmi 9i","os":"Android 10, MIUI 12","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k30_5g_racing","brand":"Xiaomi","name":"Xiaomi Redmi K30 5G Racing","os":"Android 10, MIUI 11","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k30_pro","brand":"Xiaomi","name":"Xiaomi Redmi K30 Pro","os":"Android 10, MIUI 11","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k30_pro_zoom","brand":"Xiaomi","name":"Xiaomi Redmi K30 Pro Zoom","os":"Android 10, MIUI 11","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k30_ultra","brand":"Xiaomi","name":"Xiaomi Redmi K30 Ultra","os":"Android 10, MIUI 12","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k30i_5g","brand":"Xiaomi","name":"Xiaomi Redmi K30i 5G","os":"Android 10, MIUI 11","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k30s","brand":"Xiaomi","name":"Xiaomi Redmi K30S","os":"Android 10, MIUI 12","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_9","brand":"Xiaomi","name":"Xiaomi Redmi Note 9","os":"Android 10, upgradable to Android 11, MIUI 12.5 E","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_9_4g","brand":"Xiaomi","name":"Xiaomi Redmi Note 9 4G","os":"Android 10, MIUI 12","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_9_5g","brand":"Xiaomi","name":"Xiaomi Redmi Note 9 5G","os":"Android 10, MIUI 12","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_9_pro","brand":"Xiaomi","name":"Xiaomi Redmi Note 9 Pro","os":"Android 10, MIUI 11","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_9_pro_india","brand":"Xiaomi","name":"Xiaomi Redmi Note 9 Pro (India)","os":"Android 10, upgradable to Android 12, MIUI 13","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_9_pro_5g","brand":"Xiaomi","name":"Xiaomi Redmi Note 9 Pro 5G","os":"Android 10, MIUI 12","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_9_pro_max","brand":"Xiaomi","name":"Xiaomi Redmi Note 9 Pro Max","os":"Android 10, upgradable to Android 12, MIUI 13","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_9s","brand":"Xiaomi","name":"Xiaomi Redmi Note 9S","os":"Android 10, upgradable to Android 12, MIUI 14","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_avid_579","brand":"Zte","name":"ZTE Avid 579","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_10s_pro_5g","brand":"Zte","name":"ZTE Axon 10s Pro 5G","os":"Android 10, MiFavor 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":398,"inches":6.47,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_11_4g","brand":"Zte","name":"ZTE Axon 11 4G","os":"Android 10, MiFavor 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":398,"inches":6.47,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_11_5g","brand":"Zte","name":"ZTE Axon 11 5G","os":"Android 10, MiFavor 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":398,"inches":6.47,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_11_se_5g","brand":"Zte","name":"ZTE Axon 11 SE 5G","os":"Android 10, MiFavor 10.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_20_4g","brand":"Zte","name":"ZTE Axon 20 4G","os":"Android 10, MiFavor 10.5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":388,"inches":6.92,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_20_5g","brand":"Zte","name":"ZTE Axon 20 5G","os":"Android 10, MiFavor 10.5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":400,"inches":6.92,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_20_5g_extreme","brand":"Zte","name":"ZTE Axon 20 5G Extreme","os":"Android 10, MiFavor 10.5","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":388,"inches":6.92,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_20_5g","brand":"Zte","name":"ZTE Blade 20 5G","os":"Android 10, MiFavor 10.5","year":2020,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_20_pro_5g","brand":"Zte","name":"ZTE Blade 20 Pro 5G","os":"Android 10, MiFavor 10","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":398,"inches":6.47,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a3_joy","brand":"Zte","name":"ZTE Blade A3 Joy","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a3_prime","brand":"Zte","name":"ZTE Blade A3 Prime","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a3y","brand":"Zte","name":"ZTE Blade A3Y","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a5_2020","brand":"Zte","name":"ZTE Blade A5 2020","os":"Android 9.0/ Android 10 (Go edition)","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.09,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a7s_2020","brand":"Zte","name":"ZTE Blade A7s 2020","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":264,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v2020_5g","brand":"Zte","name":"ZTE Blade V2020 5G","os":"Android 10, MiFavor 10.1","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_gabb_z2","brand":"Zte","name":"ZTE Gabb Z2","os":"Android 10","year":2020,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_play","brand":"Zte","name":"ZTE nubia Play","os":"Android 10, nubia UI 8.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":388,"inches":6.65,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_5g","brand":"Zte","name":"ZTE nubia Red Magic 5G","os":"Android 10, Redmagic 3.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":388,"inches":6.65,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_5g_lite","brand":"Zte","name":"ZTE nubia Red Magic 5G Lite","os":"Android 10, nubia UI 8.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":388,"inches":6.65,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_5s","brand":"Zte","name":"ZTE nubia Red Magic 5S","os":"Android 10, Redmagic 3.0","year":2020,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":388,"inches":6.65,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_quest_5","brand":"Zte","name":"ZTE Quest 5","os":"Android 10 (Go Edition)","year":2020,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":215,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_1c_2019","brand":"Alcatel","name":"alcatel 1c (2019)","os":"Android 8.1 Oreo (Go edition)","year":2019,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":215,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_1s","brand":"Alcatel","name":"alcatel 1s","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_1v_2019","brand":"Alcatel","name":"alcatel 1v (2019)","os":"Android 9.0 Pie (Go edition)","year":2019,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":195,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_1x_2019","brand":"Alcatel","name":"alcatel 1x (2019)","os":"Android 8.1 (Oreo)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_3_2019","brand":"Alcatel","name":"alcatel 3 (2019)","os":"Android 8.1 (Oreo)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":289,"inches":5.94,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_3l","brand":"Alcatel","name":"alcatel 3L","os":"Android 8.1 (Oreo)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":289,"inches":5.94,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_3t_10","brand":"Alcatel","name":"alcatel 3T 10","os":"Android 8.1 (Oreo), upgradable to Android 9.0 (Pie)","year":2019,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":151,"inches":10.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_3v_2019","brand":"Alcatel","name":"alcatel 3v (2019)","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":240,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_3x_2019","brand":"Alcatel","name":"alcatel 3x (2019)","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_smart_tab_7","brand":"Alcatel","name":"alcatel Smart Tab 7","os":"Android 9.0 (Pie)","year":2019,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"apple_apple_ipad_10.2_2019","brand":"Apple","name":"Apple iPad 10.2 (2019)","os":"iOS 13, upgradable to iPadOS 18","year":2019,"form":"Tablet","tablet":true,"w":1620,"h":2160,"ppi":264,"inches":10.2,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_ipad_air_2019","brand":"Apple","name":"Apple iPad Air (2019)","os":"iOS 12.1.3, upgradable to iPadOS 18","year":2019,"form":"Tablet","tablet":true,"w":1668,"h":2224,"ppi":265,"inches":10.5,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_ipad_mini_2019","brand":"Apple","name":"Apple iPad mini (2019)","os":"iOS 12.1.3, upgradable to iPadOS 18","year":2019,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":324,"inches":7.9,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_iphone_11","brand":"Apple","name":"Apple iPhone 11","os":"iOS 13, upgradable to iOS 18","year":2019,"form":"Phone","tablet":false,"w":828,"h":1792,"ppi":326,"inches":6.1,"platform":"ios","hasNotch":true,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":47,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_11_pro","brand":"Apple","name":"Apple iPhone 11 Pro","os":"iOS 13, upgradable to iOS 18","year":2019,"form":"Phone","tablet":false,"w":1125,"h":2436,"ppi":458,"inches":5.8,"platform":"ios","hasNotch":true,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":47,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_11_pro_max","brand":"Apple","name":"Apple iPhone 11 Pro Max","os":"iOS 13, upgradable to iOS 18","year":2019,"form":"Phone","tablet":false,"w":1242,"h":2688,"ppi":458,"inches":6.5,"platform":"ios","hasNotch":true,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":47,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"asus_asus_rog_phone_ii_zs660kl","brand":"Asus","name":"Asus ROG Phone II ZS660KL","os":"Android 9.0 (Pie), ROG UI","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":391,"inches":6.59,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_6_zs630kl","brand":"Asus","name":"Asus Zenfone 6 ZS630KL","os":"Android 9.0 (Pie), upgradable to Android 11, ZenUI","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_live_l2","brand":"Asus","name":"Asus ZenFone Live (L2)","os":"Android 8.0 Oreo (Go edition), ZenUI 5","year":2019,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_max_plus_m2_zb634kl","brand":"Asus","name":"Asus Zenfone Max Plus (M2) ZB634KL","os":"Android 8.0 (Oreo)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2246,"ppi":398,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_max_shot_zb634kl","brand":"Asus","name":"Asus Zenfone Max Shot ZB634KL","os":"Android 8.0 (Oreo)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2246,"ppi":398,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bv5900","brand":"Blackview","name":"Blackview BV5900","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":295,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_bv9800_pro","brand":"Blackview","name":"Blackview BV9800 Pro","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cat_cat_s52","brand":"Cat","name":"Cat S52","os":"Android 9.0 (Pie), planned upgrade to Android 10","year":2019,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":285,"inches":5.65,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_energy_e401","brand":"Energizer","name":"Energizer Energy E401","os":"Android 8.0 Oreo (Go edition)","year":2019,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":245,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_energy_e551s","brand":"Energizer","name":"Energizer Energy E551S","os":"Android 8.0 Oreo (Go edition)","year":2019,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":178,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_hardcase_h501s","brand":"Energizer","name":"Energizer Hardcase H501S","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":215,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_hardcase_h570s","brand":"Energizer","name":"Energizer Hardcase H570S","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_hardcase_h591s","brand":"Energizer","name":"Energizer Hardcase H591S","os":"Android 8.1 (Oreo)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":368,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_power_max_p18k_pop","brand":"Energizer","name":"Energizer Power Max P18K Pop","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":407,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_power_max_p8100s","brand":"Energizer","name":"Energizer Power Max P8100S","os":"Android 9.0 (Pie)","year":2019,"form":"Foldable","tablet":true,"w":1536,"h":2048,"ppi":316,"inches":8.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_ultimate_u570s","brand":"Energizer","name":"Energizer Ultimate U570S","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":295,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_ultimate_u620s","brand":"Energizer","name":"Energizer Ultimate U620S","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":265,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_ultimate_u620s_pop","brand":"Energizer","name":"Energizer Ultimate U620S Pop","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":407,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_ultimate_u630s_pop","brand":"Energizer","name":"Energizer Ultimate U630S Pop","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1480,"ppi":261,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_ultimate_u650s","brand":"Energizer","name":"Energizer Ultimate U650S","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1480,"ppi":253,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_3a","brand":"Google","name":"Google Pixel 3a","os":"Android 9.0 (Pie), upgradable to Android 12","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2220,"ppi":441,"inches":5.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_3a_xl","brand":"Google","name":"Google Pixel 3a XL","os":"Android 9.0 (Pie), upgradable to Android 12","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_4","brand":"Google","name":"Google Pixel 4","os":"Android 10, upgradable to Android 13","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":444,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_4_xl","brand":"Google","name":"Google Pixel 4 XL","os":"Android 10, upgradable to Android 13","year":2019,"form":"Phone","tablet":false,"w":1440,"h":3040,"ppi":537,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_20","brand":"Honor","name":"Honor 20","os":"Android 9.0 (Pie), upgradable to Android 10, Magic UI 4.0","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":412,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_20_lite","brand":"Honor","name":"Honor 20 lite","os":"Android 9.0 (Pie), EMUI 9","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":415,"inches":6.21,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_20_lite_china","brand":"Honor","name":"Honor 20 lite (China)","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":418,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_20_pro","brand":"Honor","name":"Honor 20 Pro","os":"Android 9.0 (Pie), Magic 2.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":412,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_20i","brand":"Honor","name":"Honor 20i","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":415,"inches":6.21,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_20s","brand":"Honor","name":"Honor 20S","os":"Android 9.0 (Pie), Magic 2.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":412,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_8a_pro","brand":"Honor","name":"Honor 8A Pro","os":"Android 9.0 (Pie), EMUI 9","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.09,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_8s","brand":"Honor","name":"Honor 8S","os":"Android 9.0 (Pie), EMUI 9","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":295,"inches":5.71,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_9x","brand":"Honor","name":"Honor 9X","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":391,"inches":6.59,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_9x_china","brand":"Honor","name":"Honor 9X (China)","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":391,"inches":6.59,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_9x_pro","brand":"Honor","name":"Honor 9X Pro","os":"Android 9.0 (Pie), upgradable to Android 10, EMUI 9.1, no Go","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":391,"inches":6.59,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic_2_3d","brand":"Honor","name":"Honor Magic 2 3D","os":"Android 9.0 (Pie), EMUI 9 or Magic UI 2","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_pad_5_10.1","brand":"Honor","name":"Honor Pad 5 10.1","os":"Android 8.0 (Oreo), EMUI 8","year":2019,"form":"Tablet","tablet":true,"w":1920,"h":1200,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_pad_5_8","brand":"Honor","name":"Honor Pad 5 8","os":"Android 9.0 (Pie), Magic 2.0","year":2019,"form":"Tablet","tablet":true,"w":1920,"h":1200,"ppi":283,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play_3","brand":"Honor","name":"Honor Play 3","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":269,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play_3e","brand":"Honor","name":"Honor Play 3e","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":295,"inches":5.71,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play_8a","brand":"Honor","name":"Honor Play 8A","os":"Android 9.0 (Pie), EMUI 9","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.09,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_tab_5","brand":"Honor","name":"Honor Tab 5","os":"Android 9.0 (Pie), Magic 2","year":2019,"form":"Tablet","tablet":true,"w":1920,"h":1200,"ppi":283,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_v30","brand":"Honor","name":"Honor V30","os":"Android 10, Magic UI 3","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":400,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_v30_pro","brand":"Honor","name":"Honor V30 Pro","os":"Android 10, Magic UI 3, no Google Play Services","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":400,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_19s","brand":"Htc","name":"HTC Desire 19s","os":"Android 9 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_exodus_1s","brand":"Htc","name":"HTC Exodus 1s","os":"Android 8.1 (Oreo)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_u19e","brand":"Htc","name":"HTC U19e","os":"Android 9.0 (Pie), HTC Sense","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_wildfire_e","brand":"Htc","name":"HTC Wildfire E","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_wildfire_e1","brand":"Htc","name":"HTC Wildfire E1","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.09,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_wildfire_e1_plus","brand":"Htc","name":"HTC Wildfire E1 plus","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.09,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_wildfire_x","brand":"Htc","name":"HTC Wildfire X","os":"Android 9 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_enjoy_10","brand":"Huawei","name":"Huawei Enjoy 10","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":269,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_enjoy_10_plus","brand":"Huawei","name":"Huawei Enjoy 10 Plus","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":391,"inches":6.59,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_enjoy_10s","brand":"Huawei","name":"Huawei Enjoy 10s","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":418,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_enjoy_9s","brand":"Huawei","name":"Huawei Enjoy 9s","os":"Android 9.0 (Pie), EMUI 9","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":415,"inches":6.21,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_20_x_5g","brand":"Huawei","name":"Huawei Mate 20 X (5G)","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Tablet","tablet":true,"w":1080,"h":2244,"ppi":346,"inches":7.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_30","brand":"Huawei","name":"Huawei Mate 30","os":"Android 10, EMUI 10, no Google Play Services","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":389,"inches":6.62,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_30_5g","brand":"Huawei","name":"Huawei Mate 30 5G","os":"Android 10, EMUI 10, no Google Play Services","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":389,"inches":6.62,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_30_pro","brand":"Huawei","name":"Huawei Mate 30 Pro","os":"Android 10, EMUI 11, no Google Play Services","year":2019,"form":"Phone","tablet":false,"w":1176,"h":2400,"ppi":409,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_30_pro_5g","brand":"Huawei","name":"Huawei Mate 30 Pro 5G","os":"Android 10, EMUI 10, no Google Play Services","year":2019,"form":"Phone","tablet":false,"w":1176,"h":2400,"ppi":409,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_30_rs_porsche_design","brand":"Huawei","name":"Huawei Mate 30 RS Porsche Design","os":"Android 10, EMUI 10, no Google Play Services","year":2019,"form":"Phone","tablet":false,"w":1176,"h":2400,"ppi":409,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_x","brand":"Huawei","name":"Huawei Mate X","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Foldable","tablet":true,"w":2200,"h":2480,"ppi":414,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_matepad_pro_10.8_2019","brand":"Huawei","name":"Huawei MatePad Pro 10.8 (2019)","os":"Android 10, EMUI 10, no Google Play Services","year":2019,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":280,"inches":10.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_m5_lite_8","brand":"Huawei","name":"Huawei MediaPad M5 Lite 8","os":"Android 9.0 (Pie), EMUI 9.0","year":2019,"form":"Tablet","tablet":true,"w":1920,"h":1200,"ppi":283,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_m6_10.8","brand":"Huawei","name":"Huawei MediaPad M6 10.8","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":280,"inches":10.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_m6_8.4","brand":"Huawei","name":"Huawei MediaPad M6 8.4","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":359,"inches":8.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_m6_turbo_8.4","brand":"Huawei","name":"Huawei MediaPad M6 Turbo 8.4","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":359,"inches":8.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_4e","brand":"Huawei","name":"Huawei nova 4e","os":"Android 9.0 (Pie), EMUI 9.0","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2312,"ppi":415,"inches":6.15,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_5","brand":"Huawei","name":"Huawei nova 5","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_5_pro","brand":"Huawei","name":"Huawei nova 5 Pro","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_5i","brand":"Huawei","name":"Huawei nova 5i","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2310,"ppi":398,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_5i_pro","brand":"Huawei","name":"Huawei nova 5i Pro","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":412,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_5t","brand":"Huawei","name":"Huawei nova 5T","os":"Android 9.0 (Pie), upgradable to Android 10, EMUI 10","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":412,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_5z","brand":"Huawei","name":"Huawei nova 5z","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":412,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_6","brand":"Huawei","name":"Huawei nova 6","os":"Android 10, EMUI 10, no Google Play Services","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":401,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_6_5g","brand":"Huawei","name":"Huawei nova 6 5G","os":"Android 10, EMUI 10","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":401,"inches":6.57,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_6_se","brand":"Huawei","name":"Huawei nova 6 SE","os":"Android 10, EMUI 10, no Google Play Services","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2310,"ppi":398,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p_smart_pro_2019","brand":"Huawei","name":"Huawei P smart Pro 2019","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":391,"inches":6.59,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p_smart_z","brand":"Huawei","name":"Huawei P Smart Z","os":"Android 9.0 (Pie), upgradable to Android 10, EMUI 12","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":391,"inches":6.59,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p20_lite_2019","brand":"Huawei","name":"Huawei P20 lite (2019)","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2310,"ppi":398,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p30","brand":"Huawei","name":"Huawei P30","os":"Android 9.0 (Pie), upgradable to Android 10, EMUI 10","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":422,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p30_lite","brand":"Huawei","name":"Huawei P30 lite","os":"Android 9.0 (Pie), upgradable to Android 10, EMUI 10.0","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2312,"ppi":415,"inches":6.15,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p30_pro","brand":"Huawei","name":"Huawei P30 Pro","os":"Android 9.0 (Pie), upgradable to Android 10, EMUI 10","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":398,"inches":6.47,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y5_2019","brand":"Huawei","name":"Huawei Y5 (2019)","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":295,"inches":5.71,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y6_2019","brand":"Huawei","name":"Huawei Y6 (2019)","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.09,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y6_pro_2019","brand":"Huawei","name":"Huawei Y6 Pro (2019)","os":"Android 9.0 (Pie), EMUI 9","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.09,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y7_2019","brand":"Huawei","name":"Huawei Y7 (2019)","os":"Android 8.1 (Oreo), EMUI 8.2","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":269,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y7_prime_2019","brand":"Huawei","name":"Huawei Y7 Prime (2019)","os":"Android 8.1 (Oreo), EMUI 8.2","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":269,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y7_pro_2019","brand":"Huawei","name":"Huawei Y7 Pro (2019)","os":"Android 8.1 (Oreo), EMUI 8.2","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":269,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y9_prime_2019","brand":"Huawei","name":"Huawei Y9 Prime (2019)","os":"Android 9.0 (Pie), upgradable to Android 10, Magic UI 2.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":391,"inches":6.59,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y9s","brand":"Huawei","name":"Huawei Y9s","os":"Android 9.0 (Pie), EMUI 9.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":391,"inches":6.59,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_7","brand":"Infinix","name":"Infinix Hot 7","os":"Android OS","year":2019,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":260,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_7_pro","brand":"Infinix","name":"Infinix Hot 7 Pro","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_8","brand":"Infinix","name":"Infinix Hot 8","os":"Android 10","year":2019,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_8_lite","brand":"Infinix","name":"Infinix Hot 8 Lite","os":"Android 8.1 Oreo (Go edition)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_6","brand":"Infinix","name":"Infinix Note 6","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.01,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_s4","brand":"Infinix","name":"Infinix S4","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_s5","brand":"Infinix","name":"Infinix S5","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_s5_lite","brand":"Infinix","name":"Infinix S5 lite","os":"Android 9.0 (Pie), XOS 5.5","year":2019,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart_4","brand":"Infinix","name":"Infinix Smart 4","os":"Android 9.0 Pie (Go edition)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart_4c","brand":"Infinix","name":"Infinix Smart 4c","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":266,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart3_plus","brand":"Infinix","name":"Infinix Smart3 Plus","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.21,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_zero_6","brand":"Infinix","name":"Infinix Zero 6","os":"Android 8.0 (Oreo)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2246,"ppi":403,"inches":6.18,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_zero_6_pro","brand":"Infinix","name":"Infinix Zero 6 Pro","os":"Android 8.0 (Oreo)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2246,"ppi":403,"inches":6.18,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a6_note","brand":"Lenovo","name":"Lenovo A6 Note","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.09,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a7","brand":"Lenovo","name":"Lenovo A7","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.09,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k10_note","brand":"Lenovo","name":"Lenovo K10 Note","os":"Android 9.0 (Pie), ZUI 11","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k10_plus","brand":"Lenovo","name":"Lenovo K10 Plus","os":"Android 9.0 (Pie), ZUI 11","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k6_enjoy","brand":"Lenovo","name":"Lenovo K6 Enjoy","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_m7","brand":"Lenovo","name":"Lenovo Tab M7","os":"Android 9.0 (Pie) - 2GB RAM, Android 9.0 Pie (Go edition) - ","year":2019,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_m8_fhd","brand":"Lenovo","name":"Lenovo Tab M8 (FHD)","os":"Android 9.0 (Pie), upgradable to Android 10","year":2019,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":283,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_m8_hd","brand":"Lenovo","name":"Lenovo Tab M8 (HD)","os":"Android 9.0 (Pie)","year":2019,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_v7","brand":"Lenovo","name":"Lenovo Tab V7","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":350,"inches":6.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_yoga_smart_tab","brand":"Lenovo","name":"Lenovo Yoga Smart Tab","os":"Android 9.0 (Pie)","year":2019,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_z6","brand":"Lenovo","name":"Lenovo Z6","os":"Android 9.0 (Pie), ZUI 11","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_z6_pro","brand":"Lenovo","name":"Lenovo Z6 Pro","os":"Android 9.0 (Pie), ZUI 11.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_z6_pro_5g","brand":"Lenovo","name":"Lenovo Z6 Pro 5G","os":"Android 9.0 (Pie), ZUI 11","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_z6_youth","brand":"Lenovo","name":"Lenovo Z6 Youth","os":"Android 9.0 (Pie), ZUI 11","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g_pad_5_10.1","brand":"Lg","name":"LG G Pad 5 10.1","os":"Android 9.0 (Pie)","year":2019,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g8_thinq","brand":"Lg","name":"LG G8 ThinQ","os":"Android 9.0 (Pie), upgradable to Android 11","year":2019,"form":"Phone","tablet":false,"w":1440,"h":3120,"ppi":564,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g8s_thinq","brand":"Lg","name":"LG G8S ThinQ","os":"Android 9.0 (Pie), upgradable to Android 12","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2248,"ppi":401,"inches":6.21,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g8x_thinq","brand":"Lg","name":"LG G8X ThinQ","os":"Android 9.0 (Pie), upgradable to Android 11","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k20_2019","brand":"Lg","name":"LG K20 (2019)","os":"Android 9.0 Pie (Go edition)","year":2019,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":197,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k30_2019","brand":"Lg","name":"LG K30 (2019)","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k40","brand":"Lg","name":"LG K40","os":"Android 8.1 (Oreo), LG UX 7","year":2019,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k40s","brand":"Lg","name":"LG K40S","os":"Android 9.0 (Pie), upgradable to Android 10","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":276,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k50","brand":"Lg","name":"LG K50","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":269,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k50s","brand":"Lg","name":"LG K50S","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":259,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_q60","brand":"Lg","name":"LG Q60","os":"Android 9.0 (Pie), LG UX 7","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":269,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_q70","brand":"Lg","name":"LG Q70","os":"Android 9.0 (Pie), upgradable to Android 10, LG UX 9","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2310,"ppi":398,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_q9","brand":"Lg","name":"LG Q9","os":"Android 8.1 (Oreo)","year":2019,"form":"Phone","tablet":false,"w":1440,"h":3120,"ppi":564,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_stylo_5","brand":"Lg","name":"LG Stylo 5","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":390,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_tribute_empire","brand":"Lg","name":"LG Tribute Empire","os":"Android 8.1 (Oreo)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_v50_thinq_5g","brand":"Lg","name":"LG V50 ThinQ 5G","os":"Android 9.0 (Pie), upgradable to Android 11","year":2019,"form":"Phone","tablet":false,"w":1440,"h":3120,"ppi":538,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_v50s_thinq_5g","brand":"Lg","name":"LG V50S ThinQ 5G","os":"Android 9.0 (Pie), upgradable to Android 12","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_w10","brand":"Lg","name":"LG W10","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1512,"ppi":271,"inches":6.19,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_w30","brand":"Lg","name":"LG W30","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":269,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_w30_pro","brand":"Lg","name":"LG W30 Pro","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_16s","brand":"Meizu","name":"Meizu 16s","os":"Android 9.0 (Pie), Flyme 7.3","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2232,"ppi":400,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_16s_pro","brand":"Meizu","name":"Meizu 16s Pro","os":"Android 9.0 (Pie), Flyme 8","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2232,"ppi":403,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_16t","brand":"Meizu","name":"Meizu 16T","os":"Android 9.0 (Pie), Flyme 8","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2232,"ppi":382,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_16xs","brand":"Meizu","name":"Meizu 16Xs","os":"Android 9.0 (Pie), Flyme","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2232,"ppi":403,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_m10","brand":"Meizu","name":"Meizu M10","os":"Android 9.0 (Pie), Flyme 8","year":2019,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_note_9","brand":"Meizu","name":"Meizu Note 9","os":"Android 9.0 (Pie), Flyme 7.2","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2244,"ppi":403,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_zero","brand":"Meizu","name":"Meizu Zero","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":430,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e6","brand":"Motorola","name":"Motorola Moto E6","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":296,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e6_play","brand":"Motorola","name":"Motorola Moto E6 Play","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e6_plus","brand":"Motorola","name":"Motorola Moto E6 Plus","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g7","brand":"Motorola","name":"Motorola Moto G7","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2270,"ppi":405,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g7_play","brand":"Motorola","name":"Motorola Moto G7 Play","os":"Android 9.0 (Pie), upgradable to Android 10","year":2019,"form":"Phone","tablet":false,"w":720,"h":1512,"ppi":294,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g7_plus","brand":"Motorola","name":"Motorola Moto G7 Plus","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2270,"ppi":405,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g7_power","brand":"Motorola","name":"Motorola Moto G7 Power","os":"Android 9.0 (Pie), upgradable to Android 10","year":2019,"form":"Phone","tablet":false,"w":720,"h":1570,"ppi":279,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g8_play","brand":"Motorola","name":"Motorola Moto G8 Play","os":"Android 9.0 (Pie), upgradable to Android 10","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g8_plus","brand":"Motorola","name":"Motorola Moto G8 Plus","os":"Android 9.0 (Pie), upgradable to Android 10","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":400,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_z4","brand":"Motorola","name":"Motorola Moto Z4","os":"Android 9.0 (Pie), upgradable to Android 10","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_one_action","brand":"Motorola","name":"Motorola One Action","os":"Android 9.0 (Pie), upgradable to Android 11, Android One","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2520,"ppi":432,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_one_hyper","brand":"Motorola","name":"Motorola One Hyper","os":"Android 10, upgradable to Android 11","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":396,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_one_macro","brand":"Motorola","name":"Motorola One Macro","os":"Android 9.0 (Pie), upgradable to Android 10","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_one_vision","brand":"Motorola","name":"Motorola One Vision","os":"Android 9.0 (Pie), upgradable to Android 11","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2520,"ppi":432,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_razr_2019","brand":"Motorola","name":"Motorola Razr 2019","os":"Android 9.0 (Pie), upgradable to Android 11","year":2019,"form":"Foldable","tablet":false,"w":876,"h":2142,"ppi":373,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_1_plus","brand":"Nokia","name":"Nokia 1 Plus","os":"Android 9.0 Pie (Go edition), upgradable to Android 10 (Go e","year":2019,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":197,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_2.2","brand":"Nokia","name":"Nokia 2.2","os":"Android 9.0 (Pie), upgradable to Android 11, Android One","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":295,"inches":5.71,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_2.3","brand":"Nokia","name":"Nokia 2.3","os":"Android 9.0 (Pie), upgradable to Android 11, Android One","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_3.1_a","brand":"Nokia","name":"Nokia 3.1 A","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_3.1_c","brand":"Nokia","name":"Nokia 3.1 C","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_3.2","brand":"Nokia","name":"Nokia 3.2","os":"Android 9.0 (Pie), upgradable to Android 11, Android One","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":269,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_4.2","brand":"Nokia","name":"Nokia 4.2","os":"Android 9.0 (Pie), upgradable to Android 11, Android One","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":295,"inches":5.71,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_6.2","brand":"Nokia","name":"Nokia 6.2","os":"Android 9.0 (Pie), upgradable to Android 10, Android One","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":400,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_7.2","brand":"Nokia","name":"Nokia 7.2","os":"Android 9.0 (Pie), upgradable to Android 11, Android One","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":400,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_9_pureview","brand":"Nokia","name":"Nokia 9 PureView","os":"Android 9.0 (Pie), upgradable to Android 10, Android One","year":2019,"form":"Phone","tablet":false,"w":1440,"h":2880,"ppi":538,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_c1","brand":"Nokia","name":"Nokia C1","os":"Android 9.0 Pie (Go edition)","year":2019,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":197,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_x71","brand":"Nokia","name":"Nokia X71","os":"Android 9.0 (Pie), Android One","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2316,"ppi":400,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_7","brand":"Oneplus","name":"OnePlus 7","os":"Android 9.0 (Pie), upgradable to Android 12, OxygenOS 12.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":402,"inches":6.41,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_7_pro","brand":"Oneplus","name":"OnePlus 7 Pro","os":"Android 9.0 (Pie), upgradable to Android 12, OxygenOS 12.1","year":2019,"form":"Phone","tablet":false,"w":1440,"h":3120,"ppi":516,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_7_pro_5g","brand":"Oneplus","name":"OnePlus 7 Pro 5G","os":"Android 9.0 (Pie), upgradable to Android 10, OxygenOS 10.0.4","year":2019,"form":"Phone","tablet":false,"w":1440,"h":3120,"ppi":515,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_7t","brand":"Oneplus","name":"OnePlus 7T","os":"Android 10, upgradable to Android 12, OxygenOS 12.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.55,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_7t_pro","brand":"Oneplus","name":"OnePlus 7T Pro","os":"Android 10, upgradable to Android 12, OxygenOS 12.1","year":2019,"form":"Phone","tablet":false,"w":1440,"h":3120,"ppi":516,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_7t_pro_5g_mclaren","brand":"Oneplus","name":"OnePlus 7T Pro 5G McLaren","os":"Android 10, OxygenOS 10.0","year":2019,"form":"Phone","tablet":false,"w":1440,"h":3120,"ppi":516,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a11","brand":"Oppo","name":"Oppo A11","os":"Android 9.0 (Pie), ColorOS 6.0","year":2019,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a1k","brand":"Oppo","name":"Oppo A1k","os":"Android 9.0 (Pie), ColorOS 6","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a5_2020","brand":"Oppo","name":"Oppo A5 (2020)","os":"Android 9.0 (Pie), ColorOS 6.1","year":2019,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a5s_ax5s","brand":"Oppo","name":"Oppo A5s (AX5s)","os":"Android 8.1 (Oreo), ColorOS 5.2","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a7n","brand":"Oppo","name":"Oppo A7n","os":"Android 8.1 (Oreo), ColorOS 5.2","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a8","brand":"Oppo","name":"Oppo A8","os":"Android 9.0 (Pie), ColorOS 6.1","year":2019,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a9","brand":"Oppo","name":"Oppo A9","os":"Android 9.0 (Pie), ColorOS 6","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a9_2020","brand":"Oppo","name":"Oppo A9 (2020)","os":"Android 9.0 (Pie), upgradable to Android 10, ColorOS 7.1","year":2019,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":270,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a91","brand":"Oppo","name":"Oppo A91","os":"Android 9.0 (Pie), upgradable to Android 11, ColorOS 11","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":408,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a9x","brand":"Oppo","name":"Oppo A9x","os":"Android 9.0 (Pie), ColorOS 6","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f11","brand":"Oppo","name":"Oppo F11","os":"Android 9.0 (Pie), ColorOS 6","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":394,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f11_pro","brand":"Oppo","name":"Oppo F11 Pro","os":"Android 9.0 (Pie), ColorOS 6","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":397,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_k3","brand":"Oppo","name":"Oppo K3","os":"Android 9.0 (Pie), ColorOS 6","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":394,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_k5","brand":"Oppo","name":"Oppo K5","os":"Android 9.0 (Pie), planned upgrade to Android 10, ColorOS 6.","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":402,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno","brand":"Oppo","name":"Oppo Reno","os":"Android 9.0 (Pie), upgradable to Android 10, ColorOS 7.0","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":402,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno_10x_zoom","brand":"Oppo","name":"Oppo Reno 10x zoom","os":"Android 9.0 (Pie), upgradable to Android 11, ColorOS 11","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":387,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno_5g","brand":"Oppo","name":"Oppo Reno 5G","os":"Android 9.0 (Pie), ColorOS 6","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":387,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno_a","brand":"Oppo","name":"Oppo Reno A","os":"Android 9.0 (Pie), ColorOS 6","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno_ace","brand":"Oppo","name":"Oppo Reno Ace","os":"Android 9.0 (Pie), upgradable to Android 10, ColorOS 7.0","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno_z","brand":"Oppo","name":"Oppo Reno Z","os":"Android 9.0 (Pie), planned upgrade to Android 10, ColorOS 7.","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":402,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno2","brand":"Oppo","name":"Oppo Reno2","os":"Android 9.0 (Pie), planned upgrade to Android 10, ColorOS 7.","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":401,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno2_f","brand":"Oppo","name":"Oppo Reno2 F","os":"Android 9.0 (Pie), upgradable to Android 11, ColorOS 11","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":394,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno2_z","brand":"Oppo","name":"Oppo Reno2 Z","os":"Android 9.0 (Pie), upgradable to Android 11, ColorOS 11","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno3_5g","brand":"Oppo","name":"Oppo Reno3 5G","os":"Android 10, ColorOS 7","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":408,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_reno3_pro_5g","brand":"Oppo","name":"Oppo Reno3 Pro 5G","os":"Android 10, ColorOS 7","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_3","brand":"Realme","name":"Realme 3","os":"Android 9.0 (Pie), upgradable to Android 10, Realme UI","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_3_pro","brand":"Realme","name":"Realme 3 Pro","os":"Android 9.0 (Pie), planned upgrade to Android 10, ColorOS 6","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_3i","brand":"Realme","name":"Realme 3i","os":"Android 9.0 (Pie), upgradable to Android 10, Realme UI","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_5","brand":"Realme","name":"Realme 5","os":"Android 9.0 (Pie), upgradable to Android 10, Realme UI","year":2019,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_5_pro","brand":"Realme","name":"Realme 5 Pro","os":"Android 9.0 (Pie), upgradable to Android 11, Realme UI 2.0","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_5s","brand":"Realme","name":"Realme 5s","os":"Android 9.0 (Pie), upgradable to Android 10, Realme UI","year":2019,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c1_2019","brand":"Realme","name":"Realme C1 (2019)","os":"Android 8.1 (Oreo), ColorOS 5.2","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c2","brand":"Realme","name":"Realme C2","os":"Android 9.0 (Pie), ColorOS 6 Lite","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c2_2020","brand":"Realme","name":"Realme C2 2020","os":"Android 9.0 (Pie), ColorOS 6 Lite","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_q","brand":"Realme","name":"Realme Q","os":"Android 9.0 (Pie), ColorOS 6","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_x","brand":"Realme","name":"Realme X","os":"Android 9.0 (Pie), upgradable to Android 10, Realme UI","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":394,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_x2","brand":"Realme","name":"Realme X2","os":"Android 9.0 (Pie), upgradable to Android 10, Realme UI","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_x2_pro","brand":"Realme","name":"Realme X2 Pro","os":"Android 9.0 (Pie), upgradable to Android 11, Realme UI 2.0","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":402,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_xt","brand":"Realme","name":"Realme XT","os":"Android 9.0 (Pie), upgradable to Android 10, Realme UI","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a01","brand":"Samsung","name":"Samsung Galaxy A01","os":"Android 10, upgradable to Android 11, One UI 3.0","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":294,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a10","brand":"Samsung","name":"Samsung Galaxy A10","os":"Android 9.0 (Pie), upgradable to Android 11, One UI 3","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a10e","brand":"Samsung","name":"Samsung Galaxy A10e","os":"Android 9.0 (Pie), upgradable to Android 11, One UI 3.1","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":295,"inches":5.83,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a10s","brand":"Samsung","name":"Samsung Galaxy A10s","os":"Android 9.0 (Pie), upgradable to Android 11, One UI 3.1","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a2_core","brand":"Samsung","name":"Samsung Galaxy A2 Core","os":"Android 8.0 Oreo (Go edition)","year":2019,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a20","brand":"Samsung","name":"Samsung Galaxy A20","os":"Android 9.0 (Pie), upgradable to Android 11, One UI 3.1","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":268,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a20e","brand":"Samsung","name":"Samsung Galaxy A20e","os":"Android 9.0 (Pie), upgradable to Android 11, One UI 3","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":296,"inches":5.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a20s","brand":"Samsung","name":"Samsung Galaxy A20s","os":"Android 9.0 (Pie), upgradable to Android 11, One UI Core 3.1","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":264,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a30","brand":"Samsung","name":"Samsung Galaxy A30","os":"Android 9.0 (Pie), upgradable to Android 11","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a30s","brand":"Samsung","name":"Samsung Galaxy A30s","os":"Android 9.0 (Pie), upgradable to Android 11, One UI 3.1","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":268,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a40","brand":"Samsung","name":"Samsung Galaxy A40","os":"Android 9.0 (Pie), upgradable to Android 11","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":437,"inches":5.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a50","brand":"Samsung","name":"Samsung Galaxy A50","os":"Android 9.0 (Pie), upgradable to Android 11, One UI 3.0","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a50s","brand":"Samsung","name":"Samsung Galaxy A50s","os":"Android 9.0 (Pie), upgradable to Android 11, One UI 3.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a51","brand":"Samsung","name":"Samsung Galaxy A51","os":"Android 10, upgradable to Android 13, One UI 5","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":405,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a60","brand":"Samsung","name":"Samsung Galaxy A60","os":"Android 9.0 (Pie), upgradable to Android 11, One UI 3.0","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a70","brand":"Samsung","name":"Samsung Galaxy A70","os":"Android 9.0 (Pie), upgradable to Android 11, One UI 3.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a70s","brand":"Samsung","name":"Samsung Galaxy A70s","os":"Android 9.0 (Pie), upgradable to Android 11, One UI 3.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a71","brand":"Samsung","name":"Samsung Galaxy A71","os":"Android 10, upgradable to Android 13, One UI 5","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a80","brand":"Samsung","name":"Samsung Galaxy A80","os":"Android 9.0 (Pie), upgradable to Android 10, One UI 2.0","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a90_5g","brand":"Samsung","name":"Samsung Galaxy A90 5G","os":"Android 9.0 (Pie), upgradable to Android 11, One UI 3.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":393,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_fold","brand":"Samsung","name":"Samsung Galaxy Fold","os":"Android 9.0 (Pie), upgradable to Android 12, One UI 4","year":2019,"form":"Foldable","tablet":true,"w":1536,"h":2152,"ppi":362,"inches":7.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_fold_5g","brand":"Samsung","name":"Samsung Galaxy Fold 5G","os":"Android 9.0 (Pie), upgradable to Android 12, One UI 4","year":2019,"form":"Foldable","tablet":true,"w":1536,"h":2152,"ppi":362,"inches":7.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m10","brand":"Samsung","name":"Samsung Galaxy M10","os":"Android 9.0 (Pie), upgradable to Android 12","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m10s","brand":"Samsung","name":"Samsung Galaxy M10s","os":"Android 9.0 (Pie), upgradable to Android 10, One UI 2.0","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":268,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m20","brand":"Samsung","name":"Samsung Galaxy M20","os":"Android 8.1 (Oreo), upgradable to Android 10, One UI 2","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m30","brand":"Samsung","name":"Samsung Galaxy M30","os":"Android 8.1 (Oreo), upgradable to Android 10, One UI 2","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m30s","brand":"Samsung","name":"Samsung Galaxy M30s","os":"Android 9.0 (Pie), upgradable to Android 11, One UI 3.0","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_m40","brand":"Samsung","name":"Samsung Galaxy M40","os":"Android 9.0 (Pie), upgradable to Android 11, One UI 3.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note10","brand":"Samsung","name":"Samsung Galaxy Note10","os":"Android 9.0 (Pie), upgradable to Android 12, One UI 4","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":401,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note10_5g","brand":"Samsung","name":"Samsung Galaxy Note10 5G","os":"Android 9.0 (Pie), upgradable to Android 12, One UI 4","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":401,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note10+","brand":"Samsung","name":"Samsung Galaxy Note10+","os":"Android 9.0 (Pie), upgradable to Android 12, One UI 4","year":2019,"form":"Phone","tablet":false,"w":1440,"h":3040,"ppi":498,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note10+_5g","brand":"Samsung","name":"Samsung Galaxy Note10+ 5G","os":"Android 9.0 (Pie), upgradable to Android 12, One UI 4","year":2019,"form":"Phone","tablet":false,"w":1440,"h":3040,"ppi":498,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s10","brand":"Samsung","name":"Samsung Galaxy S10","os":"Android 9.0 (Pie), upgradable to Android 12, One UI 4.1","year":2019,"form":"Phone","tablet":false,"w":1440,"h":3040,"ppi":550,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s10_5g","brand":"Samsung","name":"Samsung Galaxy S10 5G","os":"Android 9.0 (Pie), upgradable to Android 12, One UI 4.1","year":2019,"form":"Phone","tablet":false,"w":1440,"h":3040,"ppi":502,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s10+","brand":"Samsung","name":"Samsung Galaxy S10+","os":"Android 9.0 (Pie), upgradable to Android 12, One UI 4.1","year":2019,"form":"Phone","tablet":false,"w":1440,"h":3040,"ppi":522,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s10e","brand":"Samsung","name":"Samsung Galaxy S10e","os":"Android 9.0 (Pie), upgradable to Android 12, One UI 4.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":438,"inches":5.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_a_10.1_2019","brand":"Samsung","name":"Samsung Galaxy Tab A 10.1 (2019)","os":"Android 9.0 (Pie), upgradable to Android 11, One UI 3.0","year":2019,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_a_8.0_&_s_pen_2019","brand":"Samsung","name":"Samsung Galaxy Tab A 8.0 & S Pen (2019)","os":"Android 9.0 (Pie), upgradable to Android 11, One UI Core 3.1","year":2019,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":283,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_a_8.0_2019","brand":"Samsung","name":"Samsung Galaxy Tab A 8.0 (2019)","os":"Android 9.0 (Pie), upgradable to Android 11","year":2019,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_active_pro","brand":"Samsung","name":"Samsung Galaxy Tab Active Pro","os":"Android 9.0 (Pie)","year":2019,"form":"Tablet","tablet":true,"w":1920,"h":1200,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s5e","brand":"Samsung","name":"Samsung Galaxy Tab S5e","os":"Android 9.0 (Pie), upgradable to Android 11, One UI 3.1","year":2019,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":288,"inches":10.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s6","brand":"Samsung","name":"Samsung Galaxy Tab S6","os":"Android 9.0 (Pie), upgradable to Android 12, One UI 4.0","year":2019,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":287,"inches":10.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_view2","brand":"Samsung","name":"Samsung Galaxy View2","os":"Android 8.1 (Oreo)","year":2019,"form":"Tablet","tablet":true,"w":1080,"h":1920,"ppi":127,"inches":17.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_xcover_4s","brand":"Samsung","name":"Samsung Galaxy XCover 4s","os":"Android 9.0 (Pie), upgradable to Android 11, One UI 3.1","year":2019,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_xcover_fieldpro","brand":"Samsung","name":"Samsung Galaxy XCover FieldPro","os":"Android 8.0 (Oreo)","year":2019,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":576,"inches":5.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_r3","brand":"Sharp","name":"Sharp Aquos R3","os":"Android 9.0 (Pie), upgradable to Android 10","year":2019,"form":"Phone","tablet":false,"w":1440,"h":3120,"ppi":554,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_v","brand":"Sharp","name":"Sharp Aquos V","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":409,"inches":5.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_zero","brand":"Sharp","name":"Sharp Aquos Zero","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":1440,"h":2992,"ppi":536,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_1","brand":"Sony","name":"Sony Xperia 1","os":"Android 9.0 (Pie), upgradable to Android 11","year":2019,"form":"Phone","tablet":false,"w":1644,"h":3840,"ppi":643,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_10","brand":"Sony","name":"Sony Xperia 10","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2520,"ppi":457,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_10_plus","brand":"Sony","name":"Sony Xperia 10 Plus","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2520,"ppi":422,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_5","brand":"Sony","name":"Sony Xperia 5","os":"Android 9.0 (Pie), upgradable to Android 11","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2520,"ppi":449,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_l3","brand":"Sony","name":"Sony Xperia L3","os":"Android 8.0 (Oreo)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tcl_tcl_plex","brand":"Tcl","name":"TCL Plex","os":"Android 9.0 (Pie), upgradable to Android 10","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_camon_12","brand":"Tecno","name":"Tecno Camon 12","os":"Android 9.0 (Pie), HIOS 5.5","year":2019,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_12_air","brand":"Tecno","name":"Tecno Camon 12 Air","os":"Android 9.0 (Pie), HIOS 5.5","year":2019,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":268,"inches":6.55,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_12_pro","brand":"Tecno","name":"Tecno Camon 12 Pro","os":"Android 9.0 (Pie), HIOS 5.5","year":2019,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":276,"inches":6.35,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_i4","brand":"Tecno","name":"Tecno Camon i4","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_camon_iace2","brand":"Tecno","name":"Tecno Camon iACE2","os":"Android 8.1 (Oreo), HIOS 4.1","year":2019,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_camon_iace2x","brand":"Tecno","name":"Tecno Camon iACE2X","os":"Android 8.1 (Oreo), HIOS 4.1","year":2019,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_phantom_9","brand":"Tecno","name":"Tecno Phantom 9","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_pop_2_f","brand":"Tecno","name":"Tecno Pop 2 F","os":"Android 8.1 Oreo (Go edition)","year":2019,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":197,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_pop_3_plus","brand":"Tecno","name":"Tecno Pop 3 Plus","os":"Android 9.0 (Pie), HIOS 5.5","year":2019,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pouvoir_3","brand":"Tecno","name":"Tecno Pouvoir 3","os":"Android 8.1 (Oreo), HIOS 4.1","year":2019,"form":"Phone","tablet":false,"w":720,"h":1500,"ppi":268,"inches":6.2,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pouvoir_3_air","brand":"Tecno","name":"Tecno Pouvoir 3 Air","os":"Android 9.0 Pie (Go edition), HIOS 5.0","year":2019,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":179,"inches":6.0,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_pouvoir_3_plus","brand":"Tecno","name":"Tecno Pouvoir 3 Plus","os":"Android 9.0 (Pie), HIOS 5.0","year":2019,"form":"Phone","tablet":false,"w":720,"h":1548,"ppi":269,"inches":6.35,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_3","brand":"Tecno","name":"Tecno Spark 3","os":"Android 9.0 (Pie), HIOS 5.0","year":2019,"form":"Phone","tablet":false,"w":720,"h":1500,"ppi":268,"inches":6.2,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_3_pro","brand":"Tecno","name":"Tecno Spark 3 Pro","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1500,"ppi":268,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_spark_4","brand":"Tecno","name":"Tecno Spark 4","os":"Android 9.0 (Pie), HIOS 5.5","year":2019,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_4_lite","brand":"Tecno","name":"Tecno Spark 4 Lite","os":"Android 9.0 (Pie), HIOS 5.5","year":2019,"form":"Phone","tablet":false,"w":720,"h":1600,"ppi":269,"inches":6.52,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"tecno_tecno_spark_go","brand":"Tecno","name":"Tecno Spark Go","os":"Android 9.0 (Pie), HIOS 5.0","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.1,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"ulefone__ulefone_armor_3w","brand":"Ulefone_","name":"Ulefone Armor 3W","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":424,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_3wt","brand":"Ulefone_","name":"Ulefone Armor 3WT","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":424,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_5s","brand":"Ulefone_","name":"Ulefone Armor 5S","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1512,"ppi":286,"inches":5.85,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_6e","brand":"Ulefone_","name":"Ulefone Armor 6E","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2246,"ppi":402,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_6s","brand":"Ulefone_","name":"Ulefone Armor 6S","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2246,"ppi":402,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_7","brand":"Ulefone_","name":"Ulefone Armor 7","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_x3","brand":"Ulefone_","name":"Ulefone Armor X3","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_x5","brand":"Ulefone_","name":"Ulefone Armor X5","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_x6","brand":"Ulefone_","name":"Ulefone Armor X6","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_note_7","brand":"Ulefone_","name":"Ulefone Note 7","os":"Android 8.1 Oreo (Go edition)","year":2019,"form":"Phone","tablet":false,"w":600,"h":1280,"ppi":232,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_note_7p","brand":"Ulefone_","name":"Ulefone Note 7P","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":600,"h":1280,"ppi":232,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_s11","brand":"Ulefone_","name":"Ulefone S11","os":"Android 8.1 Oreo (Go edition)","year":2019,"form":"Phone","tablet":false,"w":600,"h":1280,"ppi":232,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_t2","brand":"Ulefone_","name":"Ulefone T2","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":377,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo","brand":"Vivo","name":"vivo iQOO","os":"Android 9.0 (Pie), Funtouch 9","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":402,"inches":6.41,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo","brand":"Vivo","name":"vivo iQOO Neo","os":"Android 9.0 (Pie), Funtouch 9","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":404,"inches":6.38,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo_855","brand":"Vivo","name":"vivo iQOO Neo 855","os":"Android 9.0 (Pie), Funtouch 9","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":404,"inches":6.38,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_neo_855_racing","brand":"Vivo","name":"vivo iQOO Neo 855 Racing","os":"Android 9.0 (Pie), Funtouch 9","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":404,"inches":6.38,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_pro","brand":"Vivo","name":"vivo iQOO Pro","os":"Android 9.0 (Pie), Funtouch 9.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":402,"inches":6.41,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_iqoo_pro_5g","brand":"Vivo","name":"vivo iQOO Pro 5G","os":"Android 9.0 (Pie), Funtouch 9.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":402,"inches":6.41,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_nex_3","brand":"Vivo","name":"vivo NEX 3","os":"Android 9.0 (Pie), Funtouch 9.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2256,"ppi":363,"inches":6.89,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_nex_3_5g","brand":"Vivo","name":"vivo NEX 3 5G","os":"Android 9.0 (Pie), upgradable to Android 10, Funtouch 10","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2256,"ppi":363,"inches":6.89,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s1","brand":"Vivo","name":"vivo S1","os":"Android 9.0 (Pie), Funtouch 9","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":404,"inches":6.38,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s1_china","brand":"Vivo","name":"vivo S1 (China)","os":"Android 9.0 (Pie), Funtouch 9","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s1_pro","brand":"Vivo","name":"vivo S1 Pro","os":"Android 9.0 (Pie), Funtouch 9.2","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":404,"inches":6.38,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s1_pro_china","brand":"Vivo","name":"vivo S1 Pro (China)","os":"Android 9.0 (Pie), Funtouch 9","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_s5","brand":"Vivo","name":"vivo S5","os":"Android 9.0 (Pie), Funtouch 9.2","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_u10","brand":"Vivo","name":"vivo U10","os":"Android 9.0 (Pie), Funtouch 9.1","year":2019,"form":"Phone","tablet":false,"w":720,"h":1544,"ppi":268,"inches":6.35,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_u20","brand":"Vivo","name":"vivo U20","os":"Android 9.0 (Pie), Funtouch 9.2","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_u3","brand":"Vivo","name":"vivo U3","os":"Android 9.0 (Pie), Funtouch 9.0","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v15","brand":"Vivo","name":"vivo V15","os":"Android 9.0 (Pie), Funtouch 9","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v15_pro","brand":"Vivo","name":"vivo V15 Pro","os":"Android 9.0 (Pie), Funtouch 9","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":404,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v17","brand":"Vivo","name":"vivo V17","os":"Android 9.0 (Pie), Funtouch 9.2","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v17_russia","brand":"Vivo","name":"vivo V17 (Russia)","os":"Android 9.0 (Pie), Funtouch 9.2","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":404,"inches":6.38,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v17_neo","brand":"Vivo","name":"vivo V17 Neo","os":"Android 9.0 (Pie), Funtouch 9","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":404,"inches":6.38,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v17_pro","brand":"Vivo","name":"vivo V17 Pro","os":"Android 9.0 (Pie), Funtouch 9.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x27","brand":"Vivo","name":"vivo X27","os":"Android 9.0 (Pie), Funtouch 9","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":400,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x27_pro","brand":"Vivo","name":"vivo X27 Pro","os":"Android 9.0 (Pie), Funtouch 9","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2460,"ppi":401,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x30","brand":"Vivo","name":"vivo X30","os":"Android 9.0 (Pie), Funtouch 10.0","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x30_pro","brand":"Vivo","name":"vivo X30 Pro","os":"Android 9.0 (Pie), Funtouch 10.0","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":409,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y11_2019","brand":"Vivo","name":"vivo Y11 (2019)","os":"Android 9.0 (Pie), Funtouch 9.1","year":2019,"form":"Phone","tablet":false,"w":720,"h":1544,"ppi":268,"inches":6.35,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y12","brand":"Vivo","name":"vivo Y12","os":"Android 9.0 (Pie), Funtouch 9","year":2019,"form":"Phone","tablet":false,"w":720,"h":1544,"ppi":268,"inches":6.35,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y15","brand":"Vivo","name":"vivo Y15","os":"Android 9.0 (Pie), Funtouch 9","year":2019,"form":"Phone","tablet":false,"w":720,"h":1544,"ppi":268,"inches":6.35,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y17","brand":"Vivo","name":"vivo Y17","os":"Android 9.0 (Pie), Funtouch 9","year":2019,"form":"Phone","tablet":false,"w":720,"h":1544,"ppi":268,"inches":6.35,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y19","brand":"Vivo","name":"vivo Y19","os":"Android 9.0 (Pie), Funtouch 9.2","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y3","brand":"Vivo","name":"vivo Y3","os":"Android 9.0 (Pie), Funtouch 9.0","year":2019,"form":"Phone","tablet":false,"w":720,"h":1544,"ppi":268,"inches":6.35,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y3_4gb+64gb","brand":"Vivo","name":"vivo Y3 (4GB+64GB)","os":"Android 9.0 (Pie), Funtouch 9.0","year":2019,"form":"Phone","tablet":false,"w":720,"h":1544,"ppi":268,"inches":6.35,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y3_standard","brand":"Vivo","name":"vivo Y3 Standard","os":"Android 9.0 (Pie), Funtouch 9.1","year":2019,"form":"Phone","tablet":false,"w":720,"h":1544,"ppi":268,"inches":6.35,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y5s","brand":"Vivo","name":"vivo Y5s","os":"Android 9.0 (Pie), Funtouch 9.2","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y89","brand":"Vivo","name":"vivo Y89","os":"Android 8.1 (Oreo)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":403,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y90","brand":"Vivo","name":"vivo Y90","os":"Android 8.1 (Oreo), Funtouch 4.5","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y91_mediatek","brand":"Vivo","name":"vivo Y91 (Mediatek)","os":"Android 8.1 (Oreo), Funtouch 4.5","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y91i_india","brand":"Vivo","name":"vivo Y91i (India)","os":"Android 8.1 (Oreo), Funtouch 4.5","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y9s","brand":"Vivo","name":"vivo Y9s","os":"Android 9.0 (Pie), Funtouch 9","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":404,"inches":6.38,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_z1pro","brand":"Vivo","name":"vivo Z1Pro","os":"Android 9.0 (Pie), upgradable to Android 10, Funtouch 10","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_z1x","brand":"Vivo","name":"vivo Z1x","os":"Android 9.0 (Pie), upgradable to Android 10, Funtouch 10","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":404,"inches":6.38,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_z3x","brand":"Vivo","name":"vivo Z3x","os":"Android 9.0 (Pie), Funtouch 9","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":403,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_z5","brand":"Vivo","name":"vivo Z5","os":"Android 9.0 (Pie), Funtouch 9.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":404,"inches":6.38,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_z5i","brand":"Vivo","name":"vivo Z5i","os":"Android 9.0 (Pie), Funtouch 9.2","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_z5x","brand":"Vivo","name":"vivo Z5x","os":"Android 9.0 (Pie), Funtouch 9","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_black_shark_2","brand":"Xiaomi","name":"Xiaomi Black Shark 2","os":"Android 9.0 (Pie), upgradable to Android 10, JoyUI 11","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_black_shark_2_pro","brand":"Xiaomi","name":"Xiaomi Black Shark 2 Pro","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_9","brand":"Xiaomi","name":"Xiaomi Mi 9","os":"Android 9.0 (Pie), upgradable to Android 10, MIUI 12.5","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_9_explorer","brand":"Xiaomi","name":"Xiaomi Mi 9 Explorer","os":"Android 9.0 (Pie), MIUI 10","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_9_lite","brand":"Xiaomi","name":"Xiaomi Mi 9 Lite","os":"Android 9.0 (Pie), upgradable to Android 10, MIUI 11","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_9_pro","brand":"Xiaomi","name":"Xiaomi Mi 9 Pro","os":"Android 10, MIUI 11","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_9_pro_5g","brand":"Xiaomi","name":"Xiaomi Mi 9 Pro 5G","os":"Android 10, MIUI 11","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_9_se","brand":"Xiaomi","name":"Xiaomi Mi 9 SE","os":"Android 9.0 (Pie), upgradable to Android 11, MIUI 12.5","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":432,"inches":5.97,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_9t","brand":"Xiaomi","name":"Xiaomi Mi 9T","os":"Android 9.0 (Pie), upgradable to Android 11, MIUI 12.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_9t_pro","brand":"Xiaomi","name":"Xiaomi Mi 9T Pro","os":"Android 9.0 (Pie), upgradable to Android 11, MIUI 12.5","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_a3","brand":"Xiaomi","name":"Xiaomi Mi A3","os":"Android 9.0 (Pie), upgradable to Android 11, Android One","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.09,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_cc9","brand":"Xiaomi","name":"Xiaomi Mi CC9","os":"Android 9.0 (Pie), upgradable to Android 10, MIUI 11","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_cc9_pro","brand":"Xiaomi","name":"Xiaomi Mi CC9 Pro","os":"Android 9.0 (Pie), upgradable to Android 11, MIUI 12","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":398,"inches":6.47,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_cc9e","brand":"Xiaomi","name":"Xiaomi Mi CC9e","os":"Android 9.0 (Pie), MIUI 10","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":286,"inches":6.01,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_mix_3_5g","brand":"Xiaomi","name":"Xiaomi Mi Mix 3 5G","os":"Android 9.0 (Pie), MIUI 12","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_mix_alpha","brand":"Xiaomi","name":"Xiaomi Mi Mix Alpha","os":"Android 10, MIUI 11","year":2019,"form":"Tablet","tablet":true,"w":2088,"h":2250,"ppi":388,"inches":7.92,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_note_10","brand":"Xiaomi","name":"Xiaomi Mi Note 10","os":"Android 9.0 (Pie), upgradable to Android 11, MIUI 12","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":398,"inches":6.47,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_note_10_pro","brand":"Xiaomi","name":"Xiaomi Mi Note 10 Pro","os":"Android 9.0 (Pie), upgradable to Android 10, MIUI 12","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":398,"inches":6.47,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_7","brand":"Xiaomi","name":"Xiaomi Redmi 7","os":"Android 9.0 Pie, upgradable to Android 10, MIUI 12","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":269,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_7a","brand":"Xiaomi","name":"Xiaomi Redmi 7A","os":"Android 9.0 (Pie), upgradable to Android 10, MIUI 12","year":2019,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_8","brand":"Xiaomi","name":"Xiaomi Redmi 8","os":"Android 9.0 (Pie), upgradable to Android 10, MIUI 12","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_8a","brand":"Xiaomi","name":"Xiaomi Redmi 8A","os":"Android 9.0 (Pie), upgradable to Android 10, MIUI 12","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_go","brand":"Xiaomi","name":"Xiaomi Redmi Go","os":"Android 8.1 Oreo (Go edition)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":296,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k20","brand":"Xiaomi","name":"Xiaomi Redmi K20","os":"Android 9.0 (Pie), upgradable to Android 10, MIUI 12","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k20_pro","brand":"Xiaomi","name":"Xiaomi Redmi K20 Pro","os":"Android 9.0 (Pie), upgradable to Android 10, MIUI 12","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k20_pro_premium","brand":"Xiaomi","name":"Xiaomi Redmi K20 Pro Premium","os":"Android 10, MIUI 11","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_k30_5g","brand":"Xiaomi","name":"Xiaomi Redmi K30 5G","os":"Android 10, upgradable to Android 11, MIUI 12","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2400,"ppi":395,"inches":6.67,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_7","brand":"Xiaomi","name":"Xiaomi Redmi Note 7","os":"Android 9.0 (Pie), planned upgrade to Android 10, MIUI 12","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_7_pro","brand":"Xiaomi","name":"Xiaomi Redmi Note 7 Pro","os":"Android 9.0 (Pie), upgradable to Android 10, MIUI 12","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_7s","brand":"Xiaomi","name":"Xiaomi Redmi Note 7S","os":"Android 9.0 (Pie), planned upgrade to Android 10, MIUI 12","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_8_pro","brand":"Xiaomi","name":"Xiaomi Redmi Note 8 Pro","os":"Android 9.0 (Pie), upgradable to Android 11, MIUI 12.5","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":395,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_8t","brand":"Xiaomi","name":"Xiaomi Redmi Note 8T","os":"Android 9.0 (Pie), upgradable to Android 11, MIUI 12.5","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_y3","brand":"Xiaomi","name":"Xiaomi Redmi Y3","os":"Android 9.0 (Pie), planned upgrade to Android 10, MIUI 12","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":269,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_avid_559","brand":"Zte","name":"ZTE Avid 559","os":"Android 8.1 (Oreo)","year":2019,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_10_pro","brand":"Zte","name":"ZTE Axon 10 Pro","os":"Android 9.0 (Pie), upgradable to Android 10, MiFavor 10.0","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":398,"inches":6.47,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_10_pro_5g","brand":"Zte","name":"ZTE Axon 10 Pro 5G","os":"Android 9.0 (Pie), MiFavor 9.1","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":398,"inches":6.47,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_10_prime","brand":"Zte","name":"ZTE Blade 10 Prime","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":400,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_20","brand":"Zte","name":"ZTE Blade 20","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":265,"inches":6.49,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a3_2019","brand":"Zte","name":"ZTE Blade A3 (2019)","os":"Android 9.0 Pie (Go edition)","year":2019,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":215,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a5_2019","brand":"Zte","name":"ZTE Blade A5 (2019)","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a7","brand":"Zte","name":"ZTE Blade A7","os":"Android 9.0 (Pie), MiFavor 9.0","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.09,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a7_prime","brand":"Zte","name":"ZTE Blade A7 Prime","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1560,"ppi":282,"inches":6.09,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_l8","brand":"Zte","name":"ZTE Blade L8","os":"Android 9.0 Pie (Go edition)","year":2019,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":215,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_max_view","brand":"Zte","name":"ZTE Blade Max View","os":"Android 7.1.1 (Nougat), upgradable to Android 8.1 (Oreo)","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v10","brand":"Zte","name":"ZTE Blade V10","os":"Android 9.0 (Pie), MiFavor 9.0","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":400,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v10_vita","brand":"Zte","name":"ZTE Blade V10 Vita","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":269,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_vantage_2","brand":"Zte","name":"ZTE Blade Vantage 2","os":"Android 9.0 (Pie)","year":2019,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":215,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_3","brand":"Zte","name":"ZTE nubia Red Magic 3","os":"Android 9.0 (Pie), upgradable to Android 10, Redmagic 3.0","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":388,"inches":6.65,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_3s","brand":"Zte","name":"ZTE nubia Red Magic 3s","os":"Android 9.0 (Pie), Redmagic 2.0","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":388,"inches":6.65,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z20","brand":"Zte","name":"ZTE nubia Z20","os":"Android 9.0 (Pie), Nubia UI","year":2019,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":401,"inches":6.42,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":true,"hasHome":false,"safeTop":40,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_1","brand":"Alcatel","name":"alcatel 1","os":"Android 8.1 Oreo (Go edition)","year":2018,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":215,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_1t_10","brand":"Alcatel","name":"alcatel 1T 10","os":"Android 8.1 (Oreo)","year":2018,"form":"Tablet","tablet":true,"w":1280,"h":800,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_1t_7","brand":"Alcatel","name":"alcatel 1T 7","os":"Android 8.1 (Oreo)","year":2018,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_1x","brand":"Alcatel","name":"alcatel 1x","os":"Android 8.1 (Oreo) - 5059D only, Android 8.1 Oreo (Go editio","year":2018,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":203,"inches":5.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_3","brand":"Alcatel","name":"alcatel 3","os":"Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_3c","brand":"Alcatel","name":"alcatel 3c","os":"Android 7.1 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":268,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_3t_8","brand":"Alcatel","name":"alcatel 3T 8","os":"Android 8.1 (Oreo)","year":2018,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_3v","brand":"Alcatel","name":"alcatel 3v","os":"Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_3x_2018","brand":"Alcatel","name":"alcatel 3x (2018)","os":"Android 7.1 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_5","brand":"Alcatel","name":"alcatel 5","os":"Android 7.1 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_5v","brand":"Alcatel","name":"alcatel 5v","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1500,"ppi":268,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_7","brand":"Alcatel","name":"alcatel 7","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2180,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_tetra","brand":"Alcatel","name":"alcatel Tetra","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"apple_apple_ipad_9.7_2018","brand":"Apple","name":"Apple iPad 9.7 (2018)","os":"iOS 11.3, upgradable to iPadOS 17.6.1","year":2018,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":264,"inches":9.7,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_ipad_pro_11_2018","brand":"Apple","name":"Apple iPad Pro 11 (2018)","os":"iOS 12, upgradable to iPadOS 18","year":2018,"form":"Tablet","tablet":true,"w":1668,"h":2388,"ppi":265,"inches":11.0,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_ipad_pro_12.9_2018","brand":"Apple","name":"Apple iPad Pro 12.9 (2018)","os":"iOS 12, upgradable to iPadOS 18","year":2018,"form":"Tablet","tablet":true,"w":2048,"h":2732,"ppi":265,"inches":12.9,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_iphone_xr","brand":"Apple","name":"Apple iPhone XR","os":"iOS 12, upgradable to iOS 18","year":2018,"form":"Phone","tablet":false,"w":828,"h":1792,"ppi":326,"inches":6.1,"platform":"ios","hasNotch":true,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":47,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_xs","brand":"Apple","name":"Apple iPhone XS","os":"iOS 12, upgradable to iOS 18","year":2018,"form":"Phone","tablet":false,"w":1125,"h":2436,"ppi":458,"inches":5.8,"platform":"ios","hasNotch":true,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":47,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_xs_max","brand":"Apple","name":"Apple iPhone XS Max","os":"iOS 12, upgradable to iOS 18","year":2018,"form":"Phone","tablet":false,"w":1242,"h":2688,"ppi":458,"inches":6.5,"platform":"ios","hasNotch":true,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":47,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"asus_asus_rog_phone_zs600kl","brand":"Asus","name":"Asus ROG Phone ZS600KL","os":"Android 8.1 (Oreo), upgradable to Android 9.0 (Pie), ROG Gam","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_5_lite_zc600kl","brand":"Asus","name":"Asus Zenfone 5 Lite ZC600KL","os":"Android 7.1.1 (Nougat), upgradable to Android 9.0 (Pie)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_5_ze620kl","brand":"Asus","name":"Asus Zenfone 5 ZE620KL","os":"Android 8.0 (Oreo), upgradable to Android 9.0 (Pie), ZenUI 5","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2246,"ppi":402,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_5z_zs620kl","brand":"Asus","name":"Asus Zenfone 5z ZS620KL","os":"Android 8.0 (Oreo), upgradable to Android 10","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2246,"ppi":402,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_lite_l1_za551kl","brand":"Asus","name":"Asus ZenFone Lite (L1) ZA551KL","os":"Android 8.0 Oreo","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_live_l1_za550kl","brand":"Asus","name":"Asus ZenFone Live (L1) ZA550KL","os":"Android 8.0 Oreo (Go edition), ZenUI 5","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_max_m1_zb555kl","brand":"Asus","name":"Asus Zenfone Max (M1) ZB555KL","os":"Android 8 (Oreo), ZenUI 5","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":245,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_max_m1_zb556kl","brand":"Asus","name":"Asus Zenfone Max (M1) ZB556KL","os":"Android 8 (Oreo), ZenUI 5","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":247,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_max_m2_zb633kl","brand":"Asus","name":"Asus Zenfone Max (M2) ZB633KL","os":"Android 8.1 (Oreo), upgradable to Android 9.0 (Pie)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":269,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_max_pro_m1_zb601kl_zb602k","brand":"Asus","name":"Asus Zenfone Max Pro (M1) ZB601KL/ZB602K","os":"Android 8.1 (Oreo), upgradable to Android 9.0 (Pie)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":404,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_max_pro_m2_zb631kl","brand":"Asus","name":"Asus Zenfone Max Pro (M2) ZB631KL","os":"Android 8.1 (Oreo), upgradable to Android 9.0 (Pie)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":403,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_s6","brand":"Blackview","name":"Blackview S6","os":"Android 7.0 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cat_cat_s61","brand":"Cat","name":"Cat S61","os":"Android 8.0 (Oreo), upgradable to Android 9.0 (Pie)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_energy_e500","brand":"Energizer","name":"Energizer Energy E500","os":"Android Go","year":2018,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_energy_e500s","brand":"Energizer","name":"Energizer Energy E500S","os":"Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_hardcase_h500s","brand":"Energizer","name":"Energizer Hardcase H500S","os":"Android 7.0 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_hardcase_h550s","brand":"Energizer","name":"Energizer Hardcase H550S","os":"Android 7.0 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_power_max_p16k_pro","brand":"Energizer","name":"Energizer Power Max P16K Pro","os":"Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":403,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_power_max_p490","brand":"Energizer","name":"Energizer Power Max P490","os":"Android 8.0 (Oreo Go)","year":2018,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":217,"inches":4.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_power_max_p490s","brand":"Energizer","name":"Energizer Power Max P490S","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":217,"inches":4.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_power_max_p600s","brand":"Energizer","name":"Energizer Power Max P600S","os":"Android 7.0 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":409,"inches":5.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_3","brand":"Google","name":"Google Pixel 3","os":"Android 9.0 (Pie), upgradable to Android 12","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":443,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_3_xl","brand":"Google","name":"Google Pixel 3 XL","os":"Android 9.0 (Pie), upgradable to Android 12","year":2018,"form":"Phone","tablet":false,"w":1440,"h":2960,"ppi":523,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_10","brand":"Honor","name":"Honor 10","os":"Android 8.1 (Oreo), upgradable to Android 10, EMUI 10","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":432,"inches":5.84,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_10_lite","brand":"Honor","name":"Honor 10 Lite","os":"Android 9.0 (Pie), EMUI 9.1","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":415,"inches":6.21,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_7a","brand":"Honor","name":"Honor 7A","os":"Android 8.0 (Oreo), EMUI 8","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_7c","brand":"Honor","name":"Honor 7C","os":"Android 8.0 (Oreo), EMUI 8","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":269,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_7s","brand":"Honor","name":"Honor 7S","os":"Android 8.1 (Oreo), EMUI 8.1","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_8c","brand":"Honor","name":"Honor 8C","os":"Android 8.1 (Oreo), EMUI 8.2","year":2018,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":269,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_8x","brand":"Honor","name":"Honor 8X","os":"Android 8.1 (Oreo), upgradable to Android 9.0 (Pie), EMUI 9.","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":397,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_8x_max","brand":"Honor","name":"Honor 8X Max","os":"Android 8.1 (Oreo), upgradable to Android 9 (Pie), EMUI 9","year":2018,"form":"Tablet","tablet":true,"w":1080,"h":2244,"ppi":350,"inches":7.12,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_9n_9i","brand":"Honor","name":"Honor 9N (9i)","os":"Android 8.0 (Oreo), EMUI 8","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":432,"inches":5.84,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic_2","brand":"Honor","name":"Honor Magic 2","os":"Android 9.0 (Pie), EMUI 9 or Magic UI 2","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_note_10","brand":"Honor","name":"Honor Note 10","os":"Android 8.1 (Oreo), EMUI 8.2","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2220,"ppi":355,"inches":6.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_play","brand":"Honor","name":"Honor Play","os":"Android 8.1 (Oreo), upgradable to Android 9.0 (Pie), EMUI 9.","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_view_20","brand":"Honor","name":"Honor View 20","os":"Android 9.0 (Pie), upgradable to Android 10, Magic UI 4.0","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2310,"ppi":398,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_12","brand":"Htc","name":"HTC Desire 12","os":"Android 7.x (Nougat)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_12+","brand":"Htc","name":"HTC Desire 12+","os":"Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":268,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_12s","brand":"Htc","name":"HTC Desire 12s","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_exodus_1","brand":"Htc","name":"HTC Exodus 1","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1440,"h":2880,"ppi":537,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_u11_eyes","brand":"Htc","name":"HTC U11 Eyes","os":"Android 8.0 (Oreo), Sense UI","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_u12_life","brand":"Htc","name":"HTC U12 life","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_u12+","brand":"Htc","name":"HTC U12+","os":"Android 8.0 (Oreo), upgradable to Android 9.0 (Pie), Sense U","year":2018,"form":"Phone","tablet":false,"w":1440,"h":2880,"ppi":537,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_enjoy_9","brand":"Huawei","name":"Huawei Enjoy 9","os":"Android 8.1 (Oreo), EMUI 8.2","year":2018,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":269,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_20","brand":"Huawei","name":"Huawei Mate 20","os":"Android 9.0 (Pie), EMUI 9.1","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2244,"ppi":381,"inches":6.53,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_20_lite","brand":"Huawei","name":"Huawei Mate 20 lite","os":"Android 8.1 (Oreo), upgradable to Android 10, EMUI 12","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_20_pro","brand":"Huawei","name":"Huawei Mate 20 Pro","os":"Android 9.0 (Pie), EMUI 9.1","year":2018,"form":"Phone","tablet":false,"w":1440,"h":3120,"ppi":538,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_20_rs_porsche_design","brand":"Huawei","name":"Huawei Mate 20 RS Porsche Design","os":"Android 9.0 (Pie), EMUI 9.1","year":2018,"form":"Phone","tablet":false,"w":1440,"h":3120,"ppi":538,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_20_x","brand":"Huawei","name":"Huawei Mate 20 X","os":"Android 9.0 (Pie), EMUI 9.1","year":2018,"form":"Tablet","tablet":true,"w":1080,"h":2244,"ppi":346,"inches":7.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_rs_porsche_design","brand":"Huawei","name":"Huawei Mate RS Porsche Design","os":"Android 8.1 (Oreo), EMUI 9.1","year":2018,"form":"Phone","tablet":false,"w":1440,"h":2880,"ppi":538,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_m5_10","brand":"Huawei","name":"Huawei MediaPad M5 10","os":"Android 8.0 (Oreo), EMUI 8","year":2018,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":280,"inches":10.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_m5_10_pro","brand":"Huawei","name":"Huawei MediaPad M5 10 (Pro)","os":"Android 8.0 (Oreo), EMUI 8","year":2018,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":280,"inches":10.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_m5_8","brand":"Huawei","name":"Huawei MediaPad M5 8","os":"Android 8.0 (Oreo), EMUI 8","year":2018,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":359,"inches":8.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_m5_lite","brand":"Huawei","name":"Huawei MediaPad M5 lite","os":"Android 8.0 (Oreo), EMUI 8","year":2018,"form":"Tablet","tablet":true,"w":1920,"h":1200,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_t5","brand":"Huawei","name":"Huawei MediaPad T5","os":"Android 8.0 (Oreo), EMUI 8","year":2018,"form":"Tablet","tablet":true,"w":1920,"h":1200,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_3","brand":"Huawei","name":"Huawei nova 3","os":"Android 8.1 (Oreo), upgradable to Android 9.0 (Pie), EMUI 9.","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_3i","brand":"Huawei","name":"Huawei nova 3i","os":"Android 8.1 (Oreo), upgradable to Android 9.0 (Pie), EMUI 9.","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_4","brand":"Huawei","name":"Huawei nova 4","os":"Android 9.0 (Pie), EMUI 9","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2310,"ppi":398,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p_smart_2019","brand":"Huawei","name":"Huawei P smart 2019","os":"Android 9.0 (Pie), EMUI 9.1, Google Play Services","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":415,"inches":6.21,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p_smart+_2019","brand":"Huawei","name":"Huawei P Smart+ 2019","os":"Android 9.0 (Pie), EMUI 9, Google Play Services","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":415,"inches":6.21,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p20","brand":"Huawei","name":"Huawei P20","os":"Android 8.1 (Oreo), upgradable to Android 9.0 (Pie), EMUI 9.","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2240,"ppi":429,"inches":5.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p20_lite","brand":"Huawei","name":"Huawei P20 lite","os":"Android 8.0 (Oreo), upgradable to Android 9.0 (Pie), EMUI 9.","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":432,"inches":5.84,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p20_pro","brand":"Huawei","name":"Huawei P20 Pro","os":"Android 8.1 (Oreo), upgradable to Android 10, EMUI 12","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2240,"ppi":408,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y_max","brand":"Huawei","name":"Huawei Y Max","os":"Android 8.1 (Oreo), EMUI 8.2","year":2018,"form":"Tablet","tablet":true,"w":1080,"h":2244,"ppi":350,"inches":7.12,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y3_2018","brand":"Huawei","name":"Huawei Y3 (2018)","os":"Android 8.0 Oreo (Go edition)","year":2018,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y5_lite_2018","brand":"Huawei","name":"Huawei Y5 lite (2018)","os":"Android 8.1 Oreo (Go edition), EMUI 8","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y5_prime_2018","brand":"Huawei","name":"Huawei Y5 Prime (2018)","os":"Android 8.1 (Oreo), EMUI 8","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y6_2018","brand":"Huawei","name":"Huawei Y6 (2018)","os":"Android 8.0 (Oreo), EMUI 8","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y6_prime_2018","brand":"Huawei","name":"Huawei Y6 Prime (2018)","os":"Android 8.0 (Oreo), EMUI 8","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y7_2018","brand":"Huawei","name":"Huawei Y7 (2018)","os":"Android 8.0 (Oreo), EMUI 8","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":269,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y7_prime_2018","brand":"Huawei","name":"Huawei Y7 Prime (2018)","os":"Android 8.0 (Oreo), EMUI 8","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":269,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y7_pro_2018","brand":"Huawei","name":"Huawei Y7 Pro (2018)","os":"Android 8.0 (Oreo), EMUI 8","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":269,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y9_2018","brand":"Huawei","name":"Huawei Y9 (2018)","os":"Android 8.0 (Oreo), EMUI 8","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":407,"inches":5.93,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y9_2019","brand":"Huawei","name":"Huawei Y9 (2019)","os":"Android 8.1 (Oreo), EMUI 8.2","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":396,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_6","brand":"Infinix","name":"Infinix Hot 6","os":"Android 8.1 (Oreo) - 2 GB model","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":268,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_6_pro","brand":"Infinix","name":"Infinix Hot 6 Pro","os":"Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":268,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_6x","brand":"Infinix","name":"Infinix Hot 6X","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1500,"ppi":268,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_s3","brand":"Infinix","name":"Infinix Hot S3","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_4","brand":"Infinix","name":"Infinix Note 4","os":"Android 7.0 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":386,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_5","brand":"Infinix","name":"Infinix Note 5","os":"Android 8.1 (Oreo), Android One","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_5_stylus","brand":"Infinix","name":"Infinix Note 5 Stylus","os":"Android 8.1 (Oreo), Android One","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":403,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_s3x","brand":"Infinix","name":"Infinix S3X","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1500,"ppi":268,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart_2","brand":"Infinix","name":"Infinix Smart 2","os":"Android 8.1 (Oreo) or Android 8.1 Oreo (Go edition)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart_2_hd","brand":"Infinix","name":"Infinix Smart 2 HD","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":268,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart_2_pro","brand":"Infinix","name":"Infinix Smart 2 Pro","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_zero_5","brand":"Infinix","name":"Infinix Zero 5","os":"Android 7.0 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":368,"inches":5.98,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_zero_5_pro","brand":"Infinix","name":"Infinix Zero 5 Pro","os":"Android 7.0 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":368,"inches":5.98,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a5","brand":"Lenovo","name":"Lenovo A5","os":"Android 8.0 (Oreo), ZUI 3.9","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k5","brand":"Lenovo","name":"Lenovo K5","os":"Android 7.1 (Nougat), ZUI Lite 3.1","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k5_note_2018","brand":"Lenovo","name":"Lenovo K5 Note (2018)","os":"Android 8.0 (Oreo), ZUI 3.9","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":268,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k5_play","brand":"Lenovo","name":"Lenovo K5 play","os":"Android 8.0 (Oreo), ZUI 3.7","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k5_pro","brand":"Lenovo","name":"Lenovo K5 Pro","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":403,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k9","brand":"Lenovo","name":"Lenovo K9","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_s5","brand":"Lenovo","name":"Lenovo S5","os":"Android 8.0 (Oreo), ZUI 3.7","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":424,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_s5_pro","brand":"Lenovo","name":"Lenovo S5 Pro","os":"Android 8.1 (Oreo), ZUI 5","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2246,"ppi":402,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_s5_pro_gt","brand":"Lenovo","name":"Lenovo S5 Pro GT","os":"Android 8.1 (Oreo), ZUI 10","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2246,"ppi":402,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_z5","brand":"Lenovo","name":"Lenovo Z5","os":"Android 8.1 (Oreo), ZUI 3.9","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2246,"ppi":402,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_z5_pro","brand":"Lenovo","name":"Lenovo Z5 Pro","os":"Android 8.1 (Oreo), ZUI 10","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_z5_pro_gt","brand":"Lenovo","name":"Lenovo Z5 Pro GT","os":"Android 8.1 (Oreo), upgradable to Android 10, ZUI 11.5","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_z5s","brand":"Lenovo","name":"Lenovo Z5s","os":"Android 9.0 (Pie), ZUI 10","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_aristo_2","brand":"Lg","name":"LG Aristo 2","os":"Android 7.1.2 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_candy","brand":"Lg","name":"LG Candy","os":"Android 7.1.2 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g7_fit","brand":"Lg","name":"LG G7 Fit","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1440,"h":3120,"ppi":563,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g7_one","brand":"Lg","name":"LG G7 One","os":"Android 8.1 (Oreo), upgradable to Android 10, Android One","year":2018,"form":"Phone","tablet":false,"w":1440,"h":3120,"ppi":563,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g7_thinq","brand":"Lg","name":"LG G7 ThinQ","os":"Android 8.0 (Oreo), upgradable to Android 10","year":2018,"form":"Phone","tablet":false,"w":1440,"h":3120,"ppi":564,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k10_2018","brand":"Lg","name":"LG K10 (2018)","os":"Android 7.1.2 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":277,"inches":5.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k11_plus","brand":"Lg","name":"LG K11 Plus","os":"Android 7.1.2 (Nougat), upgradable to Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":277,"inches":5.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k30","brand":"Lg","name":"LG K30","os":"Android 7.1 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":277,"inches":5.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k8_2018","brand":"Lg","name":"LG K8 (2018)","os":"Android 7.1.2 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_q_stylo_4","brand":"Lg","name":"LG Q Stylo 4","os":"Android 8.1 (Oreo), LG UX 7","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":390,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_q_stylus","brand":"Lg","name":"LG Q Stylus","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":389,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_q7","brand":"Lg","name":"LG Q7","os":"Android 8.1 (Oreo), upgradable to Android 9.0 (Pie)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":442,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_q8_2018","brand":"Lg","name":"LG Q8 (2018)","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":389,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_v30s_thinq","brand":"Lg","name":"LG V30S ThinQ","os":"Android 8.0 (Oreo), LG UX 6","year":2018,"form":"Phone","tablet":false,"w":1440,"h":2880,"ppi":538,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_v35_thinq","brand":"Lg","name":"LG V35 ThinQ","os":"Android 8.0 (Oreo), upgradable to Android 9.0 (Pie)","year":2018,"form":"Phone","tablet":false,"w":1440,"h":2880,"ppi":538,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_v40_thinq","brand":"Lg","name":"LG V40 ThinQ","os":"Android 8.1 (Oreo), upgradable to Android 10","year":2018,"form":"Phone","tablet":false,"w":1440,"h":3120,"ppi":537,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_x_power_3","brand":"Lg","name":"LG X power 3","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_x4+","brand":"Lg","name":"LG X4+","os":"Android 7.0 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":277,"inches":5.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_zone_4","brand":"Lg","name":"LG Zone 4","os":"Android 7.1.2 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_15","brand":"Meizu","name":"Meizu 15","os":"Android 7.1.2 (Nougat), Flyme 7.3","year":2018,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.46,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_15_lite","brand":"Meizu","name":"Meizu 15 Lite","os":"Android 7.1.2 (Nougat), Flyme 7","year":2018,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.46,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_15_plus","brand":"Meizu","name":"Meizu 15 Plus","os":"Android 7.1.2 (Nougat), Flyme 7.3","year":2018,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":494,"inches":5.95,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_16","brand":"Meizu","name":"Meizu 16","os":"Android 8.1 (Oreo), Flyme UI","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_16_plus","brand":"Meizu","name":"Meizu 16 Plus","os":"Android 8.0 (Oreo), Flyme UI","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":374,"inches":6.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_16x","brand":"Meizu","name":"Meizu 16X","os":"Android 8.0 (Oreo), Flyme UI","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_c9","brand":"Meizu","name":"Meizu C9","os":"Android 8.0 (Oreo), Flyme UI","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_c9_pro","brand":"Meizu","name":"Meizu C9 Pro","os":"Android 8.0 (Oreo), Flyme UI","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_e3","brand":"Meizu","name":"Meizu E3","os":"Android 7.1.2 (Nougat), Flyme 7","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":403,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_m6s","brand":"Meizu","name":"Meizu M6s","os":"Android 7.0 (Nougat), Flyme 6.2","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_m6t","brand":"Meizu","name":"Meizu M6T","os":"Android 7.0 (Nougat), Flyme UI","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_m8c","brand":"Meizu","name":"Meizu M8c","os":"Android 7.0 (Nougat), Flyme UI","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_note_8","brand":"Meizu","name":"Meizu Note 8","os":"Android 8.0 (Oreo), Flyme 7.3","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_v8","brand":"Meizu","name":"Meizu V8","os":"Android 8.0 (Oreo), Flyme UI","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_v8_pro","brand":"Meizu","name":"Meizu V8 Pro","os":"Android 8.0 (Oreo), Flyme UI","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_x8","brand":"Meizu","name":"Meizu X8","os":"Android 8.0 (Oreo), Flyme UI","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2220,"ppi":398,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bharat_5_infinity","brand":"Micromax","name":"Micromax Bharat 5 Infinity","os":"Android 8.1 Oreo (Go edition)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bharat_5_plus","brand":"Micromax","name":"Micromax Bharat 5 Plus","os":"Android 7.0 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bharat_5_pro","brand":"Micromax","name":"Micromax Bharat 5 Pro","os":"Android 7.0 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bharat_go","brand":"Micromax","name":"Micromax Bharat Go","os":"Android 8.0 Oreo (Go edition)","year":2018,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":207,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_1_2018","brand":"Micromax","name":"Micromax Canvas 1 2018","os":"Android 7.0 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_infinity_life","brand":"Micromax","name":"Micromax Canvas Infinity Life","os":"Android 7.1.2 (Nougat), upgradable to Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_infinity_n11","brand":"Micromax","name":"Micromax Infinity N11","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1500,"ppi":269,"inches":6.19,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_infinity_n12","brand":"Micromax","name":"Micromax Infinity N12","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1500,"ppi":269,"inches":6.19,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e5","brand":"Motorola","name":"Motorola Moto E5","os":"Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e5_cruise","brand":"Motorola","name":"Motorola Moto E5 Cruise","os":"Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e5_play","brand":"Motorola","name":"Motorola Moto E5 Play","os":"Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e5_play_go","brand":"Motorola","name":"Motorola Moto E5 Play Go","os":"Android 8.0 Oreo (Go edition)","year":2018,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":206,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e5_plus","brand":"Motorola","name":"Motorola Moto E5 Plus","os":"Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":268,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g6","brand":"Motorola","name":"Motorola Moto G6","os":"Android 8.0 (Oreo), upgradable to Android 9.0 (Pie)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":424,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g6_play","brand":"Motorola","name":"Motorola Moto G6 Play","os":"Android 8.0 (Oreo), upgradable to Android 9.0 (Pie)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g6_plus","brand":"Motorola","name":"Motorola Moto G6 Plus","os":"Android 8.0 (Oreo), upgradable to Android 9.0 (Pie)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":409,"inches":5.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_z3","brand":"Motorola","name":"Motorola Moto Z3","os":"Android 8.1 (Oreo), upgradable to Android 9.0 (Pie)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.01,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_z3_play","brand":"Motorola","name":"Motorola Moto Z3 Play","os":"Android 8.1 (Oreo), upgradable to Android 9.0 (Pie)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.01,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_one_p30_play","brand":"Motorola","name":"Motorola One (P30 Play)","os":"Android 8.1 (Oreo), upgradable to Android 10, Android One","year":2018,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":287,"inches":5.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_one_power_p30_note","brand":"Motorola","name":"Motorola One Power (P30 Note)","os":"Android 8.1 (Oreo), upgradable to Android 10, Android One, Z","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2246,"ppi":403,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_p30","brand":"Motorola","name":"Motorola P30","os":"Android 8 (Oreo), ZUI 4","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2246,"ppi":402,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_1","brand":"Nokia","name":"Nokia 1","os":"Android 8.1 Oreo (Go edition)","year":2018,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_2.1","brand":"Nokia","name":"Nokia 2.1","os":"Android 8.1 Oreo (Go edition), upgradable to Android 10.0, A","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_3.1","brand":"Nokia","name":"Nokia 3.1","os":"Android 8.0 (Oreo), upgradable to Android 10, Android One","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":310,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_3.1_plus","brand":"Nokia","name":"Nokia 3.1 Plus","os":"Android 8.1 (Oreo), upgradable to Android 10, Android One","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":268,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_5.1","brand":"Nokia","name":"Nokia 5.1","os":"Android 8.0 (Oreo), upgradable to Android 10, Android One","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":439,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_6.1","brand":"Nokia","name":"Nokia 6.1","os":"Android 8.1 (Oreo), upgradable to Android 10, Android One","year":2018,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_6.1_plus_nokia_x6","brand":"Nokia","name":"Nokia 6.1 Plus (Nokia X6)","os":"Android 8.1 (Oreo), upgradable to Android 10, Android One","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":432,"inches":5.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_7_plus","brand":"Nokia","name":"Nokia 7 plus","os":"Android 8.1 (Oreo), upgradable to Android 10, Android One","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":403,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_7.1","brand":"Nokia","name":"Nokia 7.1","os":"Android 8.1 (Oreo), upgradable to Android 10, Android One","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":432,"inches":5.84,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_8_sirocco","brand":"Nokia","name":"Nokia 8 Sirocco","os":"Android 8.0 (Oreo), upgradable to Android 10, Android One","year":2018,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":534,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_8.1_nokia_x7","brand":"Nokia","name":"Nokia 8.1 (Nokia X7)","os":"Android 9.0 (Pie), upgradable to Android 11, Android One","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":408,"inches":6.18,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_6","brand":"Oneplus","name":"OnePlus 6","os":"Android 8.1 (Oreo), upgradable to Android 11, OxygenOS 11.1.","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":402,"inches":6.28,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_6t","brand":"Oneplus","name":"OnePlus 6T","os":"Android 9.0 (Pie), upgradable to Android 11, OxygenOS 11.1.1","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":402,"inches":6.41,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_6t_mclaren","brand":"Oneplus","name":"OnePlus 6T McLaren","os":"Android 9.0 (Pie), upgradable to Android 10, OxygenOS 10","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":402,"inches":6.41,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a1_2018","brand":"Oppo","name":"Oppo A1 (2018)","os":"Android 7.1.1 (Nougat), ColorOS 3.2","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a3_2018","brand":"Oppo","name":"Oppo A3 (2018)","os":"Android 8.1 (Oreo), ColorOS 5","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":405,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a3s","brand":"Oppo","name":"Oppo A3s","os":"Android 8.1 (Oreo), ColorOS 5.1","year":2018,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a5_ax5","brand":"Oppo","name":"Oppo A5 (AX5)","os":"Android 8.1 (Oreo), ColorOS 5.1","year":2018,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a7","brand":"Oppo","name":"Oppo A7","os":"Android 8.1 (Oreo), ColorOS 5.2","year":2018,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a71_2018","brand":"Oppo","name":"Oppo A71 (2018)","os":"Android 7.1 (Nougat), , ColorOS 3.2","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a7x","brand":"Oppo","name":"Oppo A7x","os":"Android 8.1 (Oreo), ColorOS 5.2","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a83","brand":"Oppo","name":"Oppo A83","os":"Android 7.1 (Nougat), ColorOS 3.2","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f7","brand":"Oppo","name":"Oppo F7","os":"Android 8.1 (Oreo), ColorOS 5","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":405,"inches":6.23,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f7_youth","brand":"Oppo","name":"Oppo F7 Youth","os":"Android 8.1 (Oreo), ColorOS 5.2","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f9_f9_pro","brand":"Oppo","name":"Oppo F9 (F9 Pro)","os":"Android 8.1 (Oreo), upgradable to Android 10, ColorOS 7.0","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_x","brand":"Oppo","name":"Oppo Find X","os":"Android 8.1 (Oreo), upgradable to Android 10, ColorOS 7.0","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":401,"inches":6.42,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_x_lamborghini","brand":"Oppo","name":"Oppo Find X Lamborghini","os":"Android 8.1 (Oreo), upgradable to Android 10, ColorOS 7.0","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":401,"inches":6.42,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_k1","brand":"Oppo","name":"Oppo K1","os":"Android 8.1 (Oreo), ColorOS 5.2","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":402,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_r15","brand":"Oppo","name":"Oppo R15","os":"Android 8.1 (Oreo), ColorOS 5","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":401,"inches":6.28,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_r15_pro","brand":"Oppo","name":"Oppo R15 Pro","os":"Android 8.1 (Oreo), ColorOS 5","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":401,"inches":6.28,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_r15x","brand":"Oppo","name":"Oppo R15x","os":"Android 8.1 (Oreo), planned upgrade to Android 9.0 (Pie), Co","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":402,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_r17","brand":"Oppo","name":"Oppo R17","os":"Android 8.1 (Oreo), 9.0 (Pie), planned upgrade to Android 10","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_rx17_neo","brand":"Oppo","name":"Oppo RX17 Neo","os":"Android 8.1 (Oreo), ColorOS 5.2","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":402,"inches":6.41,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_rx17_pro","brand":"Oppo","name":"Oppo RX17 Pro","os":"Android 8.1 (Oreo), upgradable to Android 10, ColorOS 7.0","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":402,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_1","brand":"Realme","name":"Realme 1","os":"Android 8.1 (Oreo), upgradable to Android 9.0 (Pie), ColorOS","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_2","brand":"Realme","name":"Realme 2","os":"Android 8.1 (Oreo), upgradable to Android 9.0 (Pie), ColorOS","year":2018,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_2_pro","brand":"Realme","name":"Realme 2 Pro","os":"Android 8.1 (Oreo), upgradable to Android 10, Realme UI","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_c1","brand":"Realme","name":"Realme C1","os":"Android 8.1 (Oreo), ColorOS 5.2","year":2018,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"realme_realme_u1","brand":"Realme","name":"Realme U1","os":"Android 8.1 (Oreo), upgradable to Android 9.0 (Pie), ColorOS","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a6_2018","brand":"Samsung","name":"Samsung Galaxy A6 (2018)","os":"Android 8.0 (Oreo), upgradable to Android 10, One UI 2.0","year":2018,"form":"Phone","tablet":false,"w":720,"h":1480,"ppi":294,"inches":5.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a6+_2018","brand":"Samsung","name":"Samsung Galaxy A6+ (2018)","os":"Android 8.0 (Oreo), upgradable to Android 9.0 (Pie), One UI","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2220,"ppi":411,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a6s","brand":"Samsung","name":"Samsung Galaxy A6s","os":"Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a7_2018","brand":"Samsung","name":"Samsung Galaxy A7 (2018)","os":"Android 8.0 (Oreo), upgradable to Android 10, One UI 2.0","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2220,"ppi":411,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a8_star_a9_star","brand":"Samsung","name":"Samsung Galaxy A8 Star (A9 Star)","os":"Android 8.0 (Oreo), upgradable to Android 9.0 (Pie), One UI","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2220,"ppi":392,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a8s","brand":"Samsung","name":"Samsung Galaxy A8s","os":"Android 9.0 (Pie), One UI","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a9_2018","brand":"Samsung","name":"Samsung Galaxy A9 (2018)","os":"Android 8.0 (Oreo), upgradable to Android 9.0 (Pie)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2220,"ppi":393,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j2_core","brand":"Samsung","name":"Samsung Galaxy J2 Core","os":"Android 8.1 Oreo (Go edition)","year":2018,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j2_pro_2018","brand":"Samsung","name":"Samsung Galaxy J2 Pro (2018)","os":"Android 7.1 (Nougat), upgradable to Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j3_2018","brand":"Samsung","name":"Samsung Galaxy J3 (2018)","os":"Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j4","brand":"Samsung","name":"Samsung Galaxy J4","os":"Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j4_core","brand":"Samsung","name":"Samsung Galaxy J4 Core","os":"Android 8.1 Oreo (Go edition)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1480,"ppi":274,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j4+","brand":"Samsung","name":"Samsung Galaxy J4+","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1480,"ppi":274,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j6","brand":"Samsung","name":"Samsung Galaxy J6","os":"Android 8.0 (Oreo), upgradable to Android 10, One UI 2.0","year":2018,"form":"Phone","tablet":false,"w":720,"h":1480,"ppi":293,"inches":5.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j6+","brand":"Samsung","name":"Samsung Galaxy J6+","os":"Android 8.1 (Oreo), upgradable to Android 9.0 (Pie), One UI","year":2018,"form":"Phone","tablet":false,"w":720,"h":1480,"ppi":274,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j7_2018","brand":"Samsung","name":"Samsung Galaxy J7 (2018)","os":"Android 8.0 (Oreo), upgradable to Android 9.0 (Pie), One UI","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j7_duo","brand":"Samsung","name":"Samsung Galaxy J7 Duo","os":"Android 8.0 (Oreo), upgradable to Android 9.0 (Pie)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j7_prime_2","brand":"Samsung","name":"Samsung Galaxy J7 Prime 2","os":"Android 7.0 (Nougat), upgradable to Android 9.0 (Pie)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j8","brand":"Samsung","name":"Samsung Galaxy J8","os":"Android 8.0 (Oreo), upgradable to Android 9.0 (Pie)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1480,"ppi":274,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note9","brand":"Samsung","name":"Samsung Galaxy Note9","os":"Android 8.1 (Oreo), upgradable to Android 10, One UI 2.5","year":2018,"form":"Phone","tablet":false,"w":1440,"h":2960,"ppi":516,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_on6","brand":"Samsung","name":"Samsung Galaxy On6","os":"Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1480,"ppi":294,"inches":5.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s_light_luxury","brand":"Samsung","name":"Samsung Galaxy S Light Luxury","os":"Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2220,"ppi":426,"inches":5.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s9","brand":"Samsung","name":"Samsung Galaxy S9","os":"Android 8.0 (Oreo), upgradable to Android 10, One UI 2.5","year":2018,"form":"Phone","tablet":false,"w":1440,"h":2960,"ppi":570,"inches":5.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s9+","brand":"Samsung","name":"Samsung Galaxy S9+","os":"Android 8.0 (Oreo), upgradable to Android 10, One UI 2.5","year":2018,"form":"Phone","tablet":false,"w":1440,"h":2960,"ppi":529,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_a_10.5","brand":"Samsung","name":"Samsung Galaxy Tab A 10.5","os":"Android 8.1 (Oreo), upgradable to Android 10","year":2018,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":216,"inches":10.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_a_8.0_2018","brand":"Samsung","name":"Samsung Galaxy Tab A 8.0 (2018)","os":"Android 8.1 (Oreo)","year":2018,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_advanced2","brand":"Samsung","name":"Samsung Galaxy Tab Advanced2","os":"Android 8.0 (Oreo)","year":2018,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s4_10.5","brand":"Samsung","name":"Samsung Galaxy Tab S4 10.5","os":"Android 8.1 (Oreo), upgradable to Android 10, One UI 2.0","year":2018,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":287,"inches":10.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_b10","brand":"Sharp","name":"Sharp Aquos B10","os":"Android 7.0 (Nougat), Sharp UI","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_c10","brand":"Sharp","name":"Sharp Aquos C10","os":"Android 8.0 (Oreo), Sharp UI","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2040,"ppi":420,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_d10","brand":"Sharp","name":"Sharp Aquos D10","os":"Android 8.0 (Oreo), Sharp UI","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":403,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_r2","brand":"Sharp","name":"Sharp Aquos R2","os":"Android 8.0 (Oreo), upgradable to Android 10","year":2018,"form":"Phone","tablet":false,"w":1440,"h":3040,"ppi":561,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_r2_compact","brand":"Sharp","name":"Sharp Aquos R2 compact","os":"Android 9.0 (Pie)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":485,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_s3","brand":"Sharp","name":"Sharp Aquos S3","os":"Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_s3_high","brand":"Sharp","name":"Sharp Aquos S3 High","os":"Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_s3_mini","brand":"Sharp","name":"Sharp Aquos S3 mini","os":"Android 7.1.1 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2040,"ppi":420,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_pi","brand":"Sharp","name":"Sharp Pi","os":"Android 7.0 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_r1s","brand":"Sharp","name":"Sharp R1S","os":"Android 7.0 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_l2","brand":"Sony","name":"Sony Xperia L2","os":"Android 7.1.1 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_xa2","brand":"Sony","name":"Sony Xperia XA2","os":"Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_xa2_plus","brand":"Sony","name":"Sony Xperia XA2 Plus","os":"Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_xa2_ultra","brand":"Sony","name":"Sony Xperia XA2 Ultra","os":"Android 8.0 (Oreo), upgradable to Android 9.0 (Pie)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_xz2","brand":"Sony","name":"Sony Xperia XZ2","os":"Android 8.0 (Oreo), upgradable to Android 10","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":424,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_xz2_compact","brand":"Sony","name":"Sony Xperia XZ2 Compact","os":"Android 8.0 (Oreo), upgradable to Android 10","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":483,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_xz2_premium","brand":"Sony","name":"Sony Xperia XZ2 Premium","os":"Android 8.0 (Oreo), upgradable to Android 10","year":2018,"form":"Phone","tablet":false,"w":3840,"h":2160,"ppi":765,"inches":5.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_xz3","brand":"Sony","name":"Sony Xperia XZ3","os":"Android 9.0 (Pie), upgradable to Android 10","year":2018,"form":"Phone","tablet":false,"w":1440,"h":2880,"ppi":537,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_camon_11","brand":"Tecno","name":"Tecno Camon 11","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1500,"ppi":268,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_camon_11_pro","brand":"Tecno","name":"Tecno Camon 11 Pro","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1500,"ppi":268,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_camon_x","brand":"Tecno","name":"Tecno Camon X","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":268,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_camon_x_pro","brand":"Tecno","name":"Tecno Camon X Pro","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_f2","brand":"Tecno","name":"Tecno F2","os":"Android 7.0 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_f2_lte","brand":"Tecno","name":"Tecno F2 LTE","os":"Android 8.1 Oreo (Go edition)","year":2018,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_phantom_8","brand":"Tecno","name":"Tecno Phantom 8","os":"Android 7.0 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":386,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_pop_1","brand":"Tecno","name":"Tecno Pop 1","os":"Android 7.0 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":197,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_pop_1_lite","brand":"Tecno","name":"Tecno Pop 1 Lite","os":"Android 8.1 Oreo (Go edition)","year":2018,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_pop_1_pro","brand":"Tecno","name":"Tecno Pop 1 Pro","os":"Android 7.0 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":197,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_pop_1s","brand":"Tecno","name":"Tecno Pop 1s","os":"Android 8.1 Oreo (Go edition)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_pouvoir_1","brand":"Tecno","name":"Tecno Pouvoir 1","os":"Android 7.0 (Nougat)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_pouvoir_2","brand":"Tecno","name":"Tecno Pouvoir 2","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":268,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_pouvoir_2_pro","brand":"Tecno","name":"Tecno Pouvoir 2 Pro","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":268,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_spark_2","brand":"Tecno","name":"Tecno Spark 2","os":"Android 8.1 Oreo (Go edition)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":268,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_x","brand":"Ulefone_","name":"Ulefone Armor X","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_x2","brand":"Ulefone_","name":"Ulefone Armor X2","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":293,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_s1","brand":"Ulefone_","name":"Ulefone S1","os":"Android 8.1 Oreo (Go edition)","year":2018,"form":"Phone","tablet":false,"w":480,"h":960,"ppi":195,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_t2_pro","brand":"Ulefone_","name":"Ulefone T2 Pro","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2258,"ppi":374,"inches":6.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_f1","brand":"Umidigi","name":"Umidigi F1","os":"Android 9.0 (Pie)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":409,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"umidigi_umidigi_one_max","brand":"Umidigi","name":"Umidigi One Max","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":267,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_nex_dual_display","brand":"Vivo","name":"vivo NEX Dual Display","os":"Android 9.0 (Pie), Funtouch 4.5","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_nex_s","brand":"Vivo","name":"vivo NEX S","os":"Android 8.1 (Oreo), upgradable to Android 9.0 (Pie), Funtouc","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2316,"ppi":388,"inches":6.59,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v11_v11_pro","brand":"Vivo","name":"vivo V11 (V11 Pro)","os":"Android 8.1 (Oreo), upgradable to Android 9.0 (Pie), Funtouc","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":402,"inches":6.41,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v11i","brand":"Vivo","name":"vivo V11i","os":"Android 8.1 (Oreo), Funtouch 4.5","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":400,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v9","brand":"Vivo","name":"vivo V9","os":"Android 8.1 (Oreo), Funtouch 4","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":400,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v9_6gb","brand":"Vivo","name":"vivo V9 6GB","os":"Android 8.1 (Oreo), Funtouch 4","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":400,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v9_youth","brand":"Vivo","name":"vivo V9 Youth","os":"Android 8.1 (Oreo), Funtouch 4","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":400,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x20_plus_ud","brand":"Vivo","name":"vivo X20 Plus UD","os":"Android 7.1.1 (Nougat), Funtouch 3.2","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":376,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x21","brand":"Vivo","name":"vivo X21","os":"Android 8.1 (Oreo), Funtouch 4","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":402,"inches":6.28,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x21_ud","brand":"Vivo","name":"vivo X21 UD","os":"Android 8.1 (Oreo), Funtouch 4","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":402,"inches":6.28,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x21i","brand":"Vivo","name":"vivo X21i","os":"Android 8.1 (Oreo), Funtouch 4","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":402,"inches":6.28,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x23","brand":"Vivo","name":"vivo X23","os":"Android 8.1 (Oreo), Funtouch 4.5","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":402,"inches":6.41,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y53i","brand":"Vivo","name":"vivo Y53i","os":"Android 6 (Marshmallow), Funtouch 3","year":2018,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y71","brand":"Vivo","name":"vivo Y71","os":"Android 8.1 (Oreo), Funtouch 4","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":268,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y71i","brand":"Vivo","name":"vivo Y71i","os":"Android 8.1 (Oreo), Funtouch 4","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":268,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y81","brand":"Vivo","name":"vivo Y81","os":"Android 8.1 (Oreo), Funtouch 4","year":2018,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y81i","brand":"Vivo","name":"vivo Y81i","os":"Android 8.1 (Oreo), Funtouch 4","year":2018,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y83","brand":"Vivo","name":"vivo Y83","os":"Android 8.1 (Oreo), Funtouch 4","year":2018,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y83_pro","brand":"Vivo","name":"vivo Y83 Pro","os":"Android 8.1 (Oreo), Funtouch 4","year":2018,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y91","brand":"Vivo","name":"vivo Y91","os":"Android 8.1 (Oreo), Funtouch 4.5","year":2018,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y91i","brand":"Vivo","name":"vivo Y91i","os":"Android 8.1 (Oreo), Funtouch 4.5","year":2018,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y93","brand":"Vivo","name":"vivo Y93","os":"Android 8.1 (Oreo), Funtouch 4.5","year":2018,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y93_mediatek","brand":"Vivo","name":"vivo Y93 (Mediatek)","os":"Android 8.1 (Oreo), Funtouch 4.5","year":2018,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y93s","brand":"Vivo","name":"vivo Y93s","os":"Android 8.1 (Oreo), Funtouch 4.5","year":2018,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":271,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y95","brand":"Vivo","name":"vivo Y95","os":"Android 8.1 (Oreo), Funtouch 4.5","year":2018,"form":"Phone","tablet":false,"w":720,"h":1520,"ppi":270,"inches":6.22,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y97","brand":"Vivo","name":"vivo Y97","os":"Android 8.1 (Oreo), Funtouch 4.5","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":400,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_z1","brand":"Vivo","name":"vivo Z1","os":"Android 8.1 (Oreo), Funtouch 4","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":403,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_z1_lite","brand":"Vivo","name":"vivo Z1 Lite","os":"Android 8.1 (Oreo), Funtouch 4","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":403,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_z1i","brand":"Vivo","name":"vivo Z1i","os":"Android 8.1 (Oreo), Funtouch 4","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":403,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_z3","brand":"Vivo","name":"vivo Z3","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":400,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_z3i","brand":"Vivo","name":"vivo Z3i","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":400,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_black_shark","brand":"Xiaomi","name":"Xiaomi Black Shark","os":"Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":403,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_black_shark_helo","brand":"Xiaomi","name":"Xiaomi Black Shark Helo","os":"Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.01,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_8","brand":"Xiaomi","name":"Xiaomi Mi 8","os":"Android 8.1 (Oreo), upgradable to Android 10, MIUI 12","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2248,"ppi":402,"inches":6.21,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_8_explorer","brand":"Xiaomi","name":"Xiaomi Mi 8 Explorer","os":"Android 8.1 (Oreo), upgradable to Android 10, MIUI 12","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2248,"ppi":402,"inches":6.21,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_8_lite","brand":"Xiaomi","name":"Xiaomi Mi 8 Lite","os":"Android 8.1 (Oreo), upgradable to Android 10, MIUI 11","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":403,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_8_pro","brand":"Xiaomi","name":"Xiaomi Mi 8 Pro","os":"Android 8.1 (Oreo), planned upgrade to Android 10, MIUI 12","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2248,"ppi":402,"inches":6.21,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_8_se","brand":"Xiaomi","name":"Xiaomi Mi 8 SE","os":"Android 8.1 (Oreo), MIUI 9.5","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2244,"ppi":423,"inches":5.88,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_a2_mi_6x","brand":"Xiaomi","name":"Xiaomi Mi A2 (Mi 6X)","os":"Android 8.1 (Oreo), upgradable to Android 9.0 (Pie), Android","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":403,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_a2_lite_redmi_6_pro","brand":"Xiaomi","name":"Xiaomi Mi A2 Lite (Redmi 6 Pro)","os":"Android 8.1 (Oreo), upgradable to Android 10, MIUI 12, Andro","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":432,"inches":5.84,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_max_3","brand":"Xiaomi","name":"Xiaomi Mi Max 3","os":"Android 8.1 (Oreo), upgradable to Android 10, MIUI 12","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":350,"inches":6.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_mix_2s","brand":"Xiaomi","name":"Xiaomi Mi Mix 2S","os":"Android 8.0 (Oreo), upgradable to Android 10, MIUI 12","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":403,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_mix_3","brand":"Xiaomi","name":"Xiaomi Mi Mix 3","os":"Android 9.0 (Pie), upgradable to Android 10, MIUI 12","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2340,"ppi":403,"inches":6.39,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_pad_4","brand":"Xiaomi","name":"Xiaomi Mi Pad 4","os":"Android 8.1 (Oreo), MIUI 9","year":2018,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":283,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_pad_4_plus","brand":"Xiaomi","name":"Xiaomi Mi Pad 4 Plus","os":"Android 8.1 (Oreo), MIUI 10","year":2018,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_play","brand":"Xiaomi","name":"Xiaomi Mi Play","os":"Android 9.0 (Pie)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":432,"inches":5.84,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_pocophone_f1","brand":"Xiaomi","name":"Xiaomi Pocophone F1","os":"Android 8.1 (Oreo), upgradable to Android 10, MIUI 12","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2246,"ppi":403,"inches":6.18,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_5_plus_redmi_note_5","brand":"Xiaomi","name":"Xiaomi Redmi 5 Plus (Redmi Note 5)","os":"Android 7.1.2 (Nougat), planned upgrade to Android 10, MIUI ","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":403,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_6","brand":"Xiaomi","name":"Xiaomi Redmi 6","os":"Android 8.1 (Oreo), planned upgrade to Android 10, MIUI 12","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_6a","brand":"Xiaomi","name":"Xiaomi Redmi 6A","os":"Android 8.1 (Oreo), planned upgrade to Android 10, MIUI 12","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_5_ai_dual_camera","brand":"Xiaomi","name":"Xiaomi Redmi Note 5 AI Dual Camera","os":"Android 8.0 (Oreo), MIUI 9","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":403,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_5_pro","brand":"Xiaomi","name":"Xiaomi Redmi Note 5 Pro","os":"Android 7.1.2 (Nougat), planned upgrade to Android 10, MIUI ","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":403,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_6_pro","brand":"Xiaomi","name":"Xiaomi Redmi Note 6 Pro","os":"Android 8.1 (Oreo), planned upgrade to Android 10, MIUI 12","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":403,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_s2_redmi_y2","brand":"Xiaomi","name":"Xiaomi Redmi S2 (Redmi Y2)","os":"Android 8.1 (Oreo), upgradable to Android 9, MIUI 12","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":269,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_9_pro","brand":"Zte","name":"ZTE Axon 9 Pro","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2248,"ppi":402,"inches":6.21,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a7_vita","brand":"Zte","name":"ZTE Blade A7 Vita","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v9","brand":"Zte","name":"ZTE Blade V9","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":424,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v9_vita","brand":"Zte","name":"ZTE Blade V9 Vita","os":"Android 8.1 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":295,"inches":5.45,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_n3","brand":"Zte","name":"ZTE nubia N3","os":"Android 7.1 (Nougat), nubia UI 5.1","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":403,"inches":6.01,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic","brand":"Zte","name":"ZTE nubia Red Magic","os":"Android 8.1 (Oreo), Redmagic 1.0","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_red_magic_mars","brand":"Zte","name":"ZTE nubia Red Magic Mars","os":"Android 9.0 (Pie), Redmagic 1.0","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_v18","brand":"Zte","name":"ZTE nubia V18","os":"Android 7.1 (Nougat), upgradable to Android 8.0 (Oreo)","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.01,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_x","brand":"Zte","name":"ZTE nubia X","os":"Android 8.1 (Oreo), Nubia UI 6","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2280,"ppi":403,"inches":6.26,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z18","brand":"Zte","name":"ZTE nubia Z18","os":"Android 8.1 (Oreo), nubia UI 6","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":403,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z18_mini","brand":"Zte","name":"ZTE nubia Z18 mini","os":"Android 8.1 (Oreo), nubia UI","year":2018,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":424,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_tempo_go","brand":"Zte","name":"ZTE Tempo Go","os":"Android 8.1 Oreo (Go edition)","year":2018,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_a3","brand":"Alcatel","name":"alcatel A3","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_a3_xl","brand":"Alcatel","name":"alcatel A3 XL","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":245,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_a5_led","brand":"Alcatel","name":"alcatel A5 LED","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_a7","brand":"Alcatel","name":"alcatel A7","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_a7_xl","brand":"Alcatel","name":"alcatel A7 XL","os":"Android 7.1 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_flash_2017","brand":"Alcatel","name":"alcatel Flash (2017)","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_idol_5","brand":"Alcatel","name":"alcatel Idol 5","os":"Android 7.1 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":423,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_idol_5s","brand":"Alcatel","name":"alcatel Idol 5s","os":"Android 7.1 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_idol_5s_usa","brand":"Alcatel","name":"alcatel Idol 5s (USA)","os":"Android 7.1 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pulsemix","brand":"Alcatel","name":"alcatel Pulsemix","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_u5","brand":"Alcatel","name":"alcatel U5","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_u5_hd","brand":"Alcatel","name":"alcatel U5 HD","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"apple_apple_ipad_9.7_2017","brand":"Apple","name":"Apple iPad 9.7 (2017)","os":"iOS 10.3, upgradable to iPadOS 16.7.7","year":2017,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":264,"inches":9.7,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_ipad_pro_10.5_2017","brand":"Apple","name":"Apple iPad Pro 10.5 (2017)","os":"iOS 10.3.2, upgradable to iPadOS 17.6.1","year":2017,"form":"Tablet","tablet":true,"w":1668,"h":2224,"ppi":265,"inches":10.5,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_ipad_pro_12.9_2017","brand":"Apple","name":"Apple iPad Pro 12.9 (2017)","os":"iOS 10.3.2, upgradable to iPadOS 17.6.1","year":2017,"form":"Tablet","tablet":true,"w":2732,"h":2048,"ppi":265,"inches":12.9,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_iphone_8","brand":"Apple","name":"Apple iPhone 8","os":"iOS 11, up to iOS 16.7.7","year":2017,"form":"Phone","tablet":false,"w":750,"h":1334,"ppi":326,"inches":4.7,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_8_plus","brand":"Apple","name":"Apple iPhone 8 Plus","os":"iOS 11, up to iOS 16.7.7","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_x","brand":"Apple","name":"Apple iPhone X","os":"iOS 11.1.1, up to iOS 16.7.7","year":2017,"form":"Phone","tablet":false,"w":1125,"h":2436,"ppi":458,"inches":5.8,"platform":"ios","hasNotch":true,"hasIsland":false,"hasHole":false,"hasHome":true,"safeTop":47,"safeBottom":34,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"asus_asus_zenfone_3_zoom_ze553kl","brand":"Asus","name":"Asus Zenfone 3 Zoom ZE553KL","os":"Android 6.1 (Marshmallow), upgradable to Android 8 (Oreo), Z","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_3s_max_zc521tl","brand":"Asus","name":"Asus Zenfone 3s Max ZC521TL","os":"Android 7 (Nougat), ZenUI 3","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_4_max_plus_zc554kl","brand":"Asus","name":"Asus Zenfone 4 Max Plus ZC554KL","os":"Android 7 (Nougat), ZenUI 4","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_4_max_pro_zc554kl","brand":"Asus","name":"Asus Zenfone 4 Max Pro ZC554KL","os":"Android 7 (Nougat), ZenUI 4","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_4_max_zc520kl","brand":"Asus","name":"Asus Zenfone 4 Max ZC520KL","os":"Android 7 (Nougat), upgradable to Android 8 (Oreo), ZenUI 4","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_4_max_zc554kl","brand":"Asus","name":"Asus Zenfone 4 Max ZC554KL","os":"Android 7 (Nougat), ZenUI 4","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_4_pro_zs551kl","brand":"Asus","name":"Asus Zenfone 4 Pro ZS551KL","os":"Android 7.1.1 (Nougat), upgradable to Android 8 (Oreo), ZenU","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_4_selfie_lite_zb553kl","brand":"Asus","name":"Asus Zenfone 4 Selfie Lite ZB553KL","os":"Android 7 (Nougat), ZenUI 4","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_4_selfie_pro_zd552kl","brand":"Asus","name":"Asus Zenfone 4 Selfie Pro ZD552KL","os":"Android 7 (Nougat), ZenUI 4","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_4_selfie_zb553kl","brand":"Asus","name":"Asus Zenfone 4 Selfie ZB553KL","os":"Android 7.0 (Nougat), upgradable to Android 8.1 (Oreo), ZenU","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_4_selfie_zd553kl","brand":"Asus","name":"Asus Zenfone 4 Selfie ZD553KL","os":"Android 7.0 (Nougat), upgradable to Android 8.1 (Oreo), ZenU","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_4_ze554kl","brand":"Asus","name":"Asus Zenfone 4 ZE554KL","os":"Android 7.1.1 (Nougat), ZenUI 4","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_ar_zs571kl","brand":"Asus","name":"Asus Zenfone AR ZS571KL","os":"Android 7 (Nougat), ZenUI 3","year":2017,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":515,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_go_zb552kl","brand":"Asus","name":"Asus Zenfone Go ZB552KL","os":"Android 6 (Marshmallow), ZenUI 3","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_live_zb501kl","brand":"Asus","name":"Asus Zenfone Live ZB501KL","os":"Android 6.0 (Marshmallow), ZenUI 3.5","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_max_plus_m1_zb570tl","brand":"Asus","name":"Asus Zenfone Max Plus (M1) ZB570TL","os":"Android 7 (Nougat), ZenUI 4","year":2017,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":424,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_v_v520kl","brand":"Asus","name":"Asus Zenfone V V520KL","os":"Android 7 (Nougat), ZenUI 3","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenpad_3s_10_z500kl","brand":"Asus","name":"Asus Zenpad 3S 10 Z500KL","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":264,"inches":9.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenpad_3s_8.0_z582kl","brand":"Asus","name":"Asus Zenpad 3s 8.0 Z582KL","os":"Android 7.1 (Nougat)","year":2017,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":324,"inches":7.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenpad_z8s_zt582kl","brand":"Asus","name":"Asus Zenpad Z8s ZT582KL","os":"Android 7.0 (Nougat)","year":2017,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":324,"inches":7.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_a10","brand":"Blackview","name":"Blackview A10","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_a7","brand":"Blackview","name":"Blackview A7","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_a7_pro","brand":"Blackview","name":"Blackview A7 Pro","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_p6000","brand":"Blackview","name":"Blackview P6000","os":"Android 7.1.1 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"blackview_blackview_s8","brand":"Blackview","name":"Blackview S8","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cat_cat_s31","brand":"Cat","name":"Cat S31","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cat_cat_s41","brand":"Cat","name":"Cat S41","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_energy_400_lte","brand":"Energizer","name":"Energizer Energy 400 LTE","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_energy_e520_lte","brand":"Energizer","name":"Energizer Energy E520 LTE","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_energy_s500e","brand":"Energizer","name":"Energizer Energy S500E","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_energy_s550","brand":"Energizer","name":"Energizer Energy S550","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_power_max_p550s","brand":"Energizer","name":"Energizer Power Max P550S","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_2","brand":"Google","name":"Google Pixel 2","os":"Android 8.0 (Oreo), upgradable to Android 11","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_2_xl","brand":"Google","name":"Google Pixel 2 XL","os":"Android 8.0 (Oreo), upgradable to Android 11","year":2017,"form":"Phone","tablet":false,"w":1440,"h":2880,"ppi":538,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_6a_pro","brand":"Honor","name":"Honor 6A (Pro)","os":"Android 7.0 (Nougat), EMUI 5.1","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_6c_pro","brand":"Honor","name":"Honor 6C Pro","os":"Android 7.0 (Nougat), EMUI 5.1","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_7x","brand":"Honor","name":"Honor 7X","os":"Android 7.0 (Nougat), upgradable to Android 8.0 (Oreo), EMUI","year":2017,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":407,"inches":5.93,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_8_pro","brand":"Honor","name":"Honor 8 Pro","os":"Android 7.0 (Nougat), upgradable to Android 9.0 (Pie), EMUI ","year":2017,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":515,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_9","brand":"Honor","name":"Honor 9","os":"Android 7.0 (Nougat), upgradable to Android 9.0 (Pie), EMUI ","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":428,"inches":5.15,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_9_lite","brand":"Honor","name":"Honor 9 Lite","os":"Android 8.0 (Oreo), upgradable to Android 9.0 (Pie), EMUI 9.","year":2017,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":428,"inches":5.65,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_view_10","brand":"Honor","name":"Honor View 10","os":"Android 8.0 (Oreo), upgradable to Android 9.0 (Pie), EMUI 9.","year":2017,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":403,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_10_compact","brand":"Htc","name":"HTC Desire 10 Compact","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_x10","brand":"Htc","name":"HTC One X10","os":"Android OS","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_u_play","brand":"Htc","name":"HTC U Play","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":428,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_u_ultra","brand":"Htc","name":"HTC U Ultra","os":"Android 7.0 (Nougat), upgradable to Android 8.0 (Oreo)","year":2017,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":513,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_u11","brand":"Htc","name":"HTC U11","os":"Android 7.1 (Nougat), upgradable to Android 9.0 (Pie), Sense","year":2017,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":534,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_u11_life","brand":"Htc","name":"HTC U11 Life","os":"Android 8.0 (Oreo), upgradable to Android 9.0 (Pie), Android","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_u11+","brand":"Htc","name":"HTC U11+","os":"Android 8.0 (Oreo), upgradable to Android 9.0 (Pie), Sense U","year":2017,"form":"Phone","tablet":false,"w":1440,"h":2880,"ppi":537,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_10","brand":"Huawei","name":"Huawei Mate 10","os":"Android 8.0 (Oreo), upgradable to Android 10, EMUI 10.2","year":2017,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":499,"inches":5.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_10_lite","brand":"Huawei","name":"Huawei Mate 10 Lite","os":"Android 7.0 (Nougat), upgradable to Android 8.0 (Oreo), EMUI","year":2017,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":409,"inches":5.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_10_porsche_design","brand":"Huawei","name":"Huawei Mate 10 Porsche Design","os":"Android 8.0 (Oreo), EMUI 9.1","year":2017,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_10_pro","brand":"Huawei","name":"Huawei Mate 10 Pro","os":"Android 8.0 (Oreo), upgradable to Android 10, EMUI 10.2","year":2017,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_m3_lite_10","brand":"Huawei","name":"Huawei MediaPad M3 Lite 10","os":"Android 7.0 (Nougat), EMUI 5.1","year":2017,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_m3_lite_8","brand":"Huawei","name":"Huawei MediaPad M3 Lite 8","os":"Android 7.0 (Nougat), EMUI 5.1","year":2017,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":283,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_t3_10","brand":"Huawei","name":"Huawei MediaPad T3 10","os":"Android 7.0 (Nougat), EMUI 5.1","year":2017,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":157,"inches":9.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_t3_7.0","brand":"Huawei","name":"Huawei MediaPad T3 7.0","os":"Android 6.0 (Marshmallow), EMUI 4.1","year":2017,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_t3_8.0","brand":"Huawei","name":"Huawei MediaPad T3 8.0","os":"Android 7.0 (Nougat), EMUI 5.1","year":2017,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_2","brand":"Huawei","name":"Huawei nova 2","os":"Android 7.0 (Nougat), EMUI 5.1","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":443,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_2_plus","brand":"Huawei","name":"Huawei nova 2 plus","os":"Android 7.0 (Nougat), EMUI 5.1","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_2s","brand":"Huawei","name":"Huawei nova 2s","os":"Android 8.0 (Oreo), EMUI 8","year":2017,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":403,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p_smart","brand":"Huawei","name":"Huawei P smart","os":"Android 8.0 (Oreo), EMUI 8","year":2017,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":427,"inches":5.65,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p10","brand":"Huawei","name":"Huawei P10","os":"Android 7.0 (Nougat), upgradable to Android 9.0 (Pie), EMUI ","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":432,"inches":5.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p10_lite","brand":"Huawei","name":"Huawei P10 Lite","os":"Android 7.0 (Nougat), upgradable to Android 8.0 (Oreo), EMUI","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p10_plus","brand":"Huawei","name":"Huawei P10 Plus","os":"Android 7.0 (Nougat), upgradable to Android 9.0 (Pie), EMUI ","year":2017,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":540,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p8_lite_2017","brand":"Huawei","name":"Huawei P8 Lite (2017)","os":"Android 7.0 (Nougat), upgradable to Android 8.0 (Oreo), EMUI","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p9_lite_mini","brand":"Huawei","name":"Huawei P9 lite mini","os":"Android 7.0 (Nougat), EMUI 5.1","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y3_2017","brand":"Huawei","name":"Huawei Y3 (2017)","os":"Android 6.0 (Marshmallow), EMUI 4.1 Mini","year":2017,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y5_2017","brand":"Huawei","name":"Huawei Y5 (2017)","os":"Android 6.0 (Marshmallow), EMUI 4.1","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y6_2017","brand":"Huawei","name":"Huawei Y6 (2017)","os":"Android 6.0 (Marshmallow), EMUI 4.1","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y7","brand":"Huawei","name":"Huawei Y7","os":"Android 7.0 (Nougat), EMUI 5.1","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y7_prime","brand":"Huawei","name":"Huawei Y7 Prime","os":"Android 7.0 (Nougat), EMUI 5.1","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_5","brand":"Infinix","name":"Infinix Hot 5","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_5_lite","brand":"Infinix","name":"Infinix Hot 5 Lite","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_4_pro","brand":"Infinix","name":"Infinix Note 4 Pro","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":386,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_s2_pro","brand":"Infinix","name":"Infinix S2 Pro","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_smart","brand":"Infinix","name":"Infinix Smart","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_zero_4","brand":"Infinix","name":"Infinix Zero 4","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_zero_4_plus","brand":"Infinix","name":"Infinix Zero 4 Plus","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":368,"inches":5.98,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k320t","brand":"Lenovo","name":"Lenovo K320t","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k8","brand":"Lenovo","name":"Lenovo K8","os":"Android 7.1.1 (Nougat), upgradable to Android 8.0 (Oreo)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k8_note","brand":"Lenovo","name":"Lenovo K8 Note","os":"Android 7.1.1 (Nougat), upgradable to Android 8.0 (Oreo)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k8_plus","brand":"Lenovo","name":"Lenovo K8 Plus","os":"Android 7.1.1 (Nougat), upgradable to Android 8.0 (Oreo)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_moto_tab","brand":"Lenovo","name":"Lenovo moto tab","os":"Android 7.0 (Nougat)","year":2017,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_4_10","brand":"Lenovo","name":"Lenovo Tab 4 10","os":"Android 7.1 (Nougat)","year":2017,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_4_10_plus","brand":"Lenovo","name":"Lenovo Tab 4 10 Plus","os":"Android 7.1 (Nougat)","year":2017,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_4_8","brand":"Lenovo","name":"Lenovo Tab 4 8","os":"Android 7.0 (Nougat)","year":2017,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_4_8_plus","brand":"Lenovo","name":"Lenovo Tab 4 8 Plus","os":"Android 7.0 (Nougat)","year":2017,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":283,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_7","brand":"Lenovo","name":"Lenovo Tab 7","os":"Android 7.0 (Nougat)","year":2017,"form":"Tablet","tablet":true,"w":720,"h":1280,"ppi":210,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_7_essential","brand":"Lenovo","name":"Lenovo Tab 7 Essential","os":"Android 7.0 (Nougat)","year":2017,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab3_8_plus","brand":"Lenovo","name":"Lenovo Tab3 8 Plus","os":"Android 6.0.1 (Marshmallow)","year":2017,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":283,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g_pad_iv_8.0_fhd","brand":"Lg","name":"LG G Pad IV 8.0 FHD","os":"Android 7.0 (Nougat), upgradable to Android 8.1 (Oreo)","year":2017,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":283,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g6","brand":"Lg","name":"LG G6","os":"Android 7.0 (Nougat), upgradable to Android 9.0 (Pie), LG UX","year":2017,"form":"Phone","tablet":false,"w":1440,"h":2880,"ppi":564,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_harmony","brand":"Lg","name":"LG Harmony","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":277,"inches":5.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k7_2017","brand":"Lg","name":"LG K7 (2017)","os":"Android 6.0.1 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_q6","brand":"Lg","name":"LG Q6","os":"Android 7.1.1 (Nougat), upgradable to Android 8.0 (Oreo), LG","year":2017,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":442,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_q8_2017","brand":"Lg","name":"LG Q8 (2017)","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":564,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_stylo_3_plus","brand":"Lg","name":"LG Stylo 3 Plus","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":386,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_v30","brand":"Lg","name":"LG V30","os":"Android 7.1.2 (Nougat), upgradable to Android 9.0 (Pie)","year":2017,"form":"Phone","tablet":false,"w":1440,"h":2880,"ppi":537,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_watch_sport","brand":"Lg","name":"LG Watch Sport","os":"Android Wear OS 2.1","year":2017,"form":"Phone","tablet":false,"w":480,"h":480,"ppi":348,"inches":1.38,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_x_power2","brand":"Lg","name":"LG X power2","os":"Android 7.0 (Nougat), upgradable to Android 8.1 (Oreo)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_x_venture","brand":"Lg","name":"LG X venture","os":"Android 7.0 (Nougat), LG UX 5","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":423,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_e2","brand":"Meizu","name":"Meizu E2","os":"Android 7 (Nougat), Flyme 6","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_m5c","brand":"Meizu","name":"Meizu M5c","os":"Android 6.0 (Marshmallow), Flyme 6","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_m5s","brand":"Meizu","name":"Meizu M5s","os":"Android 6.0 (Marshmallow), Flyme 5.2","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_m6","brand":"Meizu","name":"Meizu M6","os":"Android 7 (Nougat), Flyme 7.3","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_m6_note","brand":"Meizu","name":"Meizu M6 Note","os":"Android 7.1.2 (Nougat), Flyme 7.3","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_pro_7","brand":"Meizu","name":"Meizu Pro 7","os":"Android 7.0 (Nougat), Flyme 7.3","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":423,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_pro_7_plus","brand":"Meizu","name":"Meizu Pro 7 Plus","os":"Android 7.0 (Nougat), Flyme 7.3","year":2017,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":518,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bharat_2_q402","brand":"Micromax","name":"Micromax Bharat 2 Q402","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bharat_2_ultra","brand":"Micromax","name":"Micromax Bharat 2 Ultra","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bharat_2+","brand":"Micromax","name":"Micromax Bharat 2+","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bharat_3_q437","brand":"Micromax","name":"Micromax Bharat 3 Q437","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bharat_4_q440","brand":"Micromax","name":"Micromax Bharat 4 Q440","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bharat_5","brand":"Micromax","name":"Micromax Bharat 5","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_1","brand":"Micromax","name":"Micromax Canvas 1","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_2_q4310","brand":"Micromax","name":"Micromax Canvas 2 Q4310","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_evok_note_e453","brand":"Micromax","name":"Micromax Canvas Evok Note E453","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_evok_power_q4260","brand":"Micromax","name":"Micromax Canvas Evok Power Q4260","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_infinity","brand":"Micromax","name":"Micromax Canvas Infinity","os":"Android 7.1.2 (Nougat), upgradable to Android 8.0 (Oreo)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":279,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_infinity_pro","brand":"Micromax","name":"Micromax Canvas Infinity Pro","os":"Android 8.0 (Oreo)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_selfie_3_q460","brand":"Micromax","name":"Micromax Canvas Selfie 3 Q460","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_dual_4_e4816","brand":"Micromax","name":"Micromax Dual 4 E4816","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_dual_5","brand":"Micromax","name":"Micromax Dual 5","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_evok_dual_note_e4815","brand":"Micromax","name":"Micromax Evok Dual Note E4815","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_selfie_2_note_q4601","brand":"Micromax","name":"Micromax Selfie 2 Note Q4601","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_selfie_2_q4311","brand":"Micromax","name":"Micromax Selfie 2 Q4311","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_spark_vdeo_q415","brand":"Micromax","name":"Micromax Spark Vdeo Q415","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_vdeo_3","brand":"Micromax","name":"Micromax Vdeo 3","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_vdeo_4","brand":"Micromax","name":"Micromax Vdeo 4","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_vdeo_5","brand":"Micromax","name":"Micromax Vdeo 5","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_c","brand":"Motorola","name":"Motorola Moto C","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_c_plus","brand":"Motorola","name":"Motorola Moto C Plus","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e4","brand":"Motorola","name":"Motorola Moto E4","os":"Android 7.1.1 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e4_usa","brand":"Motorola","name":"Motorola Moto E4 (USA)","os":"Android 7.1 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e4_plus","brand":"Motorola","name":"Motorola Moto E4 Plus","os":"Android 7.1.1 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e4_plus_usa","brand":"Motorola","name":"Motorola Moto E4 Plus (USA)","os":"Android 7.1 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g5","brand":"Motorola","name":"Motorola Moto G5","os":"Android 7.0 (Nougat), upgradable to Android 8.1 (Oreo)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g5_plus","brand":"Motorola","name":"Motorola Moto G5 Plus","os":"Android 7.0 (Nougat), upgradable to Android 8.1 (Oreo)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g5s","brand":"Motorola","name":"Motorola Moto G5S","os":"Android 7.1 (Nougat), upgradable to Android 8.1 (Oreo)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g5s_plus","brand":"Motorola","name":"Motorola Moto G5S Plus","os":"Android 7.1 (Nougat), upgradable to Android 8.1 (Oreo)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_x4","brand":"Motorola","name":"Motorola Moto X4","os":"Android 7.1 (Nougat), upgradable to Android 9.0 (Pie), Andro","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_z2_play","brand":"Motorola","name":"Motorola Moto Z2 Play","os":"Android 7.1.1 (Nougat), upgradable to Android 9.0 (Pie)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_2","brand":"Nokia","name":"Nokia 2","os":"Android 7.1.1 (Nougat), upgradable to Android 8.1 (Oreo)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_3","brand":"Nokia","name":"Nokia 3","os":"Android 7.0 (Nougat), upgradable to Android 9.0 (Pie)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_5","brand":"Nokia","name":"Nokia 5","os":"Android 7.1.1 (Nougat), upgradable to Android 9.0 (Pie)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_6","brand":"Nokia","name":"Nokia 6","os":"Android 7.1.1 (Nougat), upgradable to Android 9.0 (Pie)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_7","brand":"Nokia","name":"Nokia 7","os":"Android 7.1.1 (Nougat), upgradable to Android 9.0 (Pie)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_8","brand":"Nokia","name":"Nokia 8","os":"Android 7.1.1 (Nougat), upgradable to Android 9.0 (Pie)","year":2017,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":554,"inches":5.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_5","brand":"Oneplus","name":"OnePlus 5","os":"Android 7.1.1 (Nougat), upgradable to Android 10, OxygenOS 1","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_5t","brand":"Oneplus","name":"OnePlus 5T","os":"Android 7.1.1 (Nougat), upgradable to Android 10, OxygenOS 1","year":2017,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":401,"inches":6.01,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a39","brand":"Oppo","name":"Oppo A39","os":"Android 5.1 (Lollipop), ColorOS 3","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a71","brand":"Oppo","name":"Oppo A71","os":"Android 7.1 (Nougat), ColorOS 3.1","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a77_2017","brand":"Oppo","name":"Oppo A77 (2017)","os":"Android 7.1 (Nougat), ColorOS 3.1","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a77_mediatek","brand":"Oppo","name":"Oppo A77 (Mediatek)","os":"Android 6 (Marshmallow), ColorOS 3","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f3","brand":"Oppo","name":"Oppo F3","os":"Android 6 (Marshmallow), ColorOS 3","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f3_plus","brand":"Oppo","name":"Oppo F3 Plus","os":"Android 6 (Marshmallow), ColorOS 3","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f5","brand":"Oppo","name":"Oppo F5","os":"Android 7.1.1 (Nougat), ColorOS 3.2","year":2017,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f5_youth","brand":"Oppo","name":"Oppo F5 Youth","os":"Android 7.1 (Nougat), ColorOS 3.2","year":2017,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_r11","brand":"Oppo","name":"Oppo R11","os":"Android 7.1.1 (Nougat), ColorOS 3.1","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_r11_plus","brand":"Oppo","name":"Oppo R11 Plus","os":"Android 7.1.1 (Nougat), ColorOS 3.1","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":368,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_r11s","brand":"Oppo","name":"Oppo R11s","os":"Android 7.1.1 (Nougat), ColorOS 3.2","year":2017,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":401,"inches":6.01,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_r11s_plus","brand":"Oppo","name":"Oppo R11s Plus","os":"Android 7.1.1 (Nougat), ColorOS 3.2","year":2017,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":376,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a3_2017","brand":"Samsung","name":"Samsung Galaxy A3 (2017)","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a5_2017","brand":"Samsung","name":"Samsung Galaxy A5 (2017)","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a7_2017","brand":"Samsung","name":"Samsung Galaxy A7 (2017)","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":386,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a8_2018","brand":"Samsung","name":"Samsung Galaxy A8 (2018)","os":"Android 7.1.1 (Nougat), upgradable to Android 9.0 (Pie), One","year":2017,"form":"Phone","tablet":false,"w":1080,"h":2220,"ppi":441,"inches":5.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a8+_2018","brand":"Samsung","name":"Samsung Galaxy A8+ (2018)","os":"Android 7.1.1 (Nougat), upgradable to Android 9.0 (Pie)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":2220,"ppi":411,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_c5_pro","brand":"Samsung","name":"Samsung Galaxy C5 Pro","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_c7_2017","brand":"Samsung","name":"Samsung Galaxy C7 (2017)","os":"Android 7.1 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_c7_pro","brand":"Samsung","name":"Samsung Galaxy C7 Pro","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":386,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_folder2","brand":"Samsung","name":"Samsung Galaxy Folder2","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Foldable","tablet":false,"w":480,"h":800,"ppi":246,"inches":3.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j2_2017","brand":"Samsung","name":"Samsung Galaxy J2 (2017)","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":234,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j3_2017","brand":"Samsung","name":"Samsung Galaxy J3 (2017)","os":"Android 7.0 (Nougat), 8.0 (Oreo), upgradable to Android 9.0 ","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j3_emerge","brand":"Samsung","name":"Samsung Galaxy J3 Emerge","os":"Android 6.0.1 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j5_2017","brand":"Samsung","name":"Samsung Galaxy J5 (2017)","os":"Android 7.0 (Nougat), upgradable to Android 9.0 (Pie), One U","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j7_2017","brand":"Samsung","name":"Samsung Galaxy J7 (2017)","os":"Android 7.0 (Nougat), upgradable to Android 9.0 (Pie), One U","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j7_max","brand":"Samsung","name":"Samsung Galaxy J7 Max","os":"Android 7.0 (Nougat), upgradable to Android 8.0 (Oreo)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":386,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j7_nxt","brand":"Samsung","name":"Samsung Galaxy J7 Nxt","os":"Android 7.0 (Nougat), upgradable to Android 9.0 (Pie), One U","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j7_pro","brand":"Samsung","name":"Samsung Galaxy J7 Pro","os":"Android 7.0 (Nougat), upgradable to Android 9.0 (Pie), One U","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j7_v","brand":"Samsung","name":"Samsung Galaxy J7 V","os":"Android 7.0.1 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note_fe","brand":"Samsung","name":"Samsung Galaxy Note FE","os":"Android 7.1.1 (Nougat), upgradable to Android 9.0 (Pie), One","year":2017,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":515,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note8","brand":"Samsung","name":"Samsung Galaxy Note8","os":"Android 7.1.1 (Nougat), upgradable to Android 9.0 (Pie)","year":2017,"form":"Phone","tablet":false,"w":1440,"h":2960,"ppi":521,"inches":6.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s8","brand":"Samsung","name":"Samsung Galaxy S8","os":"Android 7.0 (Nougat), upgradable to Android 9.0 (Pie), One U","year":2017,"form":"Phone","tablet":false,"w":1440,"h":2960,"ppi":570,"inches":5.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s8_active","brand":"Samsung","name":"Samsung Galaxy S8 Active","os":"Android 7.0 (Nougat), upgradable to Android 9.0 (Pie), One U","year":2017,"form":"Phone","tablet":false,"w":1440,"h":2960,"ppi":568,"inches":5.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s8+","brand":"Samsung","name":"Samsung Galaxy S8+","os":"Android 7.0 (Nougat), upgradable to Android 9.0 (Pie), One U","year":2017,"form":"Phone","tablet":false,"w":1440,"h":2960,"ppi":529,"inches":6.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_a_8.0_2017","brand":"Samsung","name":"Samsung Galaxy Tab A 8.0 (2017)","os":"Android 7.1 (Nougat), upgradable to Android 9.0 (Pie), One U","year":2017,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_active2","brand":"Samsung","name":"Samsung Galaxy Tab Active2","os":"Android 7.1.1 (Nougat)","year":2017,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s3_9.7","brand":"Samsung","name":"Samsung Galaxy Tab S3 9.7","os":"Android 7.0 (Nougat), upgradable to Android 9.0 (Pie), One U","year":2017,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":264,"inches":9.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_xcover_4","brand":"Samsung","name":"Samsung Galaxy XCover 4","os":"Android 7.0 (Nougat), upgradable to Android 9.0 (Pie)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_z4","brand":"Samsung","name":"Samsung Z4","os":"Tizen 3.0","year":2017,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":207,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_s2","brand":"Sharp","name":"Sharp Aquos S2","os":"Android 7.1.1 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":2040,"ppi":420,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_z3","brand":"Sharp","name":"Sharp Z3","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":515,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_l1","brand":"Sony","name":"Sony Xperia L1","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_r1_plus","brand":"Sony","name":"Sony Xperia R1 (Plus)","os":"Android 7.1 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_xa1","brand":"Sony","name":"Sony Xperia XA1","os":"Android 7.0 (Nougat), upgradable to Android 8.0 (Oreo)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_xa1_plus","brand":"Sony","name":"Sony Xperia XA1 Plus","os":"Android 7.0 (Nougat), upgradable to Android 8.0 (Oreo)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_xa1_ultra","brand":"Sony","name":"Sony Xperia XA1 Ultra","os":"Android 7.0 (Nougat), upgradable to Android 8.0 (Oreo)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_xz_premium","brand":"Sony","name":"Sony Xperia XZ Premium","os":"Android 7.1 (Nougat), upgradable to Android 9.0 (Pie)","year":2017,"form":"Phone","tablet":false,"w":3840,"h":2160,"ppi":807,"inches":5.46,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_xz1","brand":"Sony","name":"Sony Xperia XZ1","os":"Android 8.0 (Oreo), upgradable to Android 9.0 (Pie)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_xz1_compact","brand":"Sony","name":"Sony Xperia XZ1 Compact","os":"Android 8.0 (Oreo), upgradable to Android 9.0 (Pie)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":319,"inches":4.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_xzs","brand":"Sony","name":"Sony Xperia XZs","os":"Android 7.1 (Nougat), upgradable to Android 8.0 (Oreo)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_camon_cm","brand":"Tecno","name":"Tecno Camon CM","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_camon_cx","brand":"Tecno","name":"Tecno Camon CX","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_camon_cx_air","brand":"Tecno","name":"Tecno Camon CX Air","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_camon_cx_manchester_city_le","brand":"Tecno","name":"Tecno Camon CX Manchester City LE","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_spark","brand":"Tecno","name":"Tecno Spark","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_spark_cm","brand":"Tecno","name":"Tecno Spark CM","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_spark_plus","brand":"Tecno","name":"Tecno Spark Plus","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":245,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_spark_pro","brand":"Tecno","name":"Tecno Spark Pro","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"ulefone__ulefone_armor_2","brand":"Ulefone_","name":"Ulefone Armor 2","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v5_lite_vivo_1609","brand":"Vivo","name":"vivo V5 Lite (vivo 1609)","os":"Android 6 (Marshmallow), Funtouch 3","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v5_plus","brand":"Vivo","name":"vivo V5 Plus","os":"Android 6 (Marshmallow), Funtouch 3","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v5s","brand":"Vivo","name":"vivo V5s","os":"Android 6 (Marshmallow), Funtouch 3","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v7","brand":"Vivo","name":"vivo V7","os":"Android 7.1.2 (Nougat), Funtouch 3.2","year":2017,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v7+","brand":"Vivo","name":"vivo V7+","os":"Android 7.1.2 (Nougat), Funtouch 3.2","year":2017,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":269,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x20","brand":"Vivo","name":"vivo X20","os":"Android 7.1.1 (Nougat), upgradable to Android 8.0 (Oreo), Fu","year":2017,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":402,"inches":6.01,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x20_plus","brand":"Vivo","name":"vivo X20 Plus","os":"Android 7.1.1 (Nougat), upgradable to Android 8.0 (Oreo), Fu","year":2017,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":376,"inches":6.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x9s","brand":"Vivo","name":"vivo X9s","os":"Android 7.1 (Nougat), upgradable to Android 8.0 (Oreo), Funt","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x9s_plus","brand":"Vivo","name":"vivo X9s Plus","os":"Android 7.1 (Nougat), upgradable to Android 8.0 (Oreo), Funt","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":377,"inches":5.85,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y25","brand":"Vivo","name":"vivo Y25","os":"Android 5.1 (Lollipop), Funtouch 2.1","year":2017,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y53","brand":"Vivo","name":"vivo Y53","os":"Android 6 (Marshmallow), Funtouch 3","year":2017,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y55s_2017","brand":"Vivo","name":"vivo Y55s (2017)","os":"Android 6 (Marshmallow), Funtouch 3","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y65","brand":"Vivo","name":"vivo Y65","os":"Android 7.1 (Nougat), Funtouch 3.2","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y69","brand":"Vivo","name":"vivo Y69","os":"Android 7.0 (Nougat), Funtouch 3.2","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_5c","brand":"Xiaomi","name":"Xiaomi Mi 5c","os":"Android 7.1 (Nougat), MIUI 8","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":428,"inches":5.15,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_6","brand":"Xiaomi","name":"Xiaomi Mi 6","os":"Android 7.1.1 (Nougat), upgradable to Android 9.0 (Pie), MIU","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":428,"inches":5.15,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_a1_mi_5x","brand":"Xiaomi","name":"Xiaomi Mi A1 (Mi 5X)","os":"Android 7.1.2 (Nougat), upgradable to Android 9.0 (Pie), And","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_max_2","brand":"Xiaomi","name":"Xiaomi Mi Max 2","os":"Android 7.1.1 (Nougat), MIUI 11","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":342,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_mix_2","brand":"Xiaomi","name":"Xiaomi Mi Mix 2","os":"Android 7.1 (Nougat), planned upgrade to Android 10, MIUI 12","year":2017,"form":"Phone","tablet":false,"w":1080,"h":2160,"ppi":403,"inches":5.99,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_note_3","brand":"Xiaomi","name":"Xiaomi Mi Note 3","os":"Android 7.1 (Nougat), upgradable to Android 9, MIUI 12","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_pad_3","brand":"Xiaomi","name":"Xiaomi Mi Pad 3","os":"Android 7.0 (Nougat), MIUI 9","year":2017,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":326,"inches":7.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_4_4x","brand":"Xiaomi","name":"Xiaomi Redmi 4 (4X)","os":"Android 6.0.1 (Marshmallow), upgradable to 7.1.2 (Nougat), M","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_5","brand":"Xiaomi","name":"Xiaomi Redmi 5","os":"Android 7.1.2 (Nougat), MIUI 11","year":2017,"form":"Phone","tablet":false,"w":720,"h":1440,"ppi":282,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_5a","brand":"Xiaomi","name":"Xiaomi Redmi 5A","os":"Android 7.1.2 (Nougat), MIUI 11","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":296,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_4","brand":"Xiaomi","name":"Xiaomi Redmi Note 4","os":"Android 6.0 (Marshmallow), upgradable to 7.0 (Nougat), MIUI ","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_4x","brand":"Xiaomi","name":"Xiaomi Redmi Note 4X","os":"Android 6.0 (Marshmallow), upgradable to 7.0 (Nougat), MIUI ","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_y1_note_5a","brand":"Xiaomi","name":"Xiaomi Redmi Y1 (Note 5A)","os":"Android 7.1.2 (Nougat), MIUI 11","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_y1_lite","brand":"Xiaomi","name":"Xiaomi Redmi Y1 Lite","os":"Android 7.0 (Nougat), MIUI 11","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_7s","brand":"Zte","name":"ZTE Axon 7s","os":"Android 7 (Nougat), MiFavor 4","year":2017,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":534,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_m","brand":"Zte","name":"ZTE Axon M","os":"Android 7.1.2 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":426,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a2_plus","brand":"Zte","name":"ZTE Blade A2 Plus","os":"Android 6.0 (Marshmallow), MiFavor UI","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a3","brand":"Zte","name":"ZTE Blade A3","os":"Android 7.1 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a520","brand":"Zte","name":"ZTE Blade A520","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a6","brand":"Zte","name":"ZTE Blade A6","os":"Android 7.1 (Nougat), MiFavor 4.2","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_force","brand":"Zte","name":"ZTE Blade Force","os":"Android 7.1.1 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v7_plus","brand":"Zte","name":"ZTE Blade V7 Plus","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v8","brand":"Zte","name":"ZTE Blade V8","os":"Android 7.0 (Nougat), MiFavor 4.2","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v8_lite","brand":"Zte","name":"ZTE Blade V8 Lite","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v8_mini","brand":"Zte","name":"ZTE Blade V8 Mini","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v8_pro","brand":"Zte","name":"ZTE Blade V8 Pro","os":"Android 6.0.1 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_x","brand":"Zte","name":"ZTE Blade X","os":"Android 7.1.1 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_z_max","brand":"Zte","name":"ZTE Blade Z Max","os":"Android 7.1.1 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_grand_x_view_2","brand":"Zte","name":"ZTE Grand X View 2","os":"Android 7.1.1 (Nougat)","year":2017,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_hawkeye","brand":"Zte","name":"ZTE Hawkeye","os":"Android 7.0 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_maven_2","brand":"Zte","name":"ZTE Maven 2","os":"Android 6.0.1 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_max_xl","brand":"Zte","name":"ZTE Max XL","os":"Android 7.1.1 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_m2","brand":"Zte","name":"ZTE nubia M2","os":"Android 6 (Marshmallow), nubia UI 4","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_m2_lite","brand":"Zte","name":"ZTE nubia M2 lite","os":"Android 6 (Marshmallow), nubia UI 4","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_m2_play","brand":"Zte","name":"ZTE nubia M2 Play","os":"Android 7.1 (Nougat), nubia UI 5","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_n1_lite","brand":"Zte","name":"ZTE nubia N1 lite","os":"Android 6.0 (Marshmallow)","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_n2","brand":"Zte","name":"ZTE nubia N2","os":"Android 6 (Marshmallow), nubia UI 4","year":2017,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z17","brand":"Zte","name":"ZTE nubia Z17","os":"Android 7.1.1 (Nougat), nubia UI 5","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z17_lite","brand":"Zte","name":"ZTE nubia Z17 lite","os":"Android 7.1 (Nougat), nubia UI 5","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z17_mini","brand":"Zte","name":"ZTE nubia Z17 mini","os":"Android 6.1 (Marshmallow), nubia UI 4","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z17_minis","brand":"Zte","name":"ZTE nubia Z17 miniS","os":"Android 7.1 (Nougat), nubia UI 5","year":2017,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z17s","brand":"Zte","name":"ZTE nubia Z17s","os":"Android 7.1.1 (Nougat), nubia UI 5.1","year":2017,"form":"Phone","tablet":false,"w":1080,"h":2040,"ppi":403,"inches":5.73,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_tempo_x","brand":"Zte","name":"ZTE Tempo X","os":"Android 7.1.1 (Nougat)","year":2017,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_fierce_4","brand":"Alcatel","name":"alcatel Fierce 4","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_fierce_xl_windows","brand":"Alcatel","name":"alcatel Fierce XL (Windows)","os":"Microsoft Windows 10","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_flash_plus_2","brand":"Alcatel","name":"alcatel Flash Plus 2","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_idol_4","brand":"Alcatel","name":"alcatel Idol 4","os":"Android 6.0.1 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_idol_4s","brand":"Alcatel","name":"alcatel Idol 4s","os":"Android 6.0.1 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":534,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_3_8_lte","brand":"Alcatel","name":"alcatel Pixi 3 (8) LTE","os":"Microsoft Windows 10","year":2016,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_4_3.5","brand":"Alcatel","name":"alcatel Pixi 4 (3.5)","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":320,"h":480,"ppi":165,"inches":3.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_4_4","brand":"Alcatel","name":"alcatel Pixi 4 (4)","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_4_5","brand":"Alcatel","name":"alcatel Pixi 4 (5)","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_4_6","brand":"Alcatel","name":"alcatel Pixi 4 (6)","os":"Android 5.1 (Lollipop), upgradable to 6.0.1 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":245,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_4_6_3g","brand":"Alcatel","name":"alcatel Pixi 4 (6) 3G","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":184,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_4_7","brand":"Alcatel","name":"alcatel Pixi 4 (7)","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_4_plus_power","brand":"Alcatel","name":"alcatel Pixi 4 Plus Power","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_3_5.5","brand":"Alcatel","name":"alcatel Pop 3 (5.5)","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_4","brand":"Alcatel","name":"alcatel Pop 4","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_4+","brand":"Alcatel","name":"alcatel Pop 4+","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_4s","brand":"Alcatel","name":"alcatel Pop 4S","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_7_lte","brand":"Alcatel","name":"alcatel Pop 7 LTE","os":"Android 6.0.1 (Marshmallow)","year":2016,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_shine_lite","brand":"Alcatel","name":"alcatel Shine Lite","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"apple_apple_ipad_pro_9.7_2016","brand":"Apple","name":"Apple iPad Pro 9.7 (2016)","os":"iOS 9.3.2, upgradable to iPadOS 16.7.7","year":2016,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":264,"inches":9.7,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_iphone_7","brand":"Apple","name":"Apple iPhone 7","os":"iOS 10.0.1, upgradable to iOS 15.8.1","year":2016,"form":"Phone","tablet":false,"w":750,"h":1334,"ppi":326,"inches":4.7,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_7_plus","brand":"Apple","name":"Apple iPhone 7 Plus","os":"iOS 10.0.1, upgradable to iOS 15.8.1","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_se","brand":"Apple","name":"Apple iPhone SE","os":"iOS 9.3.2, upgradable to iOS 15.8.1","year":2016,"form":"Phone","tablet":false,"w":640,"h":1136,"ppi":326,"inches":4.0,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"asus_asus_live_g500tg","brand":"Asus","name":"Asus Live G500TG","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_3_deluxe_5.5_zs550kl","brand":"Asus","name":"Asus Zenfone 3 Deluxe 5.5 ZS550KL","os":"Android 6.1 (Marshmallow), upgradable to 7 (Nougat), ZenUI 3","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_3_deluxe_zs570kl","brand":"Asus","name":"Asus Zenfone 3 Deluxe ZS570KL","os":"Android 6.1 (Marshmallow), upgradable to Android 8 (Oreo), Z","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":386,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_3_laser_zc551kl","brand":"Asus","name":"Asus Zenfone 3 Laser ZC551KL","os":"Android 6.1 (Marshmallow), upgradable to Android 8.0 (Oreo)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_3_max_zc520tl","brand":"Asus","name":"Asus Zenfone 3 Max ZC520TL","os":"Android 6.0.1 (Marshmallow), upgradable to 7.0 (Nougat), Zen","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_3_max_zc553kl","brand":"Asus","name":"Asus Zenfone 3 Max ZC553KL","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.1 (Oreo","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_3_ze520kl","brand":"Asus","name":"Asus Zenfone 3 ZE520KL","os":"Android 6.1 (Marshmallow), upgradable to 7 (Nougat), ZenUI 3","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_3_ze552kl","brand":"Asus","name":"Asus Zenfone 3 ZE552KL","os":"Android 6.0.1 (Marshmallow), upgradable to 7.0 (Nougat), Zen","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_go_t500","brand":"Asus","name":"Asus Zenfone Go T500","os":"Android 4.4 (KitKat)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_go_zb450kl","brand":"Asus","name":"Asus Zenfone Go ZB450KL","os":"Android 6 (Marshmallow), ZenUI 2","year":2016,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_go_zb452kg","brand":"Asus","name":"Asus Zenfone Go ZB452KG","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_go_zb500kl","brand":"Asus","name":"Asus Zenfone Go ZB500KL","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_go_zb551kl","brand":"Asus","name":"Asus Zenfone Go ZB551KL","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_go_zb690kg","brand":"Asus","name":"Asus Zenfone Go ZB690KG","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":600,"h":1024,"ppi":172,"inches":6.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_max_zc550kl_2016","brand":"Asus","name":"Asus Zenfone Max ZC550KL (2016)","os":"Android 6.0.1 (Marshmallow), ZenUI","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_pegasus_3","brand":"Asus","name":"Asus Zenfone Pegasus 3","os":"Android 6.0.1 (Marshmallow), ZenUI","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenpad_10_z300m","brand":"Asus","name":"Asus Zenpad 10 Z300M","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenpad_3_8.0_z581kl","brand":"Asus","name":"Asus Zenpad 3 8.0 Z581KL","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":324,"inches":7.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenpad_3s_10_z500m","brand":"Asus","name":"Asus Zenpad 3S 10 Z500M","os":"Android 6.0 (Marshmallow), upgradable to 7.0 (Nougat)","year":2016,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":264,"inches":9.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenpad_8.0_z380m","brand":"Asus","name":"Asus Zenpad 8.0 Z380M","os":"Android 6.0 (Marshmallow), upgradable to 7.0 (Nougat)","year":2016,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenpad_z10_zt500kl","brand":"Asus","name":"Asus Zenpad Z10 ZT500KL","os":"Android 6.0 (Marshmallow), upgradable to 7.0 (Nougat)","year":2016,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":264,"inches":9.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenpad_z8","brand":"Asus","name":"Asus Zenpad Z8","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":324,"inches":7.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cat_cat_s60","brand":"Cat","name":"Cat S60","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel","brand":"Google","name":"Google Pixel","os":"Android 7.1 (Nougat), upgradable to Android 10","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_xl","brand":"Google","name":"Google Pixel XL","os":"Android 7.1 (Nougat), upgradable to Android 10","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":534,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_5c","brand":"Honor","name":"Honor 5c","os":"Android 6.0 (Marshmallow), upgradable to 7.0 (Nougat), EMUI ","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_6x","brand":"Honor","name":"Honor 6X","os":"Android 6.0 (Marshmallow), upgradable to 7.0 (Nougat), EMUI ","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_8","brand":"Honor","name":"Honor 8","os":"Android 6.0 (Marshmallow), upgradable to Android 8.0 (Oreo),","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":423,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_holly_2_plus","brand":"Honor","name":"Honor Holly 2 Plus","os":"Android 5.1.1 (Lollipop), EMUI 3.1","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":296,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_holly_3","brand":"Honor","name":"Honor Holly 3","os":"Android 6.0 (Marshmallow), EMUI 4.1","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_magic","brand":"Honor","name":"Honor Magic","os":"Android 6.0 (Marshmallow), Magic Live UI","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":577,"inches":5.09,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_note_8","brand":"Honor","name":"Honor Note 8","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":443,"inches":6.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_pad_2","brand":"Honor","name":"Honor Pad 2","os":"Android 6.0 (Marshmallow), EMUI 4.1","year":2016,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":283,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_v8","brand":"Honor","name":"Honor V8","os":"Android 6.0 (Marshmallow), EMUI 4.1","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":386,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_10","brand":"Htc","name":"HTC 10","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":565,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_10_evo","brand":"Htc","name":"HTC 10 evo","os":"Android 7.0 (Nougat)","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":534,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_10_lifestyle","brand":"Htc","name":"HTC 10 Lifestyle","os":"Android 6.0.1 (Marshmallow), upgradable to 7.0 (Nougat), Sen","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":565,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_10_lifestyle","brand":"Htc","name":"HTC Desire 10 Lifestyle","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_10_pro","brand":"Htc","name":"HTC Desire 10 Pro","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":400,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_530","brand":"Htc","name":"HTC Desire 530","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_625","brand":"Htc","name":"HTC Desire 625","os":"Android 5.1 (Lollipop), Sense UI","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_628","brand":"Htc","name":"HTC Desire 628","os":"Android 5.1 (Lollipop), Sense 7 UI","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_630","brand":"Htc","name":"HTC Desire 630","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_650","brand":"Htc","name":"HTC Desire 650","os":"Android 6.0 (Marshmallow), Sense UI","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_728_ultra","brand":"Htc","name":"HTC Desire 728 Ultra","os":"Android 5.1.1 (Lollipop), Sense UI","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_825","brand":"Htc","name":"HTC Desire 825","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_830","brand":"Htc","name":"HTC Desire 830","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_a9s","brand":"Htc","name":"HTC One A9s","os":"Android 6.0 (Marshmallow), Sense UI","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_m9_prime_camera","brand":"Htc","name":"HTC One M9 Prime Camera","os":"Android 5 (Lollipop), Sense UI 7","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_s9","brand":"Htc","name":"HTC One S9","os":"Android 6.0 (Marshmallow), Sense UI","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_enjoy_6","brand":"Huawei","name":"Huawei Enjoy 6","os":"Android 6.0 (Marshmallow), EMUI 4.1","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":293,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_enjoy_6s","brand":"Huawei","name":"Huawei Enjoy 6s","os":"Android 6.0 (Marshmallow), EMUI 4.1","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_g9_plus","brand":"Huawei","name":"Huawei G9 Plus","os":"Android 6.0 (Marshmallow), EMUI 4.1","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_9","brand":"Huawei","name":"Huawei Mate 9","os":"Android 7.0 (Nougat), upgradable to Android 9.0 (Pie), EMUI ","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":373,"inches":5.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_9_porsche_design","brand":"Huawei","name":"Huawei Mate 9 Porsche Design","os":"Android 7.0 (Nougat), upgradable to Android 9.0 (Pie), EMUI ","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":534,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_9_pro","brand":"Huawei","name":"Huawei Mate 9 Pro","os":"Android 7.0 (Nougat), upgradable to Android 9.0 (Pie), EMUI ","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":534,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_m2_10.0","brand":"Huawei","name":"Huawei MediaPad M2 10.0","os":"Android 5.1 (Lollipop), EMUI 3.1","year":2016,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_m2_7.0","brand":"Huawei","name":"Huawei MediaPad M2 7.0","os":"Android 5.1.1 (Lollipop), EMUI","year":2016,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":323,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_m3_8.4","brand":"Huawei","name":"Huawei MediaPad M3 8.4","os":"Android 6.0 (Marshmallow), EMUI 4.1","year":2016,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":359,"inches":8.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_t1_7.0_plus","brand":"Huawei","name":"Huawei MediaPad T1 7.0 Plus","os":"Android 4.4.2 (KitKat), EMUI 3","year":2016,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_t2_10.0_pro","brand":"Huawei","name":"Huawei MediaPad T2 10.0 Pro","os":"Android 5.1 (Lollipop), EMUI 3.1","year":2016,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":226,"inches":10.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_t2_7.0","brand":"Huawei","name":"Huawei MediaPad T2 7.0","os":"Android 6 (Marshmallow), EMUI 4","year":2016,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_t2_7.0_pro","brand":"Huawei","name":"Huawei MediaPad T2 7.0 Pro","os":"Android 5.1 (Lollipop), EMUI 3.1","year":2016,"form":"Tablet","tablet":true,"w":1080,"h":1920,"ppi":315,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova","brand":"Huawei","name":"Huawei nova","os":"Android 6.0.1 (Marshmallow), upgradable to 7.0 (Nougat), EMU","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nova_plus","brand":"Huawei","name":"Huawei nova plus","os":"Android 6.0.1 (Marshmallow), EMUI 4.1","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p9","brand":"Huawei","name":"Huawei P9","os":"Android 6.0 (Marshmallow), upgradable to 7.0 (Nougat), EMUI ","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":423,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p9_lite","brand":"Huawei","name":"Huawei P9 lite","os":"Android 6.0 (Marshmallow), upgradable to 7.0 (Nougat), EMUI ","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p9_plus","brand":"Huawei","name":"Huawei P9 Plus","os":"Android 6 (Marshmallow), upgradable to 7 (Nougat), EMUI 5","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y3ii","brand":"Huawei","name":"Huawei Y3II","os":"Android 5.1 (Lollipop), EMUI 3.1","year":2016,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y5ii","brand":"Huawei","name":"Huawei Y5II","os":"Android 5.1 (Lollipop), EMUI 3.1","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y6ii_compact","brand":"Huawei","name":"Huawei Y6II Compact","os":"Android 5.1 (Lollipop), upgradable to 6.0 (Marshmallow), EMU","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_4","brand":"Infinix","name":"Infinix Hot 4","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_4_pro","brand":"Infinix","name":"Infinix Hot 4 Pro","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_hot_s","brand":"Infinix","name":"Infinix Hot S","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_3","brand":"Infinix","name":"Infinix Note 3","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"infinix_infinix_note_3_pro","brand":"Infinix","name":"Infinix Note 3 Pro","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a_plus","brand":"Lenovo","name":"Lenovo A Plus","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a6600","brand":"Lenovo","name":"Lenovo A6600","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a6600_plus","brand":"Lenovo","name":"Lenovo A6600 Plus","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a7000_turbo","brand":"Lenovo","name":"Lenovo A7000 Turbo","os":"Android 5 (Lollipop), Vibe UI 2","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_b","brand":"Lenovo","name":"Lenovo B","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":207,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_c2","brand":"Lenovo","name":"Lenovo C2","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_c2_power","brand":"Lenovo","name":"Lenovo C2 Power","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k5_note","brand":"Lenovo","name":"Lenovo K5 Note","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k6","brand":"Lenovo","name":"Lenovo K6","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k6_note","brand":"Lenovo","name":"Lenovo K6 Note","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k6_power","brand":"Lenovo","name":"Lenovo K6 Power","os":"Android 6.0 (Marshmallow), upgradable to 7.0 (Nougat)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_lemon_3","brand":"Lenovo","name":"Lenovo Lemon 3","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_p2","brand":"Lenovo","name":"Lenovo P2","os":"Android 6.0.1 (Marshmallow), upgradable to 7.0 (Nougat)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_phab2","brand":"Lenovo","name":"Lenovo Phab2","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":229,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_phab2_plus","brand":"Lenovo","name":"Lenovo Phab2 Plus","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":344,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_phab2_pro","brand":"Lenovo","name":"Lenovo Phab2 Pro","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":459,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab3_10","brand":"Lenovo","name":"Lenovo Tab3 10","os":"Android 6.0.1 (Marshmallow)","year":2016,"form":"Tablet","tablet":true,"w":1920,"h":1200,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab3_7","brand":"Lenovo","name":"Lenovo Tab3 7","os":"Android 6.0 (Marshmallow) or 5.0 (Lollipop)","year":2016,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab3_8","brand":"Lenovo","name":"Lenovo Tab3 8","os":"Android 6.0.1 (Marshmallow)","year":2016,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_vibe_a","brand":"Lenovo","name":"Lenovo Vibe A","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_vibe_c","brand":"Lenovo","name":"Lenovo Vibe C","os":"Android 5.1.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_vibe_k4_note","brand":"Lenovo","name":"Lenovo Vibe K4 Note","os":"Android 5.1.1 (Lollipop), upgradable to 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_vibe_k5","brand":"Lenovo","name":"Lenovo Vibe K5","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_vibe_k5_plus","brand":"Lenovo","name":"Lenovo Vibe K5 Plus","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_vibe_p1_turbo","brand":"Lenovo","name":"Lenovo Vibe P1 Turbo","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_vibe_s1_lite","brand":"Lenovo","name":"Lenovo Vibe S1 Lite","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_yoga_tab_3_10","brand":"Lenovo","name":"Lenovo Yoga Tab 3 10","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_yoga_tab_3_plus","brand":"Lenovo","name":"Lenovo Yoga Tab 3 Plus","os":"Android 6.0.1 (Marshmallow), upgradable to 7.1.1 (Nougat)","year":2016,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":299,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_zuk_edge","brand":"Lenovo","name":"Lenovo ZUK Edge","os":"Android 7.0 (Nougat), ZUI 2.5","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_zuk_z1_mini","brand":"Lenovo","name":"Lenovo ZUK Z1 mini","os":"Android 5.1.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_zuk_z2","brand":"Lenovo","name":"Lenovo ZUK Z2","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_zuk_z2_pro","brand":"Lenovo","name":"Lenovo ZUK Z2 Pro","os":"Android 6.0.1 (Marshmallow), upgradable to 7.0 (Nougat), ZUI","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g_pad_iii_10.1_fhd","brand":"Lg","name":"LG G Pad III 10.1 FHD","os":"Android 6.0.1 (Marshmallow)","year":2016,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g_pad_iii_8.0_fhd","brand":"Lg","name":"LG G Pad III 8.0 FHD","os":"Android 6.0.1 (Marshmallow), upgradable to 7.0 (Nougat)","year":2016,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":283,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g_pad_x_8.0","brand":"Lg","name":"LG G Pad X 8.0","os":"Android 6.0.1 (Marshmallow)","year":2016,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":283,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g5","brand":"Lg","name":"LG G5","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":554,"inches":5.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g5_se","brand":"Lg","name":"LG G5 SE","os":"Android 6.0.1 (Marshmallow), upgradable to 7.0 (Nougat), LG ","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":554,"inches":5.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k10","brand":"Lg","name":"LG K10","os":"Android 5.1.1 (Lollipop) or Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":277,"inches":5.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k10_2017","brand":"Lg","name":"LG K10 (2017)","os":"Android 7.0 (Nougat), upgradable to Android 8.0 (Oreo)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":277,"inches":5.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k20_plus","brand":"Lg","name":"LG K20 plus","os":"Android 7.0 (Nougat)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":277,"inches":5.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k3","brand":"Lg","name":"LG K3","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k3_2017","brand":"Lg","name":"LG K3 (2017)","os":"Android 6.0.1 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k4","brand":"Lg","name":"LG K4","os":"Android 5.1.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k4_2017","brand":"Lg","name":"LG K4 (2017)","os":"Android 6.0.1 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":195,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k5","brand":"Lg","name":"LG K5","os":"Android 5.1.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k7","brand":"Lg","name":"LG K7","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k8","brand":"Lg","name":"LG K8","os":"Android 6.0 (Marshmallow), upgradable to 7.0 (Nougat)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_k8_2017","brand":"Lg","name":"LG K8 (2017)","os":"Android 7.0 (Nougat)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":293,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_stylo_2","brand":"Lg","name":"LG Stylo 2","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":258,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_stylus_2","brand":"Lg","name":"LG Stylus 2","os":"Android 6.0 (Marshmallow), upgradable to Android 7.0 (Nougat","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":258,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_stylus_3","brand":"Lg","name":"LG Stylus 3","os":"Android 7.0 (Nougat)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":258,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_u","brand":"Lg","name":"LG U","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_v20","brand":"Lg","name":"LG V20","os":"Android 7.0 (Nougat), upgradable to Android 9.0 (Pie)","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":513,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_x_cam","brand":"Lg","name":"LG X cam","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_x_mach","brand":"Lg","name":"LG X mach","os":"Android 6.0.1 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":538,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_x_max","brand":"Lg","name":"LG X max","os":"Android 6.0.1 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_x_power","brand":"Lg","name":"LG X power","os":"Android 6.0.1 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":277,"inches":5.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_x_screen","brand":"Lg","name":"LG X screen","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":298,"inches":4.93,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_x_skin","brand":"Lg","name":"LG X Skin","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_x_style","brand":"Lg","name":"LG X style","os":"Android 6.0.1 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_x5","brand":"Lg","name":"LG X5","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_m3","brand":"Meizu","name":"Meizu M3","os":"Android 5.1 (Lollipop), Flyme 5.1","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_m3_max","brand":"Meizu","name":"Meizu M3 Max","os":"Android 6.0 (Marshmallow), Flyme 5.2","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_m3_note","brand":"Meizu","name":"Meizu M3 Note","os":"Android 5.1 (Lollipop), Flyme UI","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_m3e","brand":"Meizu","name":"Meizu M3e","os":"Android 5.1 (Lollipop), Flyme 5.2","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_m3s","brand":"Meizu","name":"Meizu M3s","os":"Android 5.1 (Lollipop), Flyme 5.1","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_m3x","brand":"Meizu","name":"Meizu M3x","os":"Android 6 (Marshmallow), Flyme 6","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_m5","brand":"Meizu","name":"Meizu M5","os":"Android 6.0 (Marshmallow), Flyme 6.3","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_m5_note","brand":"Meizu","name":"Meizu M5 Note","os":"Android 6.0 (Marshmallow), Flyme 7.3","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_mx5e","brand":"Meizu","name":"Meizu MX5e","os":"Android 5.1 (Lollipop), Flyme 5","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_mx6","brand":"Meizu","name":"Meizu MX6","os":"Android 6.0 (Marshmallow), Flyme 7.3","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_pro_6","brand":"Meizu","name":"Meizu Pro 6","os":"Android 6.0 (Marshmallow), Flyme 8","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":423,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_pro_6_plus","brand":"Meizu","name":"Meizu Pro 6 Plus","os":"Android 6 (Marshmallow), Flyme 7.3","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":515,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_pro_6s","brand":"Meizu","name":"Meizu Pro 6s","os":"Android 6.0 (Marshmallow), Flyme 7.3","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_u10","brand":"Meizu","name":"Meizu U10","os":"Android OS","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_u20","brand":"Meizu","name":"Meizu U20","os":"Android 6.0 (Marshmallow), Flyme UI","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bolt_q381","brand":"Micromax","name":"Micromax Bolt Q381","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bolt_selfie_q424","brand":"Micromax","name":"Micromax Bolt Selfie Q424","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bolt_supreme_2_q301","brand":"Micromax","name":"Micromax Bolt Supreme 2 Q301","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bolt_supreme_4_q352","brand":"Micromax","name":"Micromax Bolt supreme 4 Q352","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bolt_supreme_q300","brand":"Micromax","name":"Micromax Bolt Supreme Q300","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":320,"h":480,"ppi":165,"inches":3.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_5_lite_q462","brand":"Micromax","name":"Micromax Canvas 5 Lite Q462","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_6","brand":"Micromax","name":"Micromax Canvas 6","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_6_pro_e484","brand":"Micromax","name":"Micromax Canvas 6 Pro E484","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_amaze_2_e457","brand":"Micromax","name":"Micromax Canvas Amaze 2 E457","os":"Android 5.0.2 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_amaze_4g_q491","brand":"Micromax","name":"Micromax Canvas Amaze 4G Q491","os":"Android 5.1.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_evok_e483","brand":"Micromax","name":"Micromax Canvas Evok E483","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_fire_5_q386","brand":"Micromax","name":"Micromax Canvas Fire 5 Q386","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_fire_6_q428","brand":"Micromax","name":"Micromax Canvas Fire 6 Q428","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_juice_4g_q461","brand":"Micromax","name":"Micromax Canvas Juice 4G Q461","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_mega_2_q426","brand":"Micromax","name":"Micromax Canvas Mega 2 Q426","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":184,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_selfie_4","brand":"Micromax","name":"Micromax Canvas Selfie 4","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_spark_2_plus_q350","brand":"Micromax","name":"Micromax Canvas Spark 2 Plus Q350","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_spark_3_q385","brand":"Micromax","name":"Micromax Canvas Spark 3 Q385","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_unite_4","brand":"Micromax","name":"Micromax Canvas Unite 4","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_unite_4_pro","brand":"Micromax","name":"Micromax Canvas Unite 4 Pro","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_xp_4g_q413","brand":"Micromax","name":"Micromax Canvas xp 4G Q413","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_unite_4_plus","brand":"Micromax","name":"Micromax Unite 4 plus","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_vdeo_1","brand":"Micromax","name":"Micromax Vdeo 1","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_vdeo_2","brand":"Micromax","name":"Micromax Vdeo 2","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_lumia_650","brand":"Microsoft","name":"Microsoft Lumia 650","os":"Microsoft Windows 10","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":297,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e3","brand":"Motorola","name":"Motorola Moto E3","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e3_power","brand":"Motorola","name":"Motorola Moto E3 Power","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g4","brand":"Motorola","name":"Motorola Moto G4","os":"Android 6.0.1 (Marshmallow), upgradable to 7.0 (Nougat)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g4_play","brand":"Motorola","name":"Motorola Moto G4 Play","os":"Android 6.0.1 (Marshmallow), upgradable to 7.1.1 (Nougat)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g4_plus","brand":"Motorola","name":"Motorola Moto G4 Plus","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_m","brand":"Motorola","name":"Motorola Moto M","os":"Android 6.0.1 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_z","brand":"Motorola","name":"Motorola Moto Z","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":535,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_z_force","brand":"Motorola","name":"Motorola Moto Z Force","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":535,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_z_play","brand":"Motorola","name":"Motorola Moto Z Play","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_3","brand":"Oneplus","name":"OnePlus 3","os":"Android 6.0.1 (Marshmallow), upgradable to Android 9.0 (Pie)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_3t","brand":"Oneplus","name":"OnePlus 3T","os":"Android 6.0.1 (Marshmallow), upgradable to Android 9.0 (Pie)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a37","brand":"Oppo","name":"Oppo A37","os":"Android 5.1 (Lollipop), ColorOS 3","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a57_2016","brand":"Oppo","name":"Oppo A57 (2016)","os":"Android 6 (Marshmallow), ColorOS 3","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a59_2016","brand":"Oppo","name":"Oppo A59 (2016)","os":"Android 5.1 (Lollipop), ColorOS 3","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f1","brand":"Oppo","name":"Oppo F1","os":"Android 5.1 (Lollipop), ColorOS 2.1","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f1_plus","brand":"Oppo","name":"Oppo F1 Plus","os":"Android 5.1 (Lollipop), ColorOS 3","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_f1s","brand":"Oppo","name":"Oppo F1s","os":"Android 5.1 (Lollipop), upgradable to 6.0 (Marshmallow), Col","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_r9_plus","brand":"Oppo","name":"Oppo R9 Plus","os":"Android 5.1 (Lollipop), upgradable to 6 (Marshmallow), Color","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_r9s","brand":"Oppo","name":"Oppo R9s","os":"Android 6.0.1 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_r9s_plus","brand":"Oppo","name":"Oppo R9s Plus","os":"Android 6.1 (Marshmallow), ColorOS 3","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a8_2016","brand":"Samsung","name":"Samsung Galaxy A8 (2016)","os":"Android 6.0.1 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":386,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a9_pro_2016","brand":"Samsung","name":"Samsung Galaxy A9 Pro (2016)","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_c5","brand":"Samsung","name":"Samsung Galaxy C5","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_c7","brand":"Samsung","name":"Samsung Galaxy C7","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":386,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_c9_pro","brand":"Samsung","name":"Samsung Galaxy C9 Pro","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_express_prime","brand":"Samsung","name":"Samsung Galaxy Express Prime","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_grand_prime_plus","brand":"Samsung","name":"Samsung Galaxy Grand Prime Plus","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j_max","brand":"Samsung","name":"Samsung Galaxy J Max","os":"Android 5.1 (Lollipop)","year":2016,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":216,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j1_2016","brand":"Samsung","name":"Samsung Galaxy J1 (2016)","os":"Android 5.1.1 (Lollipop), upgradable to Android 6.0.1 (Marsh","year":2016,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":207,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j1_mini_prime","brand":"Samsung","name":"Samsung Galaxy J1 mini prime","os":"Android 5.1 (Lollipop) - 3G model","year":2016,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j1_nxt","brand":"Samsung","name":"Samsung Galaxy J1 Nxt","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j2_2016","brand":"Samsung","name":"Samsung Galaxy J2 (2016)","os":"Android 6.0.1 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j2_prime","brand":"Samsung","name":"Samsung Galaxy J2 Prime","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j2_pro_2016","brand":"Samsung","name":"Samsung Galaxy J2 Pro (2016)","os":"Android 6.0.1 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j3_2016","brand":"Samsung","name":"Samsung Galaxy J3 (2016)","os":"Android 5.1.1 (Lollipop) or Android 6.0 (Marshmallow), upgra","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j3_pro","brand":"Samsung","name":"Samsung Galaxy J3 Pro","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j5_2016","brand":"Samsung","name":"Samsung Galaxy J5 (2016)","os":"Android 6.0.1 (Marshmallow), upgradable to 7.1.1 (Nougat)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j5_prime","brand":"Samsung","name":"Samsung Galaxy J5 Prime","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j7_2016","brand":"Samsung","name":"Samsung Galaxy J7 (2016)","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.1 (Oreo","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j7_prime","brand":"Samsung","name":"Samsung Galaxy J7 Prime","os":"Android 6.0.1 (Marshmallow), upgradable to Android 9.0 (Pie)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note7","brand":"Samsung","name":"Samsung Galaxy Note7","os":"Android 6.0.1 (Marshmallow), TouchWiz UI","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":518,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note7_usa","brand":"Samsung","name":"Samsung Galaxy Note7 (USA)","os":"Android 6.0.1 (Marshmallow), TouchWiz UI","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":515,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_on5_pro","brand":"Samsung","name":"Samsung Galaxy On5 Pro","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_on7_2016","brand":"Samsung","name":"Samsung Galaxy On7 (2016)","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_on7_pro","brand":"Samsung","name":"Samsung Galaxy On7 Pro","os":"Android 6.0.1 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_on8","brand":"Samsung","name":"Samsung Galaxy On8","os":"Android 6.0.1 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s7","brand":"Samsung","name":"Samsung Galaxy S7","os":"Android 6.0 (Marshmallow), upgradable to Android 8.0 (Oreo),","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":577,"inches":5.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s7_usa","brand":"Samsung","name":"Samsung Galaxy S7 (USA)","os":"Android 6.0 (Marshmallow), upgradable to Android 8.0 (Oreo),","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":576,"inches":5.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s7_active","brand":"Samsung","name":"Samsung Galaxy S7 active","os":"Android 6.0 (Marshmallow), upgradable to 7.0 (Nougat), Touch","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":576,"inches":5.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s7_edge","brand":"Samsung","name":"Samsung Galaxy S7 edge","os":"Android 6.0 (Marshmallow), upgradable to Android 8.0 (Oreo),","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":534,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s7_edge_usa","brand":"Samsung","name":"Samsung Galaxy S7 edge (USA)","os":"Android 6.0 (Marshmallow), upgradable to Android 8.0 (Oreo),","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":534,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_a_10.1_2016","brand":"Samsung","name":"Samsung Galaxy Tab A 10.1 (2016)","os":"Android 6.0 (Marshmallow), upgradable to Android 8.1 (Oreo)","year":2016,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_a_7.0_2016","brand":"Samsung","name":"Samsung Galaxy Tab A 7.0 (2016)","os":"Android 5.1.1 (Lollipop)","year":2016,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":216,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_e_8.0","brand":"Samsung","name":"Samsung Galaxy Tab E 8.0","os":"Android 5.1.1 (Lollipop), upgradable to 7.1 (Nougat)","year":2016,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_j","brand":"Samsung","name":"Samsung Galaxy Tab J","os":"Android 5.1 (Lollipop)","year":2016,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":216,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_xcover_3_g389f","brand":"Samsung","name":"Samsung Galaxy Xcover 3 G389F","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":207,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_z2","brand":"Samsung","name":"Samsung Z2","os":"Tizen 2.4","year":2016,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_z3_corporate","brand":"Samsung","name":"Samsung Z3 Corporate","os":"Tizen 2.4","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_ms1","brand":"Sharp","name":"Sharp MS1","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_z2","brand":"Sharp","name":"Sharp Z2","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_e5","brand":"Sony","name":"Sony Xperia E5","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_x","brand":"Sony","name":"Sony Xperia X","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_x_compact","brand":"Sony","name":"Sony Xperia X Compact","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":319,"inches":4.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_x_performance","brand":"Sony","name":"Sony Xperia X Performance","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_xa","brand":"Sony","name":"Sony Xperia XA","os":"Android 6.0.1 (Marshmallow), upgradable to 7.0 (Nougat)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_xa_dual","brand":"Sony","name":"Sony Xperia XA Dual","os":"Android 6.0.1 (Marshmallow), upgradable to 7.0 (Nougat)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_xa_ultra","brand":"Sony","name":"Sony Xperia XA Ultra","os":"Android 6.0.1 (Marshmallow), upgradable to 7.0 (Nougat)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_xz","brand":"Sony","name":"Sony Xperia XZ","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_phantom_6","brand":"Tecno","name":"Tecno Phantom 6","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"tecno_tecno_phantom_6_plus","brand":"Tecno","name":"Tecno Phantom 6 Plus","os":"Android 7.0 (Nougat)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v3","brand":"Vivo","name":"vivo V3","os":"Android 5.1 (Lollipop), Funtouch 2.5","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v3max","brand":"Vivo","name":"vivo V3Max","os":"Android 5.1 (Lollipop), Funtouch 2.5","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v5","brand":"Vivo","name":"vivo V5","os":"Android 6.0 (Marshmallow), Funtouch 2.6","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x6s","brand":"Vivo","name":"vivo X6S","os":"Android 5.1 (Lollipop), Funtouch 2.5","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x6s_plus","brand":"Vivo","name":"vivo X6S Plus","os":"Android 5.1 (Lollipop), Funtouch 2.5","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":386,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x7","brand":"Vivo","name":"vivo X7","os":"Android 5.1 (Lollipop), Funtouch 2.5","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x7_plus","brand":"Vivo","name":"vivo X7 Plus","os":"Android 5.1 (Lollipop), Funtouch 2.5","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":386,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x9","brand":"Vivo","name":"vivo X9","os":"Android 6.1 (Marshmallow), upgradable to Android 8 (Oreo), F","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x9_plus","brand":"Vivo","name":"vivo X9 Plus","os":"Android 6.1 (Marshmallow), upgradable to Android 8 (Oreo), F","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":375,"inches":5.88,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_xplay5","brand":"Vivo","name":"vivo Xplay5","os":"Android 5.1 (Lollipop), Funtouch 2.5","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":541,"inches":5.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_xplay5_elite","brand":"Vivo","name":"vivo Xplay5 Elite","os":"Android 6.0 (Marshmallow), Funtouch 2.6","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":541,"inches":5.43,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_xplay6","brand":"Vivo","name":"vivo Xplay6","os":"Android 6.1 (Marshmallow), upgradable to Android 8 (Oreo), F","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":538,"inches":5.46,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y55l_vivo_1603","brand":"Vivo","name":"vivo Y55L (vivo 1603)","os":"Android 6 (Marshmallow), Funtouch 2.6","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y67","brand":"Vivo","name":"vivo Y67","os":"Android 6.0 (Marshmallow), Funtouch 2.6","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_4s","brand":"Xiaomi","name":"Xiaomi Mi 4s","os":"Android 5.1 (Lollipop), upgradable to 7.0 (Nougat), MIUI 10","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_5","brand":"Xiaomi","name":"Xiaomi Mi 5","os":"Android 6.0 (Marshmallow), upgradable to Android 8.0 (Oreo),","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":428,"inches":5.15,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_5s","brand":"Xiaomi","name":"Xiaomi Mi 5s","os":"Android 6.0 (Marshmallow), upgradable to 7.0 (Nougat), MIUI ","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":428,"inches":5.15,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_5s_plus","brand":"Xiaomi","name":"Xiaomi Mi 5s Plus","os":"Android 6.0 (Marshmallow), upgradable to 8.0 (Oreo), MIUI","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":386,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_max","brand":"Xiaomi","name":"Xiaomi Mi Max","os":"Android 6.0 (Marshmallow), upgradable to 7.0 (Nougat), MIUI ","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":342,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_mix","brand":"Xiaomi","name":"Xiaomi Mi Mix","os":"Android 6.0 (Marshmallow), upgradable to 8.0 (Oreo), MIUI 10","year":2016,"form":"Phone","tablet":false,"w":1080,"h":2040,"ppi":362,"inches":6.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_note_2","brand":"Xiaomi","name":"Xiaomi Mi Note 2","os":"Android 6.0 (Marshmallow), MIUI 8.2","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":386,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_3","brand":"Xiaomi","name":"Xiaomi Redmi 3","os":"Android 5.1 (Lollipop), MIUI 7","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_3_pro","brand":"Xiaomi","name":"Xiaomi Redmi 3 Pro","os":"Android 5.1 (Lollipop), MIUI 7.3","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_3s","brand":"Xiaomi","name":"Xiaomi Redmi 3s","os":"Android 6.0.1 (Marshmallow), MIUI 9.2","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_3s_prime","brand":"Xiaomi","name":"Xiaomi Redmi 3s Prime","os":"Android 6.0.1 (Marshmallow), MIUI 9.2","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_3x","brand":"Xiaomi","name":"Xiaomi Redmi 3x","os":"Android 6.0.1 (Marshmallow), MIUI 7.3","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_4_china","brand":"Xiaomi","name":"Xiaomi Redmi 4 (China)","os":"Android 6.0.1 (Marshmallow), MIUI 8","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":296,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_4_prime","brand":"Xiaomi","name":"Xiaomi Redmi 4 Prime","os":"Android 6.0.1 (Marshmallow), MIUI 8","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_4a","brand":"Xiaomi","name":"Xiaomi Redmi 4A","os":"Android 6.0.1 (Marshmallow), MIUI 10","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":296,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_3","brand":"Xiaomi","name":"Xiaomi Redmi Note 3","os":"Android 5.1.1 (Lollipop), upgradable to 6.0.1 (Marshmallow),","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_4_mediatek","brand":"Xiaomi","name":"Xiaomi Redmi Note 4 (MediaTek)","os":"Android 6.0 (Marshmallow), MIUI 10","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_pro","brand":"Xiaomi","name":"Xiaomi Redmi Pro","os":"Android 6.0 (Marshmallow), MIUI 10","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_avid_plus","brand":"Zte","name":"ZTE Avid Plus","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_7","brand":"Zte","name":"ZTE Axon 7","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2016,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":538,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_7_max","brand":"Zte","name":"ZTE Axon 7 Max","os":"Android 6 (Marshmallow), MiFavor UI 4","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_7_mini","brand":"Zte","name":"ZTE Axon 7 mini","os":"Android 6.1 (Marshmallow), upgradable to 7.1.1 (Nougat), MiF","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":423,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a2","brand":"Zte","name":"ZTE Blade A2","os":"Android 5.1 (Lollipop), upgradable to 6.0 (Marshmallow), MiF","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a452","brand":"Zte","name":"ZTE Blade A452","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a512","brand":"Zte","name":"ZTE Blade A512","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a601","brand":"Zte","name":"ZTE Blade A601","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a610","brand":"Zte","name":"ZTE Blade A610","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a910","brand":"Zte","name":"ZTE Blade A910","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_l110_a110","brand":"Zte","name":"ZTE Blade L110 (A110)","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_l5_plus","brand":"Zte","name":"ZTE Blade L5 Plus","os":"Android 5.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v_plus","brand":"Zte","name":"ZTE Blade V Plus","os":"Android 5.1.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v7","brand":"Zte","name":"ZTE Blade V7","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v7_lite","brand":"Zte","name":"ZTE Blade V7 Lite","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_v7_max","brand":"Zte","name":"ZTE Blade V7 Max","os":"Android 6.0.1 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_grand_x_3","brand":"Zte","name":"ZTE Grand X 3","os":"Android 5.1.1 (Lollipop)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_grand_x_max_2","brand":"Zte","name":"ZTE Grand X Max 2","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_grand_x4","brand":"Zte","name":"ZTE Grand X4","os":"Android 6.0.1 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_n1","brand":"Zte","name":"ZTE nubia N1","os":"Android 6 (Marshmallow), nubia UI 4","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_prague_s","brand":"Zte","name":"ZTE nubia Prague S","os":"Android 5.2 (Lollipop), nubia UI 3","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z11","brand":"Zte","name":"ZTE nubia Z11","os":"Android 6.1 (Marshmallow), nubia UI 4","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z11_max","brand":"Zte","name":"ZTE nubia Z11 Max","os":"Android 5.1.1 (Lollipop), nubia UI 4","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":368,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z11_mini","brand":"Zte","name":"ZTE nubia Z11 mini","os":"Android 5.1.1 (Lollipop), nubia UI 3.9","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z11_mini_s","brand":"Zte","name":"ZTE nubia Z11 mini S","os":"Android 6 (Marshmallow), nubia UI 4","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_warp_7","brand":"Zte","name":"ZTE Warp 7","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_zmax_pro","brand":"Zte","name":"ZTE Zmax Pro","os":"Android 6.0 (Marshmallow)","year":2016,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_fierce_xl","brand":"Alcatel","name":"alcatel Fierce XL","os":"Android 5.1.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_flash_2","brand":"Alcatel","name":"alcatel Flash 2","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_flash_plus","brand":"Alcatel","name":"alcatel Flash Plus","os":"Android 4.4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_go_play","brand":"Alcatel","name":"alcatel Go Play","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_idol_3_4.7","brand":"Alcatel","name":"alcatel Idol 3 (4.7)","os":"Android 5.0.2 (Lollipop), upgradable to 6.0.1 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_idol_3_5.5","brand":"Alcatel","name":"alcatel Idol 3 (5.5)","os":"Android 5.0.2 (Lollipop), upgradable to 6.0.1 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_idol_3c","brand":"Alcatel","name":"alcatel Idol 3C","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_orange_klif","brand":"Alcatel","name":"alcatel Orange Klif","os":"Firefox 2.0","year":2015,"form":"Phone","tablet":false,"w":320,"h":480,"ppi":165,"inches":3.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_3_10","brand":"Alcatel","name":"alcatel Pixi 3 (10)","os":"Android 5.0 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_3_3.5","brand":"Alcatel","name":"alcatel Pixi 3 (3.5)","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":320,"h":480,"ppi":165,"inches":3.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_3_3.5_firefox","brand":"Alcatel","name":"alcatel Pixi 3 (3.5) Firefox","os":"Firefox 2.0","year":2015,"form":"Phone","tablet":false,"w":320,"h":480,"ppi":165,"inches":3.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_3_4","brand":"Alcatel","name":"alcatel Pixi 3 (4)","os":"Android 4.2.2 (Jelly Bean), upgradable to 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_3_4.5","brand":"Alcatel","name":"alcatel Pixi 3 (4.5)","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_3_5","brand":"Alcatel","name":"alcatel Pixi 3 (5)","os":"Android 4.4.2 (KitKat) / Android 5.0 (Lollipop) - 4G model","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_3_5.5","brand":"Alcatel","name":"alcatel Pixi 3 (5.5)","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":200,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_3_5.5_lte","brand":"Alcatel","name":"alcatel Pixi 3 (5.5) LTE","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_3_7","brand":"Alcatel","name":"alcatel Pixi 3 (7)","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_3_7_3g","brand":"Alcatel","name":"alcatel Pixi 3 (7) 3G","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_3_7_lte","brand":"Alcatel","name":"alcatel Pixi 3 (7) LTE","os":"Android 5.0 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_3_8_3g","brand":"Alcatel","name":"alcatel Pixi 3 (8) 3G","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_first","brand":"Alcatel","name":"alcatel Pixi First","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_10","brand":"Alcatel","name":"alcatel Pop 10","os":"Android 5.0.1 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":157,"inches":9.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_3_5","brand":"Alcatel","name":"alcatel Pop 3 (5)","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_astro","brand":"Alcatel","name":"alcatel Pop Astro","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":245,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_star","brand":"Alcatel","name":"alcatel Pop Star","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_star_lte","brand":"Alcatel","name":"alcatel Pop Star LTE","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_up","brand":"Alcatel","name":"alcatel Pop Up","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_x1","brand":"Alcatel","name":"alcatel X1","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"apple_apple_ipad_mini_4_2015","brand":"Apple","name":"Apple iPad mini 4 (2015)","os":"iOS 9, upgradable to iPadOS 15.8.1","year":2015,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":324,"inches":7.9,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_ipad_pro_12.9_2015","brand":"Apple","name":"Apple iPad Pro 12.9 (2015)","os":"iOS 9, upgradable to iPadOS 16.7.7","year":2015,"form":"Tablet","tablet":true,"w":2048,"h":2732,"ppi":264,"inches":12.9,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_iphone_6s","brand":"Apple","name":"Apple iPhone 6s","os":"iOS 9, upgradable to iOS 15.8.1","year":2015,"form":"Phone","tablet":false,"w":750,"h":1334,"ppi":326,"inches":4.7,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_6s_plus","brand":"Apple","name":"Apple iPhone 6s Plus","os":"iOS 9, upgradable to iOS 15.8.1","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"asus_asus_fonepad_7_fe171cg","brand":"Asus","name":"Asus Fonepad 7 FE171CG","os":"Android 4.4 (KitKat)","year":2015,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_fonepad_7_fe375cl","brand":"Asus","name":"Asus Fonepad 7 FE375CL","os":"Android 5.0.1 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":216,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_pegasus_2_plus","brand":"Asus","name":"Asus Pegasus 2 Plus","os":"Android 5.1.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_2_deluxe_ze551ml","brand":"Asus","name":"Asus Zenfone 2 Deluxe ZE551ML","os":"Android 5.0 (Lollipop), upgradable to 6.0 (Marshmallow), Zen","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_2_laser_ze500kg","brand":"Asus","name":"Asus Zenfone 2 Laser ZE500KG","os":"Android 5.0 (Lollipop), upgradable to 6.0 (Marshmallow), Zen","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_2_laser_ze500kl","brand":"Asus","name":"Asus Zenfone 2 Laser ZE500KL","os":"Android 5.0 (Lollipop), upgradable to 6.0 (Marshmallow), Zen","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_2_laser_ze550kl","brand":"Asus","name":"Asus Zenfone 2 Laser ZE550KL","os":"Android 5.0 (Lollipop), upgradable to 6.0 (Marshmallow), Zen","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_2_laser_ze551kl","brand":"Asus","name":"Asus Zenfone 2 Laser ZE551KL","os":"Android 5 (Lollipop), upgradable to 6.1 (Marshmallow), ZenUI","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_2_laser_ze600kl","brand":"Asus","name":"Asus Zenfone 2 Laser ZE600KL","os":"Android 5.0 (Lollipop), upgradable to 6.0 (Marshmallow), Zen","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":245,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_2_laser_ze601kl","brand":"Asus","name":"Asus Zenfone 2 Laser ZE601KL","os":"Android 5.0 (Lollipop), upgradable to 6.0 (Marshmallow), Zen","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_2_ze500cl","brand":"Asus","name":"Asus Zenfone 2 ZE500CL","os":"Android 5.0 (Lollipop), ZenUI","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_2_ze550ml","brand":"Asus","name":"Asus Zenfone 2 ZE550ML","os":"Android 5.0 (Lollipop), upgradable to 6.0 (Marshmallow), Zen","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_2_ze551ml","brand":"Asus","name":"Asus Zenfone 2 ZE551ML","os":"Android 5.0 (Lollipop), upgradable to 6.0 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_2e","brand":"Asus","name":"Asus Zenfone 2E","os":"Android 5.0 (Lollipop), ZenUI","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_5_a501cg_2015","brand":"Asus","name":"Asus Zenfone 5 A501CG (2015)","os":"Android 4.3 (Jelly Bean), upgradable to 5.0.2 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_c_zc451cg","brand":"Asus","name":"Asus Zenfone C ZC451CG","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_go_zc451tg","brand":"Asus","name":"Asus Zenfone Go ZC451TG","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_go_zc500tg","brand":"Asus","name":"Asus Zenfone Go ZC500TG","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_max_zc550kl","brand":"Asus","name":"Asus Zenfone Max ZC550KL","os":"Android 5.0.1 (Lollipop), upgradable to 6.0.1 (Marshmallow),","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_selfie_zd551kl","brand":"Asus","name":"Asus Zenfone Selfie ZD551KL","os":"Android 5.0 (Lollipop), upgradable to 6.0 (Marshmallow), Zen","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_zoom_zx550","brand":"Asus","name":"Asus Zenfone Zoom ZX550","os":"Android 5.0 (Lollipop), ZenUI","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_zoom_zx551ml","brand":"Asus","name":"Asus Zenfone Zoom ZX551ML","os":"Android 5.0 (Lollipop), upgradable to 6.0 (Marshmallow), Zen","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenpad_10_z300c","brand":"Asus","name":"Asus Zenpad 10 Z300C","os":"Android 5.0 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenpad_7.0_z370cg","brand":"Asus","name":"Asus Zenpad 7.0 Z370CG","os":"Android 5.0 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":216,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenpad_8.0_z380c","brand":"Asus","name":"Asus Zenpad 8.0 Z380C","os":"Android 5.0 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenpad_8.0_z380kl","brand":"Asus","name":"Asus Zenpad 8.0 Z380KL","os":"Android 5.0 (Lollipop), upgradable to 6.0.1 (Marshmallow)","year":2015,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenpad_c_7.0","brand":"Asus","name":"Asus Zenpad C 7.0","os":"Android 5.0 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenpad_c_7.0_z170mg","brand":"Asus","name":"Asus Zenpad C 7.0 Z170MG","os":"Android 5.0 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenpad_s_8.0_z580c","brand":"Asus","name":"Asus Zenpad S 8.0 Z580C","os":"Android 5.0 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":320,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenpad_s_8.0_z580ca","brand":"Asus","name":"Asus Zenpad S 8.0 Z580CA","os":"Android 5.0 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":320,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cat_cat_s30","brand":"Cat","name":"Cat S30","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cat_cat_s40","brand":"Cat","name":"Cat S40","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":234,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_energy_400","brand":"Energizer","name":"Energizer Energy 400","os":"Android 4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"energizer_energizer_energy_500","brand":"Energizer","name":"Energizer Energy 500","os":"Android 4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"google_google_pixel_c","brand":"Google","name":"Google Pixel C","os":"Android 6.0.1 (Marshmallow), upgradable to Android 8.0 (Oreo","year":2015,"form":"Tablet","tablet":true,"w":2560,"h":1800,"ppi":308,"inches":10.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_4c","brand":"Honor","name":"Honor 4C","os":"Android 4.4.2 (KitKat), upgradable to 6 (Marshmallow), EMUI ","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_5x","brand":"Honor","name":"Honor 5X","os":"Android 5.1.1 (Lollipop), upgradable to 6.0.1 (Marshmallow),","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_7","brand":"Honor","name":"Honor 7","os":"Android 5.0 (Lollipop), upgradable to 6.0 (Marshmallow), EMU","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_7i","brand":"Honor","name":"Honor 7i","os":"Android 5.1.1 (Lollipop), upgradable to 6.0 (Marshmallow), E","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_bee","brand":"Honor","name":"Honor Bee","os":"Android 4.4.2 (KitKat), EMUI Lite 3","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_butterfly_3","brand":"Htc","name":"HTC Butterfly 3","os":"Android 5.0 (Lollipop), upgradable to 6.0 (Marshmallow), Sen","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":565,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_320","brand":"Htc","name":"HTC Desire 320","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_326g_dual_sim","brand":"Htc","name":"HTC Desire 326G dual sim","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_520","brand":"Htc","name":"HTC Desire 520","os":"Android 5.1 (Lollipop), Sense 7 UI","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_526","brand":"Htc","name":"HTC Desire 526","os":"Android 5.1 (Lollipop), Sense 7 UI","year":2015,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":234,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_526g+_dual_sim","brand":"Htc","name":"HTC Desire 526G+ dual sim","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":234,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_626_usa","brand":"Htc","name":"HTC Desire 626 (USA)","os":"Android 5.1 (Lollipop), Sense 7 UI","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_626g+","brand":"Htc","name":"HTC Desire 626G+","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_626s","brand":"Htc","name":"HTC Desire 626s","os":"Android 5.1.1 (Lollipop), upgradable to 6.0.1 (Marshmallow),","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_728_dual_sim","brand":"Htc","name":"HTC Desire 728 dual sim","os":"Android 5.1.1 (Lollipop), Sense UI","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_820g+_dual_sim","brand":"Htc","name":"HTC Desire 820G+ dual sim","os":"Android 4.4.2 (KitKat), Sense UI 6","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_820s_dual_sim","brand":"Htc","name":"HTC Desire 820s dual sim","os":"Android 4.4.4 (KitKat), Sense UI 6","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_828_dual_sim","brand":"Htc","name":"HTC Desire 828 dual sim","os":"Android 5.1 (Lollipop), Sense UI 6","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_a9","brand":"Htc","name":"HTC One A9","os":"Android 6.0 (Marshmallow), upgradable to 7.0 (Nougat), Sense","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_e9","brand":"Htc","name":"HTC One E9","os":"Android 5 (Lollipop), upgradable to 6 (Marshmallow), Sense U","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_e9+","brand":"Htc","name":"HTC One E9+","os":"Android 5 (Lollipop), upgradable to 6 (Marshmallow), Sense U","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":534,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_e9s_dual_sim","brand":"Htc","name":"HTC One E9s dual sim","os":"Android 5 (Lollipop), Sense UI 7","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_m8s","brand":"Htc","name":"HTC One M8s","os":"Android 5 (Lollipop), Sense UI 7","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_m9","brand":"Htc","name":"HTC One M9","os":"Android 5.0 (Lollipop), upgradable to 7.0 (Nougat), Sense UI","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_m9+","brand":"Htc","name":"HTC One M9+","os":"Android 5.2 (Lollipop), upgradable to 6 (Marshmallow), Sense","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":565,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_m9+_supreme_camera","brand":"Htc","name":"HTC One M9+ Supreme Camera","os":"Android 5.2 (Lollipop), Sense UI 7","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":565,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_m9s","brand":"Htc","name":"HTC One M9s","os":"Android 5.1 (Lollipop), Sense UI 7","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_me","brand":"Htc","name":"HTC One ME","os":"Android 5.2 (Lollipop), upgradable to 6 (Marshmallow), Sense","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":565,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_x9","brand":"Htc","name":"HTC One X9","os":"Android 6.0 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_ascend_g628","brand":"Huawei","name":"Huawei Ascend G628","os":"Android 4.4.4 (KitKat), EMUI 2.3","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_ascend_y540","brand":"Huawei","name":"Huawei Ascend Y540","os":"Android 4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_enjoy_5s","brand":"Huawei","name":"Huawei Enjoy 5s","os":"Android 5.1.1 (Lollipop), EMUI 3.1 Lite","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_g7_plus","brand":"Huawei","name":"Huawei G7 Plus","os":"Android 5.1 (Lollipop), upgradable to 6.0 (Marshmallow), EMU","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_g8","brand":"Huawei","name":"Huawei G8","os":"Android 5.1 (Lollipop), upgradable to 6.0 (Marshmallow), EMU","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_8","brand":"Huawei","name":"Huawei Mate 8","os":"Android 6.0 (Marshmallow), upgradable to 7.0 (Nougat), EMUI ","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":368,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mate_s","brand":"Huawei","name":"Huawei Mate S","os":"Android 5.1.1 (Lollipop), upgradable to 6.0 (Marshmallow), E","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_m2_8.0","brand":"Huawei","name":"Huawei MediaPad M2 8.0","os":"Android 5.1 (Lollipop), EMUI 3.1","year":2015,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":283,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_t1_10","brand":"Huawei","name":"Huawei MediaPad T1 10","os":"Android 4.4.4 (KitKat), EMUI 3","year":2015,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":157,"inches":9.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_t1_7.0","brand":"Huawei","name":"Huawei MediaPad T1 7.0","os":"Android 4.4.2 (KitKat), EMUI 3","year":2015,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_x2","brand":"Huawei","name":"Huawei MediaPad X2","os":"Android 5 (Lollipop), upgradable to 6 (Marshmallow), EMUI 3","year":2015,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":323,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_nexus_6p","brand":"Huawei","name":"Huawei Nexus 6P","os":"Android 6.0 (Marshmallow), upgradable to Android 8.0 (Oreo)","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":518,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p8","brand":"Huawei","name":"Huawei P8","os":"Android 4.4.2 (KitKat), upgradable to 6.0 (Marshmallow), EMU","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p8lite","brand":"Huawei","name":"Huawei P8lite","os":"Android 5.0.2 (Lollipop), upgradable to 6.0 (Marshmallow), E","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p8lite_ale-l04","brand":"Huawei","name":"Huawei P8lite ALE-L04","os":"Android 4.4.4 (KitKat), EMUI 3","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_p8max","brand":"Huawei","name":"Huawei P8max","os":"Android 5.0.2/5.1.1 (Lollipop), upgradable to 6.0 (Marshmall","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":326,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_snapto","brand":"Huawei","name":"Huawei SnapTo","os":"Android 4.4 (KitKat), EMUI 2.3","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y360","brand":"Huawei","name":"Huawei Y360","os":"Android 4.4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":245,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y560","brand":"Huawei","name":"Huawei Y560","os":"Android 5.1 (Lollipop), EMUI Lite 3.1","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y6","brand":"Huawei","name":"Huawei Y6","os":"Android 5.1 (Lollipop), EMUI 3.1","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y6_pro","brand":"Huawei","name":"Huawei Y6 Pro","os":"Android 5.1.1 (Lollipop), EMUI 3.1 Lite","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y625","brand":"Huawei","name":"Huawei Y625","os":"Android 4.4.2 (KitKat), EMUI Lite 2.3","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y635","brand":"Huawei","name":"Huawei Y635","os":"Android 4.4.2 (KitKat), EMUI 3","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a1000","brand":"Lenovo","name":"Lenovo A1000","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a1900","brand":"Lenovo","name":"Lenovo A1900","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a2010","brand":"Lenovo","name":"Lenovo A2010","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a3690","brand":"Lenovo","name":"Lenovo A3690","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a3900","brand":"Lenovo","name":"Lenovo A3900","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a5000","brand":"Lenovo","name":"Lenovo A5000","os":"Android 4.4.2 (KitKat), upgradable to 5.0.2 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a6000","brand":"Lenovo","name":"Lenovo A6000","os":"Android 4.4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a6000_plus","brand":"Lenovo","name":"Lenovo A6000 Plus","os":"Android 4.4.4 (KitKat), upgradable to 5.2 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a6010","brand":"Lenovo","name":"Lenovo A6010","os":"Android 5 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a6010_plus","brand":"Lenovo","name":"Lenovo A6010 Plus","os":"Android 5 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a616","brand":"Lenovo","name":"Lenovo A616","os":"Android 4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":178,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a7000","brand":"Lenovo","name":"Lenovo A7000","os":"Android 5.0.2 (Lollipop), upgradable to 6.0 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a7000_plus","brand":"Lenovo","name":"Lenovo A7000 Plus","os":"Android 5.0 (Lollipop), upgradable to 6.0 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k3_note","brand":"Lenovo","name":"Lenovo K3 Note","os":"Android 5.2 (Lollipop), upgradable to 6 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k80","brand":"Lenovo","name":"Lenovo K80","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_p70","brand":"Lenovo","name":"Lenovo P70","os":"Android 4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_p90","brand":"Lenovo","name":"Lenovo P90","os":"Android 4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_phab","brand":"Lenovo","name":"Lenovo Phab","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":210,"inches":6.98,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_phab_plus","brand":"Lenovo","name":"Lenovo Phab Plus","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":324,"inches":6.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_s60","brand":"Lenovo","name":"Lenovo S60","os":"Android 4.4.2 (KitKat), upgradable to 5 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_2_a10-70","brand":"Lenovo","name":"Lenovo Tab 2 A10-70","os":"Android 4.4.4 (KitKat), upgradable to 5.0 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":218,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_2_a7-10","brand":"Lenovo","name":"Lenovo Tab 2 A7-10","os":"Android 4.4 (KitKat), upgradable to 5.0 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_2_a7-20","brand":"Lenovo","name":"Lenovo Tab 2 A7-20","os":"Android 4.4 (KitKat), upgradable to 5.0 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_2_a7-30","brand":"Lenovo","name":"Lenovo Tab 2 A7-30","os":"Android 4.4.2 (KitKat), upgradable to 5.0 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_2_a8-50","brand":"Lenovo","name":"Lenovo Tab 2 A8-50","os":"Android 5.0 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":184,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_vibe_p1","brand":"Lenovo","name":"Lenovo Vibe P1","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_vibe_p1m","brand":"Lenovo","name":"Lenovo Vibe P1m","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_vibe_s1","brand":"Lenovo","name":"Lenovo Vibe S1","os":"Android 5.0 (Lollipop), upgradable to 6.0 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_vibe_shot","brand":"Lenovo","name":"Lenovo Vibe Shot","os":"Android 5.0.2 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_vibe_x2_pro","brand":"Lenovo","name":"Lenovo Vibe X2 Pro","os":"Android 4.4 (KitKat), Vibe UI 2","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":416,"inches":5.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_vibe_x3","brand":"Lenovo","name":"Lenovo Vibe X3","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_vibe_x3_c78","brand":"Lenovo","name":"Lenovo Vibe X3 c78","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_vibe_z3_pro","brand":"Lenovo","name":"Lenovo Vibe Z3 Pro","os":"Android 5.0.2 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":534,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_yoga_tab_3_8.0","brand":"Lenovo","name":"Lenovo Yoga Tab 3 8.0","os":"Android 5.1 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_yoga_tab_3_pro","brand":"Lenovo","name":"Lenovo Yoga Tab 3 Pro","os":"Android 6.0 (Marshmallow)","year":2015,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":299,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_zuk_z1","brand":"Lenovo","name":"Lenovo ZUK Z1","os":"Android 5.1.1 (Lollipop), upgradable to 6.0 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_aka","brand":"Lg","name":"LG AKA","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_bello_ii","brand":"Lg","name":"LG Bello II","os":"Android 5.1.1 (Lollipop), LG UI 4","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g_flex2","brand":"Lg","name":"LG G Flex2","os":"Android 5.0.1 (Lollipop), upgradable to 6.0.1 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g_pad_ii_10.1","brand":"Lg","name":"LG G Pad II 10.1","os":"Android 5.1.1 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":1920,"h":1200,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g_pad_ii_8.0_lte","brand":"Lg","name":"LG G Pad II 8.0 LTE","os":"Android 5.0.2 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g_pad_ii_8.3_lte","brand":"Lg","name":"LG G Pad II 8.3 LTE","os":"Android 5.1.1 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":273,"inches":8.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g_stylo","brand":"Lg","name":"LG G Stylo","os":"Android 5.0 (Lollipop), upgradable to 6.0 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":258,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g_vista_2","brand":"Lg","name":"LG G Vista 2","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":386,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g4","brand":"Lg","name":"LG G4","os":"Android 5.1.1 (Lollipop), upgradable to 7.0 (Nougat), LG UX ","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":538,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g4_beat","brand":"Lg","name":"LG G4 Beat","os":"Android 5.1.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":423,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g4_dual","brand":"Lg","name":"LG G4 Dual","os":"Android 5.1.1 (Lollipop), upgradable to 6.0 (Marshmallow), L","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":534,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g4_stylus","brand":"Lg","name":"LG G4 Stylus","os":"Android 5.0 (Lollipop), upgradable to 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":258,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g4c","brand":"Lg","name":"LG G4c","os":"Android 5.0.2 (Lollipop), upgradable to 6.0 (Marshmallow), L","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_joy","brand":"Lg","name":"LG Joy","os":"Android 4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_leon","brand":"Lg","name":"LG Leon","os":"Android 5.0.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_magna","brand":"Lg","name":"LG Magna","os":"Android 5.0.1 (Lollipop), upgradable to 6.0.1 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_nexus_5x","brand":"Lg","name":"LG Nexus 5X","os":"Android 6.0 (Marshmallow), upgradable to Android 8.0 (Oreo)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":423,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_ray","brand":"Lg","name":"LG Ray","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_spirit","brand":"Lg","name":"LG Spirit","os":"Android 5.0.1 (Lollipop), upgradable to 6.0.1 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_tribute_2","brand":"Lg","name":"LG Tribute 2","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_v10","brand":"Lg","name":"LG V10","os":"Android 5.1.1 (Lollipop), upgradable to 7.0 (Nougat)","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":515,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_watch_urbane_2nd_edition_lte","brand":"Lg","name":"LG Watch Urbane 2nd Edition LTE","os":"Android Wear OS 2.1","year":2015,"form":"Phone","tablet":false,"w":480,"h":480,"ppi":348,"inches":1.38,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_wine_smart","brand":"Lg","name":"LG Wine Smart","os":"Android 5.1.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":320,"h":480,"ppi":180,"inches":3.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_zero","brand":"Lg","name":"LG Zero","os":"Android 5.1.1 (Lollipop), upgradаble to 6.0 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_m1","brand":"Meizu","name":"Meizu M1","os":"Android 4.4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":768,"h":1280,"ppi":300,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_m1_metal","brand":"Meizu","name":"Meizu M1 Metal","os":"Android, 5.1.1 (Lollipop), Flyme 5.1","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_m2","brand":"Meizu","name":"Meizu M2","os":"Android 5.1 (Lollipop), Flyme 4.5","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_m2_note","brand":"Meizu","name":"Meizu M2 Note","os":"Android 5.0 (Lollipop), Flyme 4.5","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_mx5","brand":"Meizu","name":"Meizu MX5","os":"Android 5.0.1 (Lollipop), Flyme 4.5","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_pro_5","brand":"Meizu","name":"Meizu PRO 5","os":"Android 5.1 (Lollipop), Flyme 5","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":386,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bolt_a82","brand":"Micromax","name":"Micromax Bolt A82","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bolt_d303","brand":"Micromax","name":"Micromax Bolt D303","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bolt_d320","brand":"Micromax","name":"Micromax Bolt D320","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bolt_d321","brand":"Micromax","name":"Micromax Bolt D321","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bolt_q324","brand":"Micromax","name":"Micromax Bolt Q324","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bolt_q331","brand":"Micromax","name":"Micromax Bolt Q331","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bolt_q332","brand":"Micromax","name":"Micromax Bolt Q332","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bolt_q338","brand":"Micromax","name":"Micromax Bolt Q338","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bolt_q339","brand":"Micromax","name":"Micromax Bolt Q339","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bolt_s300","brand":"Micromax","name":"Micromax Bolt S300","os":"Android 4.4.3 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bolt_s301","brand":"Micromax","name":"Micromax Bolt S301","os":"Android 4.4.2 (KitKat), upgradable to 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":280,"inches":3.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bolt_s302","brand":"Micromax","name":"Micromax Bolt S302","os":"Android 4.4.3 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_5_e481","brand":"Micromax","name":"Micromax Canvas 5 E481","os":"Android 5.1 (Lollipop), upgradable to 6.0 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":423,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_a1_aq4502","brand":"Micromax","name":"Micromax Canvas A1 AQ4502","os":"Android 5.1 (Lollipop), Android One","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_amaze_q395","brand":"Micromax","name":"Micromax Canvas Amaze Q395","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_blaze_4g_q400","brand":"Micromax","name":"Micromax Canvas Blaze 4G Q400","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_blaze_4g+_q414","brand":"Micromax","name":"Micromax Canvas Blaze 4G+ Q414","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_fire_4_a107","brand":"Micromax","name":"Micromax Canvas Fire 4 A107","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_fire_4g_plus_q412","brand":"Micromax","name":"Micromax Canvas Fire 4G Plus Q412","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_fire_4g_q411","brand":"Micromax","name":"Micromax Canvas Fire 4G Q411","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_hue","brand":"Micromax","name":"Micromax Canvas Hue","os":"Android 4.4.2 (KitKat), upgradable to 5.0.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":293,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_juice_2_aq5001","brand":"Micromax","name":"Micromax Canvas Juice 2 AQ5001","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_juice_3_q392","brand":"Micromax","name":"Micromax Canvas Juice 3 Q392","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_juice_3+_q394","brand":"Micromax","name":"Micromax Canvas Juice 3+ Q394","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_juice_4_q382","brand":"Micromax","name":"Micromax Canvas Juice 4 Q382","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_knight_2_e471","brand":"Micromax","name":"Micromax Canvas Knight 2 E471","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_mega_4g_q417","brand":"Micromax","name":"Micromax Canvas Mega 4G Q417","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_mega_e353","brand":"Micromax","name":"Micromax Canvas Mega E353","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_nitro_2_e311","brand":"Micromax","name":"Micromax Canvas Nitro 2 E311","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_nitro_3_e352","brand":"Micromax","name":"Micromax Canvas Nitro 3 E352","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_nitro_4g_e455","brand":"Micromax","name":"Micromax Canvas Nitro 4G E455","os":"Android 5.0.2 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_pace_4g_q416","brand":"Micromax","name":"Micromax Canvas Pace 4G Q416","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_pep_q371","brand":"Micromax","name":"Micromax Canvas Pep Q371","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_play_4g_q469","brand":"Micromax","name":"Micromax Canvas Play 4G Q469","os":"Android 5.0.2 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_play_q355","brand":"Micromax","name":"Micromax Canvas Play Q355","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":178,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_pulse_4g_e451","brand":"Micromax","name":"Micromax Canvas Pulse 4G E451","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_selfie_2_q340","brand":"Micromax","name":"Micromax Canvas Selfie 2 Q340","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_selfie_3_q348","brand":"Micromax","name":"Micromax Canvas Selfie 3 Q348","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":306,"inches":4.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_selfie_lens_q345","brand":"Micromax","name":"Micromax Canvas Selfie Lens Q345","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_sliver_5_q450","brand":"Micromax","name":"Micromax Canvas Sliver 5 Q450","os":"Android 5.0.2 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":306,"inches":4.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_spark_2_q334","brand":"Micromax","name":"Micromax Canvas Spark 2 Q334","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_spark_q380","brand":"Micromax","name":"Micromax Canvas Spark Q380","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":234,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_tab_p470","brand":"Micromax","name":"Micromax Canvas Tab P470","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_tab_p666","brand":"Micromax","name":"Micromax Canvas Tab P666","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_tab_p690","brand":"Micromax","name":"Micromax Canvas Tab P690","os":"Android 4.4.4 (KitKat), upgradable to 5.0.2 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_xpress_2_e313","brand":"Micromax","name":"Micromax Canvas Xpress 2 E313","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_xpress_4g_q413","brand":"Micromax","name":"Micromax Canvas Xpress 4G Q413","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_q372_unite_3","brand":"Micromax","name":"Micromax Q372 Unite 3","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":199,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_q391_canvas_doodle_4","brand":"Micromax","name":"Micromax Q391 Canvas Doodle 4","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":184,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_lumia_430_dual_sim","brand":"Microsoft","name":"Microsoft Lumia 430 Dual SIM","os":"Microsoft Windows Phone 8.1, upgradable to Windows 10","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":235,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_lumia_435","brand":"Microsoft","name":"Microsoft Lumia 435","os":"Microsoft Windows Phone 8.1, upgradable to Windows 10","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_lumia_435_dual_sim","brand":"Microsoft","name":"Microsoft Lumia 435 Dual SIM","os":"Microsoft Windows Phone 8.1, upgradable to Windows 10","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_lumia_532","brand":"Microsoft","name":"Microsoft Lumia 532","os":"Microsoft Windows Phone 8.1","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_lumia_532_dual_sim","brand":"Microsoft","name":"Microsoft Lumia 532 Dual SIM","os":"Microsoft Windows Phone 8.1","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_lumia_540_dual_sim","brand":"Microsoft","name":"Microsoft Lumia 540 Dual SIM","os":"Microsoft Windows Phone 8.1 with Lumia Denim","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_lumia_550","brand":"Microsoft","name":"Microsoft Lumia 550","os":"Microsoft Windows 10","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":315,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_lumia_640_dual_sim","brand":"Microsoft","name":"Microsoft Lumia 640 Dual SIM","os":"Microsoft Windows Phone 8.1, upgradable to Microsoft Windows","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_lumia_640_lte","brand":"Microsoft","name":"Microsoft Lumia 640 LTE","os":"Microsoft Windows Phone 8.1, upgradable to Microsoft Windows","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_lumia_640_lte_dual_sim","brand":"Microsoft","name":"Microsoft Lumia 640 LTE Dual SIM","os":"Microsoft Windows Phone 8.1, upgradable to Microsoft Windows","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_lumia_640_xl","brand":"Microsoft","name":"Microsoft Lumia 640 XL","os":"Microsoft Windows Phone 8.1, upgradable to Microsoft Windows","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":259,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_lumia_640_xl_dual_sim","brand":"Microsoft","name":"Microsoft Lumia 640 XL Dual SIM","os":"Microsoft Windows Phone 8.1, upgradable to Microsoft Windows","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":259,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_lumia_640_xl_lte","brand":"Microsoft","name":"Microsoft Lumia 640 XL LTE","os":"Microsoft Windows Phone 8.1, upgradable to Microsoft Windows","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":259,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_lumia_640_xl_lte_dual_sim","brand":"Microsoft","name":"Microsoft Lumia 640 XL LTE Dual SIM","os":"Microsoft Windows Phone 8.1, upgradable to Microsoft Windows","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":259,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_lumia_950","brand":"Microsoft","name":"Microsoft Lumia 950","os":"Microsoft Windows 10","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":564,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_lumia_950_dual_sim","brand":"Microsoft","name":"Microsoft Lumia 950 Dual SIM","os":"Microsoft Windows 10","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":565,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_lumia_950_xl","brand":"Microsoft","name":"Microsoft Lumia 950 XL","os":"Microsoft Windows 10","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":518,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_lumia_950_xl_dual_sim","brand":"Microsoft","name":"Microsoft Lumia 950 XL Dual SIM","os":"Microsoft Windows 10","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":515,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_droid_maxx_2","brand":"Motorola","name":"Motorola Droid Maxx 2","os":"Android 5.1.1 (Lollipop), upgradable to 7.0 (Nougat)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_droid_turbo_2","brand":"Motorola","name":"Motorola Droid Turbo 2","os":"Android 5.1.1 (Lollipop), upgradable to 7.0 (Nougat)","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":540,"inches":5.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e_2nd_gen","brand":"Motorola","name":"Motorola Moto E (2nd gen)","os":"Android 5.0/5.1 (Lollipop) - only XT1527, upgradable to 6.0 ","year":2015,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":245,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e_dual_sim_2nd_gen","brand":"Motorola","name":"Motorola Moto E Dual SIM (2nd gen)","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":245,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_3rd_gen","brand":"Motorola","name":"Motorola Moto G (3rd gen)","os":"Android 5.1.1 (Lollipop), upgradable to 6.0 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_4g_2nd_gen","brand":"Motorola","name":"Motorola Moto G 4G (2nd gen)","os":"Android 5.0.2 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_4g_dual_sim_2nd_gen","brand":"Motorola","name":"Motorola Moto G 4G Dual SIM (2nd gen)","os":"Android 5.0.2 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_dual_sim_3rd_gen","brand":"Motorola","name":"Motorola Moto G Dual SIM (3rd gen)","os":"Android 5.1.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_turbo","brand":"Motorola","name":"Motorola Moto G Turbo","os":"Android 5.1.1 (Lollipop), upgradable to 6.0 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_x_force","brand":"Motorola","name":"Motorola Moto X Force","os":"Android 5.1.1 (Lollipop), upgradable to 7.0 (Nougat)","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":540,"inches":5.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_x_play","brand":"Motorola","name":"Motorola Moto X Play","os":"Android 5.1.1 (Lollipop), upgradable to 7.1.1 (Nougat)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_x_play_dual_sim","brand":"Motorola","name":"Motorola Moto X Play Dual SIM","os":"Android 5.1.1 (Lollipop), upgradable to 7.1.1 (Nougat)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_x_style","brand":"Motorola","name":"Motorola Moto X Style","os":"Android 5.1.1 (Lollipop), 6.0, upgradable to 7.0 (Nougat)","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":520,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_2","brand":"Oneplus","name":"OnePlus 2","os":"Android 5.1 (Lollipop), upgradable to 6.0.1 (Marshmallow), O","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_x","brand":"Oneplus","name":"OnePlus X","os":"Android 5.1.1 (Lollipop), upgradable to 6.0.1 (Marshmallow),","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a31_2015","brand":"Oppo","name":"Oppo A31 (2015)","os":"Android 4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a33_2015","brand":"Oppo","name":"Oppo A33 (2015)","os":"Android 5.1 (Lollipop), ColorOS 2.1","year":2015,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_a53_2015","brand":"Oppo","name":"Oppo A53 (2015)","os":"Android 5.1 (Lollipop), ColorOS 2.1","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_joy_3","brand":"Oppo","name":"Oppo Joy 3","os":"Android 4.4 (KitKat), ColorOS 2","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_joy_plus","brand":"Oppo","name":"Oppo Joy Plus","os":"Android 4.4 (KitKat), ColorOS 2","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_mirror_3","brand":"Oppo","name":"Oppo Mirror 3","os":"Android 4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_mirror_5","brand":"Oppo","name":"Oppo Mirror 5","os":"Android 5.1 (Lollipop), ColorOS 2.1","year":2015,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_mirror_5s","brand":"Oppo","name":"Oppo Mirror 5s","os":"Android 5.1 (Lollipop), ColorOS 2.1","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_neo_5_2015","brand":"Oppo","name":"Oppo Neo 5 (2015)","os":"Android 4.4.2 (KitKat), ColorOS 2","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_neo_5s","brand":"Oppo","name":"Oppo Neo 5s","os":"Android 4.4.2 (KitKat), , ColorOS 2","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_neo_7","brand":"Oppo","name":"Oppo Neo 7","os":"Android 5.1 (Lollipop), ColorOS 2.1","year":2015,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_r1x","brand":"Oppo","name":"Oppo R1x","os":"Android 4.4 (KitKat), ColorOS 2","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_r5s","brand":"Oppo","name":"Oppo R5s","os":"Android 4.4.4 (KitKat), ColorOS 2","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_r7","brand":"Oppo","name":"Oppo R7","os":"Android 4.4.2 (KitKat), ColorOS 2.1","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":445,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_r7_lite","brand":"Oppo","name":"Oppo R7 lite","os":"Android 5.1 (Lollipop), ColorOS 2.1","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_r7_plus","brand":"Oppo","name":"Oppo R7 Plus","os":"Android 5.1.1 (Lollipop), ColorOS 2.1","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_u3","brand":"Oppo","name":"Oppo U3","os":"Android 4.4.4 (KitKat), ColorOS 2","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":377,"inches":5.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a3_2016","brand":"Samsung","name":"Samsung Galaxy A3 (2016)","os":"Android 5.1.1 (Lollipop), upgradable to 7.0 (Nougat)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a5_2016","brand":"Samsung","name":"Samsung Galaxy A5 (2016)","os":"Android 5.1.1 (Lollipop), upgradable to 7.0 (Nougat)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a7","brand":"Samsung","name":"Samsung Galaxy A7","os":"Android 4.4.4 (KitKat), upgradable to 5.0.2 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a7_2016","brand":"Samsung","name":"Samsung Galaxy A7 (2016)","os":"Android 5.1.1 (Lollipop), upgradable to 7.0 (Nougat)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a7_duos","brand":"Samsung","name":"Samsung Galaxy A7 Duos","os":"Android 4.4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a8","brand":"Samsung","name":"Samsung Galaxy A8","os":"Android 5.1.1 (Lollipop), upgradable to 6.0 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":386,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a8_duos","brand":"Samsung","name":"Samsung Galaxy A8 Duos","os":"Android 5.1 (Lollipop), upgradable to 6.0 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":386,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a9_2016","brand":"Samsung","name":"Samsung Galaxy A9 (2016)","os":"Android 5.1.1 (Lollipop), upgradable to 6.0.1 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_e5","brand":"Samsung","name":"Samsung Galaxy E5","os":"Android 4.4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_e7","brand":"Samsung","name":"Samsung Galaxy E7","os":"Android 4.4.4 (KitKat), upgradable to 5.1.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_folder","brand":"Samsung","name":"Samsung Galaxy Folder","os":"Android 5.1 (Lollipop)","year":2015,"form":"Foldable","tablet":false,"w":480,"h":800,"ppi":246,"inches":3.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_grand_max","brand":"Samsung","name":"Samsung Galaxy Grand Max","os":"Android 4.4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.25,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j1","brand":"Samsung","name":"Samsung Galaxy J1","os":"Android 4.4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":217,"inches":4.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j1_4g","brand":"Samsung","name":"Samsung Galaxy J1 4G","os":"Android 4.4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":217,"inches":4.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j1_ace","brand":"Samsung","name":"Samsung Galaxy J1 Ace","os":"Android 4.4.4 (KitKat), upgradable to 5.1.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":217,"inches":4.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j2","brand":"Samsung","name":"Samsung Galaxy J2","os":"Android 5.1.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":234,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j5","brand":"Samsung","name":"Samsung Galaxy J5","os":"Android 5.1 (Lollipop), upgradable to 6.0.1 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_j7","brand":"Samsung","name":"Samsung Galaxy J7","os":"Android 5.1 (Lollipop), upgradable to 7.1.1 (Nougat)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note5","brand":"Samsung","name":"Samsung Galaxy Note5","os":"Android 5.1.1 (Lollipop), upgradable to 7.0 (Nougat)","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":518,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note5_usa","brand":"Samsung","name":"Samsung Galaxy Note5 (USA)","os":"Android 5.1.1 (Lollipop), upgradable to 7.0 (Nougat)","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":515,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note5_duos","brand":"Samsung","name":"Samsung Galaxy Note5 Duos","os":"Android 5.1.1 (Lollipop), upgradable to 7.0 (Nougat)","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":515,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_on5","brand":"Samsung","name":"Samsung Galaxy On5","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":288,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_on7","brand":"Samsung","name":"Samsung Galaxy On7","os":"Android 5.1 (Lollipop), upgradable to 6.0.1 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s4_mini_i9195i","brand":"Samsung","name":"Samsung Galaxy S4 mini I9195I","os":"Android 4.4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":256,"inches":4.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s5_neo","brand":"Samsung","name":"Samsung Galaxy S5 Neo","os":"Android 5.1.1 (Lollipop), upgradable to 7.0 (Nougat)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":432,"inches":5.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s6","brand":"Samsung","name":"Samsung Galaxy S6","os":"Android 5.0.2 (Lollipop), upgradable to Android 8.0 (Oreo), ","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":577,"inches":5.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s6_usa","brand":"Samsung","name":"Samsung Galaxy S6 (USA)","os":"Android 5.0.2 (Lollipop), upgradable to 5.1 (Lollipop), Touc","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":576,"inches":5.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s6_active","brand":"Samsung","name":"Samsung Galaxy S6 active","os":"Android 5.0.2 (Lollipop), upgradable to 6.0.1 (Marshmallow),","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":576,"inches":5.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s6_duos","brand":"Samsung","name":"Samsung Galaxy S6 Duos","os":"Android 5.0.2 (Lollipop), upgradable to Android 8.0 (Oreo), ","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":576,"inches":5.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s6_edge","brand":"Samsung","name":"Samsung Galaxy S6 edge","os":"Android 5.0.2 (Lollipop), upgradable to 7.0 (Nougat), TouchW","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":577,"inches":5.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s6_edge_usa","brand":"Samsung","name":"Samsung Galaxy S6 edge (USA)","os":"Android 5.0.2 (Lollipop), upgradable to 5.1 (Lollipop), Touc","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":576,"inches":5.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s6_edge+","brand":"Samsung","name":"Samsung Galaxy S6 edge+","os":"Android 5.1.1 (Lollipop), upgradable to 7.0 (Nougat), TouchW","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":518,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s6_edge+_usa","brand":"Samsung","name":"Samsung Galaxy S6 edge+ (USA)","os":"Android 5.1.1 (Lollipop), TouchWiz UI","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":515,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s6_edge+_duos","brand":"Samsung","name":"Samsung Galaxy S6 edge+ Duos","os":"Android 5.1.1 (Lollipop), upgradable to 6.0.1 (Marshmallow),","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":515,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s6_plus","brand":"Samsung","name":"Samsung Galaxy S6 Plus","os":"Android 5.0.2 (Lollipop), TouchWiz UI","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_3_lite_7.0_ve","brand":"Samsung","name":"Samsung Galaxy Tab 3 Lite 7.0 VE","os":"Android 4.4.4 (KitKat)","year":2015,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_3_v","brand":"Samsung","name":"Samsung Galaxy Tab 3 V","os":"Android 4.4 (KitKat)","year":2015,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_4_10.1_2015","brand":"Samsung","name":"Samsung Galaxy Tab 4 10.1 (2015)","os":"Android 4.4.4 (KitKat), upgradable to 5.1.1 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":1280,"h":800,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_4_8.0_2015","brand":"Samsung","name":"Samsung Galaxy Tab 4 8.0 (2015)","os":"Android 4.4.4 (KitKat)","year":2015,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_a_8.0_&_s_pen_2015","brand":"Samsung","name":"Samsung Galaxy Tab A 8.0 & S Pen (2015)","os":"Android 5.0 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":768,"h":1024,"ppi":160,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_a_8.0_2015","brand":"Samsung","name":"Samsung Galaxy Tab A 8.0 (2015)","os":"Android 5.0 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":768,"h":1024,"ppi":160,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_a_9.7","brand":"Samsung","name":"Samsung Galaxy Tab A 9.7","os":"Android 5.0 (Lollipop), upgradable to 6.0.1 (Marshmallow)","year":2015,"form":"Tablet","tablet":true,"w":768,"h":1024,"ppi":132,"inches":9.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_a_9.7_&_s_pen","brand":"Samsung","name":"Samsung Galaxy Tab A 9.7 & S Pen","os":"Android 5.0 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":768,"h":1024,"ppi":132,"inches":9.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_e_9.6","brand":"Samsung","name":"Samsung Galaxy Tab E 9.6","os":"Android 4.4 (KitKat) - EU model","year":2015,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":157,"inches":9.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s2_8.0","brand":"Samsung","name":"Samsung Galaxy Tab S2 8.0","os":"Android 5.0.2 (Lollipop), upgradable to 6.0.1 (Marshmallow) ","year":2015,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":320,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s2_9.7","brand":"Samsung","name":"Samsung Galaxy Tab S2 9.7","os":"Android 5.0.2 (Lollipop), upgradable to 6.0.1 (Marshmallow) ","year":2015,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":264,"inches":9.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_v_plus","brand":"Samsung","name":"Samsung Galaxy V Plus","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_view","brand":"Samsung","name":"Samsung Galaxy View","os":"Android 5.1.1 (Lollipop)","year":2015,"form":"Tablet","tablet":true,"w":1080,"h":1920,"ppi":120,"inches":18.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_xcover_3","brand":"Samsung","name":"Samsung Galaxy XCover 3","os":"Android 4.4.4 (KitKat), upgradable to 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":207,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_z1","brand":"Samsung","name":"Samsung Z1","os":"Tizen 2.3","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_z3","brand":"Samsung","name":"Samsung Z3","os":"Tizen 2.3, upgradable to 2.4","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_crystal_2","brand":"Sharp","name":"Sharp Aquos Crystal 2","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":282,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_xx","brand":"Sharp","name":"Sharp Aquos Xx","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":386,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_c4","brand":"Sony","name":"Sony Xperia C4","os":"Android 5.0 (Lollipop), upgradable to 6.0 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_c4_dual","brand":"Sony","name":"Sony Xperia C4 Dual","os":"Android 5.0 (Lollipop), upgradable to 6.0 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_c5_ultra","brand":"Sony","name":"Sony Xperia C5 Ultra","os":"Android 5.0 (Lollipop), upgradable to 6.0 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_c5_ultra_dual","brand":"Sony","name":"Sony Xperia C5 Ultra Dual","os":"Android 5.0 (Lollipop), upgradable to 6.0 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_e1_ii","brand":"Sony","name":"Sony Xperia E1 II","os":"Android 4.4.4 (KitKat), Timescape UI","year":2015,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":275,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_e4","brand":"Sony","name":"Sony Xperia E4","os":"Android 4.4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_e4_dual","brand":"Sony","name":"Sony Xperia E4 Dual","os":"Android 4.4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_e4g","brand":"Sony","name":"Sony Xperia E4g","os":"Android 4.4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":234,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_e4g_dual","brand":"Sony","name":"Sony Xperia E4g Dual","os":"Android 4.4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":234,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_m4_aqua","brand":"Sony","name":"Sony Xperia M4 Aqua","os":"Android 5.0.1 (Lollipop), upgradable to 6.0.1 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_m4_aqua_dual","brand":"Sony","name":"Sony Xperia M4 Aqua Dual","os":"Android 5.0 (Lollipop), upgradable to 6.0 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_m5","brand":"Sony","name":"Sony Xperia M5","os":"Android 5.0.1 (Lollipop), upgradable to 6.0.1 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_m5_dual","brand":"Sony","name":"Sony Xperia M5 Dual","os":"Android 5.0 (Lollipop), upgradable to 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z3+","brand":"Sony","name":"Sony Xperia Z3+","os":"Android 5.0.1 (Lollipop), upgradable to 7.0 (Nougat)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z3+_dual","brand":"Sony","name":"Sony Xperia Z3+ dual","os":"Android 5.0 (Lollipop), upgradable to 6.0 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":428,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z4_compact","brand":"Sony","name":"Sony Xperia Z4 Compact","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":469,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z4_tablet_lte","brand":"Sony","name":"Sony Xperia Z4 Tablet LTE","os":"Android 5.0 (Lollipop), upgradable to 7.1 (Nougat)","year":2015,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":299,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z4_tablet_wifi","brand":"Sony","name":"Sony Xperia Z4 Tablet WiFi","os":"Android 5.0 (Lollipop), upgradable to 7.1 (Nougat)","year":2015,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":299,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z4_ultra","brand":"Sony","name":"Sony Xperia Z4 Ultra","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":342,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z4v","brand":"Sony","name":"Sony Xperia Z4v","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":565,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z5","brand":"Sony","name":"Sony Xperia Z5","os":"Android 5.1.1 (Lollipop), upgradable to 7.1.1 (Nougat)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":428,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z5_compact","brand":"Sony","name":"Sony Xperia Z5 Compact","os":"Android 5.1.1 (Lollipop), upgradable to 7.1.1 (Nougat)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":323,"inches":4.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z5_dual","brand":"Sony","name":"Sony Xperia Z5 Dual","os":"Android 5.1.1 (Lollipop), upgradable to 7.0 (Nougat)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z5_premium","brand":"Sony","name":"Sony Xperia Z5 Premium","os":"Android 5.1.1 (Lollipop), upgradable to 7.0 (Nougat)","year":2015,"form":"Phone","tablet":false,"w":2160,"h":3840,"ppi":806,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z5_premium_dual","brand":"Sony","name":"Sony Xperia Z5 Premium Dual","os":"Android 5.1.1 (Lollipop), upgradable to 7.0 (Nougat)","year":2015,"form":"Phone","tablet":false,"w":2160,"h":3840,"ppi":801,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v1","brand":"Vivo","name":"vivo V1","os":"Android 5.0 (Lollipop), Funtouch 2.1","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_v1_max","brand":"Vivo","name":"vivo V1 Max","os":"Android 5.0 (Lollipop), Funtouch 2.1","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x5max_platinum_edition","brand":"Vivo","name":"vivo X5Max Platinum Edition","os":"Android 4.4.4 (KitKat), Funtouch 2","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x5max+","brand":"Vivo","name":"vivo X5Max+","os":"Android 4.4.4 (KitKat), Funtouch 2","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x5pro","brand":"Vivo","name":"vivo X5Pro","os":"Android 5.0 (Lollipop), Funtouch 2.1","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x6","brand":"Vivo","name":"vivo X6","os":"Android 5.1 (Lollipop), Funtouch 2.1","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x6plus","brand":"Vivo","name":"vivo X6Plus","os":"Android 5.1 (Lollipop), Funtouch 2.1","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":386,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y15s_2015","brand":"Vivo","name":"vivo Y15S (2015)","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y31_2015","brand":"Vivo","name":"vivo Y31 (2015)","os":"Android 5.1 (Lollipop), Funtouch 2.1","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y35_2015","brand":"Vivo","name":"vivo Y35 (2015)","os":"Android 5.0 (Lollipop), Funtouch 2.1","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y37_2015","brand":"Vivo","name":"vivo Y37 (2015)","os":"Android 5.0 (Lollipop), Funtouch 2.1","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y51_2015","brand":"Vivo","name":"vivo Y51 (2015)","os":"Android 5.0.2 (Lollipop), Funtouch 2.5","year":2015,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_4c","brand":"Xiaomi","name":"Xiaomi Mi 4c","os":"Android 5.1.1 (Lollipop), upgradable to 7.0 (Nougat), MIUI 1","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_4i","brand":"Xiaomi","name":"Xiaomi Mi 4i","os":"Android 5.0.2 (Lollipop), MIUI 8.2","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_note","brand":"Xiaomi","name":"Xiaomi Mi Note","os":"Android 4.4.4 (KitKat), upgradable to 6.0 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":386,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_note_pro","brand":"Xiaomi","name":"Xiaomi Mi Note Pro","os":"Android 5.0.1 (Lollipop), upgradable to 7.0 (Nougat), MIUI 9","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":515,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_pad_2","brand":"Xiaomi","name":"Xiaomi Mi Pad 2","os":"Android OS/ Optional Windows 10 (64 GB model), MIUI 7","year":2015,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":326,"inches":7.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_2","brand":"Xiaomi","name":"Xiaomi Redmi 2","os":"Android 4.4.4 (KitKat), MIUI 6.0","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_2_prime","brand":"Xiaomi","name":"Xiaomi Redmi 2 Prime","os":"Android 4.4.4 (KitKat), upgradable to 5.1.1 (Lollipop), MIUI","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_2_pro","brand":"Xiaomi","name":"Xiaomi Redmi 2 Pro","os":"Android 4.4.4 (KitKat), MIUI 6","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_2a","brand":"Xiaomi","name":"Xiaomi Redmi 2A","os":"Android 5.0 (Lollipop), MIUI 6","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_2","brand":"Xiaomi","name":"Xiaomi Redmi Note 2","os":"Android 5.0 (Lollipop), MIUI 7","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_3_mediatek","brand":"Xiaomi","name":"Xiaomi Redmi Note 3 (MediaTek)","os":"Android 5.0.2 (Lollipop), MIUI 7","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_prime","brand":"Xiaomi","name":"Xiaomi Redmi Note Prime","os":"Android 4.4.4 (KitKat), MIUI 9.2","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon","brand":"Zte","name":"ZTE Axon","os":"Android 5.1.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_elite","brand":"Zte","name":"ZTE Axon Elite","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_lux","brand":"Zte","name":"ZTE Axon Lux","os":"Android 5.0.2 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":534,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_max","brand":"Zte","name":"ZTE Axon Max","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_mini","brand":"Zte","name":"ZTE Axon mini","os":"Android 5.1.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_axon_pro","brand":"Zte","name":"ZTE Axon Pro","os":"Android 5.1.1 (Lollipop), upgradable to 6.0 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":534,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a410","brand":"Zte","name":"ZTE Blade A410","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_a460","brand":"Zte","name":"ZTE Blade A460","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_apex_3","brand":"Zte","name":"ZTE Blade Apex 3","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_d6","brand":"Zte","name":"ZTE Blade D6","os":"Android 5.0.2 (Lollipop), MiFavor 3.2","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_g","brand":"Zte","name":"ZTE Blade G","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_g_lux","brand":"Zte","name":"ZTE Blade G Lux","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_l3","brand":"Zte","name":"ZTE Blade L3","os":"Android 4.4 or Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_l3_plus","brand":"Zte","name":"ZTE Blade L3 Plus","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_q_pro","brand":"Zte","name":"ZTE Blade Q Pro","os":"Android 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_qlux_4g","brand":"Zte","name":"ZTE Blade Qlux 4G","os":"Android 4.4.4 (KitKat), upgradable to 5.0 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_s6","brand":"Zte","name":"ZTE Blade S6","os":"Android 5.1 (Lollipop), MiFavor 3","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_s6_plus","brand":"Zte","name":"ZTE Blade S6 Plus","os":"Android 5.2 (Lollipop), MiFavor 3","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_s7","brand":"Zte","name":"ZTE Blade S7","os":"Android 5.1 (Lollipop), MiFavor UI","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_x3","brand":"Zte","name":"ZTE Blade X3","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_x5","brand":"Zte","name":"ZTE Blade X5","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_x9","brand":"Zte","name":"ZTE Blade X9","os":"Android 5.1 (Lollipop), nubia UI 3","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_boost_max+","brand":"Zte","name":"ZTE Boost Max+","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":258,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_grand_s3","brand":"Zte","name":"ZTE Grand S3","os":"Android 4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_grand_x_max+","brand":"Zte","name":"ZTE Grand X Max+","os":"Android 4.4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":245,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_grand_x2","brand":"Zte","name":"ZTE Grand X2","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_imperial_ii","brand":"Zte","name":"ZTE Imperial II","os":"Android 4.4.2 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_maven","brand":"Zte","name":"ZTE Maven","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_my_prague","brand":"Zte","name":"ZTE nubia My Prague","os":"Android 5.2 (Lollipop), nubia UI 3","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z9","brand":"Zte","name":"ZTE nubia Z9","os":"Android 5.2 (Lollipop), nubia UI 3","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z9_max","brand":"Zte","name":"ZTE nubia Z9 Max","os":"Android 5.0.2 (Lollipop), nubia UI 2.8","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z9_mini","brand":"Zte","name":"ZTE nubia Z9 mini","os":"Android 5.0.2 (Lollipop), nubia UI 2.8","year":2015,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_obsidian","brand":"Zte","name":"ZTE Obsidian","os":"Android 5.1 (Lollipop)","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_open_l","brand":"Zte","name":"ZTE Open L","os":"Firefox OS 2.2","year":2015,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_sonata_2","brand":"Zte","name":"ZTE Sonata 2","os":"Android 4.4 (KitKat)","year":2015,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_v5_lux","brand":"Zte","name":"ZTE V5 Lux","os":"Android 4.4 (KitKat), nubia UI 2.5","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_zmax_2","brand":"Zte","name":"ZTE Zmax 2","os":"Android 5.1 (Lollipop), upgradable to 6.0.1 (Marshmallow)","year":2015,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_evolve_2","brand":"Alcatel","name":"alcatel Evolve 2","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_fierce_2","brand":"Alcatel","name":"alcatel Fierce 2","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_fire_7","brand":"Alcatel","name":"alcatel Fire 7","os":"Firefox OS 1.3","year":2014,"form":"Tablet","tablet":true,"w":540,"h":960,"ppi":157,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_fire_c","brand":"Alcatel","name":"alcatel Fire C","os":"Firefox OS 1.3","year":2014,"form":"Phone","tablet":false,"w":320,"h":480,"ppi":165,"inches":3.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_fire_c_2g","brand":"Alcatel","name":"alcatel Fire C 2G","os":"Firefox OS 1.3","year":2014,"form":"Phone","tablet":false,"w":320,"h":480,"ppi":165,"inches":3.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_fire_e","brand":"Alcatel","name":"alcatel Fire E","os":"Firefox OS 1.3","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":245,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_fire_s","brand":"Alcatel","name":"alcatel Fire S","os":"Firefox 2.0, upgradable to 2.1","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":245,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_flash","brand":"Alcatel","name":"alcatel Flash","os":"Android 4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_hero_2","brand":"Alcatel","name":"alcatel Hero 2","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_hero_8","brand":"Alcatel","name":"alcatel Hero 8","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":283,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_idol_2","brand":"Alcatel","name":"alcatel Idol 2","os":"Android 4.2 (Jelly Bean), upgradable to 4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_idol_2_mini","brand":"Alcatel","name":"alcatel Idol 2 Mini","os":"Android 4.3 (Jelly Bean), upgradable to 4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":245,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_idol_2_mini_s","brand":"Alcatel","name":"alcatel Idol 2 Mini S","os":"Android 4.3 (Jelly Bean), upgradable to 4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":245,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_idol_2_s","brand":"Alcatel","name":"alcatel Idol 2 S","os":"Android 4.3 (Jelly Bean), upgradable to 4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_idol_x+","brand":"Alcatel","name":"alcatel Idol X+","os":"Android 4.2.1 (Jelly Bean), upgradable to 4.4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_2","brand":"Alcatel","name":"alcatel Pixi 2","os":"Android 4.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":320,"h":480,"ppi":165,"inches":3.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_7","brand":"Alcatel","name":"alcatel Pixi 7","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":540,"h":960,"ppi":157,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pixi_8","brand":"Alcatel","name":"alcatel Pixi 8","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_2_4","brand":"Alcatel","name":"alcatel Pop 2 (4)","os":"Android 5.0 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_2_4.5","brand":"Alcatel","name":"alcatel Pop 2 (4.5)","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_2_4.5_dual_sim","brand":"Alcatel","name":"alcatel Pop 2 (4.5) Dual SIM","os":"Android 4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_2_5","brand":"Alcatel","name":"alcatel Pop 2 (5)","os":"Android 5.0 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_2_5_premium","brand":"Alcatel","name":"alcatel Pop 2 (5) Premium","os":"Android 5.0 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_7","brand":"Alcatel","name":"alcatel Pop 7","os":"Android 4.2 (Jelly Bean)","year":2014,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_7s","brand":"Alcatel","name":"alcatel Pop 7S","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_8","brand":"Alcatel","name":"alcatel Pop 8","os":"Android 4.2 (Jelly Bean)","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_8s","brand":"Alcatel","name":"alcatel Pop 8S","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_c2","brand":"Alcatel","name":"alcatel Pop C2","os":"Android 4.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_c9","brand":"Alcatel","name":"alcatel Pop C9","os":"Android 4.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":200,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_d1","brand":"Alcatel","name":"alcatel Pop D1","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":320,"h":480,"ppi":165,"inches":3.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_d3","brand":"Alcatel","name":"alcatel Pop D3","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_d5","brand":"Alcatel","name":"alcatel Pop D5","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_icon","brand":"Alcatel","name":"alcatel Pop Icon","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_s3","brand":"Alcatel","name":"alcatel Pop S3","os":"Android 4.3 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_s7","brand":"Alcatel","name":"alcatel Pop S7","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"alcatel_alcatel_pop_s9","brand":"Alcatel","name":"alcatel Pop S9","os":"Android 4.3 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":249,"inches":5.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"apple_apple_ipad_air_2","brand":"Apple","name":"Apple iPad Air 2","os":"iOS 8.1, upgradable to iPadOS 15.8.1","year":2014,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":264,"inches":9.7,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_ipad_mini_3","brand":"Apple","name":"Apple iPad mini 3","os":"iOS 8.1, upgradable to iPadOS 12.5.6","year":2014,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":324,"inches":7.9,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":13,"medium":17,"large":24}},{"id":"apple_apple_iphone_6","brand":"Apple","name":"Apple iPhone 6","os":"iOS 8, upgradable to iOS 12.5.6","year":2014,"form":"Phone","tablet":false,"w":750,"h":1334,"ppi":326,"inches":4.7,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"apple_apple_iphone_6_plus","brand":"Apple","name":"Apple iPhone 6 Plus","os":"iOS 8, upgradable to iOS 12.5.6","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"ios","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"SF Pro","prop":"SF Pro","mono":"SF Mono","small":12,"medium":15,"large":22}},{"id":"asus_asus_fonepad_7_2014","brand":"Asus","name":"Asus Fonepad 7 (2014)","os":"Android 4.3 (Jelly Bean)","year":2014,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_fonepad_7_fe375cg","brand":"Asus","name":"Asus Fonepad 7 FE375CG","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":216,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_fonepad_7_fe375cxg","brand":"Asus","name":"Asus Fonepad 7 FE375CXG","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":216,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_fonepad_8_fe380cg","brand":"Asus","name":"Asus Fonepad 8 FE380CG","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_memo_pad_10_me103k","brand":"Asus","name":"Asus Memo Pad 10 ME103K","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_memo_pad_7_me176c","brand":"Asus","name":"Asus Memo Pad 7 ME176C","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":216,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_memo_pad_7_me572c","brand":"Asus","name":"Asus Memo Pad 7 ME572C","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":323,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_memo_pad_7_me572cl","brand":"Asus","name":"Asus Memo Pad 7 ME572CL","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":323,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_memo_pad_8_me181c","brand":"Asus","name":"Asus Memo Pad 8 ME181C","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_memo_pad_8_me581cl","brand":"Asus","name":"Asus Memo Pad 8 ME581CL","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":283,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_padfone_e","brand":"Asus","name":"Asus PadFone E","os":"Android 4.3 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_padfone_infinity_lite","brand":"Asus","name":"Asus PadFone Infinity Lite","os":"Android 4.1 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_padfone_mini_intel","brand":"Asus","name":"Asus PadFone mini (Intel)","os":"Android 4.3 (Jelly Bean), upgradable to 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_padfone_mini_4g_intel","brand":"Asus","name":"Asus PadFone mini 4G (Intel)","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_padfone_s","brand":"Asus","name":"Asus PadFone S","os":"Android 4.4.2 (KitKat), upgradable to 6.0 (Marshmallow)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_padfone_x","brand":"Asus","name":"Asus PadFone X","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_padfone_x_mini","brand":"Asus","name":"Asus PadFone X mini","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_pegasus","brand":"Asus","name":"Asus Pegasus","os":"Android 4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_transformer_pad_tf103c","brand":"Asus","name":"Asus Transformer Pad TF103C","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_transformer_pad_tf303cl","brand":"Asus","name":"Asus Transformer Pad TF303CL","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":1920,"h":1200,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_4_2014","brand":"Asus","name":"Asus Zenfone 4 (2014)","os":"Android 4.3 (Jelly Bean), upgradable to 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_4_a450cg_2014","brand":"Asus","name":"Asus Zenfone 4 A450CG (2014)","os":"Android 4.4.2 (KitKat), upgradable to 5.0.2 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_5_a500cg_2014","brand":"Asus","name":"Asus Zenfone 5 A500CG (2014)","os":"Android 4.3 (Jelly Bean), upgradable to 5.0.2 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_5_a500kl_2014","brand":"Asus","name":"Asus Zenfone 5 A500KL (2014)","os":"Android 4.4.2 (KitKat), upgradable to 5.0.2 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_5_lite_a502cg_2014","brand":"Asus","name":"Asus Zenfone 5 Lite A502CG (2014)","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_6_a600cg_2014","brand":"Asus","name":"Asus Zenfone 6 A600CG (2014)","os":"Android 4.3 (Jelly Bean), upgradable to 5.0.2 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":245,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"asus_asus_zenfone_6_a601cg_2014","brand":"Asus","name":"Asus Zenfone 6 A601CG (2014)","os":"Android 4.3 (Jelly Bean), upgradable to 5.0.2 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":245,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cat_cat_b15_q","brand":"Cat","name":"Cat B15 Q","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"cat_cat_s50","brand":"Cat","name":"Cat S50","os":"Android 4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_3c_4g","brand":"Honor","name":"Honor 3C 4G","os":"Android 4.4.2 (KitKat), EMUI 2.3","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_3c_play","brand":"Honor","name":"Honor 3C Play","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_3x_pro","brand":"Honor","name":"Honor 3X Pro","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_4_play","brand":"Honor","name":"Honor 4 Play","os":"Android 4.4.4 (KitKat), EMUI 2.3","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_4x","brand":"Honor","name":"Honor 4X","os":"Android 4.4.2 (KitKat), upgradable to 6 (Marshmallow), EMUI ","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_6","brand":"Honor","name":"Honor 6","os":"Android 4.4.2 (KitKat), upgradable to 6.0 (Marshmallow), EMU","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":445,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_6_plus","brand":"Honor","name":"Honor 6 Plus","os":"Android 4.4.2 (KitKat), upgradable to 6 (Marshmallow), EMUI ","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"honor_honor_holly","brand":"Honor","name":"Honor Holly","os":"Android 4.4.2 (KitKat), EMUI 2.3","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_butterfly_2","brand":"Htc","name":"HTC Butterfly 2","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_210_dual_sim","brand":"Htc","name":"HTC Desire 210 dual sim","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_310","brand":"Htc","name":"HTC Desire 310","os":"Android 4.2.2 (Jelly Bean), Sense UI 5.1","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_310_dual_sim","brand":"Htc","name":"HTC Desire 310 dual sim","os":"Android 4.2.2 (Jelly Bean), Sense UI 5.1","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_510","brand":"Htc","name":"HTC Desire 510","os":"Android 4.4.2 (KitKat), Sense UI 5.5","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":208,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_516_dual_sim","brand":"Htc","name":"HTC Desire 516 dual sim","os":"Android 4.2.2 (Jelly Bean), Sense UI 5.1","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_610","brand":"Htc","name":"HTC Desire 610","os":"Android 4.4.2 (KitKat), Sense UI 5.5","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":234,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_612","brand":"Htc","name":"HTC Desire 612","os":"Android 4.4.2 (KitKat), Sense UI 5.5","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":234,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_616_dual_sim","brand":"Htc","name":"HTC Desire 616 dual sim","os":"Android 4.2.2 (Jelly Bean), Sense UI 5.5","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_620","brand":"Htc","name":"HTC Desire 620","os":"Android 4.4.4 (KitKat), Sense UI","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_620g_dual_sim","brand":"Htc","name":"HTC Desire 620G dual sim","os":"Android 4.4.4 (KitKat), Sense UI","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_626","brand":"Htc","name":"HTC Desire 626","os":"Android 4.4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_700","brand":"Htc","name":"HTC Desire 700","os":"Android 4.1.2 (Jelly Bean), Sense UI 5","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_816","brand":"Htc","name":"HTC Desire 816","os":"Android 4.4.2 (KitKat), upgradable to 6 (Marshmallow), Sense","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_816_dual_sim","brand":"Htc","name":"HTC Desire 816 dual sim","os":"Android 4.4.2 (KitKat), upgradable to 6 (Marshmallow), Sense","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_816g_dual_sim","brand":"Htc","name":"HTC Desire 816G dual sim","os":"Android 4.4.2 (KitKat), Sense UI 6","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_820","brand":"Htc","name":"HTC Desire 820","os":"Android 4.4.2 (KitKat), upgradable to 6.1 (Marshmallow), Sen","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_820_dual_sim","brand":"Htc","name":"HTC Desire 820 dual sim","os":"Android 4.4.2 (KitKat), Sense UI 6","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_820q_dual_sim","brand":"Htc","name":"HTC Desire 820q dual sim","os":"Android 4.4.2 (KitKat), Sense UI 6","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_desire_eye","brand":"Htc","name":"HTC Desire Eye","os":"Android 4.4.4 (KitKat), upgradable to 6.1 (Marshmallow), Sen","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_nexus_9","brand":"Htc","name":"HTC Nexus 9","os":"Android 5.0 (Lollipop), upgradable to 7.1.1 (Nougat)","year":2014,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":281,"inches":8.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_e8","brand":"Htc","name":"HTC One (E8)","os":"Android 4.4.2 (KitKat), upgradable to 6.1 (Marshmallow), Sen","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_e8_cdma","brand":"Htc","name":"HTC One (E8) CDMA","os":"Android 4.4.2 (KitKat), Sense UI 6","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_m8_eye","brand":"Htc","name":"HTC One (M8 Eye)","os":"Android 4.4.4 (KitKat), upgradable to 6.1 (Marshmallow), Sen","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_m8","brand":"Htc","name":"HTC One (M8)","os":"Android 4.4.2 (KitKat), upgradable to 6.0 (Marshmallow), Sen","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_m8_cdma","brand":"Htc","name":"HTC One (M8) CDMA","os":"Android 4.4.2 (KitKat), upgradable to 6 (Marshmallow), Sense","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_m8_dual_sim","brand":"Htc","name":"HTC One (M8) dual sim","os":"Android 4.4.2 (KitKat), upgradable to 4.4.4 (KitKat), Sense ","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_m8_for_windows","brand":"Htc","name":"HTC One (M8) for Windows","os":"Microsoft Windows Phone 8.1.1","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_m8_for_windows_cdma","brand":"Htc","name":"HTC One (M8) for Windows (CDMA)","os":"Microsoft Windows Phone 8.1.1","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_m8_prime","brand":"Htc","name":"HTC One M8 Prime","os":"Android 4.4.2 (KitKat), Sense UI","year":2014,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":534,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_mini_2","brand":"Htc","name":"HTC One mini 2","os":"Android 4.4.2 (KitKat), Sense UI","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":326,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"htc_htc_one_remix","brand":"Htc","name":"HTC One Remix","os":"Android 4.4.2 (KitKat), Sense UI","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":326,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_ascend_g535","brand":"Huawei","name":"Huawei Ascend G535","os":"Android 4.3 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":245,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_ascend_g6","brand":"Huawei","name":"Huawei Ascend G6","os":"Android 4.3 (Jelly Bean), EMUI Lite 2","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":245,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_ascend_g6_4g","brand":"Huawei","name":"Huawei Ascend G6 4G","os":"Android 4.3 (Jelly Bean), EMUI Lite 2","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":245,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_ascend_g620s","brand":"Huawei","name":"Huawei Ascend G620s","os":"Android 4.4.2 (KitKat), EMUI 3","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_ascend_g630","brand":"Huawei","name":"Huawei Ascend G630","os":"Android 4.3 (Jelly Bean), EMUI Lite 2","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_ascend_g7","brand":"Huawei","name":"Huawei Ascend G7","os":"Android 4.4.2 (KitKat), upgradable to 6 (Marshmallow), EMUI ","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_ascend_gx1","brand":"Huawei","name":"Huawei Ascend GX1","os":"Android 4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":245,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_ascend_mate2_4g","brand":"Huawei","name":"Huawei Ascend Mate2 4G","os":"Android 4.3 (Jelly Bean), upgradable to 5.1 (Lollipop), EMUI","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":241,"inches":6.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_ascend_mate7","brand":"Huawei","name":"Huawei Ascend Mate7","os":"Android 4.4.2 (KitKat), upgradable to 6.0 (Marshmallow), EMU","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":368,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_ascend_mate7_monarch","brand":"Huawei","name":"Huawei Ascend Mate7 Monarch","os":"Android 4.4 (KitKat), EMUI 3","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":367,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_ascend_p6_s","brand":"Huawei","name":"Huawei Ascend P6 S","os":"Android 4.2.2 (Jelly Bean), upgradable to 4.4.2 (KitKat), EM","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_ascend_p7","brand":"Huawei","name":"Huawei Ascend P7","os":"Android 4.4.2 (KitKat), upgradable to 5.1.1 (Lollipop), EMUI","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_ascend_p7_mini","brand":"Huawei","name":"Huawei Ascend P7 mini","os":"Android 4.3 (Jelly Bean), EMUI Lite 2","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":245,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_ascend_p7_sapphire_edition","brand":"Huawei","name":"Huawei Ascend P7 Sapphire Edition","os":"Android 4.4.2 (KitKat), EMUI 2.3","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_ascend_y221","brand":"Huawei","name":"Huawei Ascend Y221","os":"Android 4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":320,"h":480,"ppi":165,"inches":3.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_ascend_y330","brand":"Huawei","name":"Huawei Ascend Y330","os":"Android 4.2 (Jelly Bean), EMUI Lite 2","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":245,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_ascend_y520","brand":"Huawei","name":"Huawei Ascend Y520","os":"Android 4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_ascend_y530","brand":"Huawei","name":"Huawei Ascend Y530","os":"Android 4.3 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_ascend_y550","brand":"Huawei","name":"Huawei Ascend Y550","os":"Android 4.4.2 (KitKat), EMUI 2.3","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_ascend_y600","brand":"Huawei","name":"Huawei Ascend Y600","os":"Android 4.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_10_link+","brand":"Huawei","name":"Huawei MediaPad 10 Link+","os":"Android 4.2 (Jelly Bean), EMUI 1.6","year":2014,"form":"Tablet","tablet":true,"w":1280,"h":800,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_7_youth2","brand":"Huawei","name":"Huawei MediaPad 7 Youth2","os":"Android 4.3 (Jelly Bean), EMUI 1.6","year":2014,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_m1","brand":"Huawei","name":"Huawei MediaPad M1","os":"Android 4.2.2 (Jelly Bean), EMUI 2","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_t1_8.0","brand":"Huawei","name":"Huawei MediaPad T1 8.0","os":"Android 4.3 (Jelly Bean), EMUI 1.6","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":188,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mediapad_x1","brand":"Huawei","name":"Huawei MediaPad X1","os":"Android 4.2.2 (Jelly Bean), upgradable to 4.4.2 (KitKat), EM","year":2014,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":323,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_mulan","brand":"Huawei","name":"Huawei Mulan","os":"Android 4.4.2 (KitKat), EMUI 2.3","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"huawei_huawei_y300ii","brand":"Huawei","name":"Huawei Y300II","os":"Firefox OS","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a10-70_a7600","brand":"Lenovo","name":"Lenovo A10-70 A7600","os":"Android 4.2.2 (Jelly Bean), upgradable to 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a316i","brand":"Lenovo","name":"Lenovo A316i","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a319","brand":"Lenovo","name":"Lenovo A319","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a328","brand":"Lenovo","name":"Lenovo A328","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a526","brand":"Lenovo","name":"Lenovo A526","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a536","brand":"Lenovo","name":"Lenovo A536","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a606","brand":"Lenovo","name":"Lenovo A606","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a680","brand":"Lenovo","name":"Lenovo A680","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a7-30_a3300","brand":"Lenovo","name":"Lenovo A7-30 A3300","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a7-50_a3500","brand":"Lenovo","name":"Lenovo A7-50 A3500","os":"Android 4.2.2 (Jelly Bean), upgradable to 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":216,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a8-50_a5500","brand":"Lenovo","name":"Lenovo A8-50 A5500","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a850+","brand":"Lenovo","name":"Lenovo A850+","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":200,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a859","brand":"Lenovo","name":"Lenovo A859","os":"Android 4.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a880","brand":"Lenovo","name":"Lenovo A880","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":184,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a889","brand":"Lenovo","name":"Lenovo A889","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":184,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_a916","brand":"Lenovo","name":"Lenovo A916","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_golden_warrior_a8","brand":"Lenovo","name":"Lenovo Golden Warrior A8","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_golden_warrior_note_8","brand":"Lenovo","name":"Lenovo Golden Warrior Note 8","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":245,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_golden_warrior_s8","brand":"Lenovo","name":"Lenovo Golden Warrior S8","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":277,"inches":5.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_k3","brand":"Lenovo","name":"Lenovo K3","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_s580","brand":"Lenovo","name":"Lenovo S580","os":"Android 4.3 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_s660","brand":"Lenovo","name":"Lenovo S660","os":"Android 4.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":234,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_s750","brand":"Lenovo","name":"Lenovo S750","os":"Android 4.2.1 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":245,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_s850","brand":"Lenovo","name":"Lenovo S850","os":"Android 4.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_s856","brand":"Lenovo","name":"Lenovo S856","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_s860","brand":"Lenovo","name":"Lenovo S860","os":"Android 4.2 (Jelly Bean), upgradable to 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":277,"inches":5.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_s90_sisley","brand":"Lenovo","name":"Lenovo S90 Sisley","os":"Android 4.4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_s939","brand":"Lenovo","name":"Lenovo S939","os":"Android 4.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":245,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_tab_s8","brand":"Lenovo","name":"Lenovo Tab S8","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":283,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_vibe_x2","brand":"Lenovo","name":"Lenovo Vibe X2","os":"Android 4.4 (KitKat), upgradable to 5.0 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_vibe_z2","brand":"Lenovo","name":"Lenovo Vibe Z2","os":"Android 4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_vibe_z2_pro","brand":"Lenovo","name":"Lenovo Vibe Z2 Pro","os":"Android 4.4.2 (KitKat), upgradable to 5.0.2 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":490,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_yoga_tablet_10_hd+","brand":"Lenovo","name":"Lenovo Yoga Tablet 10 HD+","os":"Android 4.3 (Jelly Bean), upgradable to 4.4 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_yoga_tablet_2_10.1","brand":"Lenovo","name":"Lenovo Yoga Tablet 2 10.1","os":"Android 4.4.2 (KitKat), upgradable to 5.0 (Lollipop)","year":2014,"form":"Tablet","tablet":true,"w":1920,"h":1200,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_yoga_tablet_2_8.0","brand":"Lenovo","name":"Lenovo Yoga Tablet 2 8.0","os":"Android 4.4.2 (KitKat), upgradable to 5.0 (Lollipop)","year":2014,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":283,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lenovo_lenovo_yoga_tablet_2_pro","brand":"Lenovo","name":"Lenovo Yoga Tablet 2 Pro","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":2560,"h":1440,"ppi":221,"inches":13.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_f60","brand":"Lg","name":"LG F60","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":207,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_f70_d315","brand":"Lg","name":"LG F70 D315","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":207,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g_pad_10.1","brand":"Lg","name":"LG G Pad 10.1","os":"Android 4.4.2 (KitKat), upgradable to 5.0 (Lollipop)","year":2014,"form":"Tablet","tablet":true,"w":1280,"h":800,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g_pad_10.1_lte","brand":"Lg","name":"LG G Pad 10.1 LTE","os":"Android 5.0.2 (Lollipop)","year":2014,"form":"Tablet","tablet":true,"w":1280,"h":800,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g_pad_7.0","brand":"Lg","name":"LG G Pad 7.0","os":"Android 4.4.2 (KitKat), upgradable to 5.0 (Lollipop)","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":216,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g_pad_7.0_lte","brand":"Lg","name":"LG G Pad 7.0 LTE","os":"Android 4.4.2 (KitKat), upgradable to 5.0 (Lollipop)","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":216,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g_pad_8.0","brand":"Lg","name":"LG G Pad 8.0","os":"Android 4.4.2 (KitKat), upgradable to 5.0 (Lollipop)","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g_pad_8.0_lte","brand":"Lg","name":"LG G Pad 8.0 LTE","os":"Android 4.4.2 (KitKat), upgradable to 5.0.2 (Lollipop)","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":188,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g_pad_8.3_lte","brand":"Lg","name":"LG G Pad 8.3 LTE","os":"Android 4.2.2 (Jelly Bean), upgradable to 5.0 (Lollipop)","year":2014,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":273,"inches":8.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g_pro_2","brand":"Lg","name":"LG G Pro 2","os":"Android 4.4.2 (KitKat), upgradable to 5.0.1 (Lollipop), LG O","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":373,"inches":5.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g_vista","brand":"Lg","name":"LG G Vista","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":258,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g_vista_cdma","brand":"Lg","name":"LG G Vista (CDMA)","os":"Android 4.4.2 (KitKat), upgradable to 5.1.1 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":258,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g2_lite","brand":"Lg","name":"LG G2 Lite","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":207,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g2_mini","brand":"Lg","name":"LG G2 mini","os":"Android 4.4.2 (KitKat), LG Optimus UI","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":234,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g2_mini_lte","brand":"Lg","name":"LG G2 mini LTE","os":"Android 4.4.2 (KitKat), upgradable to 5.0.2 (Lollipop), LG O","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":234,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g2_mini_lte_tegra","brand":"Lg","name":"LG G2 mini LTE (Tegra)","os":"Android 4.4.2 (KitKat), LG Optimus UI","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":234,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g3","brand":"Lg","name":"LG G3","os":"Android 4.4.2 (KitKat), upgradable to 6.0 (Marshmallow)","year":2014,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":538,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g3_cdma","brand":"Lg","name":"LG G3 (CDMA)","os":"Android 4.4.2 (KitKat), upgradable to 6.0 (Marshmallow)","year":2014,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":538,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g3_a","brand":"Lg","name":"LG G3 A","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g3_dual-lte","brand":"Lg","name":"LG G3 Dual-LTE","os":"Android 4.4.2 (KitKat), upgradable to 5.0.2 (Lollipop) or v6","year":2014,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":534,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g3_lte-a","brand":"Lg","name":"LG G3 LTE-A","os":"Android 4.4.2 (KitKat), upgradable to 5.0.1 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":534,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g3_s","brand":"Lg","name":"LG G3 S","os":"Android 4.4.2 (KitKat), upgradable to 5.0.2 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g3_s_dual","brand":"Lg","name":"LG G3 S Dual","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g3_screen","brand":"Lg","name":"LG G3 Screen","os":"Android 4.4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":373,"inches":5.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_g3_stylus","brand":"Lg","name":"LG G3 Stylus","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":200,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_l_bello","brand":"Lg","name":"LG L Bello","os":"Android 4.4.2 (KitKat), LG UI 3","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_l_fino","brand":"Lg","name":"LG L Fino","os":"Android 4.4.2 (KitKat), LG UI 3","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":207,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_l_prime","brand":"Lg","name":"LG L Prime","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_l35","brand":"Lg","name":"LG L35","os":"Android OS","year":2014,"form":"Phone","tablet":false,"w":320,"h":480,"ppi":180,"inches":3.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_l40_d160","brand":"Lg","name":"LG L40 D160","os":"Android 4.4.2 (KitKat), LG UI 3","year":2014,"form":"Phone","tablet":false,"w":320,"h":480,"ppi":165,"inches":3.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_l40_dual_d170","brand":"Lg","name":"LG L40 Dual D170","os":"Android 4.4.2 (KitKat), LG UI 3","year":2014,"form":"Phone","tablet":false,"w":320,"h":480,"ppi":165,"inches":3.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_l45_dual_x132","brand":"Lg","name":"LG L45 Dual X132","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":320,"h":480,"ppi":165,"inches":3.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_l50","brand":"Lg","name":"LG L50","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_l60","brand":"Lg","name":"LG L60","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":217,"inches":4.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_l60_dual","brand":"Lg","name":"LG L60 Dual","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":217,"inches":4.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_l65_d280","brand":"Lg","name":"LG L65 D280","os":"Android 4.4.2 (KitKat), LG UI 3","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":217,"inches":4.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_l65_dual_d285","brand":"Lg","name":"LG L65 Dual D285","os":"Android 4.4.2 (KitKat), LG UI 3","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":217,"inches":4.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_l70_d320n","brand":"Lg","name":"LG L70 D320N","os":"Android 4.4.2 (KitKat), LG UI 3","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":207,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_l70_dual_d325","brand":"Lg","name":"LG L70 Dual D325","os":"Android 4.4.2 (KitKat), LG UI 3","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":207,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_l80","brand":"Lg","name":"LG L80","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":187,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_l80_dual","brand":"Lg","name":"LG L80 Dual","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":187,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_l90_d405","brand":"Lg","name":"LG L90 D405","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":234,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_l90_dual_d410","brand":"Lg","name":"LG L90 Dual D410","os":"Android 4.4.2 (KitKat), upgradable to 5.0.2 (Lollipop), LG O","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":234,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_lucid_3_vs876","brand":"Lg","name":"LG Lucid 3 VS876","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":234,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_optimus_f3q","brand":"Lg","name":"LG Optimus F3Q","os":"Android 4.1.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_tribute","brand":"Lg","name":"LG Tribute","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":207,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"lg_lg_volt","brand":"Lg","name":"LG Volt","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":234,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_m1_note","brand":"Meizu","name":"Meizu M1 Note","os":"Android 4.4.4 (KitKat), Flyme 4","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_mx4","brand":"Meizu","name":"Meizu MX4","os":"Android 4.4.4 (KitKat), Flyme 4","year":2014,"form":"Phone","tablet":false,"w":1152,"h":1920,"ppi":418,"inches":5.36,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"meizu_meizu_mx4_pro","brand":"Meizu","name":"Meizu MX4 Pro","os":"Android 4.4.4 (KitKat), Flyme 4","year":2014,"form":"Phone","tablet":false,"w":1536,"h":2560,"ppi":546,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a089_bolt","brand":"Micromax","name":"Micromax A089 Bolt","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a092_unite","brand":"Micromax","name":"Micromax A092 Unite","os":"Android 4.3 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a093_canvas_fire","brand":"Micromax","name":"Micromax A093 Canvas Fire","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a102_canvas_doodle_3","brand":"Micromax","name":"Micromax A102 Canvas Doodle 3","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":163,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a104_canvas_fire_2","brand":"Micromax","name":"Micromax A104 Canvas Fire 2","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a105_canvas_entice","brand":"Micromax","name":"Micromax A105 Canvas Entice","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":187,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a106_unite_2","brand":"Micromax","name":"Micromax A106 Unite 2","os":"Android 4.4.2 (KitKat), upgradable to 5.0 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":199,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a108_canvas_l","brand":"Micromax","name":"Micromax A108 Canvas L","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":200,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a109_canvas_xl2","brand":"Micromax","name":"Micromax A109 Canvas XL2","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":200,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a114r_canvas_beat","brand":"Micromax","name":"Micromax A114R Canvas Beat","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a119_canvas_xl","brand":"Micromax","name":"Micromax A119 Canvas XL","os":"Android 4.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":184,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a120_canvas_2_colors","brand":"Micromax","name":"Micromax A120 Canvas 2 Colors","os":"Android 4.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a121_canvas_elanza_2","brand":"Micromax","name":"Micromax A121 Canvas Elanza 2","os":"Android 4.3 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a190_canvas_hd_plus","brand":"Micromax","name":"Micromax A190 Canvas HD Plus","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a28_bolt","brand":"Micromax","name":"Micromax A28 Bolt","os":"Android 2.3 (Gingerbread)","year":2014,"form":"Phone","tablet":false,"w":320,"h":480,"ppi":165,"inches":3.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a290_canvas_knight_cameo","brand":"Micromax","name":"Micromax A290 Canvas Knight Cameo","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a300_canvas_gold","brand":"Micromax","name":"Micromax A300 Canvas Gold","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a310_canvas_nitro","brand":"Micromax","name":"Micromax A310 Canvas Nitro","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a350_canvas_knight","brand":"Micromax","name":"Micromax A350 Canvas Knight","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a36_bolt","brand":"Micromax","name":"Micromax A36 Bolt","os":"Android 2.3 (Gingerbread)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a47_bolt","brand":"Micromax","name":"Micromax A47 Bolt","os":"Android 4.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a59_bolt","brand":"Micromax","name":"Micromax A59 Bolt","os":"Android 4.1.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":320,"h":480,"ppi":165,"inches":3.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a65_bolt","brand":"Micromax","name":"Micromax A65 Bolt","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a94_canvas_mad","brand":"Micromax","name":"Micromax A94 Canvas MAd","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_a99_canvas_xpress","brand":"Micromax","name":"Micromax A99 Canvas Xpress","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bolt_a066","brand":"Micromax","name":"Micromax Bolt A066","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":320,"h":480,"ppi":165,"inches":3.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_bolt_a067","brand":"Micromax","name":"Micromax Bolt A067","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_4_plus_a315","brand":"Micromax","name":"Micromax Canvas 4 Plus A315","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_a1","brand":"Micromax","name":"Micromax Canvas A1","os":"Android 4.4.4 (KitKat), upgradable to 5.1 (Lollipop), Androi","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_selfie_a255","brand":"Micromax","name":"Micromax Canvas Selfie A255","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_turbo_mini","brand":"Micromax","name":"Micromax Canvas Turbo Mini","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_win_w092","brand":"Micromax","name":"Micromax Canvas Win W092","os":"Microsoft Windows Phone 8.1","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"micromax_micromax_canvas_win_w121","brand":"Micromax","name":"Micromax Canvas Win W121","os":"Microsoft Windows Phone 8.1","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_lumia_535","brand":"Microsoft","name":"Microsoft Lumia 535","os":"Microsoft Windows Phone 8.1, upgradable to Microsoft Windows","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"microsoft_microsoft_lumia_535_dual_sim","brand":"Microsoft","name":"Microsoft Lumia 535 Dual SIM","os":"Microsoft Windows Phone 8.1","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_droid_turbo","brand":"Motorola","name":"Motorola DROID Turbo","os":"Android 4.4.4 (KitKat), upgradable to 6.0 (Marshmallow)","year":2014,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":565,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_luge","brand":"Motorola","name":"Motorola Luge","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":256,"inches":4.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e","brand":"Motorola","name":"Motorola Moto E","os":"Android 4.4.2 (KitKat), upgradable to 5.1 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":256,"inches":4.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_e_dual_sim","brand":"Motorola","name":"Motorola Moto E Dual SIM","os":"Android 4.4.2 (KitKat), upgradable to 5.1 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":256,"inches":4.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_2nd_gen","brand":"Motorola","name":"Motorola Moto G (2nd gen)","os":"Android 4.4.4 (KitKat), upgradable to 6.0 (Marshmallow)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_4g","brand":"Motorola","name":"Motorola Moto G 4G","os":"Android 4.4.2 (KitKat), upgradable to 5.1.1 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":329,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_dual_sim","brand":"Motorola","name":"Motorola Moto G Dual SIM","os":"Android 4.4.2 (KitKat), upgradable to 5.1.1 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":326,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_g_dual_sim_2nd_gen","brand":"Motorola","name":"Motorola Moto G Dual SIM (2nd gen)","os":"Android 4.4.4 (KitKat), upgradable to Android L","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_maxx","brand":"Motorola","name":"Motorola Moto Maxx","os":"Android 4.4.4 (KitKat), upgradable to 6.0.1 (Marshmallow)","year":2014,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":565,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_moto_x_2nd_gen","brand":"Motorola","name":"Motorola Moto X (2nd Gen)","os":"Android 4.4.4 (KitKat), upgradable to 6.0 (Marshmallow)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"motorola_motorola_nexus_6","brand":"Motorola","name":"Motorola Nexus 6","os":"Android 5.0 (Lollipop), upgradable to 7.1.1 (Nougat)","year":2014,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":493,"inches":5.96,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_lumia_530","brand":"Nokia","name":"Nokia Lumia 530","os":"Microsoft Windows Phone 8.1","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":245,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_lumia_530_dual_sim","brand":"Nokia","name":"Nokia Lumia 530 Dual SIM","os":"Microsoft Windows Phone 8.1","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":245,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_lumia_630","brand":"Nokia","name":"Nokia Lumia 630","os":"Microsoft Windows Phone 8.1","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":221,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_lumia_630_dual_sim","brand":"Nokia","name":"Nokia Lumia 630 Dual SIM","os":"Microsoft Windows Phone 8.1","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":221,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_lumia_635","brand":"Nokia","name":"Nokia Lumia 635","os":"Microsoft Windows Phone 8.1","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":221,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_lumia_638","brand":"Nokia","name":"Nokia Lumia 638","os":"Microsoft Windows Phone 8.1","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_lumia_730_dual_sim","brand":"Nokia","name":"Nokia Lumia 730 Dual SIM","os":"Microsoft Windows Phone 8.1, upgradable to Microsoft Windows","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":316,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_lumia_735","brand":"Nokia","name":"Nokia Lumia 735","os":"Microsoft Windows Phone 8.1, upgradable to Microsoft Windows","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_lumia_830","brand":"Nokia","name":"Nokia Lumia 830","os":"Microsoft Windows Phone 8.1, upgradable to Microsoft Windows","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_lumia_930","brand":"Nokia","name":"Nokia Lumia 930","os":"Microsoft Windows Phone 8.1, upgradable to Windows 10","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_lumia_icon","brand":"Nokia","name":"Nokia Lumia Icon","os":"Microsoft Windows Phone 8, upgradable to Microsoft Windows 1","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_n1","brand":"Nokia","name":"Nokia N1","os":"Android 5.0 (Lollipop), upgradable to 5.1.1 (Lollipop)","year":2014,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":324,"inches":7.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_x","brand":"Nokia","name":"Nokia X","os":"Android 4.1.2 (Jelly Bean), X platform 1.1","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_x+","brand":"Nokia","name":"Nokia X+","os":"Android 4.1.2 (Jelly Bean), X platform 1","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_x2_dual_sim","brand":"Nokia","name":"Nokia X2 Dual SIM","os":"Android 4.3 (Jelly Bean), X platform 2","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":217,"inches":4.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"nokia_nokia_xl","brand":"Nokia","name":"Nokia XL","os":"Android 4.1.2 (Jelly Bean), X platform 1","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":187,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oneplus_oneplus_one","brand":"Oneplus","name":"OnePlus One","os":"Android 4.4.2 (KitKat), upgradable to 6.0.1 (Marshmallow)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_5_mini","brand":"Oppo","name":"Oppo Find 5 Mini","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":234,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_find_7a","brand":"Oppo","name":"Oppo Find 7a","os":"Android 4.3 (Jelly Bean), ColorOS","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_n1_mini","brand":"Oppo","name":"Oppo N1 mini","os":"Android 4.3 (Jelly Bean), ColorOS 1.4","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_n3","brand":"Oppo","name":"Oppo N3","os":"Android 4.4.4 (KitKat), ColorOS 2","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_neo","brand":"Oppo","name":"Oppo Neo","os":"Android 4.2.1 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":207,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_neo_3","brand":"Oppo","name":"Oppo Neo 3","os":"Android 4.2.1 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_neo_5","brand":"Oppo","name":"Oppo Neo 5","os":"Android 4.3 (Jelly Bean), ColorOS 1.4","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_r1001_joy","brand":"Oppo","name":"Oppo R1001 Joy","os":"Android 4.2.1 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_r1s","brand":"Oppo","name":"Oppo R1S","os":"Android 4.3 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_r2001_yoyo","brand":"Oppo","name":"Oppo R2001 Yoyo","os":"Android 4.2.1 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":234,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_r3","brand":"Oppo","name":"Oppo R3","os":"Android 4.3 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"oppo_oppo_r5","brand":"Oppo","name":"Oppo R5","os":"Android 4.4.4 (KitKat), ColorOS 2","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":423,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_ativ_se","brand":"Samsung","name":"Samsung ATIV SE","os":"Microsoft Windows Phone 8, upgradable to 8.1","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_g3812b_galaxy_s3_slim","brand":"Samsung","name":"Samsung G3812B Galaxy S3 Slim","os":"Android 4.2 (Jelly Bean), TouchWiz UI","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":244,"inches":4.52,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a3","brand":"Samsung","name":"Samsung Galaxy A3","os":"Android 4.4.4 (KitKat), upgradable to 6.0.1 (Marshmallow)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":245,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a3_duos","brand":"Samsung","name":"Samsung Galaxy A3 Duos","os":"Android 4.4.4 (KitKat), upgradable to 5.0.2 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":245,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a5","brand":"Samsung","name":"Samsung Galaxy A5","os":"Android 4.4.4 (KitKat), upgradable to 7.0 (Nougat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_a5_duos","brand":"Samsung","name":"Samsung Galaxy A5 Duos","os":"Android 4.4.4 (KitKat), upgradable to 5.0.2 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_ace_4","brand":"Samsung","name":"Samsung Galaxy Ace 4","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_ace_4_lte_g313","brand":"Samsung","name":"Samsung Galaxy Ace 4 LTE G313","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_ace_nxt","brand":"Samsung","name":"Samsung Galaxy Ace NXT","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_ace_style","brand":"Samsung","name":"Samsung Galaxy Ace Style","os":"Android 4.4.2 (KitKat), TouchWiz Essence UI","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_ace_style_lte_g357","brand":"Samsung","name":"Samsung Galaxy Ace Style LTE G357","os":"Android 4.4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":217,"inches":4.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_alpha","brand":"Samsung","name":"Samsung Galaxy Alpha","os":"Android 4.4.4 (KitKat), upgradable to 5.0.2 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_alpha_s801","brand":"Samsung","name":"Samsung Galaxy Alpha (S801)","os":"Android 4.4.4 (KitKat), upgradable to 5.0 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_avant","brand":"Samsung","name":"Samsung Galaxy Avant","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":245,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_beam2","brand":"Samsung","name":"Samsung Galaxy Beam2","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":200,"inches":4.66,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_camera_2_gc200","brand":"Samsung","name":"Samsung Galaxy Camera 2 GC200","os":"Android 4.3 (Jelly Bean), TouchWiz UI","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":306,"inches":4.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_core_ii","brand":"Samsung","name":"Samsung Galaxy Core II","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":207,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_core_lite_lte","brand":"Samsung","name":"Samsung Galaxy Core Lite LTE","os":"Android 4.3 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":199,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_core_lte","brand":"Samsung","name":"Samsung Galaxy Core LTE","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":245,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_core_lte_g386w","brand":"Samsung","name":"Samsung Galaxy Core LTE G386W","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":245,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_core_prime","brand":"Samsung","name":"Samsung Galaxy Core Prime","os":"Android 4.4.4 (KitKat), upgradable to 5.1.1 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":207,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_grand_neo","brand":"Samsung","name":"Samsung Galaxy Grand Neo","os":"Android 4.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":186,"inches":5.01,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_grand_prime","brand":"Samsung","name":"Samsung Galaxy Grand Prime","os":"Android 4.4.4 (KitKat), upgradable to 5.0.2/5.1.1 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_grand_prime_duos_tv","brand":"Samsung","name":"Samsung Galaxy Grand Prime Duos TV","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":220,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_k_zoom","brand":"Samsung","name":"Samsung Galaxy K zoom","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":306,"inches":4.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_mega_2","brand":"Samsung","name":"Samsung Galaxy Mega 2","os":"Android 4.4.3 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":245,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note_3_neo","brand":"Samsung","name":"Samsung Galaxy Note 3 Neo","os":"Android 4.3 (Jelly Bean), upgradable to 5.1.1 (Lollipop), To","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note_3_neo_duos","brand":"Samsung","name":"Samsung Galaxy Note 3 Neo Duos","os":"Android 4.3 (Jelly Bean), TouchWiz UI","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note_4","brand":"Samsung","name":"Samsung Galaxy Note 4","os":"Android 4.4.4 (KitKat), upgradable to 6.0.1 (Marshmallow)","year":2014,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":518,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note_4_usa","brand":"Samsung","name":"Samsung Galaxy Note 4 (USA)","os":"Android 4.4.4 (KitKat), upgradable to 6.0.1 (Marshmallow)","year":2014,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":518,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note_4_duos","brand":"Samsung","name":"Samsung Galaxy Note 4 Duos","os":"Android 4.4.4 (KitKat), upgradable to 6.0.1 (Marshmallow)","year":2014,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":515,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note_edge","brand":"Samsung","name":"Samsung Galaxy Note Edge","os":"Android 4.4.4 (KitKat), upgradable to 6.0 (Marshmallow)","year":2014,"form":"Phone","tablet":false,"w":1600,"h":2560,"ppi":524,"inches":5.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note_pro_12.2","brand":"Samsung","name":"Samsung Galaxy Note Pro 12.2","os":"Android 4.4 (KitKat), TouchWiz UI","year":2014,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":247,"inches":12.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note_pro_12.2_3g","brand":"Samsung","name":"Samsung Galaxy Note Pro 12.2 3G","os":"Android 4.4 (KitKat), TouchWiz UI","year":2014,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":247,"inches":12.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_note_pro_12.2_lte","brand":"Samsung","name":"Samsung Galaxy Note Pro 12.2 LTE","os":"Android 4.4 (KitKat), upgradable to 5.0.2 (Lollipop), TouchW","year":2014,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":247,"inches":12.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s_duos_3","brand":"Samsung","name":"Samsung Galaxy S Duos 3","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s5","brand":"Samsung","name":"Samsung Galaxy S5","os":"Android 4.4.2 (KitKat), upgradable to 6.0 (Marshmallow), Tou","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":432,"inches":5.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s5_octa-core","brand":"Samsung","name":"Samsung Galaxy S5 (octa-core)","os":"Android 4.4.2 (KitKat), upgradable to 6.0.1 (Marshmallow), T","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":432,"inches":5.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s5_usa","brand":"Samsung","name":"Samsung Galaxy S5 (USA)","os":"Android 4.4.2 (KitKat), upgradable to 5.0.1 (Lollipop), Touc","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":432,"inches":5.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s5_active","brand":"Samsung","name":"Samsung Galaxy S5 Active","os":"Android 4.4.2 (KitKat), upgradable to 6.0.1 (Marshmallow), T","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":432,"inches":5.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s5_duos","brand":"Samsung","name":"Samsung Galaxy S5 Duos","os":"Android 4.4.2 (KitKat), TouchWiz UI","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":432,"inches":5.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s5_lte-a_g901f","brand":"Samsung","name":"Samsung Galaxy S5 LTE-A G901F","os":"Android 4.4.2 (KitKat), TouchWiz UI","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":432,"inches":5.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s5_lte-a_g906s","brand":"Samsung","name":"Samsung Galaxy S5 LTE-A G906S","os":"Android 4.4.2 (KitKat), upgradable to 6.0.1 (Marshmallow), T","year":2014,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":577,"inches":5.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s5_mini","brand":"Samsung","name":"Samsung Galaxy S5 mini","os":"Android 4.4.2 (KitKat), upgradable to 5.1.1 (Lollipop), Touc","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":326,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s5_mini_duos","brand":"Samsung","name":"Samsung Galaxy S5 mini Duos","os":"Android 4.4.4 (KitKat), upgradable to 6.0.1 (Marshmallow), T","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":326,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s5_plus","brand":"Samsung","name":"Samsung Galaxy S5 Plus","os":"Android 4.4.2 (KitKat), TouchWiz UI","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":432,"inches":5.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_s5_sport","brand":"Samsung","name":"Samsung Galaxy S5 Sport","os":"Android 4.4.2 (KitKat), upgradable to 6.0 (Marshmallow), Tou","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":432,"inches":5.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_star_2","brand":"Samsung","name":"Samsung Galaxy Star 2","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":320,"h":480,"ppi":165,"inches":3.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_star_2_plus","brand":"Samsung","name":"Samsung Galaxy Star 2 Plus","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":217,"inches":4.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_3_lite_7.0","brand":"Samsung","name":"Samsung Galaxy Tab 3 Lite 7.0","os":"Android 4.2 (Jelly Bean)","year":2014,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_3_lite_7.0_3g","brand":"Samsung","name":"Samsung Galaxy Tab 3 Lite 7.0 3G","os":"Android 4.2 (Jelly Bean)","year":2014,"form":"Tablet","tablet":true,"w":600,"h":1024,"ppi":170,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_4_10.1","brand":"Samsung","name":"Samsung Galaxy Tab 4 10.1","os":"Android 4.4.2 (KitKat), TouchWiz UX UI","year":2014,"form":"Tablet","tablet":true,"w":1280,"h":800,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_4_10.1_3g","brand":"Samsung","name":"Samsung Galaxy Tab 4 10.1 3G","os":"Android 4.4.2 (KitKat), upgradable to 5.0.2 (Lollipop), Touc","year":2014,"form":"Tablet","tablet":true,"w":1280,"h":800,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_4_10.1_lte","brand":"Samsung","name":"Samsung Galaxy Tab 4 10.1 LTE","os":"Android 4.4.2 (KitKat), TouchWiz UX UI","year":2014,"form":"Tablet","tablet":true,"w":1280,"h":800,"ppi":149,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_4_7.0","brand":"Samsung","name":"Samsung Galaxy Tab 4 7.0","os":"Android 4.4.2 (KitKat), TouchWiz UX UI","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":216,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_4_7.0_3g","brand":"Samsung","name":"Samsung Galaxy Tab 4 7.0 3G","os":"Android 4.4.2 (KitKat), TouchWiz UI","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":216,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_4_7.0_lte","brand":"Samsung","name":"Samsung Galaxy Tab 4 7.0 LTE","os":"Android 4.4.2 (KitKat), TouchWiz UX UI","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":216,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_4_8.0","brand":"Samsung","name":"Samsung Galaxy Tab 4 8.0","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_4_8.0_3g","brand":"Samsung","name":"Samsung Galaxy Tab 4 8.0 3G","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_4_8.0_lte","brand":"Samsung","name":"Samsung Galaxy Tab 4 8.0 LTE","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_active","brand":"Samsung","name":"Samsung Galaxy Tab Active","os":"Android 4.4.2 (KitKat), upgradable to Android 5.1.1, TouchWi","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_active_lte","brand":"Samsung","name":"Samsung Galaxy Tab Active LTE","os":"Android 4.4.2 (KitKat), TouchWiz UI","year":2014,"form":"Tablet","tablet":true,"w":800,"h":1280,"ppi":189,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_pro_10.1","brand":"Samsung","name":"Samsung Galaxy Tab Pro 10.1","os":"Android 4.4 (KitKat), TouchWiz UI","year":2014,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":299,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_pro_10.1_lte","brand":"Samsung","name":"Samsung Galaxy Tab Pro 10.1 LTE","os":"Android 4.4 (KitKat), TouchWiz UI","year":2014,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":299,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_pro_12.2","brand":"Samsung","name":"Samsung Galaxy Tab Pro 12.2","os":"Android 4.4.2 (KitKat), upgradable to 5.1.1 (Lollipop), Touc","year":2014,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":247,"inches":12.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_pro_12.2_3g","brand":"Samsung","name":"Samsung Galaxy Tab Pro 12.2 3G","os":"Android 4.4 (KitKat), TouchWiz UI","year":2014,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":247,"inches":12.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_pro_12.2_lte","brand":"Samsung","name":"Samsung Galaxy Tab Pro 12.2 LTE","os":"Android 4.4 (KitKat), TouchWiz UI","year":2014,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":247,"inches":12.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_pro_8.4","brand":"Samsung","name":"Samsung Galaxy Tab Pro 8.4","os":"Android 4.4 (KitKat), TouchWiz UI","year":2014,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":359,"inches":8.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_pro_8.4_3g_lte","brand":"Samsung","name":"Samsung Galaxy Tab Pro 8.4 3G/LTE","os":"Android 4.4 (KitKat), TouchWiz UI","year":2014,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":359,"inches":8.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s_10.5","brand":"Samsung","name":"Samsung Galaxy Tab S 10.5","os":"Android 4.4.2 (KitKat), upgradable to 6.0.1 (Marshmallow), T","year":2014,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":288,"inches":10.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s_10.5_lte","brand":"Samsung","name":"Samsung Galaxy Tab S 10.5 LTE","os":"Android 4.4.2 (KitKat), upgradable to 6.0 (Marshmallow), Tou","year":2014,"form":"Tablet","tablet":true,"w":2560,"h":1600,"ppi":288,"inches":10.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s_8.4","brand":"Samsung","name":"Samsung Galaxy Tab S 8.4","os":"Android 4.4.2 (KitKat), upgradable to 6.0 (Marshmallow), Tou","year":2014,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":359,"inches":8.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_tab_s_8.4_lte","brand":"Samsung","name":"Samsung Galaxy Tab S 8.4 LTE","os":"Android 4.4.2 (KitKat), upgradable to 6.0 (Marshmallow), Tou","year":2014,"form":"Tablet","tablet":true,"w":1600,"h":2560,"ppi":359,"inches":8.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_v","brand":"Samsung","name":"Samsung Galaxy V","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_w","brand":"Samsung","name":"Samsung Galaxy W","os":"Android 4.3 (Jelly Bean)","year":2014,"form":"Tablet","tablet":true,"w":720,"h":1280,"ppi":210,"inches":7.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_galaxy_young_2","brand":"Samsung","name":"Samsung Galaxy Young 2","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":320,"h":480,"ppi":165,"inches":3.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_gear_s","brand":"Samsung","name":"Samsung Gear S","os":"Tizen OS","year":2014,"form":"Phone","tablet":false,"w":360,"h":480,"ppi":300,"inches":2.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_i8200_galaxy_s_iii_mini_ve","brand":"Samsung","name":"Samsung I8200 Galaxy S III mini VE","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_i9300i_galaxy_s3_neo","brand":"Samsung","name":"Samsung I9300I Galaxy S3 Neo","os":"Android 4.3 (Jelly Bean), upgradable to 4.4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":306,"inches":4.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_i9301i_galaxy_s3_neo","brand":"Samsung","name":"Samsung I9301I Galaxy S3 Neo","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":306,"inches":4.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"samsung_samsung_z","brand":"Samsung","name":"Samsung Z","os":"Tizen 2.2.1","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":306,"inches":4.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sharp_sharp_aquos_crystal","brand":"Sharp","name":"Sharp Aquos Crystal","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_d_2403","brand":"Sony","name":"Sony D 2403","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":250,"inches":4.4,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_c3","brand":"Sony","name":"Sony Xperia C3","os":"Android 4.4.2 (KitKat), upgradable to 5.1 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_c3_dual","brand":"Sony","name":"Sony Xperia C3 Dual","os":"Android 4.4.2 (KitKat), upgradable to 5.1 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_e1","brand":"Sony","name":"Sony Xperia E1","os":"Android 4.3 (Jelly Bean), upgradable to 4.4.2 (KitKat), Time","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_e1_dual","brand":"Sony","name":"Sony Xperia E1 dual","os":"Android 4.3 (Jelly Bean), upgradable to 4.4.2 (KitKat), Time","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_e3","brand":"Sony","name":"Sony Xperia E3","os":"Android 4.4.2 (KitKat), upgradable to Android 4.4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_e3_dual","brand":"Sony","name":"Sony Xperia E3 Dual","os":"Android 4.4.2 (KitKat), upgradable to Android 4.4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_m2","brand":"Sony","name":"Sony Xperia M2","os":"Android 4.3 (Jelly Bean), upgradable to 5.1 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":229,"inches":4.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_m2_aqua","brand":"Sony","name":"Sony Xperia M2 Aqua","os":"Android 4.4.2 (KitKat), upgradable to 5.1.1 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":229,"inches":4.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_m2_dual","brand":"Sony","name":"Sony Xperia M2 dual","os":"Android 4.3 (Jelly Bean), upgradable to 5.1 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":229,"inches":4.8,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_t2_ultra","brand":"Sony","name":"Sony Xperia T2 Ultra","os":"Android 4.3 (Jelly Bean), upgradable to 5.1 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":245,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_t2_ultra_dual","brand":"Sony","name":"Sony Xperia T2 Ultra dual","os":"Android 4.3 (Jelly Bean), upgradable to 5.1.1 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":245,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_t3","brand":"Sony","name":"Sony Xperia T3","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":277,"inches":5.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z1_compact","brand":"Sony","name":"Sony Xperia Z1 Compact","os":"Android 4.3 (Jelly Bean), upgradable to 5.1 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":342,"inches":4.3,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z1s","brand":"Sony","name":"Sony Xperia Z1s","os":"Android 4.3 (Jelly Bean), upgradable to 5.1 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z2","brand":"Sony","name":"Sony Xperia Z2","os":"Android 4.4.2 (KitKat), upgradable to 6.0 (Marshmallow)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z2_tablet_lte","brand":"Sony","name":"Sony Xperia Z2 Tablet LTE","os":"Android 4.4.2 (KitKat), upgradable to 5.1.1 (Lollipop)","year":2014,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z2_tablet_wi-fi","brand":"Sony","name":"Sony Xperia Z2 Tablet Wi-Fi","os":"Android 4.4.2 (KitKat), upgradable to 6.0 (Marshmallow)","year":2014,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":224,"inches":10.1,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z2a","brand":"Sony","name":"Sony Xperia Z2a","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z3","brand":"Sony","name":"Sony Xperia Z3","os":"Android 4.4.4 (KitKat), upgradable to 6.0 (Marshmallow)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z3_compact","brand":"Sony","name":"Sony Xperia Z3 Compact","os":"Android 4.4.4 (KitKat), upgradable to 6.0 (Marshmallow)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":319,"inches":4.6,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z3_dual","brand":"Sony","name":"Sony Xperia Z3 Dual","os":"Android 4.4.4 (KitKat), upgradable to 6.0 (Marshmallow)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z3_tablet_compact","brand":"Sony","name":"Sony Xperia Z3 Tablet Compact","os":"Android 4.4.2 (KitKat), upgradable to 6.0 (Marshmallow)","year":2014,"form":"Tablet","tablet":true,"w":1200,"h":1920,"ppi":283,"inches":8.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"sony_sony_xperia_z3v","brand":"Sony","name":"Sony Xperia Z3v","os":"Android 4.4.4 (KitKat), upgradable to 5.1.1 (Lollipop)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x3s","brand":"Vivo","name":"vivo X3S","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x5","brand":"Vivo","name":"vivo X5","os":"Android 4.4.2 (KitKat), Funtouch 2","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_x5max","brand":"Vivo","name":"vivo X5Max","os":"Android 4.4.4 (KitKat), Funtouch 2","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_xshot","brand":"Vivo","name":"vivo Xshot","os":"Android 4.3 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":424,"inches":5.2,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y11","brand":"Vivo","name":"vivo Y11","os":"Android 4.4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y27_2014","brand":"Vivo","name":"vivo Y27 (2014)","os":"Android 4.4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"vivo_vivo_y28_2014","brand":"Vivo","name":"vivo Y28 (2014)","os":"Android 4.2.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":216,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_4","brand":"Xiaomi","name":"Xiaomi Mi 4","os":"Android 4.4.3 (KitKat), upgradable to 6.0.1 (Marshmallow), M","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_4_lte","brand":"Xiaomi","name":"Xiaomi Mi 4 LTE","os":"Android 4.4.3 (KitKat), MIUI 5","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_mi_pad_7.9","brand":"Xiaomi","name":"Xiaomi Mi Pad 7.9","os":"Android 4.4.4 (KitKat), MIUI 7","year":2014,"form":"Tablet","tablet":true,"w":1536,"h":2048,"ppi":326,"inches":7.9,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":24,"safeBottom":24,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_1s","brand":"Xiaomi","name":"Xiaomi Redmi 1S","os":"Android 4.3 (Jelly Bean), upgradable to 4.4.4 (KitKat), MIUI","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note","brand":"Xiaomi","name":"Xiaomi Redmi Note","os":"Android 4.2 (Jelly Bean), upgradable to 4.4.4 (KitKat), MIUI","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"xiaomi_xiaomi_redmi_note_4g","brand":"Xiaomi","name":"Xiaomi Redmi Note 4G","os":"Android 4.2 (Jelly Bean), upgradable to 4.4.2 (KitKat), MIUI","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":267,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_l2","brand":"Zte","name":"ZTE Blade L2","os":"Android 4.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":196,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_vec_3g","brand":"Zte","name":"ZTE Blade Vec 3G","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_blade_vec_4g","brand":"Zte","name":"ZTE Blade Vec 4G","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_grand_memo_ii_lte","brand":"Zte","name":"ZTE Grand Memo II LTE","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":245,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_grand_s_ii","brand":"Zte","name":"ZTE Grand S II","os":"Android 4.2 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_grand_s_ii_s291","brand":"Zte","name":"ZTE Grand S II S291","os":"Android 4.3 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":401,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_grand_s_pro","brand":"Zte","name":"ZTE Grand S Pro","os":"Android 4.3 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_grand_x_plus_z826","brand":"Zte","name":"ZTE Grand X Plus Z826","os":"Android 4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_grand_xmax","brand":"Zte","name":"ZTE Grand Xmax","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":245,"inches":6.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_iconic_phablet","brand":"Zte","name":"ZTE Iconic Phablet","os":"Android 4.3 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":258,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_kis_3","brand":"Zte","name":"ZTE Kis 3","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_kis_3_max","brand":"Zte","name":"ZTE Kis 3 Max","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":480,"h":854,"ppi":218,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_x6","brand":"Zte","name":"ZTE nubia X6","os":"Android 4.3 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":342,"inches":6.44,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z5s_mini_nx405h","brand":"Zte","name":"ZTE nubia Z5S mini NX405H","os":"Android 4.3 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":312,"inches":4.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z7","brand":"Zte","name":"ZTE nubia Z7","os":"Android 4.4.2 (KitKat), nubia UI 2","year":2014,"form":"Phone","tablet":false,"w":1440,"h":2560,"ppi":538,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z7_max","brand":"Zte","name":"ZTE nubia Z7 Max","os":"Android 4.4.2 (KitKat), nubia UI 2","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":403,"inches":5.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_nubia_z7_mini","brand":"Zte","name":"ZTE nubia Z7 mini","os":"Android 4.4.2 (KitKat), nubia UI 2","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":445,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_open_c","brand":"Zte","name":"ZTE Open C","os":"Firefox OS 1.3","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_open_ii","brand":"Zte","name":"ZTE Open II","os":"Firefox OS 1.3","year":2014,"form":"Phone","tablet":false,"w":320,"h":480,"ppi":165,"inches":3.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_redbull_v5_v9180","brand":"Zte","name":"ZTE Redbull V5 V9180","os":"Android 4.3 (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":294,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_sonata_4g","brand":"Zte","name":"ZTE Sonata 4G","os":"Android (Jelly Bean)","year":2014,"form":"Phone","tablet":false,"w":480,"h":800,"ppi":233,"inches":4.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_speed","brand":"Zte","name":"ZTE Speed","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":540,"h":960,"ppi":245,"inches":4.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_star_1","brand":"Zte","name":"ZTE Star 1","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_star_2","brand":"Zte","name":"ZTE Star 2","os":"Android 4.4 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":1080,"h":1920,"ppi":441,"inches":5.0,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_zinger","brand":"Zte","name":"ZTE Zinger","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":320,"h":480,"ppi":165,"inches":3.5,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}},{"id":"zte_zte_zmax","brand":"Zte","name":"ZTE Zmax","os":"Android 4.4.2 (KitKat)","year":2014,"form":"Phone","tablet":false,"w":720,"h":1280,"ppi":258,"inches":5.7,"platform":"and","hasNotch":false,"hasIsland":false,"hasHole":false,"hasHome":false,"safeTop":20,"safeBottom":0,"fonts":{"system":"Roboto","prop":"Roboto","mono":"Roboto Mono","small":12,"medium":14,"large":20}}]} \ No newline at end of file diff --git a/scripts/skindesigner/tools/devicedb/.gitignore b/scripts/skindesigner/tools/devicedb/.gitignore new file mode 100644 index 0000000000..1daada9ece --- /dev/null +++ b/scripts/skindesigner/tools/devicedb/.gitignore @@ -0,0 +1,3 @@ +# Local HTML cache from build_devices_json.py — never commit, it's just a +# CI/disk-speed optimisation. +cache/ diff --git a/scripts/skindesigner/tools/devicedb/README.md b/scripts/skindesigner/tools/devicedb/README.md new file mode 100644 index 0000000000..d38bb46620 --- /dev/null +++ b/scripts/skindesigner/tools/devicedb/README.md @@ -0,0 +1,102 @@ +# Skin Designer device database + +`devices.json` (bundled at `common/src/main/resources/devices.json`) is the +catalog the Skin Designer wizard shows in the device picker. It is generated +directly from GSMArena by `build_devices_json.py` and refreshed by CI. + +## Why scrape directly? + +We previously sourced the catalog from third-party Kaggle / GitHub dumps +(e.g. `KhalSCI/GSMARENA_Scraper`, `foykes/gsm-arena-dataset`). They go stale +the moment the maintainer stops updating them — at the time we switched they +topped out at iPhone 16, so anything Apple announced after September 2024 +was missing. Scraping GSMArena ourselves means whatever is on the site today +is in the bundled catalog after the next CI run. + +## How the scraper behaves + +`build_devices_json.py` is stdlib-only and: + +1. Fetches the brand listing page (e.g. `apple-phones-48.php`). +2. Walks the pagination on each brand page. +3. Follows every phone link to its detail page. +4. Reads the `data-spec="..."` rows for resolution / PPI / OS / display size / + year, plus the `` for the canonical model name. +5. Normalises everything (notch / island / hole heuristics, safe-area insets, + font defaults) into the JSON schema below. +6. Merges into the existing `devices.json` so partial / aborted scrapes + never lose history. + +To stay polite to GSMArena and avoid IP bans we: + +- Sleep `--delay` seconds (default 1 s) between requests with random jitter. +- Cache fetched HTML to `tools/devicedb/cache/` (gzipped). Re-runs only + re-fetch what cache-restore missed. +- Retry transient failures with exponential backoff. +- Cap each brand at `--max-pages` listing pages. + +## Output schema (per device) + +``` +{ + "id": "apple_iphone_15_pro", + "brand": "Apple", + "name": "iPhone 15 Pro", + "os": "iOS 17, upgradable to iOS 18", + "year": 2023, + "form": "Phone" | "Tablet" | "Foldable", + "tablet": false, + "w": 1179, // resolution in pixels + "h": 2556, + "ppi": 460, + "inches": 6.1, + "platform": "ios" | "and", + "hasNotch": false, + "hasIsland": true, + "hasHole": false, + "hasHome": true, + "safeTop": 59, + "safeBottom": 34, + "fonts": {"system": "SF Pro", "prop": "SF Pro", "mono": "SF Mono", + "small": 12, "medium": 15, "large": 22} +} +``` + +## Refreshing locally + +Default scrape (the curated brand list — Apple, Samsung, Google, OnePlus, +Xiaomi, OPPO, Vivo, Motorola, Sony, Nokia, Asus, LG, HTC, BlackBerry, Honor, +Realme, Nothing — about 1500 phones, 30–60 min): + + python3 scripts/skindesigner/tools/devicedb/build_devices_json.py + +Faster sanity run (limit to 8 phones from one brand, ~30 s): + + python3 build_devices_json.py --brands apple-phones-48 \ + --max-pages 1 --limit 8 --out /tmp/test-devices.json + +Full scrape (every brand on `makers.php3`; multi-hour, only run when the +curated list misses a brand someone needs): + + python3 build_devices_json.py --full + +## Refreshing in CI + +`.github/workflows/skin-designer-devices-update.yml` runs the scraper on the +1st of each month and opens an automated PR if the JSON drifted. The HTML +cache is persisted across runs via `actions/cache` so the scrape only +re-fetches phones whose pages changed. Run it manually via the Actions tab +when you want a fresh dump. + +## Notes / caveats + +- Notch / island / hole flags are heuristics keyed off the model name + (iPhone X-14 → notch, iPhone 14 Pro / 15+ → island, Android post-2019 → + hole-punch). GSMArena does not have structured fields for these. Users + can override per-skin in the editor. +- Safe-area insets are rough defaults by device class — also user-editable. +- Pixel ratio (Codename One's pixels-per-millimeter) is computed as + `ppi / 25.4` when the wizard writes `skin.properties`. PPI itself comes + straight from GSMArena. +- IP bans: if the scraper starts seeing 429s or HTML we can't parse, + bump `--delay` and let the cache from previous runs carry us through. diff --git a/scripts/skindesigner/tools/devicedb/build_devices_json.py b/scripts/skindesigner/tools/devicedb/build_devices_json.py new file mode 100755 index 0000000000..91b837e664 --- /dev/null +++ b/scripts/skindesigner/tools/devicedb/build_devices_json.py @@ -0,0 +1,435 @@ +#!/usr/bin/env python3 +""" +Build the bundled devices.json catalog used by the Skin Designer. + +Scrapes GSMArena directly so we always get the freshest specs (third-party +GitHub mirrors lag months behind). The scraper: + + * walks the brand pages we care about, + * follows each phone link to its detail page, + * extracts resolution / PPI / OS / form factor from the data-spec table, + * normalises everything, and + * writes a compact JSON file the CN1 app loads at startup. + +This script is designed to run from CI on a schedule. To stay polite to +GSMArena and avoid IP bans we: + * sleep --delay seconds between requests (default 1.0s), + * cache fetched HTML to disk so repeated runs only re-fetch what changed, + * retry with exponential backoff on transient failures, + * merge new records into the existing devices.json so partial scrapes + never lose the existing catalog. + +Usage: + python3 build_devices_json.py [--brands BRAND_SLUG,...] [--full] + [--max-pages N] [--delay SECONDS] + [--out PATH] + +Default brand list focuses on devices likely to be skinned (~12 brands). +Pass `--full` to walk every brand on makers.php3. Pass an explicit +`--brands` to override. + +No third-party packages required; everything uses the stdlib. +""" +from __future__ import annotations + +import argparse +import gzip +import hashlib +import io +import json +import os +import random +import re +import sys +import time +import urllib.error +import urllib.request +from html import unescape +from typing import Iterable, Optional + +BASE = "https://www.gsmarena.com/" +USER_AGENT = ( + "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_0) AppleWebKit/605.1.15 " + "(KHTML, like Gecko) Version/17.1 Safari/605.1.15 " + "(skin-designer-devicedb-builder; https://github.com/codenameone/CodenameOne)" +) + +DEFAULT_OUT = os.path.normpath( + os.path.join( + os.path.dirname(__file__), + "..", "..", "common", "src", "main", "resources", "devices.json" + ) +) +CACHE_DIR = os.path.normpath(os.path.join(os.path.dirname(__file__), "cache")) + +# Curated brand slugs — everything users are likely to skin. Slug format +# matches the URLs at https://www.gsmarena.com/makers.php3. +DEFAULT_BRANDS = [ + "apple-phones-48", + "samsung-phones-9", + "google-phones-107", + "huawei-phones-58", + "xiaomi-phones-80", + "oneplus-phones-95", + "oppo-phones-82", + "vivo-phones-98", + "motorola-phones-4", + "sony-phones-7", + "nokia-phones-1", + "asus-phones-46", + "lg-phones-20", + "htc-phones-45", + "blackberry-phones-36", + "honor-phones-121", + "realme-phones-118", + "nothing-phones-128", +] + +RE_RES = re.compile(r"(\d{3,5})\s*[x×]\s*(\d{3,5})") +RE_PPI = re.compile(r"~?\s*(\d{2,4})\s*ppi") +RE_SIZE = re.compile(r"([\d.]+)\s*inches?") +RE_YEAR = re.compile(r"\b(19|20)(\d{2})\b") +RE_PHONE_LINK = re.compile(r'<li><a href="([a-z0-9_()]+-\d+\.php)"[^>]*>.*?<strong[^>]*><span>([^<]+)</span></strong></a></li>', + re.S | re.I) +RE_NAV_PAGE = re.compile(r'href="([a-z0-9_-]+-p\d+\.php)"', re.I) +RE_DATASPEC = re.compile(r'data-spec="([a-z\-]+)"[^>]*>([^<]+)<', re.I) +RE_TITLE = re.compile(r"<title>([^<]+?)\s*-\s*Full phone specifications", re.I) +RE_BRAND_FROM_SLUG = re.compile(r"^([a-z0-9]+)-phones-\d+$", re.I) +RE_BRAND_LINK = re.compile(r']*>\s*]*>([^<]+)', + re.I) + +IPHONE_ISLAND_NAMES = re.compile( + r"iphone\s+(14\s*pro|1[5-9](\s|$|\s*(plus|pro|pro\s*max|mini|air|ultra)))", + re.I, +) +IPHONE_NOTCH_NAMES = re.compile( + r"iphone\s+(x[srm]?(\s|$)|1[1-3](\s|$|\s*(pro|pro\s*max|mini|plus))|14(\s|$|\s*plus))", + re.I, +) + + +def cache_path(url: str) -> str: + h = hashlib.sha1(url.encode("utf-8")).hexdigest()[:16] + return os.path.join(CACHE_DIR, h + ".html.gz") + + +def http_get(url: str, *, delay: float = 1.0, retries: int = 4, use_cache: bool = True) -> str: + """Fetch a URL with caching, polite delay and retry/backoff.""" + if use_cache: + os.makedirs(CACHE_DIR, exist_ok=True) + cp = cache_path(url) + if os.path.exists(cp): + with gzip.open(cp, "rt", encoding="utf-8") as f: + return f.read() + last_err: Optional[Exception] = None + for attempt in range(retries): + try: + req = urllib.request.Request(url, headers={ + "User-Agent": USER_AGENT, + "Accept-Encoding": "gzip", + "Accept": "text/html,application/xhtml+xml", + "Accept-Language": "en-US,en;q=0.9", + }) + with urllib.request.urlopen(req, timeout=30) as resp: + raw = resp.read() + if resp.headers.get("Content-Encoding") == "gzip": + raw = gzip.decompress(raw) + html = raw.decode("utf-8", "replace") + if use_cache: + with gzip.open(cache_path(url), "wt", encoding="utf-8") as f: + f.write(html) + time.sleep(delay + random.uniform(0, 0.4)) + return html + except (urllib.error.HTTPError, urllib.error.URLError, TimeoutError) as e: + last_err = e + wait = (2 ** attempt) + random.uniform(0, 1.5) + sys.stderr.write(f" ! {url} -> {e}; backoff {wait:.1f}s\n") + time.sleep(wait) + raise RuntimeError(f"Failed to fetch {url}: {last_err}") + + +def discover_brands() -> list[tuple[str, str]]: + """Returns [(brand_label, brand_slug_with_id), ...] from makers.php3.""" + html = http_get(BASE + "makers.php3", delay=0.0) + seen: dict[str, str] = {} + for m in RE_BRAND_LINK.finditer(html): + page = m.group(1) + label = unescape(m.group(2)).strip() + slug = page.replace(".php", "") + seen.setdefault(slug, label) + return sorted(seen.items()) + + +def walk_brand(slug: str, *, max_pages: int = 999, delay: float = 1.0) -> Iterable[tuple[str, str]]: + """Yields (phone_url, model_name) for one brand, walking pagination.""" + seen_pages: set[str] = set() + queue: list[str] = [slug + ".php"] + yielded_slugs: set[str] = set() + pages_fetched = 0 + while queue and pages_fetched < max_pages: + page = queue.pop(0) + if page in seen_pages: + continue + seen_pages.add(page) + pages_fetched += 1 + try: + html = http_get(BASE + page, delay=delay) + except RuntimeError as err: + sys.stderr.write(f" ! brand page {page} failed: {err}\n") + continue + for m in RE_PHONE_LINK.finditer(html): + phone_url = m.group(1) + if phone_url.endswith("-review.php"): + continue + if phone_url in yielded_slugs: + continue + yielded_slugs.add(phone_url) + yield phone_url, unescape(m.group(2)).strip() + for m in RE_NAV_PAGE.finditer(html): + np = m.group(1) + if np not in seen_pages: + queue.append(np) + + +def parse_phone_page(html: str) -> dict: + """Pulls every data-spec field out of a phone detail page.""" + out = {} + for m in RE_DATASPEC.finditer(html): + key = m.group(1).lower() + # Skip the keys we don't care about — keeps memory tiny on huge pages. + if key not in ("displaytype", "displaysize", "displayresolution", + "os", "year", "modelname", "dimensions", "status"): + continue + out[key] = unescape(m.group(2)).strip() + tm = RE_TITLE.search(html) + if tm: + out["title"] = unescape(tm.group(1)).strip() + return out + + +def detect_platform(os_str: str) -> str: + s = os_str.lower() + if "ios" in s or "ipados" in s: + return "ios" + if "android" in s: + return "and" + return "" + + +def has_notch(model: str, plat: str) -> bool: + if plat != "ios": + return False + return bool(IPHONE_NOTCH_NAMES.search(model)) and not IPHONE_ISLAND_NAMES.search(model) + + +def has_island(model: str, plat: str) -> bool: + if plat != "ios": + return False + return bool(IPHONE_ISLAND_NAMES.search(model)) + + +def has_hole(plat: str, year: Optional[int]) -> bool: + return plat == "and" and year is not None and year >= 2019 + + +def is_foldable(model: str, display_type: str) -> bool: + blob = (model + " " + display_type).lower() + return any(n in blob for n in ( + "fold", "flip", "razr 5g", "razr 40", "razr+", "razr 2024", + "x fold", "magic v", "mate x", "tri-fold" + )) + + +def normalise(brand: str, model: str, specs: dict) -> Optional[dict]: + title = specs.get("title", brand + " " + model) + name = title.replace(brand + " ", "", 1) if title.startswith(brand + " ") else (model or title) + name = name.strip() + if not name: + return None + + res = specs.get("displayresolution", "") + rm = RE_RES.search(res) + if not rm: + return None + w, h = int(rm.group(1)), int(rm.group(2)) + if w < 320 or h < 480 or w * h < 320 * 480 or w > 4500 or h > 4500: + return None + + pm = RE_PPI.search(res) + ppi = int(pm.group(1)) if pm else None + if not ppi: + return None + + sm = RE_SIZE.search(specs.get("displaysize", "")) + inches = float(sm.group(1)) if sm else None + + ym = RE_YEAR.search(specs.get("year", "") or specs.get("status", "")) + year = int(ym.group(1) + ym.group(2)) if ym else None + if year is None: + return None + + plat = detect_platform(specs.get("os", "")) + if plat not in ("ios", "and"): + return None + + tablet = inches is not None and inches >= 7.0 + foldable = is_foldable(name, specs.get("displaytype", "")) + + rec = { + "id": (brand + "_" + name).lower().replace(" ", "_").replace("/", "_").replace("(", "").replace(")", ""), + "brand": brand, + "name": name, + "os": (specs.get("os", "") or "")[:60], + "year": year, + "form": "Foldable" if foldable else ("Tablet" if tablet else "Phone"), + "tablet": tablet, + "w": w, + "h": h, + "ppi": ppi, + "inches": inches, + "platform": plat, + "hasNotch": has_notch(name, plat), + "hasIsland": has_island(name, plat), + "hasHole": has_hole(plat, year), + } + rec["hasHome"] = (plat == "ios" and (rec["hasNotch"] or rec["hasIsland"])) or ( + plat == "ios" and tablet and year >= 2018 + ) + if rec["hasIsland"]: + rec["safeTop"], rec["safeBottom"] = 59, 34 + elif rec["hasNotch"]: + rec["safeTop"], rec["safeBottom"] = 47, 34 + elif rec["hasHole"]: + rec["safeTop"], rec["safeBottom"] = 40, 0 + elif tablet: + rec["safeTop"], rec["safeBottom"] = 24, 24 + else: + rec["safeTop"], rec["safeBottom"] = 20, 0 + if plat == "ios": + rec["fonts"] = {"system": "SF Pro", "prop": "SF Pro", "mono": "SF Mono", + "small": 13 if tablet else 12, + "medium": 17 if tablet else 15, + "large": 24 if tablet else 22} + else: + rec["fonts"] = {"system": "Roboto", "prop": "Roboto", "mono": "Roboto Mono", + "small": 12, "medium": 14, "large": 20} + return rec + + +def brand_label_from_slug(slug: str, label_map: dict[str, str]) -> str: + if slug in label_map: + return label_map[slug] + m = RE_BRAND_FROM_SLUG.match(slug) + return m.group(1).title() if m else slug + + +def merge(existing: list[dict], fresh: list[dict]) -> list[dict]: + by_id: dict[str, dict] = {r["id"]: r for r in existing} + for r in fresh: + prev = by_id.get(r["id"]) + if prev is None or (r.get("year") or 0) >= (prev.get("year") or 0): + by_id[r["id"]] = r + return list(by_id.values()) + + +def load_existing(path: str) -> list[dict]: + if not os.path.exists(path): + return [] + try: + with open(path, "r", encoding="utf-8") as f: + payload = json.load(f) + return payload.get("devices", []) + except (OSError, json.JSONDecodeError): + return [] + + +def main() -> int: + ap = argparse.ArgumentParser(description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument("--brands", default=",".join(DEFAULT_BRANDS), + help="Comma-separated brand slugs (no .php). Use --full to walk all brands instead.") + ap.add_argument("--full", action="store_true", + help="Discover and walk every brand on makers.php3") + ap.add_argument("--max-pages", type=int, default=10, + help="Cap on brand-list pages walked per brand") + ap.add_argument("--min-year", type=int, default=2014, + help="Drop devices announced before this year") + ap.add_argument("--delay", type=float, default=1.0, + help="Polite delay between HTTP requests, seconds") + ap.add_argument("--out", default=DEFAULT_OUT, help="Output devices.json path") + ap.add_argument("--no-cache", action="store_true", + help="Disable on-disk HTML cache") + ap.add_argument("--limit", type=int, default=0, + help="Stop after this many phones (0 = no limit)") + args = ap.parse_args() + + use_cache = not args.no_cache + + if args.full: + sys.stderr.write("Discovering all brands…\n") + all_brands = discover_brands() + # Each entry is (slug, label); keep only phone-list slugs + target = [(s, l) for s, l in all_brands if s.endswith(tuple(f"-{i}" for i in range(1000)))] + if not target: + target = all_brands + else: + slugs = [b.strip() for b in args.brands.split(",") if b.strip()] + # Try to resolve labels via discover_brands; fall back to slug-based label + try: + label_map = dict(discover_brands()) + except Exception: + label_map = {} + target = [(s, brand_label_from_slug(s, label_map)) for s in slugs] + + sys.stderr.write(f"Scraping {len(target)} brand(s) at {args.delay}s/request…\n") + + existing = load_existing(args.out) + fresh: list[dict] = [] + seen: set[str] = set() + total_phones = 0 + + for slug, label in target: + sys.stderr.write(f"\n=== {label} [{slug}] ===\n") + for url, model in walk_brand(slug, max_pages=args.max_pages, delay=args.delay): + if url in seen: + continue + seen.add(url) + try: + html = http_get(BASE + url, delay=args.delay, use_cache=use_cache) + except RuntimeError as err: + sys.stderr.write(f" ! skip {url}: {err}\n") + continue + specs = parse_phone_page(html) + rec = normalise(label, model, specs) + if rec is not None and rec["year"] >= args.min_year: + fresh.append(rec) + total_phones += 1 + if args.limit and total_phones >= args.limit: + sys.stderr.write(f" · hit --limit {args.limit}, stopping\n") + break + if args.limit and total_phones >= args.limit: + break + + merged = merge(existing, fresh) + merged.sort(key=lambda r: (-(r["year"] or 0), r["brand"].lower(), r["name"].lower())) + + payload = { + "version": 2, + "generator": "build_devices_json.py", + "source": BASE, + "fresh_count": len(fresh), + "count": len(merged), + "devices": merged, + } + out_dir = os.path.dirname(args.out) + if out_dir and not os.path.isdir(out_dir): + os.makedirs(out_dir, exist_ok=True) + with open(args.out, "w", encoding="utf-8") as f: + json.dump(payload, f, separators=(",", ":"), ensure_ascii=False) + sys.stderr.write(f"\nWrote {len(merged)} devices " + f"({len(fresh)} from this run) to {args.out}\n") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From 5adf2f99f1468ee481648e2313174e6c90869baf Mon Sep 17 00:00:00 2001 From: liannacasper <67953602+liannacasper@users.noreply.github.com> Date: Sat, 2 May 2026 15:35:11 +0300 Subject: [PATCH 31/55] Potential fix for pull request finding 'Unused import' Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com> Signed-off-by: liannacasper <67953602+liannacasper@users.noreply.github.com> --- scripts/skindesigner/tools/devicedb/build_devices_json.py | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/skindesigner/tools/devicedb/build_devices_json.py b/scripts/skindesigner/tools/devicedb/build_devices_json.py index 91b837e664..642f5cdd46 100755 --- a/scripts/skindesigner/tools/devicedb/build_devices_json.py +++ b/scripts/skindesigner/tools/devicedb/build_devices_json.py @@ -35,7 +35,6 @@ import argparse import gzip import hashlib -import io import json import os import random From a8a1bd43975118cb11a172cd1baad75ad779b69c Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sat, 2 May 2026 16:35:52 +0300 Subject: [PATCH 32/55] Skin Designer wizard polish: clickable cards, true circle stepper, calmer styling - Hide the Form's default Toolbar so the custom topbar is the only header, and replace the green "CN1" pill with a Material phone icon in CN1 blue. - Replace cn1-pill-border stepper badges with a CircleBadge custom Component that paints a true filled disc with the digit (or check) centered, so the numbers stop getting cropped on every platform. - Switch the step separator back to a thin colored Label with explicit preferred dimensions; the custom-paint Component was getting stretched vertically by BoxLayout into a vertical bar. - Replace setLeadComponent(label)+addPointerReleasedListener with a LayeredLayout overlay carrying a transparent Button (SkinDesignerCardOverlay) on top of the card content. Clicks now fire reliably inside scrollable parents (device cards, source cards, preset tiles, cutout select area). - Drop cn1-pill-border from buttons in favor of cn1-round-border 1.6mm with explicit .pressed/.disabled selectors, so the toolkit's default pressed styling never appears. Filter chips keep cn1-pill-border (small enough to render as a true pill) and gain matching pressed variants. - Defer device-grid rebuild via CN.callSerially when filter chips are tapped, lower DEVICE_GRID_LIMIT 200 -> 60, debounce search 180 ms, and show a "Showing X of Y - type to narrow" hint, so filter switches feel snappy on a 5000-device DB. - Bump padding/margin throughout: topbar, step head/body, device cards, source cards, footer, buttons. Device DB scraper: - Add --mode latest that walks GSMArena's latest-mobiles.php3 page; combined with --limit, this is the trickle scrape CI now uses. - Workflow runs every 6 hours on master only (no more pull_request trigger that fired on every PR), with an if: github.repository/ref guard so it also skips forks and feature branches. workflow_dispatch supports a trickle/full mode choice, and the create-pull-request step is gated on an actual diff so empty runs don't open noise PRs. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../skin-designer-devices-update.yml | 59 ++- .../common/src/main/css/theme.css | 468 +++++++++++------- .../tools/skindesigner/SkinDesigner.java | 279 +++++++++-- .../tools/devicedb/build_devices_json.py | 120 ++++- 4 files changed, 648 insertions(+), 278 deletions(-) diff --git a/.github/workflows/skin-designer-devices-update.yml b/.github/workflows/skin-designer-devices-update.yml index 8bc988cec1..6c79c30aaa 100644 --- a/.github/workflows/skin-designer-devices-update.yml +++ b/.github/workflows/skin-designer-devices-update.yml @@ -1,16 +1,22 @@ name: Skin Designer Device DB Update +# Runs only on master so it doesn't fire on every PR that touches the script. +# Each run pulls a small batch of the latest GSMArena entries and merges them +# into the bundled devices.json. Slow-and-steady avoids the 30+ minute scrapes +# that risk IP bans and CI cancellation. on: schedule: - # Monthly on the 1st at 06:30 UTC. The scrape walks ~18 brands × ~10 - # listing pages × phones per page; with a 1.5 s polite delay it tends - # to finish in 30-60 minutes. - - cron: '30 6 1 * *' + # Every 6 hours. Each run only scrapes the "latest mobiles" page, so we + # accumulate fresh devices without ever doing a multi-thousand-page crawl. + - cron: '0 */6 * * *' workflow_dispatch: - pull_request: - paths: - - '.github/workflows/skin-designer-devices-update.yml' - - 'scripts/skindesigner/tools/devicedb/build_devices_json.py' + inputs: + mode: + description: "trickle (~50 latest) or full (all curated brands)" + required: false + default: "trickle" + type: choice + options: [trickle, full] permissions: actions: write @@ -19,8 +25,10 @@ permissions: jobs: update-device-db: + # Only run on the canonical repo's master, never on forks or feature branches. + if: github.repository == 'codenameone/CodenameOne' && github.ref == 'refs/heads/master' runs-on: ubuntu-latest - timeout-minutes: 90 + timeout-minutes: 25 steps: - name: Check out repository @@ -39,26 +47,31 @@ jobs: restore-keys: | skin-designer-devicedb-cache- - - name: Scrape GSMArena → devices.json - # --delay 1.5 keeps us at <1 req/sec averaged with jitter, which - # is well under GSMArena's per-IP rate limit. The cache directory - # is restored from the previous run so unchanged phone pages - # don't get re-fetched. + - name: Trickle scrape (~50 latest) + if: github.event_name == 'schedule' || github.event.inputs.mode == 'trickle' || github.event.inputs.mode == '' run: | python3 scripts/skindesigner/tools/devicedb/build_devices_json.py \ - --delay 1.5 --max-pages 12 + --mode latest --limit 50 --delay 2.0 --max-pages 1 - - name: Show diff (PR mode) - if: github.event_name == 'pull_request' + - name: Full scrape (all curated brands) + if: github.event_name == 'workflow_dispatch' && github.event.inputs.mode == 'full' + run: | + python3 scripts/skindesigner/tools/devicedb/build_devices_json.py \ + --mode brands --delay 2.0 --max-pages 12 + + - name: Bail out if nothing changed + id: diff run: | if git diff --quiet -- scripts/skindesigner/common/src/main/resources/devices.json; then - echo "Device DB is already up to date." + echo "changed=false" >> "$GITHUB_OUTPUT" + echo "Device DB unchanged; nothing to commit." else + echo "changed=true" >> "$GITHUB_OUTPUT" git --no-pager diff --stat -- scripts/skindesigner/common/src/main/resources/devices.json fi - name: Create pull request - if: github.event_name != 'pull_request' + if: steps.diff.outputs.changed == 'true' uses: peter-evans/create-pull-request@v7 with: commit-message: "Refresh Skin Designer device database" @@ -66,12 +79,10 @@ jobs: body: | ## Summary - Regenerates `scripts/skindesigner/common/src/main/resources/devices.json` - by scraping GSMArena directly. The script merges fresh records - into the existing catalog so historical entries survive partial - scrapes. + by scraping a small batch of the latest devices from GSMArena and + merging into the existing catalog. - This PR is created automatically by the monthly device DB update - workflow. Skip the merge if the diff is empty or only churn. + Created automatically by the Skin Designer device DB workflow. base: master branch: automation/skin-designer-device-db delete-branch: true diff --git a/scripts/skindesigner/common/src/main/css/theme.css b/scripts/skindesigner/common/src/main/css/theme.css index ea4729efef..da498dc9bd 100644 --- a/scripts/skindesigner/common/src/main/css/theme.css +++ b/scripts/skindesigner/common/src/main/css/theme.css @@ -40,49 +40,47 @@ CommandDark { color: #f5f8ff; background: transparent; } SkinDesignerTopbar { background: #ffffff; border-bottom: 1px solid #d9dee8; - padding: 0.6mm 1.6mm; + padding: 1.2mm 2.4mm; } SkinDesignerTopbarDark { background: #102b66; border-bottom: 1px solid #4c6ea8; - padding: 0.6mm 1.6mm; + padding: 1.2mm 2.4mm; } -SkinDesignerBrand { padding: 0; } -SkinDesignerBrandDark { padding: 0; } +SkinDesignerBrand { padding: 0 1mm 0 0; } +SkinDesignerBrandDark { padding: 0 1mm 0 0; } +/* Material phone icon in CN1 brand blue. Avoid background+border-radius which + * the CN1 CSS subset would render as a 9-piece image and clip the glyph. */ SkinDesignerBrandLogo { - color: #ffffff; - background: #2a8a8a; - border-radius: 1.4mm; - padding: 0.6mm 0.9mm; - margin: 0.2mm 0.6mm; - font-size: 2.4mm; - font-family: "native:MainBold"; + color: #2f6bff; + background: transparent; + padding: 0.4mm 0.8mm; + margin: 0.2mm 0.6mm 0.2mm 0; + font-size: 5.4mm; text-align: center; } SkinDesignerBrandLogoDark { - color: #ffffff; - background: #3bc5c5; - border-radius: 1.4mm; - padding: 0.6mm 0.9mm; - margin: 0.2mm 0.6mm; - font-size: 2.4mm; - font-family: "native:MainBold"; + color: #4d86ff; + background: transparent; + padding: 0.4mm 0.8mm; + margin: 0.2mm 0.6mm 0.2mm 0; + font-size: 5.4mm; text-align: center; } SkinDesignerBrandTitle { color: #112247; - font-size: 3.4mm; + font-size: 3.6mm; font-family: "native:MainBold"; - padding: 0.6mm; + padding: 0.6mm 0.4mm; } SkinDesignerBrandTitleDark { color: #f5f8ff; - font-size: 3.4mm; + font-size: 3.6mm; font-family: "native:MainBold"; - padding: 0.6mm; + padding: 0.6mm 0.4mm; } /* --- Stepper --------------------------------------------------------- */ @@ -93,125 +91,78 @@ SkinDesignerStepper { } SkinDesignerStepperDark { background: transparent; padding: 0; } +/* Step item — number-badge + label side-by-side. The badge is painted by + * the CircleBadge custom component (always a true circle), so the item + * itself just needs a transparent background and a little breathing room. */ SkinDesignerStepperItemActive, SkinDesignerStepperItemDone, SkinDesignerStepperItemPending { background: transparent; - padding: 0.6mm 1.4mm; - margin: 0; - border-radius: 6mm; -} -SkinDesignerStepperItemActive { background: #e8f0ff; } -SkinDesignerStepperItemActiveDark { background: rgba(77,134,255,0.16); padding: 0.6mm 1.4mm; margin: 0; border-radius: 6mm; } -SkinDesignerStepperItemDoneDark { background: transparent; padding: 0.6mm 1.4mm; margin: 0; border-radius: 6mm; } -SkinDesignerStepperItemPendingDark { background: transparent; padding: 0.6mm 1.4mm; margin: 0; border-radius: 6mm; } - -SkinDesignerStepperNumActive { - background: #2f6bff; - color: #ffffff; - border-radius: 4mm; - padding: 0.4mm; - margin: 0 0.6mm 0 0; - font-size: 2.2mm; - font-family: "native:MainBold"; - text-align: center; -} -SkinDesignerStepperNumActiveDark { - background: #4d86ff; - color: #ffffff; - border-radius: 4mm; - padding: 0.4mm; - margin: 0 0.6mm 0 0; - font-size: 2.2mm; - font-family: "native:MainBold"; - text-align: center; -} -SkinDesignerStepperNumDone { - background: #b8d532; - color: #112247; - border-radius: 4mm; - padding: 0.4mm; - margin: 0 0.6mm 0 0; - font-size: 2.2mm; - font-family: "native:MainBold"; - text-align: center; -} -SkinDesignerStepperNumDoneDark { - background: #b8d532; - color: #0a2460; - border-radius: 4mm; - padding: 0.4mm; - margin: 0 0.6mm 0 0; - font-size: 2.2mm; - font-family: "native:MainBold"; - text-align: center; -} -SkinDesignerStepperNumPending { - background: #d9dee8; - color: #ffffff; - border-radius: 4mm; - padding: 0.4mm; - margin: 0 0.6mm 0 0; - font-size: 2.2mm; - font-family: "native:MainLight"; - text-align: center; + padding: 1mm 2.4mm; + margin: 0 0.6mm; } -SkinDesignerStepperNumPendingDark { - background: #4c6ea8; - color: #102b66; - border-radius: 4mm; - padding: 0.4mm; - margin: 0 0.6mm 0 0; - font-size: 2.2mm; - font-family: "native:MainLight"; - text-align: center; +SkinDesignerStepperItemActiveDark, +SkinDesignerStepperItemDoneDark, +SkinDesignerStepperItemPendingDark { + background: transparent; + padding: 1mm 2.4mm; + margin: 0 0.6mm; } SkinDesignerStepperLabelActive { color: #2f6bff; - font-size: 2.6mm; + font-size: 2.8mm; font-family: "native:MainBold"; - padding: 0; + padding: 0.4mm 0 0.4mm 1.2mm; } SkinDesignerStepperLabelActiveDark { color: #4d86ff; - font-size: 2.6mm; + font-size: 2.8mm; font-family: "native:MainBold"; - padding: 0; + padding: 0.4mm 0 0.4mm 1.2mm; } SkinDesignerStepperLabelDone { color: #112247; - font-size: 2.6mm; + font-size: 2.8mm; font-family: "native:MainLight"; - padding: 0; + padding: 0.4mm 0 0.4mm 1.2mm; } SkinDesignerStepperLabelDoneDark { color: #f5f8ff; - font-size: 2.6mm; + font-size: 2.8mm; font-family: "native:MainLight"; - padding: 0; + padding: 0.4mm 0 0.4mm 1.2mm; } SkinDesignerStepperLabelPending { color: #7f8aa3; - font-size: 2.6mm; + font-size: 2.8mm; font-family: "native:MainLight"; - padding: 0; + padding: 0.4mm 0 0.4mm 1.2mm; } SkinDesignerStepperLabelPendingDark { color: #a8b8da; - font-size: 2.6mm; + font-size: 2.8mm; font-family: "native:MainLight"; - padding: 0; + padding: 0.4mm 0 0.4mm 1.2mm; } +/* Horizontal line between stepper items. Solid background + tiny preferred + * height in code (set in buildStepperSep) so BoxLayout always lays it out + * as a thin horizontal bar. */ SkinDesignerStepperSep { background: #d9dee8; + color: transparent; + font-size: 0.5mm; padding: 0; - margin: 0 0.5mm; + margin: 1.2mm 0.4mm; +} +SkinDesignerStepperSepDark { + background: #4c6ea8; color: transparent; - font-size: 0.6mm; + font-size: 0.5mm; + padding: 0; + margin: 1.2mm 0.4mm; } -SkinDesignerStepperSepDark { background: #4c6ea8; padding: 0; margin: 0 0.5mm; color: transparent; font-size: 0.6mm; } SkinDesignerWizardNav { background: transparent; padding: 0; } SkinDesignerWizardNavDark { background: transparent; padding: 0; } @@ -254,18 +205,18 @@ SkinDesignerStepRootDark { background: #071b4d; padding: 0; } SkinDesignerStepHead { background: transparent; - padding: 4mm 4mm 1mm 4mm; + padding: 8mm 4mm 3mm 4mm; } -SkinDesignerStepHeadDark { background: transparent; padding: 4mm 4mm 1mm 4mm; } +SkinDesignerStepHeadDark { background: transparent; padding: 8mm 4mm 3mm 4mm; } -SkinDesignerStepHeadInner { background: transparent; padding: 0; } -SkinDesignerStepHeadInnerDark { background: transparent; padding: 0; } +SkinDesignerStepHeadInner { background: transparent; padding: 0 0 4mm 0; } +SkinDesignerStepHeadInnerDark { background: transparent; padding: 0 0 4mm 0; } SkinDesignerStepBody { background: transparent; - padding: 1mm 3mm; + padding: 4mm 6mm; } -SkinDesignerStepBodyDark { background: transparent; padding: 1mm 3mm; } +SkinDesignerStepBodyDark { background: transparent; padding: 4mm 6mm; } SkinDesignerStepScroll { background: transparent; @@ -316,55 +267,124 @@ SkinDesignerSubDark { /* --- Buttons --------------------------------------------------------- */ +/* Solid-color buttons with a small native rounded border. The CN1 CSS + * subset gives us cn1-round-border (true rounded rectangle, no 9-piece + * fallback). Each button has explicit .pressed and .disabled selectors so + * the toolkit's default (washed-out, square) press style never appears. */ SkinDesignerPrimaryButton { + cn1-round-border: 1.6mm; color: #ffffff; background: #2f6bff; - border: 1px solid #2f6bff; - border-radius: 1.4mm; - padding: 1mm 2.4mm; - margin: 0.4mm; + padding: 2mm 4mm; + margin: 1mm; + font-family: "native:MainBold"; + font-size: 2.8mm; + text-align: center; +} +SkinDesignerPrimaryButton.pressed { + cn1-round-border: 1.6mm; + color: #ffffff; + background: #1f4ec9; + padding: 2mm 4mm; + margin: 1mm; + font-family: "native:MainBold"; + font-size: 2.8mm; + text-align: center; +} +SkinDesignerPrimaryButton.disabled { + cn1-round-border: 1.6mm; + color: #ffffff; + background: #b3c8ff; + padding: 2mm 4mm; + margin: 1mm; font-family: "native:MainBold"; font-size: 2.8mm; text-align: center; } SkinDesignerPrimaryButtonDark { + cn1-round-border: 1.6mm; color: #ffffff; background: #4d86ff; - border: 1px solid #4d86ff; - border-radius: 1.4mm; - padding: 1mm 2.4mm; - margin: 0.4mm; + padding: 2mm 4mm; + margin: 1mm; font-family: "native:MainBold"; font-size: 2.8mm; text-align: center; } +SkinDesignerPrimaryButtonDark.pressed { + cn1-round-border: 1.6mm; + color: #ffffff; + background: #2f6bff; + padding: 2mm 4mm; + margin: 1mm; + font-family: "native:MainBold"; + font-size: 2.8mm; + text-align: center; +} +SkinDesignerPrimaryButtonDark.disabled { + cn1-round-border: 1.6mm; + color: #a8b8da; + background: #1f4ec9; + padding: 2mm 4mm; + margin: 1mm; + font-family: "native:MainBold"; + font-size: 2.8mm; + text-align: center; +} + SkinDesignerSecondaryButton { + cn1-round-border: 1.6mm; color: #112247; background: #ffffff; - border: 1px solid #d9dee8; - border-radius: 1.4mm; - padding: 1mm 2.4mm; - margin: 0.4mm; + padding: 2mm 4mm; + margin: 1mm; + font-family: "native:MainLight"; + font-size: 2.8mm; + text-align: center; +} +SkinDesignerSecondaryButton.pressed { + cn1-round-border: 1.6mm; + color: #112247; + background: #e8eef9; + padding: 2mm 4mm; + margin: 1mm; font-family: "native:MainLight"; font-size: 2.8mm; text-align: center; } SkinDesignerSecondaryButtonDark { + cn1-round-border: 1.6mm; color: #f5f8ff; background: #102b66; - border: 1px solid #4c6ea8; - border-radius: 1.4mm; - padding: 1mm 2.4mm; - margin: 0.4mm; + padding: 2mm 4mm; + margin: 1mm; + font-family: "native:MainLight"; + font-size: 2.8mm; + text-align: center; +} +SkinDesignerSecondaryButtonDark.pressed { + cn1-round-border: 1.6mm; + color: #f5f8ff; + background: #163575; + padding: 2mm 4mm; + margin: 1mm; font-family: "native:MainLight"; font-size: 2.8mm; text-align: center; } + SkinDesignerGhostButton { color: #112247; background: transparent; - border: none; - padding: 1mm 2mm; + padding: 1.4mm 3mm; + margin: 0.4mm; + font-family: "native:MainLight"; + font-size: 2.6mm; +} +SkinDesignerGhostButton.pressed { + color: #2f6bff; + background: transparent; + padding: 1.4mm 3mm; margin: 0.4mm; font-family: "native:MainLight"; font-size: 2.6mm; @@ -372,38 +392,95 @@ SkinDesignerGhostButton { SkinDesignerGhostButtonDark { color: #f5f8ff; background: transparent; - border: none; - padding: 1mm 2mm; + padding: 1.4mm 3mm; margin: 0.4mm; font-family: "native:MainLight"; font-size: 2.6mm; } +SkinDesignerGhostButtonDark.pressed { + color: #4d86ff; + background: transparent; + padding: 1.4mm 3mm; + margin: 0.4mm; + font-family: "native:MainLight"; + font-size: 2.6mm; +} + SkinDesignerIconButton { color: #7f8aa3; background: transparent; - border: none; - padding: 0.6mm; + padding: 1.2mm; margin: 0; - font-size: 2.4mm; + font-size: 2.8mm; +} +SkinDesignerIconButton.pressed { + color: #2f6bff; + background: transparent; + padding: 1.2mm; + margin: 0; + font-size: 2.8mm; } SkinDesignerIconButtonDark { color: #a8b8da; background: transparent; + padding: 1.2mm; + margin: 0; + font-size: 2.8mm; +} +SkinDesignerIconButtonDark.pressed { + color: #4d86ff; + background: transparent; + padding: 1.2mm; + margin: 0; + font-size: 2.8mm; +} + +/* Transparent overlay button covering a clickable card via LayeredLayout. + * No background, no border, no padding — it just sits on top and absorbs + * pointer events so the entire card is one tap target inside scrollable + * parents (where addPointerReleasedListener on a Container was unreliable). */ +SkinDesignerCardOverlay { + background: transparent; + color: transparent; border: none; - padding: 0.6mm; + padding: 0; margin: 0; - font-size: 2.4mm; + font-size: 0.5mm; +} +SkinDesignerCardOverlay.pressed { + background: rgba(47,107,255,0.05); + color: transparent; + border: none; + padding: 0; + margin: 0; + font-size: 0.5mm; +} +SkinDesignerCardOverlayDark { + background: transparent; + color: transparent; + border: none; + padding: 0; + margin: 0; + font-size: 0.5mm; +} +SkinDesignerCardOverlayDark.pressed { + background: rgba(77,134,255,0.08); + color: transparent; + border: none; + padding: 0; + margin: 0; + font-size: 0.5mm; } SkinDesignerFooter { background: #ffffff; border-top: 1px solid #d9dee8; - padding: 1.2mm 2.4mm; + padding: 2mm 3.2mm; } SkinDesignerFooterDark { background: #102b66; border-top: 1px solid #4c6ea8; - padding: 1.2mm 2.4mm; + padding: 2mm 3.2mm; } /* --- Search / filter chips ------------------------------------------ */ @@ -436,45 +513,78 @@ SkinDesignerFilterRow { } SkinDesignerFilterRowDark { background: transparent; padding: 0; margin: 0; } +/* Filter chips — small enough that cn1-pill-border draws a true pill. */ SkinDesignerFilterTag { + cn1-pill-border: 1; color: #7f8aa3; background: #ffffff; - border: 1px solid #d9dee8; - border-radius: 6mm; - padding: 0.6mm 2mm; - margin: 0.3mm; + padding: 1.2mm 3.2mm; + margin: 0.6mm; font-family: "native:MainLight"; - font-size: 2.4mm; + font-size: 2.6mm; +} +SkinDesignerFilterTag.pressed { + cn1-pill-border: 1; + color: #112247; + background: #e8eef9; + padding: 1.2mm 3.2mm; + margin: 0.6mm; + font-family: "native:MainLight"; + font-size: 2.6mm; } SkinDesignerFilterTagDark { + cn1-pill-border: 1; color: #a8b8da; background: #102b66; - border: 1px solid #4c6ea8; - border-radius: 6mm; - padding: 0.6mm 2mm; - margin: 0.3mm; + padding: 1.2mm 3.2mm; + margin: 0.6mm; font-family: "native:MainLight"; - font-size: 2.4mm; + font-size: 2.6mm; +} +SkinDesignerFilterTagDark.pressed { + cn1-pill-border: 1; + color: #f5f8ff; + background: #163575; + padding: 1.2mm 3.2mm; + margin: 0.6mm; + font-family: "native:MainLight"; + font-size: 2.6mm; } SkinDesignerFilterTagActive { + cn1-pill-border: 1; color: #ffffff; background: #2f6bff; - border: 1px solid #2f6bff; - border-radius: 6mm; - padding: 0.6mm 2mm; - margin: 0.3mm; + padding: 1.2mm 3.2mm; + margin: 0.6mm; font-family: "native:MainBold"; - font-size: 2.4mm; + font-size: 2.6mm; +} +SkinDesignerFilterTagActive.pressed { + cn1-pill-border: 1; + color: #ffffff; + background: #1f4ec9; + padding: 1.2mm 3.2mm; + margin: 0.6mm; + font-family: "native:MainBold"; + font-size: 2.6mm; } SkinDesignerFilterTagActiveDark { + cn1-pill-border: 1; color: #ffffff; background: #4d86ff; - border: 1px solid #4d86ff; - border-radius: 6mm; - padding: 0.6mm 2mm; - margin: 0.3mm; + padding: 1.2mm 3.2mm; + margin: 0.6mm; font-family: "native:MainBold"; - font-size: 2.4mm; + font-size: 2.6mm; +} +SkinDesignerFilterTagActiveDark.pressed { + cn1-pill-border: 1; + color: #ffffff; + background: #2f6bff; + padding: 1.2mm 3.2mm; + margin: 0.6mm; + font-family: "native:MainBold"; + font-size: 2.6mm; } SkinDesignerGroupLabel { @@ -489,46 +599,42 @@ SkinDesignerGroupLabelDark { color: #a8b8da; font-size: 2.2mm; font-family: "nat SkinDesignerCardRow { background: transparent; - padding: 0 0.5mm; - margin: 0; + padding: 0 1.4mm; + margin: 0.6mm 0; } -SkinDesignerCardRowDark { background: transparent; padding: 0 0.5mm; margin: 0; } +SkinDesignerCardRowDark { background: transparent; padding: 0 1.4mm; margin: 0.6mm 0; } /* --- Device cards --------------------------------------------------- */ SkinDesignerDeviceGrid { background: transparent; - padding: 0 2mm; + padding: 0 4mm 4mm 4mm; } -SkinDesignerDeviceGridDark { background: transparent; padding: 0 2mm; } +SkinDesignerDeviceGridDark { background: transparent; padding: 0 4mm 4mm 4mm; } SkinDesignerDeviceCard { background: #ffffff; border: 1px solid #d9dee8; - border-radius: 2.4mm; - padding: 1.6mm; - margin: 0.5mm; + padding: 4mm 4mm 4mm 4mm; + margin: 1.6mm; } SkinDesignerDeviceCardDark { background: #102b66; border: 1px solid #4c6ea8; - border-radius: 2.4mm; - padding: 1.6mm; - margin: 0.5mm; + padding: 4mm 4mm 4mm 4mm; + margin: 1.6mm; } SkinDesignerDeviceCardSelected { background: #ffffff; border: 2px solid #2f6bff; - border-radius: 2.4mm; - padding: 1.6mm; - margin: 0.5mm; + padding: 4mm 4mm 4mm 4mm; + margin: 1.6mm; } SkinDesignerDeviceCardSelectedDark { background: #102b66; border: 2px solid #4d86ff; - border-radius: 2.4mm; - padding: 1.6mm; - margin: 0.5mm; + padding: 4mm 4mm 4mm 4mm; + margin: 1.6mm; } SkinDesignerOsMark { @@ -591,23 +697,21 @@ SkinDesignerDeviceCheckDark { SkinDesignerSourceRow { background: transparent; - padding: 1mm 4mm; + padding: 4mm 6mm; } -SkinDesignerSourceRowDark { background: transparent; padding: 1mm 4mm; } +SkinDesignerSourceRowDark { background: transparent; padding: 4mm 6mm; } SkinDesignerSourceCard { background: #ffffff; border: 1px solid #d9dee8; - border-radius: 3mm; - padding: 4mm; - margin: 1mm; + padding: 8mm 6mm; + margin: 3mm; } SkinDesignerSourceCardDark { background: #102b66; border: 1px solid #4c6ea8; - border-radius: 3mm; - padding: 4mm; - margin: 1mm; + padding: 8mm 6mm; + margin: 3mm; } SkinDesignerSourceIll { diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 544aa20821..46bf6b11bc 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -83,6 +83,10 @@ public void runApp() { form = new Form("Skin Designer", new BorderLayout()); form.setUIID("SkinDesignerForm"); form.setTitle(""); + // The Form's default Toolbar otherwise sits above our custom topbar + // showing an empty title strip — hide it so the topbar is the only + // header. + form.getToolbar().setHidden(true); loadState(); @@ -165,8 +169,9 @@ private void restart() { // ==================================================================== private Container buildHeader() { - Label logo = new Label("CN1"); + Label logo = new Label(); logo.setUIID("SkinDesignerBrandLogo"); + FontImage.setMaterialIcon(logo, FontImage.MATERIAL_PHONE_IPHONE); Label title = new Label("Skin Designer"); title.setUIID("SkinDesignerBrandTitle"); Container brand = BoxLayout.encloseX(logo, title); @@ -195,25 +200,35 @@ private void rebuildStepper() { String[] labels = { "Device", "Start from", "Editor", "Save" }; for (int i = 0; i < labels.length; i++) { if (i > 0) { - Label sep = new Label(" "); - sep.setUIID("SkinDesignerStepperSep"); - stepperRow.add(sep); - } - String state = i == step ? "Active" : (i < step ? "Done" : "Pending"); - Label num = new Label(i < step ? "" : String.valueOf(i + 1)); - num.setUIID("SkinDesignerStepperNum" + state); - if (i < step) { - FontImage.setMaterialIcon(num, FontImage.MATERIAL_CHECK); + stepperRow.add(buildStepperSep()); } + int state = (i == step) ? CircleBadge.STATE_ACTIVE + : (i < step ? CircleBadge.STATE_DONE : CircleBadge.STATE_PENDING); + CircleBadge badge = new CircleBadge(i + 1, state, websiteDarkMode); + String labelUiid = (i == step) ? "SkinDesignerStepperLabelActive" + : (i < step ? "SkinDesignerStepperLabelDone" : "SkinDesignerStepperLabelPending"); Label text = new Label(labels[i]); - text.setUIID("SkinDesignerStepperLabel" + state); - Container item = BoxLayout.encloseX(num, text); - item.setUIID("SkinDesignerStepperItem" + state); + text.setUIID(labelUiid); + Container item = BoxLayout.encloseX(badge, text); + String itemUiid = (i == step) ? "SkinDesignerStepperItemActive" + : (i < step ? "SkinDesignerStepperItemDone" : "SkinDesignerStepperItemPending"); + item.setUIID(itemUiid); stepperRow.add(item); } stepperRow.revalidate(); } + /** A wide, short horizontal line between stepper items. The component is + * a colored block (no custom paint), sized via UIID, so BoxLayout always + * draws a horizontal bar regardless of how it tries to stretch us. */ + private Component buildStepperSep() { + Label sep = new Label(" "); + sep.setUIID("SkinDesignerStepperSep"); + sep.setPreferredW(CN.convertToPixels(6)); + sep.setPreferredH(CN.convertToPixels(0.5f)); + return sep; + } + private void rebuildWizardNav() { if (wizardNav == null) { return; @@ -295,6 +310,15 @@ private void goToStep(int s) { // Step 0 — pick device // ==================================================================== + /** Cap on cards rendered at once. The full DB has 5000+ entries; rendering + * them all on the EDT freezes the UI for several seconds. Users narrow + * via search/filter to find what's missing. Kept low so even slow + * platforms stay responsive on a filter switch. */ + private static final int DEVICE_GRID_LIMIT = 60; + + private Label deviceCountLabel; + private UITimer searchDebounce; + private Container buildDeviceStep() { Container root = new Container(new BorderLayout()); root.setUIID("SkinDesignerStepRoot"); @@ -322,8 +346,19 @@ private Container buildDeviceStep() { grid.setUIID("SkinDesignerDeviceGrid"); grid.setScrollableY(true); + deviceCountLabel = new Label(""); + deviceCountLabel.setUIID("SkinDesignerEmptyHint"); + Runnable refresh = () -> rebuildDeviceGrid(grid, search.getText(), activeFilter[0]); + // Debounce search keystrokes so we don't rebuild 5k cards on each char. + Runnable debouncedRefresh = () -> { + if (searchDebounce != null) { + searchDebounce.cancel(); + } + searchDebounce = UITimer.timer(180, false, form, refresh); + }; + for (int i = 0; i < filterIds.length; i++) { final String id = filterIds[i]; Button b = new Button(filterLabels[i]); @@ -333,16 +368,21 @@ private Container buildDeviceStep() { for (int j = 0; j < filters.length; j++) { filters[j].setUIID(filterIds[j].equals(id) ? "SkinDesignerFilterTagActive" : "SkinDesignerFilterTag"); } - refresh.run(); + // Repaint the chip change immediately, then defer the (slow) + // grid rebuild to the next event-loop tick so the press + // visual lands first. + filterRow.revalidate(); + CN.callSerially(refresh); }); filters[i] = b; filterRow.add(b); } search.addActionListener(e -> refresh.run()); - search.addDataChangedListener((type, index) -> refresh.run()); + search.addDataChangedListener((type, index) -> debouncedRefresh.run()); - Container topInner = BoxLayout.encloseY(heading, FlowLayout.encloseCenter(search), filterRow); + Container topInner = BoxLayout.encloseY(heading, FlowLayout.encloseCenter(search), filterRow, + FlowLayout.encloseCenter(deviceCountLabel)); topInner.setUIID("SkinDesignerStepHeadInner"); // Footer with Continue button @@ -376,10 +416,38 @@ private Container buildDeviceStep() { private void rebuildDeviceGrid(Container grid, String query, String filter) { grid.removeAll(); - Map> grouped = new LinkedHashMap<>(); + + // First pass: collect matching devices (DB is already sorted year-desc). + List matched = new ArrayList<>(); + int totalMatched = 0; for (DeviceDatabase.Device d : DeviceDatabase.all()) { if (!d.matchesFormFilter(filter)) continue; if (!d.matchesQuery(query)) continue; + totalMatched++; + if (matched.size() < DEVICE_GRID_LIMIT) { + matched.add(d); + } + } + + if (deviceCountLabel != null) { + if (totalMatched == 0) { + deviceCountLabel.setText("No devices match"); + } else if (totalMatched <= matched.size()) { + deviceCountLabel.setText(totalMatched + " device" + (totalMatched == 1 ? "" : "s")); + } else { + deviceCountLabel.setText("Showing " + matched.size() + " of " + totalMatched + + " — type to narrow"); + } + } + + if (matched.isEmpty()) { + grid.revalidate(); + return; + } + + // Group by brand, preserving order (already year-desc within DB). + Map> grouped = new LinkedHashMap<>(); + for (DeviceDatabase.Device d : matched) { List bucket = grouped.get(d.brand); if (bucket == null) { bucket = new ArrayList<>(); @@ -387,21 +455,15 @@ private void rebuildDeviceGrid(Container grid, String query, String filter) { } bucket.add(d); } - if (grouped.isEmpty()) { - Label none = new Label("No devices match"); - none.setUIID("SkinDesignerEmptyHint"); - grid.add(none); - grid.revalidate(); - return; - } + + int columns = Math.max(1, gridColumns()); for (Map.Entry> entry : grouped.entrySet()) { Label brand = new Label(entry.getKey() + " · " + entry.getValue().size()); brand.setUIID("SkinDesignerGroupLabel"); grid.add(brand); - Container row = new Container(new GridLayout(1, Math.max(1, gridColumns()))); + Container row = new Container(new GridLayout(1, columns)); row.setUIID("SkinDesignerCardRow"); int col = 0; - int columns = Math.max(1, gridColumns()); for (DeviceDatabase.Device d : entry.getValue()) { if (col >= columns) { grid.add(row); @@ -412,7 +474,6 @@ private void rebuildDeviceGrid(Container grid, String query, String filter) { row.add(buildDeviceCard(d)); col++; } - // pad row so last items align left while (col < columns) { row.add(new Label(" ")); col++; @@ -456,8 +517,7 @@ private Container buildDeviceCard(DeviceDatabase.Device d) { spec.setUIID("SkinDesignerDeviceSpec"); card.add(spec); - card.setLeadComponent(name); - card.addPointerReleasedListener(e -> { + return makeClickable(card, e -> { device = d; skin.resetForDevice(d); Button cont = (Button) bodyHolder.getClientProperty("deviceContinue"); @@ -466,7 +526,33 @@ private Container buildDeviceCard(DeviceDatabase.Device d) { } renderStep(); }); - return card; + } + + /** + * Wraps a card's content in a {@link LayeredLayout} container with a + * transparent {@link Button} overlay on top. The overlay is a real + * Button so it participates in CN1's scroll-vs-tap detection inside + * scrollable parents, where {@code addPointerReleasedListener} on a + * plain Container was getting swallowed by the scroll layer. + * + * The overlay also picks up Button's standard pressed/disabled visual + * states for free. + */ + private static Container makeClickable(Container content, com.codename1.ui.events.ActionListener listener) { + // Preserve the content's UIID so the wrapper looks like the card. + String uiid = content.getUIID(); + Container layered = new Container(new LayeredLayout()); + layered.setUIID(uiid); + // Reset content's UIID so its background/border don't double up on + // top of the wrapper. + content.setUIID("Container"); + layered.add(content); + + Button overlay = new Button(""); + overlay.setUIID("SkinDesignerCardOverlay"); + overlay.addActionListener(listener); + layered.add(overlay); + return layered; } // ==================================================================== @@ -532,8 +618,7 @@ private Container buildSourceCard(String title, String desc, char icon, String s p.setUIID("SkinDesignerSourceP"); card.add(p); - card.setLeadComponent(h3); - card.addPointerReleasedListener(e -> { + return makeClickable(card, e -> { source = sourceId; if (SkinModel.SOURCE_BLANK.equals(sourceId)) { skin.cutouts.clear(); @@ -548,7 +633,6 @@ private Container buildSourceCard(String title, String desc, char icon, String s } goToStep(STEP_EDIT); }); - return card; } // ==================================================================== @@ -737,15 +821,13 @@ private Container buildPresetTile(String id, String label) { Label lbl = new Label(label); lbl.setUIID("SkinDesignerPresetLabel"); tile.add(lbl); - tile.setLeadComponent(lbl); - tile.addPointerReleasedListener(e -> { + return makeClickable(tile, e -> { applyPreset(id); rebuildSidebarBody(); livePreview.setSkin(skin); livePreview.repaint(); saveState(); }); - return tile; } private void applyPreset(String id) { @@ -816,12 +898,25 @@ private Container buildCutoutRow(int idx) { boolean sel = idx == selectedCutout; Container row = new Container(new BorderLayout()); row.setUIID(sel ? "SkinDesignerCutoutRowSelected" : "SkinDesignerCutoutRow"); + Label sw = new Label(" "); sw.setUIID("SkinDesignerCutoutSwatch"); Label name = new Label(c.name); name.setUIID("SkinDesignerCutoutName"); Label type = new Label(c.type); type.setUIID("SkinDesignerCutoutType"); + + // Selectable left half (swatch + name + type chip) — clickable as one unit + Container selectArea = new Container(new BorderLayout()); + selectArea.setUIID("Container"); + selectArea.add(BorderLayout.WEST, BoxLayout.encloseX(sw, name)); + selectArea.add(BorderLayout.EAST, type); + makeClickable(selectArea, e -> { + selectedCutout = (selectedCutout == idx) ? -1 : idx; + rebuildCutoutList(); + }); + + // The X button stays an independent Button so it can fire on its own Button rm = new Button(); rm.setUIID("SkinDesignerIconButton"); FontImage.setMaterialIcon(rm, FontImage.MATERIAL_CLOSE); @@ -833,15 +928,9 @@ private Container buildCutoutRow(int idx) { rebuildSidebarBody(); livePreview.repaint(); }); - Container left = BoxLayout.encloseX(sw, name); - Container right = BoxLayout.encloseX(type, rm); - row.add(BorderLayout.WEST, left); - row.add(BorderLayout.EAST, right); - row.setLeadComponent(name); - row.addPointerReleasedListener(e -> { - selectedCutout = (selectedCutout == idx) ? -1 : idx; - rebuildCutoutList(); - }); + + row.add(BorderLayout.CENTER, selectArea); + row.add(BorderLayout.EAST, rm); return row; } @@ -1458,6 +1547,106 @@ private String themedUiid(String uiid, boolean dark) { return uiid.endsWith("Dark") ? uiid.substring(0, uiid.length() - 4) : uiid; } + // ==================================================================== + // Stepper badge — guaranteed circle with centered digit / check + // ==================================================================== + + /** + * A real circle (filled disc) with the step number or a check mark drawn + * in the middle. Avoids relying on cn1-pill-border + Label sizing, which + * was producing oversized horizontal pills with the digit cropped or + * floating off-center. + */ + static final class CircleBadge extends Component { + static final int STATE_PENDING = 0; + static final int STATE_ACTIVE = 1; + static final int STATE_DONE = 2; + + private final int number; + private final int state; + private final boolean dark; + + CircleBadge(int number, int state, boolean dark) { + this.number = number; + this.state = state; + this.dark = dark; + setUIID("Container"); + setFocusable(false); + } + + @Override + protected com.codename1.ui.geom.Dimension calcPreferredSize() { + int diameter = CN.convertToPixels(4.6f); + return new com.codename1.ui.geom.Dimension(diameter, diameter); + } + + @Override + public void paint(Graphics g) { + int diameter = Math.min(getWidth(), getHeight()); + int cx = getX() + (getWidth() - diameter) / 2; + int cy = getY() + (getHeight() - diameter) / 2; + + int fill, fg; + switch (state) { + case STATE_ACTIVE: + fill = dark ? 0x4d86ff : 0x2f6bff; + fg = 0xffffff; + break; + case STATE_DONE: + fill = 0xb8d532; + fg = dark ? 0x0a2460 : 0x112247; + break; + case STATE_PENDING: + default: + fill = dark ? 0x4c6ea8 : 0xd9dee8; + fg = dark ? 0x102b66 : 0xffffff; + break; + } + + int oldColor = g.getColor(); + int oldAlpha = g.getAlpha(); + boolean oldAA = g.isAntiAliased(); + g.setAntiAliased(true); + g.setColor(fill); + g.fillArc(cx, cy, diameter, diameter, 0, 360); + + g.setColor(fg); + if (state == STATE_DONE) { + int pad = diameter / 4; + int x0 = cx + pad; + int y0 = cy + diameter / 2; + int xm = cx + diameter * 7 / 16; + int ym = cy + diameter - pad - 1; + int x1 = cx + diameter - pad; + int y1 = cy + pad + 1; + int stroke = Math.max(1, diameter / 9); + drawThickLine(g, x0, y0, xm, ym, stroke); + drawThickLine(g, xm, ym, x1, y1, stroke); + } else { + String text = String.valueOf(number); + com.codename1.ui.Font f = g.getFont(); + if (f != null) { + int tw = f.stringWidth(text); + int th = f.getHeight(); + int tx = cx + (diameter - tw) / 2; + int ty = cy + (diameter - th) / 2; + g.drawString(text, tx, ty); + } + } + g.setAntiAliased(oldAA); + g.setAlpha(oldAlpha); + g.setColor(oldColor); + } + + private static void drawThickLine(Graphics g, int x0, int y0, int x1, int y1, int thick) { + for (int dx = -thick / 2; dx <= thick / 2; dx++) { + for (int dy = -thick / 2; dy <= thick / 2; dy++) { + g.drawLine(x0 + dx, y0 + dy, x1 + dx, y1 + dy); + } + } + } + } + // ==================================================================== // Preset icons // ==================================================================== diff --git a/scripts/skindesigner/tools/devicedb/build_devices_json.py b/scripts/skindesigner/tools/devicedb/build_devices_json.py index 642f5cdd46..cc225dd515 100755 --- a/scripts/skindesigner/tools/devicedb/build_devices_json.py +++ b/scripts/skindesigner/tools/devicedb/build_devices_json.py @@ -342,15 +342,62 @@ def load_existing(path: str) -> list[dict]: return [] +RE_LATEST_LINK = re.compile( + r']*>\s*]*alt="([^"]+)"[^>]*>\s*', + re.I, +) + + +def walk_latest(*, max_pages: int = 1, delay: float = 1.0) -> Iterable[tuple[str, str, str]]: + """Yields (phone_url, brand, model) from latest-mobiles.php3. + + The "latest" page lists newly-added devices across every brand. It's the + cheapest source of fresh data — one or two listing pages cover the last + few weeks of releases. + """ + seen_pages: set[str] = set() + queue: list[str] = ["latest-mobiles.php3"] + pages_fetched = 0 + while queue and pages_fetched < max_pages: + page = queue.pop(0) + if page in seen_pages: + continue + seen_pages.add(page) + pages_fetched += 1 + try: + html = http_get(BASE + page, delay=delay) + except RuntimeError as err: + sys.stderr.write(f" ! latest page {page} failed: {err}\n") + continue + for m in RE_LATEST_LINK.finditer(html): + phone_url = m.group(1) + if phone_url.endswith("-review.php"): + continue + alt = unescape(m.group(2)).strip() + # alt is " "; split on first space to recover. + parts = alt.split(" ", 1) + brand = parts[0] if parts else "Unknown" + model = parts[1] if len(parts) > 1 else alt + yield phone_url, brand, model + # Pagination: latest-mobiles-pN.php + for m in RE_NAV_PAGE.finditer(html): + np = m.group(1) + if np.startswith("latest-mobiles") and np not in seen_pages: + queue.append(np) + + def main() -> int: ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument("--mode", choices=("brands", "latest"), default="brands", + help="brands = walk per-brand listings (large/slow); " + "latest = scrape recent additions only (fast/trickle)") ap.add_argument("--brands", default=",".join(DEFAULT_BRANDS), help="Comma-separated brand slugs (no .php). Use --full to walk all brands instead.") ap.add_argument("--full", action="store_true", - help="Discover and walk every brand on makers.php3") + help="Discover and walk every brand on makers.php3 (only with --mode brands)") ap.add_argument("--max-pages", type=int, default=10, - help="Cap on brand-list pages walked per brand") + help="Cap on listing pages walked per brand (or per latest run)") ap.add_argument("--min-year", type=int, default=2014, help="Drop devices announced before this year") ap.add_argument("--delay", type=float, default=1.0, @@ -363,33 +410,16 @@ def main() -> int: args = ap.parse_args() use_cache = not args.no_cache - - if args.full: - sys.stderr.write("Discovering all brands…\n") - all_brands = discover_brands() - # Each entry is (slug, label); keep only phone-list slugs - target = [(s, l) for s, l in all_brands if s.endswith(tuple(f"-{i}" for i in range(1000)))] - if not target: - target = all_brands - else: - slugs = [b.strip() for b in args.brands.split(",") if b.strip()] - # Try to resolve labels via discover_brands; fall back to slug-based label - try: - label_map = dict(discover_brands()) - except Exception: - label_map = {} - target = [(s, brand_label_from_slug(s, label_map)) for s in slugs] - - sys.stderr.write(f"Scraping {len(target)} brand(s) at {args.delay}s/request…\n") - existing = load_existing(args.out) fresh: list[dict] = [] seen: set[str] = set() total_phones = 0 - for slug, label in target: - sys.stderr.write(f"\n=== {label} [{slug}] ===\n") - for url, model in walk_brand(slug, max_pages=args.max_pages, delay=args.delay): + if args.mode == "latest": + sys.stderr.write(f"Trickle-scraping latest-mobiles " + f"(max-pages={args.max_pages}, limit={args.limit or 'none'}, " + f"delay={args.delay}s)…\n") + for url, brand, model in walk_latest(max_pages=args.max_pages, delay=args.delay): if url in seen: continue seen.add(url) @@ -399,15 +429,51 @@ def main() -> int: sys.stderr.write(f" ! skip {url}: {err}\n") continue specs = parse_phone_page(html) - rec = normalise(label, model, specs) + rec = normalise(brand, model, specs) if rec is not None and rec["year"] >= args.min_year: fresh.append(rec) total_phones += 1 if args.limit and total_phones >= args.limit: sys.stderr.write(f" · hit --limit {args.limit}, stopping\n") break - if args.limit and total_phones >= args.limit: - break + else: + if args.full: + sys.stderr.write("Discovering all brands…\n") + all_brands = discover_brands() + target = [(s, l) for s, l in all_brands if s.endswith(tuple(f"-{i}" for i in range(1000)))] + if not target: + target = all_brands + else: + slugs = [b.strip() for b in args.brands.split(",") if b.strip()] + try: + label_map = dict(discover_brands()) + except Exception: + label_map = {} + target = [(s, brand_label_from_slug(s, label_map)) for s in slugs] + + sys.stderr.write(f"Scraping {len(target)} brand(s) at {args.delay}s/request…\n") + + for slug, label in target: + sys.stderr.write(f"\n=== {label} [{slug}] ===\n") + for url, model in walk_brand(slug, max_pages=args.max_pages, delay=args.delay): + if url in seen: + continue + seen.add(url) + try: + html = http_get(BASE + url, delay=args.delay, use_cache=use_cache) + except RuntimeError as err: + sys.stderr.write(f" ! skip {url}: {err}\n") + continue + specs = parse_phone_page(html) + rec = normalise(label, model, specs) + if rec is not None and rec["year"] >= args.min_year: + fresh.append(rec) + total_phones += 1 + if args.limit and total_phones >= args.limit: + sys.stderr.write(f" · hit --limit {args.limit}, stopping\n") + break + if args.limit and total_phones >= args.limit: + break merged = merge(existing, fresh) merged.sort(key=lambda r: (-(r["year"] or 0), r["brand"].lower(), r["name"].lower())) From 9846be4d3e159617a387bc682fa9795f093dbb1b Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sat, 2 May 2026 18:57:15 +0300 Subject: [PATCH 33/55] Skin Designer device + source step polish (round borders, scroll-stable selection) Stepper: - Active step gets a translucent blue pill behind it again (cn1-pill-border + e8f0ff bg) so the user can tell which step they're on without reading. - Number badges go back to a Label sized to a fixed square in code with cn1-pill-border, which renders as a true circle and centers the digit via the label's intrinsic text alignment. Removed the custom CircleBadge painter that was producing badly-aligned numbers. - Done check uses a smaller, lighter ring (e8f3c8 / 6e8a1a) and a finer check icon at 2.6mm rather than the heavy lime disc. Header text: - H1 dropped from MainBold to MainMedium and 5.6mm -> 5.0mm; sub goes from text-muted (#7f8aa3) to a darker #4a5775 so it's actually readable; H3 also drops to MainMedium. - "Which device is this skin for?" sits closer to the topbar now (StepHead padding-top 4mm -> 2mm). - Sub uses a non-editable TextArea so the full second sentence ("...so you can focus on the skin shape") wraps properly instead of being clipped. Search field: - setHintIcon with the magnifier glyph (MATERIAL_SEARCH). - cn1-round-border 1.4mm so the field matches the design. Filter chips (All / Phones / Tablets / Foldables): - Padding tightened (1.2mm -> 0.8mm vertical, 3.2mm -> 2.4mm horizontal). Device cards: - cn1-round-border 2mm; 2.4mm padding; 1mm margin (was 4mm/1.6mm). - Use MATERIAL_APPLE / MATERIAL_ANDROID brand glyphs in the OS mark instead of the silhouette phone icons that read as identical at this size. - Selecting a device used to call renderStep() which rebuilt the body and jumped the scroll. selectDevice() now toggles only the affected cards' UIIDs in place via stored card / check / deviceId client properties. - The selected check icon is always part of the layout (visibility-only toggle) so the row width doesn't shift when selection changes. - OS mark gets a rounded background and the brand glyph at 3.2mm. Source step: - "Build a skin for ." now renders the device name in bold via a three-Label FlowLayout row (prefix + bold + suffix) so the full sentence is visible. - Card descriptions go through a non-editable TextArea so the full two- sentence text wraps cleanly. Updated to the exact strings the user asked for ("...from there.", etc.). - Cards: cn1-round-border 3mm + .pressed state with a translucent blue fill (closest CN1 CSS-subset analog to :hover, which doesn't exist in the compiler today). Inner illustration also gets cn1-round-border 2mm. Done step: - Added a "Save again" Button so the user can re-trigger the .skin file download if the browser blocked the auto-download or they just want another copy. Button is disabled when no skin bytes are cached. - Renamed "New skin" -> "Make another skin" and gave it a refresh icon. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../common/src/main/css/theme.css | 336 ++++++++++++------ .../tools/skindesigner/SkinDesigner.java | 282 +++++++-------- 2 files changed, 372 insertions(+), 246 deletions(-) diff --git a/scripts/skindesigner/common/src/main/css/theme.css b/scripts/skindesigner/common/src/main/css/theme.css index da498dc9bd..fee5246b88 100644 --- a/scripts/skindesigner/common/src/main/css/theme.css +++ b/scripts/skindesigner/common/src/main/css/theme.css @@ -91,77 +91,148 @@ SkinDesignerStepper { } SkinDesignerStepperDark { background: transparent; padding: 0; } -/* Step item — number-badge + label side-by-side. The badge is painted by - * the CircleBadge custom component (always a true circle), so the item - * itself just needs a transparent background and a little breathing room. */ -SkinDesignerStepperItemActive, +/* Step item — number-badge + label side-by-side. The active step gets a + * translucent blue pill behind it so the user sees where they are in the + * wizard at a glance. */ +SkinDesignerStepperItemActive { + cn1-pill-border: 1; + background: #e8f0ff; + padding: 0.8mm 2.4mm; + margin: 0 0.6mm; +} +SkinDesignerStepperItemActiveDark { + cn1-pill-border: 1; + background: #1c3a7a; + padding: 0.8mm 2.4mm; + margin: 0 0.6mm; +} SkinDesignerStepperItemDone, SkinDesignerStepperItemPending { background: transparent; - padding: 1mm 2.4mm; + padding: 0.8mm 2.4mm; margin: 0 0.6mm; } -SkinDesignerStepperItemActiveDark, SkinDesignerStepperItemDoneDark, SkinDesignerStepperItemPendingDark { background: transparent; - padding: 1mm 2.4mm; + padding: 0.8mm 2.4mm; margin: 0 0.6mm; } +/* Number badges — Label sized to a square in code, cn1-pill-border draws a + * true circle, padding kept symmetric so the digit lands centered. */ +SkinDesignerStepperNumActive { + cn1-pill-border: 1; + background: #2f6bff; + color: #ffffff; + padding: 0; + margin: 0 1.2mm 0 0; + font-size: 2.6mm; + font-family: "native:MainBold"; + text-align: center; +} +SkinDesignerStepperNumActiveDark { + cn1-pill-border: 1; + background: #4d86ff; + color: #ffffff; + padding: 0; + margin: 0 1.2mm 0 0; + font-size: 2.6mm; + font-family: "native:MainBold"; + text-align: center; +} +SkinDesignerStepperNumDone { + cn1-pill-border: 1; + background: #b8d532; + color: #112247; + padding: 0; + margin: 0 1.2mm 0 0; + font-size: 2.4mm; + font-family: "native:MainBold"; + text-align: center; +} +SkinDesignerStepperNumDoneDark { + cn1-pill-border: 1; + background: #b8d532; + color: #0a2460; + padding: 0; + margin: 0 1.2mm 0 0; + font-size: 2.4mm; + font-family: "native:MainBold"; + text-align: center; +} +SkinDesignerStepperNumPending { + cn1-pill-border: 1; + background: #d9dee8; + color: #ffffff; + padding: 0; + margin: 0 1.2mm 0 0; + font-size: 2.6mm; + font-family: "native:MainBold"; + text-align: center; +} +SkinDesignerStepperNumPendingDark { + cn1-pill-border: 1; + background: #4c6ea8; + color: #102b66; + padding: 0; + margin: 0 1.2mm 0 0; + font-size: 2.6mm; + font-family: "native:MainBold"; + text-align: center; +} + SkinDesignerStepperLabelActive { color: #2f6bff; font-size: 2.8mm; - font-family: "native:MainBold"; - padding: 0.4mm 0 0.4mm 1.2mm; + font-family: "native:MainMedium"; + padding: 0; } SkinDesignerStepperLabelActiveDark { color: #4d86ff; font-size: 2.8mm; - font-family: "native:MainBold"; - padding: 0.4mm 0 0.4mm 1.2mm; + font-family: "native:MainMedium"; + padding: 0; } SkinDesignerStepperLabelDone { color: #112247; font-size: 2.8mm; font-family: "native:MainLight"; - padding: 0.4mm 0 0.4mm 1.2mm; + padding: 0; } SkinDesignerStepperLabelDoneDark { color: #f5f8ff; font-size: 2.8mm; font-family: "native:MainLight"; - padding: 0.4mm 0 0.4mm 1.2mm; + padding: 0; } SkinDesignerStepperLabelPending { color: #7f8aa3; font-size: 2.8mm; font-family: "native:MainLight"; - padding: 0.4mm 0 0.4mm 1.2mm; + padding: 0; } SkinDesignerStepperLabelPendingDark { color: #a8b8da; font-size: 2.8mm; font-family: "native:MainLight"; - padding: 0.4mm 0 0.4mm 1.2mm; + padding: 0; } -/* Horizontal line between stepper items. Solid background + tiny preferred - * height in code (set in buildStepperSep) so BoxLayout always lays it out - * as a thin horizontal bar. */ +/* Horizontal line between stepper items. */ SkinDesignerStepperSep { background: #d9dee8; color: transparent; font-size: 0.5mm; padding: 0; - margin: 1.2mm 0.4mm; + margin: 1.4mm 0.4mm; } SkinDesignerStepperSepDark { background: #4c6ea8; color: transparent; font-size: 0.5mm; padding: 0; - margin: 1.2mm 0.4mm; + margin: 1.4mm 0.4mm; } SkinDesignerWizardNav { background: transparent; padding: 0; } @@ -205,12 +276,12 @@ SkinDesignerStepRootDark { background: #071b4d; padding: 0; } SkinDesignerStepHead { background: transparent; - padding: 8mm 4mm 3mm 4mm; + padding: 2mm 4mm 1mm 4mm; } -SkinDesignerStepHeadDark { background: transparent; padding: 8mm 4mm 3mm 4mm; } +SkinDesignerStepHeadDark { background: transparent; padding: 2mm 4mm 1mm 4mm; } -SkinDesignerStepHeadInner { background: transparent; padding: 0 0 4mm 0; } -SkinDesignerStepHeadInnerDark { background: transparent; padding: 0 0 4mm 0; } +SkinDesignerStepHeadInner { background: transparent; padding: 0 0 0.6mm 0; } +SkinDesignerStepHeadInnerDark { background: transparent; padding: 0 0 0.6mm 0; } SkinDesignerStepBody { background: transparent; @@ -226,44 +297,76 @@ SkinDesignerStepScrollDark { background: transparent; padding: 0; } SkinDesignerH1 { color: #112247; - font-size: 5.6mm; - font-family: "native:MainBold"; - padding: 0.6mm 0; + font-size: 5.0mm; + font-family: "native:MainMedium"; + padding: 0.4mm 0; + margin: 0; + background: transparent; text-align: center; } SkinDesignerH1Dark { color: #f5f8ff; - font-size: 5.6mm; - font-family: "native:MainBold"; - padding: 0.6mm 0; + font-size: 5.0mm; + font-family: "native:MainMedium"; + padding: 0.4mm 0; + margin: 0; + background: transparent; text-align: center; } SkinDesignerH3 { color: #112247; - font-size: 3.6mm; - font-family: "native:MainBold"; + font-size: 3.4mm; + font-family: "native:MainMedium"; padding: 0.4mm 0; + margin: 0; + background: transparent; } SkinDesignerH3Dark { color: #f5f8ff; - font-size: 3.6mm; - font-family: "native:MainBold"; + font-size: 3.4mm; + font-family: "native:MainMedium"; padding: 0.4mm 0; + margin: 0; + background: transparent; } SkinDesignerSub { - color: #7f8aa3; + color: #4a5775; + background: transparent; + border: none; font-size: 2.8mm; font-family: "native:MainLight"; - padding: 0.4mm 0 1mm 0; + padding: 0; + margin: 0; text-align: center; } SkinDesignerSubDark { - color: #a8b8da; + color: #c8d4ee; + background: transparent; + border: none; font-size: 2.8mm; font-family: "native:MainLight"; - padding: 0.4mm 0 1mm 0; + padding: 0; + margin: 0; text-align: center; } +SkinDesignerSubBold { + color: #112247; + background: transparent; + border: none; + font-size: 2.8mm; + font-family: "native:MainBold"; + padding: 0; + margin: 0; +} +SkinDesignerSubBoldDark { + color: #f5f8ff; + background: transparent; + border: none; + font-size: 2.8mm; + font-family: "native:MainBold"; + padding: 0; + margin: 0; +} /* --- Buttons --------------------------------------------------------- */ @@ -486,21 +589,19 @@ SkinDesignerFooterDark { /* --- Search / filter chips ------------------------------------------ */ SkinDesignerSearchField { + cn1-round-border: 1.4mm; color: #112247; background: #ffffff; - border: 1px solid #d9dee8; - border-radius: 1.4mm; - padding: 1.2mm; + padding: 1.6mm 2.4mm; margin: 0.6mm; font-family: "native:MainLight"; font-size: 3mm; } SkinDesignerSearchFieldDark { + cn1-round-border: 1.4mm; color: #f5f8ff; background: #0e2a61; - border: 1px solid #4c6ea8; - border-radius: 1.4mm; - padding: 1.2mm; + padding: 1.6mm 2.4mm; margin: 0.6mm; font-family: "native:MainLight"; font-size: 3mm; @@ -518,8 +619,8 @@ SkinDesignerFilterTag { cn1-pill-border: 1; color: #7f8aa3; background: #ffffff; - padding: 1.2mm 3.2mm; - margin: 0.6mm; + padding: 0.8mm 2.4mm; + margin: 0.4mm; font-family: "native:MainLight"; font-size: 2.6mm; } @@ -527,8 +628,8 @@ SkinDesignerFilterTag.pressed { cn1-pill-border: 1; color: #112247; background: #e8eef9; - padding: 1.2mm 3.2mm; - margin: 0.6mm; + padding: 0.8mm 2.4mm; + margin: 0.4mm; font-family: "native:MainLight"; font-size: 2.6mm; } @@ -536,8 +637,8 @@ SkinDesignerFilterTagDark { cn1-pill-border: 1; color: #a8b8da; background: #102b66; - padding: 1.2mm 3.2mm; - margin: 0.6mm; + padding: 0.8mm 2.4mm; + margin: 0.4mm; font-family: "native:MainLight"; font-size: 2.6mm; } @@ -545,8 +646,8 @@ SkinDesignerFilterTagDark.pressed { cn1-pill-border: 1; color: #f5f8ff; background: #163575; - padding: 1.2mm 3.2mm; - margin: 0.6mm; + padding: 0.8mm 2.4mm; + margin: 0.4mm; font-family: "native:MainLight"; font-size: 2.6mm; } @@ -554,8 +655,8 @@ SkinDesignerFilterTagActive { cn1-pill-border: 1; color: #ffffff; background: #2f6bff; - padding: 1.2mm 3.2mm; - margin: 0.6mm; + padding: 0.8mm 2.4mm; + margin: 0.4mm; font-family: "native:MainBold"; font-size: 2.6mm; } @@ -563,8 +664,8 @@ SkinDesignerFilterTagActive.pressed { cn1-pill-border: 1; color: #ffffff; background: #1f4ec9; - padding: 1.2mm 3.2mm; - margin: 0.6mm; + padding: 0.8mm 2.4mm; + margin: 0.4mm; font-family: "native:MainBold"; font-size: 2.6mm; } @@ -572,8 +673,8 @@ SkinDesignerFilterTagActiveDark { cn1-pill-border: 1; color: #ffffff; background: #4d86ff; - padding: 1.2mm 3.2mm; - margin: 0.6mm; + padding: 0.8mm 2.4mm; + margin: 0.4mm; font-family: "native:MainBold"; font-size: 2.6mm; } @@ -581,8 +682,8 @@ SkinDesignerFilterTagActiveDark.pressed { cn1-pill-border: 1; color: #ffffff; background: #2f6bff; - padding: 1.2mm 3.2mm; - margin: 0.6mm; + padding: 0.8mm 2.4mm; + margin: 0.4mm; font-family: "native:MainBold"; font-size: 2.6mm; } @@ -613,46 +714,46 @@ SkinDesignerDeviceGrid { SkinDesignerDeviceGridDark { background: transparent; padding: 0 4mm 4mm 4mm; } SkinDesignerDeviceCard { + cn1-round-border: 2mm; background: #ffffff; - border: 1px solid #d9dee8; - padding: 4mm 4mm 4mm 4mm; - margin: 1.6mm; + padding: 2.4mm 2.6mm; + margin: 1mm; } SkinDesignerDeviceCardDark { + cn1-round-border: 2mm; background: #102b66; - border: 1px solid #4c6ea8; - padding: 4mm 4mm 4mm 4mm; - margin: 1.6mm; + padding: 2.4mm 2.6mm; + margin: 1mm; } SkinDesignerDeviceCardSelected { - background: #ffffff; - border: 2px solid #2f6bff; - padding: 4mm 4mm 4mm 4mm; - margin: 1.6mm; + cn1-round-border: 2mm; + background: #e8f0ff; + padding: 2.4mm 2.6mm; + margin: 1mm; } SkinDesignerDeviceCardSelectedDark { - background: #102b66; - border: 2px solid #4d86ff; - padding: 4mm 4mm 4mm 4mm; - margin: 1.6mm; + cn1-round-border: 2mm; + background: #1c3a7a; + padding: 2.4mm 2.6mm; + margin: 1mm; } SkinDesignerOsMark { + cn1-round-border: 1mm; color: #112247; background: #f7f8fb; - border-radius: 1.4mm; - padding: 0.6mm; - margin: 0 0.6mm 0 0; - font-size: 2.6mm; + padding: 0.8mm; + margin: 0 1mm 0 0; + font-size: 3.2mm; text-align: center; } SkinDesignerOsMarkDark { + cn1-round-border: 1mm; color: #f5f8ff; background: #163575; - border-radius: 1.4mm; - padding: 0.6mm; - margin: 0 0.6mm 0 0; - font-size: 2.6mm; + padding: 0.8mm; + margin: 0 1mm 0 0; + font-size: 3.2mm; text-align: center; } @@ -701,48 +802,69 @@ SkinDesignerSourceRow { } SkinDesignerSourceRowDark { background: transparent; padding: 4mm 6mm; } +/* Source cards — rounded body, blue ring on press (we don't have a true + * hover state in the CN1 CSS subset, so .pressed is the closest visual + * cue; on desktop the click-and-hold still highlights). */ SkinDesignerSourceCard { + cn1-round-border: 3mm; background: #ffffff; - border: 1px solid #d9dee8; - padding: 8mm 6mm; - margin: 3mm; + padding: 6mm 4mm; + margin: 2mm; +} +SkinDesignerSourceCard.pressed { + cn1-round-border: 3mm; + background: #f3f7ff; + padding: 6mm 4mm; + margin: 2mm; } SkinDesignerSourceCardDark { + cn1-round-border: 3mm; background: #102b66; - border: 1px solid #4c6ea8; - padding: 8mm 6mm; - margin: 3mm; + padding: 6mm 4mm; + margin: 2mm; +} +SkinDesignerSourceCardDark.pressed { + cn1-round-border: 3mm; + background: #163575; + padding: 6mm 4mm; + margin: 2mm; } SkinDesignerSourceIll { + cn1-round-border: 2mm; background: #f7f8fb; color: #7f8aa3; - padding: 6mm; + padding: 5mm; margin: 0 0 2mm 0; - border-radius: 2mm; text-align: center; font-size: 8mm; } SkinDesignerSourceIllDark { + cn1-round-border: 2mm; background: #163575; color: #a8b8da; - padding: 6mm; + padding: 5mm; margin: 0 0 2mm 0; - border-radius: 2mm; text-align: center; font-size: 8mm; } SkinDesignerSourceP { - color: #7f8aa3; + background: transparent; + border: none; + color: #4a5775; font-size: 2.6mm; font-family: "native:MainLight"; - padding: 0.4mm; + padding: 0.4mm 0; + margin: 0.6mm 0 0 0; } SkinDesignerSourcePDark { - color: #a8b8da; + background: transparent; + border: none; + color: #c8d4ee; font-size: 2.6mm; font-family: "native:MainLight"; - padding: 0.4mm; + padding: 0.4mm 0; + margin: 0.6mm 0 0 0; } /* --- Editor / stage / sidebar --------------------------------------- */ @@ -1119,22 +1241,24 @@ SkinDesignerDoneRootDark { background: #071b4d; padding: 8mm 4mm; } +/* Subtler success badge: smaller diameter, lighter green ring, finer + * check icon (sized in code via FontImage.setMaterialIcon). */ SkinDesignerDoneCheck { - background: #b8d532; - color: #112247; - border-radius: 12mm; - padding: 4mm; + cn1-pill-border: 1; + background: #e8f3c8; + color: #6e8a1a; + padding: 2.4mm; margin: 1mm; - font-size: 8mm; + font-size: 5mm; text-align: center; } SkinDesignerDoneCheckDark { - background: #b8d532; - color: #0a2460; - border-radius: 12mm; - padding: 4mm; + cn1-pill-border: 1; + background: #2c4216; + color: #b8d532; + padding: 2.4mm; margin: 1mm; - font-size: 8mm; + font-size: 5mm; text-align: center; } diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 46bf6b11bc..1bc259fc67 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -19,6 +19,7 @@ import com.codename1.ui.Graphics; import com.codename1.ui.Image; import com.codename1.ui.Label; +import com.codename1.ui.TextArea; import com.codename1.ui.TextField; import com.codename1.ui.layouts.BorderLayout; import com.codename1.ui.layouts.BoxLayout; @@ -202,17 +203,22 @@ private void rebuildStepper() { if (i > 0) { stepperRow.add(buildStepperSep()); } - int state = (i == step) ? CircleBadge.STATE_ACTIVE - : (i < step ? CircleBadge.STATE_DONE : CircleBadge.STATE_PENDING); - CircleBadge badge = new CircleBadge(i + 1, state, websiteDarkMode); - String labelUiid = (i == step) ? "SkinDesignerStepperLabelActive" - : (i < step ? "SkinDesignerStepperLabelDone" : "SkinDesignerStepperLabelPending"); + String suffix = (i == step) ? "Active" : (i < step ? "Done" : "Pending"); + // Force a square size so cn1-pill-border draws the badge as a true + // circle, with the digit centered by the Label's own alignment. + Label badge = new Label(String.valueOf(i + 1)); + badge.setUIID("SkinDesignerStepperNum" + suffix); + int diameter = CN.convertToPixels(4.6f); + badge.setPreferredSize(new com.codename1.ui.geom.Dimension(diameter, diameter)); + if (i < step) { + badge.setText(""); + FontImage.setMaterialIcon(badge, FontImage.MATERIAL_CHECK, + 2.6f); + } Label text = new Label(labels[i]); - text.setUIID(labelUiid); + text.setUIID("SkinDesignerStepperLabel" + suffix); Container item = BoxLayout.encloseX(badge, text); - String itemUiid = (i == step) ? "SkinDesignerStepperItemActive" - : (i < step ? "SkinDesignerStepperItemDone" : "SkinDesignerStepperItemPending"); - item.setUIID(itemUiid); + item.setUIID("SkinDesignerStepperItem" + suffix); stepperRow.add(item); } stepperRow.revalidate(); @@ -327,13 +333,22 @@ private Container buildDeviceStep() { heading.setUIID("SkinDesignerStepHead"); Label h1 = new Label("Which device is this skin for?"); h1.setUIID("SkinDesignerH1"); - Label sub = new Label("Pick your device. We'll prefill resolution, PPI, safe-area insets, and fonts."); + TextArea sub = new TextArea( + "Pick your device. We'll prefill resolution, PPI, safe-area insets, " + + "and fonts so you can focus on the skin shape."); sub.setUIID("SkinDesignerSub"); + sub.setEditable(false); + sub.setFocusable(false); + sub.setGrowByContent(true); + sub.setRows(2); heading.add(h1); heading.add(sub); TextField search = new TextField("", "Search devices…", 24, TextField.ANY); search.setUIID("SkinDesignerSearchField"); + // Magnifier glass material icon as the hint icon, matching the design. + search.setHintIcon(FontImage.createMaterial( + FontImage.MATERIAL_SEARCH, search.getStyle(), 3.4f)); String[] filterIds = { "all", "phone", "tablet", "fold" }; String[] filterLabels = { "All", "Phones", "Tablets", "Foldables" }; @@ -406,8 +421,11 @@ private Container buildDeviceStep() { scroll.add(BorderLayout.NORTH, topInner); scroll.add(BorderLayout.CENTER, grid); - // Keep a handle to refresh footer enabled state as devices are selected + // Handles used by selectDevice() to re-style cards in place and to + // toggle Continue without doing a full step rebuild (which would + // jump the scroll position). bodyHolder.putClientProperty("deviceContinue", cont); + bodyHolder.putClientProperty("deviceGrid", grid); root.add(BorderLayout.CENTER, scroll); root.add(BorderLayout.SOUTH, footer); @@ -496,20 +514,23 @@ private Container buildDeviceCard(DeviceDatabase.Device d) { Label osMark = new Label(); osMark.setUIID("SkinDesignerOsMark"); + // Use the brand glyphs (apple/android) rather than the silhouette + // phone icons, which read as identical at this size. FontImage.setMaterialIcon(osMark, "ios".equals(d.platformName) - ? FontImage.MATERIAL_PHONE_IPHONE - : FontImage.MATERIAL_PHONE_ANDROID); + ? FontImage.MATERIAL_APPLE + : FontImage.MATERIAL_ANDROID); Label name = new Label(d.name); name.setUIID("SkinDesignerDeviceName"); Container top = new Container(new BorderLayout()); top.add(BorderLayout.WEST, osMark); top.add(BorderLayout.CENTER, name); - if (selected) { - Label check = new Label(); - check.setUIID("SkinDesignerDeviceCheck"); - FontImage.setMaterialIcon(check, FontImage.MATERIAL_CHECK); - top.add(BorderLayout.EAST, check); - } + Label check = new Label(); + check.setUIID("SkinDesignerDeviceCheck"); + FontImage.setMaterialIcon(check, FontImage.MATERIAL_CHECK); + // Always add the slot — toggle visibility on selection — so the layout + // doesn't shift between selected/unselected states. + check.setVisible(selected); + top.add(BorderLayout.EAST, check); card.add(top); Label spec = new Label(d.resolutionW + "×" + d.resolutionH @@ -517,15 +538,55 @@ private Container buildDeviceCard(DeviceDatabase.Device d) { spec.setUIID("SkinDesignerDeviceSpec"); card.add(spec); - return makeClickable(card, e -> { - device = d; - skin.resetForDevice(d); - Button cont = (Button) bodyHolder.getClientProperty("deviceContinue"); - if (cont != null) { - cont.setEnabled(true); + Container wrapper = makeClickable(card, e -> selectDevice(d)); + // Keep a back-pointer so we can re-style without rebuilding the grid + // (which would lose the user's scroll position). + wrapper.putClientProperty("deviceId", d.id); + wrapper.putClientProperty("card", card); + wrapper.putClientProperty("check", check); + return wrapper; + } + + /** + * Selecting a device used to call {@link #renderStep()}, which rebuilt the + * entire body and lost the user's scroll position — that produced the + * "jumping" the user reported. Now we just toggle the previously- and + * newly-selected cards' UIIDs in place and refresh the Continue button. + */ + private void selectDevice(DeviceDatabase.Device d) { + device = d; + skin.resetForDevice(d); + Button cont = (Button) bodyHolder.getClientProperty("deviceContinue"); + if (cont != null) { + cont.setEnabled(true); + } + Container grid = (Container) bodyHolder.getClientProperty("deviceGrid"); + if (grid != null) { + applySelectionToGrid(grid, d.id); + } + updateStatusbar(); + saveState(); + } + + private void applySelectionToGrid(Container container, String selectedId) { + for (int i = 0; i < container.getComponentCount(); i++) { + Component c = container.getComponentAt(i); + Object id = c.getClientProperty("deviceId"); + if (id instanceof String) { + Container card = (Container) c.getClientProperty("card"); + Component check = (Component) c.getClientProperty("check"); + boolean sel = id.equals(selectedId); + if (card != null) { + card.setUIID(sel ? "SkinDesignerDeviceCardSelected" : "SkinDesignerDeviceCard"); + } + if (check != null) { + check.setVisible(sel); + } + } else if (c instanceof Container) { + applySelectionToGrid((Container) c, selectedId); } - renderStep(); - }); + } + container.repaint(); } /** @@ -565,15 +626,24 @@ private Container buildSourceStep() { Label h1 = new Label("How would you like to start?"); h1.setUIID("SkinDesignerH1"); - Label sub = new Label("Build a skin for " + device.name + "."); - sub.setUIID("SkinDesignerSub"); - Container heading = BoxLayout.encloseY(h1, sub); + // Render "Build a skin for ." with the device name bold. + Label subPrefix = new Label("Build a skin for "); + subPrefix.setUIID("SkinDesignerSub"); + Label subDevice = new Label(device.name); + subDevice.setUIID("SkinDesignerSubBold"); + Label subSuffix = new Label("."); + subSuffix.setUIID("SkinDesignerSub"); + Container subRow = new Container(new FlowLayout(Component.CENTER)); + subRow.add(subPrefix); + subRow.add(subDevice); + subRow.add(subSuffix); + Container heading = BoxLayout.encloseY(h1, subRow); heading.setUIID("SkinDesignerStepHead"); Container cards = new Container(new GridLayout(1, 3)); cards.setUIID("SkinDesignerSourceRow"); cards.add(buildSourceCard("Pick a shape", - "Start from a common phone silhouette and tweak dimensions and cutouts.", + "Start from a common phone silhouette and tweak dimensions and cutouts from there.", FontImage.MATERIAL_PHONE_IPHONE, SkinModel.SOURCE_SHAPE)); cards.add(buildSourceCard("Upload an image", @@ -614,8 +684,14 @@ private Container buildSourceCard(String title, String desc, char icon, String s h3.setUIID("SkinDesignerH3"); card.add(h3); - Label p = new Label(desc); + // Multi-line description — Label wraps poorly, so use a non-editable + // TextArea that grows to fit the wrapped text. + TextArea p = new TextArea(desc); p.setUIID("SkinDesignerSourceP"); + p.setEditable(false); + p.setFocusable(false); + p.setGrowByContent(true); + p.setRows(3); card.add(p); return makeClickable(card, e -> { @@ -1061,17 +1137,27 @@ interface BooleanSetter { void set(boolean v); } // Step 3 — done summary + save // ==================================================================== + /** Holds the most-recently-generated .skin bytes + filename so the + * Save button on the done step can re-trigger the download. */ + private byte[] lastSkinBytes; + private String lastSkinFile; + private Container buildDoneStep() { - // Build the .skin file once when arriving at this step + // Build the .skin file once when arriving at this step. We keep it on + // disk so reloading the page doesn't lose it; we also keep the bytes + // in memory so the user can click Save again to re-download. byte[] data = createSkinBytes(); boolean savedOk = false; + String outPath = null; if (data != null) { FileSystemStorage fs = FileSystemStorage.getInstance(); - String outPath = fs.getAppHomePath() + sanitize(skin.name) + ".skin"; + outPath = fs.getAppHomePath() + sanitize(skin.name) + ".skin"; try (OutputStream os = fs.openOutputStream(outPath)) { os.write(data); savedOk = true; - // In the JS port this triggers the download dialog + lastSkinBytes = data; + lastSkinFile = outPath; + // JS port: triggers the browser's download dialog. Display.getInstance().execute(outPath); } catch (IOException err) { Log.e(err); @@ -1082,9 +1168,11 @@ private Container buildDoneStep() { Container root = new Container(new BoxLayout(BoxLayout.Y_AXIS)); root.setUIID("SkinDesignerDoneRoot"); + // A subtler check: smaller, finer-stroked icon. The lime ring around + // it lives on the SkinDesignerDoneCheck UIID's background. Label check = new Label(); check.setUIID("SkinDesignerDoneCheck"); - FontImage.setMaterialIcon(check, FontImage.MATERIAL_CHECK, 8.0f); + FontImage.setMaterialIcon(check, FontImage.MATERIAL_CHECK, 5.0f); Container checkWrap = FlowLayout.encloseCenter(check); root.add(checkWrap); @@ -1112,13 +1200,27 @@ private Container buildDoneStep() { FontImage.setMaterialIcon(back, FontImage.MATERIAL_CHEVRON_LEFT); back.addActionListener(e -> goToStep(STEP_EDIT)); - Button restart = new Button("New skin"); - restart.setUIID("SkinDesignerPrimaryButton"); - restart.addActionListener(e -> restart()); + // Re-trigger the download dialog. Useful when the browser blocked + // the original auto-download or when the user wants to save again. + Button download = new Button(savedOk ? "Save again" : "Try saving"); + download.setUIID("SkinDesignerSecondaryButton"); + FontImage.setMaterialIcon(download, FontImage.MATERIAL_FILE_DOWNLOAD); + download.setEnabled(lastSkinBytes != null && lastSkinFile != null); + download.addActionListener(e -> { + if (lastSkinFile != null) { + Display.getInstance().execute(lastSkinFile); + } + }); + + Button restartBtn = new Button("Make another skin"); + restartBtn.setUIID("SkinDesignerPrimaryButton"); + FontImage.setMaterialIcon(restartBtn, FontImage.MATERIAL_REFRESH); + restartBtn.addActionListener(e -> restart()); Container actions = new Container(new FlowLayout(Component.CENTER)); actions.add(back); - actions.add(restart); + actions.add(download); + actions.add(restartBtn); root.add(actions); Container scroll = new Container(new BorderLayout()); @@ -1547,106 +1649,6 @@ private String themedUiid(String uiid, boolean dark) { return uiid.endsWith("Dark") ? uiid.substring(0, uiid.length() - 4) : uiid; } - // ==================================================================== - // Stepper badge — guaranteed circle with centered digit / check - // ==================================================================== - - /** - * A real circle (filled disc) with the step number or a check mark drawn - * in the middle. Avoids relying on cn1-pill-border + Label sizing, which - * was producing oversized horizontal pills with the digit cropped or - * floating off-center. - */ - static final class CircleBadge extends Component { - static final int STATE_PENDING = 0; - static final int STATE_ACTIVE = 1; - static final int STATE_DONE = 2; - - private final int number; - private final int state; - private final boolean dark; - - CircleBadge(int number, int state, boolean dark) { - this.number = number; - this.state = state; - this.dark = dark; - setUIID("Container"); - setFocusable(false); - } - - @Override - protected com.codename1.ui.geom.Dimension calcPreferredSize() { - int diameter = CN.convertToPixels(4.6f); - return new com.codename1.ui.geom.Dimension(diameter, diameter); - } - - @Override - public void paint(Graphics g) { - int diameter = Math.min(getWidth(), getHeight()); - int cx = getX() + (getWidth() - diameter) / 2; - int cy = getY() + (getHeight() - diameter) / 2; - - int fill, fg; - switch (state) { - case STATE_ACTIVE: - fill = dark ? 0x4d86ff : 0x2f6bff; - fg = 0xffffff; - break; - case STATE_DONE: - fill = 0xb8d532; - fg = dark ? 0x0a2460 : 0x112247; - break; - case STATE_PENDING: - default: - fill = dark ? 0x4c6ea8 : 0xd9dee8; - fg = dark ? 0x102b66 : 0xffffff; - break; - } - - int oldColor = g.getColor(); - int oldAlpha = g.getAlpha(); - boolean oldAA = g.isAntiAliased(); - g.setAntiAliased(true); - g.setColor(fill); - g.fillArc(cx, cy, diameter, diameter, 0, 360); - - g.setColor(fg); - if (state == STATE_DONE) { - int pad = diameter / 4; - int x0 = cx + pad; - int y0 = cy + diameter / 2; - int xm = cx + diameter * 7 / 16; - int ym = cy + diameter - pad - 1; - int x1 = cx + diameter - pad; - int y1 = cy + pad + 1; - int stroke = Math.max(1, diameter / 9); - drawThickLine(g, x0, y0, xm, ym, stroke); - drawThickLine(g, xm, ym, x1, y1, stroke); - } else { - String text = String.valueOf(number); - com.codename1.ui.Font f = g.getFont(); - if (f != null) { - int tw = f.stringWidth(text); - int th = f.getHeight(); - int tx = cx + (diameter - tw) / 2; - int ty = cy + (diameter - th) / 2; - g.drawString(text, tx, ty); - } - } - g.setAntiAliased(oldAA); - g.setAlpha(oldAlpha); - g.setColor(oldColor); - } - - private static void drawThickLine(Graphics g, int x0, int y0, int x1, int y1, int thick) { - for (int dx = -thick / 2; dx <= thick / 2; dx++) { - for (int dy = -thick / 2; dy <= thick / 2; dy++) { - g.drawLine(x0 + dx, y0 + dy, x1 + dx, y1 + dy); - } - } - } - } - // ==================================================================== // Preset icons // ==================================================================== From fb2c59d0c2c0ef9bc62a740a3dadee4e61cf3229 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sat, 2 May 2026 19:22:22 +0300 Subject: [PATCH 34/55] Skin Designer: real hover effect + user-gesture skin download Hover: - Subclass Form to override pointerHover(int[], int[]) so we can intercept hover events at the form level. CN1's CSS subset doesn't expose a :hover state and overriding pointerHover on a child Container is unreliable when an overlay Button sits on top (the overlay swallows the dispatch). - New registerHover(Container) registers a card; updateHoverState(x, y) walks the registry on each hover event, finds the card under the cursor via Component.contains(), and toggles UIID -> UIID + "Hover" exactly once when crossing card boundaries. The base UIID is stored on the component as a clientProperty so selection-driven UIID swaps still pick the right hover variant. - Wired into source cards (3 boxes on stage 2) and device cards (stage 1). - renderStep() now clearHoverState()s before rebuilding, so we never hold references to detached containers. - Added *Hover CSS variants for SkinDesignerSourceCard, SkinDesignerDeviceCard, and SkinDesignerDeviceCardSelected (light + dark). Skin download: - The auto-Display.execute() in buildDoneStep() ran one event-loop tick after the Finish click; on browsers that meant the user-gesture context was already gone and the download was silently blocked. - Moved skin generation + write + Display.execute() into a new saveSkinFromUserGesture() that the Finish button calls SYNCHRONOUSLY inside its action listener, keeping us in the gesture window. - Done step now shows a big primary "Download skin" Button as a manual fallback. Clicking it re-fires Display.execute() (or generates if Finish somehow didn't). It's also now the only primary action; the "Make another skin" path moved to a secondary button. - restart() clears lastSkinBytes / lastSkinFile so a fresh wizard run doesn't show stale "saved" state. Bug fix in selection visuals: - applySelectionToGrid was toggling the inner card's UIID, but makeClickable moves the visible UIID to the outer wrapper. Selecting a device wasn't actually changing appearance. Now toggles wrapper's UIID (and updates baseUIID so hover swaps onto the selected variant). Co-Authored-By: Claude Opus 4.7 (1M context) --- .../common/src/main/css/theme.css | 52 ++++- .../tools/skindesigner/SkinDesigner.java | 194 ++++++++++++++---- 2 files changed, 200 insertions(+), 46 deletions(-) diff --git a/scripts/skindesigner/common/src/main/css/theme.css b/scripts/skindesigner/common/src/main/css/theme.css index fee5246b88..e4fd3fc342 100644 --- a/scripts/skindesigner/common/src/main/css/theme.css +++ b/scripts/skindesigner/common/src/main/css/theme.css @@ -719,24 +719,52 @@ SkinDesignerDeviceCard { padding: 2.4mm 2.6mm; margin: 1mm; } +SkinDesignerDeviceCardHover { + cn1-round-border: 2mm; + background: #f3f7ff; + border: 1px solid #2f6bff; + padding: 2.4mm 2.6mm; + margin: 1mm; +} SkinDesignerDeviceCardDark { cn1-round-border: 2mm; background: #102b66; padding: 2.4mm 2.6mm; margin: 1mm; } +SkinDesignerDeviceCardHoverDark { + cn1-round-border: 2mm; + background: #163575; + border: 1px solid #4d86ff; + padding: 2.4mm 2.6mm; + margin: 1mm; +} SkinDesignerDeviceCardSelected { cn1-round-border: 2mm; background: #e8f0ff; padding: 2.4mm 2.6mm; margin: 1mm; } +SkinDesignerDeviceCardSelectedHover { + cn1-round-border: 2mm; + background: #d8e6ff; + border: 1px solid #2f6bff; + padding: 2.4mm 2.6mm; + margin: 1mm; +} SkinDesignerDeviceCardSelectedDark { cn1-round-border: 2mm; background: #1c3a7a; padding: 2.4mm 2.6mm; margin: 1mm; } +SkinDesignerDeviceCardSelectedHoverDark { + cn1-round-border: 2mm; + background: #244790; + border: 1px solid #4d86ff; + padding: 2.4mm 2.6mm; + margin: 1mm; +} SkinDesignerOsMark { cn1-round-border: 1mm; @@ -802,18 +830,25 @@ SkinDesignerSourceRow { } SkinDesignerSourceRowDark { background: transparent; padding: 4mm 6mm; } -/* Source cards — rounded body, blue ring on press (we don't have a true - * hover state in the CN1 CSS subset, so .pressed is the closest visual - * cue; on desktop the click-and-hold still highlights). */ +/* Source cards — rounded body. SkinDesigner.java's pointerHover override + * swaps the wrapper's UIID to *Hover variants on cursor enter so we get a + * true hover effect (CN1's CSS subset has no :hover state). */ SkinDesignerSourceCard { cn1-round-border: 3mm; background: #ffffff; padding: 6mm 4mm; margin: 2mm; } -SkinDesignerSourceCard.pressed { +SkinDesignerSourceCardHover { cn1-round-border: 3mm; background: #f3f7ff; + border: 2px solid #2f6bff; + padding: 6mm 4mm; + margin: 2mm; +} +SkinDesignerSourceCard.pressed { + cn1-round-border: 3mm; + background: #e8f0ff; padding: 6mm 4mm; margin: 2mm; } @@ -823,9 +858,16 @@ SkinDesignerSourceCardDark { padding: 6mm 4mm; margin: 2mm; } -SkinDesignerSourceCardDark.pressed { +SkinDesignerSourceCardHoverDark { cn1-round-border: 3mm; background: #163575; + border: 2px solid #4d86ff; + padding: 6mm 4mm; + margin: 2mm; +} +SkinDesignerSourceCardDark.pressed { + cn1-round-border: 3mm; + background: #1c3a7a; padding: 6mm 4mm; margin: 2mm; } diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 1bc259fc67..f381dfba5d 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -75,13 +75,32 @@ public class SkinDesigner extends Lifecycle { private Container stepperRow; private Container wizardNav; + /** Containers that should swap their UIID to {@code Hover} while + * the cursor is over them. Empty on touch-only platforms (no hover). */ + private final List hoverCards = new ArrayList<>(); + private Container hoveredCard; + @Override public void runApp() { CN.setProperty("platformHint.javascript.beforeUnloadMessage", null); websiteDarkMode = readThemeFromUrl(); Display.getInstance().setDarkMode(websiteDarkMode); - form = new Form("Skin Designer", new BorderLayout()); + // Subclass so we can intercept hover events at the form level. CN1 + // doesn't have a CSS :hover state, and overriding pointerHover on a + // child is unreliable when an overlay Button sits on top (the + // overlay swallows the hover dispatch). Walking a registry on each + // hover event lets us toggle the wrapper's UIID precisely once when + // crossing card boundaries. + form = new Form("Skin Designer", new BorderLayout()) { + @Override + public void pointerHover(int[] x, int[] y) { + super.pointerHover(x, y); + if (x != null && x.length > 0 && y != null && y.length > 0) { + updateHoverState(x[0], y[0]); + } + } + }; form.setUIID("SkinDesignerForm"); form.setTitle(""); // The Form's default Toolbar otherwise sits above our custom topbar @@ -156,6 +175,8 @@ private void restart() { source = null; skin = new SkinModel(); bodyImage = null; + lastSkinBytes = null; + lastSkinFile = null; Storage.getInstance().deleteStorageFile(IMAGE_STORAGE); Preferences.delete(PREF_STEP); Preferences.delete(PREF_DEVICE); @@ -284,6 +305,7 @@ private void renderStep() { if (device != null && (skin.name == null || skin.name.isEmpty())) { skin.resetForDevice(device); } + clearHoverState(); bodyHolder.removeAll(); switch (step) { case STEP_DEVICE: @@ -544,6 +566,7 @@ private Container buildDeviceCard(DeviceDatabase.Device d) { wrapper.putClientProperty("deviceId", d.id); wrapper.putClientProperty("card", card); wrapper.putClientProperty("check", check); + registerHover(wrapper); return wrapper; } @@ -573,11 +596,16 @@ private void applySelectionToGrid(Container container, String selectedId) { Component c = container.getComponentAt(i); Object id = c.getClientProperty("deviceId"); if (id instanceof String) { - Container card = (Container) c.getClientProperty("card"); Component check = (Component) c.getClientProperty("check"); boolean sel = id.equals(selectedId); - if (card != null) { - card.setUIID(sel ? "SkinDesignerDeviceCardSelected" : "SkinDesignerDeviceCard"); + // makeClickable moved the visible UIID to the wrapper (`c`), + // so toggle there. Update baseUIID too so hover swaps onto + // the right variant. + String base = sel ? "SkinDesignerDeviceCardSelected" : "SkinDesignerDeviceCard"; + c.putClientProperty("baseUIID", base); + String visible = (c == hoveredCard) ? base + "Hover" : base; + if (!visible.equals(c.getUIID())) { + c.setUIID(visible); } if (check != null) { check.setVisible(sel); @@ -616,6 +644,61 @@ private static Container makeClickable(Container content, com.codename1.ui.event return layered; } + /** + * Registers a clickable card so the form's pointerHover override toggles + * its UIID to {@code Hover} while the cursor is over it. Stores the + * base UIID on the component itself so we can restore it cleanly even if + * a later state change rewrites it. + */ + private void registerHover(Container card) { + card.putClientProperty("baseUIID", card.getUIID()); + hoverCards.add(card); + } + + /** + * Called from the subclassed Form's pointerHover. Walks {@link #hoverCards} + * once per hover event, swaps UIIDs on whichever card the cursor entered + * or left. + */ + private void updateHoverState(int x, int y) { + if (hoverCards.isEmpty()) { + return; + } + Container target = null; + for (int i = 0; i < hoverCards.size(); i++) { + Container c = hoverCards.get(i); + if (c.getParent() != null && c.contains(x, y)) { + target = c; + break; + } + } + if (target == hoveredCard) { + return; + } + if (hoveredCard != null) { + String base = (String) hoveredCard.getClientProperty("baseUIID"); + if (base != null) { + hoveredCard.setUIID(base); + hoveredCard.repaint(); + } + } + hoveredCard = target; + if (hoveredCard != null) { + String base = (String) hoveredCard.getClientProperty("baseUIID"); + if (base != null) { + hoveredCard.setUIID(base + "Hover"); + hoveredCard.repaint(); + } + } + } + + /** Drop hover registrations whenever we rebuild a step so we don't leak + * stale references to detached containers. */ + private void clearHoverState() { + hoverCards.clear(); + hoveredCard = null; + } + // ==================================================================== // Step 1 — pick source // ==================================================================== @@ -694,7 +777,7 @@ private Container buildSourceCard(String title, String desc, char icon, String s p.setRows(3); card.add(p); - return makeClickable(card, e -> { + Container wrapper = makeClickable(card, e -> { source = sourceId; if (SkinModel.SOURCE_BLANK.equals(sourceId)) { skin.cutouts.clear(); @@ -709,6 +792,8 @@ private Container buildSourceCard(String title, String desc, char icon, String s } goToStep(STEP_EDIT); }); + registerHover(wrapper); + return wrapper; } // ==================================================================== @@ -808,7 +893,15 @@ private Container buildSidebar() { finish.setUIID("SkinDesignerPrimaryButton"); FontImage.setMaterialIcon(finish, FontImage.MATERIAL_CHEVRON_RIGHT); finish.setTextPosition(Component.LEFT); - finish.addActionListener(e -> goToStep(STEP_DONE)); + finish.addActionListener(e -> { + // Build + save + trigger the download from this direct click + // handler so the browser sees a user-gesture chain. If we wait + // for buildDoneStep() to do it, the browser may have lost the + // gesture context by the time Display.execute fires (especially + // after the heavy skin-image generation). + saveSkinFromUserGesture(); + goToStep(STEP_DONE); + }); Container foot = new Container(new BorderLayout()); foot.setUIID("SkinDesignerSidebarFoot"); @@ -1142,28 +1235,39 @@ interface BooleanSetter { void set(boolean v); } private byte[] lastSkinBytes; private String lastSkinFile; - private Container buildDoneStep() { - // Build the .skin file once when arriving at this step. We keep it on - // disk so reloading the page doesn't lose it; we also keep the bytes - // in memory so the user can click Save again to re-download. + /** + * Generates the .skin bytes, persists them to FileSystemStorage and + * triggers {@link Display#execute(String)} to open the browser's + * download dialog. MUST be called from a direct user-gesture (e.g. a + * Button action listener); browsers block downloads triggered from + * deferred / async code. + */ + private void saveSkinFromUserGesture() { byte[] data = createSkinBytes(); - boolean savedOk = false; - String outPath = null; - if (data != null) { - FileSystemStorage fs = FileSystemStorage.getInstance(); - outPath = fs.getAppHomePath() + sanitize(skin.name) + ".skin"; - try (OutputStream os = fs.openOutputStream(outPath)) { - os.write(data); - savedOk = true; - lastSkinBytes = data; - lastSkinFile = outPath; - // JS port: triggers the browser's download dialog. - Display.getInstance().execute(outPath); - } catch (IOException err) { - Log.e(err); - ToastBar.showErrorMessage("Error saving skin: " + err); - } + if (data == null) { + // ToastBar already shown by createSkinBytes() on failure. + return; + } + FileSystemStorage fs = FileSystemStorage.getInstance(); + String outPath = fs.getAppHomePath() + sanitize(skin.name) + ".skin"; + try (OutputStream os = fs.openOutputStream(outPath)) { + os.write(data); + lastSkinBytes = data; + lastSkinFile = outPath; + // Calling execute() here, synchronously inside the Finish click + // handler, keeps us inside the browser's user-gesture window so + // the download dialog actually fires. (The earlier auto-save in + // buildDoneStep() ran one event-loop tick later — long enough + // for the gesture context to expire — and the popup was blocked.) + Display.getInstance().execute(outPath); + } catch (IOException err) { + Log.e(err); + ToastBar.showErrorMessage("Error saving skin: " + err); } + } + + private Container buildDoneStep() { + boolean savedOk = lastSkinBytes != null && lastSkinFile != null; Container root = new Container(new BoxLayout(BoxLayout.Y_AXIS)); root.setUIID("SkinDesignerDoneRoot"); @@ -1180,11 +1284,16 @@ private Container buildDoneStep() { h1.setUIID("SkinDesignerH1"); root.add(FlowLayout.encloseCenter(h1)); - Label msg = new Label(savedOk - ? "Your skin has been saved locally. You can go back and tweak it, or start a new one." - : "Your skin is ready. Use the buttons below to adjust or start a new one."); + TextArea msg = new TextArea(savedOk + ? "Your skin file has been generated. If your browser blocked " + + "the download, click \"Download skin\" below to save it again." + : "Click \"Download skin\" to generate and save your .skin file."); msg.setUIID("SkinDesignerSub"); - root.add(FlowLayout.encloseCenter(msg)); + msg.setEditable(false); + msg.setFocusable(false); + msg.setGrowByContent(true); + msg.setRows(2); + root.add(msg); Container summary = new Container(new BoxLayout(BoxLayout.Y_AXIS)); summary.setUIID("SkinDesignerSummary"); @@ -1195,25 +1304,28 @@ private Container buildDoneStep() { summary.add(summaryRow("Source", source)); root.add(FlowLayout.encloseCenter(summary)); - Button back = new Button("Back to editor"); - back.setUIID("SkinDesignerSecondaryButton"); - FontImage.setMaterialIcon(back, FontImage.MATERIAL_CHEVRON_LEFT); - back.addActionListener(e -> goToStep(STEP_EDIT)); - - // Re-trigger the download dialog. Useful when the browser blocked - // the original auto-download or when the user wants to save again. - Button download = new Button(savedOk ? "Save again" : "Try saving"); - download.setUIID("SkinDesignerSecondaryButton"); + // Big primary "Download skin" button — the only reliably user-gesture + // path on browsers that blocked the auto-trigger from Finish. + Button download = new Button("Download skin"); + download.setUIID("SkinDesignerPrimaryButton"); FontImage.setMaterialIcon(download, FontImage.MATERIAL_FILE_DOWNLOAD); - download.setEnabled(lastSkinBytes != null && lastSkinFile != null); download.addActionListener(e -> { + // If we already have generated bytes, just re-fire the download + // (also from a direct gesture). Otherwise generate now. if (lastSkinFile != null) { Display.getInstance().execute(lastSkinFile); + } else { + saveSkinFromUserGesture(); } }); + Button back = new Button("Back to editor"); + back.setUIID("SkinDesignerSecondaryButton"); + FontImage.setMaterialIcon(back, FontImage.MATERIAL_CHEVRON_LEFT); + back.addActionListener(e -> goToStep(STEP_EDIT)); + Button restartBtn = new Button("Make another skin"); - restartBtn.setUIID("SkinDesignerPrimaryButton"); + restartBtn.setUIID("SkinDesignerSecondaryButton"); FontImage.setMaterialIcon(restartBtn, FontImage.MATERIAL_REFRESH); restartBtn.addActionListener(e -> restart()); From f20199eb6364a0cdbde5874e4b52c84ef2a2c42c Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sat, 2 May 2026 21:11:26 +0300 Subject: [PATCH 35/55] Skin Designer: correct CN1 CSS border syntax + cutout fix + safe-area cutouts + filename MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CSS borders were using the wrong syntax. Per docs/developer-guide/css.asciidoc, cn1-round-border / cn1-pill-border are VALUES used in the background or border shorthand, not standalone properties. cn1-round-border:1.6mm; was silently ignored, leaving every "rounded" surface square. Fixes: - Buttons (Primary / Secondary / Ghost), search field, device cards, source cards, source illustration, OS mark — switched to border-radius: Nmm so CN1 maps them onto RoundRectBorder. - Stepper item active pill, stepper number badges, filter chips, done check — switched to "background: cn1-pill-border; background-color: ...;" which is the documented filled-pill pattern. Stepper number badges remain sized to a square in code so the pill renders as a true circle. Cutout list bug: - buildCutoutRow was discarding the LayeredLayout wrapper makeClickable returns, then re-parenting selectArea into the row. The orphaned wrapper kept references and clicking the row threw on the next rebuild. Now adds the wrapper directly. Skin file save: - The auto Display.execute() inside saveSkinFromUserGesture was firing AFTER the slow createSkinBytes() call, by which time the browser's user-gesture window had expired and the popup was blocked. Removed the auto-trigger; saveSkinFromUserGesture now only generates and writes the file. The done step's primary "Download skin" Button fires Display.execute() on the cached file path — that runs in a fresh, fast user-gesture chain and reliably triggers the download. Filename redundancy: - SkinModel.resetForDevice generated " skin", which the saver then suffixed with .skin → "Apple-iPad-Air-13-2024-skin.skin". Drop the trailing " skin" so we save as "Apple-iPad-Air-13-2024.skin". Safe-area updates with cutouts: - buildProperties now computes effectiveSafeTop = max(skin.safeTop, deepest cutout extent) so a user-added notch / island / hole always pushes the safe area below it, regardless of the device's default safeTop. Doesn't mutate skin.safeTop, so the user can still see / edit the configured value. Title divider: - The "really thick separator line" came from TextArea's default underline border bleeding through the SkinDesignerSub UIID. Switched the device-step sub, source-card description, and done-step message from non-editable TextArea to SpanLabel, with fresh SkinDesignerSubBlock / SkinDesignerSourcePBlock container UIIDs that carry no border styling. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../common/src/main/css/theme.css | 161 +++++++++++------- .../tools/skindesigner/SkinDesigner.java | 90 +++++----- .../tools/skindesigner/SkinModel.java | 5 +- 3 files changed, 151 insertions(+), 105 deletions(-) diff --git a/scripts/skindesigner/common/src/main/css/theme.css b/scripts/skindesigner/common/src/main/css/theme.css index e4fd3fc342..37821c2409 100644 --- a/scripts/skindesigner/common/src/main/css/theme.css +++ b/scripts/skindesigner/common/src/main/css/theme.css @@ -95,14 +95,14 @@ SkinDesignerStepperDark { background: transparent; padding: 0; } * translucent blue pill behind it so the user sees where they are in the * wizard at a glance. */ SkinDesignerStepperItemActive { - cn1-pill-border: 1; - background: #e8f0ff; + background: cn1-pill-border; + background-color: #e8f0ff; padding: 0.8mm 2.4mm; margin: 0 0.6mm; } SkinDesignerStepperItemActiveDark { - cn1-pill-border: 1; - background: #1c3a7a; + background: cn1-pill-border; + background-color: #1c3a7a; padding: 0.8mm 2.4mm; margin: 0 0.6mm; } @@ -122,8 +122,8 @@ SkinDesignerStepperItemPendingDark { /* Number badges — Label sized to a square in code, cn1-pill-border draws a * true circle, padding kept symmetric so the digit lands centered. */ SkinDesignerStepperNumActive { - cn1-pill-border: 1; - background: #2f6bff; + background: cn1-pill-border; + background-color: #2f6bff; color: #ffffff; padding: 0; margin: 0 1.2mm 0 0; @@ -132,8 +132,8 @@ SkinDesignerStepperNumActive { text-align: center; } SkinDesignerStepperNumActiveDark { - cn1-pill-border: 1; - background: #4d86ff; + background: cn1-pill-border; + background-color: #4d86ff; color: #ffffff; padding: 0; margin: 0 1.2mm 0 0; @@ -142,8 +142,8 @@ SkinDesignerStepperNumActiveDark { text-align: center; } SkinDesignerStepperNumDone { - cn1-pill-border: 1; - background: #b8d532; + background: cn1-pill-border; + background-color: #b8d532; color: #112247; padding: 0; margin: 0 1.2mm 0 0; @@ -152,8 +152,8 @@ SkinDesignerStepperNumDone { text-align: center; } SkinDesignerStepperNumDoneDark { - cn1-pill-border: 1; - background: #b8d532; + background: cn1-pill-border; + background-color: #b8d532; color: #0a2460; padding: 0; margin: 0 1.2mm 0 0; @@ -162,8 +162,8 @@ SkinDesignerStepperNumDoneDark { text-align: center; } SkinDesignerStepperNumPending { - cn1-pill-border: 1; - background: #d9dee8; + background: cn1-pill-border; + background-color: #d9dee8; color: #ffffff; padding: 0; margin: 0 1.2mm 0 0; @@ -172,8 +172,8 @@ SkinDesignerStepperNumPending { text-align: center; } SkinDesignerStepperNumPendingDark { - cn1-pill-border: 1; - background: #4c6ea8; + background: cn1-pill-border; + background-color: #4c6ea8; color: #102b66; padding: 0; margin: 0 1.2mm 0 0; @@ -368,6 +368,35 @@ SkinDesignerSubBoldDark { margin: 0; } +/* SpanLabel container — uses textUIID = SkinDesignerSub so the wrapped + * Labels pick up the correct color/font. The container itself is + * styling-free so it doesn't paint a border beneath the text. */ +SkinDesignerSubBlock { + background: transparent; + border: none; + padding: 0 4mm; + margin: 0 0 0.6mm 0; +} +SkinDesignerSubBlockDark { + background: transparent; + border: none; + padding: 0 4mm; + margin: 0 0 0.6mm 0; +} + +SkinDesignerSourcePBlock { + background: transparent; + border: none; + padding: 0; + margin: 0.6mm 0 0 0; +} +SkinDesignerSourcePBlockDark { + background: transparent; + border: none; + padding: 0; + margin: 0.6mm 0 0 0; +} + /* --- Buttons --------------------------------------------------------- */ /* Solid-color buttons with a small native rounded border. The CN1 CSS @@ -375,7 +404,7 @@ SkinDesignerSubBoldDark { * fallback). Each button has explicit .pressed and .disabled selectors so * the toolkit's default (washed-out, square) press style never appears. */ SkinDesignerPrimaryButton { - cn1-round-border: 1.6mm; + border-radius: 1.6mm; color: #ffffff; background: #2f6bff; padding: 2mm 4mm; @@ -385,7 +414,7 @@ SkinDesignerPrimaryButton { text-align: center; } SkinDesignerPrimaryButton.pressed { - cn1-round-border: 1.6mm; + border-radius: 1.6mm; color: #ffffff; background: #1f4ec9; padding: 2mm 4mm; @@ -395,7 +424,7 @@ SkinDesignerPrimaryButton.pressed { text-align: center; } SkinDesignerPrimaryButton.disabled { - cn1-round-border: 1.6mm; + border-radius: 1.6mm; color: #ffffff; background: #b3c8ff; padding: 2mm 4mm; @@ -405,7 +434,7 @@ SkinDesignerPrimaryButton.disabled { text-align: center; } SkinDesignerPrimaryButtonDark { - cn1-round-border: 1.6mm; + border-radius: 1.6mm; color: #ffffff; background: #4d86ff; padding: 2mm 4mm; @@ -415,7 +444,7 @@ SkinDesignerPrimaryButtonDark { text-align: center; } SkinDesignerPrimaryButtonDark.pressed { - cn1-round-border: 1.6mm; + border-radius: 1.6mm; color: #ffffff; background: #2f6bff; padding: 2mm 4mm; @@ -425,7 +454,7 @@ SkinDesignerPrimaryButtonDark.pressed { text-align: center; } SkinDesignerPrimaryButtonDark.disabled { - cn1-round-border: 1.6mm; + border-radius: 1.6mm; color: #a8b8da; background: #1f4ec9; padding: 2mm 4mm; @@ -436,7 +465,7 @@ SkinDesignerPrimaryButtonDark.disabled { } SkinDesignerSecondaryButton { - cn1-round-border: 1.6mm; + border-radius: 1.6mm; color: #112247; background: #ffffff; padding: 2mm 4mm; @@ -446,7 +475,7 @@ SkinDesignerSecondaryButton { text-align: center; } SkinDesignerSecondaryButton.pressed { - cn1-round-border: 1.6mm; + border-radius: 1.6mm; color: #112247; background: #e8eef9; padding: 2mm 4mm; @@ -456,7 +485,7 @@ SkinDesignerSecondaryButton.pressed { text-align: center; } SkinDesignerSecondaryButtonDark { - cn1-round-border: 1.6mm; + border-radius: 1.6mm; color: #f5f8ff; background: #102b66; padding: 2mm 4mm; @@ -466,7 +495,7 @@ SkinDesignerSecondaryButtonDark { text-align: center; } SkinDesignerSecondaryButtonDark.pressed { - cn1-round-border: 1.6mm; + border-radius: 1.6mm; color: #f5f8ff; background: #163575; padding: 2mm 4mm; @@ -589,7 +618,7 @@ SkinDesignerFooterDark { /* --- Search / filter chips ------------------------------------------ */ SkinDesignerSearchField { - cn1-round-border: 1.4mm; + border-radius: 1.4mm; color: #112247; background: #ffffff; padding: 1.6mm 2.4mm; @@ -598,7 +627,7 @@ SkinDesignerSearchField { font-size: 3mm; } SkinDesignerSearchFieldDark { - cn1-round-border: 1.4mm; + border-radius: 1.4mm; color: #f5f8ff; background: #0e2a61; padding: 1.6mm 2.4mm; @@ -616,72 +645,72 @@ SkinDesignerFilterRowDark { background: transparent; padding: 0; margin: 0; } /* Filter chips — small enough that cn1-pill-border draws a true pill. */ SkinDesignerFilterTag { - cn1-pill-border: 1; + background: cn1-pill-border; color: #7f8aa3; - background: #ffffff; + background-color: #ffffff; padding: 0.8mm 2.4mm; margin: 0.4mm; font-family: "native:MainLight"; font-size: 2.6mm; } SkinDesignerFilterTag.pressed { - cn1-pill-border: 1; + background: cn1-pill-border; color: #112247; - background: #e8eef9; + background-color: #e8eef9; padding: 0.8mm 2.4mm; margin: 0.4mm; font-family: "native:MainLight"; font-size: 2.6mm; } SkinDesignerFilterTagDark { - cn1-pill-border: 1; + background: cn1-pill-border; color: #a8b8da; - background: #102b66; + background-color: #102b66; padding: 0.8mm 2.4mm; margin: 0.4mm; font-family: "native:MainLight"; font-size: 2.6mm; } SkinDesignerFilterTagDark.pressed { - cn1-pill-border: 1; + background: cn1-pill-border; color: #f5f8ff; - background: #163575; + background-color: #163575; padding: 0.8mm 2.4mm; margin: 0.4mm; font-family: "native:MainLight"; font-size: 2.6mm; } SkinDesignerFilterTagActive { - cn1-pill-border: 1; + background: cn1-pill-border; color: #ffffff; - background: #2f6bff; + background-color: #2f6bff; padding: 0.8mm 2.4mm; margin: 0.4mm; font-family: "native:MainBold"; font-size: 2.6mm; } SkinDesignerFilterTagActive.pressed { - cn1-pill-border: 1; + background: cn1-pill-border; color: #ffffff; - background: #1f4ec9; + background-color: #1f4ec9; padding: 0.8mm 2.4mm; margin: 0.4mm; font-family: "native:MainBold"; font-size: 2.6mm; } SkinDesignerFilterTagActiveDark { - cn1-pill-border: 1; + background: cn1-pill-border; color: #ffffff; - background: #4d86ff; + background-color: #4d86ff; padding: 0.8mm 2.4mm; margin: 0.4mm; font-family: "native:MainBold"; font-size: 2.6mm; } SkinDesignerFilterTagActiveDark.pressed { - cn1-pill-border: 1; + background: cn1-pill-border; color: #ffffff; - background: #2f6bff; + background-color: #2f6bff; padding: 0.8mm 2.4mm; margin: 0.4mm; font-family: "native:MainBold"; @@ -714,52 +743,52 @@ SkinDesignerDeviceGrid { SkinDesignerDeviceGridDark { background: transparent; padding: 0 4mm 4mm 4mm; } SkinDesignerDeviceCard { - cn1-round-border: 2mm; + border-radius: 2mm; background: #ffffff; padding: 2.4mm 2.6mm; margin: 1mm; } SkinDesignerDeviceCardHover { - cn1-round-border: 2mm; + border-radius: 2mm; background: #f3f7ff; border: 1px solid #2f6bff; padding: 2.4mm 2.6mm; margin: 1mm; } SkinDesignerDeviceCardDark { - cn1-round-border: 2mm; + border-radius: 2mm; background: #102b66; padding: 2.4mm 2.6mm; margin: 1mm; } SkinDesignerDeviceCardHoverDark { - cn1-round-border: 2mm; + border-radius: 2mm; background: #163575; border: 1px solid #4d86ff; padding: 2.4mm 2.6mm; margin: 1mm; } SkinDesignerDeviceCardSelected { - cn1-round-border: 2mm; + border-radius: 2mm; background: #e8f0ff; padding: 2.4mm 2.6mm; margin: 1mm; } SkinDesignerDeviceCardSelectedHover { - cn1-round-border: 2mm; + border-radius: 2mm; background: #d8e6ff; border: 1px solid #2f6bff; padding: 2.4mm 2.6mm; margin: 1mm; } SkinDesignerDeviceCardSelectedDark { - cn1-round-border: 2mm; + border-radius: 2mm; background: #1c3a7a; padding: 2.4mm 2.6mm; margin: 1mm; } SkinDesignerDeviceCardSelectedHoverDark { - cn1-round-border: 2mm; + border-radius: 2mm; background: #244790; border: 1px solid #4d86ff; padding: 2.4mm 2.6mm; @@ -767,7 +796,7 @@ SkinDesignerDeviceCardSelectedHoverDark { } SkinDesignerOsMark { - cn1-round-border: 1mm; + border-radius: 1mm; color: #112247; background: #f7f8fb; padding: 0.8mm; @@ -776,7 +805,7 @@ SkinDesignerOsMark { text-align: center; } SkinDesignerOsMarkDark { - cn1-round-border: 1mm; + border-radius: 1mm; color: #f5f8ff; background: #163575; padding: 0.8mm; @@ -834,46 +863,46 @@ SkinDesignerSourceRowDark { background: transparent; padding: 4mm 6mm; } * swaps the wrapper's UIID to *Hover variants on cursor enter so we get a * true hover effect (CN1's CSS subset has no :hover state). */ SkinDesignerSourceCard { - cn1-round-border: 3mm; + border-radius: 3mm; background: #ffffff; padding: 6mm 4mm; margin: 2mm; } SkinDesignerSourceCardHover { - cn1-round-border: 3mm; + border-radius: 3mm; background: #f3f7ff; border: 2px solid #2f6bff; padding: 6mm 4mm; margin: 2mm; } SkinDesignerSourceCard.pressed { - cn1-round-border: 3mm; + border-radius: 3mm; background: #e8f0ff; padding: 6mm 4mm; margin: 2mm; } SkinDesignerSourceCardDark { - cn1-round-border: 3mm; + border-radius: 3mm; background: #102b66; padding: 6mm 4mm; margin: 2mm; } SkinDesignerSourceCardHoverDark { - cn1-round-border: 3mm; + border-radius: 3mm; background: #163575; border: 2px solid #4d86ff; padding: 6mm 4mm; margin: 2mm; } SkinDesignerSourceCardDark.pressed { - cn1-round-border: 3mm; + border-radius: 3mm; background: #1c3a7a; padding: 6mm 4mm; margin: 2mm; } SkinDesignerSourceIll { - cn1-round-border: 2mm; + border-radius: 2mm; background: #f7f8fb; color: #7f8aa3; padding: 5mm; @@ -882,7 +911,7 @@ SkinDesignerSourceIll { font-size: 8mm; } SkinDesignerSourceIllDark { - cn1-round-border: 2mm; + border-radius: 2mm; background: #163575; color: #a8b8da; padding: 5mm; @@ -1286,8 +1315,8 @@ SkinDesignerDoneRootDark { /* Subtler success badge: smaller diameter, lighter green ring, finer * check icon (sized in code via FontImage.setMaterialIcon). */ SkinDesignerDoneCheck { - cn1-pill-border: 1; - background: #e8f3c8; + background: cn1-pill-border; + background-color: #e8f3c8; color: #6e8a1a; padding: 2.4mm; margin: 1mm; @@ -1295,8 +1324,8 @@ SkinDesignerDoneCheck { text-align: center; } SkinDesignerDoneCheckDark { - cn1-pill-border: 1; - background: #2c4216; + background: cn1-pill-border; + background-color: #2c4216; color: #b8d532; padding: 2.4mm; margin: 1mm; diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index f381dfba5d..36061c12a3 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -1,6 +1,7 @@ package com.codename1.tools.skindesigner; import com.codename1.components.OnOffSwitch; +import com.codename1.components.SpanLabel; import com.codename1.components.ToastBar; import com.codename1.io.FileSystemStorage; import com.codename1.io.Log; @@ -19,7 +20,6 @@ import com.codename1.ui.Graphics; import com.codename1.ui.Image; import com.codename1.ui.Label; -import com.codename1.ui.TextArea; import com.codename1.ui.TextField; import com.codename1.ui.layouts.BorderLayout; import com.codename1.ui.layouts.BoxLayout; @@ -355,14 +355,13 @@ private Container buildDeviceStep() { heading.setUIID("SkinDesignerStepHead"); Label h1 = new Label("Which device is this skin for?"); h1.setUIID("SkinDesignerH1"); - TextArea sub = new TextArea( + // SpanLabel wraps cleanly without inheriting TextArea's default + // underline/border styling (which was reading as a thick divider). + SpanLabel sub = new SpanLabel( "Pick your device. We'll prefill resolution, PPI, safe-area insets, " + "and fonts so you can focus on the skin shape."); - sub.setUIID("SkinDesignerSub"); - sub.setEditable(false); - sub.setFocusable(false); - sub.setGrowByContent(true); - sub.setRows(2); + sub.setUIID("SkinDesignerSubBlock"); + sub.setTextUIID("SkinDesignerSub"); heading.add(h1); heading.add(sub); @@ -767,14 +766,9 @@ private Container buildSourceCard(String title, String desc, char icon, String s h3.setUIID("SkinDesignerH3"); card.add(h3); - // Multi-line description — Label wraps poorly, so use a non-editable - // TextArea that grows to fit the wrapped text. - TextArea p = new TextArea(desc); - p.setUIID("SkinDesignerSourceP"); - p.setEditable(false); - p.setFocusable(false); - p.setGrowByContent(true); - p.setRows(3); + SpanLabel p = new SpanLabel(desc); + p.setUIID("SkinDesignerSourcePBlock"); + p.setTextUIID("SkinDesignerSourceP"); card.add(p); Container wrapper = makeClickable(card, e -> { @@ -1080,7 +1074,12 @@ private Container buildCutoutRow(int idx) { selectArea.setUIID("Container"); selectArea.add(BorderLayout.WEST, BoxLayout.encloseX(sw, name)); selectArea.add(BorderLayout.EAST, type); - makeClickable(selectArea, e -> { + // makeClickable returns a LayeredLayout WRAPPER that contains + // selectArea + an overlay Button. We must add THAT wrapper to the + // row, not selectArea itself — re-parenting selectArea would orphan + // the overlay and the row would no longer respond to taps. (This + // was the source of the exception the user saw on the Cutouts tab.) + Container clickable = makeClickable(selectArea, e -> { selectedCutout = (selectedCutout == idx) ? -1 : idx; rebuildCutoutList(); }); @@ -1098,7 +1097,7 @@ private Container buildCutoutRow(int idx) { livePreview.repaint(); }); - row.add(BorderLayout.CENTER, selectArea); + row.add(BorderLayout.CENTER, clickable); row.add(BorderLayout.EAST, rm); return row; } @@ -1236,11 +1235,14 @@ interface BooleanSetter { void set(boolean v); } private String lastSkinFile; /** - * Generates the .skin bytes, persists them to FileSystemStorage and - * triggers {@link Display#execute(String)} to open the browser's - * download dialog. MUST be called from a direct user-gesture (e.g. a - * Button action listener); browsers block downloads triggered from - * deferred / async code. + * Generates the .skin bytes and persists them to FileSystemStorage so + * the done step's Download button can fire {@link Display#execute(String)} + * on the cached file instantly (no slow regeneration inside the click + * handler). Does NOT itself call execute() — the Finish click handler + * runs createSkinBytes() which can take seconds, and by the time we'd + * call execute() the browser's user-gesture window is gone and the + * download is silently blocked. The done step's primary "Download skin" + * Button is the reliable trigger. */ private void saveSkinFromUserGesture() { byte[] data = createSkinBytes(); @@ -1254,12 +1256,6 @@ private void saveSkinFromUserGesture() { os.write(data); lastSkinBytes = data; lastSkinFile = outPath; - // Calling execute() here, synchronously inside the Finish click - // handler, keeps us inside the browser's user-gesture window so - // the download dialog actually fires. (The earlier auto-save in - // buildDoneStep() ran one event-loop tick later — long enough - // for the gesture context to expire — and the popup was blocked.) - Display.getInstance().execute(outPath); } catch (IOException err) { Log.e(err); ToastBar.showErrorMessage("Error saving skin: " + err); @@ -1284,15 +1280,13 @@ private Container buildDoneStep() { h1.setUIID("SkinDesignerH1"); root.add(FlowLayout.encloseCenter(h1)); - TextArea msg = new TextArea(savedOk - ? "Your skin file has been generated. If your browser blocked " - + "the download, click \"Download skin\" below to save it again." + SpanLabel msg = new SpanLabel(savedOk + ? "Your skin file has been generated. Click \"Download skin\" " + + "below to save it (your browser may have blocked the " + + "auto-download)." : "Click \"Download skin\" to generate and save your .skin file."); - msg.setUIID("SkinDesignerSub"); - msg.setEditable(false); - msg.setFocusable(false); - msg.setGrowByContent(true); - msg.setRows(2); + msg.setUIID("SkinDesignerSubBlock"); + msg.setTextUIID("SkinDesignerSub"); root.add(msg); Container summary = new Container(new BoxLayout(BoxLayout.Y_AXIS)); @@ -1639,8 +1633,28 @@ private Properties buildProperties(int totalW, int totalH) { p.put("overrideNames", overrideNames(device)); int bezelPx = skinBezelInPx(totalW, totalH); - int safeTopPx = Math.round(skin.safeTop * ((float) device.resolutionW / DevicePreview.VB_W)); - int safeBottomPx = Math.round(skin.safeBottom * ((float) device.resolutionW / DevicePreview.VB_W)); + // Effective safe-top must cover any cutouts the user added (notch, + // island, hole) that intrude into the screen, otherwise content + // would render under them. Use the deepest cutout extent in the + // viewbox space, then take max with the user-set skin.safeTop. + int cutoutSafeTopVB = 0; + for (SkinModel.Cutout c : skin.cutouts) { + int extent; + if (SkinModel.CUTOUT_NOTCH.equals(c.type)) { + // Notches start at y=0 and protrude h px down. + extent = c.h; + } else { + // Island / hole y is from screen top; bottom edge is y + h. + extent = c.y + c.h; + } + if (extent > cutoutSafeTopVB) { + cutoutSafeTopVB = extent; + } + } + int effectiveSafeTopVB = Math.max(skin.safeTop, cutoutSafeTopVB); + float vbToPx = (float) device.resolutionW / DevicePreview.VB_W; + int safeTopPx = Math.round(effectiveSafeTopVB * vbToPx); + int safeBottomPx = Math.round(skin.safeBottom * vbToPx); int safeX = bezelPx; int safeY = bezelPx + safeTopPx; int safeW = device.resolutionW; diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinModel.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinModel.java index b4115c1533..aaa900461a 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinModel.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinModel.java @@ -47,7 +47,10 @@ public Cutout(String type, int w, int h, int x, int y, String name) { public void resetForDevice(DeviceDatabase.Device d) { presetId = "rr"; - name = d == null ? "My skin" : d.name + " skin"; + // Drop the trailing " skin" from the generated name — sanitize() then + // appends ".skin" as the file extension, so without this the file + // came out as "Apple-iPad-Air-13-2024-skin.skin". + name = d == null ? "My skin" : d.name; cornerR = 40; bezel = 40; homeIndicator = d == null || d.hasHomeIndicator; From 339dde444ca1529dd599c6b4978a26eaf00eda0e Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 3 May 2026 04:14:42 +0300 Subject: [PATCH 36/55] Skin Designer: dark-mode-aware hover + transparent icon bg + em-dash separators MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Stepper separator: - The colored Label between step items was getting stretched by BoxLayout to fill the row height, producing a really thick vertical bar. Replaced with a single em-dash (—) Label - one character can't grow beyond its glyph, regardless of how the layout tries to size it. Brand title: - "Skin Designer" header dropped from MainBold to MainMedium and a notch smaller. Reads less heavy in the topbar. Material icon backgrounds: - FontImage.setMaterialIcon copies the host's unselected style into the baked image, including bg color & transparency. That meant the icon inside SkinDesignerSecondaryButton's white pill carried a white square forever - even after applyDarkRecursive flipped the button to dark blue (the user reported "the arrow in the Back button has white background"). Same bug behind "the green-circle check has a white background tinted green". Added a small applyMaterialIcon helper that: 1. Stamps the icon char onto the component as a clientProperty. 2. Builds a Style copy with bgTransparency=0 so the FontImage's backing image only contains the glyph - no solid bg block. Replaced all 16 FontImage.setMaterialIcon callers. applyDarkRecursive now also re-bakes the icon when it changes a UIID, so a runtime theme switch picks up the new fg color. Hover staleness in dark mode: - registerHover used to capture baseUIID at build time, but applyDarkRecursive runs *after* build and rewrites the UIID, so we'd cache "SkinDesignerSourceCard" while the live UIID was "SkinDesignerSourceCardDark". On hover-out we restored to the cached light variant - that's the "light bg stays light after moving to the next item" the user saw. Now resolves baseUIID lazily on first hover (whatever the card's UIID is at that moment is correct, dark or light), and a small hoverVariantOf() helper appends "Hover" or "HoverDark" so we always pick the correct themed hover style. applyDarkRecursive also rebases cached baseUIIDs on a runtime theme switch, and applySelectionToGrid composes the correct dark/light variant when toggling device selection. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../common/src/main/css/theme.css | 29 ++-- .../tools/skindesigner/SkinDesigner.java | 124 +++++++++++++----- 2 files changed, 107 insertions(+), 46 deletions(-) diff --git a/scripts/skindesigner/common/src/main/css/theme.css b/scripts/skindesigner/common/src/main/css/theme.css index 37821c2409..416255b530 100644 --- a/scripts/skindesigner/common/src/main/css/theme.css +++ b/scripts/skindesigner/common/src/main/css/theme.css @@ -72,14 +72,14 @@ SkinDesignerBrandLogoDark { SkinDesignerBrandTitle { color: #112247; - font-size: 3.6mm; - font-family: "native:MainBold"; + font-size: 3.4mm; + font-family: "native:MainMedium"; padding: 0.6mm 0.4mm; } SkinDesignerBrandTitleDark { color: #f5f8ff; - font-size: 3.6mm; - font-family: "native:MainBold"; + font-size: 3.4mm; + font-family: "native:MainMedium"; padding: 0.6mm 0.4mm; } @@ -219,20 +219,23 @@ SkinDesignerStepperLabelPendingDark { padding: 0; } -/* Horizontal line between stepper items. */ +/* Em-dash separator between stepper items. Single character, transparent + * background — keeps BoxLayout from over-stretching it into a thick bar. */ SkinDesignerStepperSep { - background: #d9dee8; - color: transparent; - font-size: 0.5mm; + background: transparent; + color: #b8c1d4; + font-family: "native:MainLight"; + font-size: 3mm; padding: 0; - margin: 1.4mm 0.4mm; + margin: 0 0.4mm; } SkinDesignerStepperSepDark { - background: #4c6ea8; - color: transparent; - font-size: 0.5mm; + background: transparent; + color: #4c6ea8; + font-family: "native:MainLight"; + font-size: 3mm; padding: 0; - margin: 1.4mm 0.4mm; + margin: 0 0.4mm; } SkinDesignerWizardNav { background: transparent; padding: 0; } diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 36061c12a3..d86bcf7d71 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -26,6 +26,7 @@ import com.codename1.ui.layouts.FlowLayout; import com.codename1.ui.layouts.GridLayout; import com.codename1.ui.layouts.LayeredLayout; +import com.codename1.ui.plaf.Style; import com.codename1.ui.util.ImageIO; import com.codename1.ui.util.UITimer; import java.io.ByteArrayOutputStream; @@ -193,7 +194,7 @@ private void restart() { private Container buildHeader() { Label logo = new Label(); logo.setUIID("SkinDesignerBrandLogo"); - FontImage.setMaterialIcon(logo, FontImage.MATERIAL_PHONE_IPHONE); + applyMaterialIcon(logo, FontImage.MATERIAL_PHONE_IPHONE); Label title = new Label("Skin Designer"); title.setUIID("SkinDesignerBrandTitle"); Container brand = BoxLayout.encloseX(logo, title); @@ -233,7 +234,7 @@ private void rebuildStepper() { badge.setPreferredSize(new com.codename1.ui.geom.Dimension(diameter, diameter)); if (i < step) { badge.setText(""); - FontImage.setMaterialIcon(badge, FontImage.MATERIAL_CHECK, + applyMaterialIcon(badge, FontImage.MATERIAL_CHECK, 2.6f); } Label text = new Label(labels[i]); @@ -245,14 +246,12 @@ private void rebuildStepper() { stepperRow.revalidate(); } - /** A wide, short horizontal line between stepper items. The component is - * a colored block (no custom paint), sized via UIID, so BoxLayout always - * draws a horizontal bar regardless of how it tries to stretch us. */ + /** Em-dash between stepper items - far simpler than a colored block, + * and BoxLayout can't grow a single character into a thick bar. + * Uses a unicode escape because Java sources are ASCII-only. */ private Component buildStepperSep() { - Label sep = new Label(" "); + Label sep = new Label("\u2014"); sep.setUIID("SkinDesignerStepperSep"); - sep.setPreferredW(CN.convertToPixels(6)); - sep.setPreferredH(CN.convertToPixels(0.5f)); return sep; } @@ -424,7 +423,7 @@ private Container buildDeviceStep() { // Footer with Continue button Button cont = new Button("Continue"); cont.setUIID("SkinDesignerPrimaryButton"); - FontImage.setMaterialIcon(cont, FontImage.MATERIAL_CHEVRON_RIGHT); + applyMaterialIcon(cont, FontImage.MATERIAL_CHEVRON_RIGHT); cont.setTextPosition(Component.LEFT); cont.setEnabled(device != null); cont.addActionListener(e -> { @@ -537,7 +536,7 @@ private Container buildDeviceCard(DeviceDatabase.Device d) { osMark.setUIID("SkinDesignerOsMark"); // Use the brand glyphs (apple/android) rather than the silhouette // phone icons, which read as identical at this size. - FontImage.setMaterialIcon(osMark, "ios".equals(d.platformName) + applyMaterialIcon(osMark, "ios".equals(d.platformName) ? FontImage.MATERIAL_APPLE : FontImage.MATERIAL_ANDROID); Label name = new Label(d.name); @@ -547,7 +546,7 @@ private Container buildDeviceCard(DeviceDatabase.Device d) { top.add(BorderLayout.CENTER, name); Label check = new Label(); check.setUIID("SkinDesignerDeviceCheck"); - FontImage.setMaterialIcon(check, FontImage.MATERIAL_CHECK); + applyMaterialIcon(check, FontImage.MATERIAL_CHECK); // Always add the slot — toggle visibility on selection — so the layout // doesn't shift between selected/unselected states. check.setVisible(selected); @@ -598,11 +597,12 @@ private void applySelectionToGrid(Container container, String selectedId) { Component check = (Component) c.getClientProperty("check"); boolean sel = id.equals(selectedId); // makeClickable moved the visible UIID to the wrapper (`c`), - // so toggle there. Update baseUIID too so hover swaps onto - // the right variant. - String base = sel ? "SkinDesignerDeviceCardSelected" : "SkinDesignerDeviceCard"; + // so toggle there. Compose the dark suffix when needed and + // update baseUIID so hover swaps onto the correct variant. + String baseLight = sel ? "SkinDesignerDeviceCardSelected" : "SkinDesignerDeviceCard"; + String base = websiteDarkMode ? baseLight + "Dark" : baseLight; c.putClientProperty("baseUIID", base); - String visible = (c == hoveredCard) ? base + "Hover" : base; + String visible = (c == hoveredCard) ? hoverVariantOf(base) : base; if (!visible.equals(c.getUIID())) { c.setUIID(visible); } @@ -645,12 +645,12 @@ private static Container makeClickable(Container content, com.codename1.ui.event /** * Registers a clickable card so the form's pointerHover override toggles - * its UIID to {@code Hover} while the cursor is over it. Stores the - * base UIID on the component itself so we can restore it cleanly even if - * a later state change rewrites it. + * its UIID to its hover variant while the cursor is over it. We resolve + * the base UIID lazily on first hover so we capture the + * already-dark-mode-applied UIID rather than the build-time light one + * (registerHover runs before applyDarkRecursive). */ private void registerHover(Container card) { - card.putClientProperty("baseUIID", card.getUIID()); hoverCards.add(card); } @@ -683,12 +683,29 @@ private void updateHoverState(int x, int y) { } hoveredCard = target; if (hoveredCard != null) { + // Capture base lazily — whatever UIID the card has right now is + // already dark-mode-adjusted by applyDarkRecursive. String base = (String) hoveredCard.getClientProperty("baseUIID"); - if (base != null) { - hoveredCard.setUIID(base + "Hover"); - hoveredCard.repaint(); + if (base == null) { + base = hoveredCard.getUIID(); + hoveredCard.putClientProperty("baseUIID", base); } + hoveredCard.setUIID(hoverVariantOf(base)); + hoveredCard.repaint(); + } + } + + /** + * Light: SkinDesignerSourceCard -> SkinDesignerSourceCardHover + * Dark: SkinDesignerSourceCardDark -> SkinDesignerSourceCardHoverDark + * Selected light: ...CardSelected -> ...CardSelectedHover + * Selected dark: ...CardSelectedDark -> ...CardSelectedHoverDark + */ + private static String hoverVariantOf(String base) { + if (base.endsWith("Dark")) { + return base.substring(0, base.length() - 4) + "HoverDark"; } + return base + "Hover"; } /** Drop hover registrations whenever we rebuild a step so we don't leak @@ -743,7 +760,7 @@ private Container buildSourceStep() { Button back = new Button("Back"); back.setUIID("SkinDesignerSecondaryButton"); - FontImage.setMaterialIcon(back, FontImage.MATERIAL_CHEVRON_LEFT); + applyMaterialIcon(back, FontImage.MATERIAL_CHEVRON_LEFT); back.addActionListener(e -> goToStep(STEP_DEVICE)); Container footer = FlowLayout.encloseIn(back); footer.setUIID("SkinDesignerFooter"); @@ -759,7 +776,7 @@ private Container buildSourceCard(String title, String desc, char icon, String s Label illustration = new Label(); illustration.setUIID("SkinDesignerSourceIll"); - FontImage.setMaterialIcon(illustration, icon, 8.0f); + applyMaterialIcon(illustration, icon, 8.0f); card.add(illustration); Label h3 = new Label(title); @@ -880,12 +897,12 @@ private Container buildSidebar() { Button back = new Button("Back"); back.setUIID("SkinDesignerSecondaryButton"); - FontImage.setMaterialIcon(back, FontImage.MATERIAL_CHEVRON_LEFT); + applyMaterialIcon(back, FontImage.MATERIAL_CHEVRON_LEFT); back.addActionListener(e -> goToStep(STEP_SOURCE)); Button finish = new Button("Finish"); finish.setUIID("SkinDesignerPrimaryButton"); - FontImage.setMaterialIcon(finish, FontImage.MATERIAL_CHEVRON_RIGHT); + applyMaterialIcon(finish, FontImage.MATERIAL_CHEVRON_RIGHT); finish.setTextPosition(Component.LEFT); finish.addActionListener(e -> { // Build + save + trigger the download from this direct click @@ -931,7 +948,7 @@ private void buildShapeTab(Container parent) { parent.add(help); Button upload = new Button(bodyImage != null ? "Replace image" : "Upload image"); upload.setUIID("SkinDesignerSecondaryButton"); - FontImage.setMaterialIcon(upload, FontImage.MATERIAL_FILE_UPLOAD); + applyMaterialIcon(upload, FontImage.MATERIAL_FILE_UPLOAD); upload.addActionListener(e -> pickImage(() -> { livePreview.setBodyImage(bodyImage); rebuildSidebarBody(); @@ -1087,7 +1104,7 @@ private Container buildCutoutRow(int idx) { // The X button stays an independent Button so it can fire on its own Button rm = new Button(); rm.setUIID("SkinDesignerIconButton"); - FontImage.setMaterialIcon(rm, FontImage.MATERIAL_CLOSE); + applyMaterialIcon(rm, FontImage.MATERIAL_CLOSE); rm.addActionListener(e -> { skin.cutouts.remove(idx); if (selectedCutout == idx) selectedCutout = -1; @@ -1116,7 +1133,7 @@ private Container buildCutoutEditor(int idx) { private Button addCutoutBtn(String label, String type) { Button b = new Button(label); b.setUIID("SkinDesignerSecondaryButton"); - FontImage.setMaterialIcon(b, FontImage.MATERIAL_ADD); + applyMaterialIcon(b, FontImage.MATERIAL_ADD); b.addActionListener(e -> { SkinModel.Cutout nc; switch (type) { @@ -1272,7 +1289,7 @@ private Container buildDoneStep() { // it lives on the SkinDesignerDoneCheck UIID's background. Label check = new Label(); check.setUIID("SkinDesignerDoneCheck"); - FontImage.setMaterialIcon(check, FontImage.MATERIAL_CHECK, 5.0f); + applyMaterialIcon(check, FontImage.MATERIAL_CHECK, 5.0f); Container checkWrap = FlowLayout.encloseCenter(check); root.add(checkWrap); @@ -1302,7 +1319,7 @@ private Container buildDoneStep() { // path on browsers that blocked the auto-trigger from Finish. Button download = new Button("Download skin"); download.setUIID("SkinDesignerPrimaryButton"); - FontImage.setMaterialIcon(download, FontImage.MATERIAL_FILE_DOWNLOAD); + applyMaterialIcon(download, FontImage.MATERIAL_FILE_DOWNLOAD); download.addActionListener(e -> { // If we already have generated bytes, just re-fire the download // (also from a direct gesture). Otherwise generate now. @@ -1315,12 +1332,12 @@ private Container buildDoneStep() { Button back = new Button("Back to editor"); back.setUIID("SkinDesignerSecondaryButton"); - FontImage.setMaterialIcon(back, FontImage.MATERIAL_CHEVRON_LEFT); + applyMaterialIcon(back, FontImage.MATERIAL_CHEVRON_LEFT); back.addActionListener(e -> goToStep(STEP_EDIT)); Button restartBtn = new Button("Make another skin"); restartBtn.setUIID("SkinDesignerSecondaryButton"); - FontImage.setMaterialIcon(restartBtn, FontImage.MATERIAL_REFRESH); + applyMaterialIcon(restartBtn, FontImage.MATERIAL_REFRESH); restartBtn.addActionListener(e -> restart()); Container actions = new Container(new FlowLayout(Component.CENTER)); @@ -1758,6 +1775,24 @@ private void applyDarkRecursive(Component c) { c.setUIID(themed); } } + // Hover-card baseUIID may have been captured under the previous + // theme; recompute against the now-current theme so the hover + // swap restores to the right variant. + Object base = c.getClientProperty("baseUIID"); + if (base instanceof String) { + String rebased = themedUiid((String) base, websiteDarkMode); + if (!rebased.equals(base)) { + c.putClientProperty("baseUIID", rebased); + } + } + // Material icons bake the host's bg color into the image. After we + // swap UIID light->dark, the icon's background is still the old + // theme's. Re-bake against the now-current style so the icon's + // transparent area matches the surrounding button. + Object iconChar = c.getClientProperty("materialIcon"); + if (iconChar instanceof Character && c instanceof Label) { + applyMaterialIcon((Label) c, (Character) iconChar); + } if (c instanceof Container) { Container container = (Container) c; for (int i = 0; i < container.getComponentCount(); i++) { @@ -1766,6 +1801,29 @@ private void applyDarkRecursive(Component c) { } } + /** + * Sets a material icon on the label and remembers the char so + * {@link #applyDarkRecursive(Component)} can re-bake it after a theme + * switch. Forces a transparent style background so the icon image + * never carries a solid colored block (which produced a "white square + * behind the arrow" in dark mode where the button was light at the + * time of icon creation). + */ + private static void applyMaterialIcon(Label l, char icon) { + l.putClientProperty("materialIcon", icon); + Style s = new Style(l.getUnselectedStyle()); + s.setBgTransparency(0); + l.setIcon(FontImage.createMaterial(icon, s, 4f)); + } + + /** Variant with explicit size in mm. */ + private static void applyMaterialIcon(Label l, char icon, float sizeMM) { + l.putClientProperty("materialIcon", icon); + Style s = new Style(l.getUnselectedStyle()); + s.setBgTransparency(0); + l.setIcon(FontImage.createMaterial(icon, s, sizeMM)); + } + private String themedUiid(String uiid, boolean dark) { if (uiid == null || uiid.isEmpty()) return uiid; if (!uiid.startsWith("SkinDesigner")) return uiid; From 7c6fcd971ffb155d5c5a4f488583e3b0fdb3e075 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 3 May 2026 11:04:23 +0300 Subject: [PATCH 37/55] Skin Designer: search hint icon bg + dark-themed filter rebuild + lighter idle poll MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Search hint magnifier in dark mode: - search.setHintIcon was passing search.getStyle() straight to FontImage.createMaterial, so the baked icon image carried the search field's solid white background. After dark mode flipped the field to a dark blue, the icon still displayed as a white square. Build a Style copy with bgTransparency=0 before createMaterial so the icon is glyph-only. Filter toggle losing dark mode on rebuild: - rebuildDeviceGrid runs outside of renderStep (it's wired to filter chip clicks and the debounced search), so the freshly-built device cards never went through applyDarkRecursive — they stayed in light-mode UIIDs while the rest of the form was already dark. Selecting one then swapped just the wrapper to the dark variant via applySelectionToGrid, leaving the inner Labels/specs in light mode. Now applyDarkRecursive(grid) is invoked at the end of rebuildDeviceGrid so all new cards inherit the current theme. Idle freeze from theme polling: - UITimer was hitting readThemeFromUrl every 900 ms forever. Each tick crosses the CN1 JS-port bridge to read window.location.href, and enough idle ticks accumulate enough JS-side work that the browser tab eventually locks up. Bumped the interval to 5 s — still near-instant response when the user toggles ?theme= on the website shell, but ~5x less work over an idle session. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../tools/skindesigner/SkinDesigner.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index d86bcf7d71..ae982fdfa3 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -123,7 +123,12 @@ public void pointerHover(int[] x, int[] y) { renderStep(); form.show(); - UITimer.timer(900, true, form, () -> { + // Theme drift poll. Was 900ms, but each tick crosses the JS-port + // bridge to read window.location.href; over an idle session it + // accumulated enough JS-side work to lock the browser tab. 5 s + // gives the user a near-immediate response without polling on + // every animation frame. + UITimer.timer(5000, true, form, () -> { boolean dark = readThemeFromUrl(); if (dark != websiteDarkMode) { websiteDarkMode = dark; @@ -366,9 +371,13 @@ private Container buildDeviceStep() { TextField search = new TextField("", "Search devices…", 24, TextField.ANY); search.setUIID("SkinDesignerSearchField"); - // Magnifier glass material icon as the hint icon, matching the design. + // Magnifier glass material icon as the hint icon. Force the icon + // style's bg transparent so the baked image doesn't carry the + // search field's solid white block (visible after dark-mode swap). + Style searchIconStyle = new Style(search.getStyle()); + searchIconStyle.setBgTransparency(0); search.setHintIcon(FontImage.createMaterial( - FontImage.MATERIAL_SEARCH, search.getStyle(), 3.4f)); + FontImage.MATERIAL_SEARCH, searchIconStyle, 3.4f)); String[] filterIds = { "all", "phone", "tablet", "fold" }; String[] filterLabels = { "All", "Phones", "Tablets", "Foldables" }; @@ -518,6 +527,10 @@ private void rebuildDeviceGrid(Container grid, String query, String filter) { } grid.add(row); } + // Filter rebuilds happen outside renderStep, so applyDarkRecursive + // wasn't running on the freshly-built cards — leaving them in + // light-mode UIIDs even when the rest of the form was dark. + applyDarkRecursive(grid); grid.revalidate(); } From 945c1425968460de96fe78916d050bc154d3b5ea Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 3 May 2026 11:19:13 +0300 Subject: [PATCH 38/55] Skin Designer: skin .properties matches simulator expectations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tiny fonts (text 0.6mm tall on a 460ppi device): - DeviceDatabase stores iOS-style point font sizes (12/15/22) which we were writing into skin.properties as smallFontSize/mediumFontSize/ largeFontSize. The simulator (JavaSEPort.java around line 2870) reads those as physical pixels and uses them verbatim — on a high-ppi screen that renders sub-millimeter text and the UI is unreadable. When those properties are absent, the simulator auto-derives them from pixelMilliRatio: med = round(2.6 * ppmm), sm = 2 * ppmm, la = 3.3 * ppmm — which is the right size for the device. Stop writing the font-size properties so the simulator's auto-compute kicks in. DPI propagation: - Also write `ppi` directly (the simulator prefers `ppi` over `pixelRatio` when both are present — JavaSEPort uses ppi/25.4 to derive the same pixelMilliRatio). Keep `pixelRatio` (= ppi/25.4) as a fallback for any older skin loaders. Bezel coordinate consistency: - skinBezelInPx (used by buildProperties to write safe area / display origin) and generatePortraitImage (used to draw the skin and overlay PNGs) were computing different bezel pixel values. The skin image placed the screen rect at (bezelPx_a, bezelPx_a) but safePortraitX/Y was written against bezelPx_b — leaving safe area off by ~10px on high-res devices. Both now use: bezelPx = round(skin.bezel * (resolutionW / VB_W)) so the safe-area rectangle aligns with the screen rect in the generated skin.png. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../tools/skindesigner/SkinDesigner.java | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index ae982fdfa3..2b0ff8b490 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -1449,10 +1449,13 @@ private byte[] imageBytes(Image img) throws IOException { } private int skinBezelInPx(int totalW, int totalH) { - // Bezel is stored relative to the design's 320×620 viewbox; scale up to - // device pixels so screen position lands at (bezel, bezel) within the - // generated image. - return Math.round(((float) skin.bezel / DevicePreview.VB_W) * totalW); + // Use the SAME formula as generatePortraitImage so safe-area + // coordinates align with where the screen actually starts in the + // generated skin image. Previously we mixed two different scaling + // strategies — buildProperties wrote safePortraitY against + // bezelPx_a but the image was generated with bezelPx_b — leaving + // the safe area off by ~10px on high-res devices. + return Math.round(skin.bezel * ((float) device.resolutionW / DevicePreview.VB_W)); } private int skinCornerInPx(int totalW) { @@ -1654,12 +1657,20 @@ private Properties buildProperties(int totalW, int totalH) { p.put("systemFontFamily", device.systemFont); p.put("proportionalFontFamily", device.proportionalFont); p.put("monospaceFontFamily", device.monoFont); - p.put("smallFontSize", String.valueOf(device.fontSmall)); - p.put("mediumFontSize", String.valueOf(device.fontMedium)); - p.put("largeFontSize", String.valueOf(device.fontLarge)); - // CN1's pixelRatio is *pixels per millimeter*; convert from PPI. - double ppmm = device.ppi / 25.4; - p.put("pixelRatio", String.valueOf(ppmm)); + // Don't write smallFontSize/mediumFontSize/largeFontSize. The + // simulator (JavaSEPort line ~2870) auto-derives correct sizes + // from pixelMilliRatio when those are absent: + // med = round(2.6 * ppmm), sm = 2 * ppmm, la = 3.3 * ppmm + // Our DeviceDatabase entries store iOS-style point values + // (12/15/22), and writing those overrides the simulator's + // physical-pixel computation — on a 460 ppi device that's a + // sub-millimeter font and the UI text is unreadable. + // Also write `ppi` so the simulator computes pixelMilliRatio = ppi/25.4 + // (it prefers `ppi` over `pixelRatio`). + p.put("ppi", String.valueOf(device.ppi)); + // Keep pixelRatio (= pixels per millimeter) as a fallback for older + // skin loaders that didn't read `ppi`. + p.put("pixelRatio", String.valueOf(device.ppi / 25.4)); p.put("overrideNames", overrideNames(device)); int bezelPx = skinBezelInPx(totalW, totalH); From d3d17c6108fdc05ebc620aec054fed8cca503d23 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 3 May 2026 12:45:35 +0300 Subject: [PATCH 39/55] Skin Designer: filter chip dark mode + safe-area in display coords MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Filter chip dark mode regression: - Click handler always set the light-mode UIID (FilterTag / FilterTagActive). In dark mode the chips momentarily flashed to light variants — title/text remained visibly light even after applyDarkRecursive ran. Click handler now composes the dark suffix via themedUiid() so the chip stays themed across clicks. Safe area coordinate space: - Looking at Container.snapToSafeAreaInternal in CodenameOne core: int safeTopMargin = rect.getY(); int safeLeftMargin = rect.getX(); The framework treats the rect from getDisplaySafeArea() as *display-relative* margins (origin at the screen's top-left), not skin-image absolute coords. We were writing safePortraitY = bezelPx + safeTopPx (skin-image coords), so the framework saw a top inset of bezelPx + 238 = 327 — pushing UI way too far down — but, more relevant for the user, the bezelPx + offset meant the iOS theme's title bar was anchored relative to the display origin and never reached the inset, leaving it stuck at display y = 0 visually behind the dynamic island. Now writes safe area in display coords: safePortraitX = 0 safePortraitY = safeTopPx safePortraitWidth = device.resolutionW safePortraitHeight = device.resolutionH - safeTopPx - safeBottomPx Landscape is the 90° rotation: portrait top inset becomes landscape left inset, portrait bottom inset becomes landscape right inset. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../tools/skindesigner/SkinDesigner.java | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 2b0ff8b490..b8dfb33383 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -406,11 +406,18 @@ private Container buildDeviceStep() { for (int i = 0; i < filterIds.length; i++) { final String id = filterIds[i]; Button b = new Button(filterLabels[i]); - b.setUIID("all".equals(id) ? "SkinDesignerFilterTagActive" : "SkinDesignerFilterTag"); + b.setUIID(themedUiid( + "all".equals(id) ? "SkinDesignerFilterTagActive" : "SkinDesignerFilterTag", + websiteDarkMode)); b.addActionListener(e -> { activeFilter[0] = id; + // Compose the dark suffix when needed, otherwise the chips + // would all flash to their light-mode UIID on every click. for (int j = 0; j < filters.length; j++) { - filters[j].setUIID(filterIds[j].equals(id) ? "SkinDesignerFilterTagActive" : "SkinDesignerFilterTag"); + String base = filterIds[j].equals(id) + ? "SkinDesignerFilterTagActive" + : "SkinDesignerFilterTag"; + filters[j].setUIID(themedUiid(base, websiteDarkMode)); } // Repaint the chip change immediately, then defer the (slow) // grid rebuild to the next event-loop tick so the press @@ -1696,28 +1703,32 @@ private Properties buildProperties(int totalW, int totalH) { float vbToPx = (float) device.resolutionW / DevicePreview.VB_W; int safeTopPx = Math.round(effectiveSafeTopVB * vbToPx); int safeBottomPx = Math.round(skin.safeBottom * vbToPx); - int safeX = bezelPx; - int safeY = bezelPx + safeTopPx; + + // Safe area is consumed by Container.snapToSafeAreaInternal, which + // treats the rect's X/Y as inset margins from the *display* origin + // (not the skin image). So write 0,Y,W,H in display-relative coords: + // origin (0,0) is the screen top-left, Y is the top inset, etc. int safeW = device.resolutionW; int safeH = Math.max(1, device.resolutionH - safeTopPx - safeBottomPx); - - p.put("safePortraitX", String.valueOf(safeX)); - p.put("safePortraitY", String.valueOf(safeY)); + p.put("safePortraitX", "0"); + p.put("safePortraitY", String.valueOf(safeTopPx)); p.put("safePortraitWidth", String.valueOf(safeW)); p.put("safePortraitHeight", String.valueOf(safeH)); - // Landscape is portrait rotated 90° clockwise — swap accordingly - int landTotalW = totalH; - int landTotalH = totalW; - int landSafeX = bezelPx + safeBottomPx; // bottom edge becomes left - int landSafeY = bezelPx; + + // Landscape is portrait rotated 90° clockwise. The display now has + // width = portraitH and height = portraitW. The portrait top inset + // becomes the landscape *left* inset; the portrait bottom inset + // becomes the landscape right inset. int landSafeW = Math.max(1, device.resolutionH - safeTopPx - safeBottomPx); int landSafeH = device.resolutionW; - // Suppress unused-var warnings on totals - if (landTotalW + landTotalH == 0) {} // no-op - p.put("safeLandscapeX", String.valueOf(landSafeX)); - p.put("safeLandscapeY", String.valueOf(landSafeY)); + p.put("safeLandscapeX", String.valueOf(safeTopPx)); + p.put("safeLandscapeY", "0"); p.put("safeLandscapeWidth", String.valueOf(landSafeW)); p.put("safeLandscapeHeight", String.valueOf(landSafeH)); + + // bezelPx is unused now that the safe-area coords are display-relative, + // but skin generation still needs it elsewhere. + if (bezelPx < 0) { /* keep var alive */ } return p; } From 5fa3853f23b15439524b470b5e965ad48fbd39f7 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 3 May 2026 14:11:32 +0300 Subject: [PATCH 40/55] Skin Designer: cutouts in top frame + rounded screen corners Match the builtin iPhone X / 11 / 12 / 13 skin behavior the user expected: a gap above the screen that the notch / island fits into, and rounded screen corners. Cutout placement: - Old behavior: cutouts were drawn as opaque-black shapes inside the screen rect (closer to iPhone 14 Pro reality, where the island is software-reserved within a rectangular display). The simulator renders UI behind the cutout and the iOS 7-era theme has no idea to avoid it. - New behavior: the skin image now reserves a top frame extension (height = max cutout extent above screen) and renders cutouts in that extension hanging down toward the screen top. The screen rect starts BELOW the cutouts. computeTopCutoutPx() / applyTopFrameCutouts() encode this; generateOverlay positions the skin_map's screen rect to match. - For NOTCH (c.y=0), the cutout's bottom touches the screen top. - For ISLAND / HOLE, c.y is the gap (in vb px) between cutout-bottom and screen-top. Rounded screen corners: - Replaced carveScreenRect with carveRoundedScreenRect: only carves the inside of a rounded rect, leaving frame material at the four corners. The visible screen now has a rounded outline that matches the bezel's outer corner radius minus 8 vb px (consistent with the editor preview's screenR formula). - Screen corner radius = max(0, cornerR - 8) * scale. Safe-area follow-up: - Now that cutouts no longer intrude into the screen, dropped the cutout-extent contribution to safeTop. The user's configured skin.safeTop is the only inset. Default values from DeviceDatabase (e.g. 59 for iPhone with island) still cover the iOS status bar above the screen. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../tools/skindesigner/SkinDesigner.java | 192 ++++++++++++------ 1 file changed, 130 insertions(+), 62 deletions(-) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index b8dfb33383..731e9a2371 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -1475,53 +1475,77 @@ private int skinCornerInPx(int totalW) { * with alpha=0) starts at (bezelPx, bezelPx) and spans the full device * resolution. */ + /** + * How tall the top frame extension needs to be (in physical pixels) to + * fit any cutouts the user added above the screen rect. Matches the + * builtin iPhone X / 11 / 12 / 13 skin convention where the notch sits + * in the device frame above the screen, leaving a gap. + */ + private int computeTopCutoutPx(float scale) { + int maxExtentVB = 0; + for (SkinModel.Cutout c : skin.cutouts) { + int extentVB; + if (SkinModel.CUTOUT_NOTCH.equals(c.type)) { + // Notch is anchored at the top of the frame and protrudes down c.h vb px. + extentVB = c.h; + } else { + // Island / hole: c.y is the gap between cutout bottom and screen top + // (in viewbox space). Extent above screen = c.y + c.h. + extentVB = c.y + c.h; + } + if (extentVB > maxExtentVB) { + maxExtentVB = extentVB; + } + } + return Math.round(maxExtentVB * scale); + } + private Image generatePortraitImage() { if (SkinModel.SOURCE_IMAGE.equals(source) && bodyImage != null) { return generateImageBased(); } - // Resolve bezel/corner from the design viewbox into device-pixel space. - // Use a sensible fixed bezel (in device px) so that on large devices the - // frame stays modest. The user-facing bezel value (in viewbox px) is - // remapped onto a per-device device-pixel value. float framePxScale = ((float) device.resolutionW) / DevicePreview.VB_W; int bezelPx = Math.round(skin.bezel * framePxScale); int cornerPx = Math.round(skin.cornerR * framePxScale); + int screenCornerPx = Math.max(0, cornerPx - Math.round(8 * framePxScale)); + int topCutoutPx = computeTopCutoutPx(framePxScale); int totalW = device.resolutionW + bezelPx * 2; - int totalH = device.resolutionH + bezelPx * 2; + int totalH = device.resolutionH + bezelPx * 2 + topCutoutPx; + int screenY = bezelPx + topCutoutPx; - // Start with a solid dark frame Image base = Image.createImage(totalW, totalH, 0xff121822); Graphics g = base.getGraphics(); g.setAntiAliased(true); - - // Inner highlight to fake a gradient edge g.setColor(0x2a2f3a); int inset = Math.max(1, totalW / 200); g.fillRoundRect(inset, inset, totalW - inset * 2, totalH - inset * 2, Math.max(0, (cornerPx - inset) * 2), Math.max(0, (cornerPx - inset) * 2)); - // Carve the rounded shape: paint outside the round-rect transparent int[] data = base.getRGB(); applyRoundRectAlphaMask(data, totalW, totalH, 0, 0, totalW, totalH, cornerPx); - // Carve the screen (alpha=0 inside) - carveScreenRect(data, totalW, totalH, bezelPx, bezelPx, - device.resolutionW, device.resolutionH); + // Carve the screen with rounded corners — the frame material left at + // the corners gives the visible rounded screen edge. + carveRoundedScreenRect(data, totalW, totalH, bezelPx, screenY, + device.resolutionW, device.resolutionH, screenCornerPx); - // Carve cutouts (still alpha=0) - applyCutouts(data, totalW, totalH, bezelPx, bezelPx, - device.resolutionW, device.resolutionH, framePxScale); + // Cutouts hang from the bottom of the top frame extension into the + // gap above the screen, never inside the screen rect. + applyTopFrameCutouts(data, totalW, totalH, bezelPx, screenY, + device.resolutionW, framePxScale); return Image.createImage(data, totalW, totalH); } private Image generateImageBased() { - // Fit the uploaded image into a (device.resolutionW + 2*bezelPx) canvas float framePxScale = ((float) device.resolutionW) / DevicePreview.VB_W; int bezelPx = Math.round(skin.bezel * framePxScale); int cornerPx = Math.round(skin.cornerR * framePxScale); + int screenCornerPx = Math.max(0, cornerPx - Math.round(8 * framePxScale)); + int topCutoutPx = computeTopCutoutPx(framePxScale); int totalW = device.resolutionW + bezelPx * 2; - int totalH = device.resolutionH + bezelPx * 2; + int totalH = device.resolutionH + bezelPx * 2 + topCutoutPx; + int screenY = bezelPx + topCutoutPx; Image canvas = Image.createImage(totalW, totalH, 0); Graphics g = canvas.getGraphics(); @@ -1533,21 +1557,31 @@ private Image generateImageBased() { int[] data = canvas.getRGB(); applyRoundRectAlphaMask(data, totalW, totalH, 0, 0, totalW, totalH, cornerPx); - carveScreenRect(data, totalW, totalH, bezelPx, bezelPx, - device.resolutionW, device.resolutionH); - applyCutouts(data, totalW, totalH, bezelPx, bezelPx, - device.resolutionW, device.resolutionH, framePxScale); + carveRoundedScreenRect(data, totalW, totalH, bezelPx, screenY, + device.resolutionW, device.resolutionH, screenCornerPx); + applyTopFrameCutouts(data, totalW, totalH, bezelPx, screenY, + device.resolutionW, framePxScale); return Image.createImage(data, totalW, totalH); } private Image generateOverlay(int totalW, int totalH, int bezelPx) { + // The screen rect in skin_map.png matches where it lives in skin.png: + // shifted DOWN by the top-frame cutout extension so the simulator + // sees the screen starting below the cutout. + float framePxScale = ((float) device.resolutionW) / DevicePreview.VB_W; + int topCutoutPx = computeTopCutoutPx(framePxScale); + int screenY = bezelPx + topCutoutPx; Image overlay = Image.createImage(totalW, totalH, 0); Graphics g = overlay.getGraphics(); g.setColor(0x000000); - g.fillRect(bezelPx, bezelPx, device.resolutionW, device.resolutionH); + g.fillRect(bezelPx, screenY, device.resolutionW, device.resolutionH); return overlay; } + /** Carves a rectangular block transparent (alpha=0). Used by the + * rounded-corner variant after it decides which pixels lie inside + * the rounded shape. */ + @SuppressWarnings("unused") private void carveScreenRect(int[] data, int w, int h, int x, int y, int rw, int rh) { int x2 = Math.min(w, x + rw); int y2 = Math.min(h, y + rh); @@ -1559,6 +1593,73 @@ private void carveScreenRect(int[] data, int w, int h, int x, int y, int rw, int } } + /** Like {@link #carveScreenRect} but only carves the inside of a + * rounded rect — the four corner pixels remain frame material so the + * rendered screen looks rounded inside the bezel. */ + private void carveRoundedScreenRect(int[] data, int w, int h, + int x, int y, int rw, int rh, int radius) { + int r = Math.max(0, Math.min(radius, Math.min(rw, rh) / 2)); + int r2 = r * r; + int rightInner = x + rw - r - 1; + int bottomInner = y + rh - r - 1; + int x2 = Math.min(w, x + rw); + int y2 = Math.min(h, y + rh); + for (int yy = Math.max(0, y); yy < y2; yy++) { + int row = yy * w; + for (int xx = Math.max(0, x); xx < x2; xx++) { + if (r == 0) { + data[row + xx] = 0; + continue; + } + int relX = xx - x; + int relY = yy - y; + int dx, dy; + if (relX < r && relY < r) { + dx = r - relX; dy = r - relY; + } else if (xx > rightInner && relY < r) { + dx = xx - rightInner; dy = r - relY; + } else if (relX < r && yy > bottomInner) { + dx = r - relX; dy = yy - bottomInner; + } else if (xx > rightInner && yy > bottomInner) { + dx = xx - rightInner; dy = yy - bottomInner; + } else { + data[row + xx] = 0; + continue; + } + if (dx * dx + dy * dy <= r2) { + data[row + xx] = 0; + } + } + } + } + + /** + * Renders cutouts in the frame extension above the screen, never inside + * the screen rect. The cutout's bottom edge sits {@code c.y * scale} px + * above the screen top; for notch (c.y=0) the bottom touches the screen. + */ + private void applyTopFrameCutouts(int[] data, int w, int h, + int bezelPx, int screenY, int sw, float scale) { + int cx = bezelPx + sw / 2; + for (SkinModel.Cutout c : skin.cutouts) { + int cw = Math.round(c.w * scale); + int ch = Math.round(c.h * scale); + int ox = cx + Math.round(c.x * scale); + int yOffset = Math.round(c.y * scale); + int oy = screenY - yOffset - ch; + if (SkinModel.CUTOUT_NOTCH.equals(c.type)) { + int x0 = ox - cw / 2; + fillRect(data, w, h, x0, oy, cw, ch); + } else if (SkinModel.CUTOUT_ISLAND.equals(c.type)) { + int x0 = ox - cw / 2; + fillRoundedRect(data, w, h, x0, oy, cw, ch, ch / 2); + } else if (SkinModel.CUTOUT_HOLE.equals(c.type)) { + int r = cw / 2; + fillCircle(data, w, h, ox, oy + ch / 2, r); + } + } + } + private void applyRoundRectAlphaMask(int[] data, int w, int h, int x, int y, int rw, int rh, int radius) { if (radius <= 0) return; @@ -1586,26 +1687,8 @@ private void applyRoundRectAlphaMask(int[] data, int w, int h, } } - private void applyCutouts(int[] data, int w, int h, - int screenX, int screenY, int sw, int sh, float scale) { - int cx = screenX + sw / 2; - for (SkinModel.Cutout c : skin.cutouts) { - int cw = Math.round(c.w * scale); - int ch = Math.round(c.h * scale); - int ox = cx + Math.round(c.x * scale); - int oy = screenY + Math.round(c.y * scale); - if (SkinModel.CUTOUT_NOTCH.equals(c.type)) { - int x0 = ox - cw / 2; - fillRect(data, w, h, x0, screenY, cw, ch); - } else if (SkinModel.CUTOUT_ISLAND.equals(c.type)) { - int x0 = ox - cw / 2; - fillRoundedRect(data, w, h, x0, oy, cw, ch, ch / 2); - } else if (SkinModel.CUTOUT_HOLE.equals(c.type)) { - int r = cw / 2; - fillCircle(data, w, h, ox, oy + ch / 2, r); - } - } - } + // applyCutouts (the old in-screen renderer) replaced by + // applyTopFrameCutouts which positions cutouts above the screen. private void fillRect(int[] data, int w, int h, int x, int y, int rw, int rh) { int x2 = Math.min(w, x + rw); @@ -1681,27 +1764,12 @@ private Properties buildProperties(int totalW, int totalH) { p.put("overrideNames", overrideNames(device)); int bezelPx = skinBezelInPx(totalW, totalH); - // Effective safe-top must cover any cutouts the user added (notch, - // island, hole) that intrude into the screen, otherwise content - // would render under them. Use the deepest cutout extent in the - // viewbox space, then take max with the user-set skin.safeTop. - int cutoutSafeTopVB = 0; - for (SkinModel.Cutout c : skin.cutouts) { - int extent; - if (SkinModel.CUTOUT_NOTCH.equals(c.type)) { - // Notches start at y=0 and protrude h px down. - extent = c.h; - } else { - // Island / hole y is from screen top; bottom edge is y + h. - extent = c.y + c.h; - } - if (extent > cutoutSafeTopVB) { - cutoutSafeTopVB = extent; - } - } - int effectiveSafeTopVB = Math.max(skin.safeTop, cutoutSafeTopVB); + // Cutouts now live in the top frame extension (above the screen + // rect), so they no longer eat into the screen area and we don't + // need to extend safeTop to cover them. Just translate the + // user-configured safeTop / safeBottom into device pixels. float vbToPx = (float) device.resolutionW / DevicePreview.VB_W; - int safeTopPx = Math.round(effectiveSafeTopVB * vbToPx); + int safeTopPx = Math.round(skin.safeTop * vbToPx); int safeBottomPx = Math.round(skin.safeBottom * vbToPx); // Safe area is consumed by Container.snapToSafeAreaInternal, which From 82252c39cf8de0ae8dfcb2fb500d052897025cc2 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 3 May 2026 14:31:17 +0300 Subject: [PATCH 41/55] Skin Designer: Dynamic Island floats inside the screen, notches in frame MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous commit moved every cutout type into the top frame extension above the screen, which is correct for iPhone X / 11 / 12 / 13 hardware notches but wrong for Dynamic Island and Android punch-holes — those are software-reserved space *inside* a rectangular display, not physical cutouts. The user wanted the island to "float" on top of the iOS status bar rather than sit in the device frame. Now the cutout types are split: - NOTCH (physical hardware cutout): rendered in the top frame extension above the screen, with the bottom edge touching the screen top. computeTopCutoutPx() / applyTopFrameCutouts() handle these. Matches the builtin iPhone X skin behaviour — a gap above the screen the notch fits into. - ISLAND, HOLE (software / in-display): drawn as opaque pills/circles inside the screen rect via applyInScreenCutouts(). The iOS status bar paints in the safe area top and the island appears floating on top of it, like real iPhone 14 Pro+. computeTopCutoutPx no longer counts these so the screen rect doesn't shift down for them. Safe-area knock-on: - Restored the cutout-extent contribution to safeTop, but ONLY for in-screen cutouts (islands, holes). effectiveSafeTopVB = max(skin.safeTop, max(c.y + c.h) for non-notch cutouts) so app content lands below the floating island even when the user-set safeTop is smaller than the cutout extent. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../tools/skindesigner/SkinDesigner.java | 96 +++++++++++++------ 1 file changed, 68 insertions(+), 28 deletions(-) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 731e9a2371..c5b6a7841a 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -1477,24 +1477,23 @@ private int skinCornerInPx(int totalW) { */ /** * How tall the top frame extension needs to be (in physical pixels) to - * fit any cutouts the user added above the screen rect. Matches the - * builtin iPhone X / 11 / 12 / 13 skin convention where the notch sits - * in the device frame above the screen, leaving a gap. + * fit notch cutouts above the screen rect. Notches are physical + * hardware cutouts (iPhone X / 11 / 12 / 13 style) and live in the + * device frame. + * + * Islands and punch-holes are NOT counted here — they're software/in- + * display features (iPhone 14 Pro+ Dynamic Island, Android camera + * holes), so they're drawn floating inside the screen rect with the + * iOS status bar / safe area pushing content below them. */ private int computeTopCutoutPx(float scale) { int maxExtentVB = 0; for (SkinModel.Cutout c : skin.cutouts) { - int extentVB; - if (SkinModel.CUTOUT_NOTCH.equals(c.type)) { - // Notch is anchored at the top of the frame and protrudes down c.h vb px. - extentVB = c.h; - } else { - // Island / hole: c.y is the gap between cutout bottom and screen top - // (in viewbox space). Extent above screen = c.y + c.h. - extentVB = c.y + c.h; + if (!SkinModel.CUTOUT_NOTCH.equals(c.type)) { + continue; } - if (extentVB > maxExtentVB) { - maxExtentVB = extentVB; + if (c.h > maxExtentVB) { + maxExtentVB = c.h; } } return Math.round(maxExtentVB * scale); @@ -1529,10 +1528,15 @@ private Image generatePortraitImage() { carveRoundedScreenRect(data, totalW, totalH, bezelPx, screenY, device.resolutionW, device.resolutionH, screenCornerPx); - // Cutouts hang from the bottom of the top frame extension into the - // gap above the screen, never inside the screen rect. + // Notches hang from the top frame extension into the gap above the + // screen rect (physical hardware cutout, iPhone X / 11 / 12 / 13). applyTopFrameCutouts(data, totalW, totalH, bezelPx, screenY, device.resolutionW, framePxScale); + // Islands and punch-holes float inside the screen rect — Dynamic + // Island and Android camera holes are software-reserved space the + // OS status bar paints around, not physical cutouts. + applyInScreenCutouts(data, totalW, totalH, bezelPx, screenY, + device.resolutionW, framePxScale); return Image.createImage(data, totalW, totalH); } @@ -1561,6 +1565,8 @@ private Image generateImageBased() { device.resolutionW, device.resolutionH, screenCornerPx); applyTopFrameCutouts(data, totalW, totalH, bezelPx, screenY, device.resolutionW, framePxScale); + applyInScreenCutouts(data, totalW, totalH, bezelPx, screenY, + device.resolutionW, framePxScale); return Image.createImage(data, totalW, totalH); } @@ -1634,23 +1640,45 @@ private void carveRoundedScreenRect(int[] data, int w, int h, } /** - * Renders cutouts in the frame extension above the screen, never inside - * the screen rect. The cutout's bottom edge sits {@code c.y * scale} px - * above the screen top; for notch (c.y=0) the bottom touches the screen. + * Renders notch cutouts (physical hardware cutouts) hanging from the + * top frame extension down to the screen top. Used for iPhone X / 11 / + * 12 / 13 style devices where the notch occupies a U-shaped chunk of + * the device frame above the display. */ private void applyTopFrameCutouts(int[] data, int w, int h, int bezelPx, int screenY, int sw, float scale) { int cx = bezelPx + sw / 2; for (SkinModel.Cutout c : skin.cutouts) { + if (!SkinModel.CUTOUT_NOTCH.equals(c.type)) { + continue; + } int cw = Math.round(c.w * scale); int ch = Math.round(c.h * scale); int ox = cx + Math.round(c.x * scale); - int yOffset = Math.round(c.y * scale); - int oy = screenY - yOffset - ch; + int oy = screenY - ch; + int x0 = ox - cw / 2; + fillRect(data, w, h, x0, oy, cw, ch); + } + } + + /** + * Renders software cutouts (Dynamic Island, punch-hole cameras) as + * opaque pills/circles floating *inside* the screen rect. The iOS + * theme reserves the safe-area top for the status bar, and these + * shapes appear painted on top of that area in the skin overlay. + */ + private void applyInScreenCutouts(int[] data, int w, int h, + int bezelPx, int screenY, int sw, float scale) { + int cx = bezelPx + sw / 2; + for (SkinModel.Cutout c : skin.cutouts) { if (SkinModel.CUTOUT_NOTCH.equals(c.type)) { - int x0 = ox - cw / 2; - fillRect(data, w, h, x0, oy, cw, ch); - } else if (SkinModel.CUTOUT_ISLAND.equals(c.type)) { + continue; + } + int cw = Math.round(c.w * scale); + int ch = Math.round(c.h * scale); + int ox = cx + Math.round(c.x * scale); + int oy = screenY + Math.round(c.y * scale); + if (SkinModel.CUTOUT_ISLAND.equals(c.type)) { int x0 = ox - cw / 2; fillRoundedRect(data, w, h, x0, oy, cw, ch, ch / 2); } else if (SkinModel.CUTOUT_HOLE.equals(c.type)) { @@ -1764,12 +1792,24 @@ private Properties buildProperties(int totalW, int totalH) { p.put("overrideNames", overrideNames(device)); int bezelPx = skinBezelInPx(totalW, totalH); - // Cutouts now live in the top frame extension (above the screen - // rect), so they no longer eat into the screen area and we don't - // need to extend safeTop to cover them. Just translate the - // user-configured safeTop / safeBottom into device pixels. + // Notch cutouts live in the top frame extension above the screen, + // so they don't eat into safeTop. But islands and punch-holes are + // drawn floating *inside* the screen and the iOS status bar + // reserves space for them — extend safeTop to cover their bottom + // edge so app content lands below. + int inScreenCutoutBottomVB = 0; + for (SkinModel.Cutout c : skin.cutouts) { + if (SkinModel.CUTOUT_NOTCH.equals(c.type)) { + continue; + } + int extentVB = c.y + c.h; + if (extentVB > inScreenCutoutBottomVB) { + inScreenCutoutBottomVB = extentVB; + } + } + int effectiveSafeTopVB = Math.max(skin.safeTop, inScreenCutoutBottomVB); float vbToPx = (float) device.resolutionW / DevicePreview.VB_W; - int safeTopPx = Math.round(skin.safeTop * vbToPx); + int safeTopPx = Math.round(effectiveSafeTopVB * vbToPx); int safeBottomPx = Math.round(skin.safeBottom * vbToPx); // Safe area is consumed by Container.snapToSafeAreaInternal, which From 7234d77f05eb8971e5dbf45f7d1e9302b979f80d Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 3 May 2026 16:28:44 +0300 Subject: [PATCH 42/55] Skin Designer: roundScreen=true so the skin paints over UI (floating island) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Looking at JavaSEPort.java line ~1622, when roundedSkin is true the simulator paints the skin image *on top of* the rendered UI buffer after the UI is drawn: if(roundedSkin) { Graphics2D bg = buffer.createGraphics(); BufferedImage skin = getSkin(); bg.drawImage(skin, ...); } That overlay-on-top render is what makes opaque shapes inside the screen rect (Dynamic Island, punch-hole cameras) appear floating over the status bar / app content. Without roundScreen=true, the simulator takes the skin_map analysis path which clips the UI render to the black-pixel screen rect — the island circle in skin.png never lands on top of UI, it just becomes part of the frame visual. Now the generated .skin sets: roundScreen=true displayX = bezelPx displayY = bezelPx + topCutoutPx (notch extension, if any) displayWidth = device.resolutionW displayHeight = device.resolutionH The display rect points at where the screen actually starts in the generated skin.png (matches the carveRoundedScreenRect call), and the simulator overlays the skin — including the floating island / hole shapes — on top of the rendered UI. The status bar from the iOS theme paints at the safe-area top and the island appears on top of it, like real iPhone 14 Pro+. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../codename1/tools/skindesigner/SkinDesigner.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index c5b6a7841a..0152c154d2 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -1792,6 +1792,19 @@ private Properties buildProperties(int totalW, int totalH) { p.put("overrideNames", overrideNames(device)); int bezelPx = skinBezelInPx(totalW, totalH); + // roundScreen=true switches the simulator from the skin_map-driven + // path (which clips UI to non-skin pixels) to the display-rect path + // where the skin is painted *over* the rendered UI (JavaSEPort + // line ~1622). That overlay rendering is what makes Dynamic Island + // and other in-screen cutouts appear "floating" on top of the + // status bar / app content rather than carved out of it. + p.put("roundScreen", "true"); + float framePxScale = ((float) device.resolutionW) / DevicePreview.VB_W; + int topCutoutPxForDisplay = computeTopCutoutPx(framePxScale); + p.put("displayX", String.valueOf(bezelPx)); + p.put("displayY", String.valueOf(bezelPx + topCutoutPxForDisplay)); + p.put("displayWidth", String.valueOf(device.resolutionW)); + p.put("displayHeight", String.valueOf(device.resolutionH)); // Notch cutouts live in the top frame extension above the screen, // so they don't eat into safeTop. But islands and punch-holes are // drawn floating *inside* the screen and the iOS status bar From d53547aaba74a246d325a1f92f03492f45f3b53b Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 3 May 2026 17:29:19 +0300 Subject: [PATCH 43/55] Add Skin Designer developer-guide tutorial + CI screenshot harness Tutorial: - New chapter at docs/developer-guide/Skin-Designer.asciidoc walks through each wizard stage (device picker, source picker, three editor tabs, finish/download), the file layout of a generated .skin, and how to refresh the bundled device catalog. - Wired into developer-guide.asciidoc just before the Maven appendices. - Six embedded screenshots under docs/developer-guide/img/skin-designer/ generated by CI. Demo-mode hooks in SkinDesigner.java: - applyDemoOverrides() reads cn1.skindesigner.demo* system properties and forces the wizard to a specific (step, device, source, preset, sidebar tab) combination during loadState. Lets the screenshot harness drive the UI to a deterministic state without persisting Preferences across runs. Screenshot harness: - scripts/skindesigner/screenshots/lib/SkinDesignerScreenshotter.java spawns the CN1 simulator JVM with the demo overrides forwarded as -Dcn1.skindesigner.* properties, waits for the UI to settle, then captures the desktop with java.awt.Robot. Modeled on the existing scripts/javase/lib/SimulatorWindowModeVerifier.java. - scripts/skindesigner/screenshots/take-screenshots.sh builds the Skin Designer Maven project, resolves the simulator runtime classpath via dependency:build-classpath, compiles the harness, and runs each scenario inside xvfb-run on Linux. Six scenarios mirror the developer-guide chapter (device picker, source picker, editor shape/cutouts/info tabs, done page). - scripts/skindesigner/screenshots/README.md documents the demo override properties and the local-run command. CI: - .github/workflows/skin-designer-screenshots.yml runs the script on workflow_dispatch and on PRs that touch the harness or wizard code, uploads the PNGs as an artifact, and on manual dispatch opens an automated PR if the committed images drifted. Excluded from the monthly device-DB refresh because the wizard UI changes much less often than the catalog. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../workflows/skin-designer-screenshots.yml | 99 ++++++ docs/developer-guide/Skin-Designer.asciidoc | 283 ++++++++++++++++++ docs/developer-guide/developer-guide.asciidoc | 2 + .../img/skin-designer/.gitkeep | 1 + .../tools/skindesigner/SkinDesigner.java | 41 +++ scripts/skindesigner/screenshots/README.md | 53 ++++ .../lib/SkinDesignerScreenshotter.java | 156 ++++++++++ .../screenshots/take-screenshots.sh | 122 ++++++++ 8 files changed, 757 insertions(+) create mode 100644 .github/workflows/skin-designer-screenshots.yml create mode 100644 docs/developer-guide/Skin-Designer.asciidoc create mode 100644 docs/developer-guide/img/skin-designer/.gitkeep create mode 100644 scripts/skindesigner/screenshots/README.md create mode 100644 scripts/skindesigner/screenshots/lib/SkinDesignerScreenshotter.java create mode 100755 scripts/skindesigner/screenshots/take-screenshots.sh diff --git a/.github/workflows/skin-designer-screenshots.yml b/.github/workflows/skin-designer-screenshots.yml new file mode 100644 index 0000000000..74f4d3a05a --- /dev/null +++ b/.github/workflows/skin-designer-screenshots.yml @@ -0,0 +1,99 @@ +name: Skin Designer Screenshots + +# Generates the per-stage Skin Designer screenshots referenced by the +# developer guide chapter. Runs the wizard inside the JavaSE simulator +# under xvfb, captures Robot screenshots for each stage via the harness in +# scripts/skindesigner/screenshots/, and opens a PR if the PNGs in +# docs/developer-guide/img/skin-designer/ drifted. +# +# The skin designer UI changes much less often than the bundled device +# database, so this workflow only runs on demand or when the harness / +# skin-designer code changes — not on the device-DB-update cron. + +on: + workflow_dispatch: + pull_request: + paths: + - 'scripts/skindesigner/screenshots/**' + - 'scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/**' + - 'scripts/skindesigner/common/src/main/css/theme.css' + - '.github/workflows/skin-designer-screenshots.yml' + +permissions: + actions: write + contents: write + pull-requests: write + +jobs: + generate-screenshots: + if: github.repository == 'codenameone/CodenameOne' + runs-on: ubuntu-latest + timeout-minutes: 25 + + steps: + - name: Check out repository + uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + + - name: Set up xvfb + run: | + set -euo pipefail + sudo apt-get update + sudo apt-get install -y --no-install-recommends xvfb + + - name: Cache Maven packages + uses: actions/cache@v4 + with: + path: ~/.m2 + key: ${{ runner.os }}-skin-designer-screenshots-m2-${{ hashFiles('scripts/skindesigner/**/pom.xml') }} + restore-keys: | + ${{ runner.os }}-skin-designer-screenshots-m2- + + - name: Bootstrap Codename One tooling + run: | + set -euo pipefail + mkdir -p "$HOME/.codenameone" + # The Maven plugin checks for these files before allowing a + # local build. The build client jar is only used by builds that + # deploy to the build cloud, but the file must exist. + cp maven/CodeNameOneBuildClient.jar "$HOME/.codenameone/CodeNameOneBuildClient.jar" + touch "$HOME/.codenameone/guibuilder.jar" + + - name: Take Skin Designer screenshots + run: ./scripts/skindesigner/screenshots/take-screenshots.sh + + - name: Show diff + run: | + git --no-pager diff --stat -- docs/developer-guide/img/skin-designer/ + + - name: Upload screenshots as artifact + uses: actions/upload-artifact@v4 + with: + name: skin-designer-screenshots + path: docs/developer-guide/img/skin-designer/*.png + if-no-files-found: warn + + - name: Open refresh PR if screenshots drifted + if: github.event_name == 'workflow_dispatch' + uses: peter-evans/create-pull-request@v7 + with: + commit-message: "Refresh Skin Designer developer-guide screenshots" + title: "Refresh Skin Designer developer-guide screenshots" + body: | + ## Summary + - Re-ran `scripts/skindesigner/screenshots/take-screenshots.sh` + and updated the per-stage PNGs under + `docs/developer-guide/img/skin-designer/`. + + Created automatically by the Skin Designer screenshots workflow. + base: master + branch: automation/skin-designer-screenshots + delete-branch: true + labels: | + documentation + automation diff --git a/docs/developer-guide/Skin-Designer.asciidoc b/docs/developer-guide/Skin-Designer.asciidoc new file mode 100644 index 0000000000..8d884c1f54 --- /dev/null +++ b/docs/developer-guide/Skin-Designer.asciidoc @@ -0,0 +1,283 @@ +[[skin-designer]] +== Skin Designer + +The Skin Designer is a Codename One tool that turns a device specification +(resolution, PPI, fonts, safe-area insets, cutouts) into a `.skin` file +that the JavaSE simulator can load. It runs as a regular Codename One app +and ships in three flavours: a desktop app, the iOS / Android tools that +back the website, and a JavaScript build hosted on +https://www.codenameone.com. + +This chapter walks through the wizard and explains what each step writes +into the `.skin` file. If you want to skip the explanation and just build +a skin: pick a device, accept the defaults, click *Finish*, then *Download +skin*. The file is ready to load via *Add* in the simulator's *Skins* +menu. + +NOTE: The wizard is intentionally opinionated. It bundles a curated +device database scraped from GSMArena (refreshed monthly by CI), generates +the device frame procedurally, and writes a skin layout that matches the +`Themes/iPhoneTheme.res`, `Themes/iOS7Theme.res`, and +`Themes/android_holo_light.res` themes shipped with Codename One. For a +custom skin from a hand-painted device render, jump straight to the +<> source. + +=== Launching the tool + +The skin designer is built as a regular Codename One Maven app under +`scripts/skindesigner/`. To run it locally: + +[source,shell] +---- +cd scripts/skindesigner +./run.sh # macOS / Linux +run.bat # Windows +---- + +Both scripts call `mvn cn:java -P simulator` against the `javase` module, +so the wizard appears in the standard CN1 simulator window. You can also +visit the hosted JavaScript build at +https://www.codenameone.com/skin-designer (no install required). + +=== Stage 1 — pick a device + +image::img/skin-designer/skin-designer-stage-1-device.png[Device picker showing the iPhone 16 Pro selected and Continue enabled,role="text-center"] + +The first step shows a card per device from the bundled catalog. Use the +search box to filter by name (it matches both the model name and the +brand) and the chips below to narrow by form factor: *All / Phones / +Tablets / Foldables*. Tapping a card selects the device and enables the +*Continue* button in the footer. + +What clicking a card actually does: + +* Loads the device's resolution, PPI, screen size, default safe-area + insets, and the iOS / Android system font names from the + `devices.json` catalog. +* Resets the in-memory skin to a sensible default for the device: + notch / island / hole presets are applied automatically based on the + device's `hasNotch` / `hasIsland` / `hasHole` flags. +* Persists the choice in `Preferences` under `wiz.deviceId` so closing + the wizard mid-flow and reopening it lands you back on the same step. + +TIP: The catalog is large (~5,000 devices). The grid is capped to the 60 +most recent matches by default; type into the search field to find older +or less-common devices. The `Showing X of Y` hint between the chips and +the grid tells you when you're looking at a clamped subset. + +=== Stage 2 — pick a starting source + +image::img/skin-designer/skin-designer-stage-2-source.png[Source picker with three large cards: Pick a shape, Upload an image, Blank rectangle,role="text-center"] + +There are three ways to seed the skin's body image: + +[[skin-designer-source-shape]] +*Pick a shape* — generates the device frame procedurally from a small +preset library (rounded rect, notch, dynamic island, punch-hole, corner +hole, classic home-button). The frame is rendered as a dark gradient with +the screen rect (and any cutouts) carved into it. Best when you want a +generic-looking iPhone or Android frame and don't care about exact +hardware fidelity. + +[[skin-designer-source-image]] +*Upload an image* — opens the platform's image picker. The wizard scales +the image into the device's resolution, then carves the screen rect (and +cutouts) on top. Use this when you have a marketing render of the +specific device you're targeting. + +*Blank rectangle* — collapses the bezel and corner radius to almost +nothing, drops every cutout, and turns the home indicator off. The screen +fills the entire skin. This is useful for desktop / web simulators where +the device frame would just be visual noise. + +Hover over a card on desktop to see the blue selection ring; click to +advance to the editor. + +=== Stage 3 — the editor + +image::img/skin-designer/skin-designer-stage-3-editor-shape.png[Editor with the Dynamic Island preset selected and live preview on the left,role="text-center"] + +The editor is split into two panes: a live preview on the left (a custom +CN1 component that paints the device frame, screen tint, cutouts, and +home indicator) and a sidebar on the right with three tabs. + +==== Shape tab + +When you started from *Pick a shape*, the Shape tab shows a preset grid +(*Rounded rect / Notch / Dynamic Island / Punch-hole / Corner hole / +Classic home*) and dimension fields: + +* *Corner radius* — the device's outer corner radius in viewbox pixels + (the design uses a 320 × 620 viewbox; the actual skin image is scaled + to the device's resolution). +* *Bezel* — frame thickness in viewbox pixels. The screen rect is + positioned at `(bezel, bezel)` inside the skin image. +* *Home indicator* — toggles the lime pill drawn at the bottom edge. + iPhones from X onward and most modern Androids should leave this on; + classic devices with a hardware home button should turn it off. + +When you started from *Upload an image*, the Shape tab swaps the preset +grid for a *Replace image* button so you can swap the body image without +restarting the wizard. + +==== Cutouts tab + +image::img/skin-designer/skin-designer-stage-3-editor-cutouts.png[Editor showing the Cutouts tab with a Dynamic Island row selected and the dimension fields visible,role="text-center"] + +The Cutouts tab lists every cutout currently on the skin. Tap a row to +expand its width / height / offset fields; the X button on the right +removes it. The three add buttons at the bottom seed a sensible default +of each type: + +* *Notch* (180 × 30 viewbox px) — physical hardware cutout. Notches are + drawn in the device frame *above* the screen rect, with the bottom + edge touching the screen top. Mirrors iPhone X / 11 / 12 / 13 hardware. +* *Island* (120 × 35) — Dynamic Island. Software-reserved space + rendered as an opaque pill *inside* the screen rect, floating on top + of the iOS status bar. +* *Hole* (28 × 28) — Android punch-hole camera. Rendered like the + island: opaque circle inside the screen rect. + +Offsets are relative to the top-center of the screen, in viewbox pixels. +For islands and holes, `Offset Y` is the gap between the cutout's top +edge and the screen top. For notches, `Offset Y` is ignored (the notch +is anchored to the frame). + +WARNING: When the wizard generates the `.skin` file, it automatically +extends `safePortraitTop` to cover any in-screen cutouts (islands, +holes), so app content lands below the floating shape. You don't need to +manually adjust safe area for the cutout itself; only adjust it if you +need extra padding above your title bar. + +==== Info tab + +image::img/skin-designer/skin-designer-stage-3-editor-info.png[Editor showing the Info tab with the skin name and read-only device specs,role="text-center"] + +The Info tab is mostly read-only and shows what's about to be written +into `skin.properties`: + +* *Name* — the only editable field. Determines the saved file name + (sanitised: spaces become hyphens, special characters dropped, + appended with `.skin`). +* *Width / Height* — display resolution from the device catalog. +* *PPI / Pixels per millimeter* — the simulator uses + `pixelMilliRatio = ppi / 25.4` to derive font sizes when none are + specified in the skin. +* *Safe area Top / Bottom* — the user-editable safe-area insets in + viewbox pixels. The wizard converts these to display-relative + pixels at save time. + +=== Stage 4 — finish and download + +image::img/skin-designer/skin-designer-stage-4-done.png[Done page showing the green check, summary of the generated skin, and a Download skin button,role="text-center"] + +Clicking *Finish* in the editor's footer: + +. Renders the portrait skin image (`skin.png`) at the device's actual + resolution + bezel, with rounded corners, transparent screen, opaque + cutouts, and a home indicator if enabled. +. Synthesises the landscape skin (`skin_l.png`) by 90° rotation. +. Writes `skin_map.png` / `skin_map_l.png` overlays that mark the + screen rectangle for the simulator's screen-position detection. +. Bundles the appropriate native theme (`iOS7Theme.res`, + `android_holo_light.res`, or `winTheme.res`) inside the skin zip. +. Writes `skin.properties` with `roundScreen=true`, + `displayX/Y/Width/Height`, `safePortrait*` / `safeLandscape*`, + the platform name, override names, fonts, and PPI. + +Clicking *Download skin* on the done page triggers +`Display.execute(filename)`. In the JavaScript port that fires the +browser's download dialog; on the desktop simulator it opens the +file location. The button is the only reliable trigger because the +browser's user-gesture window expires during the heavy image +generation step the *Finish* click runs. + +After the file is on disk, drop it into your simulator's skins folder +(or use the *Add* command in the simulator's *Skins* menu) and your +new device should appear in the picker. + +=== File layout of a generated skin + +A generated `.skin` is just a renamed zip. Unzip it to see the layout: + +[source,text] +---- +Apple-iPhone-16-Pro.skin/ + skin.png # portrait body (device frame + transparent screen + cutouts) + skin_l.png # 90° rotated portrait + skin_map.png # black rect = screen, white = frame, used for hit-testing + skin_map_l.png # rotated map + iOS7Theme.res # bundled native theme (or android_holo_light.res / winTheme.res) + skin.properties # platform metadata, safe-area, PPI, display rect +---- + +The `skin.properties` file is a normal Java `.properties`. The most +important keys the wizard writes: + +[source,properties] +---- +touch=true +platformName=ios +tablet=false +ppi=460 +pixelRatio=18.110236220472443 + +# roundScreen=true makes the simulator paint skin.png *over* the rendered +# UI rather than clipping the UI to non-frame pixels. That overlay step is +# what makes the Dynamic Island / punch-hole shapes appear "floating" on +# top of the iOS status bar instead of being carved out of the display. +roundScreen=true +displayX=89 +displayY=89 +displayWidth=1206 +displayHeight=2622 + +# Safe area in display-relative coordinates (origin = screen top-left). +safePortraitX=0 +safePortraitY=237 +safePortraitWidth=1206 +safePortraitHeight=2272 +safeLandscapeX=237 +safeLandscapeY=0 +safeLandscapeWidth=2272 +safeLandscapeHeight=1206 + +# These get composed by overrideNames(device) — they let users layer +# device-specific styling on top of the platform theme via +# UIManager.addThemeProps()-style theme inheritance. +overrideNames=phone,ios,iphone + +systemFontFamily=SF Pro +proportionalFontFamily=SF Pro +monospaceFontFamily=SF Mono +---- + +NOTE: The wizard intentionally does *not* write `smallFontSize`, +`mediumFontSize`, or `largeFontSize`. When those are absent the +simulator auto-derives them from `pixelMilliRatio` (`med = round(2.6 * +ppmm)`, `sm = 2 * ppmm`, `la = 3.3 * ppmm`), which is what you want on +high-PPI screens. Writing iOS-style point values (12 / 15 / 22) into +the file used to make text render at sub-millimeter sizes on a 460 PPI +device. + +=== Refreshing the bundled device catalog + +The catalog at +`scripts/skindesigner/common/src/main/resources/devices.json` is +generated by `scripts/skindesigner/tools/devicedb/build_devices_json.py`, +which scrapes +https://www.gsmarena.com directly. To run a fresh scrape locally: + +[source,shell] +---- +python3 scripts/skindesigner/tools/devicedb/build_devices_json.py \ + --mode latest --limit 50 --delay 2.0 +---- + +The default `latest` mode walks the *latest mobiles* listing on GSMArena, +which is fast (one page, ~50 devices). For a full catalog rebuild use +`--mode brands --max-pages 12` — that walks all the curated brand +listings and takes 30–60 minutes. The +`.github/workflows/skin-designer-devices-update.yml` workflow runs the +`latest` scrape every 6 hours on master and opens an automated PR if +`devices.json` drifted. diff --git a/docs/developer-guide/developer-guide.asciidoc b/docs/developer-guide/developer-guide.asciidoc index f3c0bf6a45..13c8be99d4 100644 --- a/docs/developer-guide/developer-guide.asciidoc +++ b/docs/developer-guide/developer-guide.asciidoc @@ -92,6 +92,8 @@ include::Working-with-Mac-OS-X.asciidoc[] include::Working-With-CodenameOne-Sources.asciidoc[] +include::Skin-Designer.asciidoc[] + include::Maven-Appendix-Archetypes.adoc[] include::Maven-Appendix-Goals.adoc[] diff --git a/docs/developer-guide/img/skin-designer/.gitkeep b/docs/developer-guide/img/skin-designer/.gitkeep new file mode 100644 index 0000000000..17ce1a3bb2 --- /dev/null +++ b/docs/developer-guide/img/skin-designer/.gitkeep @@ -0,0 +1 @@ +Reserved for screenshots generated by the .github/workflows/skin-designer-screenshots.yml workflow. diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 0152c154d2..6143d4aa8c 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -159,6 +159,15 @@ private void loadState() { Log.e(err); } } + // Demo / screenshot harness override. Set on the JVM command line via: + // -Dcn1.skindesigner.demoStep=2 + // -Dcn1.skindesigner.demoDevice=apple_iphone_16_pro + // -Dcn1.skindesigner.demoSource=shape + // -Dcn1.skindesigner.demoSidebarTab=cutouts + // -Dcn1.skindesigner.demoPreset=island + // Used by the screenshot harness in scripts/skindesigner/screenshots/ + // to take repeatable per-step screenshots for the developer guide. + applyDemoOverrides(); if (step >= STEP_SOURCE && device == null) { step = STEP_DEVICE; } @@ -167,6 +176,38 @@ private void loadState() { } } + private void applyDemoOverrides() { + String demoDev = CN.getProperty("cn1.skindesigner.demoDevice", null); + if (demoDev != null && !demoDev.isEmpty()) { + DeviceDatabase.Device d = DeviceDatabase.findById(demoDev); + if (d != null) { + device = d; + skin = new SkinModel(); + skin.resetForDevice(d); + } + } + String demoSrc = CN.getProperty("cn1.skindesigner.demoSource", null); + if (demoSrc != null && !demoSrc.isEmpty()) { + source = demoSrc; + } + String demoStep = CN.getProperty("cn1.skindesigner.demoStep", null); + if (demoStep != null) { + try { + step = Math.max(STEP_DEVICE, Math.min(STEP_DONE, Integer.parseInt(demoStep))); + } catch (NumberFormatException ignored) { + // ignore, keep persisted value + } + } + String demoTab = CN.getProperty("cn1.skindesigner.demoSidebarTab", null); + if (demoTab != null && !demoTab.isEmpty()) { + activeSidebarTab = demoTab; + } + String demoPreset = CN.getProperty("cn1.skindesigner.demoPreset", null); + if (demoPreset != null && !demoPreset.isEmpty()) { + applyPreset(demoPreset); + } + } + private void saveState() { Preferences.set(PREF_STEP, step); Preferences.set(PREF_DEVICE, device == null ? null : device.id); diff --git a/scripts/skindesigner/screenshots/README.md b/scripts/skindesigner/screenshots/README.md new file mode 100644 index 0000000000..87daec9f61 --- /dev/null +++ b/scripts/skindesigner/screenshots/README.md @@ -0,0 +1,53 @@ +# Skin Designer screenshots + +This directory contains the harness that drives the Skin Designer through +each wizard stage in the JavaSE simulator and captures Robot screenshots +for the developer guide. + +## Files + +- `lib/SkinDesignerScreenshotter.java` — Java harness. Spawns the + simulator JVM with the demo-mode system properties wired up, waits for + the UI to settle, then captures the desktop via `java.awt.Robot`. +- `take-screenshots.sh` — top-level shell script. Builds the Skin + Designer Maven project, resolves the simulator classpath, compiles the + harness, and runs each scenario inside `xvfb-run` (Linux) or directly + (other platforms). + +The PNG output lands in +`docs/developer-guide/img/skin-designer/`, where the +`Skin-Designer.asciidoc` chapter references it. + +## Demo overrides + +The harness drives the wizard via three system properties read by +`SkinDesigner.applyDemoOverrides`: + +| Property | Effect | +| ------------------------------------- | --------------------------------------- | +| `cn1.skindesigner.demoStep` | 0 / 1 / 2 / 3 | +| `cn1.skindesigner.demoDevice` | Device id from `devices.json` | +| `cn1.skindesigner.demoSource` | `shape` / `image` / `blank` | +| `cn1.skindesigner.demoPreset` | Shape preset id (e.g. `island`) | +| `cn1.skindesigner.demoSidebarTab` | `shape` / `cutouts` / `info` | + +These reset the persisted wizard state so each scenario starts at a +deterministic place. + +## Running locally + +``` +scripts/skindesigner/screenshots/take-screenshots.sh +``` + +Requires Java 17 + Maven on `PATH`. On Linux you also need +`xvfb-run` for headless desktop capture — install via +`sudo apt-get install xvfb`. On macOS the script falls back to direct +launches; you'll see the simulator pop up briefly between scenarios. + +## CI + +`.github/workflows/skin-designer-screenshots.yml` runs the script on +`workflow_dispatch` and on PRs that touch the harness or the wizard +source. It uploads the PNGs as an artifact and (on manual dispatch) +opens an automated PR if the committed images drifted. diff --git a/scripts/skindesigner/screenshots/lib/SkinDesignerScreenshotter.java b/scripts/skindesigner/screenshots/lib/SkinDesignerScreenshotter.java new file mode 100644 index 0000000000..3ddffe384a --- /dev/null +++ b/scripts/skindesigner/screenshots/lib/SkinDesignerScreenshotter.java @@ -0,0 +1,156 @@ +package com.codenameone.tools.skindesigner.screenshots; + +import javax.imageio.ImageIO; +import java.awt.Dimension; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.Toolkit; +import java.awt.image.BufferedImage; +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.Duration; +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; + +/** + * Launches the Skin Designer Codename One app inside the JavaSE simulator + * with the demo-override system properties wired up, waits for the UI to + * settle, and captures the desktop with {@link Robot}. The CI workflow + * runs this once per scenario to refresh the developer-guide screenshots. + * + *

Designed to be invoked from + * {@code scripts/skindesigner/screenshots/take-screenshots.sh} which + * provides the simulator classpath and a per-scenario set of system + * properties (cn1.skindesigner.demoStep / demoDevice / demoSource etc.). + */ +public class SkinDesignerScreenshotter { + private static final String APP_CLASS = + "com.codename1.tools.skindesigner.SkinDesigner"; + + public static void main(String[] args) { + int exitCode = 1; + Process child = null; + try { + Args parsed = Args.parse(args); + // The simulator persists its preferences under + // ~/.codenameone//...; override java.util.prefs.userRoot + // to a sandboxed location so each scenario starts fresh. + Path prefsRoot = Files.createTempDirectory("skin-designer-prefs-"); + Path projectDir = Files.createTempDirectory("skin-designer-app-"); + + List cmd = new ArrayList(); + String javaExec = System.getProperty("java.home") + + File.separator + "bin" + File.separator + "java"; + cmd.add(javaExec); + cmd.add("-Djava.awt.headless=false"); + cmd.add("-Djava.util.prefs.userRoot=" + prefsRoot.toAbsolutePath()); + cmd.add("-Dcn1.simulator.useAppFrame=true"); + cmd.add("-Dcn1.javase.implementation=jmf"); + // Demo-mode overrides forwarded to SkinDesigner's + // applyDemoOverrides() — drive the wizard to a specific step + // with a specific device / source / preset / sidebar tab. + for (String override : parsed.demoOverrides) { + cmd.add("-D" + override); + } + if (parsed.skinPath != null && parsed.skinPath.length() > 0) { + cmd.add("-Dskin=" + parsed.skinPath); + cmd.add("-Ddskin=" + parsed.skinPath); + } + cmd.add("-cp"); + cmd.add(parsed.simClasspath); + cmd.add("com.codename1.impl.javase.Simulator"); + cmd.add(APP_CLASS); + + ProcessBuilder pb = new ProcessBuilder(cmd); + pb.directory(projectDir.toFile()); + pb.redirectErrorStream(true); + pb.inheritIO(); + child = pb.start(); + + waitForSimulatorWarmup(Duration.ofSeconds(parsed.warmupSeconds)); + + BufferedImage image = captureDesktop(); + Path screenshotPath = Paths.get(parsed.screenshotPath); + Files.createDirectories(screenshotPath.getParent()); + if (!ImageIO.write(image, "png", screenshotPath.toFile())) { + throw new AssertionError( + "No PNG writer available; screenshot was not written"); + } + System.out.println("[skin-designer-screenshotter] wrote " + + screenshotPath + " for scenario=" + parsed.scenario); + exitCode = 0; + } catch (Throwable t) { + t.printStackTrace(System.err); + } finally { + if (child != null && child.isAlive()) { + child.destroy(); + try { + if (!child.waitFor(3, java.util.concurrent.TimeUnit.SECONDS)) { + child.destroyForcibly(); + } + } catch (InterruptedException ignored) { + Thread.currentThread().interrupt(); + child.destroyForcibly(); + } + } + System.exit(exitCode); + } + } + + private static void waitForSimulatorWarmup(Duration duration) throws Exception { + Instant until = Instant.now().plus(duration); + while (Instant.now().isBefore(until)) { + Thread.sleep(200); + } + } + + private static BufferedImage captureDesktop() throws Exception { + Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); + Rectangle bounds = new Rectangle(0, 0, + Math.max(1, size.width), Math.max(1, size.height)); + return new Robot().createScreenCapture(bounds); + } + + /** Minimal argv parser. */ + private static final class Args { + String scenario = "default"; + String simClasspath = ""; + String skinPath = ""; + String screenshotPath = ""; + int warmupSeconds = 8; + List demoOverrides = new ArrayList(); + + static Args parse(String[] argv) { + Args a = new Args(); + for (int i = 0; i < argv.length; i++) { + String key = argv[i]; + if ("--scenario".equals(key)) { + a.scenario = argv[++i]; + } else if ("--sim-classpath".equals(key)) { + a.simClasspath = argv[++i]; + } else if ("--skin".equals(key)) { + a.skinPath = argv[++i]; + } else if ("--screenshot".equals(key)) { + a.screenshotPath = argv[++i]; + } else if ("--warmup".equals(key)) { + a.warmupSeconds = Integer.parseInt(argv[++i]); + } else if ("--demo".equals(key)) { + // Repeatable: --demo cn1.skindesigner.demoStep=2 + a.demoOverrides.add(argv[++i]); + } else { + throw new IllegalArgumentException("unknown arg: " + key); + } + } + if (a.simClasspath.isEmpty()) { + throw new IllegalArgumentException("--sim-classpath is required"); + } + if (a.screenshotPath.isEmpty()) { + throw new IllegalArgumentException("--screenshot is required"); + } + return a; + } + } +} diff --git a/scripts/skindesigner/screenshots/take-screenshots.sh b/scripts/skindesigner/screenshots/take-screenshots.sh new file mode 100755 index 0000000000..019f05b1a4 --- /dev/null +++ b/scripts/skindesigner/screenshots/take-screenshots.sh @@ -0,0 +1,122 @@ +#!/usr/bin/env bash +# Drive the Skin Designer through each wizard stage in the JavaSE simulator +# under xvfb, take a Robot screenshot per scenario, and write the PNGs into +# docs/developer-guide/img/skin-designer/. +# +# Run by .github/workflows/skin-designer-screenshots.yml on a schedule and +# on workflow_dispatch. Locally: +# +# scripts/skindesigner/screenshots/take-screenshots.sh +# +# Requires: Java 17 + Maven on PATH. Linux: xvfb-run. +set -euo pipefail + +log() { echo "[skin-designer-screenshots] $1" >&2; } + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SKIN_DESIGNER_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" +REPO_ROOT="$(cd "$SKIN_DESIGNER_DIR/../.." && pwd)" + +OUT_DIR="${OUT_DIR:-$REPO_ROOT/docs/developer-guide/img/skin-designer}" +mkdir -p "$OUT_DIR" + +JAVA_BIN="${JAVA_BIN:-$(command -v java)}" +JAVAC_BIN="${JAVAC_BIN:-$(command -v javac)}" +if [ -z "$JAVA_BIN" ] || [ -z "$JAVAC_BIN" ]; then + log "JDK not found on PATH" + exit 2 +fi + +# 1. Build the Skin Designer Maven project so `target/classes` and the +# cn1lib dependencies are populated. +log "Building Skin Designer (mvn -DskipTests install)" +(cd "$SKIN_DESIGNER_DIR" && mvn -B -ntp -DskipTests install) + +# 2. Resolve the simulator classpath. The cn1 plugin's `cn1:run` goal +# prints it; `mvn dependency:build-classpath` is more portable. +CP_FILE="$(mktemp)" +trap 'rm -f "$CP_FILE"' EXIT +log "Resolving runtime classpath" +(cd "$SKIN_DESIGNER_DIR/javase" && \ + mvn -B -ntp -q dependency:build-classpath \ + -Dmdep.outputFile="$CP_FILE" \ + -Dcodename1.platform=javase \ + -Pjavase >/dev/null) + +SIM_CP="$(cat "$CP_FILE"):$SKIN_DESIGNER_DIR/common/target/classes:$SKIN_DESIGNER_DIR/javase/target/classes" + +# 3. Compile the screenshot harness against the simulator classpath. +HARNESS_CLASSES="$(mktemp -d)" +trap 'rm -rf "$HARNESS_CLASSES"' EXIT +log "Compiling screenshot harness" +"$JAVAC_BIN" -d "$HARNESS_CLASSES" \ + -cp "$SIM_CP" \ + "$SCRIPT_DIR/lib/SkinDesignerScreenshotter.java" + +HARNESS_CP="$HARNESS_CLASSES:$SIM_CP" + +# 4. Run each scenario. +run_scenario() { + local name="$1"; shift + local out="$OUT_DIR/$name.png" + log "Running scenario $name" + local args=(--scenario "$name" --sim-classpath "$SIM_CP" --screenshot "$out") + while [ "$#" -gt 0 ]; do + args+=("$@") + shift "$#" + done + if command -v xvfb-run >/dev/null 2>&1; then + xvfb-run -a -s "-screen 0 1600x1100x24" "$JAVA_BIN" \ + -Djava.awt.headless=false \ + -cp "$HARNESS_CP" \ + com.codenameone.tools.skindesigner.screenshots.SkinDesignerScreenshotter \ + "${args[@]}" + else + "$JAVA_BIN" \ + -Djava.awt.headless=false \ + -cp "$HARNESS_CP" \ + com.codenameone.tools.skindesigner.screenshots.SkinDesignerScreenshotter \ + "${args[@]}" + fi + log " -> $out" +} + +# Scenarios mirror the developer-guide structure. The --demo overrides +# get forwarded as -Dcn1.skindesigner.* to the simulator JVM. +run_scenario skin-designer-stage-1-device \ + --demo cn1.skindesigner.demoStep=0 \ + --demo cn1.skindesigner.demoDevice=apple_apple_iphone_16_pro + +run_scenario skin-designer-stage-2-source \ + --demo cn1.skindesigner.demoStep=1 \ + --demo cn1.skindesigner.demoDevice=apple_apple_iphone_16_pro + +run_scenario skin-designer-stage-3-editor-shape \ + --demo cn1.skindesigner.demoStep=2 \ + --demo cn1.skindesigner.demoDevice=apple_apple_iphone_16_pro \ + --demo cn1.skindesigner.demoSource=shape \ + --demo cn1.skindesigner.demoPreset=island \ + --demo cn1.skindesigner.demoSidebarTab=shape + +run_scenario skin-designer-stage-3-editor-cutouts \ + --demo cn1.skindesigner.demoStep=2 \ + --demo cn1.skindesigner.demoDevice=apple_apple_iphone_16_pro \ + --demo cn1.skindesigner.demoSource=shape \ + --demo cn1.skindesigner.demoPreset=island \ + --demo cn1.skindesigner.demoSidebarTab=cutouts + +run_scenario skin-designer-stage-3-editor-info \ + --demo cn1.skindesigner.demoStep=2 \ + --demo cn1.skindesigner.demoDevice=apple_apple_iphone_16_pro \ + --demo cn1.skindesigner.demoSource=shape \ + --demo cn1.skindesigner.demoPreset=island \ + --demo cn1.skindesigner.demoSidebarTab=info + +run_scenario skin-designer-stage-4-done \ + --demo cn1.skindesigner.demoStep=3 \ + --demo cn1.skindesigner.demoDevice=apple_apple_iphone_16_pro \ + --demo cn1.skindesigner.demoSource=shape \ + --demo cn1.skindesigner.demoPreset=island \ + --warmup 12 + +log "Done. Screenshots are in $OUT_DIR" From ed02efff0bd05aee21113392b697895292ca69cb Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 3 May 2026 17:39:31 +0300 Subject: [PATCH 44/55] Skin Designer screenshots: capture inside CN1 instead of via AWT Robot Replaced the desktop-Robot harness with a Codename One Lifecycle that uses Display.captureScreen() and saves PNGs through Storage. On the JavaSE port Storage maps to ~/.cn1/, so the shell script just copies files out of there into docs/developer-guide/img/skin-designer/. ScreenshotApp: - Lifecycle subclass at scripts/skindesigner/common/src/main/java/.../screenshots/ScreenshotApp.java - Walks each wizard stage in turn: clears persistent wizard state (Preferences keys + SkinModel.clearPersisted), sets the cn1.skindesigner.demo* system properties for the scenario, calls new SkinDesigner().runApp(), waits 1.5 s for layout, captures via Display.captureScreen(), saves the PNG through Storage. - After the last scenario calls Display.exitApplication() so the JVM exits cleanly. take-screenshots.sh: - Drops the Robot / classpath-resolution / harness-compile dance. - Builds the Skin Designer with mvn install, then launches the simulator with -Dcodename1.mainClass pointing at ScreenshotApp. xvfb-run is only needed because the JavaSE simulator still creates AWT windows, but no Robot capture happens. - After the simulator exits, copies the PNGs from ~/.cn1/ into docs/developer-guide/img/skin-designer/. A missing PNG fails the script. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../screenshots/ScreenshotApp.java | 132 +++++++++++++++ scripts/skindesigner/screenshots/README.md | 69 ++++---- .../lib/SkinDesignerScreenshotter.java | 156 ------------------ .../screenshots/take-screenshots.sh | 156 +++++++----------- 4 files changed, 227 insertions(+), 286 deletions(-) create mode 100644 scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/screenshots/ScreenshotApp.java delete mode 100644 scripts/skindesigner/screenshots/lib/SkinDesignerScreenshotter.java diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/screenshots/ScreenshotApp.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/screenshots/ScreenshotApp.java new file mode 100644 index 0000000000..9829fbc8ab --- /dev/null +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/screenshots/ScreenshotApp.java @@ -0,0 +1,132 @@ +package com.codename1.tools.skindesigner.screenshots; + +import com.codename1.io.Log; +import com.codename1.io.Preferences; +import com.codename1.io.Storage; +import com.codename1.system.Lifecycle; +import com.codename1.tools.skindesigner.SkinDesigner; +import com.codename1.tools.skindesigner.SkinModel; +import com.codename1.ui.CN; +import com.codename1.ui.Display; +import com.codename1.ui.Image; +import com.codename1.ui.util.ImageIO; +import com.codename1.ui.util.UITimer; +import java.io.IOException; +import java.io.OutputStream; + +/** + * Lifecycle entry point used by the developer-guide screenshot pipeline. + * Drives the Skin Designer through each wizard stage and saves a PNG per + * stage via {@link Display#captureScreen()} into Storage. + * + *

On the JavaSE port, Storage maps to {@code ~/.cn1/<name>}, so + * {@code take-screenshots.sh} just copies those files into + * {@code docs/developer-guide/img/skin-designer/}. + * + *

Run via: + *

+ *   ./run.sh simulator          # but with -Dcodename1.mainName=ScreenshotApp
+ * 
+ * which the wrapper script handles. + */ +public class ScreenshotApp extends Lifecycle { + + /** Each row drives one screenshot: + * {fileName, demoStep, demoDevice, demoSource, demoSidebarTab, demoPreset}. */ + private static final String[][] SCENARIOS = { + {"skin-designer-stage-1-device", "0", "apple_apple_iphone_16_pro", null, null, null}, + {"skin-designer-stage-2-source", "1", "apple_apple_iphone_16_pro", null, null, null}, + {"skin-designer-stage-3-editor-shape", "2", "apple_apple_iphone_16_pro", "shape", "shape", "island"}, + {"skin-designer-stage-3-editor-cutouts", "2", "apple_apple_iphone_16_pro", "shape", "cutouts", "island"}, + {"skin-designer-stage-3-editor-info", "2", "apple_apple_iphone_16_pro", "shape", "info", "island"}, + {"skin-designer-stage-4-done", "3", "apple_apple_iphone_16_pro", "shape", null, "island"}, + }; + + /** Persistent wizard state keys we have to wipe between scenarios so + * each screenshot starts from a clean slate. Mirrors the keys used + * inside SkinDesigner / SkinModel. */ + private static final String[] WIZARD_PREF_KEYS = { + "wiz.step", "wiz.deviceId", "wiz.source", "wiz.hasImage", + }; + + /** Time to wait after each renderStep before capturing, in ms. The + * wizard rebuilds via revalidate() + applyDarkRecursive — give it a + * full 1.5 s on JavaSE so layout/animations settle before the + * screenshot. */ + private static final int RENDER_DELAY_MS = 1500; + + @Override + public void runApp() { + Log.p("[skin-designer-screenshots] starting; scenarios=" + SCENARIOS.length); + runScenario(0); + } + + private void runScenario(final int idx) { + if (idx >= SCENARIOS.length) { + Log.p("[skin-designer-screenshots] done; exiting"); + // Small delay so the final capture flushes to disk before VM exit. + UITimer.timer(300, false, Display.getInstance().getCurrent(), + () -> Display.getInstance().exitApplication()); + return; + } + final String[] s = SCENARIOS[idx]; + Log.p("[skin-designer-screenshots] scenario " + (idx + 1) + "/" + SCENARIOS.length + + " -> " + s[0]); + + resetWizardState(); + applyDemoProperties(s); + + // Re-initialise the wizard. Each scenario builds a fresh + // SkinDesigner because runApp captures `this` into action listeners + // and we want the screenshot to reflect a clean restart. + new SkinDesigner().runApp(); + + UITimer.timer(RENDER_DELAY_MS, false, Display.getInstance().getCurrent(), () -> { + captureAndSave(s[0]); + // Yield once before the next scenario so the EDT has a chance + // to drain any queued repaints from the capture step. + CN.callSerially(() -> runScenario(idx + 1)); + }); + } + + private void resetWizardState() { + for (String k : WIZARD_PREF_KEYS) { + Preferences.delete(k); + } + SkinModel.clearPersisted(); + } + + private void applyDemoProperties(String[] s) { + setProp("cn1.skindesigner.demoStep", s[1]); + setProp("cn1.skindesigner.demoDevice", s[2]); + setProp("cn1.skindesigner.demoSource", s[3]); + setProp("cn1.skindesigner.demoSidebarTab", s[4]); + setProp("cn1.skindesigner.demoPreset", s[5]); + } + + private static void setProp(String key, String value) { + if (value == null) { + System.clearProperty(key); + } else { + System.setProperty(key, value); + } + } + + private void captureAndSave(String name) { + try { + Image img = Display.getInstance().captureScreen(); + if (img == null) { + Log.p("[skin-designer-screenshots] captureScreen returned null for " + name); + return; + } + String fileName = name + ".png"; + try (OutputStream os = Storage.getInstance().createOutputStream(fileName)) { + ImageIO.getImageIO().save(img, os, ImageIO.FORMAT_PNG, 1.0f); + } + Log.p("[skin-designer-screenshots] saved " + fileName + + " (" + img.getWidth() + "x" + img.getHeight() + ")"); + } catch (IOException err) { + Log.e(err); + } + } +} diff --git a/scripts/skindesigner/screenshots/README.md b/scripts/skindesigner/screenshots/README.md index 87daec9f61..3241ed1e45 100644 --- a/scripts/skindesigner/screenshots/README.md +++ b/scripts/skindesigner/screenshots/README.md @@ -1,27 +1,44 @@ # Skin Designer screenshots -This directory contains the harness that drives the Skin Designer through -each wizard stage in the JavaSE simulator and captures Robot screenshots -for the developer guide. +This directory drives the developer-guide screenshots for the Skin +Designer chapter. The pipeline runs entirely inside Codename One — +`Display.captureScreen()` produces the PNGs, no AWT Robot or external +xvfb capture step. -## Files +## How it works -- `lib/SkinDesignerScreenshotter.java` — Java harness. Spawns the - simulator JVM with the demo-mode system properties wired up, waits for - the UI to settle, then captures the desktop via `java.awt.Robot`. -- `take-screenshots.sh` — top-level shell script. Builds the Skin - Designer Maven project, resolves the simulator classpath, compiles the - harness, and runs each scenario inside `xvfb-run` (Linux) or directly - (other platforms). +`scripts/skindesigner/common/src/main/java/.../screenshots/ScreenshotApp.java` +is a `Lifecycle` subclass that walks each wizard stage: -The PNG output lands in -`docs/developer-guide/img/skin-designer/`, where the -`Skin-Designer.asciidoc` chapter references it. +1. Wipes the persisted wizard state in `Preferences` / `Storage`. +2. Sets the `cn1.skindesigner.demo*` system properties for the next + scenario (step / device / source / sidebar tab / preset). +3. Calls `new SkinDesigner().runApp()` to build a fresh wizard form. +4. Waits 1.5 s for layout to settle. +5. Calls `Display.getInstance().captureScreen()` and saves the result + via `Storage.getInstance().createOutputStream(name + ".png")` — + on the JavaSE port that lands at `~/.cn1/.png`. + +After every scenario finishes, the app calls +`Display.exitApplication()`. The shell script then copies the PNGs out +of `~/.cn1/` and into `docs/developer-guide/img/skin-designer/`. + +## Running locally + +``` +scripts/skindesigner/screenshots/take-screenshots.sh +``` + +Requires Java 17 + Maven on `PATH`. On Linux you also need `xvfb-run` +for headless JavaSE simulator runs (`sudo apt-get install xvfb`); on +macOS the script falls back to a regular simulator launch and you'll +see the wizard window briefly per scenario. ## Demo overrides -The harness drives the wizard via three system properties read by -`SkinDesigner.applyDemoOverrides`: +`SkinDesigner.applyDemoOverrides()` reads these system properties from +the JVM and, if present, replaces the loaded persisted state with the +specified values: | Property | Effect | | ------------------------------------- | --------------------------------------- | @@ -31,23 +48,11 @@ The harness drives the wizard via three system properties read by | `cn1.skindesigner.demoPreset` | Shape preset id (e.g. `island`) | | `cn1.skindesigner.demoSidebarTab` | `shape` / `cutouts` / `info` | -These reset the persisted wizard state so each scenario starts at a -deterministic place. - -## Running locally - -``` -scripts/skindesigner/screenshots/take-screenshots.sh -``` - -Requires Java 17 + Maven on `PATH`. On Linux you also need -`xvfb-run` for headless desktop capture — install via -`sudo apt-get install xvfb`. On macOS the script falls back to direct -launches; you'll see the simulator pop up briefly between scenarios. +`ScreenshotApp` toggles them between scenarios via `System.setProperty`. ## CI `.github/workflows/skin-designer-screenshots.yml` runs the script on -`workflow_dispatch` and on PRs that touch the harness or the wizard -source. It uploads the PNGs as an artifact and (on manual dispatch) -opens an automated PR if the committed images drifted. +`workflow_dispatch` and on PRs that touch the harness or wizard code, +uploads the PNGs as an artifact, and on manual dispatch opens an +automated PR if the committed images drifted. diff --git a/scripts/skindesigner/screenshots/lib/SkinDesignerScreenshotter.java b/scripts/skindesigner/screenshots/lib/SkinDesignerScreenshotter.java deleted file mode 100644 index 3ddffe384a..0000000000 --- a/scripts/skindesigner/screenshots/lib/SkinDesignerScreenshotter.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.codenameone.tools.skindesigner.screenshots; - -import javax.imageio.ImageIO; -import java.awt.Dimension; -import java.awt.Rectangle; -import java.awt.Robot; -import java.awt.Toolkit; -import java.awt.image.BufferedImage; -import java.io.File; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.time.Duration; -import java.time.Instant; -import java.util.ArrayList; -import java.util.List; - -/** - * Launches the Skin Designer Codename One app inside the JavaSE simulator - * with the demo-override system properties wired up, waits for the UI to - * settle, and captures the desktop with {@link Robot}. The CI workflow - * runs this once per scenario to refresh the developer-guide screenshots. - * - *

Designed to be invoked from - * {@code scripts/skindesigner/screenshots/take-screenshots.sh} which - * provides the simulator classpath and a per-scenario set of system - * properties (cn1.skindesigner.demoStep / demoDevice / demoSource etc.). - */ -public class SkinDesignerScreenshotter { - private static final String APP_CLASS = - "com.codename1.tools.skindesigner.SkinDesigner"; - - public static void main(String[] args) { - int exitCode = 1; - Process child = null; - try { - Args parsed = Args.parse(args); - // The simulator persists its preferences under - // ~/.codenameone//...; override java.util.prefs.userRoot - // to a sandboxed location so each scenario starts fresh. - Path prefsRoot = Files.createTempDirectory("skin-designer-prefs-"); - Path projectDir = Files.createTempDirectory("skin-designer-app-"); - - List cmd = new ArrayList(); - String javaExec = System.getProperty("java.home") - + File.separator + "bin" + File.separator + "java"; - cmd.add(javaExec); - cmd.add("-Djava.awt.headless=false"); - cmd.add("-Djava.util.prefs.userRoot=" + prefsRoot.toAbsolutePath()); - cmd.add("-Dcn1.simulator.useAppFrame=true"); - cmd.add("-Dcn1.javase.implementation=jmf"); - // Demo-mode overrides forwarded to SkinDesigner's - // applyDemoOverrides() — drive the wizard to a specific step - // with a specific device / source / preset / sidebar tab. - for (String override : parsed.demoOverrides) { - cmd.add("-D" + override); - } - if (parsed.skinPath != null && parsed.skinPath.length() > 0) { - cmd.add("-Dskin=" + parsed.skinPath); - cmd.add("-Ddskin=" + parsed.skinPath); - } - cmd.add("-cp"); - cmd.add(parsed.simClasspath); - cmd.add("com.codename1.impl.javase.Simulator"); - cmd.add(APP_CLASS); - - ProcessBuilder pb = new ProcessBuilder(cmd); - pb.directory(projectDir.toFile()); - pb.redirectErrorStream(true); - pb.inheritIO(); - child = pb.start(); - - waitForSimulatorWarmup(Duration.ofSeconds(parsed.warmupSeconds)); - - BufferedImage image = captureDesktop(); - Path screenshotPath = Paths.get(parsed.screenshotPath); - Files.createDirectories(screenshotPath.getParent()); - if (!ImageIO.write(image, "png", screenshotPath.toFile())) { - throw new AssertionError( - "No PNG writer available; screenshot was not written"); - } - System.out.println("[skin-designer-screenshotter] wrote " - + screenshotPath + " for scenario=" + parsed.scenario); - exitCode = 0; - } catch (Throwable t) { - t.printStackTrace(System.err); - } finally { - if (child != null && child.isAlive()) { - child.destroy(); - try { - if (!child.waitFor(3, java.util.concurrent.TimeUnit.SECONDS)) { - child.destroyForcibly(); - } - } catch (InterruptedException ignored) { - Thread.currentThread().interrupt(); - child.destroyForcibly(); - } - } - System.exit(exitCode); - } - } - - private static void waitForSimulatorWarmup(Duration duration) throws Exception { - Instant until = Instant.now().plus(duration); - while (Instant.now().isBefore(until)) { - Thread.sleep(200); - } - } - - private static BufferedImage captureDesktop() throws Exception { - Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); - Rectangle bounds = new Rectangle(0, 0, - Math.max(1, size.width), Math.max(1, size.height)); - return new Robot().createScreenCapture(bounds); - } - - /** Minimal argv parser. */ - private static final class Args { - String scenario = "default"; - String simClasspath = ""; - String skinPath = ""; - String screenshotPath = ""; - int warmupSeconds = 8; - List demoOverrides = new ArrayList(); - - static Args parse(String[] argv) { - Args a = new Args(); - for (int i = 0; i < argv.length; i++) { - String key = argv[i]; - if ("--scenario".equals(key)) { - a.scenario = argv[++i]; - } else if ("--sim-classpath".equals(key)) { - a.simClasspath = argv[++i]; - } else if ("--skin".equals(key)) { - a.skinPath = argv[++i]; - } else if ("--screenshot".equals(key)) { - a.screenshotPath = argv[++i]; - } else if ("--warmup".equals(key)) { - a.warmupSeconds = Integer.parseInt(argv[++i]); - } else if ("--demo".equals(key)) { - // Repeatable: --demo cn1.skindesigner.demoStep=2 - a.demoOverrides.add(argv[++i]); - } else { - throw new IllegalArgumentException("unknown arg: " + key); - } - } - if (a.simClasspath.isEmpty()) { - throw new IllegalArgumentException("--sim-classpath is required"); - } - if (a.screenshotPath.isEmpty()) { - throw new IllegalArgumentException("--screenshot is required"); - } - return a; - } - } -} diff --git a/scripts/skindesigner/screenshots/take-screenshots.sh b/scripts/skindesigner/screenshots/take-screenshots.sh index 019f05b1a4..837476c649 100755 --- a/scripts/skindesigner/screenshots/take-screenshots.sh +++ b/scripts/skindesigner/screenshots/take-screenshots.sh @@ -1,14 +1,15 @@ #!/usr/bin/env bash -# Drive the Skin Designer through each wizard stage in the JavaSE simulator -# under xvfb, take a Robot screenshot per scenario, and write the PNGs into -# docs/developer-guide/img/skin-designer/. +# Run the Skin Designer's ScreenshotApp Lifecycle inside the JavaSE +# simulator. Each scenario calls Display.captureScreen() and saves the +# PNG via Storage; on JavaSE that lands in ~/.cn1/. We then copy those +# PNGs into docs/developer-guide/img/skin-designer/. # -# Run by .github/workflows/skin-designer-screenshots.yml on a schedule and -# on workflow_dispatch. Locally: +# Run by .github/workflows/skin-designer-screenshots.yml on a schedule +# and on workflow_dispatch. Locally (Linux): # # scripts/skindesigner/screenshots/take-screenshots.sh # -# Requires: Java 17 + Maven on PATH. Linux: xvfb-run. +# Requires Java 17 + Maven on PATH. Linux: xvfb-run for headless capture. set -euo pipefail log() { echo "[skin-designer-screenshots] $1" >&2; } @@ -20,103 +21,62 @@ REPO_ROOT="$(cd "$SKIN_DESIGNER_DIR/../.." && pwd)" OUT_DIR="${OUT_DIR:-$REPO_ROOT/docs/developer-guide/img/skin-designer}" mkdir -p "$OUT_DIR" -JAVA_BIN="${JAVA_BIN:-$(command -v java)}" -JAVAC_BIN="${JAVAC_BIN:-$(command -v javac)}" -if [ -z "$JAVA_BIN" ] || [ -z "$JAVAC_BIN" ]; then - log "JDK not found on PATH" - exit 2 -fi +# Names match the SCENARIOS array in ScreenshotApp.java; keep in sync. +SCREENSHOT_NAMES=( + "skin-designer-stage-1-device" + "skin-designer-stage-2-source" + "skin-designer-stage-3-editor-shape" + "skin-designer-stage-3-editor-cutouts" + "skin-designer-stage-3-editor-info" + "skin-designer-stage-4-done" +) + +# Storage on the JavaSE port lives at ~/.cn1; the ScreenshotApp writes +# each scenario as .png into Storage. +STORAGE_DIR="$HOME/.cn1" + +# Wipe any stale screenshots from a previous run so a partial run can +# never report success with old files. +for name in "${SCREENSHOT_NAMES[@]}"; do + rm -f "$STORAGE_DIR/$name.png" +done -# 1. Build the Skin Designer Maven project so `target/classes` and the -# cn1lib dependencies are populated. log "Building Skin Designer (mvn -DskipTests install)" (cd "$SKIN_DESIGNER_DIR" && mvn -B -ntp -DskipTests install) -# 2. Resolve the simulator classpath. The cn1 plugin's `cn1:run` goal -# prints it; `mvn dependency:build-classpath` is more portable. -CP_FILE="$(mktemp)" -trap 'rm -f "$CP_FILE"' EXIT -log "Resolving runtime classpath" -(cd "$SKIN_DESIGNER_DIR/javase" && \ - mvn -B -ntp -q dependency:build-classpath \ - -Dmdep.outputFile="$CP_FILE" \ - -Dcodename1.platform=javase \ - -Pjavase >/dev/null) - -SIM_CP="$(cat "$CP_FILE"):$SKIN_DESIGNER_DIR/common/target/classes:$SKIN_DESIGNER_DIR/javase/target/classes" - -# 3. Compile the screenshot harness against the simulator classpath. -HARNESS_CLASSES="$(mktemp -d)" -trap 'rm -rf "$HARNESS_CLASSES"' EXIT -log "Compiling screenshot harness" -"$JAVAC_BIN" -d "$HARNESS_CLASSES" \ - -cp "$SIM_CP" \ - "$SCRIPT_DIR/lib/SkinDesignerScreenshotter.java" - -HARNESS_CP="$HARNESS_CLASSES:$SIM_CP" +# The CN1 Maven plugin composes codename1.mainClass from the package + +# mainName at startup. We override codename1.mainClass directly here so +# the simulator launches our ScreenshotApp instead of the regular +# SkinDesigner. +SCREENSHOT_MAIN="com.codename1.tools.skindesigner.screenshots.ScreenshotApp" +log "Running simulator with $SCREENSHOT_MAIN" +RUN_CMD=(mvn -B -ntp -Psimulator -DskipTests + -Dcodename1.platform=javase + "-Dcodename1.mainClass=$SCREENSHOT_MAIN" + -f "$SKIN_DESIGNER_DIR/javase/pom.xml" + verify) + +if command -v xvfb-run >/dev/null 2>&1; then + xvfb-run -a -s "-screen 0 1600x1100x24" "${RUN_CMD[@]}" +else + "${RUN_CMD[@]}" +fi -# 4. Run each scenario. -run_scenario() { - local name="$1"; shift - local out="$OUT_DIR/$name.png" - log "Running scenario $name" - local args=(--scenario "$name" --sim-classpath "$SIM_CP" --screenshot "$out") - while [ "$#" -gt 0 ]; do - args+=("$@") - shift "$#" - done - if command -v xvfb-run >/dev/null 2>&1; then - xvfb-run -a -s "-screen 0 1600x1100x24" "$JAVA_BIN" \ - -Djava.awt.headless=false \ - -cp "$HARNESS_CP" \ - com.codenameone.tools.skindesigner.screenshots.SkinDesignerScreenshotter \ - "${args[@]}" +log "Copying generated PNGs out of $STORAGE_DIR" +missing=0 +for name in "${SCREENSHOT_NAMES[@]}"; do + src="$STORAGE_DIR/$name.png" + if [ -f "$src" ]; then + cp "$src" "$OUT_DIR/$name.png" + log " -> $OUT_DIR/$name.png" else - "$JAVA_BIN" \ - -Djava.awt.headless=false \ - -cp "$HARNESS_CP" \ - com.codenameone.tools.skindesigner.screenshots.SkinDesignerScreenshotter \ - "${args[@]}" + log " ! missing: $src" + missing=$((missing + 1)) fi - log " -> $out" -} - -# Scenarios mirror the developer-guide structure. The --demo overrides -# get forwarded as -Dcn1.skindesigner.* to the simulator JVM. -run_scenario skin-designer-stage-1-device \ - --demo cn1.skindesigner.demoStep=0 \ - --demo cn1.skindesigner.demoDevice=apple_apple_iphone_16_pro +done -run_scenario skin-designer-stage-2-source \ - --demo cn1.skindesigner.demoStep=1 \ - --demo cn1.skindesigner.demoDevice=apple_apple_iphone_16_pro - -run_scenario skin-designer-stage-3-editor-shape \ - --demo cn1.skindesigner.demoStep=2 \ - --demo cn1.skindesigner.demoDevice=apple_apple_iphone_16_pro \ - --demo cn1.skindesigner.demoSource=shape \ - --demo cn1.skindesigner.demoPreset=island \ - --demo cn1.skindesigner.demoSidebarTab=shape - -run_scenario skin-designer-stage-3-editor-cutouts \ - --demo cn1.skindesigner.demoStep=2 \ - --demo cn1.skindesigner.demoDevice=apple_apple_iphone_16_pro \ - --demo cn1.skindesigner.demoSource=shape \ - --demo cn1.skindesigner.demoPreset=island \ - --demo cn1.skindesigner.demoSidebarTab=cutouts - -run_scenario skin-designer-stage-3-editor-info \ - --demo cn1.skindesigner.demoStep=2 \ - --demo cn1.skindesigner.demoDevice=apple_apple_iphone_16_pro \ - --demo cn1.skindesigner.demoSource=shape \ - --demo cn1.skindesigner.demoPreset=island \ - --demo cn1.skindesigner.demoSidebarTab=info - -run_scenario skin-designer-stage-4-done \ - --demo cn1.skindesigner.demoStep=3 \ - --demo cn1.skindesigner.demoDevice=apple_apple_iphone_16_pro \ - --demo cn1.skindesigner.demoSource=shape \ - --demo cn1.skindesigner.demoPreset=island \ - --warmup 12 - -log "Done. Screenshots are in $OUT_DIR" +if [ "$missing" -gt 0 ]; then + log "$missing screenshot(s) missing; check the simulator log above for errors" + exit 1 +fi +log "Done" From 511a451748d986359c1a1f33215c173237789a7b Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 3 May 2026 17:56:21 +0300 Subject: [PATCH 45/55] Skin Designer screenshots CI: extract ZipSupport main.zip on a fresh checkout The CN1 ZipSupport cn1lib's main.zip is created by the install-cn1lib plugin goal on local first-run and isn't tracked in git (only the ZipSupport.cn1lib bundle and the cn1libs/ZipSupport/pom.xml are). On a fresh CI checkout mvn install fails at the build-helper attach-artifact step because cn1libs/ZipSupport/jars/main.zip doesn't exist: [ERROR] Failed to install artifact ... skindesigner-ZipSupport:jar:common ... /home/runner/work/.../cn1libs/ZipSupport/jars/main.zip Added an explicit extract step at the top of take-screenshots.sh that unzips main.zip out of the .cn1lib bundle if it isn't already present. The .cn1lib is just a zip containing main.zip + stubs.zip + the codenameone_library_*.properties metadata, so unzip -p does the job without needing the CN1 plugin. Co-Authored-By: Claude Opus 4.7 (1M context) --- scripts/skindesigner/screenshots/take-screenshots.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/scripts/skindesigner/screenshots/take-screenshots.sh b/scripts/skindesigner/screenshots/take-screenshots.sh index 837476c649..9cf9faa777 100755 --- a/scripts/skindesigner/screenshots/take-screenshots.sh +++ b/scripts/skindesigner/screenshots/take-screenshots.sh @@ -41,6 +41,16 @@ for name in "${SCREENSHOT_NAMES[@]}"; do rm -f "$STORAGE_DIR/$name.png" done +# Ensure the cn1lib's extracted main.zip exists. The Codename One plugin's +# install-cn1lib goal usually creates this on first checkout, but on CI we +# do it ourselves so the build doesn't depend on external state. +ZIP_LIB_DIR="$SKIN_DESIGNER_DIR/cn1libs/ZipSupport" +if [ -f "$SKIN_DESIGNER_DIR/cn1libs/ZipSupport.cn1lib" ] && [ ! -f "$ZIP_LIB_DIR/jars/main.zip" ]; then + log "Extracting ZipSupport cn1lib" + mkdir -p "$ZIP_LIB_DIR/jars" + unzip -p "$SKIN_DESIGNER_DIR/cn1libs/ZipSupport.cn1lib" main.zip > "$ZIP_LIB_DIR/jars/main.zip" +fi + log "Building Skin Designer (mvn -DskipTests install)" (cd "$SKIN_DESIGNER_DIR" && mvn -B -ntp -DskipTests install) From 3a6db4a33e6eb93a797bb6d31b07c96f66c997c6 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 3 May 2026 18:02:04 +0300 Subject: [PATCH 46/55] Skin Designer screenshots CI: wrap mvn install in xvfb-run The css goal of the CN1 plugin (cn1-process-classes execution) instantiates JavaSEPort to compile theme.css. JavaSEPort's static initializer calls calcRetinaScale -> getDefaultScreenDevice(), which throws HeadlessException on a fresh GitHub-actions runner. Need a display for mvn install just like for the simulator launch itself. Wrapped both phases in xvfb-run when available so the build runs under a virtual X server. Local non-Linux invocations still use the plain mvn invocation since macOS has a real display. --- scripts/skindesigner/screenshots/take-screenshots.sh | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/scripts/skindesigner/screenshots/take-screenshots.sh b/scripts/skindesigner/screenshots/take-screenshots.sh index 9cf9faa777..eb1620f1bc 100755 --- a/scripts/skindesigner/screenshots/take-screenshots.sh +++ b/scripts/skindesigner/screenshots/take-screenshots.sh @@ -52,7 +52,16 @@ if [ -f "$SKIN_DESIGNER_DIR/cn1libs/ZipSupport.cn1lib" ] && [ ! -f "$ZIP_LIB_DIR fi log "Building Skin Designer (mvn -DskipTests install)" -(cd "$SKIN_DESIGNER_DIR" && mvn -B -ntp -DskipTests install) +# The CN1 plugin's css goal instantiates the designer (JavaSEPort) to +# compile theme.css; that path queries getDefaultScreenDevice() and +# throws HeadlessException on a CI runner without a display. Wrap mvn +# in xvfb-run when available (Linux) so the install step can complete. +if command -v xvfb-run >/dev/null 2>&1; then + (cd "$SKIN_DESIGNER_DIR" && xvfb-run -a -s "-screen 0 1600x1100x24" \ + mvn -B -ntp -DskipTests install) +else + (cd "$SKIN_DESIGNER_DIR" && mvn -B -ntp -DskipTests install) +fi # The CN1 Maven plugin composes codename1.mainClass from the package + # mainName at startup. We override codename1.mainClass directly here so From abd06b76cc85904bd48fd1dc7265cc9e17b97c2c Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 3 May 2026 18:18:20 +0300 Subject: [PATCH 47/55] Skin Designer: fix isDarkMode NPE + drop unsupported CSS values The screenshots CI run failed inside the simulator because Display.isDarkMode() returns a Boolean that is null on the headless Linux JavaSE port. readThemeFromUrl() unboxed it directly and crashed SkinDesigner.runApp before the first form could render. Treat the null return as "not dark" and let the URL ?theme= override keep working. Also drop two CSS values the bundled designer's CSS compiler (7.0.228) does not understand and was logging as parse errors: - cn1rgba(...) translucent overlays -> opaque hex equivalents - font-family "native:MainMedium" -> "native:MainLight" These were warnings, not fatal, but they polluted the CI log and the hover/pressed colors silently fell back to the default. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../common/src/main/css/theme.css | 26 +++++++++---------- .../tools/skindesigner/SkinDesigner.java | 3 ++- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/scripts/skindesigner/common/src/main/css/theme.css b/scripts/skindesigner/common/src/main/css/theme.css index 416255b530..fa5d3bd5f1 100644 --- a/scripts/skindesigner/common/src/main/css/theme.css +++ b/scripts/skindesigner/common/src/main/css/theme.css @@ -73,13 +73,13 @@ SkinDesignerBrandLogoDark { SkinDesignerBrandTitle { color: #112247; font-size: 3.4mm; - font-family: "native:MainMedium"; + font-family: "native:MainLight"; padding: 0.6mm 0.4mm; } SkinDesignerBrandTitleDark { color: #f5f8ff; font-size: 3.4mm; - font-family: "native:MainMedium"; + font-family: "native:MainLight"; padding: 0.6mm 0.4mm; } @@ -185,13 +185,13 @@ SkinDesignerStepperNumPendingDark { SkinDesignerStepperLabelActive { color: #2f6bff; font-size: 2.8mm; - font-family: "native:MainMedium"; + font-family: "native:MainLight"; padding: 0; } SkinDesignerStepperLabelActiveDark { color: #4d86ff; font-size: 2.8mm; - font-family: "native:MainMedium"; + font-family: "native:MainLight"; padding: 0; } SkinDesignerStepperLabelDone { @@ -301,7 +301,7 @@ SkinDesignerStepScrollDark { background: transparent; padding: 0; } SkinDesignerH1 { color: #112247; font-size: 5.0mm; - font-family: "native:MainMedium"; + font-family: "native:MainLight"; padding: 0.4mm 0; margin: 0; background: transparent; @@ -310,7 +310,7 @@ SkinDesignerH1 { SkinDesignerH1Dark { color: #f5f8ff; font-size: 5.0mm; - font-family: "native:MainMedium"; + font-family: "native:MainLight"; padding: 0.4mm 0; margin: 0; background: transparent; @@ -319,7 +319,7 @@ SkinDesignerH1Dark { SkinDesignerH3 { color: #112247; font-size: 3.4mm; - font-family: "native:MainMedium"; + font-family: "native:MainLight"; padding: 0.4mm 0; margin: 0; background: transparent; @@ -327,7 +327,7 @@ SkinDesignerH3 { SkinDesignerH3Dark { color: #f5f8ff; font-size: 3.4mm; - font-family: "native:MainMedium"; + font-family: "native:MainLight"; padding: 0.4mm 0; margin: 0; background: transparent; @@ -583,7 +583,7 @@ SkinDesignerCardOverlay { font-size: 0.5mm; } SkinDesignerCardOverlay.pressed { - background: rgba(47,107,255,0.05); + background: #f5f8ff; color: transparent; border: none; padding: 0; @@ -599,7 +599,7 @@ SkinDesignerCardOverlayDark { font-size: 0.5mm; } SkinDesignerCardOverlayDark.pressed { - background: rgba(77,134,255,0.08); + background: #163575; color: transparent; border: none; padding: 0; @@ -1210,7 +1210,7 @@ SkinDesignerPresetSelected { margin: 0.3mm; } SkinDesignerPresetSelectedDark { - background: rgba(77,134,255,0.16); + background: #1c3a7a; border: 2px solid #4d86ff; border-radius: 2mm; padding: 1.6mm 1mm; @@ -1255,7 +1255,7 @@ SkinDesignerCutoutRowSelected { margin: 0.3mm 0; } SkinDesignerCutoutRowSelectedDark { - background: rgba(77,134,255,0.16); + background: #1c3a7a; border: 1px solid #4d86ff; border-radius: 1.4mm; padding: 1mm 1.4mm; @@ -1299,7 +1299,7 @@ SkinDesignerCutoutEditor { margin: 0.4mm 0; } SkinDesignerCutoutEditorDark { - background: rgba(77,134,255,0.16); + background: #1c3a7a; border-radius: 1.4mm; padding: 1.4mm; margin: 0.4mm 0; diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java index 6143d4aa8c..e8fd698db5 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/SkinDesigner.java @@ -1945,7 +1945,8 @@ private boolean readThemeFromUrl() { String theme = queryParam(href, "theme"); if ("dark".equalsIgnoreCase(theme)) return true; if ("light".equalsIgnoreCase(theme)) return false; - return Display.getInstance().isDarkMode(); + Boolean platformDark = Display.getInstance().isDarkMode(); + return platformDark != null && platformDark.booleanValue(); } private String queryParam(String href, String name) { From c528e1396ec933ac56f74d1b763a7cdaa7b5d866 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 3 May 2026 18:43:35 +0300 Subject: [PATCH 48/55] Skin Designer: ship placeholder PNGs so the website build stops failing The Skin Designer chapter references six screenshots generated by the skin-designer-screenshots workflow. Until that workflow lands its first successful run, lychee link-checking on the Hugo build fails with "Cannot find file" on each missing PNG, blocking the website build for every PR on this branch. Commit 8x8 grayscale placeholders under the same names so the build passes. The screenshots workflow overwrites these with the real captures on its first successful run. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../skin-designer/skin-designer-stage-1-device.png | Bin 0 -> 71 bytes .../skin-designer/skin-designer-stage-2-source.png | Bin 0 -> 71 bytes .../skin-designer-stage-3-editor-cutouts.png | Bin 0 -> 71 bytes .../skin-designer-stage-3-editor-info.png | Bin 0 -> 71 bytes .../skin-designer-stage-3-editor-shape.png | Bin 0 -> 71 bytes .../skin-designer/skin-designer-stage-4-done.png | Bin 0 -> 71 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/developer-guide/img/skin-designer/skin-designer-stage-1-device.png create mode 100644 docs/developer-guide/img/skin-designer/skin-designer-stage-2-source.png create mode 100644 docs/developer-guide/img/skin-designer/skin-designer-stage-3-editor-cutouts.png create mode 100644 docs/developer-guide/img/skin-designer/skin-designer-stage-3-editor-info.png create mode 100644 docs/developer-guide/img/skin-designer/skin-designer-stage-3-editor-shape.png create mode 100644 docs/developer-guide/img/skin-designer/skin-designer-stage-4-done.png diff --git a/docs/developer-guide/img/skin-designer/skin-designer-stage-1-device.png b/docs/developer-guide/img/skin-designer/skin-designer-stage-1-device.png new file mode 100644 index 0000000000000000000000000000000000000000..6dd10a86b51ba0856999885d093bd2a7f877fc03 GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^93TuL7#^lP3 Date: Sun, 3 May 2026 19:02:10 +0300 Subject: [PATCH 49/55] Skin Designer: generate screenshots inside the website build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The website builds the Hugo site from the same checkout that hosts the developer guide, so the Skin Designer chapter's PNGs need to exist by the time scripts/website/build.sh runs. Previously the only producer was the standalone skin-designer-screenshots workflow, whose output never made it onto the website branch — every Hugo build failed lychee link-checking on six missing PNGs, and the placeholder PNGs added in the prior commit would have shipped to production. Wire the screenshots into the website pipeline directly: - Trigger website-docs.yml on changes under docs/developer-guide/ and scripts/skindesigner/ so wizard or guide edits rebuild the site. - Insert Java 17 + xvfb + CodenameOne tooling steps and run take-screenshots.sh before the existing website build, so the PNGs land in docs/developer-guide/img/skin-designer/ in time for build.sh's rsync into static/developer-guide/. - Drop the placeholder PNGs committed in the previous fix; the build now produces real ones. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/website-docs.yml | 26 ++++++++++++++++++ .../skin-designer-stage-1-device.png | Bin 71 -> 0 bytes .../skin-designer-stage-2-source.png | Bin 71 -> 0 bytes .../skin-designer-stage-3-editor-cutouts.png | Bin 71 -> 0 bytes .../skin-designer-stage-3-editor-info.png | Bin 71 -> 0 bytes .../skin-designer-stage-3-editor-shape.png | Bin 71 -> 0 bytes .../skin-designer-stage-4-done.png | Bin 71 -> 0 bytes 7 files changed, 26 insertions(+) delete mode 100644 docs/developer-guide/img/skin-designer/skin-designer-stage-1-device.png delete mode 100644 docs/developer-guide/img/skin-designer/skin-designer-stage-2-source.png delete mode 100644 docs/developer-guide/img/skin-designer/skin-designer-stage-3-editor-cutouts.png delete mode 100644 docs/developer-guide/img/skin-designer/skin-designer-stage-3-editor-info.png delete mode 100644 docs/developer-guide/img/skin-designer/skin-designer-stage-3-editor-shape.png delete mode 100644 docs/developer-guide/img/skin-designer/skin-designer-stage-4-done.png diff --git a/.github/workflows/website-docs.yml b/.github/workflows/website-docs.yml index e9b96b289a..4e9f49e0ac 100644 --- a/.github/workflows/website-docs.yml +++ b/.github/workflows/website-docs.yml @@ -5,17 +5,21 @@ on: types: [opened, synchronize, reopened, ready_for_review] paths: - 'docs/website/**' + - 'docs/developer-guide/**' - 'scripts/cn1playground/**' - 'scripts/initializr/**' - 'scripts/website/**' + - 'scripts/skindesigner/**' - '.github/workflows/website-docs.yml' push: branches: [main, master] paths: - 'docs/website/**' + - 'docs/developer-guide/**' - 'scripts/cn1playground/**' - 'scripts/initializr/**' - 'scripts/website/**' + - 'scripts/skindesigner/**' - '.github/workflows/website-docs.yml' workflow_dispatch: @@ -76,6 +80,28 @@ jobs: env: GITHUB_TOKEN: ${{ github.token }} + - name: Set up Java 17 for Skin Designer screenshots + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: '17' + + - name: Set up xvfb for headless simulator + run: | + set -euo pipefail + sudo apt-get update + sudo apt-get install -y --no-install-recommends xvfb + + - name: Bootstrap Codename One tooling for screenshots + run: | + set -euo pipefail + mkdir -p "$HOME/.codenameone" + cp maven/CodeNameOneBuildClient.jar "$HOME/.codenameone/CodeNameOneBuildClient.jar" + touch "$HOME/.codenameone/guibuilder.jar" + + - name: Generate Skin Designer screenshots + run: ./scripts/skindesigner/screenshots/take-screenshots.sh + - name: Set up Java 25 for website build uses: actions/setup-java@v4 with: diff --git a/docs/developer-guide/img/skin-designer/skin-designer-stage-1-device.png b/docs/developer-guide/img/skin-designer/skin-designer-stage-1-device.png deleted file mode 100644 index 6dd10a86b51ba0856999885d093bd2a7f877fc03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^93TuL7#^lP3 Date: Sun, 3 May 2026 19:47:52 +0300 Subject: [PATCH 50/55] Skin Designer screenshots: drop simulator, capture headless MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Earlier the screenshots step booted the full JavaSE simulator via mvn -Psimulator verify with -Dcodename1.mainClass=ScreenshotApp. On CI the simulator launched, started the source-change watcher, then sat idle until the workflow timed out at 25 minutes — the Lifecycle override never reliably wired up inside the simulator launch path. Replace the harness with a plain main(): - ScreenshotApp.main() calls Display.init(new java.awt.Container()) in CN1's quiet test mode, walks each scenario on the EDT, lays the form out at iPhone-class dimensions, and writes the PNG via Form.toImage() + FileOutputStream + cn1 ImageIO. - take-screenshots.sh runs `mvn install -pl common -am` to compile and CSS-bake, then `mvn exec:java -Dexec.mainClass=...` for the capture. No cn1:simulator, no verify lifecycle. - Output lands directly in OUT_DIR (no Storage round-trip via ~/.cn1 needed any more). - Drop the standalone skin-designer-screenshots.yml; the website-docs workflow now produces the PNGs on demand for every Hugo build. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../workflows/skin-designer-screenshots.yml | 99 ----------- .../screenshots/ScreenshotApp.java | 166 ++++++++++-------- scripts/skindesigner/screenshots/README.md | 51 +++--- .../screenshots/take-screenshots.sh | 85 ++++----- 4 files changed, 163 insertions(+), 238 deletions(-) delete mode 100644 .github/workflows/skin-designer-screenshots.yml diff --git a/.github/workflows/skin-designer-screenshots.yml b/.github/workflows/skin-designer-screenshots.yml deleted file mode 100644 index 74f4d3a05a..0000000000 --- a/.github/workflows/skin-designer-screenshots.yml +++ /dev/null @@ -1,99 +0,0 @@ -name: Skin Designer Screenshots - -# Generates the per-stage Skin Designer screenshots referenced by the -# developer guide chapter. Runs the wizard inside the JavaSE simulator -# under xvfb, captures Robot screenshots for each stage via the harness in -# scripts/skindesigner/screenshots/, and opens a PR if the PNGs in -# docs/developer-guide/img/skin-designer/ drifted. -# -# The skin designer UI changes much less often than the bundled device -# database, so this workflow only runs on demand or when the harness / -# skin-designer code changes — not on the device-DB-update cron. - -on: - workflow_dispatch: - pull_request: - paths: - - 'scripts/skindesigner/screenshots/**' - - 'scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/**' - - 'scripts/skindesigner/common/src/main/css/theme.css' - - '.github/workflows/skin-designer-screenshots.yml' - -permissions: - actions: write - contents: write - pull-requests: write - -jobs: - generate-screenshots: - if: github.repository == 'codenameone/CodenameOne' - runs-on: ubuntu-latest - timeout-minutes: 25 - - steps: - - name: Check out repository - uses: actions/checkout@v4 - - - name: Set up JDK 17 - uses: actions/setup-java@v4 - with: - distribution: 'temurin' - java-version: '17' - - - name: Set up xvfb - run: | - set -euo pipefail - sudo apt-get update - sudo apt-get install -y --no-install-recommends xvfb - - - name: Cache Maven packages - uses: actions/cache@v4 - with: - path: ~/.m2 - key: ${{ runner.os }}-skin-designer-screenshots-m2-${{ hashFiles('scripts/skindesigner/**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-skin-designer-screenshots-m2- - - - name: Bootstrap Codename One tooling - run: | - set -euo pipefail - mkdir -p "$HOME/.codenameone" - # The Maven plugin checks for these files before allowing a - # local build. The build client jar is only used by builds that - # deploy to the build cloud, but the file must exist. - cp maven/CodeNameOneBuildClient.jar "$HOME/.codenameone/CodeNameOneBuildClient.jar" - touch "$HOME/.codenameone/guibuilder.jar" - - - name: Take Skin Designer screenshots - run: ./scripts/skindesigner/screenshots/take-screenshots.sh - - - name: Show diff - run: | - git --no-pager diff --stat -- docs/developer-guide/img/skin-designer/ - - - name: Upload screenshots as artifact - uses: actions/upload-artifact@v4 - with: - name: skin-designer-screenshots - path: docs/developer-guide/img/skin-designer/*.png - if-no-files-found: warn - - - name: Open refresh PR if screenshots drifted - if: github.event_name == 'workflow_dispatch' - uses: peter-evans/create-pull-request@v7 - with: - commit-message: "Refresh Skin Designer developer-guide screenshots" - title: "Refresh Skin Designer developer-guide screenshots" - body: | - ## Summary - - Re-ran `scripts/skindesigner/screenshots/take-screenshots.sh` - and updated the per-stage PNGs under - `docs/developer-guide/img/skin-designer/`. - - Created automatically by the Skin Designer screenshots workflow. - base: master - branch: automation/skin-designer-screenshots - delete-branch: true - labels: | - documentation - automation diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/screenshots/ScreenshotApp.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/screenshots/ScreenshotApp.java index 9829fbc8ab..13d5694adc 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/screenshots/ScreenshotApp.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/screenshots/ScreenshotApp.java @@ -1,35 +1,38 @@ package com.codename1.tools.skindesigner.screenshots; -import com.codename1.io.Log; import com.codename1.io.Preferences; -import com.codename1.io.Storage; -import com.codename1.system.Lifecycle; import com.codename1.tools.skindesigner.SkinDesigner; import com.codename1.tools.skindesigner.SkinModel; import com.codename1.ui.CN; import com.codename1.ui.Display; +import com.codename1.ui.Form; import com.codename1.ui.Image; import com.codename1.ui.util.ImageIO; -import com.codename1.ui.util.UITimer; -import java.io.IOException; + +import java.awt.Container; +import java.io.File; +import java.io.FileOutputStream; import java.io.OutputStream; /** - * Lifecycle entry point used by the developer-guide screenshot pipeline. - * Drives the Skin Designer through each wizard stage and saves a PNG per - * stage via {@link Display#captureScreen()} into Storage. - * - *

On the JavaSE port, Storage maps to {@code ~/.cn1/<name>}, so - * {@code take-screenshots.sh} just copies those files into - * {@code docs/developer-guide/img/skin-designer/}. + * Headless screenshot harness for the developer guide. Boots Codename One + * in quiet mode (no skin window, no source-watcher), walks the wizard + * scenarios on the EDT, captures each form via {@link Form#toImage()}, + * and writes the PNG straight to disk. * - *

Run via: + *

Run via the website CI step or the helper script: *

- *   ./run.sh simulator          # but with -Dcodename1.mainName=ScreenshotApp
+ *   mvn -pl common exec:java \
+ *       -Dexec.mainClass=com.codename1.tools.skindesigner.screenshots.ScreenshotApp \
+ *       -Dexec.args="path/to/output/dir"
  * 
- * which the wrapper script handles. + * + *

The previous version of this class extended {@code Lifecycle} and was + * driven by the cn1:simulator goal; that path booted the full simulator + * (skin window, CEF, source-change watcher) and never reliably exited + * inside CI. This rewrite avoids the simulator entirely. */ -public class ScreenshotApp extends Lifecycle { +public class ScreenshotApp { /** Each row drives one screenshot: * {fileName, demoStep, demoDevice, demoSource, demoSidebarTab, demoPreset}. */ @@ -42,61 +45,96 @@ public class ScreenshotApp extends Lifecycle { {"skin-designer-stage-4-done", "3", "apple_apple_iphone_16_pro", "shape", null, "island"}, }; - /** Persistent wizard state keys we have to wipe between scenarios so - * each screenshot starts from a clean slate. Mirrors the keys used - * inside SkinDesigner / SkinModel. */ + /** Persistent wizard state keys we wipe between scenarios so each + * screenshot starts from a clean slate. */ private static final String[] WIZARD_PREF_KEYS = { "wiz.step", "wiz.deviceId", "wiz.source", "wiz.hasImage", }; - /** Time to wait after each renderStep before capturing, in ms. The - * wizard rebuilds via revalidate() + applyDarkRecursive — give it a - * full 1.5 s on JavaSE so layout/animations settle before the - * screenshot. */ - private static final int RENDER_DELAY_MS = 1500; + /** Render dimensions. iPhone 16 Pro point size — wide enough that the + * wizard's two-column editor layout matches what a user sees on a + * phone-class viewport. */ + private static final int WIDTH = 390; + private static final int HEIGHT = 844; - @Override - public void runApp() { - Log.p("[skin-designer-screenshots] starting; scenarios=" + SCENARIOS.length); - runScenario(0); - } + public static void main(String[] args) throws Exception { + File outDir = resolveOutDir(args); + if (!outDir.mkdirs() && !outDir.isDirectory()) { + throw new RuntimeException("Could not create output dir: " + outDir); + } + log("output dir: " + outDir.getAbsolutePath()); - private void runScenario(final int idx) { - if (idx >= SCENARIOS.length) { - Log.p("[skin-designer-screenshots] done; exiting"); - // Small delay so the final capture flushes to disk before VM exit. - UITimer.timer(300, false, Display.getInstance().getCurrent(), - () -> Display.getInstance().exitApplication()); - return; + Container hostPanel = new Container(); + hostPanel.setSize(WIDTH, HEIGHT); + Display.init(hostPanel); + + for (String[] s : SCENARIOS) { + renderAndSave(s, outDir); } - final String[] s = SCENARIOS[idx]; - Log.p("[skin-designer-screenshots] scenario " + (idx + 1) + "/" + SCENARIOS.length - + " -> " + s[0]); - - resetWizardState(); - applyDemoProperties(s); - - // Re-initialise the wizard. Each scenario builds a fresh - // SkinDesigner because runApp captures `this` into action listeners - // and we want the screenshot to reflect a clean restart. - new SkinDesigner().runApp(); - - UITimer.timer(RENDER_DELAY_MS, false, Display.getInstance().getCurrent(), () -> { - captureAndSave(s[0]); - // Yield once before the next scenario so the EDT has a chance - // to drain any queued repaints from the capture step. - CN.callSerially(() -> runScenario(idx + 1)); + + Display.deinitialize(); + // exitApplication closes the EDT; explicit System.exit guarantees + // the harness returns control to the shell even if a stray AWT + // thread is still alive. + System.exit(0); + } + + private static void renderAndSave(final String[] s, final File outDir) { + Display.getInstance().callSeriallyAndWait(() -> { + try { + resetWizardState(); + applyDemoProperties(s); + + new SkinDesigner().runApp(); + Form f = Display.getInstance().getCurrent(); + if (f == null) { + log("no current form for " + s[0]); + return; + } + f.setSize(new com.codename1.ui.geom.Dimension(WIDTH, HEIGHT)); + f.setX(0); + f.setY(0); + f.layoutContainer(); + f.revalidate(); + + Image img = f.toImage(); + if (img == null) { + log("toImage returned null for " + s[0]); + return; + } + File out = new File(outDir, s[0] + ".png"); + try (OutputStream os = new FileOutputStream(out)) { + ImageIO.getImageIO().save(img, os, ImageIO.FORMAT_PNG, 1.0f); + } + log("saved " + out.getName() + " (" + img.getWidth() + "x" + img.getHeight() + ")"); + } catch (Exception err) { + err.printStackTrace(); + } }); } - private void resetWizardState() { + private static File resolveOutDir(String[] args) { + if (args != null && args.length > 0 && args[0] != null && !args[0].isEmpty()) { + return new File(args[0]).getAbsoluteFile(); + } + String prop = System.getProperty("skindesigner.screenshotsDir"); + if (prop != null && !prop.isEmpty()) { + return new File(prop).getAbsoluteFile(); + } + // Default: /docs/developer-guide/img/skin-designer relative + // to the common module's basedir (scripts/skindesigner/common/). + return new File(System.getProperty("user.dir"), + "../../../docs/developer-guide/img/skin-designer").getAbsoluteFile(); + } + + private static void resetWizardState() { for (String k : WIZARD_PREF_KEYS) { Preferences.delete(k); } SkinModel.clearPersisted(); } - private void applyDemoProperties(String[] s) { + private static void applyDemoProperties(String[] s) { setProp("cn1.skindesigner.demoStep", s[1]); setProp("cn1.skindesigner.demoDevice", s[2]); setProp("cn1.skindesigner.demoSource", s[3]); @@ -112,21 +150,7 @@ private static void setProp(String key, String value) { } } - private void captureAndSave(String name) { - try { - Image img = Display.getInstance().captureScreen(); - if (img == null) { - Log.p("[skin-designer-screenshots] captureScreen returned null for " + name); - return; - } - String fileName = name + ".png"; - try (OutputStream os = Storage.getInstance().createOutputStream(fileName)) { - ImageIO.getImageIO().save(img, os, ImageIO.FORMAT_PNG, 1.0f); - } - Log.p("[skin-designer-screenshots] saved " + fileName - + " (" + img.getWidth() + "x" + img.getHeight() + ")"); - } catch (IOException err) { - Log.e(err); - } + private static void log(String msg) { + System.out.println("[skin-designer-screenshots] " + msg); } } diff --git a/scripts/skindesigner/screenshots/README.md b/scripts/skindesigner/screenshots/README.md index 3241ed1e45..1a94580858 100644 --- a/scripts/skindesigner/screenshots/README.md +++ b/scripts/skindesigner/screenshots/README.md @@ -1,27 +1,33 @@ # Skin Designer screenshots This directory drives the developer-guide screenshots for the Skin -Designer chapter. The pipeline runs entirely inside Codename One — -`Display.captureScreen()` produces the PNGs, no AWT Robot or external -xvfb capture step. +Designer chapter. The capture runs entirely inside Codename One in +quiet mode — no skin window, no source-watcher, no AWT Robot, no +external xvfb capture step. ## How it works `scripts/skindesigner/common/src/main/java/.../screenshots/ScreenshotApp.java` -is a `Lifecycle` subclass that walks each wizard stage: +is a plain `main()` class that: 1. Wipes the persisted wizard state in `Preferences` / `Storage`. 2. Sets the `cn1.skindesigner.demo*` system properties for the next scenario (step / device / source / sidebar tab / preset). -3. Calls `new SkinDesigner().runApp()` to build a fresh wizard form. -4. Waits 1.5 s for layout to settle. -5. Calls `Display.getInstance().captureScreen()` and saves the result - via `Storage.getInstance().createOutputStream(name + ".png")` — - on the JavaSE port that lands at `~/.cn1/.png`. +3. Calls `Display.init(new Container())` once for the whole run, then + `new SkinDesigner().runApp()` per scenario to build a fresh form. +4. On the EDT, lays out the form at iPhone-class dimensions and calls + `form.toImage()` to render off-screen. +5. Writes each PNG straight to disk via `cn1.ImageIO`. -After every scenario finishes, the app calls -`Display.exitApplication()`. The shell script then copies the PNGs out -of `~/.cn1/` and into `docs/developer-guide/img/skin-designer/`. +`take-screenshots.sh` invokes this via: + +``` +mvn -pl common exec:java \ + -Dexec.mainClass=com.codename1.tools.skindesigner.screenshots.ScreenshotApp \ + -Dexec.args="$OUT_DIR" +``` + +— no cn1:simulator, no `verify` lifecycle, no JFrame. ## Running locally @@ -30,15 +36,15 @@ scripts/skindesigner/screenshots/take-screenshots.sh ``` Requires Java 17 + Maven on `PATH`. On Linux you also need `xvfb-run` -for headless JavaSE simulator runs (`sudo apt-get install xvfb`); on -macOS the script falls back to a regular simulator launch and you'll -see the wizard window briefly per scenario. +because CN1's `Display.init` still pokes +`Toolkit.getDefaultToolkit()`. On macOS the script falls back to a +direct `mvn` invocation. ## Demo overrides -`SkinDesigner.applyDemoOverrides()` reads these system properties from -the JVM and, if present, replaces the loaded persisted state with the -specified values: +`SkinDesigner.applyDemoOverrides()` reads these system properties +from the JVM and, if present, replaces the loaded persisted state +with the specified values: | Property | Effect | | ------------------------------------- | --------------------------------------- | @@ -52,7 +58,8 @@ specified values: ## CI -`.github/workflows/skin-designer-screenshots.yml` runs the script on -`workflow_dispatch` and on PRs that touch the harness or wizard code, -uploads the PNGs as an artifact, and on manual dispatch opens an -automated PR if the committed images drifted. +The Hugo website build (`.github/workflows/website-docs.yml`) runs +this script before invoking `scripts/website/build.sh`, so the +freshly generated PNGs are rsynced into `static/developer-guide/img/` +on every run. Nothing about the screenshots ends up committed — +they are produced on demand by the website pipeline. diff --git a/scripts/skindesigner/screenshots/take-screenshots.sh b/scripts/skindesigner/screenshots/take-screenshots.sh index eb1620f1bc..52a5f21d04 100755 --- a/scripts/skindesigner/screenshots/take-screenshots.sh +++ b/scripts/skindesigner/screenshots/take-screenshots.sh @@ -1,15 +1,21 @@ #!/usr/bin/env bash -# Run the Skin Designer's ScreenshotApp Lifecycle inside the JavaSE -# simulator. Each scenario calls Display.captureScreen() and saves the -# PNG via Storage; on JavaSE that lands in ~/.cn1/. We then copy those -# PNGs into docs/developer-guide/img/skin-designer/. +# Generate the per-stage Skin Designer screenshots referenced by the +# developer-guide chapter. # -# Run by .github/workflows/skin-designer-screenshots.yml on a schedule -# and on workflow_dispatch. Locally (Linux): +# Boots Codename One in quiet mode (no skin window, no source-watcher) +# via mvn exec:java on ScreenshotApp.main. ScreenshotApp walks the +# wizard scenarios on the EDT and writes each Form.toImage() PNG into +# OUT_DIR. Replaces the older Lifecycle + cn1:simulator path that hung +# inside CI. +# +# Run by .github/workflows/website-docs.yml ahead of the Hugo build. +# Locally: # # scripts/skindesigner/screenshots/take-screenshots.sh # -# Requires Java 17 + Maven on PATH. Linux: xvfb-run for headless capture. +# Requires Java 17 + Maven on PATH. On Linux you also need xvfb so +# AWT's font/graphics initialisation can succeed (CN1 Display.init +# still pokes Toolkit.getDefaultToolkit()). set -euo pipefail log() { echo "[skin-designer-screenshots] $1" >&2; } @@ -21,7 +27,6 @@ REPO_ROOT="$(cd "$SKIN_DESIGNER_DIR/../.." && pwd)" OUT_DIR="${OUT_DIR:-$REPO_ROOT/docs/developer-guide/img/skin-designer}" mkdir -p "$OUT_DIR" -# Names match the SCENARIOS array in ScreenshotApp.java; keep in sync. SCREENSHOT_NAMES=( "skin-designer-stage-1-device" "skin-designer-stage-2-source" @@ -31,14 +36,10 @@ SCREENSHOT_NAMES=( "skin-designer-stage-4-done" ) -# Storage on the JavaSE port lives at ~/.cn1; the ScreenshotApp writes -# each scenario as .png into Storage. -STORAGE_DIR="$HOME/.cn1" - -# Wipe any stale screenshots from a previous run so a partial run can -# never report success with old files. +# Wipe stale outputs so a partial run can never report success with old +# files. for name in "${SCREENSHOT_NAMES[@]}"; do - rm -f "$STORAGE_DIR/$name.png" + rm -f "$OUT_DIR/$name.png" done # Ensure the cn1lib's extracted main.zip exists. The Codename One plugin's @@ -51,43 +52,35 @@ if [ -f "$SKIN_DESIGNER_DIR/cn1libs/ZipSupport.cn1lib" ] && [ ! -f "$ZIP_LIB_DIR unzip -p "$SKIN_DESIGNER_DIR/cn1libs/ZipSupport.cn1lib" main.zip > "$ZIP_LIB_DIR/jars/main.zip" fi -log "Building Skin Designer (mvn -DskipTests install)" -# The CN1 plugin's css goal instantiates the designer (JavaSEPort) to -# compile theme.css; that path queries getDefaultScreenDevice() and -# throws HeadlessException on a CI runner without a display. Wrap mvn -# in xvfb-run when available (Linux) so the install step can complete. -if command -v xvfb-run >/dev/null 2>&1; then - (cd "$SKIN_DESIGNER_DIR" && xvfb-run -a -s "-screen 0 1600x1100x24" \ - mvn -B -ntp -DskipTests install) -else - (cd "$SKIN_DESIGNER_DIR" && mvn -B -ntp -DskipTests install) -fi +# CN1 plugin steps (CSS compile, compliance check) instantiate JavaSEPort +# which queries getDefaultScreenDevice(); on a CI runner without a display +# that throws HeadlessException. Wrap mvn in xvfb-run when available. +mvn_with_display() { + if command -v xvfb-run >/dev/null 2>&1; then + xvfb-run -a -s "-screen 0 1280x900x24" "$@" + else + "$@" + fi +} -# The CN1 Maven plugin composes codename1.mainClass from the package + -# mainName at startup. We override codename1.mainClass directly here so -# the simulator launches our ScreenshotApp instead of the regular -# SkinDesigner. -SCREENSHOT_MAIN="com.codename1.tools.skindesigner.screenshots.ScreenshotApp" -log "Running simulator with $SCREENSHOT_MAIN" -RUN_CMD=(mvn -B -ntp -Psimulator -DskipTests - -Dcodename1.platform=javase - "-Dcodename1.mainClass=$SCREENSHOT_MAIN" - -f "$SKIN_DESIGNER_DIR/javase/pom.xml" - verify) +log "Building Skin Designer common (mvn -DskipTests install)" +( cd "$SKIN_DESIGNER_DIR" && mvn_with_display \ + mvn -B -ntp -DskipTests install -pl common -am ) -if command -v xvfb-run >/dev/null 2>&1; then - xvfb-run -a -s "-screen 0 1600x1100x24" "${RUN_CMD[@]}" -else - "${RUN_CMD[@]}" -fi +SCREENSHOT_MAIN="com.codename1.tools.skindesigner.screenshots.ScreenshotApp" +log "Capturing screenshots via $SCREENSHOT_MAIN -> $OUT_DIR" +( cd "$SKIN_DESIGNER_DIR/common" && mvn_with_display \ + mvn -B -ntp -DskipTests exec:java \ + "-Dexec.mainClass=$SCREENSHOT_MAIN" \ + "-Dexec.args=$OUT_DIR" \ + -Dexec.classpathScope=compile ) -log "Copying generated PNGs out of $STORAGE_DIR" +log "Verifying captured PNGs" missing=0 for name in "${SCREENSHOT_NAMES[@]}"; do - src="$STORAGE_DIR/$name.png" + src="$OUT_DIR/$name.png" if [ -f "$src" ]; then - cp "$src" "$OUT_DIR/$name.png" - log " -> $OUT_DIR/$name.png" + log " ok: $src" else log " ! missing: $src" missing=$((missing + 1)) From 49ad157ee7fc78cf3af9ab0c4f0d42349571ad07 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 3 May 2026 19:54:26 +0300 Subject: [PATCH 51/55] Skin Designer screenshots: pull codename1-javase via test classpath ScreenshotApp's Display.init needs ImplementationFactory, which codenameone-javase provides under test scope in skindesigner-common's pom. Running exec:java with classpathScope=compile threw ClassNotFoundException at startup. Switch the screenshot exec to classpathScope=test so the JavaSE port is on the classpath. Co-Authored-By: Claude Opus 4.7 (1M context) --- scripts/skindesigner/screenshots/take-screenshots.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/skindesigner/screenshots/take-screenshots.sh b/scripts/skindesigner/screenshots/take-screenshots.sh index 52a5f21d04..65547dd6df 100755 --- a/scripts/skindesigner/screenshots/take-screenshots.sh +++ b/scripts/skindesigner/screenshots/take-screenshots.sh @@ -73,7 +73,7 @@ log "Capturing screenshots via $SCREENSHOT_MAIN -> $OUT_DIR" mvn -B -ntp -DskipTests exec:java \ "-Dexec.mainClass=$SCREENSHOT_MAIN" \ "-Dexec.args=$OUT_DIR" \ - -Dexec.classpathScope=compile ) + -Dexec.classpathScope=test ) log "Verifying captured PNGs" missing=0 From 682e48566641f731e762e9ee0b1785f0792ee6ee Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 3 May 2026 19:57:53 +0300 Subject: [PATCH 52/55] Skin Designer screenshots: load /theme before building forms ScreenshotApp bypasses Lifecycle.start, so the bundled theme.res never gets registered with UIManager. Without it Form.getToolbar() returns null and SkinDesigner.runApp NPEs on the first tweak. Mirror Lifecycle.start by calling UIManager.initFirstTheme("/theme") right after Display.init so each scenario renders against the same themed UIIDs the wizard expects. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../tools/skindesigner/screenshots/ScreenshotApp.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/screenshots/ScreenshotApp.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/screenshots/ScreenshotApp.java index 13d5694adc..ecef80632e 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/screenshots/ScreenshotApp.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/screenshots/ScreenshotApp.java @@ -7,6 +7,7 @@ import com.codename1.ui.Display; import com.codename1.ui.Form; import com.codename1.ui.Image; +import com.codename1.ui.plaf.UIManager; import com.codename1.ui.util.ImageIO; import java.awt.Container; @@ -68,6 +69,13 @@ public static void main(String[] args) throws Exception { hostPanel.setSize(WIDTH, HEIGHT); Display.init(hostPanel); + // Lifecycle.start() normally pulls in the bundled theme.res via + // UIManager.initFirstTheme. We bypass Lifecycle entirely (no + // simulator), so do the same load by hand — without the theme, + // Form.getToolbar() returns null because globalToobarBool isn't + // set, and SkinDesigner.runApp NPEs on its first toolbar tweak. + UIManager.initFirstTheme("/theme"); + for (String[] s : SCENARIOS) { renderAndSave(s, outDir); } From b7757f452391f4cca37a9ccb82f91afd75d35882 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 3 May 2026 20:04:13 +0300 Subject: [PATCH 53/55] Skin Designer screenshots: enable global Toolbar in headless mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UIManager.initFirstTheme alone does not flip Toolbar.globalToolbar — the flag is only ever set by an explicit Toolbar.setGlobalToolbar call (CN1's bundled simulator does this; Lifecycle.start does not). Without it, Form.getToolbar() stays null and SkinDesigner.runApp NPEs on its first form.getToolbar().setHidden(true). Set the flag explicitly after Display.init in the screenshot harness. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../tools/skindesigner/screenshots/ScreenshotApp.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/screenshots/ScreenshotApp.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/screenshots/ScreenshotApp.java index ecef80632e..0abe376a18 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/screenshots/ScreenshotApp.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/screenshots/ScreenshotApp.java @@ -7,6 +7,7 @@ import com.codename1.ui.Display; import com.codename1.ui.Form; import com.codename1.ui.Image; +import com.codename1.ui.Toolbar; import com.codename1.ui.plaf.UIManager; import com.codename1.ui.util.ImageIO; @@ -71,11 +72,15 @@ public static void main(String[] args) throws Exception { // Lifecycle.start() normally pulls in the bundled theme.res via // UIManager.initFirstTheme. We bypass Lifecycle entirely (no - // simulator), so do the same load by hand — without the theme, - // Form.getToolbar() returns null because globalToobarBool isn't - // set, and SkinDesigner.runApp NPEs on its first toolbar tweak. + // simulator), so do the same load by hand. UIManager.initFirstTheme("/theme"); + // SkinDesigner.runApp expects a global Toolbar (it calls + // form.getToolbar().setHidden(true) without nullguarding). The + // simulator turns this on for us; in headless mode we have to + // flip it ourselves before any Form is constructed. + Toolbar.setGlobalToolbar(true); + for (String[] s : SCENARIOS) { renderAndSave(s, outDir); } From 3ba90e0373f177ecff00468448dcc03cf1ca3460 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Sun, 3 May 2026 21:14:55 +0300 Subject: [PATCH 54/55] Skin Designer guide: drop launching/install copy, widen screenshots MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reframe the chapter to match how users actually meet the tool — at codenameone.com/skindesigner, in a browser tab, no install. The prior chapter pitched it as a standalone CN1 app with three flavours and a "Launching the tool" section walking through run.sh / .bat; remove that, point at the URL, and treat the screenshots as captures from the hosted tool. Tighten the prose: - Cut implementation details that don't concern users (Preferences keys reset, in-memory state mgmt, the catalog refresh script and scrape-source mention). - Refer to the "device catalog" rather than devices.json. - Drop the "Refreshing the bundled device catalog" appendix entirely — that's a CI/maintainer concern. Widen the screenshot harness from a phone-class 390×844 to a desktop-class 1280×800 viewport so the editor's two-column layout renders at the same width a website visitor sees. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/developer-guide/Skin-Designer.asciidoc | 240 +++++++----------- .../screenshots/ScreenshotApp.java | 10 +- 2 files changed, 103 insertions(+), 147 deletions(-) diff --git a/docs/developer-guide/Skin-Designer.asciidoc b/docs/developer-guide/Skin-Designer.asciidoc index 8d884c1f54..65c61a6b69 100644 --- a/docs/developer-guide/Skin-Designer.asciidoc +++ b/docs/developer-guide/Skin-Designer.asciidoc @@ -1,68 +1,45 @@ [[skin-designer]] == Skin Designer -The Skin Designer is a Codename One tool that turns a device specification -(resolution, PPI, fonts, safe-area insets, cutouts) into a `.skin` file -that the JavaSE simulator can load. It runs as a regular Codename One app -and ships in three flavours: a desktop app, the iOS / Android tools that -back the website, and a JavaScript build hosted on -https://www.codenameone.com. - -This chapter walks through the wizard and explains what each step writes -into the `.skin` file. If you want to skip the explanation and just build -a skin: pick a device, accept the defaults, click *Finish*, then *Download -skin*. The file is ready to load via *Add* in the simulator's *Skins* -menu. - -NOTE: The wizard is intentionally opinionated. It bundles a curated -device database scraped from GSMArena (refreshed monthly by CI), generates -the device frame procedurally, and writes a skin layout that matches the -`Themes/iPhoneTheme.res`, `Themes/iOS7Theme.res`, and -`Themes/android_holo_light.res` themes shipped with Codename One. For a -custom skin from a hand-painted device render, jump straight to the +The Skin Designer turns a device specification (resolution, PPI, +fonts, safe-area insets, cutouts) into a `.skin` file that the +JavaSE simulator can load. It runs in your browser at +https://www.codenameone.com/skindesigner — there is nothing to +install. + +This chapter walks through the wizard and explains what each step +contributes to the generated `.skin`. If you only want a skin and +don't care how it's built: pick a device, accept the defaults, click +*Finish*, then *Download skin*. The file is ready to load via *Add* +in the simulator's *Skins* menu. + +NOTE: The wizard is intentionally opinionated. It ships with a +curated device catalog, generates the device frame procedurally, and +writes a skin layout that matches the `Themes/iPhoneTheme.res`, +`Themes/iOS7Theme.res`, and `Themes/android_holo_light.res` themes +shipped with Codename One. For a custom skin from a hand-painted +device render, jump straight to the <> source. -=== Launching the tool - -The skin designer is built as a regular Codename One Maven app under -`scripts/skindesigner/`. To run it locally: - -[source,shell] ----- -cd scripts/skindesigner -./run.sh # macOS / Linux -run.bat # Windows ----- - -Both scripts call `mvn cn:java -P simulator` against the `javase` module, -so the wizard appears in the standard CN1 simulator window. You can also -visit the hosted JavaScript build at -https://www.codenameone.com/skin-designer (no install required). - === Stage 1 — pick a device image::img/skin-designer/skin-designer-stage-1-device.png[Device picker showing the iPhone 16 Pro selected and Continue enabled,role="text-center"] -The first step shows a card per device from the bundled catalog. Use the -search box to filter by name (it matches both the model name and the -brand) and the chips below to narrow by form factor: *All / Phones / -Tablets / Foldables*. Tapping a card selects the device and enables the -*Continue* button in the footer. - -What clicking a card actually does: - -* Loads the device's resolution, PPI, screen size, default safe-area - insets, and the iOS / Android system font names from the - `devices.json` catalog. -* Resets the in-memory skin to a sensible default for the device: - notch / island / hole presets are applied automatically based on the - device's `hasNotch` / `hasIsland` / `hasHole` flags. -* Persists the choice in `Preferences` under `wiz.deviceId` so closing - the wizard mid-flow and reopening it lands you back on the same step. - -TIP: The catalog is large (~5,000 devices). The grid is capped to the 60 -most recent matches by default; type into the search field to find older -or less-common devices. The `Showing X of Y` hint between the chips and +The first step shows a card per device from the bundled catalog. Use +the search box to filter by name (it matches both the model and the +brand) and the chips below to narrow by form factor: *All / Phones +/ Tablets / Foldables*. Tapping a card selects the device and enables +the *Continue* button in the footer. + +Picking a device pulls in its resolution, PPI, screen size, default +safe-area insets, and the iOS / Android system font names from the +device catalog, then seeds a sensible starting frame: notch, island, +or hole presets are applied automatically based on the device's +hardware. + +TIP: The catalog is large. The grid is capped to the most recent +matches by default; type into the search field to find older or +less-common devices. The `Showing X of Y` hint between the chips and the grid tells you when you're looking at a clamped subset. === Stage 2 — pick a starting source @@ -73,88 +50,90 @@ There are three ways to seed the skin's body image: [[skin-designer-source-shape]] *Pick a shape* — generates the device frame procedurally from a small -preset library (rounded rect, notch, dynamic island, punch-hole, corner -hole, classic home-button). The frame is rendered as a dark gradient with -the screen rect (and any cutouts) carved into it. Best when you want a -generic-looking iPhone or Android frame and don't care about exact -hardware fidelity. +preset library (rounded rect, notch, dynamic island, punch-hole, +corner hole, classic home-button). The frame is rendered as a dark +gradient with the screen rect (and any cutouts) carved into it. Best +when you want a generic-looking iPhone or Android frame and don't +care about exact hardware fidelity. [[skin-designer-source-image]] -*Upload an image* — opens the platform's image picker. The wizard scales -the image into the device's resolution, then carves the screen rect (and +*Upload an image* — opens an image picker. The wizard scales the +image into the device's resolution, then carves the screen rect (and cutouts) on top. Use this when you have a marketing render of the specific device you're targeting. *Blank rectangle* — collapses the bezel and corner radius to almost -nothing, drops every cutout, and turns the home indicator off. The screen -fills the entire skin. This is useful for desktop / web simulators where -the device frame would just be visual noise. +nothing, drops every cutout, and turns the home indicator off. The +screen fills the entire skin. Useful for desktop / web simulators +where the device frame would just be visual noise. -Hover over a card on desktop to see the blue selection ring; click to -advance to the editor. +Hover over a card on desktop to see the blue selection ring; click +to advance to the editor. === Stage 3 — the editor image::img/skin-designer/skin-designer-stage-3-editor-shape.png[Editor with the Dynamic Island preset selected and live preview on the left,role="text-center"] -The editor is split into two panes: a live preview on the left (a custom -CN1 component that paints the device frame, screen tint, cutouts, and -home indicator) and a sidebar on the right with three tabs. +The editor is split into two panes: a live preview on the left that +paints the device frame, screen tint, cutouts, and home indicator, +and a sidebar on the right with three tabs. ==== Shape tab -When you started from *Pick a shape*, the Shape tab shows a preset grid -(*Rounded rect / Notch / Dynamic Island / Punch-hole / Corner hole / -Classic home*) and dimension fields: +When you started from *Pick a shape*, the Shape tab shows a preset +grid (*Rounded rect / Notch / Dynamic Island / Punch-hole / Corner +hole / Classic home*) and dimension fields: -* *Corner radius* — the device's outer corner radius in viewbox pixels - (the design uses a 320 × 620 viewbox; the actual skin image is scaled - to the device's resolution). +* *Corner radius* — the device's outer corner radius in viewbox + pixels (the design uses a 320 × 620 viewbox; the actual skin image + is scaled to the device's resolution). * *Bezel* — frame thickness in viewbox pixels. The screen rect is positioned at `(bezel, bezel)` inside the skin image. * *Home indicator* — toggles the lime pill drawn at the bottom edge. - iPhones from X onward and most modern Androids should leave this on; - classic devices with a hardware home button should turn it off. + iPhones from X onward and most modern Androids should leave this + on; classic devices with a hardware home button should turn it off. -When you started from *Upload an image*, the Shape tab swaps the preset -grid for a *Replace image* button so you can swap the body image without -restarting the wizard. +When you started from *Upload an image*, the Shape tab swaps the +preset grid for a *Replace image* button so you can swap the body +image without restarting the wizard. ==== Cutouts tab image::img/skin-designer/skin-designer-stage-3-editor-cutouts.png[Editor showing the Cutouts tab with a Dynamic Island row selected and the dimension fields visible,role="text-center"] -The Cutouts tab lists every cutout currently on the skin. Tap a row to -expand its width / height / offset fields; the X button on the right -removes it. The three add buttons at the bottom seed a sensible default -of each type: +The Cutouts tab lists every cutout currently on the skin. Tap a row +to expand its width / height / offset fields; the X button on the +right removes it. The three add buttons at the bottom seed a sensible +default of each type: -* *Notch* (180 × 30 viewbox px) — physical hardware cutout. Notches are - drawn in the device frame *above* the screen rect, with the bottom - edge touching the screen top. Mirrors iPhone X / 11 / 12 / 13 hardware. +* *Notch* (180 × 30 viewbox px) — physical hardware cutout. Notches + are drawn in the device frame *above* the screen rect, with the + bottom edge touching the screen top. Mirrors iPhone X / 11 / 12 / + 13 hardware. * *Island* (120 × 35) — Dynamic Island. Software-reserved space - rendered as an opaque pill *inside* the screen rect, floating on top - of the iOS status bar. + rendered as an opaque pill *inside* the screen rect, floating on + top of the iOS status bar. * *Hole* (28 × 28) — Android punch-hole camera. Rendered like the island: opaque circle inside the screen rect. -Offsets are relative to the top-center of the screen, in viewbox pixels. -For islands and holes, `Offset Y` is the gap between the cutout's top -edge and the screen top. For notches, `Offset Y` is ignored (the notch -is anchored to the frame). +Offsets are relative to the top-center of the screen, in viewbox +pixels. For islands and holes, `Offset Y` is the gap between the +cutout's top edge and the screen top. For notches, `Offset Y` is +ignored (the notch is anchored to the frame). -WARNING: When the wizard generates the `.skin` file, it automatically -extends `safePortraitTop` to cover any in-screen cutouts (islands, -holes), so app content lands below the floating shape. You don't need to -manually adjust safe area for the cutout itself; only adjust it if you -need extra padding above your title bar. +WARNING: When the wizard generates the `.skin` file, it +automatically extends `safePortraitTop` to cover any in-screen +cutouts (islands, holes), so app content lands below the floating +shape. You don't need to manually adjust safe area for the cutout +itself; only adjust it if you need extra padding above your title +bar. ==== Info tab image::img/skin-designer/skin-designer-stage-3-editor-info.png[Editor showing the Info tab with the skin name and read-only device specs,role="text-center"] -The Info tab is mostly read-only and shows what's about to be written -into `skin.properties`: +The Info tab is mostly read-only and shows what's about to be +written into `skin.properties`: * *Name* — the only editable field. Determines the saved file name (sanitised: spaces become hyphens, special characters dropped, @@ -173,9 +152,9 @@ image::img/skin-designer/skin-designer-stage-4-done.png[Done page showing the gr Clicking *Finish* in the editor's footer: -. Renders the portrait skin image (`skin.png`) at the device's actual - resolution + bezel, with rounded corners, transparent screen, opaque - cutouts, and a home indicator if enabled. +. Renders the portrait skin image (`skin.png`) at the device's + actual resolution + bezel, with rounded corners, transparent + screen, opaque cutouts, and a home indicator if enabled. . Synthesises the landscape skin (`skin_l.png`) by 90° rotation. . Writes `skin_map.png` / `skin_map_l.png` overlays that mark the screen rectangle for the simulator's screen-position detection. @@ -185,20 +164,19 @@ Clicking *Finish* in the editor's footer: `displayX/Y/Width/Height`, `safePortrait*` / `safeLandscape*`, the platform name, override names, fonts, and PPI. -Clicking *Download skin* on the done page triggers -`Display.execute(filename)`. In the JavaScript port that fires the -browser's download dialog; on the desktop simulator it opens the -file location. The button is the only reliable trigger because the -browser's user-gesture window expires during the heavy image -generation step the *Finish* click runs. +Clicking *Download skin* on the done page hands the file to the +browser's download dialog. The button is the only reliable trigger +because the browser's user-gesture window expires during the heavy +image-generation step that *Finish* runs. -After the file is on disk, drop it into your simulator's skins folder -(or use the *Add* command in the simulator's *Skins* menu) and your -new device should appear in the picker. +After the file is on disk, drop it into your simulator's skins +folder (or use the *Add* command in the simulator's *Skins* menu) +and your new device should appear in the picker. === File layout of a generated skin -A generated `.skin` is just a renamed zip. Unzip it to see the layout: +A generated `.skin` is just a renamed zip. Unzip it to see the +layout: [source,text] ---- @@ -254,30 +232,8 @@ monospaceFontFamily=SF Mono NOTE: The wizard intentionally does *not* write `smallFontSize`, `mediumFontSize`, or `largeFontSize`. When those are absent the -simulator auto-derives them from `pixelMilliRatio` (`med = round(2.6 * -ppmm)`, `sm = 2 * ppmm`, `la = 3.3 * ppmm`), which is what you want on -high-PPI screens. Writing iOS-style point values (12 / 15 / 22) into -the file used to make text render at sub-millimeter sizes on a 460 PPI -device. - -=== Refreshing the bundled device catalog - -The catalog at -`scripts/skindesigner/common/src/main/resources/devices.json` is -generated by `scripts/skindesigner/tools/devicedb/build_devices_json.py`, -which scrapes -https://www.gsmarena.com directly. To run a fresh scrape locally: - -[source,shell] ----- -python3 scripts/skindesigner/tools/devicedb/build_devices_json.py \ - --mode latest --limit 50 --delay 2.0 ----- - -The default `latest` mode walks the *latest mobiles* listing on GSMArena, -which is fast (one page, ~50 devices). For a full catalog rebuild use -`--mode brands --max-pages 12` — that walks all the curated brand -listings and takes 30–60 minutes. The -`.github/workflows/skin-designer-devices-update.yml` workflow runs the -`latest` scrape every 6 hours on master and opens an automated PR if -`devices.json` drifted. +simulator auto-derives them from `pixelMilliRatio` (`med = round(2.6 +* ppmm)`, `sm = 2 * ppmm`, `la = 3.3 * ppmm`), which is what you +want on high-PPI screens. Writing iOS-style point values (12 / 15 / +22) into the file used to make text render at sub-millimeter sizes +on a 460 PPI device. diff --git a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/screenshots/ScreenshotApp.java b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/screenshots/ScreenshotApp.java index 0abe376a18..13621369ae 100644 --- a/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/screenshots/ScreenshotApp.java +++ b/scripts/skindesigner/common/src/main/java/com/codename1/tools/skindesigner/screenshots/ScreenshotApp.java @@ -53,11 +53,11 @@ public class ScreenshotApp { "wiz.step", "wiz.deviceId", "wiz.source", "wiz.hasImage", }; - /** Render dimensions. iPhone 16 Pro point size — wide enough that the - * wizard's two-column editor layout matches what a user sees on a - * phone-class viewport. */ - private static final int WIDTH = 390; - private static final int HEIGHT = 844; + /** Render dimensions. Desktop-class viewport so the editor's + * two-column layout (preview + sidebar) renders at full width, + * matching what a website visitor sees on the hosted tool. */ + private static final int WIDTH = 1280; + private static final int HEIGHT = 800; public static void main(String[] args) throws Exception { File outDir = resolveOutDir(args); From c99996cb3d4d79a0a221a6a864105c89bc85ae60 Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Mon, 4 May 2026 04:04:11 +0300 Subject: [PATCH 55/55] Simulator Skins menu: hoist Add Skin + Skin Designer to top level MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Skins menu now leads with the two actions a user actually reaches for: - "Add Skin" — file picker for a .skin (renamed from "Add New...") - "Skin Designer" — opens https://www.codenameone.com/skindesigner/ in the user's default browser, replacing the bundled gallery flow as the way to build a new skin Everything else from the previous Skins menu — the radio-button list of bundled skins, Desktop.skin, UWP Desktop.skin, the "More..." Cloudflare gallery, and "Reset Skins" — moves under a "Legacy Skins" submenu. The gallery downloader's refresh callback now repopulates that submenu instead of rebuilding the whole menu. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../com/codename1/impl/javase/JavaSEPort.java | 114 +++++++++++------- 1 file changed, 70 insertions(+), 44 deletions(-) diff --git a/Ports/JavaSE/src/com/codename1/impl/javase/JavaSEPort.java b/Ports/JavaSE/src/com/codename1/impl/javase/JavaSEPort.java index 8c9647541e..4452f5866b 100644 --- a/Ports/JavaSE/src/com/codename1/impl/javase/JavaSEPort.java +++ b/Ports/JavaSE/src/com/codename1/impl/javase/JavaSEPort.java @@ -4858,6 +4858,74 @@ private JMenu createSkinsMenu(final JFrame frm, final JMenu menu) throws Malform m.removeAll(); } final JMenu skinMenu = m; + + // Top-level: file picker for a user-supplied .skin + JMenuItem addSkin = new JMenuItem("Add Skin"); + addSkin.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent ae) { + FileDialog picker = new FileDialog(frm, "Add Skin"); + picker.setMode(FileDialog.LOAD); + picker.setFilenameFilter(new FilenameFilter() { + public boolean accept(File file, String string) { + return string.endsWith(".skin"); + } + }); + picker.setModal(true); + picker.setVisible(true); + String file = picker.getFile(); + if (file != null) { + if (netMonitor != null) { + netMonitor.dispose(); + netMonitor = null; + } + if (perfMonitor != null) { + perfMonitor.dispose(); + perfMonitor = null; + } + String mainClass = System.getProperty("MainClass"); + if (mainClass != null) { + Preferences p = Preferences.userNodeForPackage(JavaSEPort.class); + p.put("skin", picker.getDirectory() + File.separator + file); + deinitializeSync(); + frm.dispose(); + System.setProperty("reload.simulator", "true"); + } else { + loadSkinFile(picker.getDirectory() + File.separator + file, frm); + refreshSkin(frm); + } + } + } + }); + skinMenu.add(addSkin); + + // Top-level: hand off to the hosted Skin Designer for building + // a new skin from scratch. Replaces the bundled gallery; the + // pre-built skins all live behind the "Legacy Skins" submenu. + JMenuItem designerItem = new JMenuItem("Skin Designer"); + designerItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent ae) { + try { + Desktop.getDesktop().browse(new URI("https://www.codenameone.com/skindesigner/")); + } catch (Exception err) { + Logger.getLogger(JavaSEPort.class.getName()).log(Level.WARNING, + "Could not open Skin Designer in browser", err); + } + } + }); + skinMenu.add(designerItem); + + skinMenu.addSeparator(); + + final JMenu legacyMenu = new JMenu("Legacy Skins"); + legacyMenu.setDoubleBuffered(true); + skinMenu.add(legacyMenu); + populateLegacySkinsMenu(frm, legacyMenu); + return skinMenu; + } + + private void populateLegacySkinsMenu(final JFrame frm, final JMenu legacyMenu) throws MalformedURLException { + legacyMenu.removeAll(); + final JMenu skinMenu = legacyMenu; Preferences pref = Preferences.userNodeForPackage(JavaSEPort.class); String skinNames = pref.get("skins", DEFAULT_SKINS); if (skinNames != null) { @@ -5173,7 +5241,7 @@ public void run() { downloadMessage.setVisible(false); d.setVisible(false); try { - createSkinsMenu(frm, skinMenu); + populateLegacySkinsMenu(frm, skinMenu); } catch (MalformedURLException ex) { Logger.getLogger(JavaSEPort.class.getName()).log(Level.SEVERE, null, ex); } @@ -5200,47 +5268,6 @@ public void run() { } }); - skinMenu.addSeparator(); - JMenuItem addSkin = new JMenuItem("Add New..."); - skinMenu.add(addSkin); - addSkin.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent ae) { - FileDialog picker = new FileDialog(frm, "Add Skin"); - picker.setMode(FileDialog.LOAD); - picker.setFilenameFilter(new FilenameFilter() { - - public boolean accept(File file, String string) { - return string.endsWith(".skin"); - } - }); - picker.setModal(true); - picker.setVisible(true); - String file = picker.getFile(); - if (file != null) { - if (netMonitor != null) { - netMonitor.dispose(); - netMonitor = null; - } - if (perfMonitor != null) { - perfMonitor.dispose(); - perfMonitor = null; - } - String mainClass = System.getProperty("MainClass"); - if (mainClass != null) { - Preferences pref = Preferences.userNodeForPackage(JavaSEPort.class); - pref.put("skin", picker.getDirectory() + File.separator + file); - deinitializeSync(); - frm.dispose(); - System.setProperty("reload.simulator", "true"); - } else { - loadSkinFile(picker.getDirectory() + File.separator + file, frm); - refreshSkin(frm); - } - } - } - }); - skinMenu.addSeparator(); JMenuItem reset = new JMenuItem("Reset Skins"); skinMenu.add(reset); @@ -5285,10 +5312,9 @@ public void actionPerformed(ActionEvent ae) { } } - + } }); - return skinMenu; } InputStream openSkinsURL() throws IOException {