Code Monkey home page Code Monkey logo

alarmio's Introduction

Alarmio Build Status Discord Liberapay

Alarmio is a simple alarm clock that implements many useful features while following regular design standards to ensure that it is quick and intuitive to use.

Screenshots

Home Alarms Timers Themes Ringing
img img img img img

Installation

Get it on F-Droid Get it on Google Play

Alternatively, you can download the latest APK from the GitHub releases.

Pricing

Alarmio is, of course, completely free to download and use from either the GitHub Releases, F-Droid, or my website. However, it is approximately US$1.99 to install it through Google Play. Why is this?

Essentially, when you pay the $1.99 to download the app from the Play Store, you are not paying for the right to use the app. That model has been broken for a long time - even properly obfuscated applications are often trivial to "crack" through many tools available today, and it is no longer viable to ensure that every customer downloads your app through the Play Store and nothing else. Rather, what you are paying for is "support" - replies to your reviews, quicker responses when you send me an email, and the effort of dealing with Google Play as a method of distribution (it's a bit of a pain sometimes).

Permissions

  • SET_ALARM, VIBRATE, WAKE_LOCK: uh, this should be obvious
  • ACCESS_COARSE_LOCATION: determining automatic sunrise/sunset times for "scheduled" light/dark themes
  • INTERNET: obtaining a set of sunrise/sunset times (location data is not shared outside of the device), as well as fetching graphical assets and some of the information in the about page
  • RECEIVE_BOOT_COMPLETED: re-schedule alarms on startup
  • READ_EXTERNAL_STORAGE: used to set custom background / header images in the settings
  • FOREGROUND_SERVICE: used to notify you to sleep - see the "Sleep Reminder" option in the settings
  • REQUEST_IGNORE_BATTERY_OPTIMIZATIONS: see dontkillmyapp.com

How to Contribute

Alarmio is written by users - everyone working on this project (including myself) is motivated entirely by their own needs and ideals. There is no professional support line to handle complaints or paid development team to fix bugs. Anyone that volunteers their time and expertise to improve this app does so without any obligation or commitment to the users of this software.

As a contributor, you are highly valued - any contribution, no matter how small, misled, or incorrectly formatted, is welcome. We'd much prefer to work together and resolve an issue than turn any genuine effort away. If you need help with this process, have any questions or confusion, or want to get feedback before a contribution, please don't hesitate to get in touch. (either discord or email work fine)

Example contributions

  • Development: Developers can help Alarmio by fixing bugs, implementing features, or helping to debug & research new issues. I'm hoping to write a complete guide to this process in the future - for now, please refer to CONTRIBUTING.md.
  • Design: Alarmio should be intuitive and accessible to a wide variety of users - suggestions to improve certain interfaces are always welcome. This includes compatibility with screen readers, problems with contrast / color blindness, and the sizing/positioning of touch targets in the app - many of which are shamefully untested in Alarmio's present state.
  • Helping users: Often times, issues are created that go untouched for a couple days due to various factors, when they could be resolved immediately. Responding to obvious questions and identifying duplicate issues can be immensely helpful in reducing the workload on other maintainers and developers.
  • Filing issues: Accurately reporting bugs and edge cases you experience can drastically reduce the amount of work we need to do to identify a problem. Providing relevant info - the name & manufacturer of your device, its Android version, the version of Alarmio the bug was encountered in, and a thorough description of how to reproduce it - helps others to understand what the issue is and how it could be solved. If you want to go the extra mile, screen recordings and logcat info are often immensely helpful. Please be sure to check that there isn't already an open issue describing your problem, though!
  • Localization: If Alarmio doesn't have support for your fluent language(s), please consider translating it! Most in-app text is stored in strings.xml - this file should be copied to ../values-{lang}/strings.xml when translated. (this is an absurdly concise explanation - if this isn't clear, simply sending us translations in a new issue or email is perfectly fine!)
  • Documentation: Writing guides and explanations of how Alarmio works, how to use it, and how to contribute to it, can go a long way to ensuring its usefulness and stability in the future. Whether this involves an update to the README, a tutorial for users and contributors, or adding Javadocs & comments to undocumented functions in the app - anything is valid!

