xiongzhu 5 anni fa
parent
commit
b8e8e9eef7

+ 5 - 3
.idea/misc.xml

@@ -3,7 +3,9 @@
   <component name="DesignSurface">
   <component name="DesignSurface">
     <option name="filePathToZoomLevelMap">
     <option name="filePathToZoomLevelMap">
       <map>
       <map>
-        <entry key="../../../../../layout/custom_preview.xml" value="0.16822916666666668" />
+        <entry key="../../../../../layout/custom_preview.xml" value="0.15572916666666667" />
+        <entry key="../../../Library/Android/sdk/platforms/android-30/data/res/drawable/progress_horizontal.xml" value="0.3536458333333333" />
+        <entry key="../../../Library/Android/sdk/platforms/android-30/data/res/drawable/progress_horizontal_holo_dark.xml" value="0.3536458333333333" />
         <entry key="app/src/main/res/drawable-v24/ic_launcher_foreground.xml" value="0.31232876712328766" />
         <entry key="app/src/main/res/drawable-v24/ic_launcher_foreground.xml" value="0.31232876712328766" />
         <entry key="app/src/main/res/drawable/bg_cell.xml" value="0.31666666666666665" />
         <entry key="app/src/main/res/drawable/bg_cell.xml" value="0.31666666666666665" />
         <entry key="app/src/main/res/drawable/bg_home_btn.xml" value="0.2990867579908676" />
         <entry key="app/src/main/res/drawable/bg_home_btn.xml" value="0.2990867579908676" />
@@ -12,7 +14,7 @@
         <entry key="app/src/main/res/drawable/ic_launcher_background.xml" value="0.31666666666666665" />
         <entry key="app/src/main/res/drawable/ic_launcher_background.xml" value="0.31666666666666665" />
         <entry key="app/src/main/res/drawable/mine_mask.xml" value="0.31666666666666665" />
         <entry key="app/src/main/res/drawable/mine_mask.xml" value="0.31666666666666665" />
         <entry key="app/src/main/res/layout/activity_main.xml" value="0.25" />
         <entry key="app/src/main/res/layout/activity_main.xml" value="0.25" />
-        <entry key="app/src/main/res/layout/activity_scan.xml" value="0.2898148148148148" />
+        <entry key="app/src/main/res/layout/activity_scan.xml" value="0.41960507757404797" />
         <entry key="app/src/main/res/layout/fragment_tool.xml" value="0.34010416666666665" />
         <entry key="app/src/main/res/layout/fragment_tool.xml" value="0.34010416666666665" />
         <entry key="app/src/main/res/layout/home_fragment.xml" value="0.1911231884057971" />
         <entry key="app/src/main/res/layout/home_fragment.xml" value="0.1911231884057971" />
         <entry key="app/src/main/res/layout/my_fragment.xml" value="0.25" />
         <entry key="app/src/main/res/layout/my_fragment.xml" value="0.25" />
@@ -21,7 +23,7 @@
       </map>
       </map>
     </option>
     </option>
   </component>
   </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_15_PREVIEW" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_15_PREVIEW" project-jdk-name="15" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/build/classes" />
     <output url="file://$PROJECT_DIR$/build/classes" />
   </component>
   </component>
   <component name="ProjectType">
   <component name="ProjectType">

+ 2 - 1
app/build.gradle

