Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
97cc926
Fixed problem with duplicated accounts getting created.
Mar 4, 2018
b90a9b5
Reworked the way separators are handled.
Mar 4, 2018
bdee6f3
Updated romanian translation.
Mar 4, 2018
d5e9041
Added ability to add multiple notifications beforehand for the same p…
Mar 9, 2018
19588e1
Added ability to notify about anniversaries, custom anniversaries as …
Mar 14, 2018
dd20e04
Reworked alarms so that the app no longer creates a separate alarm fo…
Apr 17, 2018
d3c17be
Fixed famous persons after switching to LocalDate from joda-time.
Apr 18, 2018
9d70f14
Switched package from com.djonique.birtydas to com.eblis.whenwasit.
Jul 28, 2018
706f893
When ads are disabled show a final rewards ad.
Jul 29, 2018
f22f55d
If rewards ad fails to load don't keep trying to load it.
Jul 29, 2018
c2b7e07
Fixed NPEs when switching from knowing year and not knowing year when…
Aug 1, 2018
50bca08
Fixed problem where you couldn't add multiple contacts, they would al…
Aug 11, 2018
b60e2d0
Attempt to fix crash on Settings loading for the first time.
Aug 31, 2018
0086be9
Added contact pictures in details page and birthday notification.
Sep 1, 2018
aba5343
Fixed crash on Android Pie
Sep 1, 2018
7747c61
Added banner file
Sep 1, 2018
6c5272e
Added profile pictures in month view and default list view.
Sep 14, 2018
ea3ad8b
Added ability to import contacts automatically every day (enabled by …
Sep 15, 2018
b2111b3
Guard against null pointer cursor when retrieving contacts.
Oct 13, 2018
29ca6c9
Attempt to guard against native errors when retrieving phone numbers.
Oct 13, 2018
cdba1a8
Update french wording
claireduf Nov 27, 2018
1a91f6c
Replace last occurences of name Birdays by WhenWasIt
claireduf Nov 29, 2018
9d0d772
Merge pull request #1 from claireduf/master
eblis Nov 29, 2018
d3e4858
Updated version number.
Nov 30, 2018
ed2e810
If rewards video fails to load just continue.
Nov 30, 2018
45585cb
Added note about recommended way of adding birthdays.
Jan 11, 2019
05dc61a
Added contact category and ability to add/edit it as well as search f…
Jan 12, 2019
8ac6f62
Added ability to contact users via WhatsApp and also allow them to se…
Feb 10, 2019
bf11d01
Fixed import/export to XML.
Mar 5, 2019
966056d
Fixed widget no longer working.
Mar 5, 2019
c67f533
Guard against invalid persons being added to the db.
Mar 9, 2019
e280928
Fixed problem with birthdays showing incorrect date when switching be…
Apr 13, 2019
53ce56a
Updating libraries and versions
eblis Apr 12, 2022
ae31cbe
Use a default person if we can't find it instead of null (avoids cras…
eblis Apr 20, 2022
88b4734
Use a default person if we can't find it instead of null (avoids cras…
eblis Feb 2, 2023
1202a32
Updated resources too at some point, check them in
eblis Feb 2, 2023
990e84c
Added colors for 2 days and 3 days to contact's birthday.
eblis Mar 30, 2023
4cdad2e
Ignore possible exceptions when adding famous people to the DB, we do…
eblis Mar 30, 2023
77bf630
Show one more ad when the user disables ads
eblis Mar 30, 2023
663c476
Allow application to be installed on Android 14
eblis Apr 1, 2023
50c44c7
Updated target sdk and other fixes. Updated version.
eblis Sep 1, 2026
d8bc2f2
Updated target SDK to 37.
eblis Sep 1, 2026
2a6f0bf
Fix edge to edge.
eblis Sep 1, 2026
1b69edd
Removed butterknife library.
eblis Sep 1, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# Implementation Plan - Edge-to-Edge Support

Enable edge-to-edge display support for all activities to comply with Android 15 requirements (SDK 35+).

## User Review Required

> [!IMPORTANT]
> Enabling edge-to-edge will make the status and navigation bars transparent/translucent. The app content will now draw behind these bars. I will apply insets to ensure critical UI elements (like the bottom AdView, FAB, and Top Toolbars) remain accessible and not obscured by system UI.

## Proposed Changes

### Dependencies

#### [MODIFY] [app/build.gradle](file:///D:/work/personal/Birdays/app/build.gradle)
* Add `androidx.activity:activity:1.13.0` to support `EdgeToEdge.enable()`.

### Activities

#### [MODIFY] [MainActivity.java](file:///D:/work/personal/Birdays/app/src/main/java/com/eblis/whenwasit/activities/MainActivity.java)
* Call `EdgeToEdge.enable(this)` in `onCreate`.
* Apply window insets to `appBarLayout` (top padding) and `adView` (bottom padding) and `fab` (bottom margin).

#### [MODIFY] [DetailActivity.java](file:///D:/work/personal/Birdays/app/src/main/java/com/eblis/whenwasit/activities/DetailActivity.java)
* Call `EdgeToEdge.enable(this)` in `onCreate`.
* Apply window insets to the root container.

#### [MODIFY] [EditActivity.java](file:///D:/work/personal/Birdays/app/src/main/java/com/eblis/whenwasit/activities/EditActivity.java)
* Call `EdgeToEdge.enable(this)` in `onCreate`.
* Apply window insets.

#### [MODIFY] [HelpActivity.java](file:///D:/work/personal/Birdays/app/src/main/java/com/eblis/whenwasit/activities/HelpActivity.java)
* Call `EdgeToEdge.enable(this)` in `onCreate`.

#### [MODIFY] [SettingsActivity.java](file:///D:/work/personal/Birdays/app/src/main/java/com/eblis/whenwasit/activities/SettingsActivity.java)
* Call `EdgeToEdge.enable(this)` in `onCreate`.

#### [MODIFY] [LicensesActivity.java](file:///D:/work/personal/Birdays/app/src/main/java/com/eblis/whenwasit/activities/LicensesActivity.java)
* Call `EdgeToEdge.enable(this)` in `onCreate`.

#### [MODIFY] [WidgetSettingsActivity.java](file:///D:/work/personal/Birdays/app/src/main/java/com/eblis/whenwasit/activities/WidgetSettingsActivity.java)
* Call `EdgeToEdge.enable(this)` in `onCreate`.

### Layouts

#### [MODIFY] [activity_main.xml](file:///D:/work/personal/Birdays/app/src/main/res/layout/activity_main.xml)
* Remove `fitsSystemWindows="true"` from `CoordinatorLayout` if necessary, or ensure it's handled correctly with the `AdView`.

## Verification Plan

### Automated Tests
* Run `./gradlew assembleDebug` to ensure compilation is successful.

### Manual Verification
* Deploy to a device/emulator running Android 15 (or targeting SDK 35+).
* Verify that:
* The status bar and navigation bar are transparent.
* The Toolbar is not overlapping with the status bar icons.
* The AdView at the bottom is not covered by the navigation bar.
* The FAB is correctly positioned above the AdView and Navigation Bar.
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
## Birdays
## WhenWasIt
*Simple birthday app with widget and famous people's birthdays.*

**[Install on Google Play](https://play.google.com/store/apps/details?id=com.djonique.birdays)**
**[Install on Google Play](https://play.google.com/store/apps/details?id=com.eblis.whenwasit)**

## Translators
Serhii Ponomarenko (Ukrainian) [mellangr](https://github.com/mellangr)

Expand Down Expand Up @@ -30,10 +31,13 @@ Omer Surer (Turkish)
Xiupeng (Chinese traditional)

Andra Fetele (Romanian) [sarmizegetusaa](https://github.com/sarmizegetusaa)

Claire Dufetrelle (French) [claireduf](https://github.com/claireduf)
## License

```
Copyright 2017 Evgeny Timofeev
Copyright 2018-2023 Cristian Libotean

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
Expand Down
110 changes: 63 additions & 47 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -16,85 +16,101 @@

apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.firebase-perf'
apply plugin: 'io.fabric'
apply plugin: 'com.google.firebase.crashlytics'

def keystorePropertiesFile = rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

android {
compileSdkVersion 27
buildToolsVersion '27.0.2'

signingConfigs {
signing {
keyAlias keystoreProperties['KeyAlias']
keyPassword keystoreProperties['KeyPassword']
storeFile file(keystoreProperties['KeyLocation'])
storePassword keystoreProperties['KeyPassword']
}
}
compileSdk 37
defaultConfig {
applicationId "com.djonique.birdays"
minSdkVersion 16
targetSdkVersion 27
versionCode 18
versionName "1.5.1"
resConfigs "auto"
applicationId "com.eblis.whenwasit"
multiDexEnabled true
minSdkVersion 24
targetSdk 37
versionCode 55
versionName "3.0.${versionCode}"
resourceConfigurations += ['en', 'be', 'de', 'el', 'es', 'fil', 'fr', 'hu', 'in', 'it', 'ja', 'kab', 'kk', 'nb', 'nl', 'pt', 'ro', 'ru', 'tr', 'uk', 'zh']
vectorDrawables.useSupportLibrary = true
resValue "string", "version_name", versionName
manifestPlaceholders = [fabric_api_key: keystoreProperties['FabricApiKey']]
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
}

buildTypes {
debug {
minifyEnabled false
resValue "string", "banner_ad_id", keystoreProperties['BannerAdIdDebug']
buildConfigField "String", "INTERSTITIAL_AD_ID", keystoreProperties['InterstitialAdIdDebug']
resValue "string", "admob_id", keystoreProperties['AdMobId']
resValue "string", "rewards_ad_id", keystoreProperties['RewardsAdIdDebug']
resValue "string", "native_rewards_id", keystoreProperties['NativeAdsIdDebug']
resValue "string", "interstitial_ad_id", keystoreProperties['InterstitialAdIdDebug']
resValue "string", "interstitial_rewards_id", keystoreProperties['RewardsInterstitialAdIdDebug']
signingConfig signingConfigs.signing
}
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
resValue "string", "banner_ad_id", keystoreProperties['BannerAdIdRelease']
buildConfigField "String", "INTERSTITIAL_AD_ID", keystoreProperties['InterstitialAdIdRelease']
resValue "string", "admob_id", keystoreProperties['AdMobId']
resValue "string", "native_rewards_id", keystoreProperties['NativeAdsIdRelease']
resValue "string", "rewards_ad_id", keystoreProperties['RewardsAdIdRelease']
resValue "string", "interstitial_ad_id", keystoreProperties['InterstitialAdIdRelease']
resValue "string", "interstitial_rewards_id", keystoreProperties['RewardsInterstitialAdIdRelease']
signingConfig signingConfigs.signing
firebaseCrashlytics {
mappingFileUploadEnabled false
}
}
}
lint {
abortOnError false
}
namespace 'com.eblis.whenwasit'
buildFeatures {
viewBinding true
buildConfig false
}
}

repositories {
maven { url 'https://maven.fabric.io/public' }
}

def androidSupportVersion = '27.0.2'
def firebaseVersion = '11.6.2'
def butterKnifeVersion = '8.8.1'

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')

implementation 'com.android.support:multidex:1.0.3'
implementation fileTree(include: ['*.jar'], dir: 'libs')
// Android support library
compile "com.android.support:appcompat-v7:${androidSupportVersion}"
compile "com.android.support:design:${androidSupportVersion}"
compile "com.android.support:recyclerview-v7:${androidSupportVersion}"
compile "com.android.support:cardview-v7:${androidSupportVersion}"
compile "com.android.support:support-v4:${androidSupportVersion}"
compile "com.android.support:support-vector-drawable:${androidSupportVersion}"

implementation 'androidx.appcompat:appcompat:1.8.0'
implementation 'androidx.activity:activity:1.13.0'
implementation 'com.google.android.material:material:1.14.0'
implementation 'androidx.recyclerview:recyclerview:1.4.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.legacy:legacy-support-v13:1.0.0'
implementation 'androidx.vectordrawable:vectordrawable:1.2.0'
// Firebase
compile "com.google.firebase:firebase-core:${firebaseVersion}"
compile "com.google.firebase:firebase-ads:${firebaseVersion}"
compile "com.google.firebase:firebase-perf:${firebaseVersion}"

// ButterKnife
compile "com.jakewharton:butterknife:${butterKnifeVersion}"
annotationProcessor "com.jakewharton:butterknife-compiler:${butterKnifeVersion}"

implementation "com.google.firebase:firebase-core:21.1.1"
implementation 'com.google.firebase:firebase-ads:23.6.0'
implementation 'com.google.firebase:firebase-perf:22.0.6'
//ads
implementation 'com.google.android.gms:play-services-ads:25.4.0'
implementation 'com.google.firebase:firebase-crashlytics:20.1.0'
implementation 'com.google.firebase:firebase-analytics:23.2.0'
// Material date and time picker
compile 'com.wdullaer:materialdatetimepicker:3.4.1'

implementation 'com.wdullaer:materialdatetimepicker:4.2.3'
// Rate this app
compile 'io.github.kobakei:ratethisapp:1.2.0'

implementation 'com.github.kobakei:Android-RateThisApp:1.2.0'
//implementation 'net.danlew:android.joda:2.9.9.3'
implementation 'joda-time:joda-time:2.14.3'
// Crashlytics
compile('com.crashlytics.sdk.android:crashlytics:2.6.8@aar') {
transitive = true
}

// JUnit
testCompile 'junit:junit:4.12'
testImplementation 'junit:junit:4.13.2'
}

apply plugin: 'com.google.gms.google-services'
4 changes: 4 additions & 0 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,7 @@
-keepattributes SourceFile,LineNumberTable
-keep class com.crashlytics.** { *; }
-dontwarn com.crashlytics.**
-dontwarn com.google.android.gms.**
-dontwarn com.google.ads.**
-dontwarn org.joda.time.**
-keep public class * extends android.support.*.preference.Preference
51 changes: 43 additions & 8 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,22 +18,33 @@

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.djonique.birdays"
android:installLocation="internalOnly">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permission android:name="oppo.permission.OPPO_COMPONENT_SAFE"/>
<uses-permission android:name="com.huawei.permission.external_app_settings.USE_COMPONENT"/>

<queries>
<package android:name="com.eblis.whenwasit" />
<package android:name="com.eblis.whenwasit.alarm"/>
<intent>
<action android:name="com.eblis.whenwasit.alarm.AlarmHelper"/>
</intent>
</queries>

<application
android:allowBackup="true"
android:fullBackupContent="@xml/backup_scheme"
android:icon="@mipmap/ic_launcher"
android:icon="@mipmap/ic_main_icon"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_main_icon"
android:supportsRtl="true"
android:theme="@style/BirdaysTheme"
tools:ignore="GoogleAppIndexingWarning">
Expand All @@ -46,16 +57,20 @@
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_notification" />

<!-- Fabric Crashlytics -->
<meta-data
android:name="io.fabric.ApiKey"
android:value="${fabric_api_key}" />

<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-6034779980737202~6440072426"/>

<!-- MainActivity -->
<activity
android:name=".activities.MainActivity"
android:label="@string/app_name"
android:theme="@style/BirdaysTheme.NoActionBar">
android:theme="@style/BirdaysTheme.NoActionBar"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
Expand Down Expand Up @@ -107,10 +122,20 @@
<!-- AlarmReceiver -->
<receiver
android:name=".alarm.AlarmReceiver"
android:process=":remote" />
android:exported="true"
android:enabled="true">
<intent-filter>
<action android:name="com.eblis.whenwasit.alarm.AlarmHelper"/>
</intent-filter>
<meta-data
android:name=".alarm.AlarmReceiver"
android:value=".activities.DetailActivity"
/>
</receiver>

<!-- AlarmSetter -->
<receiver android:name=".alarm.AlarmSetter">
<receiver android:name=".alarm.AlarmSetter"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
Expand All @@ -119,7 +144,8 @@
<!-- WidgetProvider-->
<receiver
android:name=".widget.WidgetProvider"
android:label="@string/app_name">
android:label="@string/app_name"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
Expand All @@ -128,9 +154,18 @@
android:resource="@xml/widget" />
</receiver>

<activity android:name="com.eblis.whenwasit.activities.WidgetSettingsActivity"
android:label="@string/app_name"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
</intent-filter>
</activity>

<!-- WidgetService -->
<service
android:name=".widget.WidgetService"
android:permission="android.permission.BIND_REMOTEVIEWS" />
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
</application>
</manifest>
Loading