בהמשך לנושא זה האתר עלה.
כתובת האתר - https://mahaneh-iedidim.github.io/site
אשמח להערות והארות.
@מישהו12 הפרסומת בסדר? 
בהמשך לנושא זה האתר עלה.
כתובת האתר - https://mahaneh-iedidim.github.io/site
אשמח להערות והארות.
@מישהו12 הפרסומת בסדר? 
אז למי שלא ידע, קלוד יודע ליצור אפליקציות...
ㅤ
לאחר מכן יפתח לכם המסך הראשי:

אנחנו נבנה את האפליקציה בקוטלין.
אלו הקבצים שצריך לצרף:
קומפיילר קוטלין - בדרייב
נצרף את הקבצים בלחיצה על כפתור ההוספה 
עכשיו קלוד יעבוד, יתכן ויגמר הטוקנים באמצע - המתינו כמה שעות שיתמלא שוב ושלחו לו "Go on".
בסוף הוא ייצא לכם קובץ APK חתום + קוד המקור בזיפ.
ㅤ
קלוד (באפליקציה ובאתר) יכול ליצור אפליקציות שלמות ואפילו לחתום אותן!
הצלחתי ליצור איתו עכשיו לאנצ'ר בסגנון C2.
עובד גם בחינמי! נסו והיווכחו
הכנסו באפליקציית ההגדרות דרך מנהל MT לres/xml/app_and_notification.xml
והוסיפו את השורה הזו:
<Preference
android:title="התרעות חירום אלחוטיות"
android:key="my_custom_emergency_alerts_key"
android:summary="ניהול התראות במצבי חירום, איומים ובדיקות מערכת"
android:order="15">
<intent
android:targetPackage="****"
android:action="****"
android:targetClass="****" />
</Preference>
החליפו את הכוכביות הראשונות בשם החבילה ואת השניות והשלישיות באקטיביטי של התפריט
בדרך כלל שם החבילה הוא:
com.mediatek.cellbroadcastreceiver.module
והאקטיביטי:
com.mediatek.cellbroadcastreceiver.module.CellBroadcastSettings
ㅤ
ㅤ
אם תרצו שבאנגלית השורה תהיה באנגלית תצטרכו להוסיף סטרינג.
הכנסו בMT לקובץ resources.arsc בעורך arsc. לחצו על השורה התחתונה, הכנסו לstring ושוב לstring. לחצו בתפריט הצדדי על "הוסף" והדביקו שם:
emergency_alerts_title
זכרו את מזהה הכניסה.
לחצו על הסטרינג, בשורה "תוכן" הכניסו Wireless emergency Alerts.
צאו מstring, הכנסו לstring-iw ולחצו שוב על "הוסף". הכניסו את מזהה הכניסה של הסטרינג הקודם - והשם יהפך אוטומטית לemergency_alerts_title.
לחצו על הסטרינג, בשורה "תוכן" הכניסו התרעות חירום אלחוטיות.
אותו הדבר לסטרינג הsummary. רק שלו קוראים
emergency_alerts_summary
והתוכן הוא ניהול התראות במצבי חירום, איומים ובדיקות מערכת
ובאנגלית Emergency alerts management
עכשיו שימו במקום הטקסט הקודם את זה:
<Preference
android:title="@string/emergency_alerts_title"
android:key="my_custom_emergency_alerts_key"
android:summary="@string/emergency_alerts_summary"
android:order="15">
<intent
android:targetPackage="****"
android:action="****"
android:targetClass="****" />
</Preference>
// ==UserScript==
// @name Mitmachim Forum Ultimate Enhancements
// @namespace http://tampermonkey.net/
// @version 4.9
// @description החזרת מנגנון ההזרקה המדויק של גרסה 3.4, שילוב צ'אט אוטומטי ותצוגה מקדימה
// @author ישראל מאיר שגיב & Gemini
// @match https://mitmachim.top/*
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_xmlhttpRequest
// @connect mitmachim.top
// @connect otzaria.org
// @unsafeWindow
// @run-at document-end
// ==/UserScript==
(function() {
'use strict';
function getForumBaseUrl() {
const relativePath = (unsafeWindow.config && unsafeWindow.config.relative_path) || '';
return window.location.origin + relativePath;
}
// ==========================================
// חלק א': יצירת הפופאפ המשותף
// ==========================================
const sharedPopup = document.createElement('div');
Object.assign(sharedPopup.style, {
position: 'fixed',
backgroundColor: '#ffffff',
border: '1px solid #e2e8f0',
borderRadius: '12px',
padding: '16px',
boxShadow: '0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)',
zIndex: '10005',
display: 'none',
width: '420px',
maxHeight: '450px',
overflowY: 'auto',
fontSize: '14px',
direction: 'rtl',
lineHeight: '1.6',
color: '#1e293b',
fontFamily: 'system-ui, -apple-system, sans-serif'
});
document.body.appendChild(sharedPopup);
sharedPopup.addEventListener('click', (e) => e.stopPropagation());
document.addEventListener('click', () => { sharedPopup.style.display = 'none'; });
function positionPopup(anchorElement) {
const rect = anchorElement.getBoundingClientRect();
sharedPopup.style.left = `${rect.right + 15}px`;
sharedPopup.style.top = `${Math.min(rect.top, window.innerHeight - 460)}px`;
sharedPopup.style.display = 'block';
}
// --- פופאפ לקריאה בהמשך (פוסטים) ---
function openReadLaterPopup(anchorElement) {
positionPopup(anchorElement);
const savedList = GM_getValue('saved_to_read_data', []);
if (savedList.length === 0) {
sharedPopup.innerHTML = '<div style="text-align:center; padding:20px; color:#64748b;">אין פוסטים שמורים לקריאה בהמשך.</div>';
return;
}
sharedPopup.innerHTML = `<h4 style="margin: 0 0 12px 0; font-size: 16px; font-weight: bold; border-bottom: 1px solid #e2e8f0; padding-bottom: 8px; color: #0f172a;">רשימת קריאה בהמשך (${savedList.length})</h4><div id="popup-items-container"></div>`;
const container = sharedPopup.querySelector('#popup-items-container');
savedList.forEach(item => {
const itemWrapper = document.createElement('div');
itemWrapper.style.cssText = 'padding: 10px; border-bottom: 1px solid #f1f5f9; margin-bottom: 8px; background: #f8fafc; border-radius: 6px; position: relative;';
const fullUrl = `${getForumBaseUrl()}/post/${item.pid}`;
itemWrapper.innerHTML = `
<div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:4px;">
<a href="${fullUrl}" target="_blank" style="font-weight:600; color:#2563eb; text-decoration:none; font-size:13px; max-width:80%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;">${item.title}</a>
<button class="delete-saved-btn" style="background:none; border:none; color:#ef4444; cursor:pointer; padding:2px 6px; font-size:12px;"><i class="fa fa-trash"></i></button>
</div>
<div style="font-size:11px; color:#64748b; margin-bottom:4px;">נכתב על ידי: <strong>${item.author}</strong></div>
<div style="font-size:12px; color:#334155; background:#ffffff; padding:6px; border-radius:4px; border:1px solid #e2e8f0; max-height:60px; overflow:hidden;">${item.snippet}</div>
`;
itemWrapper.querySelector('.delete-saved-btn').addEventListener('click', (e) => {
e.preventDefault(); e.stopPropagation();
let currentList = GM_getValue('saved_to_read_data', []);
currentList = currentList.filter(x => x.pid !== item.pid);
GM_setValue('saved_to_read_data', currentList);
itemWrapper.remove();
updateBadgesAndCounters();
if (currentList.length === 0) sharedPopup.innerHTML = '<div style="text-align:center; padding:20px; color:#64748b;">אין פוסטים שמורים לקריאה בהמשך.</div>';
});
container.appendChild(itemWrapper);
});
}
// --- פופאפ סימניות שלי (נושאים) ---
function openBookmarksPopup(anchorElement) {
positionPopup(anchorElement);
const savedTopics = GM_getValue('saved_topics_data', []);
if (savedTopics.length === 0) {
sharedPopup.innerHTML = '<div style="text-align:center; padding:20px; color:#64748b;">אין נושאים שמורים בסימניות.</div>';
return;
}
sharedPopup.innerHTML = `<h4 style="margin: 0 0 12px 0; font-size: 16px; font-weight: bold; border-bottom: 1px solid #e2e8f0; padding-bottom: 8px; color: #0f172a;">הסימניות שלי - נושאים (${savedTopics.length})</h4><div id="popup-topics-container"></div>`;
const container = sharedPopup.querySelector('#popup-topics-container');
savedTopics.forEach(item => {
const itemWrapper = document.createElement('div');
itemWrapper.style.cssText = 'padding: 10px; border-bottom: 1px solid #f1f5f9; margin-bottom: 8px; background: #f8fafc; border-radius: 6px; position: relative;';
const fullUrl = `${getForumBaseUrl()}/topic/${item.tid}`;
itemWrapper.innerHTML = `
<div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:4px;">
<a href="${fullUrl}" target="_blank" style="font-weight:600; color:#0284c7; text-decoration:none; font-size:13px; max-width:80%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;"><i class="fa fa-folder-open-o"></i> ${item.title}</a>
<button class="delete-topic-btn" style="background:none; border:none; color:#ef4444; cursor:pointer; padding:2px 6px; font-size:12px;"><i class="fa fa-trash"></i></button>
</div>
<div style="font-size:12px; color:#334155; background:#ffffff; padding:6px; border-radius:4px; border:1px solid #e2e8f0; max-height:60px; overflow:hidden;">${item.snippet}</div>
`;
itemWrapper.querySelector('.delete-topic-btn').addEventListener('click', (e) => {
e.preventDefault(); e.stopPropagation();
let currentTopics = GM_getValue('saved_topics_data', []);
currentTopics = currentTopics.filter(x => x.tid !== item.tid);
GM_setValue('saved_topics_data', currentTopics);
itemWrapper.remove();
updateBadgesAndCounters();
if (currentTopics.length === 0) sharedPopup.innerHTML = '<div style="text-align:center; padding:20px; color:#64748b;">אין נושאים שמורים בסימניות.</div>';
});
container.appendChild(itemWrapper);
});
}
// ==========================================
// חלק ב': עדכון בועות מספרים (Badges) דינמי
// ==========================================
function updateBadgesAndCounters() {
const readLaterCount = GM_getValue('saved_to_read_data', []).length;
const bookmarksCount = GM_getValue('saved_topics_data', []).length;
const rlBadge = document.getElementById('rl-count-badge');
if (rlBadge) {
rlBadge.textContent = readLaterCount;
rlBadge.style.display = readLaterCount > 0 ? 'inline-block' : 'none';
}
const bmBadge = document.getElementById('bm-count-badge');
if (bmBadge) {
bmBadge.textContent = bookmarksCount;
bmBadge.style.display = bookmarksCount > 0 ? 'inline-block' : 'none';
}
}
// ==========================================
// חלק ג': שילוב מושלם וחסין בסרגל השמאלי (מגרסה 3.4)
// ==========================================
function integrateIntoLeftSidebar() {
const lists = document.querySelectorAll('#main-nav, .sidebar-nav, [component^="sidebar/"] ul, .nav-list, #menu, #user-control-list');
let leftSidebarNav = null;
lists.forEach(el => {
const rect = el.getBoundingClientRect();
if (rect.width > 0 && rect.left < window.innerWidth / 2) {
leftSidebarNav = el;
}
});
if (!leftSidebarNav) return;
if (!document.getElementById('custom-sidebar-styles')) {
const style = document.createElement('style');
style.id = 'custom-sidebar-styles';
style.innerHTML = `
.custom-sidebar-item .nav-text {
display: none;
margin-right: 10px;
}
html.sidebar-left-open .custom-sidebar-item .nav-text,
body.sidebar-left-open .custom-sidebar-item .nav-text,
.sidebar-open .custom-sidebar-item .nav-text,
.open .custom-sidebar-item .nav-text,
#sidebar-left.open .custom-sidebar-item .nav-text {
display: inline-block !important;
}
.custom-badge {
position: absolute;
top: 2px;
left: 5px;
background-color: #ef4444;
color: white;
font-size: 10px;
font-weight: bold;
padding: 2px 6px;
border-radius: 10px;
min-width: 18px;
text-align: center;
line-height: 1;
box-shadow: 0 1px 3px rgba(0,0,0,0.2);
}
.custom-sidebar-item a {
position: relative;
}
`;
document.head.appendChild(style);
}
if (!document.getElementById('integrated-to-read-li')) {
const li = document.createElement('li');
li.id = 'integrated-to-read-li';
li.className = 'nav-item custom-sidebar-item';
li.innerHTML = `
<a class="nav-link" href="#" title="לקריאה בהמשך" style="cursor:pointer; display:flex; align-items:center; padding: 10px 15px;">
<i class="fa fa-fw fa-list-alt"></i>
<span class="nav-text">לקריאה בהמשך</span>
<span id="rl-count-badge" class="custom-badge unread-count badge" style="display:none;">0</span>
</a>
`;
li.querySelector('a').addEventListener('click', (e) => {
e.preventDefault(); e.stopPropagation();
openReadLaterPopup(li);
}, true);
leftSidebarNav.appendChild(li);
}
if (!document.getElementById('integrated-bookmarks-li')) {
const li = document.createElement('li');
li.id = 'integrated-bookmarks-li';
li.className = 'nav-item custom-sidebar-item';
li.innerHTML = `
<a class="nav-link" href="#" title="הסימניות שלי" style="display:flex; align-items:center; padding: 10px 15px;">
<i class="fa fa-fw fa-bookmark"></i>
<span class="nav-text">הסימניות שלי</span>
<span id="bm-count-badge" class="custom-badge unread-count badge" style="display:none;">0</span>
</a>
`;
li.querySelector('a').addEventListener('click', (e) => {
e.preventDefault(); e.stopPropagation();
openBookmarksPopup(li);
}, true);
leftSidebarNav.appendChild(li);
}
updateBadgesAndCounters();
}
// ==========================================
// חלק ד': הזרקת כפתור סימנייה לסרגל הכלים הראשי של הנושא
// ==========================================
function enhanceTopicHeaderTools() {
if (document.getElementById('top-bar-save-topic-btn')) return;
const currentTid = (unsafeWindow.ajaxify && unsafeWindow.ajaxify.data && unsafeWindow.ajaxify.data.tid) || null;
if (!currentTid) return;
const exportBtn = document.querySelector('.fa-download')?.closest('a, button');
if (!exportBtn) return;
const parentContainer = exportBtn.parentElement;
if (!parentContainer) return;
const topicTitle = document.querySelector('[component="topic/title"]')?.textContent.trim() || 'נושא בפורום';
const topicBtn = document.createElement('button');
topicBtn.id = 'top-bar-save-topic-btn';
topicBtn.className = exportBtn.className || 'btn btn-sm btn-link text-secondary text-body';
topicBtn.style.cssText = 'cursor: pointer; display: inline-flex; align-items: center; gap: 8px; text-decoration: none; background: none; border: none; margin-left: 12px;';
let savedTopics = GM_getValue('saved_topics_data', []);
const isTopicSaved = savedTopics.some(x => x.tid === currentTid);
topicBtn.innerHTML = `<i class="fa ${isTopicSaved ? 'fa-folder' : 'fa-folder-o'}"></i> <span>שמור כסימניה</span>`;
topicBtn.addEventListener('click', (e) => {
e.preventDefault();
let currentTopics = GM_getValue('saved_topics_data', []);
const icon = topicBtn.querySelector('i');
if (currentTopics.some(x => x.tid === currentTid)) {
currentTopics = currentTopics.filter(x => x.tid !== currentTid);
icon.className = 'fa fa-folder-o';
} else {
const firstPostEl = document.querySelector('[component="post"] .content, [component="post/content"]');
let snippet = firstPostEl ? firstPostEl.textContent.trim().substring(0, 120) : 'לחץ למעבר לצפייה בנושא המלא...';
if (snippet.length >= 120) snippet += '...';
currentTopics.push({
tid: currentTid,
title: topicTitle,
snippet: snippet
});
icon.className = 'fa fa-folder';
}
GM_setValue('saved_topics_data', currentTopics);
updateBadgesAndCounters();
});
parentContainer.insertBefore(topicBtn, exportBtn);
}
// ==========================================
// חלק ה': הזרקת כפתורים לפוסטים (צ'אט אוטומטי מלא)
// ==========================================
function enhancePosts() {
const posts = document.querySelectorAll('[component="post"]:not(.enhanced-post)');
const topicTitle = document.querySelector('[component="topic/title"]')?.textContent.trim() || 'נושא בפורום';
posts.forEach(post => {
post.classList.add('enhanced-post');
const tools = post.querySelector('.post-tools, [component="post/tools"], [component="post/actions"]');
if (!tools) return;
const pid = post.getAttribute('data-pid');
const postUid = post.getAttribute('data-uid');
const authorName = post.getAttribute('data-username') || 'משתמש';
const currentUid = (unsafeWindow.app && unsafeWindow.app.user) ? unsafeWindow.app.user.uid : null;
// 1. כפתור צ'אט אוטומטי חסין (הדמיית Mouseenter והזרקת קישור)
if (postUid && currentUid && Array.of(0, currentUid).includes(Number(postUid)) === false && !tools.querySelector('.custom-chat-btn')) {
const chatBtn = document.createElement('a');
chatBtn.className = 'btn btn-xs btn-link custom-chat-btn';
chatBtn.innerHTML = '<i class="fa fa-fw fa-comment-dots"></i> צ\'אט';
chatBtn.style.marginLeft = '8px';
chatBtn.style.cursor = 'pointer';
chatBtn.addEventListener('click', async function (e) {
e.preventDefault();
e.stopPropagation();
const userLink = post.querySelector('a[data-uid]');
if (!userLink) return;
userLink.dispatchEvent(new PointerEvent('pointerenter', { bubbles: true }));
userLink.dispatchEvent(new MouseEvent('mouseenter', { bubbles: true }));
userLink.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
const observer = new MutationObserver(() => {
const popoverId = userLink.getAttribute('aria-describedby');
if (!popoverId) return;
const popover = document.getElementById(popoverId);
if (!popover) return;
const btn =
popover.querySelector('[component="account/new-chat"]') ||
popover.querySelector('[component="account/chat"]') ||
popover.querySelector('a[href*="/chats"]');
if (btn) {
observer.disconnect();
const postUrl = pid ? `${getForumBaseUrl()}/post/${pid}` : window.location.href;
const chatInputObserver = new MutationObserver(() => {
const chatInput = document.querySelector('[component="chat/input"]') || document.querySelector('.chat-input');
if (chatInput) {
chatInputObserver.disconnect();
if (!chatInput.value.includes(postUrl)) {
chatInput.value = postUrl + '\n' + chatInput.value;
chatInput.dispatchEvent(new Event('input', { bubbles: true }));
chatInput.dispatchEvent(new Event('change', { bubbles: true }));
chatInput.focus();
}
}
});
chatInputObserver.observe(document.body, { childList: true, subtree: true });
setTimeout(() => chatInputObserver.disconnect(), 5000);
btn.click();
}
});
observer.observe(document.body, { childList: true, subtree: true });
setTimeout(() => observer.disconnect(), 5000);
});
tools.appendChild(chatBtn);
}
// 2. כפתור שמור לקריאה (פוסטים)
if (pid && !tools.querySelector('.custom-save-read-btn')) {
const saveBtn = document.createElement('button');
saveBtn.className = 'btn btn-xs btn-link custom-save-read-btn';
saveBtn.style.marginLeft = '8px';
let savedList = GM_getValue('saved_to_read_data', []);
const isSaved = savedList.some(x => x.pid === pid);
saveBtn.innerHTML = `<i class="fa ${isSaved ? 'fa-bookmark' : 'fa-bookmark-o'}"></i> לקריאה בהמשך`;
saveBtn.addEventListener('click', (e) => {
e.preventDefault();
let currentList = GM_getValue('saved_to_read_data', []);
if (currentList.some(x => x.pid === pid)) {
currentList = currentList.filter(x => x.pid !== pid);
saveBtn.querySelector('i').className = 'fa fa-bookmark-o';
} else {
const contentEl = post.querySelector('.content') || post.querySelector('[component="post/content"]');
let snippet = contentEl ? contentEl.textContent.trim().substring(0, 120) : '';
if (snippet.length >= 120) snippet += '...';
currentList.push({
pid: pid,
title: topicTitle,
author: authorName,
snippet: snippet
});
saveBtn.querySelector('i').className = 'fa fa-bookmark';
}
GM_setValue('saved_to_read_data', currentList);
updateBadgesAndCounters();
});
tools.appendChild(saveBtn);
}
// 3. כפתור העתקת קישור מדויק לפוסט
if (pid && !tools.querySelector('.custom-copy-link-btn')) {
const copyBtn = document.createElement('button');
copyBtn.className = 'btn btn-xs btn-link custom-copy-link-btn';
copyBtn.style.marginLeft = '8px';
copyBtn.innerHTML = '<i class="fa fa-copy"></i> העתק קישור';
copyBtn.addEventListener('click', (e) => {
e.preventDefault();
const postUrl = `${getForumBaseUrl()}/post/${pid}`;
navigator.clipboard.writeText(postUrl);
});
tools.appendChild(copyBtn);
}
});
}
// ==========================================
// חלק ו': תצוגה מקדימה של פוסטים באזורי צ'אט
// ==========================================
const previewPopup = document.createElement('div');
Object.assign(previewPopup.style, {
position: 'absolute',
backgroundColor: '#ffffff',
border: '1px solid #dddddd',
borderRadius: '8px',
padding: '12px',
boxShadow: '0 4px 15px rgba(0,0,0,0.15)',
zIndex: '10000',
display: 'none',
maxWidth: '400px',
maxHeight: '300px',
overflowY: 'auto',
fontSize: '14px',
direction: 'rtl',
lineHeight: '1.5',
color: '#333333'
});
document.body.appendChild(previewPopup);
let activeRequest = null;
let hideTimeout = null;
previewPopup.addEventListener('mouseenter', () => { clearTimeout(hideTimeout); });
previewPopup.addEventListener('mouseleave', () => { previewPopup.style.display = 'none'; });
function isInsideChat(link) {
const path = window.location.pathname;
if (path.includes('/chats') || /\/user\/[^/]+\/chats/.test(path)) return true;
return !!link.closest('[component^="chat"]') ||
!!link.closest('.chat-window') ||
!!link.closest('.chat-modal') ||
!!link.closest('.chat-messages') ||
!!link.closest('.chat-content') ||
!!link.closest('.expanded-chat');
}
function fetchPostContent(fullUrl, pid) {
return new Promise((resolve) => {
if (activeRequest) {
try { activeRequest.abort(); } catch(e){}
}
activeRequest = GM_xmlhttpRequest({
method: "GET",
url: fullUrl,
onload: function(response) {
try {
const parser = new DOMParser();
const doc = parser.parseFromString(response.responseText, 'text/html');
const postContainer = doc.querySelector(`[data-pid="${pid}"]`);
let contentEl = null;
let authorEl = null;
let avatarEl = null;
if (postContainer) {
contentEl = postContainer.querySelector('.content') ||
postContainer.querySelector('[component="post/content"]') ||
postContainer.querySelector('.post-content');
authorEl = postContainer.querySelector('[component="post/author"]') ||
postContainer.querySelector('.username') ||
postContainer.querySelector('[component="user/username"]') ||
postContainer.querySelector('.author-name') ||
postContainer.querySelector('[data-username]');
avatarEl = postContainer.querySelector('.avatar') ||
postContainer.querySelector('[component="user/picture"]') ||
postContainer.querySelector('.user-img') ||
postContainer.querySelector('.author-avatar') ||
postContainer.querySelector('.avatar-wrapper');
} else {
contentEl = doc.querySelector('.content') || doc.querySelector('[component="post/content"]');
authorEl = doc.querySelector('.username') || doc.querySelector('[component="post/author"]');
avatarEl = doc.querySelector('.avatar') || doc.querySelector('[component="user/picture"]');
}
let avatarHtml = '';
if (avatarEl) {
const clone = avatarEl.cloneNode(true);
clone.style.width = '24px';
clone.style.height = '24px';
clone.style.borderRadius = '50%';
clone.style.marginLeft = '8px';
clone.style.display = 'inline-block';
clone.style.verticalAlign = 'middle';
clone.style.objectFit = 'cover';
clone.style.lineHeight = '24px';
clone.style.fontSize = '11px';
avatarHtml = clone.outerHTML;
}
resolve({
content: contentEl ? contentEl.innerHTML : 'לא ניתן ליצור תצוגה מקדימה של הפוסט כרגע.',
author: authorEl ? (authorEl.getAttribute('data-username') || authorEl.textContent.trim()) : 'משתמש',
avatarHtml: avatarHtml
});
} catch(e) {
resolve({ content: 'שגיאה בפענוח התצוגה המקדימה.', author: 'מערכת', avatarHtml: '' });
}
},
onerror: function() {
resolve({ content: 'שגיאה בטעינת התצוגה המקדימה.', author: 'מערכת', avatarHtml: '' });
}
});
});
}
document.body.addEventListener('mouseover', async (e) => {
const link = e.target.closest('a[href*="/post/"]');
if (!link || !isInsideChat(link)) return;
const match = link.href.match(/(mitmachim\.top|otzaria\.org).*?\/post\/(\d+)/);
if (!match) return;
clearTimeout(hideTimeout);
const pid = match[2];
const fullUrl = link.href;
const rect = link.getBoundingClientRect();
previewPopup.style.left = `${rect.left + window.scrollX}px`;
previewPopup.style.top = `${rect.bottom + window.scrollY + 8}px`;
previewPopup.innerHTML = '<i class="fa fa-spinner fa-spin"></i> טוען תצוגה מקדימה...';
previewPopup.style.display = 'block';
const data = await fetchPostContent(fullUrl, pid);
if (!data) return;
previewPopup.innerHTML = `
<div style="font-weight: bold; color: #007bff; margin-bottom: 8px; display: flex; align-items: center;">
${data.avatarHtml || '<i class="fa fa-user" style="margin-left: 8px;"></i>'}
<span>${data.author}:</span>
</div>
<div class="post-preview-body">${data.content}</div>
`;
});
document.body.addEventListener('mouseout', (e) => {
const link = e.target.closest('a[href*="/post/"]');
if (link && isInsideChat(link)) {
hideTimeout = setTimeout(() => {
if (activeRequest) {
try { activeRequest.abort(); } catch(e){}
}
previewPopup.style.display = 'none';
}, 300);
}
});
// ==========================================
// הפעלה מבוקרת ללא עומס DOM
// ==========================================
enhancePosts();
enhanceTopicHeaderTools();
integrateIntoLeftSidebar();
let debounceTimer;
const domObserver = new MutationObserver(() => {
clearTimeout(debounceTimer);
debounceTimer = setTimeout(() => {
enhancePosts();
enhanceTopicHeaderTools();
integrateIntoLeftSidebar();
}, 100);
});
domObserver.observe(document.body, { childList: true, subtree: true });
})();
נבדק על ידי ועובד. מי שרוצה שאצור גם לf22 pro שידבר איתי.
רוט - תעשו אם אין לכם
מנהל MT - מנהל-MT-מתורגם.apk
בתוך MT Manager, פתח את com.android.systemui, כנס ל-classes.dex (ב-Dex Editor Plus) וצור שני קבצים בנתיב /com/android/systemui:
1. HebrewDateHelper.smali
קובץ זה מחשב את השקיעה לפי הנוסחה המתמטית (Sin/Cos) ומפיק את הטקסט "מוצאי שבת" או "אור ל-".
.class public Lcom/android/systemui/HebrewDateHelper;
.super Ljava/lang/Object;
# --- מתודה ראשית לעדכון ה-TextView ---
.method public static updateHebrewDisplay(Landroid/widget/TextView;)V
.registers 2
if-nez p0, :cond_3
return-void
:cond_3
invoke-static {}, Lcom/android/systemui/HebrewDateHelper;->getSmartDate()Ljava/lang/String;
move-result-object v0
invoke-virtual {p0, v0}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
return-void
.end method
# --- לוגיקה חכמה לבחירת הנוסח ---
.method public static getSmartDate()Ljava/lang/String;
.registers 4
# בדיקה האם עכשיו לילה לפי החישוב המתמטי
invoke-static {}, Lcom/android/systemui/HebrewDateHelper;->isAfterNightfall()Z
move-result v0
# יצירת לוח שנה עברי (ICU)
new-instance v1, Landroid/icu/util/HebrewCalendar;
invoke-direct {v1}, Landroid/icu/util/HebrewCalendar;-><init>()V
if-eqz v0, :cond_30 # אם לילה
# בדיקה אם יום שבת (7 ב-Calendar)
const/4 v2, 0x7
invoke-virtual {v1, v2}, Landroid/icu/util/HebrewCalendar;->get(I)I
move-result v3
if-ne v3, v2, :cond_20
const-string v0, "מוצאי שבת"
return-object v0
:cond_20
# אם לילה ואינו מוצ"ש - הוסף יום (מעבר לתאריך של מחר) והוסף "אור ל-"
const/4 v2, 0x5 # DATE
const/4 v3, 0x1
invoke-virtual {v1, v2, v3}, Landroid/icu/util/HebrewCalendar;->add(II)V
new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
const-string v2, "אור ל-"
invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-static {v1}, Lcom/android/systemui/HebrewDateHelper;->formatHebrew(Landroid/icu/util/HebrewCalendar;)Ljava/lang/String;
move-result-object v1
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
return-object v0
:cond_30 # אם יום (לפני שקיעה)
invoke-static {v1}, Lcom/android/systemui/HebrewDateHelper;->formatHebrew(Landroid/icu/util/HebrewCalendar;)Ljava/lang/String;
move-result-object v0
return-object v0
.end method
# --- פורמט התאריך העברי (ICU) ---
.method private static formatHebrew(Landroid/icu/util/HebrewCalendar;)Ljava/lang/String;
.registers 4
new-instance v0, Landroid/icu/util/ULocale;
const-string v1, "he_IL@calendar=hebrew"
invoke-direct {v0, v1}, Landroid/icu/util/ULocale;-><init>(Ljava/lang/String;)V
const/4 v1, 0x0 # LONG style
invoke-static {v1, v0}, Landroid/icu/text/DateFormat;->getDateInstance(ILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;
move-result-object v0
invoke-virtual {p0}, Landroid/icu/util/HebrewCalendar;->getTime()Ljava/util/Date;
move-result-object v1
invoke-virtual {v0, v1}, Landroid/icu/text/DateFormat;->format(Ljava/util/Date;)Ljava/lang/String;
move-result-object v0
return-object v0
.end method
# --- חישוב שקיעה מתמטי (Sin/Cos) ---
.method private static isAfterNightfall()Z
.registers 10
invoke-static {}, Ljava/util/Calendar;->getInstance()Ljava/util/Calendar;
move-result-object v0
# קבלת נתוני הזמן הנוכחיים
const/4 v1, 0x6 # DAY_OF_YEAR
invoke-virtual {v0, v1}, Ljava/util/Calendar;->get(I)I
move-result v1
const/16 v2, 0xb # HOUR_OF_DAY
invoke-virtual {v0, v2}, Ljava/util/Calendar;->get(I)I
move-result v2
const/16 v3, 0xc # MINUTE
invoke-virtual {v0, v3}, Ljava/util/Calendar;->get(I)I
move-result v3
# חישוב שעת שקיעה משוערת
const-wide v4, 0x400921fb54442d18L # 2 * PI
const-wide/high16 v6, 0x4000000000000000L # 2.0
mul-double/2addr v4, v6
add-int/lit8 v6, v1, -0x50
int-to-double v6, v6
mul-double/2addr v4, v6
const-wide v6, 0x4076d00000000000L # 365.0
div-double/2addr v4, v6
invoke-static {v4, v5}, Ljava/lang/Math;->sin(D)D
move-result-wide v4
const-wide v6, 0x3ff0cccccccccccdL # 1.05
mul-double/2addr v4, v6
const-wide v6, 0x403247ae147ae148L # 18.28 (שעה בסיסית לשקיעה)
add-double/2addr v4, v6
# בדיקת שעון קיץ ועדכון השעה
invoke-virtual {v0}, Ljava/util/Calendar;->getTimeZone()Ljava/util/TimeZone;
move-result-object v6
invoke-virtual {v0}, Ljava/util/Calendar;->getTime()Ljava/util/Date;
move-result-object v0
invoke-virtual {v6, v0}, Ljava/util/TimeZone;->inDaylightTime(Ljava/util/Date;)Z
move-result v0
if-eqz v0, :cond_52
const-wide/high16 v6, 0x3ff0000000000000L # +1.0
add-double/2addr v4, v6
:cond_52
# המרת התוצאה לשעות ודקות
double-to-int v0, v4 # שעת שקיעה
int-to-double v6, v0
sub-double/2addr v4, v6
const-wide v6, 0x404e000000000000L # 60.0
mul-double/2addr v4, v6
double-to-int v4, v4 # דקות שקיעה
# השוואה לזמן אמת
const/4 v5, 0x1
if-le v2, v0, :cond_62
return v5
:cond_62
if-ne v2, v0, :cond_67
if-lt v3, v4, :cond_67
return v5
:cond_67
const/4 v0, 0x0
return v0
.end method
מי שרוצה ללא הצגת היום שייקח את הקוד שבספויילר:
.class public Lcom/android/systemui/HebrewDateHelper;
.super Ljava/lang/Object;
# --- מתודה ראשית לעדכון ה-TextView ---
.method public static updateHebrewDisplay(Landroid/widget/TextView;)V
.registers 2
if-nez p0, :cond_3
return-void
:cond_3
invoke-static {}, Lcom/android/systemui/HebrewDateHelper;->getSmartDate()Ljava/lang/String;
move-result-object v0
invoke-virtual {p0, v0}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
return-void
.end method
# --- לוגיקה חכמה לבחירת הנוסח (יום/לילה/מוצ"ש) ---
.method public static getSmartDate()Ljava/lang/String;
.registers 4
invoke-static {}, Lcom/android/systemui/HebrewDateHelper;->isAfterNightfall()Z
move-result v0
new-instance v1, Landroid/icu/util/HebrewCalendar;
invoke-direct {v1}, Landroid/icu/util/HebrewCalendar;-><init>()V
if-eqz v0, :cond_30 # אם לילה (אחרי שקיעה)
const/4 v2, 0x7 # יום שבת ב-Calendar
invoke-virtual {v1, v2}, Landroid/icu/util/HebrewCalendar;->get(I)I
move-result v3
if-ne v3, v2, :cond_20
const-string v0, "מוצאי שבת"
return-object v0
:cond_20
# אם לילה ואינו מוצ"ש - הוספת יום והוספת "אור ל-"
const/4 v2, 0x5 # DATE
const/4 v3, 0x1
invoke-virtual {v1, v2, v3}, Landroid/icu/util/HebrewCalendar;->add(II)V
new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
const-string v2, "אור ל-"
invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-static {v1}, Lcom/android/systemui/HebrewDateHelper;->formatHebrew(Landroid/icu/util/HebrewCalendar;)Ljava/lang/String;
move-result-object v1
invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
return-object v0
:cond_30 # אם יום (לפני שקיעה)
invoke-static {v1}, Lcom/android/systemui/HebrewDateHelper;->formatHebrew(Landroid/icu/util/HebrewCalendar;)Ljava/lang/String;
move-result-object v0
return-object v0
.end method
# --- פורמט התאריך העברי ללא יום בשבוע (MEDIUM style) ---
.method private static formatHebrew(Landroid/icu/util/HebrewCalendar;)Ljava/lang/String;
.registers 4
new-instance v0, Landroid/icu/util/ULocale;
const-string v1, "he_IL@calendar=hebrew"
invoke-direct {v0, v1}, Landroid/icu/util/ULocale;-><init>(Ljava/lang/String;)V
# ערך 2 מייצג MEDIUM (תאריך בלבד) במקום 0 (LONG - הכולל יום)
const/4 v1, 0x2
invoke-static {v1, v0}, Landroid/icu/text/DateFormat;->getDateInstance(ILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;
move-result-object v0
invoke-virtual {p0}, Landroid/icu/util/HebrewCalendar;->getTime()Ljava/util/Date;
move-result-object v1
invoke-virtual {v0, v1}, Landroid/icu/text/DateFormat;->format(Ljava/util/Date;)Ljava/lang/String;
move-result-object v0
return-object v0
.end method
# --- חישוב שקיעה מתמטי משוער ---
.method private static isAfterNightfall()Z
.registers 10
invoke-static {}, Ljava/util/Calendar;->getInstance()Ljava/util/Calendar;
move-result-object v0
const/4 v1, 0x6 # DAY_OF_YEAR
invoke-virtual {v0, v1}, Ljava/util/Calendar;->get(I)I
move-result v1
const/16 v2, 0xb # HOUR_OF_DAY
invoke-virtual {v0, v2}, Ljava/util/Calendar;->get(I)I
move-result v2
const/16 v3, 0xc # MINUTE
invoke-virtual {v0, v3}, Ljava/util/Calendar;->get(I)I
move-result v3
# חישוב גלי סינוס לקירוב שעת שקיעה לאורך השנה
const-wide v4, 0x400921fb54442d18L # 2 * PI
const-wide/high16 v6, 0x4000000000000000L # 2.0
mul-double/2addr v4, v6
add-int/lit8 v6, v1, -0x50
int-to-double v6, v6
mul-double/2addr v4, v6
const-wide v6, 0x4076d00000000000L # 365.0
div-double/2addr v4, v6
invoke-static {v4, v5}, Ljava/lang/Math;->sin(D)D
move-result-wide v4
const-wide v6, 0x3ff0cccccccccccdL # 1.05
mul-double/2addr v4, v6
const-wide v6, 0x403247ae147ae148L # 18.28 (שעה בסיסית לשקיעה)
add-double/2addr v4, v6
# בדיקת שעון קיץ
invoke-virtual {v0}, Ljava/util/Calendar;->getTimeZone()Ljava/util/TimeZone;
move-result-object v6
invoke-virtual {v0}, Ljava/util/Calendar;->getTime()Ljava/util/Date;
move-result-object v0
invoke-virtual {v6, v0}, Ljava/util/TimeZone;->inDaylightTime(Ljava/util/Date;)Z
move-result v0
if-eqz v0, :cond_52
const-wide/high16 v6, 0x3ff0000000000000L # +1.0
add-double/2addr v4, v6
:cond_52
double-to-int v0, v4 # שעות
int-to-double v6, v0
sub-double/2addr v4, v6
const-wide v6, 0x404e000000000000L # 60.0
mul-double/2addr v4, v6
double-to-int v4, v4 # דקות
const/4 v5, 0x1
if-le v2, v0, :cond_62
return v5
:cond_62
if-ne v2, v0, :cond_67
if-lt v3, v4, :cond_67
return v5
:cond_67
const/4 v0, 0x0
return v0
.end method
2. HebrewDateReceiver.smali
קובץ זה "מקשיב" למערכת ומעדכן את התצוגה.
.class public Lcom/android/systemui/HebrewDateReceiver;
.super Landroid/content/BroadcastReceiver;
.field private mView:Landroid/widget/TextView;
.method public constructor <init>(Landroid/widget/TextView;)V
.registers 2
invoke-direct {p0}, Landroid/content/BroadcastReceiver;-><init>()V
iput-object p1, p0, Lcom/android/systemui/HebrewDateReceiver;->mView:Landroid/widget/TextView;
return-void
.end method
.method public onReceive(Landroid/content/Context;Landroid/content/Intent;)V
.registers 4
iget-object v0, p0, Lcom/android/systemui/HebrewDateReceiver;->mView:Landroid/widget/TextView;
invoke-static {v0}, Lcom/android/systemui/HebrewDateHelper;->updateHebrewDisplay(Landroid/widget/TextView;)V
return-void
.end method
הוספת מזהה (ID): כנס ל-resources.arsc -> Arsc Editor -> com.android.systemui > id
כעת תראה רשימה ארוכה של שמות. לחץ על כפתור התפריט (3 נקודות) ובחר Add.
בתיבה שנפתחת, בשדה Name, רשום בדיוק: hebrew_date_display.
לחץ על אישור. יינתן ל id מספר (Hex) באופן אוטומטי. העתק את המספר הזה!
(הוא נראה בערך ככה: 0x7f0a0123).
צא חזרה ולחץ על Save כדי לשמור את השינויים בקובץ ה-arsc.
הוספת האלמנט: בנתיב /res/layout, פתח את הקובץ האחראי על מסך הנעילה (keyguard_status_view.xml) והוסף:
<TextView
android:id="@id/hebrew_date_display"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_gravity="center_horizontal"
android:textColor="#FFFFFF"
android:textSize="16sp"
android:layout_marginTop="4dp" />
כדי שהתאריך יבדוק כל דקה אם הגיעה השקיעה, נזריק את ה-Receiver לתוך המחלקה של מסך הנעילה (KeyguardStatusView.smali) בתוך המתודה onAttachedToWindow:
שימו לב לעדכן את ה- ID!
# 1. מציאת ה-View (החלף את ה-ID בערך ה-Hex ש-MT נותן לך)
const v0, 0x7fXXXXXX
invoke-virtual {p0, v0}, Landroid/view/View;->findViewById(I)Landroid/view/View;
move-result-object v0
check-cast v0, Landroid/widget/TextView;
# 2. יצירת ה-Receiver והפילטר
new-instance v1, Lcom/android/systemui/HebrewDateReceiver;
invoke-direct {v1, v0}, Lcom/android/systemui/HebrewDateReceiver;-><init>(Landroid/widget/TextView;)V
new-instance v2, Landroid/content/IntentFilter;
invoke-direct {v2}, Landroid/content/IntentFilter;-><init>()V
# 3. הוספת הפעולות (כולל TICK לעדכון בשקיעה)
const-string v3, "android.intent.action.TIME_TICK" # עדכון כל דקה לבדיקת שקיעה
invoke-virtual {v2, v3}, Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V
const-string v3, "android.intent.action.DATE_CHANGED"
invoke-virtual {v2, v3}, Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V
# 4. רישום בפועל
invoke-virtual {p0}, Landroid/view/View;->getContext()Landroid/content/Context;
move-result-object v3
invoke-virtual {v3, v1, v2}, Landroid/content/Context;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent;
# 5. עדכון מיידי ראשוני
invoke-static {v0}, Lcom/android/systemui/HebrewDateHelper;->updateHebrewDisplay(Landroid/widget/TextView;)V
איני לוקח אחריות על שום נזק שיהיה כתוצאה ממדריך זה.
בהצלחה!
אני באמצע ליצור אתר לגרסאות החינמיות שהועלו לפורום.
אני רוצה אישור, עזרה בתפעול, פתיחה בנטפרי.
@מזכירותי @שניאור-שמח @RearmostPant23 @מישהו12 @נוחעם-FM
@י.-פל. לגבי נטפרי אם תוכל לעזור
אשמח אם תתייגו את מי שיעזור בעניין
למי שמעוניין- תמונות די מפורטות:
@שניאור-שמח ו @מישהו12 בבקשה

אני הולך להעלות בקרוב גרסא משלי עם המון שיפורים
...
מתקן את זה

ומציג כך

הנה:
// ==UserScript==
// @name NodeBB Cards - Fix Ellipsis
// @namespace http://tampermonkey.net/
// @version 1.1
// @match https://mitmachim.top/*
// @grant none
// @run-at document-idle
// ==/UserScript==
(function () {
'use strict';
function fix() {
document.querySelectorAll('.fa-ellipsis-v').forEach(el => {
el.style.fontFamily = '"Font Awesome 7 Free"';
el.style.fontWeight = '900';
});
}
// מיד כשהדף נטען
fix();
// כל פעם שנוסף תוכן חדש (הפופאפ)
new MutationObserver(fix).observe(document.documentElement, {
childList: true,
subtree: true
});
// ליתר ביטחון
setInterval(fix, 500);
})();
בס"ד

מקשים מעולים (מעולם לא נלחץ בכיס)
ממשק מאוד נוח
שקע טעינה Type-C
סינכרון אנשי קשר ממכשיר אחר דרך בלוטוס
חיפוש בנגן
פנס חזק
איכות שמע ממש מעולה!
חיפוש באנשי קשר של דיש- מביא איש קשר ששמו דוד יצחק שלום (לדוגמה)
חיוג מהיר °
אותה הסוללה של הc2- של 1150mAh
עמידות במים בתקן IP54
לוח שנה משולב עברי ולועזי
אחסון של עד 15,000 הודעות
מסך עמיד- עשוי מזכוכית מחוסמת בתקן CG01
משקל 100 גרם (כולל סוללה)
מידות- 124.1 * 52 * 14.58 מ"מ
תיבת דואר מאובטחת עם סיסמה
כולל מחשבון, מחשבון הלוואות ומחשבון מדעי
אפשרות שיחה מדומה
הצגת אחוזי סוללה
פתיחת קבצי txt כמו בנוקיות החדשים
זמני היום לפי ערים
תפילון וש"ס לטלפון קרדיט ל @ילד-לומד: תפילון וש''ס.zip
תמונות בספויילר
הערות והארות יתקבלו בשמחה
כתובת האתר- https://navi-phone.com
רשימת המשווקים- https://navi-phone.com/stores.html
ליצירת קשר עם התמיכה- 0539455166, navi.cellular26@gmail.com
@שמואל אשמח מאוד אם יהיה באופציות הדיווח "Ai".
הנה האפליקציה - שלט למזגן. בשלבי סיום

חבר'ה, אתם יכולים לפתוח נושא חדש. נושא זה לא יועד לדיון למה לציבור הדת"ל יש בעיה עם רדיו.