@@ -35,7 +35,7 @@ android {
 }
 }
 
 
 dependencies {
 dependencies {
-
+    implementation fileTree(include: ['*.jar'], dir: 'libs')
     implementation 'androidx.appcompat:appcompat:1.3.0'
     implementation 'androidx.appcompat:appcompat:1.3.0'
     implementation 'com.google.android.material:material:1.3.0'
     implementation 'com.google.android.material:material:1.3.0'
     implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
     implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
@@ -48,6 +48,7 @@ dependencies {
     implementation "com.airbnb.android:lottie:3.7.0"
     implementation "com.airbnb.android:lottie:3.7.0"
     implementation 'androidx.navigation:navigation-fragment:2.3.5'
     implementation 'androidx.navigation:navigation-fragment:2.3.5'
     implementation 'androidx.navigation:navigation-ui:2.3.5'
     implementation 'androidx.navigation:navigation-ui:2.3.5'
+    implementation files('libs/cloudscan_sdk_5.0.5.20210521.aar')
 
 
     testImplementation 'junit:junit:4.+'
     testImplementation 'junit:junit:4.+'
     androidTestImplementation 'androidx.test.ext:junit:1.1.2'
     androidTestImplementation 'androidx.test.ext:junit:1.1.2'

BIN
app/libs/cloudscan_sdk_5.0.5.20210521.aar


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

@@ -3,6 +3,7 @@
     package="com.izouma.booster">
     package="com.izouma.booster">
 
 
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 
 
     <application
     <application
         android:allowBackup="true"
         android:allowBackup="true"
@@ -27,6 +28,10 @@
                 <category android:name="android.intent.category.LAUNCHER" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
             </intent-filter>
         </activity>
         </activity>
+
+        <meta-data
+            android:name="com.trustlook.ApiKey"
+            android:value="5ca17a70176b4a38ed8f2a0dce434401233a8860d57f4fba1489c804" />
     </application>
     </application>
 
 
 </manifest>
 </manifest>

+ 14 - 0
app/src/main/java/com/izouma/booster/MainActivity.java

@@ -1,5 +1,6 @@
 package com.izouma.booster;
 package com.izouma.booster;
 
 
+import android.content.Context;
 import android.os.Build;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Bundle;
 import android.util.Log;
 import android.util.Log;
@@ -53,5 +54,18 @@ public class MainActivity extends AppCompatActivity {
             }
             }
             return true;
             return true;
         });
         });
+
+        boolean getPermission = requestForPermission(getBaseContext());
+    }
+
+    public boolean requestForPermission(Context context) {
+
+        boolean isPermissionOn = true;
+        if (!Utils.canAccessExternalSd(context)) {
+            isPermissionOn = false;
+            requestPermissions(Utils.EXTERNAL_PERMS, Utils.EXTERNAL_REQUEST);
+        }
+
+        return isPermissionOn;
     }
     }
 }
 }

+ 84 - 0
app/src/main/java/com/izouma/booster/ScanActivity.java

@@ -3,16 +3,34 @@ package com.izouma.booster;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.lifecycle.ViewModelProvider;
 import androidx.lifecycle.ViewModelProvider;
 
 
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.content.Context;
+import android.graphics.Color;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Bundle;
+import android.util.Log;
 import android.view.View;
 import android.view.View;
 
 
+import com.airbnb.lottie.LottieProperty;
+import com.airbnb.lottie.model.KeyPath;
+import com.airbnb.lottie.value.LottieFrameInfo;
+import com.airbnb.lottie.value.SimpleLottieValueCallback;
 import com.izouma.booster.databinding.ActivityMainBinding;
 import com.izouma.booster.databinding.ActivityMainBinding;
 import com.izouma.booster.databinding.ActivityScanBinding;
 import com.izouma.booster.databinding.ActivityScanBinding;
+import com.trustlook.sdk.cloudscan.CloudScanClient;
+import com.trustlook.sdk.cloudscan.CloudScanListener;
+import com.trustlook.sdk.data.AppInfo;
+import com.trustlook.sdk.data.Region;
+
+import java.util.List;
 
 
 public class ScanActivity extends AppCompatActivity {
 public class ScanActivity extends AppCompatActivity {
     private ScanViewModel viewModel;
     private ScanViewModel viewModel;
     private ActivityScanBinding binding;
     private ActivityScanBinding binding;
 
 
+    private final String TAG = "ScanActivity";
+
     @Override
     @Override
     protected void onCreate(Bundle savedInstanceState) {
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         super.onCreate(savedInstanceState);
@@ -27,5 +45,71 @@ public class ScanActivity extends AppCompatActivity {
         });
         });
         getSupportActionBar().setDisplayShowHomeEnabled(true);
         getSupportActionBar().setDisplayShowHomeEnabled(true);
         getSupportActionBar().setDisplayHomeAsUpEnabled(true);
         getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+
