Skip to content

Commit 30ef5d7

Browse files
committed
Added FCM, Crashlytics, languages and more..
1 parent 7a2a5b0 commit 30ef5d7

32 files changed

Lines changed: 1642 additions & 280 deletions

app/build.gradle.kts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ android {
1919
applicationId = "com.doxart.ivpn"
2020
minSdk = 24
2121
targetSdk = 34
22-
versionCode = 15
23-
versionName = "1.0"
22+
versionCode = 16
23+
versionName = "0.0.14"
2424

2525
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
2626

@@ -60,8 +60,11 @@ dependencies {
6060

6161
implementation ("androidx.room:room-runtime:2.6.0")
6262
implementation("com.google.firebase:firebase-messaging:23.3.1")
63+
implementation("com.android.volley:volley:1.2.1")
6364
annotationProcessor ("androidx.room:room-compiler:2.6.0")
6465

66+
implementation ("org.osmdroid:osmdroid-android:6.1.17")
67+
6568
implementation("androidx.lifecycle:lifecycle-viewmodel:2.6.2")
6669
implementation("androidx.lifecycle:lifecycle-livedata:2.6.2")
6770
implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.6.2")
@@ -79,6 +82,11 @@ dependencies {
7982
implementation ("io.adapty:android-ui:2.0.1")
8083

8184
implementation ("com.squareup.retrofit2:retrofit:2.9.0")
85+
implementation ("com.squareup.retrofit2:converter-gson:2.3.0")
86+
implementation ("com.jakewharton.picasso:picasso2-okhttp3-downloader:1.1.0")
87+
88+
implementation ("fr.bmartel:jspeedtest:1.32.1")
89+
implementation ("com.github.Gruzer:simple-gauge-android:0.3.1")
8290

8391
implementation ("com.github.bumptech.glide:glide:4.16.0")
8492
implementation("com.google.firebase:firebase-firestore:24.9.1")

app/src/main/AndroidManifest.xml

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,40 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3-
xmlns:tools="http://schemas.android.com/tools" >
3+
xmlns:tools="http://schemas.android.com/tools">
44

55
<uses-permission android:name="android.permission.INTERNET" />
66
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
77
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
88
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
9-
10-
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
9+
<uses-permission android:name="com.google.android.gms.permission.AD_ID" />
1110

1211
<application
1312
android:name=".DoxyVPN"
1413
android:allowBackup="true"
1514
android:dataExtractionRules="@xml/data_extraction_rules"
15+
android:exported="false"
1616
android:fullBackupContent="@xml/backup_rules"
1717
android:hardwareAccelerated="true"
1818
android:icon="@mipmap/ic_launcher"
1919
android:label="@string/app_name"
2020
android:roundIcon="@mipmap/ic_launcher_round"
2121
android:supportsRtl="true"
2222
android:theme="@style/Theme.IVPN"
23-
android:exported='false'
24-
tools:targetApi="34"
25-
tools:replace="android:fullBackupContent">
23+
android:usesCleartextTraffic="true"
24+
tools:replace="android:fullBackupContent"
25+
tools:targetApi="34">
26+
<activity
27+
android:name=".Activities.ConnectionReportActivity"
28+
android:exported="false" />
29+
<activity
30+
android:name=".Activities.SpeedTestActivity"
31+
android:exported="false" />
32+
<activity
33+
android:name=".Activities.MyLocationActivity"
34+
android:exported="false" />
2635
<activity
2736
android:name=".Activities.LauncherActivity"
28-
android:exported="true" >
37+
android:exported="true">
2938
<intent-filter>
3039
<action android:name="android.intent.action.MAIN" />
3140

@@ -48,17 +57,15 @@
4857
<service
4958
android:name="de.blinkt.openvpn.core.OpenVPNService"
5059
android:exported="true"
51-
android:permission="android.permission.BIND_VPN_SERVICE" >
60+
android:permission="android.permission.BIND_VPN_SERVICE">
5261
<intent-filter>
5362
<action android:name="android.net.VpnService" />
5463
</intent-filter>
5564
</service>
56-
5765
<service
5866
android:name=".Util.VPNCountdownTimer"
5967
android:enabled="true"
6068
android:exported="false" />
61-
6269
<service
6370
android:name=".Util.FCMService"
6471
android:exported="false">
@@ -73,14 +80,12 @@
7380
<meta-data
7481
android:name="com.google.firebase.messaging.default_notification_color"
7582
android:resource="@color/primary" />
76-
7783
<meta-data
7884
android:name="preloaded_fonts"
7985
android:resource="@array/preloaded_fonts" />
80-
8186
<meta-data
8287
android:name="com.google.android.gms.ads.APPLICATION_ID"
83-
android:value="@string/admob_id"/>
88+
android:value="@string/admob_id" />
8489
</application>
8590

8691
</manifest>
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package com.doxart.ivpn.Activities;
2+
3+
import androidx.appcompat.app.AppCompatActivity;
4+
import androidx.core.view.WindowInsetsCompat;
5+
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
6+
7+
import android.content.BroadcastReceiver;
8+
import android.content.Context;
9+
import android.content.Intent;
10+
import android.content.IntentFilter;
11+
import android.os.Bundle;
12+
import android.util.TypedValue;
13+
import android.view.WindowManager;
14+
15+
import com.bumptech.glide.Glide;
16+
import com.doxart.ivpn.Model.ServerModel;
17+
import com.doxart.ivpn.R;
18+
import com.doxart.ivpn.Util.Utils;
19+
import com.doxart.ivpn.databinding.ActivityConnectionReportBinding;
20+
import com.google.android.gms.ads.AdRequest;
21+
22+
public class ConnectionReportActivity extends AppCompatActivity {
23+
24+
ActivityConnectionReportBinding b;
25+
public static ServerModel server;
26+
private boolean isConnection;
27+
28+
@Override
29+
protected void onCreate(Bundle savedInstanceState) {
30+
super.onCreate(savedInstanceState);
31+
inflate();
32+
}
33+
34+
private void inflate() {
35+
b = ActivityConnectionReportBinding.inflate(getLayoutInflater());
36+
setContentView(b.getRoot());
37+
38+
getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
39+
40+
adjustMargins();
41+
setupView();
42+
init();
43+
}
44+
45+
private void adjustMargins() {
46+
int statusBarHeight = MainActivity.getInstance().getInsetsCompat().getInsets(WindowInsetsCompat.Type.statusBars()).top;
47+
int navigationBarHeight = MainActivity.getInstance().getInsetsCompat().getInsets(WindowInsetsCompat.Type.navigationBars()).bottom;
48+
49+
int pxToDp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics());
50+
51+
b.appbar.setPadding(0, statusBarHeight, 0, 0);
52+
}
53+
54+
private void setupView() {
55+
if (server != null) {
56+
isConnection = getIntent().getBooleanExtra("isConnection", true);
57+
58+
if (isConnection) b.connectionTypeTxt.setText(getString(R.string.connection_successful));
59+
else {
60+
b.connectionTypeTxt.setText(getString(R.string.connection_report));
61+
updateConnectionStatus(getIntent().getIntExtra("sessionM", 0), getIntent().getIntExtra("sessionS", 0));
62+
}
63+
64+
Glide.with(this).load("https://flagcdn.com/h80/" + server.getFlagUrl() + ".png").centerCrop().into(b.serverFlag);
65+
b.serverIp.setText(server.getIpv4());
66+
b.serverName.setText(server.getCountry());
67+
} else finish();
68+
}
69+
70+
private void init() {
71+
b.adView.loadAd(new AdRequest.Builder().build());
72+
b.closeBT.setOnClickListener(v -> finish());
73+
74+
b.shareBT.setOnClickListener(v -> Utils.shareApp(this));
75+
b.ratingView.setOnClickListener(v -> Utils.openAppInPlayStore(this));
76+
}
77+
78+
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
79+
@Override
80+
public void onReceive(Context context, Intent intent) {
81+
if (intent.getAction().equals("usage_data_updated")) {
82+
int m = intent.getIntExtra("usageMinutes", 0);
83+
int s = intent.getIntExtra("usageSeconds", 0);
84+
updateConnectionStatus(m, s);
85+
}
86+
}
87+
};
88+
89+
public void updateConnectionStatus(int m, int s) {
90+
int totalSeconds = m * 60 + s;
91+
String formattedTime = String.format("%02d s", totalSeconds % 60);
92+
b.serverTime.setText(formattedTime);
93+
}
94+
95+
@Override
96+
public void onResume() {
97+
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, new IntentFilter("connectionState"));
98+
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, new IntentFilter("usage_data_updated"));
99+
super.onResume();
100+
}
101+
102+
@Override
103+
public void onPause() {
104+
LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver);
105+
super.onPause();
106+
}
107+
}

