xiongzhu 2 år sedan
förälder
incheckning
35988e0a2a

+ 5 - 2
app/build.gradle

@@ -23,7 +23,7 @@ android {
             resValue "string", "app_name", "NBook"
             resValue "string", "app_name", "NBook"
         }
         }
         debug {
         debug {
-            applicationIdSuffix ".debug"
+//            applicationIdSuffix ".debug"
             versionNameSuffix "-debug"
             versionNameSuffix "-debug"
             resValue "string", "app_name", "NBook Debug"
             resValue "string", "app_name", "NBook Debug"
         }
         }
@@ -102,5 +102,8 @@ dependencies {
     implementation 'androidx.core:core-ktx:1.10.1'
     implementation 'androidx.core:core-ktx:1.10.1'
     implementation 'com.louiscad.splitties:splitties-fun-pack-android-base:3.0.0'
     implementation 'com.louiscad.splitties:splitties-fun-pack-android-base:3.0.0'
     implementation 'com.louiscad.splitties:splitties-fun-pack-android-material-components:3.0.0'
     implementation 'com.louiscad.splitties:splitties-fun-pack-android-material-components:3.0.0'
-    implementation 'com.github.dmytrodanylyk:circular-progress-button:1.3'
+    implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1'
+    implementation 'com.adjust.sdk:adjust-android:4.33.4'
+    implementation 'com.android.installreferrer:installreferrer:2.2'
+    implementation 'com.adjust.sdk:adjust-android-webbridge:4.33.4'
 }
 }

+ 14 - 0
app/proguard-rules.pro

@@ -39,3 +39,17 @@
 }
 }
 -keep public class * implements com.bumptech.glide.module.GlideModule
 -keep public class * implements com.bumptech.glide.module.GlideModule
 -dontwarn com.bumptech.glide.load.resource.bitmap.VideoDecoder
 -dontwarn com.bumptech.glide.load.resource.bitmap.VideoDecoder
+
+-keep class com.adjust.sdk.** { *; }
+-keep class com.google.android.gms.common.ConnectionResult {
+    int SUCCESS;
+}
+-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient {
+    com.google.android.gms.ads.identifier.AdvertisingIdClient$Info getAdvertisingIdInfo(android.content.Context);
+}
+-keep class com.google.android.gms.ads.identifier.AdvertisingIdClient$Info {
+    java.lang.String getId();
+    boolean isLimitAdTrackingEnabled();
+}
+-keep public class com.android.installreferrer.** { *; }
+-keep public class com.adjust.sdk.** { *; }

+ 2 - 0
app/src/main/AndroidManifest.xml

@@ -11,6 +11,8 @@
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
     <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
+
 
 
     <queries>
     <queries>
         <intent>
         <intent>

+ 15 - 11
app/src/main/java/com/dar/nbook/GalleryActivity.java

