User-defined explicit automation for Android

Overview

Easer Build Status weblate codecov Download
matrix-chat Backers on Open Collective

Get it on F-Droid

See README.en.md for the English version.

注意:由於近期(2020下半年起)時間所限,Easer的維護速度會受到影響。不過由於程序主要框架已經穩定,除了增加對Event和Condition的遠程插件的支持(以及長期計劃中對多機器自動化互聯的支持)外,Easer的核心結構應當不會進行顯著修改(不過擴充功能仍不免需要進行一定修改)。有興趣者可以查看下面的相關章節,理解如何爲Easer添加你需要的功能,或者如何定位錯誤。作者會儘量抽時間看PR,然後先發佈的beta版本測試,隨後發佈正式版本。

簡介

Easer是一个讓智能手機更爲智能更爲自動化的軟件,能夠告訴手機在什麼情況下該做什麼事。Easer不僅可以處理事件,也可以檢查狀態,還能組合事件形成複雜的自定義事件。

如要查看對Easer功能完整的介紹,請參見網站

本文主要描述Easer的開發相關事宜。

擴展Easer

給Easer添加功能主要分爲三類:機制、技能以及遠程技能(插件)。

其中機制是Easer的核心部分,需要對Easer代碼有較好理解;也歡迎對現有代碼進行優化(但不要過度優化)。 對於多數情況下,所要做的是增加新Event、Condition和Operation,這通過增加新的技能或遠程技能(插件)實現。

技能

增加技能插件需要添加自己的Event、Condition或Operation至Easer代碼中的commons包下。有腳本以簡化該操作,並且現有插件均可作爲示例。

詳細請參見這個頁面

遠程技能(插件)

遠程技能是v0.7開始新增的功能,旨在通過獨立的軟件擴展Easer的功能。每個遠程技能是一個獨立的app;理論上也可以在一個app中包含多個遠程技能。注意該功能較新,接口暫不穩定(但應該不會大改)。

暫時遠程技能僅有Operation,該倉庫是一個示例。本倉庫中diagram目錄下有相關文件,比如其時序圖

支持Easer

協助翻譯

Easer的翻譯工作託管在Hosted Weblate。它是weblate(一個FLOSS的在線翻譯貢獻平臺)的官方託管實例。

十分歡迎有志者幫助翻譯工作,聚沙成塔集腋成裘。 如無特別說明,翻譯文本將使用CC-0協議,這意味着它們會進入公有領域;如果希望使用其他協議,請事先聯繫我們。

另請注意,由於Easer作者的個人偏好,中文主體取傳統漢字作爲模字,不取大陸所爲簡化字也不取臺灣所爲正體字。凡涉及翻譯自外文等情況導致地區用語不一致時,模字以大陸版爲主。(計劃後續加入基於OpenCC的自動轉換,擬通過CI達成,只是暫時無此精力。歡迎有經驗或有興趣者協助。)

提出、評論以及解決issue

如果在使用Easer時發現了什麼問題,你可以提出一個issue。在可行的情況下(當然,這不是強制的),相關信息給得越多越好,以便更早定位問題所在。
如果你覺得Easer應當添加某些功能,你也可以提出一個issue。

對於現有的issue,無論你有相同的問題(或想法)、你可以提供更多信息、或是你不認同其中的說法,請對其進行評論。十分歡迎對問題進行討論。 其中較需要多方意見的issue被標爲RFC,歡迎任何人的意見/建議。

如有興趣參與更多但不知道從何下手,可以查看被標爲GFC (Good For Contributors) L0L1L2 的issue。一般而言,它們都是目的較爲清晰、涉及組件較少的issue;L0、L1、L2是我個人主觀按難度遞增順序進行的劃分。

在某些情況下(如果你是一個開發者),你也許具有解決某些issue的能力。你可以fork本倉庫,編寫代碼,然後創建pull request。這樣,如果你的代碼的確解決了其問題,則你的代碼會進入主幹,他人均會受益於你的貢獻(並且你會被列在Contributors列表中)。
同樣歡迎對非現有issue創建pull request,但建議首先創建一個issue來描述你將要進行的工作(使得其他人意識到此事)。

測試覆蓋

測試實是重要。 而Easer目前遠不及過分測試的程度——事實上,多數代碼並沒有相應的自動測試。

如願意幫助貢獻測試代碼——尤其是對於核心部分(包括UI、數據後端以及服務)的測試——這裏實在感激不盡。

捐助

如果您願意給Easer的開發提供任何額度的捐助,請參看DONATE.md

感謝任何額度的支持。

鳴謝

協助者

Easer的開發離不開社區的幫助及捐贈。十分感謝各位。

詳細列表請見Contributor文檔。

第三方

版權協議

Copyright (c) 2016 - 2019 Rui Zhao (renyuneyun) [email protected]

除非額外說明,程序代碼以GPLv3+協議分發(參見LICENSE)

