Git Product home page Git Product logo

memento-calendar's Introduction

Archived

The repo is now archived and no new commits will take place. Thank for your support and contributions.

Memento Calendar for Android alt text

Memento Calendar is a modern namedays app for Android. This repository contains the source code of Memento Calendar.

You can get started by having a look at the project's wiki. It contains some information about how to get Memento up and running on your machine and other useful info.

This repo is open for PRs and they are more than welcome! Have a look at the wiki page to see how to contribute.

alt text

Project Goal

Memento Calendar is my pet project/playground in which I experiment with various platform features development patterns and share my foundings with the community my foundings via blog posts and talks. Memento started off as a side project app back in 2014 and has been on development on and off. Current goal of the project is to split out the business logic of the app from the app logic so that it could potentially be ported into other platforms with the help of Kotlin.

Modules

The app is split into multiple modules. The business logic of the app can be found in the memento module. There are three other Android Modules:

android_common

This is the shared resources across all Android specific modules. It depends on memento.

android_wear

This is the Android Wear module. It depends on android_common.

android_mobile

This is the Android mobile app module. It depends on android_common.

Architecture

The Model-View-Presenter is used in order to architecture the app.

Presenters are platform agnostic and live in the memento module, in order to be able to be used across all platforms. They contain the core logic of forwarding Models to the Views. It is up for the specific platform component to create a View

Views are responsible displaying information back to the user. For each view there is one interface that lives in the memento module. A view is not to be confused with Android's View classes, Activities or Fragments.

Models contain the minimum amount of information needed to render the information on the screen.

I did a talk in the GDG Android Athens about the structure of Memento Calendar. The talk is in Greek, but the slides contain more information about the structure (see the slides).

License

MIT License

Copyright (c) 2016 Alex Styl

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

memento-calendar's People

Contributors

alexstyl avatar auricgoldfinger avatar danybony avatar madlymad avatar pchrysa avatar qqipp avatar thanosfisherman 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

memento-calendar's Issues

[develop] Birthdays aren't displayed anymore

Short Description

On develop branch, birthdays aren't displayed anymore

Steps to reproduce

Change the launchpoint to launch com.alexstyl.specialdates.ui.activity.MainActivity in stead of the Debug activity

  1. Set a breakpoint in BirthdayDatabaseRefresher.storeContactsToProvider
  2. Launch the app from the debug branch
  3. See that the BirthdayMarshaller.marshall just returns new ContentValues[0]; (I'm not entirely sure this is the problem)
  4. Continue the application
Resulted in

The app opens without any birthday

Expected Results

Birthdays are displayed

Video/Screenshots

scaled_image

Latest APK throws error with aapt

Short Description

Running aapt dump badging com.alexstyl.specialdates_3.7.apk ends with aapt throwing the error ERROR getting 'android:icon' attribute: attribute is not a string value, exiting with code 1 – so tools using that (like fdroid-server while cataloging .apk files) assume an error and reject the .apk.

Steps to reproduce

Just run aapt dump badging com.alexstyl.specialdates_3.7.apk

Resulted in

aapt exiting with error code, fdroid-server rejecting the .apk, update not in catalog.

Expected Results

Well, take your guess: Clean exit, of course :)

Video/Screenshots

None. But:

Possible source of evil

I've applied a little Google-Fu, and found getting " 'android:icon' attribute: attribute is not a string value” error while uploading an APK to the play store at StackOverflow. Assumed source at my end is indicated by this answer. You've got a "permanent loop definition" in res/values/strings.xml:

<string name="localised_app_name">@string/app_name</string>
…
<string name="app_name">@string/localised_app_name</string>

This wasn't the case with v3.6 (which doesn't cause that error):

<string name="localised_app_name">Memento Calendar</string>
…
<string name="app_name">@string/localised_app_name</string>

To confirm the issue, simply change back the localized_app_name definition to an "explicite string", and run aapt against the built package. If that fixes the issue, please replace the .apk attached to the v3.7 release.

Thanks in advance!

Select Date Dialog

Short Description

Check/Uncheck checkbox on New Birthday date

Steps to reproduce
  1. Press Add button
  2. Press EditText Birthday
  3. Uncheck the Checkbox "Birthday Year"
  4. Press Finish
  5. Press EditText Birthday Again
  6. I see Birthday Year List but Checkbox is unchecked
Expected Results

Checkbox "Bithday Year" Checked

Video/Screenshots

ezgif com-video-to-gif

Adding a new contact bday w/o photo crashes app

Short Description

Version info:
3.6-1408-gde569894

Application crashes when attempting to add a new contact that doesn't have an image associated

Steps to reproduce
  1. Open app
  2. New contact
  3. Select birthday
  4. Save
  5. Crash
Resulted in

