Skip to content

Commit

Permalink
Merge pull request #223 from itsdrnoob/dev/2.4.0
Browse files Browse the repository at this point in the history
Dev/2.4.0
  • Loading branch information
itsdrnoob committed Dec 30, 2023
2 parents 3121b94 + d7de336 commit 900bb37
Show file tree
Hide file tree
Showing 1,380 changed files with 3,785 additions and 1,361 deletions.
21 changes: 21 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,27 @@
All notable changes to Data Monitor will be documented in this file.


## v2.4.0

Data Monitor v2.4.0 release <br>
This release features multiple changes and improvements.

### What's new?
- Added support for Android 14.
- Introducing Smart data allocation and quota alert (Beta). Manage your data plan with a daily quota, data rollover and usage alert.
- Updated plan details view. The home screen now features the number of days remaining in your data plan.
- Added custom filter for app usage. Now you can take control over viewing app data usage for any specific time period.

### Fixes and Improvements
- Fixed app usage showing incorrect total data usage at times.
- Fixed notification issues on Android 14.
- Improved calculations related to data plan and its validity.
- Localisation fixes and improvements.
- Fixed certain crashes and improved exception handling.
- Added Malay and Hebrew translations.
- Other minor changes and improvements.


## v2.3.2

Data Monitor v2.3.2 release <br>
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[![Version](https://shields.io/badge/version-v2.4.0-087AFF.svg)](https://github.com/itsdrnoob/DataMonitor/tree/dev/2.4.0)
[![Platform](https://shields.io/badge/platform-android-green.svg)](https://github.com/itsdrnoob/DataMonitor)
[![License](https://img.shields.io/badge/license-GPL3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.en.html)
[![Release](https://shields.io/badge/release-v2.3.2-blue.svg)](https://github.com/itsdrnoob/DataMonitor/releases)
[![Release](https://shields.io/badge/release-v2.4.0-blue.svg)](https://github.com/itsdrnoob/DataMonitor/releases)
[![Chat](https://img.shields.io/badge/Telegram%20Chat-blue?logo=telegram)](https://t.me/datamonitor)
[![Downloads](https://img.shields.io/github/downloads/itsdrnoob/DataMonitor/total)](https://github.com/itsdrnoob/DataMonitor/releases)

Expand Down
2 changes: 1 addition & 1 deletion VERSION.md
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v2.3.2
v2.4.0
16 changes: 9 additions & 7 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@ plugins {
}

android {
compileSdkVersion 33
buildToolsVersion "30.0.3"
compileSdk 34
// buildToolsVersion "30.0.3"

defaultConfig {
applicationId "com.drnoob.datamonitor"
minSdkVersion 23
targetSdkVersion 33
versionCode 24
versionName 'v2.3.2'
resConfigs "en", "ar", "cs", "de", "es", "fr", "hi", "in", "it", "ja", "ko",
"ml", "mr", "nb-rNO", "nl", "pl", "pt-rBR", "ro", "ru", "tr", "uk", "uz", "vi", "zh-rCN", "zh-rTW"
targetSdkVersion 34
versionCode 29
versionName 'v2.4.0'
resConfigs "en", "ar", "cs", "de", "es", "fr", "hi", "in", "it", "iw", "ja", "ko", "ml", "mr", "ms",
"nb-rNO", "nl", "pl", "pt-rBR", "ro", "ru", "tr", "uk", "uz", "vi", "zh-rCN", "zh-rTW"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
Expand Down Expand Up @@ -74,4 +74,6 @@ dependencies {
implementation 'io.ipinfo:ipinfo-api:2.1'
implementation 'com.squareup.okhttp3:okhttp:4.9.3'
implementation 'com.github.bumptech.glide:glide:4.15.1'
implementation "androidx.work:work-runtime:2.8.1"
implementation "androidx.work:work-runtime-ktx:2.8.1"
}
3 changes: 2 additions & 1 deletion app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,5 @@
# hide the original source file name.
#-renamesourcefileattribute SourceFile

-keep class io.ipinfo.api.** { *; }
-keep class io.ipinfo.api.** { *; }
-keepattributes SourceFile,LineNumberTable
26 changes: 23 additions & 3 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE"/>
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.VIBRATE" /> <!-- <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" -->
<!-- tools:ignore="QueryAllPackagesPermission" /> -->
Expand Down Expand Up @@ -91,7 +92,12 @@
<service
android:name=".utils.NotificationService"
android:enabled="true"
android:exported="true" />
android:exported="true"
android:foregroundServiceType="specialUse">
<property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
android:value="Service used to measure and show the data usage"/>
</service>

<service
android:name=".utils.DataUsageMonitor"
android:enabled="true"
Expand Down Expand Up @@ -144,11 +150,19 @@
<service
android:name=".utils.LiveNetworkMonitor"
android:enabled="true"
android:exported="true" />
android:exported="true"
android:foregroundServiceType="specialUse">
<property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
android:value="Service used to measure and show the network connection speed"/>
</service>
<service
android:name=".utils.CompoundNotification"
android:enabled="true"
android:exported="false" />
android:exported="false"
android:foregroundServiceType="specialUse">
<property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
android:value="Service used to measure and show the network connection speed as well as the data usage"/>
</service>

<activity
android:name=".ui.activities.MainActivity"
Expand Down Expand Up @@ -177,6 +191,12 @@
android:enabled="true"
android:exported="true" />

<receiver android:name=".utils.DailyQuotaAlertReceiver"
android:exported="true"/>

<receiver android:name=".utils.DailyQuotaAlertReceiver$ResetDataQuotaAlert"
android:exported="true"/>

<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
Expand Down
77 changes: 54 additions & 23 deletions app/src/main/java/com/drnoob/datamonitor/Common.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Typeface;
import android.icu.text.MessageFormat;
import android.os.Build;
import android.provider.Settings;
import android.text.Spannable;
Expand All @@ -56,7 +57,6 @@
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Toast;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AlertDialog;
Expand All @@ -76,6 +76,7 @@
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.snackbar.Snackbar;

import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
Expand Down Expand Up @@ -188,7 +189,6 @@ public static List<LanguageModel> refreshAvailableLanguages() {
list.add(new LanguageModel("Portuguese", "pt", "rBR"));
list.add(new LanguageModel("Spanish", "es", ""));
list.add(new LanguageModel("Ukrainian", "uk", ""));
// list.add(new LanguageModel("Bhojpuri", "bho", ""));
list.add(new LanguageModel("Hindi", "hi", ""));
list.add(new LanguageModel("Indonesian", "in", ""));
list.add(new LanguageModel("Korean", "ko", ""));
Expand All @@ -199,6 +199,8 @@ public static List<LanguageModel> refreshAvailableLanguages() {
list.add(new LanguageModel("Czech", "cs", ""));
list.add(new LanguageModel("Vietnamese", "vi", ""));
list.add(new LanguageModel("Japanese", "ja", ""));
list.add(new LanguageModel("Hebrew", "iw", ""));
list.add(new LanguageModel("Malay", "ms", ""));

Collections.sort(list, new Comparator<LanguageModel>() {
@Override
Expand Down Expand Up @@ -395,11 +397,11 @@ public static void postAlarmPermissionDeniedNotification(Context context) {
postNotification(context, managerCompat, builder, OTHER_NOTIFICATION_ID);
}

@SuppressLint("SimpleDateFormat")
public static String getPlanValidity(int session, Context context) {
String validity;
Calendar calendar = Calendar.getInstance();
String month, endDate, suffix, end;
String month, ordinal, end;
int endDate;
if (session == SESSION_MONTHLY) {
int planEnd = PreferenceManager.getDefaultSharedPreferences(context)
.getInt(DATA_RESET_DATE, 1);
Expand All @@ -411,8 +413,8 @@ public static String getPlanValidity(int session, Context context) {
if (today >= planEnd) {
calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + 1);
}
month = new SimpleDateFormat("MMMM").format(calendar.getTime());
endDate = String.valueOf(planEnd);
month = new SimpleDateFormat("MMMM", getCurrentLocale(context)).format(calendar.getTime());
endDate = planEnd;
}
else {
long planEndDateMillis;
Expand All @@ -426,30 +428,45 @@ public static String getPlanValidity(int session, Context context) {
planEndDateMillis = ((Number) planEndIntValue).longValue();
}
calendar.setTimeInMillis(planEndDateMillis);
month = new SimpleDateFormat("MMMM").format(calendar.getTime());
endDate = new SimpleDateFormat("d").format(calendar.getTime());
month = new SimpleDateFormat("MMMM", getCurrentLocale(context)).format(calendar.getTime());
endDate = calendar.get(Calendar.DAY_OF_MONTH);
}
suffix = getDateSuffix(endDate);
end = endDate + suffix + " " + month;
ordinal = formatOrdinalNumber(endDate, context);
end = ordinal + " " + month;
validity = end;
return validity;
}

public static String getDateSuffix(String date) {
String suffix;
if (date.endsWith("1")) {
suffix = "st";
}
else if (date.endsWith("2")) {
suffix = "nd";
}
else if (date.endsWith("3")) {
suffix = "rd";
public static String formatOrdinalNumber(int number, Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
final String format = "{0,ordinal}";
final Locale locale = getCurrentLocale(context);
final MessageFormat formatter = new MessageFormat(format, locale);

return formatter.format(new Object[] {number});
} else {
String numberString = String.valueOf(number);
String suffix;
if (numberString.endsWith("1")) {
suffix = "st";
} else if (numberString.endsWith("2")) {
suffix = "nd";
} else if (numberString.endsWith("3")) {
suffix = "rd";
} else {
suffix = "th";
}
return numberString + suffix;
}
else {
suffix = "th";
}

public static Locale getCurrentLocale(Context context) {
final Configuration config = context.getResources().getConfiguration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return config.getLocales().get(0);
} else {
return config.locale;
}
return suffix;
}

private static boolean isLiveNetworkServiceRunning(Context context) {
Expand Down Expand Up @@ -507,4 +524,18 @@ public static void postNotification(Context context, NotificationManagerCompat n
}
}
}

public static String parseNumber(String number) {
if (number.matches("[0-9.,]+")) {
return number.replace(",", ".");
}
String output = "0.0";
NumberFormat numberFormat = NumberFormat.getInstance(Locale.US);
try {
output = numberFormat.parse(number).toString();
}
catch (Exception ignored) {}

return output;
}
}
8 changes: 8 additions & 0 deletions app/src/main/java/com/drnoob/datamonitor/core/Values.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ public class Values {
public static final int SESSION_ALL_TIME = 0x003C;
public static final int SESSION_MONTHLY = 0x00A9;
public static final int SESSION_CUSTOM = 0x00AC;
public static final int SESSION_CUSTOM_FILTER = 0x00AF;

public static final int TYPE_MOBILE_DATA = 0x0046;
public static final int TYPE_WIFI = 0x0050;
Expand Down Expand Up @@ -77,6 +78,7 @@ public class Values {
public static final int DIAGNOSTICS_HISTORY_FRAGMENT = 0x010E;
public static final int DATA_PLAN_FRAGMENT = 0x0118;
public static final int APP_CONTRIBUTORS_FRAGMENT = 0x0122;
public static final int ADD_CUSTOM_SESSION_FRAGMENT = 0x0136;

public static final int BOTTOM_NAVBAR_ITEM_HOME = 0;
public static final int BOTTOM_NAVBAR_ITEM_SETUP = 1;
Expand All @@ -91,6 +93,7 @@ public class Values {

public static final String SETUP_COMPLETED = "is_setup_complete";
public static final String DATA_LIMIT = "data_limit";
public static final String DATA_QUOTA = "data_quota";
public static final String DATA_TYPE = "data_type";
public static final String LIMIT = "limit";
public static final String DATA_RESET = "data_reset";
Expand All @@ -109,6 +112,7 @@ public class Values {
public static final String DATA_RESET_CUSTOM_DATE_RESTART = "custom_reset_date_restart";
public static final String DATA_WARNING_TRIGGER_LEVEL = "data_warning_trigger_level";
public static final String DATA_USAGE_WARNING_SHOWN = "data_usage_warning_shown";
public static final String DATA_QUOTA_WARNING_SHOWN = "data_quota_warning_shown";
public static final String DATA_USAGE_ALERT = "data_usage_alert";
public static final String WIDGET_REFRESH_INTERVAL_SUMMARY = "widget_refresh_interval_summary";
public static final String WIDGET_REFRESH_INTERVAL = "widget_refresh_interval";
Expand Down Expand Up @@ -185,4 +189,8 @@ public class Values {
public static final String WALL_OF_THANKS_FEATURED_DONORS = "wall_of_thanks_featured_donors";
public static final String WALL_OF_THANKS_ALL_DONORS = "wall_of_thanks_all_donors";


public static final String DATA_QUOTA_SCHEDULED_RESET = "quota_scheduled_reset";
public static final String DATA_QUOTA_PERFORMED_RESET = "quota_performed_reset";

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

import static com.drnoob.datamonitor.Common.setLanguage;
import static com.drnoob.datamonitor.core.Values.ABOUT_FRAGMENT;
import static com.drnoob.datamonitor.core.Values.ADD_CUSTOM_SESSION_FRAGMENT;
import static com.drnoob.datamonitor.core.Values.APP_CONTRIBUTORS_FRAGMENT;
import static com.drnoob.datamonitor.core.Values.APP_COUNTRY_CODE;
import static com.drnoob.datamonitor.core.Values.APP_DATA_LIMIT_FRAGMENT;
Expand Down Expand Up @@ -66,6 +67,7 @@
import com.drnoob.datamonitor.ui.fragments.AppDataLimitFragment;
import com.drnoob.datamonitor.ui.fragments.AppDataUsageFragment;
import com.drnoob.datamonitor.ui.fragments.ContributorsFragment;
import com.drnoob.datamonitor.ui.fragments.CustomSessionFragment;
import com.drnoob.datamonitor.ui.fragments.DataPlanFragment;
import com.drnoob.datamonitor.ui.fragments.DiagnosticsHistoryFragment;
import com.drnoob.datamonitor.ui.fragments.DiagnosticsSettingsFragment;
Expand Down Expand Up @@ -237,6 +239,12 @@ navigation bar icons being a light color (white). This limits visibility in ligh
fragment = new AppContributorsFragment();
title = getString(R.string.app_contributors);
break;

case ADD_CUSTOM_SESSION_FRAGMENT:
fragment = new CustomSessionFragment();
title = getString(R.string.add_custom_session);
getSupportActionBar().hide();
break;
}

getSupportFragmentManager().beginTransaction().replace(R.id.container_host_fragment, fragment).commit();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
import static com.drnoob.datamonitor.Common.isUsageAccessGranted;
import static com.drnoob.datamonitor.Common.refreshService;
import static com.drnoob.datamonitor.Common.setLanguage;
import static com.drnoob.datamonitor.Common.showAlarmPermissionDeniedDialog;
import static com.drnoob.datamonitor.core.Values.ALARM_PERMISSION_DENIED;
import static com.drnoob.datamonitor.core.Values.APP_COUNTRY_CODE;
import static com.drnoob.datamonitor.core.Values.APP_DATA_USAGE_WARNING_CHANNEL_ID;
Expand Down Expand Up @@ -66,8 +65,6 @@
import static com.drnoob.datamonitor.utils.NetworkStatsHelper.getTetheringDataUsage;

import android.Manifest;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.NotificationChannel;
Expand All @@ -94,14 +91,11 @@
import android.view.MenuItem;
import android.view.View;
import android.widget.RemoteViews;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.app.NotificationCompat;
import androidx.navigation.NavController;
import androidx.navigation.NavDestination;
import androidx.navigation.fragment.NavHostFragment;
Expand Down

0 comments on commit 900bb37

Please sign in to comment.