More Clever Night Light in Kivy
FleetingFollowing more clever night light, but using my a python runtime on android, so that I can use it when travelling.
import os
from datetime import datetime, timedelta
import math
import time
import requests
from kivy.app import App
from kivy.clock import Clock
from kivy.graphics import Color, Rectangle
from kivy.properties import BooleanProperty, NumericProperty, StringProperty
from kivy.uix.boxlayout import BoxLayout
from plyer import orientation
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.progressbar import ProgressBar
from kivy.uix.screenmanager import Screen, ScreenManager, ScreenManagerException
from kivy.core.audio import SoundLoader
from helpers.osc import oschandler, to_service
from helpers.wakelock import WakeLock
from helpers.notify import notify
from android.runnable import run_on_ui_thread
from logging import getLogger
from kivy.lang import Builder
logger = getLogger(__name__)
pink = (1, 0.75, 0.8)
orange = (1, 0.5, 0)
cyan = (0, 1, 1)
class SettingsScreen(Screen):
duration = NumericProperty(60)
def _update_rect(self, instance, value):
self.rect.pos = instance.pos
self.rect.size = instance.size
def __init__(self, **kwargs):
super(SettingsScreen, self).__init__(**kwargs)
self.remaining_time = None
with self.canvas.before:
self.color = Color(1, 1, 1, 1)
self.rect = Rectangle(size=self.size, pos=self.pos)
self.bind(size=self._update_rect, pos=self._update_rect)
layout = BoxLayout(orientation='vertical')
duration_layout = BoxLayout(size_hint=(1, 0.15))
duration_layout.add_widget(
Button(text="-",
background_color=(0, 0, 1, 1),
color=(1, 1, 1, 1),
on_press=self.decrease_duration))
self.duration_label = Label(text="", color=(0, 0, 0, 1))
duration_layout.add_widget(self.duration_label)
duration_layout.add_widget(
Button(text="+",
background_color=(0, 0, 1, 1),
color=(1, 1, 1, 1),
on_press=self.increase_duration))
layout.add_widget(duration_layout)
# Go button
go_button = Button(text="Go !!!",
background_color=(0, 0, 1, 1),
color=(1, 1, 1, 1),
size_hint=(1, 0.15))
go_button.bind(on_press=self.start_timer)
layout.add_widget(go_button)
self.add_widget(layout)
self.update_display()
self.bind(on_pre_enter=self.pre_enter_handler)
@oschandler("alarmtimer:start")
def _(config):
self.duration = config["duration"]
self.remaining_time = config.get("remaining_time")
self.update_display()
self.start_timer()
def pre_enter_handler(self, *_):
to_service("simpletimer:settings")
orientation.set_sensor()
def update_display(self):
self.duration_label.text = "Temps: " + str(self.duration // 60) + "m"
def increase_duration(self, instance):
self.duration += 60
self.update_display()
def decrease_duration(self, instance):
if self.duration > 60:
self.duration -= 60
self.update_display()
def start_timer(self, *instance):
app = App.get_running_app()
app.root.state_machine = StateMachine(
self.manager,
self.duration,
remaining_time = self.remaining_time,
)
app.root.state_machine.start()
class SimpleTimerApp(App):
def goto(self, screen):
self.manager.current = screen
def back(self):
self.manager.current = 'simpletimer:settings'
@staticmethod
def populate(sm):
try:
sm.get_screen('simpletimer:settings')
return
except ScreenManagerException:
pass # not populated yet
sm.add_widget(SettingsScreen(name='simpletimer:settings'))
sm.add_widget(TimerScreen(name='simpletimer:timer'))
def build(self):
sm = ScreenManager()
self.populate(sm)
return sm
def run():
SimpleTimerApp().run()