app/src/main/java/com/doxart/ivpn/Activities/MainActivity.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ private void inflate() {
119119

120120
if (!SharePrefs.getInstance(this).getBoolean("premium"))
121121
startActivity(new Intent(this, PaywallActivity.class));
122+
else b.appbar.premiumBT.setVisibility(View.GONE);
122123

123124
getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
124125

@@ -127,7 +128,8 @@ private void inflate() {
127128
adjustMargin();
128129
if (SharePrefs.getInstance(this).isDynamicBackground())
129130
setBackground();
130-
createFragments();
131+
132+
init();
131133
}
132134

133135
private void setBackground() {
@@ -159,6 +161,18 @@ private void adjustMargin() {
159161
});
160162
}
161163

164+
private void init() {
165+
createFragments();
166+
167+
b.appbar.settingsBT.setOnClickListener(v -> openSettings());
168+
b.appbar.premiumBT.setOnClickListener(v -> startActivity(new Intent(this, PaywallActivity.class)));
169+
b.appbar.shareBT.setOnClickListener(v -> Utils.shareApp(this));
170+
b.appbar.locationBT.setOnClickListener(v -> startActivity(new Intent(this, MyLocationActivity.class)));
171+
b.appbar.speedTestBT.setOnClickListener(v -> startActivity(new Intent(this, SpeedTestActivity.class)));
172+
}
173+
174+
175+
162176
private void createFragments() {
163177
VPAdapter vpAdapter = new VPAdapter(getSupportFragmentManager(), getLifecycle());
164178

@@ -171,8 +185,6 @@ private void createFragments() {
171185

172186
b.mainPager.setCurrentItem(1, false);
173187

174-
b.appbar.settingsBT.setOnClickListener(v -> openSettings());
175-
176188
b.mainNav.setOnItemSelectedListener(item -> {
177189
if (item.getItemId() == R.id.navVpn) {
178190
b.mainNav.getMenu().findItem(R.id.navVpn).setChecked(true);

0 commit comments

Comments
 (0)