kodline

import sys
import os
import time
from threading import Thread
import sqlite3
from datetime import datetime, timedelta

import psutil
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QPushButton, QLabel, QSystemTrayIcon, QMenu, QAction, QTableWidget, QTableWidgetItem, QHeaderView
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtCore import Qt, QTimer, pyqtSignal
from plyer import notification
from PIL import Image, ImageDraw, ImageQt

DB_FILE = "/sdcard/battery_stats.db"
CHECK_INTERVAL = 300  # 5 dakikada bir kontrol et

class BatteryMonitor(QMainWindow):
   update_signal = pyqtSignal(int, bool)

   def __init__(self):
       super().__init__()
       self.initUI()
       self.initDB()
       self.monitoring = False
       self.monitor_thread = None
       self.update_signal.connect(self.update_ui)

   def initUI(self):
       self.setWindowTitle('Akıllı Pil İzleyici')
       self.setGeometry(100, 100, 400, 500)

       central_widget = QWidget()
       self.setCentralWidget(central_widget)
       layout = QVBoxLayout()

       self.status_label = QLabel('Durum: İzleme Kapalı', self)
       layout.addWidget(self.status_label)

       self.battery_icon = QLabel(self)
       layout.addWidget(self.battery_icon)

       self.battery_level = QLabel('Pil Seviyesi: ---%', self)
       layout.addWidget(self.battery_level)

       self.start_stop_button = QPushButton('İzlemeyi Başlat', self)
       self.start_stop_button.clicked.connect(self.toggle_monitoring)
       layout.addWidget(self.start_stop_button)

       self.stats_table = QTableWidget(self)
       self.stats_table.setColumnCount(3)
       self.stats_table.setHorizontalHeaderLabels(['Zaman', 'Yüzde', 'Şarjda'])
       self.stats_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
       layout.addWidget(self.stats_table)

       central_widget.setLayout(layout)

       # Sistem tepsisi ikonu
       self.tray_icon = QSystemTrayIcon(self)
       self.tray_icon.setIcon(QIcon(self.create_battery_icon(100)))
       tray_menu = QMenu()
       show_action = QAction("Göster", self)
       quit_action = QAction("Çıkış", self)
       show_action.triggered.connect(self.show)
       quit_action.triggered.connect(self.quit_app)
       tray_menu.addAction(show_action)
       tray_menu.addAction(quit_action)
       self.tray_icon.setContextMenu(tray_menu)
       self.tray_icon.show()

       # Düzenli UI güncellemeleri
       self.timer = QTimer(self)
       self.timer.timeout.connect(self.update_stats_table)
       self.timer.start(60000)  # Her dakika güncelle

   def initDB(self):
       conn = sqlite3.connect(DB_FILE)
       c = conn.cursor()
       c.execute('''CREATE TABLE IF NOT EXISTS battery_stats
                    (timestamp TEXT, percent INTEGER, plugged INTEGER)''')
       conn.commit()
       conn.close()

   def toggle_monitoring(self):
       if not self.monitoring:
           self.start_monitoring()
       else:
           self.stop_monitoring()

   def start_monitoring(self):
       self.monitoring = True
       self.status_label.setText('Durum: İzleniyor')
       self.start_stop_button.setText('İzlemeyi Durdur')
       self.monitor_thread = Thread(target=self.monitor_battery, daemon=True)
       self.monitor_thread.start()

   def stop_monitoring(self):
       self.monitoring = False
       self.status_label.setText('Durum: İzleme Kapalı')
       self.start_stop_button.setText('İzlemeyi Başlat')

   def monitor_battery(self):
       last_notified = 100
       while self.monitoring:
           percent, plugged = self.check_battery()
           self.log_battery_stat(percent, plugged)
           self.update_signal.emit(percent, plugged)
           if not plugged:
               if (percent <= 10 and last_notified > 10) or \
                  (percent <= 5 and last_notified > 5) or \
                  (percent <= 1 and last_notified > 1):
                   self.show_notification(percent)
                   last_notified = percent
           else:
               last_notified = 100
           time.sleep(CHECK_INTERVAL)

   def check_battery(self):
       battery = psutil.sensors_battery()
       return battery.percent, battery.power_plugged

   def log_battery_stat(self, percent, plugged):
       conn = sqlite3.connect(DB_FILE)
       c = conn.cursor()
       c.execute("INSERT INTO battery_stats VALUES (?, ?, ?)",
                 (datetime.now().isoformat(), percent, int(plugged)))
       conn.commit()
       conn.close()

   def show_notification(self, percent):
       icon_path = self.create_battery_icon(percent)
       title = f'Düşük Şarj Uyarısı: %{percent}'
       message = f'Şarjınız %{percent}! Lütfen cihazınızı şarj edin.'
       
       notification.notify(
           title=title,
           message=message,
           app_icon=icon_path,
           timeout=10,
       )

   def create_battery_icon(self, percent):
       img = Image.new('RGB', (100, 50), color='white')
       d = ImageDraw.Draw(img)
       d.rectangle([5, 5, 95, 45], outline="black")
       d.rectangle([95, 15, 100, 35], fill="black")
       d.rectangle([5, 5, 5 + int(90 * percent / 100), 45], fill="green")
       
       icon_path = "/sdcard/battery_icon.png"
       img.save(icon_path)
       return icon_path

   def update_ui(self, percent, plugged):
       self.battery_level.setText(f'Pil Seviyesi: %{percent}')
       icon = QIcon(self.create_battery_icon(percent))
       self.tray_icon.setIcon(icon)
       pixmap = icon.pixmap(100, 50)
       self.battery_icon.setPixmap(pixmap)
       self.update_stats_table()

   def update_stats_table(self):
       conn = sqlite3.connect(DB_FILE)
       c = conn.cursor()
       c.execute("SELECT * FROM battery_stats ORDER BY timestamp DESC LIMIT 10")
       rows = c.fetchall()
       conn.close()

       self.stats_table.setRowCount(len(rows))
       for i, row in enumerate(rows):
           self.stats_table.setItem(i, 0, QTableWidgetItem(row[0]))
           self.stats_table.setItem(i, 1, QTableWidgetItem(f"%{row[1]}"))
           self.stats_table.setItem(i, 2, QTableWidgetItem("Evet" if row[2] else "Hayır"))

   def quit_app(self):
       self.monitoring = False
       QApplication.quit()

   def closeEvent(self, event):
       event.ignore()
       self.hide()

if __name__ == '__main__':
   app = QApplication(sys.argv)
   ex = BatteryMonitor()
   ex.show()
   sys.exit(app.exec_())