@@ -280,8 +280,12 @@ public class GalleryActivity extends BaseActivity {
         else if (id == R.id.download_torrent) downloadTorrent();
         else if (id == R.id.download_torrent) downloadTorrent();
         else if (id == R.id.load_internet) toInternet();
         else if (id == R.id.load_internet) toInternet();
         else if (id == R.id.manage_status) updateStatus();
         else if (id == R.id.manage_status) updateStatus();
-        else if (id == R.id.share) Global.shareGallery(this, gallery);
-        else if (id == R.id.comments) {
+        else if (id == R.id.share) {
+//            Global.shareGallery(this, gallery);
+            Global.shareURL(this, "NBook", "https://app.adjust.com/10xmoyh1?campaign="
+                + (Global.getNUser() == null ? "" : Global.getNUser().getId())
+                + "&label=invitor&redirect=https%3A%2F%2Fnbook.izouma.com%2Fapi%2Fdownload");
+        } else if (id == R.id.comments) {
             Intent i = new Intent(this, CommentActivity.class);
             Intent i = new Intent(this, CommentActivity.class);
             i.putExtra(getPackageName() + ".GALLERYID", gallery.getId());
             i.putExtra(getPackageName() + ".GALLERYID", gallery.getId());
             startActivity(i);
             startActivity(i);
@@ -304,7 +308,7 @@ public class GalleryActivity extends BaseActivity {
     }
     }
 
 
     private void downloadTorrent() {
     private void downloadTorrent() {
-        if(!Global.hasStoragePermission(this)){
+        if (!Global.hasStoragePermission(this)) {
             return;
             return;
         }
         }
 
 
@@ -313,28 +317,28 @@ public class GalleryActivity extends BaseActivity {
 
 
         new AuthRequest(referer, url, new Callback() {
         new AuthRequest(referer, url, new Callback() {
             @Override
             @Override
-            public void onFailure(@NonNull Call call,@NonNull  IOException e) {
+            public void onFailure(@NonNull Call call, @NonNull IOException e) {
                 GalleryActivity.this.runOnUiThread(() ->
                 GalleryActivity.this.runOnUiThread(() ->
                     Toast.makeText(GalleryActivity.this, R.string.failed, Toast.LENGTH_SHORT).show()
                     Toast.makeText(GalleryActivity.this, R.string.failed, Toast.LENGTH_SHORT).show()
                 );
                 );
             }
             }
 
 
             @Override
             @Override
-            public void onResponse(@NonNull Call call,@NonNull Response response) throws IOException {
-                File file=new File(Global.TORRENTFOLDER,gallery.getId()+".torrent");
+            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
+                File file = new File(Global.TORRENTFOLDER, gallery.getId() + ".torrent");
                 Utility.writeStreamToFile(response.body().byteStream(), file);
                 Utility.writeStreamToFile(response.body().byteStream(), file);
-                Intent intent=new Intent(Intent.ACTION_VIEW);
+                Intent intent = new Intent(Intent.ACTION_VIEW);
                 Uri torrentUri;
                 Uri torrentUri;
                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                     torrentUri = FileProvider.getUriForFile(GalleryActivity.this, GalleryActivity.this.getPackageName() + ".provider", file);
                     torrentUri = FileProvider.getUriForFile(GalleryActivity.this, GalleryActivity.this.getPackageName() + ".provider", file);
                     intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                     intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
-                }else{
-                    torrentUri=Uri.fromFile(file);
+                } else {
+                    torrentUri = Uri.fromFile(file);
                 }
                 }
                 intent.setDataAndType(torrentUri, "application/x-bittorrent");
                 intent.setDataAndType(torrentUri, "application/x-bittorrent");
                 try {
                 try {
                     GalleryActivity.this.startActivity(intent);
                     GalleryActivity.this.startActivity(intent);
-                }catch (RuntimeException ignore){
+                } catch (RuntimeException ignore) {
                     runOnUiThread(() ->
                     runOnUiThread(() ->
                         Toast.makeText(GalleryActivity.this, R.string.failed, Toast.LENGTH_SHORT).show()
                         Toast.makeText(GalleryActivity.this, R.string.failed, Toast.LENGTH_SHORT).show()
                     );
                     );
@@ -342,7 +346,7 @@ public class GalleryActivity extends BaseActivity {
                 }
                 }
                 file.deleteOnExit();
                 file.deleteOnExit();
             }
             }
-        }).setMethod("GET",null).start();
+        }).setMethod("GET", null).start();
     }
     }
 
 
     private void updateStatus() {
     private void updateStatus() {

+ 4 - 0
app/src/main/java/com/dar/nbook/MainActivity.java

@@ -694,6 +694,10 @@ public class MainActivity extends BaseActivity
             updateTagStatus(item, ts);
             updateTagStatus(item, ts);
         } else if (item.getItemId() == android.R.id.home) {
         } else if (item.getItemId() == android.R.id.home) {
             finish();
             finish();
+        } else if (item.getItemId() == R.id.share) {
+            Global.shareURL(this, "NBook", "https://app.adjust.com/10xmoyh1?campaign="
+                + (Global.getNUser() == null ? "" : Global.getNUser().getId())
+                + "&label=invitor&redirect=https%3A%2F%2Fnbook.izouma.com%2Fapi%2Fdownload");
         }
         }
         return super.onOptionsItemSelected(item);
         return super.onOptionsItemSelected(item);
     }
     }