Other ways to support Alarmio

Not everyone has the time or technical knowledge to help out with many of the above - we understand that. With this in mind, here are a few other ways to help us out that don't require as much time or dedication.

  • Advertising: Spread the word! If you like what we're doing here, getting more people involved is the best way to help improve it. Suggestions include: posting on social media... writing a blog post... yeah, right, you get the idea.
  • Donations: I've invested a lot of time into this app - as have many of its contributors. Many of us have paying jobs, difficult classes, or otherwise important life occurrences that prevent us from putting all our time into software. Supporting us helps to fund the time we spend building an open source alarm clock when we could be doing... literally anything else :)
  • Politics: Yep, you're reading this right. Free software is, in fact, a very political thing - and I'd like to think we're taking the right approach to it. If you're in a position to do so, I recommend supporting FOSS applications and services over their proprietary counterparts. In addition, similar movements that support user freedom - many supported by the SFC or EFF, as well as Right to Repair - would benefit from increased awareness and advocacy.

Acknowledgements

I'd like to give a huuuuuge thanks to all of Alarmio's contributors, the developers that write the software we depend on, and the users that support our goal. Also, props to the F-Droid team for maintaining the free software repository that distributes our app and many others like it.

I've received a lot of thanks from various people for the time I've put into this, and that thought helps me get up in the morning. If someone fixes a bug you encountered, helps you out in an issue, or implements a feature you enjoy, please consider sending them a tip or a thank-you note to let them know that you appreciate their time :)

Contributors: feel free to create a PR to add/edit your listing here, as well as in the app (attribouter.xml).

Contributors

Translators

Related Work

  • @ajayyy is maintaining a fork of Alarmio that forces you to dismiss the alarm from another device: AlarmioRemote

alarmio's People

Contributors

ajayyy avatar fennifith avatar friederzi avatar ikanakova avatar larnicone avatar meskobalazs avatar pablomeza10 avatar poussinou avatar quipri avatar raboof avatar suburbanno avatar theonesean avatar yzqzss avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

alarmio's Issues

Snooze

Device Info

  • Brand: Nokia
  • Model name: Nokia 6.1
  • Android version: Android 9

Steps to Reproduce

  • Add new alarm
  • Snooze alarm

Expected behaviour

Silence for 2 minutes until repeat alarm.

Actual behaviour

The alarm clock (timer) is still ringing: video
Note: This ringing is different than adjusted alarm sound - it is system notification sound.

Android Q Compatibility

Activities can no longer be launched while the app is in the background. I'm not sure how this affects AlarmManager (an activity launched directly by the system might be okay), but Alarmio will probably have to change its behavior of starting a BroadcastReceiver before checking the alarm and having that start the alarm activity. Rip.

Internet Radios Don't Work

Pretty sure this is just a bad implementation of ExoPlayer. I'll need to spend a couple minutes to do a proper dive into its documentation when I get the time and check that I'm doing everything properly.

F-droid publication

It'd be really to have this in F-droid!

I don't believe there's anything blocking this from being published there. ;)

UI Prompt for Battery Optimizations

Hello again, just wanted to point out, that with some more conservative cpu profiles, the app does miss some of the alarms which results,-you can guess- "missing the lecture" issue, I've tested it with some other clock-apps and noted that it didn't happen, secondly I disabled the battery optimizations of the app, hoping to avoid this issue, it worked so far, will report further. Maybe this should be implemented(asking to disable the battery optimizations at start).
Thanks for your work.

[Feature Request] Restore Background Image / default settings

I can't restore default Background Image or default settings.