utils/目錄下工具以Apache 2.0協議分發(參見utils/LICENSE

爲何使用GPL?

Easer的期望功能中包含大量對隱私信息(比如位置信息、日曆信息)的捕捉,而且擁有對網絡的訪問能力。我們永遠不會希望一個本該方便生活的工具變成對自己生活的監視工具,所以必須儘可能保證該腐化不會發生。其唯一方法就是確保Easer的各個部分都允許任何人覈查,即保證Easer(及如果存在的衍生軟件)爲開源軟件。
而由於設計中Easer的各個功能(在將來)會變爲模塊/插件,因而也需要保證這些模塊/插件不會成爲潛在的黑手,故而希望依靠GPL的特性(鏈接軟件也需要爲GPL)來強制這一點。

事實上,強制各衍生/擴展品爲GPL並不必要,因爲只需要它們開源即可。但GPL是(我)目前所知的唯一可以保證衍生/擴展品爲開源軟件的協議,所以選擇它。

Comments
  • Bluetooth volume not changing

    Bluetooth volume not changing

    Hi! The (bluetooth) media volume does not change. I have set up to change the media volume to full when connecting to my car stereo. However the profile is loaded. All permissions are set. My system is Omnirom 8.1.0.

    enhancement 
    opened by mase76 24
  • Aquiring Cell Towers crashes app

    Aquiring Cell Towers crashes app

    Hi,

    working with a HomTom S8 and Nougat. When I try to create a condition that uses Cell Towers the app often crashes when it tries to read the active cell id's. Note: It does not crash always.

    Olaf

    bug compatibility more-info-needed 
    opened by datenbank-projekt 22
  • Unable to import events/profiles

    Unable to import events/profiles

    I exported on 0.47 (fdroid version) and tried to import on the latest (0.52 from github), however the file picker won't let me select the exported zip file. This is on Android 8.1.

    This screenshot shows that the exports from Easer are not selectable:

    screenshot_20180113-192100

    bug compatibility 
    opened by craftyguy 20
  • Activity log option is not functionally.

    Activity log option is not functionally.

    Tried to open the activity log section of the app. While i click on it to open it is not functionally. Like that Activity log is not working.

    How to reproduce

    Swipe from left to right to bring its section. Click on activity log option. It is not working.

    • Browser:Easer-event
    • Version:0.5.9.1
    • Operating system:5.1.1
    opened by Xeeshuu 18
  • Crash after updating to v0.7.7 (data problem)

    Crash after updating to v0.7.7 (data problem)

    Describe the bug v. 0.7.7, 0.7.7.1-BETA and 0.7.7.1 can't run previous version scripts

    To Reproduce Steps to reproduce the behavior:

    1. Go to F-Droid and update
    2. Easer will crash.
    3. Delete all data from Easer
    4. All permissions granted again.
    5. Import scripts from previous version.
    6. Try to convert to recommended format.
    7. Crash again.

    I currently downgraded Easer to 0.7.6.2

    bug fixed? 
    opened by racuna 17
  • How to build hierarchical events/ profiles?

    How to build hierarchical events/ profiles?

    I would like to build up kind of a tree, something like:

                            +-------------------+
                            | phone in specific |
                            |  cell location?   |
                            +---------+---------+
                         yes          |           no
                           +----------+-----------+
                           |                      |
                 +---------+---------+ +----------+----------+
                 |    enable wifi    | |    disable wifi     |
                 +---------+---------+ +----------+----------+
                           |                      |
                 +---------+---------+ +----------+----------+
                 | phone in specific | | enable mobile data  |
                 |       SSID?       | +---------------------+
                 +---------+---------+
             yes           |           no
               +-----------+-----------+
               |                       |
    +----------+----------+ +----------+----------+
    | disable mobile data | | enable mobile data  |
    +---------------------+ +---------------------+
    

    How can I achieve something like this?

    I've already set up easy things like: activate silent mode after 10:00 pm or activate normal after 6:00 am, but nothing more complicated.

    What can scenarios be used for?

    bug 
    opened by pikim 16
  • Crash pivot-menu

    Crash pivot-menu

    Describe the bug Open the Povit-Menu will end in a crash, it doesn't matter if I clear cache or something else. Errorlog is always 100% the same.

    To Reproduce Steps to reproduce the behavior:

    1. Go to main screen
    2. Click on bacon icon
    3. Click on Povit-Menu
    4. See errorlog

    Expected behavior Open the Povit-Menu^^

    Error log: 2020_01_17_16_40_35.log

    Extra phone information:

    • ROM: DerpFest 10-Beta-Official-raphael-20191218
    • Build-Number: QQ1B.191205.011
    • Kernel: 4.14.159-iMMENSITY+ #5 Wed Dec 18 23:15:49 IST 2019
    bug upstream (?) 
    opened by PsyEng 14
  • App crashes while clicking on convert data.

    App crashes while clicking on convert data.

    App gets crashed while clicking on convert data.

    How to reproduce

    Go to the settings of app. Scroll down the page. And click on convert data.

    • Browser:Easer event
    • Version:0.5.9.1
    • Operating system :5.1.1
    bug 
    opened by Xeeshuu 14
  • easer stopped randomly

    easer stopped randomly

    I'm note sure what is causing it. I gave all the permissions but once in a while easer is just stopped again and I have to start it manually (which kind spoils it because I'm not aware of it and then the actions don't happen). I'm also not rebooting. v0.5.5.1, android 5.1.1

    feature request unconfirmed 
    opened by steckerhalter 14
  • easer doesn't start on boot

    easer doesn't start on boot

    Using the latest version on f-droid as of this report, 0.3.5, easer doesn't start on boot despite enabling the option in settings to do so. I experienced this issue a few times after rebooting my device and meeting certain conditions that should have triggered an action in easer (e.g. connected to wifi AP --> do some action). If I manually launch easer, then suddenly the event triggers.

    bug 
    opened by craftyguy 14
  • [Bug:] Script is evaluated & executed although its predecessor isn't true

    [Bug:] Script is evaluated & executed although its predecessor isn't true

    Bug Description An image tells more than thousand words: Screenshot_20211218-132021 As you can see, the profile "no day off" was evaluated as true (as well as its children) although its only predecessor "weekdays" was evaluated as false (which was correct, because the screenshot was taken this saturday which indeed is a weekend day, not a weekday).

    To Reproduce

    1. Just download my settings from here: Easer.2021-12-15.10_46_08 --- DailyRoutineBug.zip
    2. Import them.
    3. Start Easer.
    4. Wait (Easer ran at least one day before the bug appeared, so guess it happens if the day before was a weekday and the current day is weekend/saturday).
    5. Enjoy the bug!

    Expected behavior My expectation iis that a script isn't evaluated unless at least one of its direct predecessors was evaluated as true, i.e. there has to be a chain of (only) hreen dots/"LEDs" up to the root.

    Error log: Unfortunately, I hadn't activated the error log. Now I did, and I will add one if the bug happens next time.

    Extra phone info (please complete the following information):

    • ArrowOS 11
    • Poco X3
    • rooted by Magisk
    bug 
    opened by just-Nob 13
  • Crash when opening `Pivot`

    Crash when opening `Pivot`

    Describe the bug I played around with the scripts and data. Now the app crashes when I tap to open Pivot.

    Error log:

    ACRA caught a IndexOutOfBoundsException for ryey.easer
    java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
    	at java.util.ArrayList.get(ArrayList.java:411)
    	at de.blox.graphview.o.l.U(SugiyamaAlgorithm.java:14)
    	at de.blox.graphview.o.l.d(SugiyamaAlgorithm.java:21)
    	at de.blox.graphview.o.l.i(SugiyamaAlgorithm.java:1)
    	at de.blox.graphview.o.l.c(SugiyamaAlgorithm.java:7)
    	at de.blox.graphview.b.d(BaseGraphAdapter.java:2)
    	at de.blox.graphview.g.onMeasure(GraphNodeContainerView.java:32)
    	at android.view.View.measure(View.java:21307)
    	at android.view.ViewGroup.measureChild(ViewGroup.java:6414)
    	at android.view.ViewGroup.measureChildren(ViewGroup.java:6391)
    	at d.e.a.g.onMeasure(ZoomLayout.kt:7)
    	at android.view.View.measure(View.java:21307)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6443)
    	at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    	at android.view.View.measure(View.java:21307)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6443)
    	at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    	at android.view.View.measure(View.java:21307)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6443)
    	at androidx.coordinatorlayout.widget.CoordinatorLayout.J(CoordinatorLayout.java:1)
    	at com.google.android.material.appbar.b.m(HeaderScrollingViewBehavior.java:15)
    	at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:34)
    	at android.view.View.measure(View.java:21307)
    	at androidx.drawerlayout.widget.DrawerLayout.onMeasure(DrawerLayout.java:43)
    	at android.view.View.measure(View.java:21307)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6443)
    	at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    	at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:21)
    	at android.view.View.measure(View.java:21307)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6443)
    	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
    	at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
    	at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
    	at android.view.View.measure(View.java:21307)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6443)
    	at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    	at android.view.View.measure(View.java:21307)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6443)
    	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
    	at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
    	at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
    	at android.view.View.measure(View.java:21307)
    	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6443)
    	at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    	at com.android.internal.policy.DecorView.onMeasure(DecorView.java:916)
    	at android.view.View.measure(View.java:21307)
    	at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2644)
    	at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1697)
    	at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1952)
    	at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1569)
    	at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7301)
    	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:930)
    	at android.view.Choreographer.doCallbacks(Choreographer.java:705)
    	at android.view.Choreographer.doFrame(Choreographer.java:640)
    	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:916)
    	at android.os.Handler.handleCallback(Handler.java:751)
    	at android.os.Handler.dispatchMessage(Handler.java:95)
    	at android.os.Looper.loop(Looper.java:154)
    	at android.app.ActivityThread.main(ActivityThread.java:6816)
    	at java.lang.reflect.Method.invoke(Native Method)
    	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1563)
    

    Extra phone info (please complete the following information): Easer 0.8.2.3 from F-droid on Android 7.1 by Samsung

    Extra logs (optional):

    This is logs_0.csv

    1669222783583,2022.11.23 17:59:43.583,ASSERT,PRETTY_LOGGER,======Easer started======
    1669222784001,2022.11.23 17:59:44.001,ASSERT,PRETTY_LOGGER,======Easer started======
    1669222784021,2022.11.23 17:59:44.021,INFO,PRETTY_LOGGER,InterruptionFilterSwitcherService onCreate()
    1669222784035,2022.11.23 17:59:44.035,INFO,PRETTY_LOGGER,NotificationEventListenerService onCreate()
    1669222787011,2022.11.23 17:59:47.011,DEBUG,PRETTY_LOGGER,Permission for plugin <call> not satisfied
    1669222787019,2022.11.23 17:59:47.019,DEBUG,PRETTY_LOGGER,Permission for plugin <sms> not satisfied
    1669222787029,2022.11.23 17:59:47.029,DEBUG,PRETTY_LOGGER,Permission for plugin <send_sms> not satisfied
    1669222787034,2022.11.23 17:59:47.034,DEBUG,PRETTY_LOGGER,Permission for plugin <call> not satisfied
    1669223046982,2022.11.23 18:04:06.982,ASSERT,PRETTY_LOGGER,======Easer started======
    1669223046990,2022.11.23 18:04:06.990,INFO,PRETTY_LOGGER,InterruptionFilterSwitcherService onCreate()
    1669223047004,2022.11.23 18:04:07.004,INFO,PRETTY_LOGGER,NotificationEventListenerService onCreate()
    
    bug 
    opened by opk12 0
  • [FR] Multiple conditions?

    [FR] Multiple conditions?

    Is your feature request related to a problem? Please describe. I would like to create a condition for any event in a selection of calendars. The goal is that whenever an event in a calendar is occurring, the device enters "do not disturb" (DND).

    Describe the solution you'd like I would like that the calendar condition allows selection of multiple calendars, or even better, that one can create a composite condition using OR/AND rules over other conditions

    Describe alternatives you've considered [optional] I've tried turning on DND whenever an event in any calendar of interest starts, and turning DND off when any of said events finishes. The problem is that overlapping events make this scheme unreliable and erratic.

    Additional context

    feature request 
    opened by javiertury 0
  • Wiki pages vandalized

    Wiki pages vandalized

    I came to the wiki to understand how to use this app, but the most recent version of the wiki homepage is empty: image

    The wiki history has some concerning commits, including destruction of usage example: image

    The user in question does not seem to have a Github profile.

    opened by qwrwed 1
  • [FR]

    [FR] "wait" profile command

    In home wifi wireguard gets activated due to almost concurrent calls (same second) to start/stop VPN. Second call is lost while VPN is being established.

    I have a configuration depending a condition matching the SSID. If matched, turn off wireguard, else turn on wireguard. The phone apparently detects a brief wifi outage (<1s) which then triggers the wireguard on script. However, immediately, wifi connection is restored triggering the off script. Wireguard is still busy establishing the tunnel and so ignores the second call. As a result, VPN is enabled in home wifi :-|

    Manually triggering a refresh on the home screen "fixes" the situation and correctly turns VPN off.

    It would be good to prevent the same chain to be evaluated for some time (few seconds) or the same target to be triggered.

    A simple solution could be a "wait" profile command.

    feature request 
    opened by snak3b1te 0
  • Improving the usage example

    Improving the usage example

    I have just attempted to set up my first easer profile, following

    https://github.com/renyuneyun/Easer/wiki/Usage-example

    I'm not sure if it has worked yet (UPDATE - it hasn't worked despite easer saying it ran - it says Status: Satisfied) and I had the following questions:

    On the main Outline page where it shows the run status, if I click 'See Details' I have an Operation called 'Run commands' which has its check box ticked but it doesn't have a green tick next to the check box. Does this mean that any events that I create that try to run legit shell commands will fail?

    Do I need to install busybox or something to use the 'Run commands' event and get a green tick next to it? You should label the two columns of ticks on that page. What do the two columns mean? My guess is that the left column of ticks on this page is if the correct permissions are enabled the the right column is to enable and disable that operation for all profiles? Hmm, I'm not sure that makes sense to me so it can't be that.

    When creating a timer we have the option to create an inexact timer instead of an exact one. Why would anyone want to choose to create an inexact timer?

    Similarly, when creating a script event I can set it to being volatile or persistent. What is the difference? Volatile sounds risky.

    Something not mentioned in this guide at all that I think I've seen you say elsewhere in the docs is that you seem to indicate we can't trigger profiles/events more frequently than once every 3 minutes? Is that correct? That would seem to clash with it seeming to support creating profiles that would run once every second. What is the minimum allowed time to repeat executing profiles/events?

    The guide says "Move to Event page" but this is a bit unclear, it should say something like "open the hamburger / side menu, select Data then open the Event tab.

    I may rewrite the whole guide if I can get easer working for my use case.

    Thanks!

    bug 
    opened by danboid 1