+        binding.animationView.setMinAndMaxProgress(.44f, .93f);
+
+        CloudScanClient cloudScanClient = new CloudScanClient.Builder(getBaseContext())  // 设置服务地区,
+                .setRegion(Region.INTL)
+                .setConnectionTimeout(30000)
+                .setSocketTimeout(30000)
+                .build();
+
+        cloudScanClient.startQuickScan(new CloudScanListener() {
+            @Override
+            public void onScanStarted() {
+                Log.i(TAG, "onScanStarted");
+            }
+
+            @Override
+            public void onScanProgress(int curr, int total, AppInfo result) {
+                Log.i(TAG, "onScanProgress, " + "curr=" + curr + " total=" + total + " app name=" + result.getAppName());
+                binding.scanProgress.setProgress(curr * 100 / total);
+                binding.tvPackage.setText(result.getPackageName());
+            }
+
+            @Override
+            public void onScanError(int errCode) {
+                Log.i(TAG, "onScanError=" + errCode);
+            }
+
+            @Override
+            public void onScanCanceled() {
+                Log.i(TAG, "onScanCanceled");
+            }
+
+            @Override
+            public void onScanInterrupt() {
+                Log.i(TAG, "onScanInterrupt");
+            }
+
+            @Override
+            public void onScanFinished(List<AppInfo> results) {
+                Log.i(TAG, "onScanFinished" + results.size());
+                binding.tvProgress.setVisibility(View.GONE);
+                binding.scanning.setVisibility(View.GONE);
+                binding.scanProgress.setProgress(100);
+                binding.animationView.pauseAnimation();
+                binding.animationView.setAnimation("finish.json");
+                binding.animationView.setMinAndMaxProgress(0f, 1f);
+                binding.animationView.setRepeatCount(0);
+                binding.animationView.setProgress(0);
+                binding.animationView.playAnimation();
+                binding.animationView.addAnimatorListener(new AnimatorListenerAdapter() {
+                    @Override
+                    public void onAnimationEnd(Animator animation) {
+                        new Thread(() -> {
+                            try {
+                                Thread.sleep(500);
+                            } catch (InterruptedException e) {
+                                e.printStackTrace();
+                            }
+                            runOnUiThread(ScanActivity.this::finish);
+                        }).start();
+                    }
+                });
+            }
+        });
     }
     }
+
+
 }
 }

+ 83 - 0
app/src/main/java/com/izouma/booster/Utils.java

