// SPDX-FileCopyrightText: 2021 Devin Lin // SPDX-License-Identifier: GPL-2.0-or-later import QtQuick import QtQuick.Layouts 1.2 import QtQuick.Controls 2.12 as Controls import org.kde.kirigami 2.19 as Kirigami import org.kde.kcmutils import org.kde.kirigamiaddons.formcard 1.0 as FormCard import cellularnetworkkcm 1.0 FormCard.FormCardPage { id: root property Sim sim title: i18n("SIM Lock") MessagesList { Layout.fillWidth: true Layout.margins: Kirigami.Units.gridUnit model: kcm.messages } ColumnLayout { id: unlockSimPlaceholder visible: sim.locked // HACK: prevent infinite binding loop? Component.onCompleted: unlockSimPlaceholder.Layout.preferredHeight = root.height Kirigami.PlaceholderMessage { Layout.margins: Kirigami.Units.gridUnit * 2 Layout.fillWidth: true Layout.fillHeight: true text: i18n("SIM is locked") explanation: i18n("In order to use this SIM, you must first unlock it.") icon.name: "lock" helpfulAction: Kirigami.Action { icon.name: "unlock" text: "Unlock SIM" onTriggered: unlockPinDialog.open() // TODO replace custom unlock pin dialog with just opening the system unlock PIN dialog } } } ColumnLayout { id: notLockedSimPlaceholder visible: !sim.pinEnabled && !unlockSimPlaceholder.visible Layout.fillWidth: true // HACK: prevent infinite binding loop? Component.onCompleted: notLockedSimPlaceholder.Layout.preferredHeight = root.height Kirigami.PlaceholderMessage { Layout.margins: Kirigami.Units.gridUnit * 2 Layout.fillWidth: true Layout.fillHeight: true text: i18n("SIM is not locked") explanation: i18n("You can lock your SIM to require a set PIN code for phone calls and mobile data.") icon.name: "unlock" helpfulAction: Kirigami.Action { icon.name: "lock" text: i18n("Lock SIM") onTriggered: createPinDialog.open() } } } FormCard.FormCard { visible: !notLockedSimPlaceholder.visible && !unlockSimPlaceholder.visible Layout.fillWidth: true FormCard.FormButtonDelegate { id: disableSimLockButton text: i18n("Disable SIM Lock") description: i18n("Disable the SIM lock feature and remove the passcode on the SIM.") onClicked: removePinDialog.open(); } Kirigami.Separator { Layout.leftMargin: Kirigami.Units.largeSpacing Layout.rightMargin: Kirigami.Units.largeSpacing opacity: (!disableSimLockButton.controlHovered && !changePinButton.controlHovered) ? 0.5 : 0 } FormCard.FormButtonDelegate { id: changePinButton text: i18n("Change PIN") description: i18n("Change the passcode set on the SIM.") onClicked: changePinDialog.open() } } data: [ RegularExpressionValidator { id: pinValidator regularExpression: /[0-9]+/ }, // dialogs Kirigami.Dialog { id: unlockPinDialog title: i18n("Unlock SIM") standardButtons: Controls.Dialog.Ok | Controls.Dialog.Cancel padding: Kirigami.Units.largeSpacing onAccepted: sim.sendPin(unlockPinCurPin.text) ColumnLayout { Controls.Label { text: i18n("Attempts left: %1", sim.unlockRetriesLeft) } Kirigami.PasswordField { id: unlockPinCurPin placeholderText: i18n("Enter PIN") validator: pinValidator } } }, Kirigami.Dialog { id: changePinDialog title: i18n("Change SIM PIN") standardButtons: isValid ? Controls.Dialog.Ok | Controls.Dialog.Cancel : Controls.Dialog.Cancel padding: Kirigami.Units.largeSpacing property bool isValid: changePinNewPin.text == changePinConfirmPin.text && changePinNewPin.text.length >= 4 && changePinNewPin.text.length <= 8 // SIM PINs are between 4-8 digits onAccepted: { if (isValid) { sim.changePin(changePinCurPin.text, changePinNewPin.text); } } ColumnLayout { spacing: Kirigami.Units.smallSpacing Kirigami.InlineMessage { id: changePinMatch Layout.fillWidth: true visible: changePinNewPin.text != changePinConfirmPin.text text: i18n("PINs don't match!") type: Kirigami.MessageType.Error } Kirigami.InlineMessage { Layout.fillWidth: true visible: !changePinMatch.visible && changePinNewPin.text.length != 0 && (changePinNewPin.text.length < 4 || changePinNewPin.text.length > 8) text: i18n("PINs must be between 4 and 8 digits!") type: Kirigami.MessageType.Error } Kirigami.PasswordField { id: changePinCurPin placeholderText: i18n("Current PIN") validator: pinValidator } Kirigami.PasswordField { id: changePinNewPin placeholderText: i18n("New PIN") validator: pinValidator } Kirigami.PasswordField { id: changePinConfirmPin placeholderText: i18n("Confirm PIN") validator: pinValidator } } }, Kirigami.Dialog { id: removePinDialog title: i18n("Remove SIM PIN") standardButtons: Controls.Dialog.Ok | Controls.Dialog.Cancel padding: Kirigami.Units.largeSpacing onAccepted: sim.togglePinEnabled(removePinCurPin.text); ColumnLayout { Kirigami.PasswordField { id: removePinCurPin placeholderText: i18n("Current PIN") validator: pinValidator } } }, Kirigami.Dialog { id: createPinDialog title: i18n("Add SIM PIN") standardButtons: isValid ? Controls.Dialog.Ok | Controls.Dialog.Cancel : Controls.Dialog.Cancel padding: Kirigami.Units.largeSpacing property bool isValid: createPinNewPin.text == createPinConfirmPin.text && createPinNewPin.text.length >= 4 && createPinNewPin.text.length <= 8 // SIM PINs are between 4-8 digits onAccepted: { if (isValid) { sim.togglePinEnabled(createPinNewPin.text); } } ColumnLayout { spacing: Kirigami.Units.smallSpacing Kirigami.InlineMessage { id: createPinMatch Layout.fillWidth: true visible: createPinNewPin.text != createPinConfirmPin.text text: i18n("PINs don't match!") type: Kirigami.MessageType.Error } Kirigami.InlineMessage { Layout.fillWidth: true visible: !createPinMatch.visible && createPinNewPin.text.length != 0 && (createPinNewPin.text.length < 4 || createPinNewPin.text.length > 8) text: i18n("PINs must be between 4 and 8 digits!") type: Kirigami.MessageType.Error } Kirigami.PasswordField { id: createPinNewPin placeholderText: i18n("New PIN") validator: pinValidator } Kirigami.PasswordField { id: createPinConfirmPin placeholderText: i18n("Confirm PIN") validator: pinValidator } } } ] }