05-31 22:30:28.611 10636-12330/com.alexstyl.specialdates E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #6
Process: com.alexstyl.specialdates, PID: 10636
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:353)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object byte[].clone()' on a null object reference
at com.alexstyl.specialdates.images.DecodedImage.getBytes(DecodedImage.java:14)
at com.alexstyl.specialdates.addevent.OperationsFactory.updateImageContact(OperationsFactory.kt:105)
at com.alexstyl.specialdates.addevent.ContactOperations$ContactOperationsBuilder.updateContactImage(ContactOperations.java:76)
at com.alexstyl.specialdates.addevent.AddContactEventsPresenter$1.doInBackground(AddContactEventsPresenter.java:108)
at com.alexstyl.specialdates.addevent.AddContactEventsPresenter$1.doInBackground(AddContactEventsPresenter.java:100)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 
at java.lang.Thread.run(Thread.java:764) 

Debug Activity icon is missing from the device launcher

Short Description

The DebugActivity can only found in the debug flavor of the app. It contains all sorts of debug settings in order to make debugging easier.

The activity is marked as a launcher activity, which means that it should also appear as a separate icon in the app launcher. Currently thought, it doesn't.

Steps to reproduce

Just install the app and look at the installed launcher's app drawer.

Resulted in

The DebugActivity icon is missing

Expected Results

The launcher should display the DebugActivity icon

Skipped [%s] because it had no variations

