Konubinix' opinionated web of thoughts

More Clever Night Light in Kivy

Fleeting

Following 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()