diff --git a/app/build.gradle b/app/build.gradle
index 16ca36c..10a51e9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -9,8 +9,8 @@ android {
applicationId "com.wt.pinger"
minSdkVersion versions.minSdkVersion
targetSdkVersion versions.targetSdkVersion
- versionCode 95
- versionName "3.4.7"
+ versionCode 96
+ versionName "3.4.8"
resConfigs "en", "pl"
vectorDrawables.useSupportLibrary = true
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index dc7e732..ea0459d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -60,16 +60,6 @@
android:value=".activity.MainActivity" />
-
-
-
-
-
-
-
= Build.VERSION_CODES.P) {
+ Crashlytics.setString("App Standby Bucket Name", VariousUtils.getAppStandbyBucketName(getApplicationContext()));
}
+ Crashlytics.setBool("Test Lab Device", VariousUtils.isTestLabDevice(getApplicationContext()));
+ Crashlytics.setBool("Background Restricted", VariousUtils.isBackgroundRestricted(getApplicationContext()));
File pingFile = new File("/system/bin/ping");
if (pingFile.exists()) {
diff --git a/app/src/main/java/com/wt/pinger/activity/MainActivity.java b/app/src/main/java/com/wt/pinger/activity/MainActivity.java
index d9fc89b..2c25d47 100644
--- a/app/src/main/java/com/wt/pinger/activity/MainActivity.java
+++ b/app/src/main/java/com/wt/pinger/activity/MainActivity.java
@@ -8,6 +8,7 @@
import android.view.Menu;
import android.view.MenuItem;
+import androidx.annotation.NonNull;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
@@ -110,15 +111,22 @@ public boolean onTabSelected(int position, boolean wasSelected) {
.replace(R.id.mainFrame, mainFragments[0])
.commit();
UserSync.get().saveUser(this);
- }
- mReferrerClient = InstallReferrerClient.newBuilder(this).build();
- try {
- mReferrerClient.startConnection(this);
- } catch (Exception e) {
- ERA.logException(e);
+ Prefs.getAsync(this, prefs -> {
+ if (!prefs.load(Constants.PREF_REFERRER_SAVED, false)) {
+ mReferrerClient = InstallReferrerClient.newBuilder(MainActivity.this).build();
+ try {
+ mReferrerClient.startConnection(MainActivity.this);
+ } catch (Exception e) {
+ ERA.logException(e);
+ }
+ }
+ });
+
}
+
+
ERA.log("MainActivity.onCreate:end");
}
@@ -149,7 +157,7 @@ protected void onResume() {
}
@Override
- protected void onSaveInstanceState(Bundle outState) {
+ protected void onSaveInstanceState(@NonNull Bundle outState) {
saveInstanceStateCalled = true;
super.onSaveInstanceState(outState);
}
@@ -173,13 +181,10 @@ public void onInstallReferrerSetupFinished(int responseCode) {
Console.logi("onInstallReferrerSetupFinished: InstallReferrer=" + response.getInstallReferrer());
}
ERA.log("onInstallReferrerSetupFinished: InstallReferrer=" + response.getInstallReferrer());
- Prefs.getAsync(ctx, new Prefs.OnPrefsReady() {
- @Override
- public void onReady(Prefs prefs) {
- if (!prefs.load(Constants.PREF_REFERRER_SAVED, false)) {
- prefs.save(Constants.PREF_REFERRER, response.getInstallReferrer());
- UserSync.get().saveUser(ctx);
- }
+ Prefs.getAsync(ctx, prefs -> {
+ if (!prefs.load(Constants.PREF_REFERRER_SAVED, false)) {
+ prefs.save(Constants.PREF_REFERRER, response.getInstallReferrer());
+ UserSync.get().saveUser(ctx);
}
});
mReferrerClient.endConnection();
@@ -195,6 +200,12 @@ public void onReady(Prefs prefs) {
break;
default:
ERA.log("onInstallReferrerSetupFinished: responseCode=" + responseCode + ", response not found");
+ case InstallReferrerClient.InstallReferrerResponse.DEVELOPER_ERROR:
+ ERA.log("onInstallReferrerSetupFinished: responseCode=" + responseCode + ", DEVELOPER_ERROR");
+ break;
+ case InstallReferrerClient.InstallReferrerResponse.SERVICE_DISCONNECTED:
+ ERA.log("onInstallReferrerSetupFinished: responseCode=" + responseCode + ", SERVICE_DISCONNECTED");
+ break;
}
}
diff --git a/app/src/main/java/com/wt/pinger/receivers/AppInstallReferrerReceiver.java b/app/src/main/java/com/wt/pinger/receivers/AppInstallReferrerReceiver.java
deleted file mode 100644
index dcb3b7c..0000000
--- a/app/src/main/java/com/wt/pinger/receivers/AppInstallReferrerReceiver.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.wt.pinger.receivers;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-
-import com.hivedi.console.Console;
-import com.wt.pinger.BuildConfig;
-import com.wt.pinger.data.UserSync;
-import com.wt.pinger.proto.Constants;
-import com.wt.pinger.utils.Prefs;
-
-/**
- * Created by Kenumir on 2016-12-29.
- *
- */
-
-public class AppInstallReferrerReceiver extends BroadcastReceiver {
-
- @Override
- public void onReceive(Context context, Intent intent) {
-
- String referrer = intent.getStringExtra("referrer");
- if (referrer != null && referrer.length() > 0) {
- Prefs prefs = Prefs.get(context);
- prefs.save(Constants.PREF_REFERRER, referrer);
- String uuid = prefs.load(Constants.PREF_UUID);
- if (uuid != null) {
- if (BuildConfig.DEBUG) {
- Console.logi("AppInstallReferrerReceiver: uuid=" + uuid + ", referrer=" + referrer );
- }
- UserSync.get().saveUser(context);
- } else {
- if (BuildConfig.DEBUG) {
- Console.logi("AppInstallReferrerReceiver: no UUID, skip sync");
- }
- }
- }
-
- if (BuildConfig.DEBUG) {
- Console.logi("AppInstallReferrerReceiver: INSTALL_REFERRER, referrer=" + referrer);
- }
- }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/wt/pinger/utils/VariousUtils.java b/app/src/main/java/com/wt/pinger/utils/VariousUtils.java
new file mode 100644
index 0000000..60bff80
--- /dev/null
+++ b/app/src/main/java/com/wt/pinger/utils/VariousUtils.java
@@ -0,0 +1,131 @@
+package com.wt.pinger.utils;
+
+import android.annotation.SuppressLint;
+import android.app.ActivityManager;
+import android.app.usage.UsageStatsManager;
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.Signature;
+import android.os.Build;
+import android.provider.Settings;
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+
+import com.hivedi.era.ERA;
+
+import java.security.MessageDigest;
+import java.util.Locale;
+
+public class VariousUtils {
+
+ @NonNull
+ @SuppressLint("PackageManagerGetSignatures")
+ public static String getAppFingerprint(@NonNull Context ctx) {
+ final PackageManager pm = ctx.getPackageManager();
+ try {
+ /*
+ * Może niestety zdazyć się błąd typu:
+ * RuntimeException Package manager has died
+ * Caused By: android.os.DeadObjectException
+ * Pojawia sie on gdy PackageManager z jakiegos powodu zawiesił się,
+ * mogła spowodować to inna aplikacja, w naszym przypadku zapytanie ograniczone
+ * jest do minimum, pytamy tylko o nasz package + sygantury więc mniej już nie można
+ */
+ PackageInfo info = pm.getPackageInfo(ctx.getPackageName(), PackageManager.GET_SIGNATURES);
+ String[] appCert = new String[info.signatures.length];
+ int i = 0;
+ for (Signature signature : info.signatures) {
+ MessageDigest md = MessageDigest.getInstance("SHA");
+ md.update(signature.toByteArray());
+ StringBuilder s = new StringBuilder();
+ for (byte b : md.digest()) {
+ s.append(":").append(String.format("%02x", b));
+ }
+ appCert[i] = s.substring(1).toUpperCase(Locale.getDefault());
+ i++;
+ }
+ return flatArray(appCert, ", ");
+ } catch (Throwable e) {
+ ERA.logException(e);
+ return "Error " + e;
+ }
+ }
+
+ @NonNull
+ public static String getAppInstallerPackage(@NonNull Context ctx) {
+ try {
+ String res = ctx.getPackageManager().getInstallerPackageName(ctx.getPackageName());
+ return TextUtils.isEmpty(res) ? "Empty" : res;
+ } catch (Throwable e) {
+ return "Error " + e;
+ }
+ }
+
+ public static boolean isTestLabDevice(@NonNull Context ctx) {
+ try {
+ // INFO sprawdzenie czy to urządzenie to test lab
+ // https://stackoverflow.com/a/43598581/959086
+ // https://firebase.google.com/docs/test-lab/android/android-studio#modify_instrumented_test_behavior_for_testlab
+ String testLabSetting = Settings.System.getString(ctx.getContentResolver(), "firebase.test.lab");
+ return "true".equals(testLabSetting);
+ } catch (Exception e) {
+ return false;
+ }
+ }
+
+ public static boolean isBackgroundRestricted(@NonNull Context ctx) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+ ActivityManager am = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
+ if (am != null) {
+ return am.isBackgroundRestricted();
+ }
+ }
+ return false;
+ }
+
+ @RequiresApi(api = Build.VERSION_CODES.P)
+ @NonNull
+ public static String getAppStandbyBucketName(@NonNull Context ctx) {
+ try {
+ UsageStatsManager sm = (UsageStatsManager) ctx.getSystemService(Context.USAGE_STATS_SERVICE);
+ if (sm != null) {
+ int bucketInt = sm.getAppStandbyBucket();
+ String bucket = "Unknown (" + bucketInt + ")";
+ switch (bucketInt) {
+ case UsageStatsManager.STANDBY_BUCKET_ACTIVE:
+ bucket = "BUCKET_ACTIVE";
+ break;
+ case UsageStatsManager.STANDBY_BUCKET_RARE:
+ bucket = "BUCKET_RARE";
+ break;
+ case UsageStatsManager.STANDBY_BUCKET_WORKING_SET:
+ bucket = "BUCKET_WORKING_SET";
+ break;
+ case UsageStatsManager.STANDBY_BUCKET_FREQUENT:
+ bucket = "BUCKET_FREQUENT";
+ break;
+ }
+ return bucket;
+ } else {
+ return "UsageStatsManager is NULL";
+ }
+ } catch (Exception e) {
+ return "Error " + e;
+ }
+ }
+
+ public static String flatArray(String[] s, String separator) {
+ StringBuilder res = new StringBuilder();
+ if (s != null && s.length > 0) {
+ for(String i : s) {
+ res.append(i).append(separator == null ? "" : separator);
+ }
+ res = new StringBuilder(res.substring(0, res.length() - (separator == null ? 0 : separator.length())));
+ }
+ return res.toString();
+ }
+
+}