-
Password is active
-
-
-
-
+
+
+
+
+ Password is active
+
+
+
+
+
+
+
+
+
+
+
@@ -2042,20 +2150,18 @@
auto_scan: 'بررسی خودکار ریزالورها (هر ساعت)',
scanner_clear_targets: '\uD83D\uDDD1 پاک کردن',
app_customization: 'شخصی\u200cسازی برنامه',
- app_name_label: 'نام برنامه',
- app_icon_label: 'آیکون برنامه',
- app_apply: 'اعمال',
- app_reset: 'بازنشانی',
- app_identity_applied: 'نام و آیکون برنامه تغییر کرد!',
- app_identity_failed: 'خطا در تغییر آیکون',
- app_identity_name_only: 'نام برنامه ذخیره شد!',
- app_reset_done: 'بازنشانی شد!',
+ app_preset_hint: 'نام نمایشی برنامه را انتخاب کنید (در صفحه قفل نمایش داده میشود)',
+ app_name_saved: 'نام برنامه ذخیره شد!',
app_password: 'رمز عبور برنامه',
password_new_ph: 'رمز عبور جدید',
password_confirm_ph: 'تکرار رمز عبور',
password_current_ph: 'رمز عبور فعلی',
password_set: 'تنظیم رمز',
+ password_change_remove: 'تغییر / حذف',
+ password_change: 'تغییر رمز',
password_remove: 'حذف رمز',
+ password_remove_confirm: 'آیا مطمئن هستید که میخواهید رمز عبور را حذف کنید؟',
+ password_enter_new: 'رمز عبور جدید را وارد کنید',
password_active: 'رمز عبور فعال است',
password_set_ok: 'رمز عبور تنظیم شد!',
password_removed: 'رمز عبور حذف شد!',
@@ -2195,20 +2301,19 @@
auto_scan: 'Automatic hourly resolver check',
scanner_clear_targets: '\uD83D\uDDD1 Clear',
app_customization: 'App Customization',
- app_name_label: 'App Name',
- app_icon_label: 'App Icon',
- app_apply: 'Apply',
- app_reset: 'Reset',
- app_identity_applied: 'App icon and name changed!',
- app_identity_failed: 'Failed to change app icon',
- app_identity_name_only: 'App name saved!',
- app_reset_done: 'Reset done!',
+ experimental: 'Experimental',
+ app_preset_hint: 'Choose a display name for the app (shown on lock screen)',
+ app_name_saved: 'App name saved!',
app_password: 'App Password',
password_new_ph: 'New password',
password_confirm_ph: 'Confirm password',
password_current_ph: 'Current password',
password_set: 'Set Password',
- password_remove: 'Remove Password',
+ password_change_remove: 'Change / Remove',
+ password_change: 'Change',
+ password_remove: 'Remove',
+ password_remove_confirm: 'Are you sure you want to remove the password?',
+ password_enter_new: 'Enter your new password',
password_active: 'Password is active',
password_set_ok: 'Password set!',
password_removed: 'Password removed!',
@@ -2433,74 +2538,81 @@
}
// ===== ANDROID SETTINGS =====
+ var _presetIcons = {
+ weather: '
',
+ calculator: '
',
+ calendar: '
',
+ notes: '
',
+ clock: '
',
+ camera: '
',
+ compass: '
',
+ gallery: '
',
+ recorder: '
',
+ };
+ var _presetNames = [
+ { key: 'thefeed', en: 'thefeed', fa: 'thefeed', icon: '' },
+ { key: 'weather', en: 'Weather', fa: 'آب و هوا', icon: 'weather' },
+ { key: 'calculator', en: 'Calculator', fa: 'ماشینحساب', icon: 'calculator' },
+ { key: 'calendar', en: 'Calendar', fa: 'تقویم', icon: 'calendar' },
+ { key: 'notes', en: 'Notes', fa: 'یادداشت', icon: 'notes' },
+ { key: 'clock', en: 'Clock', fa: 'ساعت', icon: 'clock' },
+ { key: 'camera', en: 'Camera', fa: 'دوربین', icon: 'camera' },
+ { key: 'compass', en: 'Compass', fa: 'قطبنما', icon: 'compass' },
+ { key: 'gallery', en: 'Gallery', fa: 'گالری', icon: 'gallery' },
+ { key: 'recorder', en: 'Recorder', fa: 'ضبط صدا', icon: 'recorder' },
+ ];
+
function initAndroidSettings() {
if (typeof Android === 'undefined') return;
- // Show Android-only sections
document.getElementById('androidAppSection').style.display = '';
document.getElementById('androidPasswordSection').style.display = '';
- // Populate current custom name
- try {
- var name = Android.getCustomAppName();
- if (name) document.getElementById('customAppName').value = name;
- } catch (e) { }
+ // Build preset name grid
+ var grid = document.getElementById('presetNameGrid');
+ var current = '';
+ try { current = Android.getPresetName(); } catch (e) { }
+ grid.innerHTML = '';
+ _presetNames.forEach(function (p) {
+ var btn = document.createElement('button');
+ btn.className = 'preset-btn' + (current === p.key ? ' active-preset' : '');
+ var iconHtml = p.icon && _presetIcons[p.icon] ? _presetIcons[p.icon] : '
';
+ btn.innerHTML = iconHtml + '
' + (currentLang === 'fa' ? p.fa : p.en) + '';
+ btn.onclick = function () { selectPresetName(p.key); };
+ grid.appendChild(btn);
+ });
// Show correct password section
try {
var hasPw = Android.hasPassword();
document.getElementById('passwordSetSection').style.display = hasPw ? 'none' : '';
document.getElementById('passwordRemoveSection').style.display = hasPw ? '' : 'none';
+ if (!hasPw) document.getElementById('passwordRemovePrompt').style.display = 'none';
} catch (e) { }
}
- var _customIconData = null;
- (function () {
- // Listen for icon file selection
- document.addEventListener('DOMContentLoaded', function () {
- var inp = document.getElementById('customIconInput');
- if (!inp) return;
- inp.addEventListener('change', function () {
- var file = this.files && this.files[0];
- if (!file) return;
- var reader = new FileReader();
- reader.onload = function (e) {
- _customIconData = e.target.result;
- var preview = document.getElementById('customIconPreview');
- preview.src = _customIconData;
- preview.style.display = '';
- };
- reader.readAsDataURL(file);
- });
- });
- })();
-
- function applyAppCustomization() {
- if (typeof Android === 'undefined') return;
- var name = document.getElementById('customAppName').value.trim() || 'thefeed';
- if (_customIconData) {
- try {
- var ok = Android.setAppIdentity(name, _customIconData);
- showToast(ok ? t('app_identity_applied') : t('app_identity_failed'));
- } catch (e) { showToast(t('app_identity_failed')) }
- } else {
- // Name-only change (no custom icon)
- try {
- Android.setAppIdentity(name, '');
- } catch (e) { }
- showToast(t('app_identity_name_only'));
- }
- }
-
- function resetAppCustomization() {
+ function selectPresetName(key) {
if (typeof Android === 'undefined') return;
try {
- Android.resetAppIdentity();
- document.getElementById('customAppName').value = '';
- document.getElementById('customIconPreview').style.display = 'none';
- document.getElementById('customIconInput').value = '';
- _customIconData = null;
- showToast(t('app_reset_done'));
+ Android.setPresetName(key === 'thefeed' ? '' : key);
+ var btns = document.querySelectorAll('.preset-btn');
+ var idx = _presetNames.findIndex(function (p) { return p.key === key; });
+ btns.forEach(function (b, i) {
+ b.classList.toggle('active-preset', i === idx);
+ });
+ var preset = _presetNames[idx];
+ var displayName = preset ? (currentLang === 'fa' ? preset.fa : preset.en) : key;
+ showToast(t('app_name_saved') + ' — ' + displayName);
} catch (e) { }
}
+ function showPasswordRemovePrompt() {
+ document.getElementById('passwordRemovePrompt').style.display = '';
+ document.getElementById('appPasswordCurrent').value = '';
+ document.getElementById('passwordRemoveError').style.display = 'none';
+ }
+
+ function hidePasswordRemovePrompt() {
+ document.getElementById('passwordRemovePrompt').style.display = 'none';
+ }
+
function setAppPassword() {
if (typeof Android === 'undefined') return;
var pw = document.getElementById('appPasswordInput').value;
@@ -2527,6 +2639,7 @@
var errEl = document.getElementById('passwordRemoveError');
errEl.style.display = 'none';
if (!pw) { errEl.textContent = t('password_empty'); errEl.style.display = ''; return }
+ if (!confirm(t('password_remove_confirm'))) return;
try {
var ok = Android.removePassword(pw);
if (ok) {
@@ -2534,6 +2647,7 @@
document.getElementById('appPasswordCurrent').value = '';
document.getElementById('passwordSetSection').style.display = '';
document.getElementById('passwordRemoveSection').style.display = 'none';
+ document.getElementById('passwordRemovePrompt').style.display = 'none';
} else {
errEl.textContent = t('password_wrong');
errEl.style.display = '';
@@ -2541,6 +2655,29 @@
} catch (e) { }
}
+ function changeAppPassword() {
+ if (typeof Android === 'undefined') return;
+ var pw = document.getElementById('appPasswordCurrent').value;
+ var errEl = document.getElementById('passwordRemoveError');
+ errEl.style.display = 'none';
+ if (!pw) { errEl.textContent = t('password_empty'); errEl.style.display = ''; return }
+ try {
+ var ok = Android.checkPassword(pw);
+ if (!ok) {
+ errEl.textContent = t('password_wrong');
+ errEl.style.display = '';
+ return;
+ }
+ // Remove old and show set section for new password
+ Android.removePassword(pw);
+ document.getElementById('appPasswordCurrent').value = '';
+ document.getElementById('passwordRemoveSection').style.display = 'none';
+ document.getElementById('passwordRemovePrompt').style.display = 'none';
+ document.getElementById('passwordSetSection').style.display = '';
+ showToast(t('password_enter_new'));
+ } catch (e) { }
+ }
+
async function checkLatestVersion() {
var btn = document.getElementById('checkVersionBtn');
var prevText = btn ? btn.textContent : '';
@@ -4215,6 +4352,27 @@
});
})();
+ // Close modals (bottom sheets) when clicking outside
+ (function () {
+ var modalMap = {
+ settingsModal: function () { closeSettings() },
+ profilesModal: function () { closeProfiles() },
+ profileEditorModal: function () { closeProfileEditor && closeProfileEditor() },
+ exportModal: function () { closeExportModal() },
+ resolversModal: function () { closeResolversModal() },
+ scannerModal: function () { closeScanner() },
+ savedResolversModal: function () { savedResolversSkip && savedResolversSkip() },
+ };
+ document.addEventListener('click', function (e) {
+ var overlay = e.target;
+ if (!overlay.classList.contains('modal-overlay') || !overlay.classList.contains('active')) return;
+ // Only close if user clicked directly on the overlay backdrop, not the modal content
+ if (e.target !== overlay) return;
+ var fn = modalMap[overlay.id];
+ if (fn) fn();
+ });
+ })();
+
init();