Releases(v0.8.3-beta)
  • v0.8.3-beta(Apr 24, 2022)

  • v0.8.2.3(Apr 24, 2022)

    Bug fixes && dev changes && i18n update && Update AppIntro && Update docs

    • Fix successor scripts incorrectly retained (#414)
    • Fix incorrectly multiple triggering of conditions (root cause of #414)
    • Fix incorrect finding of shared/reused skill data (esp. intent) (#401)
    • Dev changes
      • Better documentation
      • Refactored CountedLotus to LogicManagedLotus
    • I18n updates: Hebrew, Portuguese (Brazil), Spanish (Latin America), Vietnamese, Italian
    • Update AppIntro to 5.1.0
      • Fixes the problem when building
    • Update welcome message related to logic
      • It is a graph already
    Source code(tar.gz)
    Source code(zip)
    Easer-v0.8.2.3.apk(3.40 MB)
  • v0.6.1(May 21, 2018)

  • v0.6(May 21, 2018)

    • v0.6: Add ConditionEvent (enter/leave) && Go back when pressing "back" && Do not clear log when reloading service && Various fixes && Dev changes

      • Add ConditionEvent - Events for Condition state
        • Enter Condition and Leave condition
      • Go to previous page / fragment when pressing "back" button
      • Do not clear log when reloading EHService
        • The log is kept to at most 1000 entries
        • The log will be lost if EHService is freed
      • Fixes
        • Fix title and navigation drawer behavior of Activity Log
        • Fix unexpected reloading of scripts when switching pages
        • Fit spinners when editing Script into screen
        • Make "reverse" work for Condition
        • Fix BatteryTracker.state()
      • Dev changes
        • Move ConditionHolder to a separate Service
    • v0.5.9.1: Allow to restart after update && Fix Events not triggered sometimes && Do not trigger TimeEventPlugin for the past time of the current day

      • Allow to restart service after updating app (changeable in settings)
      • Fix "reversed" Events not triggered at the first time
      • Do not trigger TimeEvent if the current time is later than the designated time
        • Skip the trigger for that day (i.e. move to the next day)
      • Add tests
    Source code(tar.gz)
    Source code(zip)
    Easer-v0.6.apk(1.67 MB)
  • v0.5.9(May 12, 2018)

    • v0.5.9: Add Condition mechanism && Add BatteryConditionPlugin && Fix importing / exporting due to storage change
      • Add Condition mechanism, as a complementary of Event
        • Condition represents for "state", and Event will be changed to represent real one-shot events
      • Add BatteryConditionPlugin
      • Fix importing / exporting, which was broken because of naming change (event -> script)
    Source code(tar.gz)
    Source code(zip)
    Easer-v0.5.9.apk(1.66 MB)
  • v0.5.8(May 6, 2018)

    Required data storage update

    CHANGELOG

    • v0.5.8: Rename the UI component "Event" to "Script" && Activity Log && New plugins (UiModeOperationPlugin & ScreenEventPlugin) && Allow to assign delay to set bluetooth volume && Little UI update

      • Rename the UI component "Event" to "Script" to avoid confusion to "scenario" (and also for future needs)
      • New page (Activity Log) for Easer's activity log
      • New plugin UiModeOperationPlugin for Android UI mode (e.g. car mode and normal mode)
      • New plugin ScreenEventPlugin for screen on / off
      • Allow to assign delay when setting bluetooth volume
      • Add divider when selecting Operation
    • v0.5.7.1: Fix bluetooth volume not changing && Fix crash when rotating && Code clean up

      • Fix VolumeOperationPlugin changing bluetooth volume
      • Fix crash when rotating device on Edit{Event,Profile}Activity
      • Code clean up
        • Remove unneeded and deprecated API a little bit
    Source code(tar.gz)
    Source code(zip)
    Easer-v0.5.8.apk(1.65 MB)
  • v0.5.7(May 6, 2018)

    • v0.5.7: Remove deprecated classes && Add LaunchAppOperationPlugin && Add Bluetooth to VolumeOperationPlugin && Dev changes

      • Remove deprecated interfaces / classes
        • Remove XmlDataStorageBackend
        • Remove EventType
      • New Operation: Launch App (LaunchAppOperationPlugin)
      • Allow to adjust Bluetooth volume in VolumeOperationPlugin
      • Dev changes:
        • New script to automatically create templates for new OperationPlugin (!!)
        • Remove StorageData.parse()
          • StorageData can not have their fields declared final in principle (!)
        • Remove DataFactory.emptyData() && clean up empty constructors
    • v0.5.6.1: Switch between 12-hour and 24-hour clocks && Better MediaControlOperationPlugin for Lollipop+ && Update Danish translation && Minor changes

      • Allow to change between 12-hour and 24-hour clocks in Settings
      • Use MediaSessionManager for Lollipop+ (API 21+) for better media control
      • Update Danish translation (thanks to twikedk)
      • Remove static variable running in some NotificationListenerServices in favor of PackageManager detection
    Source code(tar.gz)
    Source code(zip)
    Easer-v0.5.7.apk(1.61 MB)
  • v0.5.6(May 6, 2018)

    • v0.5.6: Add the ability to control volume && Allow to customize Do Not Disturb mode (Ringer Mode) && Drop unneeded menus

      • Add VolumeOperationPlugin to control volume
      • Allow to customize Do Not Disturb mode in RingerModeOperationPlugin
      • Drop unneeded menus / menu items (because their usage is already in somewhere else)
        • Drop the menu (which contains only "Add") in the list of Profile / Event / Scenario
        • Drop menu item "About" in Outline
      • Dev changes
        • Add forgotten tests
        • Move a class to the correct package
    • v0.5.5.4: Use the newest WiFi scan result && Validate data before importing && Check permission before importing and exporting && Danish translation && Minor changes

      • Request to scan for WiFi APs when obtaining WiFi list
      • Validate data before actually importing
        • Prevents from importing if the data is invalid
      • Request for relevant permissions before importing and exporting data
      • Add Danish translation (thanks twikedk)
    • v0.5.5.3: Widen "cooldown" && Alert for the change in v0.5.7 && Developer changes

      • Widen the range of "cooldown": when setting "satisfied" and "unsatisfied", they both check cooldown
      • Alert for the drop of Event Type in v0.5.7
        • Also pin the removal of old (XML) data format in v0.5.7
      • Developer changes:
        • Remove several no longer needed / unneeded methods
        • Better advanced Scenario condition checks
          • Check "satisfied" when checking "persistent" in slots
    • v0.5.5.2: Fix "reversed" & "passive mode" && Better handling of WifiConnSlot

      • Fix "reversed" not working
      • Fix reversed "passive mode" (correct the semantics of "passive mode")
      • Do not check unneeded conditions for WifiConnSlot
    • v0.5.5.1: Better looking when editing Events with larger fonts && Correct NotificationEventPlugin's compatibility check && Check all plugins' permissions when logging is enabled && Developer/Debug changes

      • Use GridLayout for the top few elements on EditEventActivity
        • Let some UI elements adjust themselves on EditEventActivity
        • Looks better on larger fonts
      • Check all plugins' permissions when logging enabled
        • This will log all (enabled) plugins with insufficient permission
        • When logging is disabled, the performance is not affected
      • Correct NotificationEventPlugin's compatibility check
        • It's only valid on KitKat+
        • It could support JellyBean in principle, and this may be implemented in the future
          • Or, it may also be implemented together with the support of older devices
      • Dev/Debug changes:
        • Simplify NotificationEventPlugin's definition
        • Move SettingsHelper to outer package && Move one function to it
        • Better debugging messages
    Source code(tar.gz)
    Source code(zip)
    Easer-v0.5.6.apk(1.61 MB)
  • v0.5.5.1(Feb 22, 2018)

    Better looking when editing Events with larger fonts && Correct NotificationEventPlugin's compatibility check && Check all plugins' permissions when logging is enabled && Developer/Debug changes

    • Use GridLayout for the top few elements on EditEventActivity
      • Let some UI elements adjust themselves on EditEventActivity
      • Looks better on larger fonts
    • Check all plugins' permissions when logging enabled
      • This will log all (enabled) plugins with insufficient permission
      • When logging is disabled, the performance is not affected
    • Correct NotificationEventPlugin's compatibility check
      • It's only valid on KitKat+
      • It could support JellyBean in principle, and this may be implemented in the future
        • Or, it may also be implemented together with the support of older devices
    • Dev/Debug changes:
      • Simplify NotificationEventPlugin's definition
      • Move SettingsHelper to outer package && Move one function to it
      • Better debugging messages
    Source code(tar.gz)
    Source code(zip)
    Easer-v0.5.5.1.apk(1.59 MB)
  • v0.5.5(Feb 22, 2018)

    Add EventControlOperationPlugin && Introduce format expression && Add 'passive mode' setting && Fix UI problem when requesting permission && Dev changes

    • Add EventControlOperationPlugin to be able to change Events' status
    • Introduce format expression for many user-input fields
      • Current supported expressions are:
        • %DATE% for current date (yyyy-MM-DD)
        • %TIME% for current time (HH-mm-ss)
    • Add 'passive mode' setting
      • When setting to passive mode, Easer won't check the initial status, but would only listen to new events thereafter
    • Fix unable to set enabled/disabled state for plugin views after requesting permission
    • Dev change: simplify several plugins
    Source code(tar.gz)
    Source code(zip)
    Easer-v0.5.5.apk(1.59 MB)
  • v0.5.4(Jan 30, 2018)

    Restore the old definitions for inline Scenarios && Add TcpTripEventPlugin && Various changes


    • Restore the old definitions of "repeatable" and "persistent" when using inline Scenarios
      • They were overridden previously when introducing Scenario
      • The ability to do advanced customization (e.g. "repeatable" and "persistent") is now only available to explicit Scenarios
    • Add TcpTripEventPlugin to perform TCP communication and check its success and reply data
      • When not checking reply data, if the packet is successfully sent, it is considered as "true"
      • When checking reply data, only when the actual reply data "startswith" the designated data, it is considered as "true"
    • Make some methods in AbstractSlot (e.g. listen()) run in separate threads
      • This shall make EHService run slightly faster
      • Does not affect the implementation of subclasses of AbstractSlot
    • Remove useless section in the data of Events with inline Scenario
    • Developer changes
      • See git's log
    Source code(tar.gz)
    Source code(zip)
    Easer-v0.5.4.apk(1.58 MB)
  • v0.5.3.2(Jan 29, 2018)

  • v0.5.3.1(Jan 23, 2018)

    Use this version instead of v0.5.3 if you are intended to use the features introduced in v0.5.3 of Easer.

    Various fixes to v0.5.3


    • Fix "import" not working correctly
      • due to the wrong handling of directory entry in zip)
    • Fix crash when trying to open an existing Profile
      • due to the wrong design of DelayedJob
    • Fix incorrect convertion of data formats
      • Inline Scenarios should be kept when editing an EventStructure

    These are discoverd from #56. Thanks @craftyguy :)

    Source code(tar.gz)
    Source code(zip)
    Easer-v0.5.3.1.apk(1.57 MB)
  • v0.5.3(Jan 22, 2018)

    v0.5.3.1 is the patched version of v0.5.3. It's extremely recommended to use v0.5.3.1 instead of v0.5.3.

    Do not use the "convert" function in this version or your data will be corrupted.

    Add Scenario to allow reuse of event data && Add more configurations to events && Fix import not working correctly && Code refactor


    • Add Scenario as an abstraction of EventData and allow EventStructure to link to it
    • Add reverse to directly reverse the Scenario
    • Add repeatable, persistent as more granulated configuration to events
    • Fix importing not working correctly due to filesystem handling
    • Code factor
      • Extract more abstract classes and generics
    Source code(tar.gz)
    Source code(zip)
    Easer-v0.5.3.apk(1.57 MB)
  • v0.5.2(Jan 12, 2018)

    Add "cool down" (seconds) && Allow to match BSSID for WiFi Event && Check permissions before enabling plugins && fixes & improvements

    • Add "cool down" time (in seconds) for the re-activation of the same event
    • WifiEventPlugin can now handle BSSIDs
      • If you need to match BSSID and ESSID, you will need two chained events
    • Check (and require) permissions before enabling plugins in Settings
    • Fix NfcEventPlugin (which wasn't really working previously)
    • Code improvements
      • See 00fa3a6
    Source code(tar.gz)
    Source code(zip)
    Easer-v0.5.2.apk(1.56 MB)
  • v0.5.1(Dec 29, 2017)

    Change a bit of plugins' definition (mainly generify and remove unneeded methods) && Add HeadsetEventPlugin && Code clean up

    • Add DataFactory (and subclasses) to be used as a wrapper of StorageData (and subclasses)
    • Generify PluginDef, PluginViewFragment, DataFactory (and subclasses) to use their related StorageData as the type parameter (so that there is no need to do lots of manual type casting and checking)
      • Fix classes using them to satisfy generics
    • Add HeadsetEventPlugin to listen to headset plug in and plug out
    • Remove redundant wrapper (OperationLoader.load())
    • Add ValidData annotation to describe that the data is "valid"
    Source code(tar.gz)
    Source code(zip)
    Easer-v0.5.1.apk(1.55 MB)
  • v0.5(Dec 29, 2017)

    Add Timer and NFC Event & Set alarm Operation && Fix leaked BroadcastListener && Fix "unsatisfied" not triggered && Better UI for settings page

    • Add TimerEventPlugin to set a timer which allows delaying for a few time
    • Add NfcTagEventPlugin to listen to NFC tag being scanned
    • Add AlarmOperationPlugin to set alarm
    • Fix leaked BroadcastListener in two classes (should benefit battery consumption)
    • Fix "unsatisfied" not trigger (fix part of the desired function)
    • Better UI for settings page
      • Add spaces between each categories
      • Fix translation
      • Add "back" to the UI
    • Fix title for "settings" and "about"
    Source code(tar.gz)
    Source code(zip)
    Easer-v0.5.apk(1.53 MB)
  • v0.4.9(Dec 29, 2017)

    Add Event for listening to notifications and Operation for sending notifications && Add a setting entry for enabling / disabling plugins && Add compatibility checking for plugins && Inform future changes && Bug fixes

    • Add NotificationEventPlugin to listen to notifications and SendNotificationOperationPlugin to post notifications
    • Add a setting entry to enable or disable plugins
    • Add PluginDef.isCompatible() to check for the compatibility of plugins before using them
    • Add a prompt screen to inform the user about possible future changes and actions to take
      • Currently, v0.5 (or later) will drop the support for old data formats, so users should convert the old formats to new formats (by using the conversion provided in the setting screen).
    • (Lollipop+ / SDK 21+) Fix the function of RingerModeOperationPlugin to set to silent mode
    • Fix the problem of re-requesting permissions
    • (dev) Explicitly fix 0 as infinity for OperationPlugin.maxExistence()
    • (dev) Remove the ordering of plugins from PluginRegistry (moved that to where it is needed)
    Source code(tar.gz)
    Source code(zip)
    Easer-v0.4.9.apk(1.51 MB)
  • v0.4.8(Dec 29, 2017)

    Run multiple commands in one process && multiple developer changes

    • CommandOperationPlugin now runs multiple commands in one process, which allows inputting data into an interactive shell
    • Developer changes
      • Make StorageData Parcelable
        • Implement that in all subclasses
        • Add tests for them
      • Change Map to Set in CalendarEventData (for the condition) (as well as in the test)
      • Add many nullality annotations to plugins (including data and views)
      • Use exception instead of null for data retrival (this seems to be more natural in Java)
      • Resolve some lint warnings
        • Make the Handler in ryey.easer.plugins.operation.brightness.DumbSettingBrightnessActivity static
        • Add some finals
        • Use StringBuilder in some places (instead of raw String manipulation)
        • Fix a few javaDoc
        • Use explicit locales
        • Use new API instead of old API (Fragment.onAttach())
        • Remove casts of findViewById() (because from API 26 that cast is no longer required)
        • Better access modifiers
        • Minor fixes and clean-ups
    Source code(tar.gz)
    Source code(zip)
    Easer-v0.4.8.apk(1.49 MB)
  • v0.4.7(Dec 29, 2017)

    Require permissions during runtime && fix several bugs

    • Add permission checking and requesting codes for each plugin
    • When loading the plugin's view, its permission is checked and requested (if necessary)
    • Request root permission when enabling "root features"
    • Fix incorrect root usages for {AirplaneMode,Cellular,Command}Operationplugin
    • Fix "root preference" of CommandOperationPlugin
    Source code(tar.gz)
    Source code(zip)
    Easer-v0.4.7.apk(1.41 MB)
Owner
Rui Zhao
PhD student at UEdin; Archlinux user
Rui Zhao
Android application for GitHub user search and view user details

GitHubApp Android application for GitHub user search and view user details Architecture UI observing the live data for the main list as received from

null 1 Mar 29, 2022
LocationPhoneMode - The app will ask the user to allow it to track the user location

LocationPhoneMode The app will ask the user to allow it to track the user locati

null 1 Jan 11, 2022
An App based on MVVM architecture to track & store a user's runs using Google Maps, with options to view & sort the runs as per the user's choice along the with option to run the app in background.

An App based on MVVM architecture to track & store a user's runs using Google Maps, with options to view & sort the runs as per the user's choice along the with option to run the app in background.

Harshit Maheshwari 1 Jun 9, 2022
The Android Trivia application is an application that asks the user trivia questions about Android development

The Android Trivia application is an application that asks the user trivia questions about Android development. It makes use of the Navigation component within Jetpack to move the user between different screens. Each screen is implemented as a Fragment. The app navigates using buttons, the Action Bar, and the Navigation Drawer.

Srihitha Tadiparthi 1 Feb 10, 2022
HideDroid is an Android app that allows the per-app anonymization of collected personal data according to a privacy level chosen by the user.

HideDroid An Android App for preserving user privacy HideDroid is an Android app that allows the per-app anonymization of collected personal data acco

null 100 Dec 12, 2022
An android app that show us nike products and user can buy them or add to shopping cart.

Nike Store-Android-App An android app that show us nike products and user can buy them or add to shopping cart. Screenshots Libraries included Materia

mojtaba joshaghani 9 Aug 13, 2022
An android app that displays statistics about covid-19 vaccinations and enables the user to make a dummy appointment.

AndroidApp An android app that displays statistics about covid-19 statistics and enables the user to make a dummy appointment. This a simple android a

Thodoris Kanellopoulos 7 Oct 2, 2022
Realtime SOS Android Application. Location (GPS + Cellular Network) tracing application by alerting guardians of the User.

WomenSaftey Women Safety Android Application: Realtime SOS Android Application. Designed a Location (GPS + Cellular Network) tracing application by al

jatin kasera 6 Nov 19, 2022
Android-Java-App - Notepad app with user and password. SQL Lite

DVNote2 App Android-Java-App Notepad app with user and password Application made in Android Studio with Java language and SQLite database. How does it

DViga 1 Nov 6, 2021
Sanctuary relies on the Android Work Profile APIs to create a self-contained work profile on a user's personal device.

Sanctuary relies on the Android Work Profile APIs to create a self-contained work profile on a user's personal device. Managed apps, data, and management policies are restricted to the work profile, keeping them secure and separate from personal data while maintaining user privacy.

Jonathan Odul 1 Dec 15, 2021
A GitHub user Android apps using Dagger 2, MVVM, Modularization, Clean Architecture, and Airbnb Epoxy

A GitHub user Android apps using Dagger 2, MVVM, Modularization, Clean Architecture, and Airbnb Epoxy.

Alva Yonara Puramandya 3 Dec 28, 2022
This projects implements Github User search with Android Pagination 3 Library

GithubUser Search An Android App that lists the github users sorted by most followers Resources GitHub API Building Clone the git repository Build ./g

Siyanatullah Khan 3 Oct 12, 2022
Android Application for a user’s favorite Movies, TV shows and Anime while keeping up to date with the latest releases.

Android Application for a user’s favorite Movies, TV shows and Anime while keeping up to date with the latest releases.

PEC ACM CSS 20 Dec 26, 2022
An android app written in Kotlin Programming language which a user can use to store his/her monthly expenditure.

#Expenditure-Tracker An android app that allows the user to input , edit , view his/her expenditures for each month. Languages Used - Kotlin UI develo

Priyansh Agarwal 2 Aug 21, 2022
:blue_book: A diary application optimized for user experience.

Easy Diary README of Korean(한국어) This is a diary application optimized for user experience. Demo videos Basic function preview Support Features 01. Wr

Bulbasaur 313 Dec 13, 2022
The app has got fullscreen Turkey map via Huawei Map. App selects random province and shows it borders on the map than user will try to guess the provinces name.

Il Bil App Introduction I will introduce you to how to implement Account Kit, Map Kit, Game Service. About the game: The app has got fullscreen Turkey

Gökhan YILMAZ 4 Aug 2, 2022
A calculator for quick simple calculations with a nice user interface and no ads

Simple Calculator A calculator with the basic functions and a customizable widget. You can copy the result or formula to clipboard by long pressing it

Simple Mobile Tools 482 Dec 31, 2022