m-i-n-a-r / birday

🎉 A beautiful Kotlin app to remember birthdays and events without having to open Facebook, set alarms or rely on Google Calendar
Other
903 stars 79 forks source link

Importing individual events #173

Open DominikNovosel opened 1 year ago

DominikNovosel commented 1 year ago

Currently, there is no way to do this automatically except for importing a backup, which overwrites existing data. However, there is an option for sharing a pre-formatted block of text that gives essential information about the event, eg.

🎈 Birday Reminder 🥳 Dominik Novosel (Birthday) 🕯 Thursday, May 4, 2023 📅 Wednesday, May 4, 2005

The simplest possible solution (or at least the most user-friendly) would be to have the user copy and paste this into a text entry field, whereupon Birday would analyze it, pull out the relevant data and save it as a new entry. This seems super practical for sharing since it's just text that can be sent through any messaging service.

Drawbacks:

m-i-n-a-r commented 1 year ago

Another interesting proposal, thanks!

Considering all this aspects, i had an idea: the share functionality could share not a text, but an image. Specifically, a QR code containing all the information to import the contact in the app (coded in the same formats, language and so on) and a text below just like the current one. Issues with this approach:

DominikNovosel commented 7 months ago

the share functionality could share not a text, but an image. Specifically, a QR code

That's an interesting idea, however, images are a rather bulky medium for transmitting information like this, and importing them into Birday would have the user first figuring out how to save images to the gallery from their messaging app, and then finding that specific image while fumbling in the image selection dialog. This could take about as much time as just saving the event manually for the average user, and would almost certainly confound senior users. I know from experience that most of my relatives would get stuck at step one.

Not to mention that any images that were assigned to certain events wouldn't fit into a QR code nor a shareable text block unless Birday downscales them to a manageable size first. It might make sense to have a separate option to share the event image though. Embedding an image into either of the aforementioned formats seems arduous and unnecessary.

instead of sharing the QR, the app could simply display it, it makes more sense to me the app itself should embed a QR reader! That's not a problem, i already developed many apps containing such component, but it needs an additional permission, and i'm trying to avoid additional permissions at all costs 😞

Another good option, but this means that the sender and recipient would have to be in physical proximity, go through the process described above, or jury-rig some kind of QR code exchange session on some video conferencing service to accomplish a transfer. If you were to go down this route though, it is my understanding that you could simply not ask for the camera permission until the user goes to use this feature.

I still think that a pre-formatted text block would be the optimal solution. We could even call it a "BirCode"! To get around localization issues, the data could be made entirely machine readable with some human readable instructions tacked on, eg.

Paste this text into the Name field in the Add event menu in Birday [data, possibly encoded in CSV]

The parser code could simply ignore everything outside the brackets and then read in the data. In writing the instructions, I tried to comply with your request not to include UI changes, but I think an innocuous Import from BirCode button would be better. Asking the user to paste it into the Name field is a bit arbitrary and requires additional logic to recognize that the input is not a name, and hunting down the same option in the settings is, once again, something that takes time. It also seems more intuitive, since most people would look for this option in the Add event menu, where they usually go to do exactly that; add a singular event.

m-i-n-a-r commented 7 months ago

That's an interesting idea. The only purpose of my QR idea was to make the data uneditable, but I fully agree about the cumbersome procedure. The almost 3000 reviews I had until now praise the app because "it's easy to use" and this has to be the main focus, always. With that being said, the BirCode idea is something I could try to implement. To summarize:

I still want to release the update before developing this feature, but it could be easy doing it in this way. I'm slow as hell, but I'll do it, I promise 😄

simonesestito commented 7 months ago

In order to share a single event with a friend, my little idea is to use Deep Links. Let me explain.

Alice wants to send to Bob the event representing Charlie's birthday. Alice clicks a share button on Charlie's birthday event, and it shares the message to Bob. The message may look something like:

Save Charlie's birthday and never forget about it. Use Birday: https://birday.app/event?data=someBase64DataOrWhatever

Bob receives the message and he's very glad that Alice reminded him of Charlie's birthday. He never wants to miss it again!

Bob clicks on the link and 2 things may happen:

  1. He already has Birday installed $\Rightarrow$ the app opens up and immediately the pre-filled dialog shows up (no auto addition for security reasons - Bob still has to click an OK button)
  2. Otherwise, he's redirected to the Play Store to install it. Clicking on the deep link again will run point 1

Talking about implementation details, without using Firebase Deep Links or other Google products, the birday.app domain may run an extremely simple AWS Lambda (or equivalent) or maybe even a simple GitHub Pages single static file that runs a very little and simple JS function in user's browser such that it tries to open a deep link with custom scheme (like birday://whatever) or even letting Birday open birday.app links (using the .well-known/assetlinks.json file)

m-i-n-a-r commented 7 months ago

That's even better! I'll probably go for this solution. I'll update the issue when i start working on it 🤔