+ 82 - 18
app/src/main/java/com/dar/nbook/components/activities/CrashApplication.java

@@ -1,15 +1,25 @@
 package com.dar.nbook.components.activities;
 package com.dar.nbook.components.activities;
 
 
 import android.annotation.SuppressLint;
 import android.annotation.SuppressLint;
+import android.app.Activity;
 import android.content.Context;
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.content.SharedPreferences;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager;
 import android.content.pm.Signature;
 import android.content.pm.Signature;
+import android.os.Bundle;
 
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatDelegate;
 import androidx.appcompat.app.AppCompatDelegate;
 import androidx.multidex.MultiDexApplication;
 import androidx.multidex.MultiDexApplication;
 
 
+import com.adjust.sdk.Adjust;
+import com.adjust.sdk.AdjustAttribution;
+import com.adjust.sdk.AdjustConfig;
+import com.adjust.sdk.AdjustLinkResolution;
+import com.adjust.sdk.LogLevel;
+import com.adjust.sdk.OnAttributionChangedListener;
 import com.dar.nbook.BuildConfig;
 import com.dar.nbook.BuildConfig;
 import com.dar.nbook.R;
 import com.dar.nbook.R;
 import com.dar.nbook.api.local.LocalGallery;
 import com.dar.nbook.api.local.LocalGallery;
@@ -22,6 +32,8 @@ import com.dar.nbook.settings.Global;
 import com.dar.nbook.settings.TagV2;
 import com.dar.nbook.settings.TagV2;
 import com.dar.nbook.utility.LogUtility;
 import com.dar.nbook.utility.LogUtility;
 import com.dar.nbook.utility.network.NetworkUtil;
 import com.dar.nbook.utility.network.NetworkUtil;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
 
 
 import org.acra.ACRA;
 import org.acra.ACRA;
 import org.acra.ReportField;
 import org.acra.ReportField;
