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(); + } + +}