Device Info

  • Brand: Nokia
  • Model name: Nokia 6.1
  • Android version: Android 9

Steps to Reproduce

  • download the app
  • change background image in menu Settings
  • try restore default image or default settings.

Repeat launches two alarms

On my Pixel 3, when repeat is enabled and the alarm rings, two alarms are launched. Somehow one of them dies on it's own pretty quickly (I only realized this was happening due to using a breakpoint). Is this intended behavior? It seems like the new alarm is added so quickly that it also gets triggered. This currently breaks the "increasing volume" I implemented, do to race conditions around checking appropriate volume levels.

AlarmActivity icons not themed correctly

The icon contrast is off. The icons should be white on the dark themes & dark on the light themes, like the rest of the app. I'm pretty sure all that needs to be changed for some of these is adding the ":aesthetic_ignore" tag like a few other views so Aesthetic doesn't auto-theme them, but the FAB might need more work.

Switch FAB library

Unfortunately, while it still functions perfectly fine, jahirfiquitiva/FABsMenu is no longer maintained in favor of other projects like leinardi/FloatingActionButtonSpeedDial. I'm not entirely in favor of this, as the current dynamic theming implementation seems like it will be fairly convoluted to implement, but I will have to switch to a properly maintained library eventually.

Oreo Background Restrictions

The sleep reminder service doesn't like to start when the app is in the background for some reason. Might have to create a broadcast receiver to decide whether to start the service in the foreground first so that it doesn't crash.

Time Zone Dialog is Glitchy

Can't remember how I managed to make it do this, but the bottom of the dialog (in the settings) flickers a little while items are loading. I might just remake the entire dialog, as there are a few other aspects of the time zone selection that could be made a little more intuitive.

Renaming of alarms fail

If you have more than 1 alarm and want to name every one of them, all get the same name in the end. If you try to delete the wrong name in the other alarm, all names change.

Device Info

  • Brand: Essential Industries
  • Model name: PH1
  • Android version: AOSiP 9

Steps to Reproduce

  • create more than one Alarm
  • try to name one of them
  • see how the others behave

Detailed Audio Options in Ringtone Picker

It seems you can't change the volume of the 'alarms' channel on some skins of Android. Either that or it just isn't very intuitive to do so. Yay, more things to do.

This should also involve the ability to pick which audio stream the alarm will play from; the "alarms" channel should be the default, but media audio would be useful sometimes as well - to play the alarm over a bluetooth speaker, for example.

  • volume selector
  • "stream" chooser (alarm / media channels)

(BUG) The app gets crashes when I click about & OSS licenses

Project Information

Expected behavior

When I click on About & OSS Licenses, the application should not be crashed when I click on About & OSS Licenses should show details of the application

Actual behavior

The app gets crashes when I click about & OSS licenses

How to reproduce

  • open the application

  • Go to the setting

  • click on about & OSS licenses

  • Note the BUG

  • Browser/App version: 1.0.1

  • Operating system: 6.0

Recording Of The Bug

20190608_163718

Logcat

D/AndroidRuntime(32068): Shutting down VM

E/AndroidRuntime(32068): FATAL EXCEPTION: main

E/AndroidRuntime(32068): Process: me.jfenn.alarmio, PID: 32068

E/AndroidRuntime(32068): android.content.res.Resources$NotFoundException: File res/drawable/ic_attribouter_github.xml from drawable resource ID #0x7f080079

E/AndroidRuntime(32068): 	at android.content.res.Resources.loadDrawableForCookie(Resources.java:2946)

E/AndroidRuntime(32068): 	at android.content.res.Resources.loadDrawable(Resources.java:2821)

E/AndroidRuntime(32068): 	at android.content.res.Resources.getDrawable(Resources.java:1050)

E/AndroidRuntime(32068): 	at android.content.res.Resources.getDrawable(Resources.java:1032)

E/AndroidRuntime(32068): 	at android.content.Context.getDrawable(Context.java:403)