@@ -0,0 +1,83 @@
+package com.izouma.booster;
+
+import android.Manifest;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.util.Log;
+
+import androidx.core.content.ContextCompat;
+
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by mulinli on 11/29/17.
+ */
+
+public class Utils {
+
+    public static final String TAG = "DEMO";
+
+    public static final int CONNECTION_TIMEOUT = 30000;
+    public static final int SOCKET_TIMEOUT = 30000;
+
+    public static final int EXTERNAL_REQUEST = 138;
+    public static final String[] EXTERNAL_PERMS = {
+            Manifest.permission.WRITE_EXTERNAL_STORAGE,
+            Manifest.permission.READ_EXTERNAL_STORAGE,
+            Manifest.permission.READ_PHONE_STATE,
+            Manifest.permission.ACCESS_FINE_LOCATION,
+            Manifest.permission.ACCESS_COARSE_LOCATION
+    };
+
+    public static List<PackageInfo> getInstalledAppsPkgInfo(Context context) {
+        List<PackageInfo> mPackageInfoList = new ArrayList<PackageInfo>();
+        try {
+            List<PackageInfo> packageInfoList = context.getPackageManager().getInstalledPackages(PackageManager.GET_META_DATA);
+            for (PackageInfo pi : packageInfoList) {
+
+                if (pi != null && pi.applicationInfo != null) {
+                    if (!isSystemPackage(pi)) {
+                        mPackageInfoList.add(pi);
+                    }
+                }
+            }
+            Log.d("TrustLookSDK", "=> Total installed packages: " + mPackageInfoList.size());
+            return mPackageInfoList;
+
+        } catch (RuntimeException re) {
+
+        }
+        return new ArrayList<PackageInfo>();
+    }
+
+    public static boolean isSystemPackage(PackageInfo packageInfo) {
+        return ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
+    }
+
+    public static void writeToSD(String line, boolean appendMode) {
+        String filePath = "/sdcard/trustlook.csv";
+        FileWriter fileWriter = null;
+        try {
+            fileWriter = new FileWriter(filePath, appendMode);
+            fileWriter.write(line);
+            fileWriter.close();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static boolean canAccessExternalSd(Context context) {
+        return (hasPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE));
+    }
+
+    private static boolean hasPermission(Context context, String perm) {
+        return (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(context, perm));
+
+    }
+}

+ 75 - 8
app/src/main/res/layout/activity_scan.xml

@@ -20,8 +20,12 @@
     </androidx.appcompat.widget.Toolbar>
     </androidx.appcompat.widget.Toolbar>
 
 
     <com.airbnb.lottie.LottieAnimationView
     <com.airbnb.lottie.LottieAnimationView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
+        android:id="@+id/animation_view"
+        android:layout_width="250dp"
+        android:layout_height="250dp"
+        android:layout_marginBottom="70dp"
+        android:scaleType="centerInside"
+        app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toRightOf="parent"
         app:layout_constraintRight_toRightOf="parent"
         app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintTop_toTopOf="parent"
@@ -30,14 +34,77 @@
         app:lottie_imageAssetsFolder="virus_scan_images"
         app:lottie_imageAssetsFolder="virus_scan_images"
         app:lottie_loop="true" />
         app:lottie_loop="true" />
 
 
-    <com.airbnb.lottie.LottieAnimationView
+    <TextView
+        android:id="@+id/tv_progress"
         android:layout_width="wrap_content"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_height="wrap_content"
+        android:layout_marginBottom="78dp"
+        android:text="0%"
+        android:textColor="@color/white"
+        android:textSize="30sp"
+        android:textStyle="bold"
+        app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toRightOf="parent"
         app:layout_constraintRight_toRightOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        app:lottie_autoPlay="true"
-        app:lottie_fileName="progress_bg.json"
-        app:lottie_imageAssetsFolder="progress_lottie"
-        app:lottie_loop="true" />
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <LinearLayout
+        android:id="@+id/scanning"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/animation_view">
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/safety_scanning"
+            android:textColor="@color/white"
+            android:textSize="13sp" />
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="6dp">
+
+            <com.airbnb.lottie.LottieAnimationView
+                android:id="@+id/animation_progress_bg"
+                android:layout_width="wrap_content"
+                android:layout_height="4dp"
+                app:layout_constraintLeft_toLeftOf="parent"
+                app:layout_constraintRight_toRightOf="parent"
+                app:layout_constraintTop_toTopOf="parent"
+                app:lottie_autoPlay="true"
+                app:lottie_fileName="progress_bg.json"
+                app:lottie_imageAssetsFolder="progress_lottie"
+                app:lottie_loop="true" />
+
+            <ProgressBar
+                android:id="@+id/scan_progress"
+                style="@style/Widget.AppCompat.ProgressBar.Horizontal"
+                android:layout_width="0dp"
+                android:layout_height="2dp"
+                android:layout_marginTop="1dp"
+                android:progressBackgroundTint="@android:color/transparent"
+                android:progressTint="@color/white"
+                app:layout_constraintLeft_toLeftOf="@id/animation_progress_bg"
+                app:layout_constraintRight_toRightOf="@id/animation_progress_bg"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_goneMarginTop="1dp" />
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+        <TextView
+            android:id="@+id/tv_package"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="6dp"
+            android:textColor="#e0ffffff"
+            android:textSize="12sp"
+            app:layout_constraintStart_toStartOf="@id/scan_progress"
+            app:layout_constraintTop_toBottomOf="@id/scan_progress" />
+    </LinearLayout>
+
+
 </androidx.constraintlayout.widget.ConstraintLayout>
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 1 - 0
app/src/main/res/values/strings.xml

@@ -35,4 +35,5 @@
     <string name="hello_first_fragment">Hello first fragment</string>
     <string name="hello_first_fragment">Hello first fragment</string>
     <string name="hello_second_fragment">Hello second fragment. Arg: %1$s</string>
     <string name="hello_second_fragment">Hello second fragment. Arg: %1$s</string>
     <string name="security">Security</string>
     <string name="security">Security</string>
+    <string name="safety_scanning">Safety Scanning</string>
 </resources>
 </resources>

BIN
libs/cloudscan_sdk_5.0.5.20210521.aar


+ 1 - 1
settings.gradle

@@ -1,5 +1,5 @@
 dependencyResolutionManagement {
 dependencyResolutionManagement {
-    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
+    repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
     repositories {
     repositories {
         google()
         google()
         mavenCentral()
         mavenCentral()