"variations":[]} 
08-30 20:15:44.889 7359-7399/com.alexstyl.specialdates W/NoTils: [AsyncTask #1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-63,"main":"Του Ασώτου","variations":[]} 
08-30 20:15:44.890 7359-7399/com.alexstyl.specialdates W/NoTils: [AsyncTask #1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-59,"main":"Τσικνοπέμπτη","variations":[]} 
08-30 20:15:44.891 7359-7399/com.alexstyl.specialdates W/NoTils: [AsyncTask #1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-57,"main":"Ψυχοσάββατο Α'","variations":[]} 
08-30 20:15:44.892 7359-7399/com.alexstyl.specialdates W/NoTils: [AsyncTask #1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-56,"main":"Της Απόκρεω","variations":[]} 
08-30 20:15:44.894 7359-7399/com.alexstyl.specialdates W/NoTils: [AsyncTask #1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-49,"main":"Τυροφάγου","variations":[]} 
08-30 20:15:44.897 7359-7399/com.alexstyl.specialdates W/NoTils: [AsyncTask #1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-48,"main":"Καθαρά Δευτέρα","variations":[]} 
08-30 20:15:44.901 7359-7399/com.alexstyl.specialdates W/NoTils: [AsyncTask #1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-5,"main":"Μεγάλη Τρίτη","variations":[]} 
08-30 20:15:44.902 7359-7399/com.alexstyl.specialdates W/NoTils: [AsyncTask #1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-4,"main":"Μεγάλη Τετάρτη","variations":[]} 
08-30 20:15:44.902 7359-7399/com.alexstyl.specialdates W/NoTils: [AsyncTask #1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-2,"main":"Μεγάλη Παρασκευή","variations":[]} 
08-30 20:15:44.903 7359-7399/com.alexstyl.specialdates W/NoTils: [AsyncTask #1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-1,"main":"Μεγάλο Σάββατο","variations":[]} 
08-30 20:15:44.904 7359-7399/com.alexstyl.specialdates W/NoTils: [AsyncTask #1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":1,"main":"2α Διακαινησίμου - Δευτέρα","variations":[]} 
08-30 20:15:44.905 7359-7399/com.alexstyl.specialdates W/NoTils: [AsyncTask #1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":4,"main":"5η Διακαινησίμου - Πέμπτη","variations":[]} 
08-30 20:15:44.906 7359-7399/com.alexstyl.specialdates W/NoTils: [AsyncTask #1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":5,"main":"6η Διακαινησίμου - Παρασκευή","variations":[]} 
08-30 20:15:44.907 7359-7399/com.alexstyl.specialdates W/NoTils: [AsyncTask #1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":6,"main":"7η Διακαινησίμου - Σαββάτο","variations":[]} 
08-30 20:15:44.908 7359-7399/com.alexstyl.specialdates W/NoTils: [AsyncTask #1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":48,"main":"Ψυχοσάββατο Β'","variations":[]} 
08-30 20:15:44.909 7359-7399/com.alexstyl.specialdates W/NoTils: [AsyncTask #1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":49,"main":"Πεντηκοστή","variations":[]} 
08-30 20:15:44.915 7359-7399/com.alexstyl.specialdates W/NoTils: [AsyncTask #1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-2,"main":"Μεγάλη Παρασκευή","variations":[]} 
08-30 20:15:44.916 7359-7399/com.alexstyl.specialdates W/NoTils: [AsyncTask #1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":1,"main":"2α Διακαινησίμου - Δευτέρα","variations":[]} 
08-30 20:15:45.307 7359-7371/com.alexstyl.specialdates I/art: Background sticky concurrent mark sweep GC freed 103105(3MB) AllocSpace objects, 7(752KB) LOS objects, 29% free, 8MB/12MB, paused 8.436ms total 52.091ms
08-30 20:15:45.757 7359-7408/com.alexstyl.specialdates W/NoTils: [RxCachedThreadScheduler-1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-70,"main":"Τελώνου και Φαρισαίου - Αρχή Τριωδίου","variations":[]} 
08-30 20:15:45.758 7359-7408/com.alexstyl.specialdates W/NoTils: [RxCachedThreadScheduler-1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-63,"main":"Του Ασώτου","variations":[]} 
08-30 20:15:45.759 7359-7408/com.alexstyl.specialdates W/NoTils: [RxCachedThreadScheduler-1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-59,"main":"Τσικνοπέμπτη","variations":[]} 
08-30 20:15:45.760 7359-7408/com.alexstyl.specialdates W/NoTils: [RxCachedThreadScheduler-1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-57,"main":"Ψυχοσάββατο Α'","variations":[]} 
08-30 20:15:45.761 7359-7408/com.alexstyl.specialdates W/NoTils: [RxCachedThreadScheduler-1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-56,"main":"Της Απόκρεω","variations":[]} 
08-30 20:15:45.762 7359-7408/com.alexstyl.specialdates W/NoTils: [RxCachedThreadScheduler-1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-49,"main":"Τυροφάγου","variations":[]} 
08-30 20:15:45.766 7359-7408/com.alexstyl.specialdates W/NoTils: [RxCachedThreadScheduler-1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-48,"main":"Καθαρά Δευτέρα","variations":[]} 
08-30 20:15:45.768 7359-7408/com.alexstyl.specialdates W/NoTils: [RxCachedThreadScheduler-1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-5,"main":"Μεγάλη Τρίτη","variations":[]} 
08-30 20:15:45.769 7359-7408/com.alexstyl.specialdates W/NoTils: [RxCachedThreadScheduler-1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-4,"main":"Μεγάλη Τετάρτη","variations":[]} 
08-30 20:15:45.770 7359-7408/com.alexstyl.specialdates W/NoTils: [RxCachedThreadScheduler-1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-2,"main":"Μεγάλη Παρασκευή","variations":[]} 
08-30 20:15:45.771 7359-7408/com.alexstyl.specialdates W/NoTils: [RxCachedThreadScheduler-1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-1,"main":"Μεγάλο Σάββατο","variations":[]} 
08-30 20:15:45.772 7359-7408/com.alexstyl.specialdates W/NoTils: [RxCachedThreadScheduler-1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":1,"main":"2α Διακαινησίμου - Δευτέρα","variations":[]} 
08-30 20:15:45.773 7359-7408/com.alexstyl.specialdates W/NoTils: [RxCachedThreadScheduler-1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":4,"main":"5η Διακαινησίμου - Πέμπτη","variations":[]} 
08-30 20:15:45.774 7359-7408/com.alexstyl.specialdates W/NoTils: [RxCachedThreadScheduler-1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":5,"main":"6η Διακαινησίμου - Παρασκευή","variations":[]} 
08-30 20:15:45.774 7359-7408/com.alexstyl.specialdates W/NoTils: [RxCachedThreadScheduler-1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":6,"main":"7η Διακαινησίμου - Σαββάτο","variations":[]} 
08-30 20:15:45.776 7359-7408/com.alexstyl.specialdates W/NoTils: [RxCachedThreadScheduler-1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":48,"main":"Ψυχοσάββατο Β'","variations":[]} 
08-30 20:15:45.777 7359-7408/com.alexstyl.specialdates W/NoTils: [RxCachedThreadScheduler-1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":49,"main":"Πεντηκοστή","variations":[]} 
08-30 20:15:45.778 7359-7408/com.alexstyl.specialdates W/NoTils: [RxCachedThreadScheduler-1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":-2,"main":"Μεγάλη Παρασκευή","variations":[]} 
08-30 20:15:45.779 7359-7408/com.alexstyl.specialdates W/NoTils: [RxCachedThreadScheduler-1][(EasternNamedaysExtractor.java:35).extractNamedaysAsDaysFromEaster] Skipped [%s] because it had no variations {"toEaster":1,"main":"2α Διακαινησίμου - Δευτέρα","variations":[]} 

Add Event/Discard changes asked you to Cancel or Cancel in Greek

Review form Play Store:

Αν πας να προσθέσεις συμβάν, αλλά το μετανιώσεις και το ακυρώσεις, ρωτάει "Discard changes?" και οι επιλογές είναι "Ακύρωση" και "Ακύρωση"...

Excess spacing on first row

screenshot_20180527-020133

See attached screenshot. Between the first and second row theres a large blank space.

Environment:
Pixel 2
Android P (PP2.180412.013)

Code duplication in NamedayDatabaseRefresher

Currently NamedayDatabaseRefresher contains two different methods to calculate the static and special namedays of the device's events respectively. The problem is that right now the NamedayDatabaseRefresher does more than one things (queries the contacts, goes through them to find their namedays), breaking the Single Responsibility principle. This makes it also hard to test.

The logic of the class needs to break down to smaller class so that we don't duplicate the logic between static and dynamic(special) namedays and make the class easy to test.

Max date doesn't get updated when 'Include Year' gets toggled

Short Description

The date, month, year should be invalidated when the Include Year? checkbox is checked, as we might end up with false dates (i.e unchecking the year should always include February 29, but February 29, 2018 doesn't make sense).

Bug report of Memento Calendar Application

Expected behavior


I really hope to log into Facebook without any problems.

Actual behavior

The app hangs on the loading screen after I log into Facebook.

How to reproduce


* Download the Memento Calendar app on playstore
* Launch application
* Click on on the three lines on the top left side
* Select Facebook friends
* Enter an email or phone number and password and log in
* Then choose Oke button

* Device used: Samsung Grand prime SM-G530

* Operating System: Android version 4.4.4

* Application version:11.2

#### Recording Of The Bug
https://youtu.be/2Na1lVmLnPw



Posted on Utopian.io - Rewarding Open Source Contributors

Some Contacts with birthdays won't display on Search

Short Description

A contact that clearly has Birthday, is not displayed in the app's search.

Steps to reproduce
  1. Open app from home screen's icon
  2. Tap on Searhbar
  3. Type the first letters of the contact (alex)
Resulted in

The search containing no results (see Searching screenshot)

Expected Results

The contact to be displayed (Alexandros)

Video/Screenshots
Searching Contact has birthday
photo476685763370657807 photo476685763370657808

NOTE: For some reason the contact will be displayed when the "Greek Namedays" are chosen to be displayed form the app settings.

Introduce bank holidays for different locales

Currently the app supports only Greek bankholidays. It would be nice to have some sort of mechanism to switch or enable multiple bankholidays.

There are probably multiple online APIs for bankholidays that can be used for fetching the bankholidays.

Daily Reminder Ringtone select dialog doesn't appear after granting permission

Short Description

On Android 6.0, selecting the Ringtone option of the Daily Reminder screen brings up the External SD permission dialog. After the user grants the permission to the app, the ringtone dialog does not show up and the user has to select the Ringtone option again.

Steps to reproduce

On an Android 6.0 device:

  1. Go to settings
  2. Press on "Daily Reminder"
  3. Press on "Ringtone"
  4. Grant the permission requested
Resulted in

Idle Daily Reminder screen

Expected Results

The Ringtone Picker dialog to show up

Today Widget does not get updated after updating its looks

Short Description

After changing the appearance of the Today Widget, the widget does not visually persist the changes that I made.

Steps to reproduce
  1. Place the Today Widget to your homescreen
  2. Do some visual change (if the widget is white, change it to black and change the opacity)
  3. Accept the changes
Resulted in

The widget's appearance does not get updated to the one's I chose.

Expected Results

The widget to be updated with the selected visual settings

Video/Screenshots

bug

⚠️File google-services.json is missing

The google-services.json file should be automatically generated when the project is built. Something somewhere broke and that doesn't happen anymore 🤦‍♀️

Error:Execution failed for task ':android_mobile:processDebugGoogleServices'.
> File google-services.json is missing. The Google Services Plugin cannot function without it. 
   Searched Location: 
  /Users/alexandrosstylianidis/Projects/memento-mad/android_mobile/src/debug/google-services.json
  /Users/alexandrosstylianidis/Projects/memento-mad/android_mobile/google-services.json

As a workaround, you may create a new google-services.json file into your android_mobile folder with the following:

{
      "project_info": {
        "project_id": "mockproject-1234",
        "project_number": "123456789000",
        "name": "FirebaseQuickstarts",
        "firebase_url": "https://mockproject-1234.firebaseio.com"
      },
      "client": [
        {
          "client_info": {
            "mobilesdk_app_id": "1:123456789000:android:f1bf012572b04063",
            "client_id": "android:com.google.samples.quickstart.admobexample",
            "client_type": 1,
            "android_client_info": {
              "package_name": "com.alexstyl.specialdates",
              "certificate_hash": []
            }
          },
          "oauth_client": [
            {
              "client_id": "123456789000-hjugbg6ud799v4c49dim8ce2usclthar.apps.googleusercontent.com",
              "client_type": 1,
              "android_info": {
                "package_name": "com.alexstyl.specialdates",
                "certificate_hash": "4C20644DE36B8F89D25650C7D1FF9FBAE650FDF7"
              }
            },
            {
              "client_id": "123456789000-e4uksm38sne0bqrj6uvkbo4oiu4hvigl.apps.googleusercontent.com",
              "client_type": 3
            }
          ],
          "api_key": [
            {
              "current_key": "AIzbSzCn1N6LWIe6wthYyrgUUSAlUsdqMb-wvTo"
            }
          ],
          "services": {
            "analytics_service": {
              "status": 1
            },
            "cloud_messaging_service": {
              "status": 2,
              "apns_config": []
            },
            "appinvite_service": {
              "status": 2,
              "other_platform_oauth_client": [
                {
                  "client_id": "123456789000-e4uksm38sne0bqrj6uvkbo4oiu4hvigl.apps.googleusercontent.com",
                  "client_type": 3
                }
              ]
            },
            "google_signin_service": {
              "status": 2
            },
            "ads_service": {
              "status": 2,
              "test_banner_ad_unit_id": "ca-app-pub-3940256099942544/6300978111",
              "test_interstitial_ad_unit_id": "ca-app-pub-3940256099942544/1033173712"
            }
          }
        },
        {
          "client_info": {
            "mobilesdk_app_id": "1:123456789000:android:f1bf012572b04063",
            "client_id": "android:com.google.samples.quickstart.admobexample",
            "client_type": 1,
            "android_client_info": {
              "package_name": "com.alexstyl.specialdates.pro",
              "certificate_hash": []
            }
          },
          "oauth_client": [
            {
              "client_id": "123456789000-hjugbg6ud799v4c49dim8ce2usclthar.apps.googleusercontent.com",
              "client_type": 1,
              "android_info": {
                "package_name": "com.alexstyl.specialdates.pro",
                "certificate_hash": "4C20644DE36B8F89D25650C7D1FF9FBAE650FDF7"
              }
            },
            {
              "client_id": "123456789000-e4uksm38sne0bqrj6uvkbo4oiu4hvigl.apps.googleusercontent.com",
              "client_type": 3
            }
          ],
          "api_key": [
            {
              "current_key": "AIzbSzCn1N6LWIe6wthYyrgUUSAlUsdqMb-wvTo"
            }
          ],
          "services": {
            "analytics_service": {
              "status": 1
            },
            "cloud_messaging_service": {
              "status": 2,
              "apns_config": []
            },
            "appinvite_service": {
              "status": 2,
              "other_platform_oauth_client": [
                {
                  "client_id": "123456789000-e4uksm38sne0bqrj6uvkbo4oiu4hvigl.apps.googleusercontent.com",
                  "client_type": 3
                }
              ]
            },
            "google_signin_service": {
              "status": 2
            },
            "ads_service": {
              "status": 2,
              "test_banner_ad_unit_id": "ca-app-pub-3940256099942544/6300978111",
              "test_interstitial_ad_unit_id": "ca-app-pub-3940256099942544/1033173712"
            }
          }
        }
      ],
      "client_info": [],
      "ARTIFACT_VERSION": "1"
    }

icon for memento- calendar

hi@alexatyl,I am a graphic designer, I want to help you in graphic design.

After I review your project, your app is very good. Therefore I suggest a new logo and icon for you. If you want it, I will design it for you and it's free.

Icon/Logo Proposal

Hi Sir @alexstyl ,

I am a designer and I did some tweaking in the existing logo that you might like. I saw the icon and I thought it's missing a mark for Memento that's why I incorporate the initial which is "M". I'm giving this for free if you want.

memento

Best regards,
Tobaloidee

Placeholder for Ads that could not be loaded

Short Description

Being offline should replace ads with some different type of content, either that being a prompt to share the app or rate it. Currently we display nothing

Video/Screenshots

17 - 1

Feature: Edit/Delete

Feature: Currently no option to edit or delete events. Should have ability to edit/delete

User image is not uploading when you clicked image from device camera and clicked image quality is also very poor.

Expected behavior

Memento Calendar is a modern namedays app for Android. In this app you can see upcoming events like birthdays etc. of your contacts or you can also add a new event for your contact from the app in 'Add a new event section'. While adding a new event for your contacts you can also set profile pictures to your contacts from your gallery or from your camera. When you select camera to add a profile picture, your device camera will open and you need to click a new image. After clicking image the image will upload and show in contact image area (at place of blue area).
WhatsApp Image 2018-02-12 at 17.06.42.jpeg

Actual behavior

Today i installed Memento Namedays android app and after installing i came to main screen of where i can see list of my added events or i can add a new event on clicking the "+" button. I clicked on the "+" button to add a new event. After clicking on "+", a new page opened where i can create a new event with user image, contact name and event dates. I clicked on user image(the blue area with white user icon) to add contact image, select camera, click a new image and select ok. I came back to add event screen but the image i clicked from my camera is not uploaded at place of user image placeholder.
WhatsApp Image 2018-02-12 at 17.06.42.jpeg

How to reproduce

To reproduce the bug follow the following steps -

  • Open app and click on "+" button to add a new event.
  • Now click on camera icon to upload a picture and select camera to click a picture.
  • Click image from device camera and click ok.

Now you see that your clicked image is not set as contact profile image.


* Device:  Samsung J7 Prime
* Operating system: Android 7.0 Nougatt
* App Version: v11.2

Recording Of The Bug

https://youtu.be/VNzcpiORv1E



Posted on Utopian.io - Rewarding Open Source Contributors

Bug in app calendar which leads app to crash.

Expected behaviour

While creating a contact in app, app gives option to select birth date of contact. When selecting birth date from date picker, app needs to show 28 days in February month because 2018 is not a leap year.

Actual behaviour

While selecting birth date from date picker, the date picker showing me 30 Feb 2018 as a date. When i set 30 Feb 2018 as birthday of contact, the app got crashed.
Screenshot_20180228-163225.png

How to reproduce

To reproduce the bug follow the following steps :-

  • Create a new contact from app.
  • Click on birthday field and set 30 Feb 2018 as birthday date.
  • App crashed immediately.
  • For better understanding see recording of bug.

* Device:  Samsung J7 Prime
* Operating system: Android 7.0 Nougatt
* App Version: v11.2

Recording Of The Bug

watch video till end.

https://youtu.be/BN-NH2l4sAg



Posted on Utopian.io - Rewarding Open Source Contributors

Reduce the CI Warnings and Errors to 0/0

Short Description

Static analysis was recently added to the project (#141). Initially the project contained a lot of issues that were pointed out by the analysis. Because of that some threshold was added to the warnings and errors so that it would not be a blocker for further development.

Ideally, the threshold should be 0 errors and 0 warnings (0/0), so that future new issues are identified before being introduced to the code base.

Running static analysis on your machine

Open the terminal at the directory of the root of the project and run

./gradlew check

The configuration files you need to check in order to modify the thresholds are:
team-props/static-analysis/detekt-config.yml and
team-props/static-analysis.gradle

Birthday on February 29,2017 is not displayed

Short Description

App currently in Play Store crashes on Marshmallow, custom rom

Steps to reproduce
  1. Open app from home screen's icon
    FYI: There's a contact that has his birthday on 29th of february.
Resulted in

App crashes.

More details in case that could matter: My XPeria Z was acting fishy and especially gave a lot of bluetooth problems. That much that my bluetooth headset stopped working. Before buying another phone, I decided to unlock the bootloader and flash another rom. I chose StryFlex - an AOSP Marshmallow based ROM, based on the original Sony rom for the XPeria ZX. The phone is working smoothly now and I have no more issues.

Except for Memento 😉

I checked out the most recent code, build and installed that one to see whether I could solve the problem myself. But that build works smoothly, except for the fact that the contact isn't displayed

FYI: I am using dummy crashlyticsKey, androidVendingKey and mixpanelKey here and I even commented out apply plugin: 'com.google.gms.google-services' in mobile/build.gradle to work around the missing google-services.json. So maybe the error is somewhere inthere?

So I sent the crash report anyway. Maybe you can find the cause... Since it's obfuscated, I can't read the stacktrace :-)

At the end of this post is the logcat for the app installed using the Google Play Store. I included the entire logcat from the moment I start the application, not just the exception

For now, I'm going to install your all_events_create_event branch on my phone, for which I'm very grateful :-)

logcat
01-21 14:11:42.064 645-3717/system_process I/ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.alexstyl.specialdates/.ui.activity.MainActivity (has extras)} from uid 10117 on display 0
01-21 14:11:42.347 645-21331/system_process I/ActivityManager: Start proc 30884:com.alexstyl.specialdates/u0a187 for activity com.alexstyl.specialdates/.ui.activity.MainActivity
01-21 14:11:42.465 30884-30884/com.alexstyl.specialdates W/System: ClassLoader referenced unknown path: /data/app/com.alexstyl.specialdates-1/lib/arm
01-21 14:11:42.494 30884-30884/com.alexstyl.specialdates D/FirebaseApp: com.google.firebase.auth.FirebaseAuth is not linked. Skipping initialization.
01-21 14:11:42.503 30884-30884/com.alexstyl.specialdates D/FirebaseApp: com.google.firebase.crash.FirebaseCrash is not linked. Skipping initialization.
01-21 14:11:42.523 30884-30884/com.alexstyl.specialdates I/FA: App measurement is starting up, version: 9683
01-21 14:11:42.524 30884-30884/com.alexstyl.specialdates I/FA: To enable debug logging run: adb shell setprop log.tag.FA VERBOSE
01-21 14:11:42.551 30884-30884/com.alexstyl.specialdates I/FA: To enable faster debug mode event logging run:
                                                                 adb shell setprop firebase.analytics.debug-mode com.alexstyl.specialdates
01-21 14:11:42.568 30884-30884/com.alexstyl.specialdates I/FirebaseInitProvider: FirebaseApp initialization successful
01-21 14:11:42.642 30884-30884/com.alexstyl.specialdates W/d: diskCache() and diskCacheFileNameGenerator() calls overlap each other
01-21 14:11:42.733 30884-30884/com.alexstyl.specialdates I/CrashlyticsCore: Initializing Crashlytics 2.3.8.97
01-21 14:11:42.785 30884-30895/com.alexstyl.specialdates I/art: Background partial concurrent mark sweep GC freed 17599(1282KB) AllocSpace objects, 18(360KB) LOS objects, 72% free, 1565KB/5MB, paused 14.007ms total 40.679ms
01-21 14:11:42.841 30884-30913/com.alexstyl.specialdates W/System: ClassLoader referenced unknown path: /system/framework/tcmclient.jar
01-21 14:11:42.939 30884-30884/com.alexstyl.specialdates W/MixpanelAPI.RsrcReader: Can't load names for Android view ids from 'com.alexstyl.specialdates.R$id', ids by name will not be available in the events editor.
01-21 14:11:42.939 30884-30884/com.alexstyl.specialdates I/MixpanelAPI.RsrcReader: You may be missing a Resources class for your package due to your proguard configuration, or you may be using an applicationId in your build that isn't the same as the package declared in your AndroidManifest.xml file.
                                                                                   If you're using proguard, you can fix this issue by adding the following to your proguard configuration:
                                                                                   
                                                                                   -keep class **.R$* {
                                                                                       <fields>;
                                                                                   }
                                                                                   
                                                                                   If you're not using proguard, or if your proguard configuration already contains the directive above, you can add the following to your AndroidManifest.xml file to explicitly point the Mixpanel library to the appropriate library for your resources class:
                                                                                   
                                                                                   <meta-data android:name="com.mixpanel.android.MPConfig.ResourcePackageName" android:value="YOUR_PACKAGE_NAME" />
                                                                                   
                                                                                   where YOUR_PACKAGE_NAME is the same string you use for the "package" attribute in your <manifest> tag.
01-21 14:11:42.970 30884-30884/com.alexstyl.specialdates D/MixpanelAPI.AL: To enable App Links tracking android.support.v4 must be installed: getInstance [class android.content.Context]
01-21 14:11:42.971 30884-30884/com.alexstyl.specialdates D/MixpanelAPI.AL: Please install the Bolts library >= 1.1.2 to track App Links: bolts.AppLinks
01-21 14:11:43.125 30884-30884/com.alexstyl.specialdates W/MixpanelAPI.ConfigurationChecker: com.mixpanel.android.surveys.a is not registered as an activity in your application, so surveys can't be shown.
01-21 14:11:43.125 30884-30884/com.alexstyl.specialdates I/MixpanelAPI.ConfigurationChecker: Please add the child tag <activity android:name="com.mixpanel.android.surveys.SurveyActivity" /> to your <application> tag.
01-21 14:11:43.197 30884-30937/com.alexstyl.specialdates D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true
01-21 14:11:43.293 30884-30937/com.alexstyl.specialdates I/Adreno-EGL: <qeglDrvAPI_eglInitialize:379>: QUALCOMM Build: 10/21/15, 369a2ea, I96aee987eb
01-21 14:11:43.297 30884-30937/com.alexstyl.specialdates I/OpenGLRenderer: Initialized EGL, version 1.4
01-21 14:11:43.471 645-664/system_process I/ActivityManager: Displayed com.alexstyl.specialdates/.ui.activity.MainActivity: +1s145ms
01-21 14:11:43.644 30884-30903/com.alexstyl.specialdates I/FA: Tag Manager is not found and thus will not be used
                                                               
                                                               --------- beginning of crash
01-21 14:11:45.338 30884-30935/com.alexstyl.specialdates E/AndroidRuntime: FATAL EXCEPTION: ModernAsyncTask #1
                                                                           Process: com.alexstyl.specialdates, PID: 30884
                                                                           java.lang.RuntimeException: An error occurred while executing doInBackground()
                                                                               at android.support.v4.b.k$3.done(ModernAsyncTask.java:161)
                                                                               at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
                                                                               at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
                                                                               at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                                                                               at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                                               at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                                               at java.lang.Thread.run(Thread.java:818)
                                                                            Caused by: java.lang.IllegalArgumentException: 29/2/2017 is invalid
                                                                               at com.alexstyl.specialdates.c.c.a(Date.java:48)
                                                                               at com.alexstyl.specialdates.events.b.b$a.a(PeopleEventsContract.java:55)
                                                                               at com.alexstyl.specialdates.events.b.b$a.a(PeopleEventsContract.java:30)
                                                                               at com.alexstyl.specialdates.service.a.b(PeopleEventsProvider.java:193)
                                                                               at com.alexstyl.specialdates.service.a.a(PeopleEventsProvider.java:149)
                                                                               at com.alexstyl.specialdates.upcoming.l.B(UpcomingEventsLoader.java:59)
                                                                               at com.alexstyl.specialdates.upcoming.l.d(UpcomingEventsLoader.java:29)
                                                                               at android.support.v4.b.a.e(AsyncTaskLoader.java:299)
                                                                               at android.support.v4.b.a$a.a(AsyncTaskLoader.java:57)
                                                                               at android.support.v4.b.a$a.a(AsyncTaskLoader.java:45)
                                                                               at android.support.v4.b.k$2.call(ModernAsyncTask.java:138)
                                                                               at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                               at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
                                                                               at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
                                                                               at java.lang.Thread.run(Thread.java:818) 
01-21 14:11:45.345 645-21331/system_process W/ActivityManager:   Force finishing activity com.alexstyl.specialdates/.ui.activity.MainActivity
01-21 14:11:45.354 30884-30893/com.alexstyl.specialdates W/CursorWrapperInner: Cursor finalized without prior close()
01-21 14:11:46.125 30884-30916/com.alexstyl.specialdates I/CrashlyticsCore: Crashlytics report upload complete: 58835E0E030B-0001-78A4-2590DBC70216.cls

Include Latvian Extended Namedays

A user has requested to include the Latvian Extended Namedays into the app. They were also very kind to send me the

json file of them. What needs to be done is

As for the current Latvian namedays it should be renamed to Latvian Traditional. The nameday selection dialog in the settings should write:

  • Latvian Traditional
  • Latvian Extended

Link to Latvian Extended: https://drive.google.com/open?id=0B7DmD0M2MtEsX0lTS2VKM1o4cFU

A guide on how to include Namedays can be found on the wiki.

Publish APK on Github?

With your app being open source, did you consider publishing the .apk along with the releases/ – so folks without access to Playstore could grab it?

Contact does not appear when creating birthday

Short Description

  1. My device has no contacts.
  2. Trying to add new birthday contacts through Memento.

Steps to reproduce and Results

  1. Create First contact (c1).
    Contact will not appear in the UI.
  2. I create another one (c2).
    In the UI appears the previous contact (c1).
  3. I create a third contact (c3)
    Again in the UI is painted the previous contact (c2).
  4. I close the app.
  5. I reopen the app, contact c3 is completely missing (Although it exist on my phone contacts).
  6. I create a new contact c4, the app works as intended and draws in the UI the c4 contact.

Video
What I just wrote, can be visible with the following gif:

memento

Use the ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS for newer Android devices

Some people mention that sometimes the application does not show an notification to them. This is probably do to this:

ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS

added in API level 23
String ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
Activity Action: Show screen for controlling which apps can ignore battery optimizations.

Input: Nothing.

Output: Nothing.

You can use PowerManager.isIgnoringBatteryOptimizations() to determine if an application is already ignoring optimizations. You can use ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS to ask the user to put you on this list.

Constant Value: "android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS"
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS

added in API level 23
String ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
Activity Action: Ask the user to allow an app to ignore battery optimizations (that is, put them on the whitelist of apps shown by ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS). For an app to use this, it also must hold the REQUEST_IGNORE_BATTERY_OPTIMIZATIONS permission.

Note: most applications should not use this; there are many facilities provided by the platform for applications to operate correctly in the various power saving modes. This is only for unusual applications that need to deeply control their own execution, at the potential expense of the user's battery life. Note that these applications greatly run the risk of showing to the user as high power consumers on their device.

Input: The Intent's data URI must specify the application package name to be shown, with the "package" scheme. That is "package:com.my.app".

Output: Nothing.

You can use PowerManager.isIgnoringBatteryOptimizations() to determine if an application is already ignoring optimizations.

Constant Value: "android.settings.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"
https://developer.android.com/reference/android/provider/Settings.html#ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS

[Beta feedback] Donate Activity finishes unexpectedly

Donate Activity -> click donate Button --> open Dialog ---> press back
meta pataw pali sto Donate button
psofaei to activity
me warning

09-07 20:13:57.158 30064-30064/? W/System.err: com.alexstyl.specialdates.donate.a.b$a: Can't dispose because an async operation (launchPurchaseFlow) is in progress.
09-07 20:13:57.158 30064-30064/? W/System.err:     at com.alexstyl.specialdates.donate.a.b.a(IabHelper.java:324)
09-07 20:13:57.159 30064-30064/? W/System.err:     at com.alexstyl.specialdates.donate.b.a(AndroidDonationService.java:66)
09-07 20:13:57.159 30064-30064/? W/System.err:     at com.alexstyl.specialdates.donate.h.a(DonatePresenter.java:40)
09-07 20:13:57.159 30064-30064/? W/System.err:     at com.alexstyl.specialdates.donate.DonateActivity.onDestroy(DonateActivity.java:121)

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.