E/AndroidRuntime(32068): 	at androidx.core.a.a.a(Unknown Source)

E/AndroidRuntime(32068): 	at androidx.appcompat.widget.i.a(Unknown Source)

E/AndroidRuntime(32068): 	at androidx.appcompat.widget.i.a(Unknown Source)

E/AndroidRuntime(32068): 	at androidx.appcompat.a.a.a.b(Unknown Source)

E/AndroidRuntime(32068): 	at androidx.appcompat.widget.m.a(Unknown Source)

E/AndroidRuntime(32068): 	at androidx.appcompat.widget.n.setImageResource(Unknown Source)

E/AndroidRuntime(32068): 	at me.jfenn.attribouter.f.c.a(Unknown Source)

E/AndroidRuntime(32068): 	at me.jfenn.attribouter.wedges.link.LinkWedge.a(Unknown Source)

E/AndroidRuntime(32068): 	at me.jfenn.attribouter.wedges.link.LinkWedge.a(Unknown Source)

E/AndroidRuntime(32068): 	at me.jfenn.attribouter.wedges.link.LinkWedge.a(Unknown Source)

E/AndroidRuntime(32068): 	at me.jfenn.attribouter.a.a.a(Unknown Source)

E/AndroidRuntime(32068): 	at me.jfenn.attribouter.a.a.a(Unknown Source)

E/AndroidRuntime(32068): 	at androidx.recyclerview.widget.RecyclerView$a.a(Unknown Source)

E/AndroidRuntime(32068): 	at androidx.recyclerview.widget.RecyclerView$a.b(Unknown Source)

E/AndroidRuntime(32068): 	at androidx.recyclerview.widget.RecyclerView$p.a(Unknown Source)

E/AndroidRuntime(32068): 	at androidx.recyclerview.widget.RecyclerView$p.a(Unknown Source)

E/AndroidRuntime(32068): 	at androidx.recyclerview.widget.RecyclerView$p.a(Unknown Source)

E/AndroidRuntime(32068): 	at androidx.recyclerview.widget.RecyclerView$p.c(Unknown Source)

E/AndroidRuntime(32068): 	at com.google.android.flexbox.FlexboxLayoutManager.o(Unknown Source)

E/AndroidRuntime(32068): 	at com.google.android.flexbox.FlexboxLayoutManager.a(Unknown Source)

E/AndroidRuntime(32068): 	at com.google.android.flexbox.d.a(Unknown Source)

E/AndroidRuntime(32068): 	at com.google.android.flexbox.d.a(Unknown Source)

E/AndroidRuntime(32068): 	at com.google.android.flexbox.FlexboxLayoutManager.q(Unknown Source)

E/AndroidRuntime(32068): 	at com.google.android.flexbox.FlexboxLayoutManager.c(Unknown Source)

E/AndroidRuntime(32068): 	at androidx.recyclerview.widget.RecyclerView.N(Unknown Source)

E/AndroidRuntime(32068): 	at androidx.recyclerview.widget.RecyclerView.onMeasure(Unknown Source)

E/AndroidRuntime(32068): 	at android.view.View.measure(View.java:17951)

E/AndroidRuntime(32068): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5797)

E/AndroidRuntime(32068): 	at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)

E/AndroidRuntime(32068): 	at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)

E/AndroidRuntime(32068): 	at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)

E/AndroidRuntime(32068): 	at android.view.View.measure(View.java:17951)

E/AndroidRuntime(32068): 	at androidx.recyclerview.widget.RecyclerView$i.a_(Unknown Source)

E/AndroidRuntime(32068): 	at androidx.recyclerview.widget.LinearLayoutManager.a(Unknown Source)

E/AndroidRuntime(32068): 	at androidx.recyclerview.widget.LinearLayoutManager.a(Unknown Source)

E/AndroidRuntime(32068): 	at androidx.recyclerview.widget.LinearLayoutManager.c(Unknown Source)