@@ -45,6 +57,43 @@ import java.security.NoSuchAlgorithmException;
 public class CrashApplication extends MultiDexApplication {
 public class CrashApplication extends MultiDexApplication {
     private static final String SIGNATURE_GITHUB = "ce96fdbcc89991f083320140c148db5f";
     private static final String SIGNATURE_GITHUB = "ce96fdbcc89991f083320140c148db5f";
 
 
+    private static final class AdjustLifecycleCallbacks implements ActivityLifecycleCallbacks {
+
+        @Override
+        public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
+
+        }
+
+        @Override
+        public void onActivityStarted(@NonNull Activity activity) {
+        }
+
+        @Override
+        public void onActivityResumed(@NonNull Activity activity) {
+            Adjust.onResume();
+        }
+
+        @Override
+        public void onActivityPaused(@NonNull Activity activity) {
+            Adjust.onPause();
+        }
+
+        @Override
+        public void onActivityStopped(@NonNull Activity activity) {
+
+        }
+
+        @Override
+        public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {
+
+        }
+
+        @Override
+        public void onActivityDestroyed(@NonNull Activity activity) {
+
+        }
+    }
+
     @Override
     @Override
     public void onCreate() {
     public void onCreate() {
         super.onCreate();
         super.onCreate();
@@ -62,27 +111,42 @@ public class CrashApplication extends MultiDexApplication {
         TagV2.initMinCount(this);
         TagV2.initMinCount(this);
         TagV2.initSortByName(this);
         TagV2.initSortByName(this);
         DownloadGalleryV2.loadDownloads(this);
         DownloadGalleryV2.loadDownloads(this);
+
+        String appToken = "fxw7vkxfnl6o";
+        String environment = BuildConfig.BUILD_TYPE.equals("release") ? AdjustConfig.ENVIRONMENT_PRODUCTION : AdjustConfig.ENVIRONMENT_SANDBOX;
+        AdjustConfig config = new AdjustConfig(this, appToken, environment);
+        config.setLogLevel(LogLevel.VERBOSE);
+        config.setOnAttributionChangedListener(attribution -> {
+            LogUtility.d(new GsonBuilder().serializeSpecialFloatingPointValues().create().toJson(attribution));
+        });
+        Adjust.onCreate(config);
+
+        registerActivityLifecycleCallbacks(new AdjustLifecycleCallbacks());
+
+
     }
     }
 
 
     private boolean signatureCheck() {
     private boolean signatureCheck() {
-        try {
-            @SuppressLint("PackageManagerGetSignatures")
-            PackageInfo packageInfo = getPackageManager().getPackageInfo(
-                getPackageName(), PackageManager.GET_SIGNATURES);
-            //note sample just checks the first signature
-
-            for (Signature signature : packageInfo.signatures) {
-                // MD5 is used because it is not a secure data
-                MessageDigest m = MessageDigest.getInstance("MD5");
-                m.update(signature.toByteArray());
-                String hash = new BigInteger(1, m.digest()).toString(16);
-                LogUtility.d("Find signature: " + hash);
-                if (SIGNATURE_GITHUB.equals(hash)) return true;
-            }
-        } catch (NullPointerException | PackageManager.NameNotFoundException | NoSuchAlgorithmException e) {
-            e.printStackTrace();
-        }
-        return false;
+        return true;
+//        try {
+//            @SuppressLint("PackageManagerGetSignatures")
+//            PackageInfo packageInfo = getPackageManager().getPackageInfo(
+//                getPackageName(), PackageManager.GET_SIGNATURES);
+//            //note sample just checks the first signature
+//
+//            for (Signature signature : packageInfo.signatures) {
+//                // MD5 is used because it is not a secure data
+//                MessageDigest m = MessageDigest.getInstance("MD5");
+//                m.update(signature.toByteArray());
+//                String hash = new BigInteger(1, m.digest()).toString(16);
+//                LogUtility.d("Find signature: " + hash);
+//                if (SIGNATURE_GITHUB.equals(hash)) return true;
+//            }
+//        } catch (NullPointerException | PackageManager.NameNotFoundException |
+//                 NoSuchAlgorithmException e) {
+//            e.printStackTrace();
+//        }
+//        return false;
     }
     }
 
 
     private void afterUpdateChecks(SharedPreferences preferences, String oldVersion, String actualVersion) {
     private void afterUpdateChecks(SharedPreferences preferences, String oldVersion, String actualVersion) {

+ 11 - 5
app/src/main/res/menu/main.xml

@@ -27,11 +27,11 @@
         android:icon="@drawable/ic_sort"
         android:icon="@drawable/ic_sort"
         android:title="@string/sort_by_popular"
         android:title="@string/sort_by_popular"
         app:showAsAction="ifRoom|collapseActionView" />
         app:showAsAction="ifRoom|collapseActionView" />
-<!--    <item-->
-<!--        android:id="@+id/open_browser"-->
-<!--        android:icon="@drawable/ic_world"-->
-<!--        android:title="@string/open_in_browser"-->
-<!--        app:showAsAction="ifRoom|collapseActionView" />-->
+    <!--    <item-->
+    <!--        android:id="@+id/open_browser"-->
+    <!--        android:icon="@drawable/ic_world"-->
+    <!--        android:title="@string/open_in_browser"-->
+    <!--        app:showAsAction="ifRoom|collapseActionView" />-->
     <item
     <item
         android:id="@+id/add_bookmark"
         android:id="@+id/add_bookmark"
         android:icon="@drawable/ic_bookmark_border"
         android:icon="@drawable/ic_bookmark_border"
@@ -48,4 +48,10 @@
         android:title="@string/sort_by_title"
         android:title="@string/sort_by_title"
         android:visible="false"
         android:visible="false"
         app:showAsAction="never" />
         app:showAsAction="never" />
+    <item
+        android:id="@+id/share"
+        android:icon="@drawable/ic_share"
+        android:title="@string/share"
+        android:visible="true"
+        app:showAsAction="ifRoom|collapseActionView" />
 </menu>
 </menu>