E/AndroidRuntime(32068): 	at androidx.recyclerview.widget.RecyclerView.N(Unknown Source)

E/AndroidRuntime(32068): 	at androidx.recyclerview.widget.RecyclerView.q(Unknown Source)

E/AndroidRuntime(32068): 	at androidx.recyclerview.widget.RecyclerView.onLayout(Unknown Source)

E/AndroidRuntime(32068): 	at android.view.View.layout(View.java:16075)

E/AndroidRuntime(32068): 	at android.view.ViewGroup.layout(ViewGroup.java:5300)

E/AndroidRuntime(32068): 	at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)

E/AndroidRuntime(32068): 	at android.widget.FrameLayout.onLayout(FrameLayout.java:514)

E/AndroidRuntime(32068): 	at android.view.View.layout(View.java:16075)

E/AndroidRuntime(32068): 	at android.view.ViewGroup.layout(ViewGroup.java:5300)

E/AndroidRuntime(32068): 	at com.google.android.material.appbar.c.b(Unknown Source)

E/AndroidRuntime(32068): 	at com.google.android.material.appbar.d.a(Unknown Source)

E/AndroidRuntime(32068): 	at com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior.a(Unknown Source)

E/AndroidRuntime(32068): 	at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayout(Unknown Source)

E/AndroidRuntime(32068): 	at android.view.View.layout(View.java:16075)

E/AndroidRuntime(32068): 	at android.view.ViewGroup.layout(ViewGroup.java:5300)

E/AndroidRuntime(32068): 	at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)

E/AndroidRuntime(32068): 	at android.widget.FrameLayout.onLayout(FrameLayout.java:514)

E/AndroidRuntime(32068): 	at android.view.View.layout(View.java:16075)

E/AndroidRuntime(32068): 	at android.view.ViewGroup.layout(ViewGroup.java:5300)

E/AndroidRuntime(32068): 	at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)

E/AndroidRuntime(32068): 	at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)

E/AndroidRuntime(32068): 	at android.widget.Li

Preset Radio Streams

It would be nice to implement a certain amount of "preset" radios streaming various content that the users can choose from, rather than having to locate stream URLs themselves in order to use this feature. I'll list radio streams I'm considering and streams that I am allowed to use (check mark = approved) below:

Streams will be linked to their original source for credit, either through a link in the about section, an info button next to the radio option itself, or both.

Tasker / Webhook Integration

Triggers for when alarms/timers ring, when a stopwatch runs/stops/laps, etc. Main use I can think of right now is turning on all the lights in your room when you're supposed to wake up, but I'm sure there are more possibilities.

The Tasker integration should be fairly straightforward, but IFTTT will be... more confusing. It may require syncing alarms with a server (signing in through g+ or something, or maybe I could just set up Firebase to generate a UID) then selecting which alarms to perform an action for through IFTTT. Related: #7

Possibility to customize active alarm interface

Hi,

I would like to have the possibility to customize the interface of the alarm whole it's ringing.
E.g. I really would appreciate to use a big red button to stop alarm when it rings instead of the swipe button that you have at the moment.

Is it possibile to implement that?
Thanks

Sync Alarms Across Devices

Idk how this would work. Firebase? Either way, having alarms, timers, etc. ring on multiple devices at once would be useful. I guess there could be sync options in the settings to choose what other devices should do (ex: this device has its own set of alarms but still syncs timers, or something).

Implement "increasing volume"

This functionality is just missing. It's in the description for one of the settings. But it doesn't do anything. I forgot to write it. Rip.

repeated crash log, while opening the app

this error happens mostly two or three times a day(I open the app mostly 6-8 times a day), I ignored it for sometime, but now I think there's maybe a real problem.
is there a more convenient way to send the logs without emailing it.
maybe instead of share, a linking to upload it to a server or something like that.
thanks.

io.reactivex.exceptions.OnErrorNotImplementedException: The exception was not handled due to missing onError handler in the subscribe() method call. Further reading: https://github.com/ReactiveX/RxJava/wiki/Error-Handling | Cannot call this method while RecyclerView is computing a layout or scrolling androidx.recyclerview.widget.RecyclerView{5c38390 VFED..... ......ID 0,0-1080,1775 #7f0900c9 app:id/recycler}, adapter:me.jfenn.alarmio.adapters.PreferenceAdapter@9167f24, layout:androidx.recyclerview.widget.GridLayoutManager@3294a8d, context:me.jfenn.alarmio.activities.MainActivity@1234bd5
	at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704)
	at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:701)
	at io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:77)
	at io.reactivex.internal.observers.LambdaObserver.onNext(LambdaObserver.java:67)
	at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.tryEmit(ObservableFlatMap.java:265)
	at io.reactivex.internal.operators.observable.ObservableFlatMap$InnerObserver.onNext(ObservableFlatMap.java:572)
	at io.reactivex.internal.operators.observable.ObservableMap$MapObserver.onNext(ObservableMap.java:62)
	at io.reactivex.internal.operators.observable.ObservableConcatMap$ConcatMapDelayErrorObserver$DelayErrorInnerObserver.onNext(ObservableConcatMap.java:506)
	at io.reactivex.internal.operators.observable.ObservableFilter$FilterObserver.onNext(ObservableFilter.java:52)
	at io.reactivex.internal.operators.observable.ObservableRefCount$RefCountObserver.onNext(ObservableRefCount.java:196)
	at io.reactivex.internal.operators.observable.ObservablePublish$PublishObserver.onNext(ObservablePublish.java:172)
	at io.reactivex.internal.operators.observable.ObservableCreate$CreateEmitter.onNext(ObservableCreate.java:66)
	at com.afollestad.rxkprefs.RxkPrefs$onKeyChange$1$changeListener$1.onSharedPreferenceChanged(RxkPrefs.kt:44)
	at android.app.SharedPreferencesImpl$EditorImpl.notifyListeners(SharedPreferencesImpl.java:607)
	at android.app.SharedPreferencesImpl$EditorImpl.apply(SharedPreferencesImpl.java:489)
	at com.afollestad.aesthetic.utils.PrefsExtKt.save(PrefsExt.kt:14)
	at com.afollestad.aesthetic.Aesthetic.colorPrimary(Aesthetic.kt:126)
	at me.jfenn.alarmio.Alarmio.updateTheme(Alarmio.java:253)
	at me.jfenn.alarmio.data.preference.ThemePreferenceData$2.onSunriseChanged(ThemePreferenceData.java:78)
	at me.jfenn.alarmio.data.preference.ThemePreferenceData.bindViewHolder(ThemePreferenceData.java:114)
	at me.jfenn.alarmio.data.preference.ThemePreferenceData.bindViewHolder(ThemePreferenceData.java:33)
	at me.jfenn.alarmio.adapters.PreferenceAdapter.onBindViewHolder(PreferenceAdapter.java:26)
	at me.jfenn.alarmio.adapters.PreferenceAdapter.onBindViewHolder(PreferenceAdapter.java:11)
	at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781)
	at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823)
	at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5752)
	at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6019)
	at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
	at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
	at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
	at androidx.recyclerview.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:557)
	at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
	at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
	at androidx.recyclerview.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:171)
	at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924)
	at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3641)
	at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4194)
	at android.view.View.layout(View.java:20676)
	at android.view.ViewGroup.layout(ViewGroup.java:6194)
	at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
	at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
	at android.view.View.layout(View.java:20676)
	at android.view.ViewGroup.layout(ViewGroup.java:6194)
	at androidx.viewpager.widget.ViewPager.onLayout(ViewPager.java:1775)
	at android.view.View.layout(View.java:20676)
	at android.view.ViewGroup.layout(ViewGroup.java:6194)
	at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
	at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
	at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
	at android.view.View.layout(View.java:20676)
	at android.view.ViewGroup.layout(ViewGroup.java:6194)
	at androidx.coordinatorlayout.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java:1183)
	at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java:870)
	at com.google.android.material.bottomsheet.BottomSheetBehavior.onLayoutChild(BottomSheetBehavior.java:232)
	at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:888)
	at android.view.View.layout(View.java:20676)
	at android.view.ViewGroup.layout(ViewGroup.java:6194)
	at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
	at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
	at android.view.View.layout(View.java:20676)
	at android.view.ViewGroup.layout(ViewGroup.java:6194)
	at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
	at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
	at android.view.View.layout(View.java:20676)
	at android.view.ViewGroup.layout(ViewGroup.java:6194)
	at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
	at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
	at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
	at android.view.View.layout(View.java:20676)
	at android.view.ViewGroup.layout(ViewGroup.java:6194)
	at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
	at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
	at android.view.View.layout(View.java:20676)
	at android.view.ViewGroup.layout(ViewGroup.java:6194)
	at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
	at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
	at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
	at android.view.View.layout(View.java:20676)
	at android.view.ViewGroup.layout(ViewGroup.java:6194)
	at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
	at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
	at com.android.internal.policy.DecorView.onLayout(DecorView.java:753)
	at android.view.View.layout(View.java:20676)
	at android.view.ViewGroup.layout(ViewGroup.java:6194)
	at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2810)
	at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2337)
	at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1478)
	at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7373)
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
	at android.view.Choreographer.doCallbacks(Choreographer.java:761)
	at android.view.Choreographer.doFrame(Choreographer.java:696)
	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
	at android.os.Handler.handleCallback(Handler.java:873)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loop(Looper.java:193)
	at android.app.ActivityThread.main(ActivityThread.java:6723)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:495)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling androidx.recyclerview.widget.RecyclerView{5c38390 VFED..... ......ID 0,0-1080,1775 #7f0900c9 app:id/recycler}, adapter:me.jfenn.alarmio.adapters.PreferenceAdapter@9167f24, layout:androidx.recyclerview.widget.GridLayoutManager@3294a8d, context:me.jfenn.alarmio.activities.MainActivity@1234bd5
	at androidx.recyclerview.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:2880)
	at androidx.recyclerview.widget.RecyclerView$RecyclerViewDataObserver.onChanged(RecyclerView.java:5281)
	at androidx.recyclerview.widget.RecyclerView$AdapterDataObservable.notifyChanged(RecyclerView.java:11997)
	at androidx.recyclerview.widget.RecyclerView$Adapter.notifyDataSetChanged(RecyclerView.java:7070)
	at me.jfenn.alarmio.fragments.SettingsFragment.accept(SettingsFragment.java:106)
	at io.reactivex.internal.observers.LambdaObserver.onNext(LambdaObserver.java:63)
	... 95 more

Display "scheduled ring times" on alarms

This will serve two purposes.
One: showing the user the next time it will ring and giving them the ability to cancel it one time without needing to remember to turn it back on again afterwards.
Two: helping me debug #25, which is still a problem.

SleepReminderService not calling startForeground

This is a problem. This causes a crash. It... probably shouldn't. Ideally it should figure out if it's going to call startForeground before starting... and not just decide not to once it's started. I can't remember what the reasoning was behind this.

Full stack trace:

android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{84272d3 u0 me.jfenn.alarmio/.services.SleepReminderService}
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1745)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6718)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

[Feature Request] Add some task to turn off alarm ?

As far as I search, there are some foss android alarm clock app out there, but this one seems the only one that up to date. In our foss android world right now we don't have any alternative to alarmy or i can't wake up.

Do you have any intent to add some taks (.e.g math task, rewrite task, barcode task, etc) to toggle off alarm ?

Thank you for alarmio

App gets killed by android system

Device Info

  • Brand: Samsunokiapplackberriaomissentialg
  • Model name: John Doe
  • Android version: Stock, hopefully.

Steps to Reproduce

  • download the app
  • hop on your left foot three times
  • turn 90 degrees counterclockwise
  • head, shoulders knees and toes knees and toes knees and toes knees and toes knees and toes knees and toes knees and toes knees and toes knees and toes

a shortcut isn't available, standard Alarm ringtone bug.

have one wish and one bug to report:

  1. the app doesn't open when I tap the hour in the notifications panel, even if it's the only app to provide an hour. so it would be great if you could integrate it more into the android UI(into this shortcut).

  2. this one is the bug, steps:

  • set a certain ringtone as standard
  • create a new alarm
  • still have to set a ringtone for this new alarm, otherwise it's "none"(this doesn't happen with a new timer)

thanks.

Alarm screen doesn't expand properly

Device Info

  • Brand: Huawei
  • Model name: Mate SE, BND-L34
  • Android version: stock, 8.0.0

Steps to Reproduce

  • create multiple alarms
  • lowest alarm gets cut off on bottom
  • plus sign usually covers second alarm delete button or alarm on/off toggle
  • unable to expand alarm screen with an upwards slide, a tap, expanding first alarm, or any method.

The alarm screen works fine initially but quits working after some time.

Force stop and clear app data doesn't fix, but uninstall and reinstall does.

Happened multiple times after reinstalling.

Version 1.0.0 from Izzy's repo.

Time Picker Enhancements

As stated in this tweet (asking for feedback, all of which has been positive so far), I had originally planned to implement a more "standard" time picker later on. I don't know if it will replace the current one, but having more options for the input method would be nice - maybe a button to switch to the keypad like the system one has starting at Nougat (I think)...

Can't Select Certain Background Images

Unsure what the cause is. Some work, some don't. Possibly related to their storage location, but haven't been able to test enough to verify this yet.

Make Alarm Ringing screen more intuitive

The current version is unintuitive and dissatisfies the great seal. Currently the solution that we have agreed upon is a 24dp translucent circle which expands to 56dp on press. When it is dragged to the side past one of the limits, it'll do some sort of ripple/bounce animation indicating that it can be released. If it is not interacted with, it will animate a bounce/wiggle thing from side to side to indicate that it can be dragged. This will need a custom view to actually be useable. Fun stuff.

Travis doesn't like changelogs

The last Travis build (0.7 release) failed for some reason. It didn't like that the changelog had more than one line in it. Unsure how to fix.

Alarm Times Being Weird

I put off creating this for a while, as it's a little weird to reproduce, but I have managed to get it to happen on multiple occasions now, warranting an issue. I am not sure why any of this happens. It is weird.

  1. Start the app.
  2. Create an alarm, set for ex. 07:30 (24-hour time, though it shouldn't make a difference)
  3. Look at the created alarm. It is set to 07:30.
  4. Close the app (force-stop if necessary)
  5. Start the app.
  6. Look at the created alarm. It is set to 19:00. Wth.

I have also noticed a few weird discrepancies with repeating alarms ringing on the wrong day / not ringing on the right day. This may be caused by the same issue. I hope it is. Otherwise I need to create another issue.

Time Zone Changes Mess Up Time Zone Settings

It seems when the time zone settings are modified, it saves the "home" time zone in sharedprefs, causing it to no longer change with the device settings. Ideally, the first time zone in sharedprefs could change with the device settings while also preventing duplicate time zones from appearing in the list, but just implementing this functionality with nothing to indicate this behavior would be horrible for UX. Should probably just join this with #4 for a complete redesign of the settings.

Privacy policy?

Hi, I'm Harry. I wanted to inquire if you had a privacy policy for your app. If you don't, I could help create one. It is quite an important document.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.