xiongzhu 5 роки тому
батько
коміт
6cf766f396
34 змінених файлів з 864 додано та 57 видалено
  1. 6 5
      .idea/misc.xml
  2. 1 0
      app/build.gradle
  3. 15 3
      app/src/main/AndroidManifest.xml
  4. 0 0
      app/src/main/assets/auto_clean_animation.json
  5. BIN
      app/src/main/assets/auto_clean_images/img_0.png
  6. BIN
      app/src/main/assets/auto_clean_images/img_1.png
  7. BIN
      app/src/main/assets/auto_clean_images/img_2.png
  8. BIN
      app/src/main/assets/auto_clean_images/img_3.png
  9. BIN
      app/src/main/assets/auto_clean_images/img_4.png
  10. BIN
      app/src/main/assets/auto_clean_images/img_5.png
  11. 0 0
      app/src/main/assets/clean_kill_app.json
  12. 18 3
      app/src/main/java/com/izouma/booster/Utils.java
  13. 119 0
      app/src/main/java/com/izouma/booster/activity/CleanActivity.java
  14. 182 0
      app/src/main/java/com/izouma/booster/activity/KillActivity.java
  15. 36 4
      app/src/main/java/com/izouma/booster/activity/MainActivity.java
  16. 8 15
      app/src/main/java/com/izouma/booster/activity/ScanActivity.java
  17. 65 0
      app/src/main/java/com/izouma/booster/adapter/JunkItemAdapter.java
  18. 1 1
      app/src/main/java/com/izouma/booster/adapter/VpAdapter.java
  19. 51 0
      app/src/main/java/com/izouma/booster/data/Junk.java
  20. 18 3
      app/src/main/java/com/izouma/booster/fragment/HomeFragment.java
  21. 3 7
      app/src/main/java/com/izouma/booster/fragment/MyFragment.java
  22. 2 1
      app/src/main/java/com/izouma/booster/fragment/ToolFragment.java
  23. 2 2
      app/src/main/java/com/izouma/booster/viewModel/HomeViewModel.java
  24. 40 0
      app/src/main/java/com/izouma/booster/viewModel/KillViewModel.java
  25. 1 1
      app/src/main/java/com/izouma/booster/viewModel/ScanViewModel.java
  26. 148 0
      app/src/main/res/layout/activity_clean.xml
  27. 67 0
      app/src/main/res/layout/activity_kill.xml
  28. 1 1
      app/src/main/res/layout/activity_main.xml
  29. 2 2
      app/src/main/res/layout/activity_scan.xml
  30. 12 2
      app/src/main/res/layout/home_fragment.xml
  31. 42 0
      app/src/main/res/layout/item_junk_item.xml
  32. 1 0
      app/src/main/res/values/colors.xml
  33. 9 7
      app/src/main/res/values/strings.xml
  34. 14 0
      app/src/main/res/values/themes.xml

+ 6 - 5
.idea/misc.xml

@@ -3,9 +3,7 @@
   <component name="DesignSurface">
     <option name="filePathToZoomLevelMap">
       <map>
-        <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="../../../../../layout/custom_preview.xml" value="0.34974358974358977" />
         <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_home_btn.xml" value="0.2990867579908676" />
@@ -13,17 +11,20 @@
         <entry key="app/src/main/res/drawable/fg_home_btn.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/layout/activity_clean.xml" value="0.2898148148148148" />
+        <entry key="app/src/main/res/layout/activity_kill.xml" value="0.2898148148148148" />
         <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.41960507757404797" />
+        <entry key="app/src/main/res/layout/activity_scan.xml" value="0.2898148148148148" />
         <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/item_junk_item.xml" value="0.3023148148148148" />
         <entry key="app/src/main/res/layout/my_fragment.xml" value="0.25" />
         <entry key="app/src/main/res/layout/tool_fragment.xml" value="0.34010416666666665" />
         <entry key="app/src/main/res/menu/bottom_menu.xml" value="0.1875" />
       </map>
     </option>
   </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_15_PREVIEW" project-jdk-name="15" project-jdk-type="JavaSDK">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_15_PREVIEW" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/build/classes" />
   </component>
   <component name="ProjectType">

+ 1 - 0
app/build.gradle

@@ -49,6 +49,7 @@ dependencies {
     implementation 'androidx.navigation:navigation-fragment:2.3.5'
     implementation 'androidx.navigation:navigation-ui:2.3.5'
     implementation files('libs/cloudscan_sdk_5.0.5.20210521.aar')
+    implementation 'com.yqritc:recyclerview-flexibledivider:1.4.0'
 
     testImplementation 'junit:junit:4.+'
     androidTestImplementation 'androidx.test.ext:junit:1.1.2'

+ 15 - 3
app/src/main/AndroidManifest.xml

@@ -4,6 +4,8 @@
 
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
 
     <application
         android:allowBackup="true"
@@ -13,12 +15,22 @@
         android:supportsRtl="true"
         android:theme="@style/Theme.Booster">
         <activity
-            android:name=".ScanActivity"
+            android:name=".activity.CleanActivity"
             android:exported="true"
             android:screenOrientation="portrait"
-            android:theme="@style/Theme.Booster.TransparentStatus" />
+            android:theme="@style/Theme.Booster.Scan" />
         <activity
-            android:name=".MainActivity"
+            android:name=".activity.KillActivity"
+            android:exported="true"
+            android:screenOrientation="portrait"
+            android:theme="@style/Theme.Booster.Scan" />
+        <activity
+            android:name=".activity.ScanActivity"
+            android:exported="true"
+            android:screenOrientation="portrait"
+            android:theme="@style/Theme.Booster.Scan" />
+        <activity
+            android:name=".activity.MainActivity"
             android:exported="true"
             android:screenOrientation="portrait"
             android:theme="@style/Theme.Booster.TransparentStatus">

Різницю між файлами не показано, бо вона завелика
+ 0 - 0
app/src/main/assets/auto_clean_animation.json


BIN
app/src/main/assets/auto_clean_images/img_0.png


BIN
app/src/main/assets/auto_clean_images/img_1.png


BIN
app/src/main/assets/auto_clean_images/img_2.png


BIN
app/src/main/assets/auto_clean_images/img_3.png


BIN
app/src/main/assets/auto_clean_images/img_4.png


BIN
app/src/main/assets/auto_clean_images/img_5.png


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
app/src/main/assets/clean_kill_app.json


+ 18 - 3
app/src/main/java/com/izouma/booster/Utils.java

@@ -12,6 +12,8 @@ import androidx.core.content.ContextCompat;
 
 import java.io.FileWriter;
 import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -36,7 +38,7 @@ public class Utils {
     };
 
     public static List<PackageInfo> getInstalledAppsPkgInfo(Context context) {
-        List<PackageInfo> mPackageInfoList = new ArrayList<PackageInfo>();
+        List<PackageInfo> mPackageInfoList = new ArrayList<>();
         try {
             List<PackageInfo> packageInfoList = context.getPackageManager().getInstalledPackages(PackageManager.GET_META_DATA);
             for (PackageInfo pi : packageInfoList) {
@@ -51,9 +53,9 @@ public class Utils {
             return mPackageInfoList;
 
         } catch (RuntimeException re) {
-
+            re.printStackTrace();
         }
-        return new ArrayList<PackageInfo>();
+        return new ArrayList<>();
     }
 
     public static boolean isSystemPackage(PackageInfo packageInfo) {
@@ -80,4 +82,17 @@ public class Utils {
         return (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(context, perm));
 
     }
+
+    public static String toSizeStr(long size) {
+        double kb = size / 1024d;
+        if (kb < 1000) {
+            return BigDecimal.valueOf(kb).setScale(1, RoundingMode.HALF_UP).stripTrailingZeros().toPlainString() + "KB";
+        }
+        double mb = kb / 1024d;
+        if (mb < 1000) {
+            return BigDecimal.valueOf(mb).setScale(1, RoundingMode.HALF_UP).stripTrailingZeros().toPlainString() + "MB";
+        }
+        double gb = mb / 1024d;
+        return BigDecimal.valueOf(gb).setScale(1, RoundingMode.HALF_UP).stripTrailingZeros().toPlainString() + "GB";
+    }
 }

+ 119 - 0
app/src/main/java/com/izouma/booster/activity/CleanActivity.java

@@ -0,0 +1,119 @@
+package com.izouma.booster.activity;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.recyclerview.widget.LinearLayoutManager;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.TypeEvaluator;
+import android.animation.ValueAnimator;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.view.View;
+
+import com.izouma.booster.R;
+import com.izouma.booster.Utils;
+import com.izouma.booster.adapter.JunkItemAdapter;
+import com.izouma.booster.data.Junk;
+import com.izouma.booster.databinding.ActivityCleanBinding;
+import com.izouma.booster.databinding.ActivityKillBinding;
+import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+public class CleanActivity extends AppCompatActivity {
+
+    private ActivityCleanBinding binding;
+    private JunkItemAdapter adapter;
+
+    private Handler handler = new Handler(msg -> {
+        if (msg.what == 0) {
+            adapter.notifyItemChanged(msg.arg1);
+        }
+        return false;
+    });
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        binding = ActivityCleanBinding.inflate(getLayoutInflater());
+        View view = binding.getRoot();
+        setContentView(view);
+
+        List<Junk> list = new ArrayList<>();
+
+        list.add(new Junk("Cache", 0, true, false));
+        list.add(new Junk("Logs", 0, true, false));
+        list.add(new Junk("AD Junk", 0, true, false));
+        list.add(new Junk("Temp Files", 0, true, false));
+        list.add(new Junk("APKs", 0, true, false));
+
+
+        adapter = new JunkItemAdapter(list);
+        binding.list.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
+        binding.list.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this)
+                .colorResId(R.color.list_divider)
+                .build());
+        binding.list.setAdapter(adapter);
+
+        new Thread(() -> {
+            try {
+                Thread.sleep(3000);
+            } catch (Exception e) {
+            }
+            for (int i = 0; i < list.size(); i++) {
+                Junk junk = list.get(i);
+                junk.setScanning(false);
+                junk.setSize((long) (Math.random() * 10000000 + 100));
+                int finalI = i;
+                runOnUiThread(() -> {
+                    adapter.notifyItemChanged(finalI);
+                });
+                try {
+                    Thread.sleep(1000);
+                } catch (Exception e) {
+                }
+            }
+        }).start();
+
+
+        binding.animationView.setImageAssetsFolder("clean_rubbish_anim_img");
+        binding.animationView.setAnimation("clean_rubbish_anim.json");
+        binding.animationView.setRepeatCount(0);
+        binding.animationView.playAnimation();
+        binding.animationView.addAnimatorListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                binding.animationView.setAnimation("finish.json");
+                binding.animationView.setRepeatCount(0);
+                binding.animationView.playAnimation();
+                binding.tvCountdown.setVisibility(View.GONE);
+                binding.animationView.removeAllAnimatorListeners();
+                binding.animationView.addAnimatorListener(new AnimatorListenerAdapter() {
+                    @Override
+                    public void onAnimationEnd(Animator animation) {
+                        finish();
+                    }
+                });
+            }
+        });
+        ValueAnimator valueAnimator = ValueAnimator.ofObject((TypeEvaluator<BigDecimal>) (fraction, startValue, endValue) -> {
+                    Log.d("dddd", fraction + "");
+                    return startValue.subtract(endValue).multiply(BigDecimal.valueOf(1 - fraction));
+                },
+                BigDecimal.valueOf(1000000), BigDecimal.valueOf(0));
+        valueAnimator.setDuration(5000);
+        valueAnimator.addUpdateListener(animation -> {
+            BigDecimal value = (BigDecimal) animation.getAnimatedValue();
+            Log.d("zzz", value.toPlainString());
+            binding.tvCountdown.setText(Utils.toSizeStr(value.longValue()));
+        });
+        valueAnimator.start();
+    }
+}

+ 182 - 0
app/src/main/java/com/izouma/booster/activity/KillActivity.java

@@ -0,0 +1,182 @@
+package com.izouma.booster.activity;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.lifecycle.Observer;
+import androidx.lifecycle.ViewModelProvider;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.view.View;
+
+import com.airbnb.lottie.LottieDrawable;
+import com.izouma.booster.R;
+import com.izouma.booster.Utils;
+import com.izouma.booster.databinding.ActivityKillBinding;
+import com.izouma.booster.databinding.ActivityScanBinding;
+import com.izouma.booster.viewModel.KillViewModel;
+import com.izouma.booster.viewModel.ScanViewModel;
+import com.trustlook.sdk.cloudscan.CloudScanClient;
+import com.trustlook.sdk.data.PkgInfo;
+import com.trustlook.sdk.data.Region;
+
+import java.util.List;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+public class KillActivity extends AppCompatActivity {
+
+    public enum Type {
+        BATTERY,
+        CPU,
+        BOOST
+    }
+
+    public static void startWithType(Context context, Type type) {
+        Intent intent = new Intent(context, KillActivity.class);
+        intent.putExtra("type", type);
+        context.startActivity(intent);
+    }
+
+    private ActivityKillBinding binding;
+    private KillViewModel viewModel;
+    private final int MSG_NEXT_PGK = 0;
+
+    private final Handler handler = new Handler(msg -> {
+        switch (msg.what) {
+            case MSG_NEXT_PGK:
+                Integer nextValue = viewModel.getPkgIndex().getValue();
+                if (nextValue == null) {
+                    nextValue = 0;
+                } else if (nextValue == viewModel.getPackages().size() - 1) {
+                    done();
+                    return false;
+                } else {
+                    nextValue = nextValue + 1;
+                }
+                viewModel.getPkgIndex().postValue(nextValue);
+                hibernateNext();
+                break;
+        }
+        return false;
+    });
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        viewModel = new ViewModelProvider(this).get(KillViewModel.class);
+        binding = ActivityKillBinding.inflate(getLayoutInflater());
+        View view = binding.getRoot();
+        setContentView(view);
+
+        binding.toolbar.setNavigationOnClickListener(v -> {
+            finish();
+        });
+
+        Type type = (Type) getIntent().getSerializableExtra("type");
+        switch (type) {
+            case BATTERY:
+                binding.toolbar.setTitle(R.string.battery_saver);
+                binding.tvAnimDesc.setText(R.string.analyzing_battery_usage);
+                binding.animationView.setRepeatCount(1);
+                binding.animationView.setImageAssetsFolder("images");
+                binding.animationView.setAnimation("battery_scan_progress.json");
+
+                binding.animationView.addAnimatorListener(new AnimatorListenerAdapter() {
+                    @Override
+                    public void onAnimationEnd(Animator animation) {
+                        startHibernate();
+                    }
+                });
+                break;
+            case CPU:
+                binding.toolbar.setTitle(R.string.cpu_cooler);
+                binding.tvAnimDesc.setText(R.string.scanning_cpu);
+                binding.animationView.setRepeatCount(1);
+                binding.animationView.setImageAssetsFolder("images");
+                binding.animationView.setAnimation("cpu_cooler.json");
+
+                binding.animationView.addAnimatorListener(new AnimatorListenerAdapter() {
+                    @Override
+                    public void onAnimationEnd(Animator animation) {
+                        startHibernate();
+                    }
+                });
+                break;
+            case BOOST:
+                binding.toolbar.setTitle(R.string.boost);
+                binding.tvAnimDesc.setText(R.string.scanning_ram);
+                binding.animationView.setRepeatCount(0);
+                binding.animationView.setImageAssetsFolder("phoneboost_animation_images");
+                binding.animationView.setAnimation("phone_boost.json");
+
+                binding.animationView.addAnimatorListener(new AnimatorListenerAdapter() {
+                    @Override
+                    public void onAnimationEnd(Animator animation) {
+                        startHibernate();
+                    }
+                });
+                break;
+        }
+
+        viewModel.getPkgIndex().observe(this, integer -> {
+            if (integer == 0) {
+                binding.tvProgress.setVisibility(View.VISIBLE);
+                binding.appIcon.setVisibility(View.VISIBLE);
+            }
+            PackageInfo packageInfo = viewModel.getPackages().get(integer);
+            binding.tvAnimDesc.setText(getResources().getString(R.string.hibernating) + " " + packageInfo.applicationInfo.loadLabel(getPackageManager()));
+            binding.tvProgress.setText(integer + 1 + "/" + viewModel.getPackages().size() + " " + getString(R.string.apps_stopped));
+            try {
+                Drawable icon = getPackageManager().getApplicationIcon(packageInfo.packageName);
+                binding.appIcon.setImageDrawable(icon);
+            } catch (PackageManager.NameNotFoundException e) {
+                e.printStackTrace();
+            }
+        });
+    }
+
+    private void startHibernate() {
+        binding.animationView.removeAllAnimatorListeners();
+        binding.animationView.setImageAssetsFolder("clean_killprogress");
+        binding.animationView.setAnimation("clean_kill_app.json");
+        binding.animationView.setProgress(0);
+        binding.animationView.setRepeatCount(LottieDrawable.INFINITE);
+        binding.animationView.animate();
+        binding.animationView.playAnimation();
+
+        viewModel.setPackages(Utils.getInstalledAppsPkgInfo(this));
+        hibernateNext();
+    }
+
+    private void hibernateNext() {
+        Message message = new Message();
+        message.what = MSG_NEXT_PGK;
+        handler.sendMessageDelayed(new Message(), 150);
+    }
+
+    private void done() {
+        binding.tvAnimDesc.setVisibility(View.GONE);
+        binding.tvProgress.setVisibility(View.GONE);
+        binding.appIcon.setVisibility(View.GONE);
+        binding.animationView.setAnimation("finish.json");
+        binding.animationView.setRepeatCount(0);
+        binding.animationView.playAnimation();
+        binding.animationView.addAnimatorListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                finish();
+            }
+        });
+    }
+}

+ 36 - 4
app/src/main/java/com/izouma/booster/MainActivity.java → app/src/main/java/com/izouma/booster/activity/MainActivity.java

@@ -1,18 +1,25 @@
-package com.izouma.booster;
+package com.izouma.booster.activity;
 
 import android.content.Context;
-import android.os.Build;
+import android.content.pm.PackageManager;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.View;
-import android.view.Window;
-import android.view.WindowManager;
+import android.widget.Toast;
 
+import androidx.annotation.NonNull;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.lifecycle.ViewModelProvider;
 import androidx.viewpager2.widget.ViewPager2;
 
+import com.izouma.booster.fragment.HomeFragment;
+import com.izouma.booster.fragment.MyFragment;
+import com.izouma.booster.R;
+import com.izouma.booster.fragment.ToolFragment;
+import com.izouma.booster.Utils;
+import com.izouma.booster.adapter.VpAdapter;
 import com.izouma.booster.databinding.ActivityMainBinding;
+import com.izouma.booster.viewModel.HomeViewModel;
 
 public class MainActivity extends AppCompatActivity {
     private ActivityMainBinding binding;
@@ -68,4 +75,29 @@ public class MainActivity extends AppCompatActivity {
 
         return isPermissionOn;
     }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode,
+                                           @NonNull String permissions[], @NonNull int[] grantResults) {
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+        switch (requestCode) {
+            case 138: {
+                // If request is cancelled, the result arrays are empty.
+                if (grantResults.length > 0
+                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+                    // permission was granted, yay! Do the
+                    // contacts-related task you need to do.
+                    //finishSplash();
+                } else {
+                    // permission denied, boo! Disable the
+                    // functionality that depends on this permission.
+                    Toast.makeText(getBaseContext(), R.string.need_permissions, Toast.LENGTH_LONG).show();
+                }
+                return;
+            }
+
+            // other 'case' lines to check for other
+            // permissions this app might request.
+        }
+    }
 }

+ 8 - 15
app/src/main/java/com/izouma/booster/ScanActivity.java → app/src/main/java/com/izouma/booster/activity/ScanActivity.java

@@ -1,23 +1,17 @@
-package com.izouma.booster;
-
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.lifecycle.ViewModelProvider;
+package com.izouma.booster.activity;
 
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
-import android.content.Context;
-import android.graphics.Color;
-import android.os.Build;
+import android.annotation.SuppressLint;
 import android.os.Bundle;
 import android.util.Log;
 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 androidx.appcompat.app.AppCompatActivity;
+import androidx.lifecycle.ViewModelProvider;
+
 import com.izouma.booster.databinding.ActivityScanBinding;
+import com.izouma.booster.viewModel.ScanViewModel;
 import com.trustlook.sdk.cloudscan.CloudScanClient;
 import com.trustlook.sdk.cloudscan.CloudScanListener;
 import com.trustlook.sdk.data.AppInfo;
@@ -39,12 +33,9 @@ public class ScanActivity extends AppCompatActivity {
         View view = binding.getRoot();
         setContentView(view);
 
-        setSupportActionBar(binding.toolbar);
         binding.toolbar.setNavigationOnClickListener(v -> {
             finish();
         });
-        getSupportActionBar().setDisplayShowHomeEnabled(true);
-        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 
         binding.animationView.setMinAndMaxProgress(.44f, .93f);
 
@@ -60,11 +51,13 @@ public class ScanActivity extends AppCompatActivity {
                 Log.i(TAG, "onScanStarted");
             }
 
+            @SuppressLint("SetTextI18n")
             @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());
+                binding.tvProgress.setText(curr * 100 / total + "%");
             }
 
             @Override

+ 65 - 0
app/src/main/java/com/izouma/booster/adapter/JunkItemAdapter.java

@@ -0,0 +1,65 @@
+package com.izouma.booster.adapter;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.izouma.booster.Utils;
+import com.izouma.booster.data.Junk;
+import com.izouma.booster.databinding.ItemJunkItemBinding;
+
+import java.util.List;
+
+public class JunkItemAdapter extends RecyclerView.Adapter<JunkItemAdapter.JunkItemHolder> {
+
+    private List<Junk> list;
+
+    public JunkItemAdapter(List<Junk> list) {
+        this.list = list;
+    }
+
+    @NonNull
+    @Override
+    public JunkItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        ItemJunkItemBinding binding = ItemJunkItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
+        return new JunkItemHolder(binding);
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull JunkItemHolder holder, int position) {
+        Junk junk = list.get(position);
+        holder.getBinding().tvName.setText(junk.getType());
+        if (junk.isScanning()) {
+            holder.getBinding().tvSize.setVisibility(View.GONE);
+            holder.getBinding().progress.setVisibility(View.VISIBLE);
+            holder.getBinding().checkbox.setVisibility(View.GONE);
+        } else {
+            holder.getBinding().tvSize.setVisibility(View.VISIBLE);
+            holder.getBinding().tvSize.setText(Utils.toSizeStr(junk.getSize()));
+            holder.getBinding().progress.setVisibility(View.GONE);
+            holder.getBinding().checkbox.setVisibility(View.VISIBLE);
+        }
+    }
+
+    @Override
+    public int getItemCount() {
+        return list.size();
+    }
+
+
+    public static class JunkItemHolder extends RecyclerView.ViewHolder {
+        private ItemJunkItemBinding binding;
+
+        public JunkItemHolder(ItemJunkItemBinding binding) {
+            super(binding.getRoot());
+            this.binding = binding;
+        }
+
+        public ItemJunkItemBinding getBinding() {
+            return binding;
+        }
+    }
+}

+ 1 - 1
app/src/main/java/com/izouma/booster/VpAdapter.java → app/src/main/java/com/izouma/booster/adapter/VpAdapter.java

@@ -1,4 +1,4 @@
-package com.izouma.booster;
+package com.izouma.booster.adapter;
 
 import androidx.annotation.NonNull;
 import androidx.fragment.app.Fragment;

+ 51 - 0
app/src/main/java/com/izouma/booster/data/Junk.java

@@ -0,0 +1,51 @@
+package com.izouma.booster.data;
+
+public class Junk {
+    private String type;
+    private long size;
+    private boolean scanning;
+    private boolean checked;
+
+    public Junk() {
+    }
+
+    public Junk(String type, long size, boolean scanning, boolean checked) {
+        this.type = type;
+        this.size = size;
+        this.scanning = scanning;
+        this.checked = checked;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public long getSize() {
+        return size;
+    }
+
+    public void setSize(long size) {
+        this.size = size;
+    }
+
+    public boolean isScanning() {
+        return scanning;
+    }
+
+    public void setScanning(boolean scanning) {
+        this.scanning = scanning;
+    }
+
+    public boolean isChecked() {
+        return checked;
+    }
+
+    public void setChecked(boolean checked) {
+        this.checked = checked;
+    }
+
+}

+ 18 - 3
app/src/main/java/com/izouma/booster/HomeFragment.java → app/src/main/java/com/izouma/booster/fragment/HomeFragment.java

@@ -1,4 +1,4 @@
-package com.izouma.booster;
+package com.izouma.booster.fragment;
 
 import androidx.lifecycle.ViewModelProvider;
 
@@ -9,12 +9,15 @@ import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.fragment.app.Fragment;
 
-import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
+import com.izouma.booster.activity.CleanActivity;
+import com.izouma.booster.activity.KillActivity;
+import com.izouma.booster.activity.ScanActivity;
 import com.izouma.booster.databinding.HomeFragmentBinding;
+import com.izouma.booster.viewModel.HomeViewModel;
 
 public class HomeFragment extends Fragment {
 
@@ -41,9 +44,21 @@ public class HomeFragment extends Fragment {
             // Update the UI, in this case, a TextView.
         });
 
-        binding.btnBoost.setOnClickListener(v -> {
+        binding.btnScan.setOnClickListener(v -> {
             startActivity(new Intent(getContext(), ScanActivity.class));
         });
+        binding.btnBoost.setOnClickListener(v -> {
+            KillActivity.startWithType(getContext(), KillActivity.Type.BOOST);
+        });
+        binding.btnBattery.setOnClickListener(v -> {
+            KillActivity.startWithType(getContext(), KillActivity.Type.BATTERY);
+        });
+        binding.btnCpu.setOnClickListener(v -> {
+            KillActivity.startWithType(getContext(), KillActivity.Type.CPU);
+        });
+        binding.btnJunkClean.setOnClickListener(v -> {
+            startActivity(new Intent(getActivity(), CleanActivity.class));
+        });
     }
 
     @Override

+ 3 - 7
app/src/main/java/com/izouma/booster/MyFragment.java → app/src/main/java/com/izouma/booster/fragment/MyFragment.java

@@ -1,6 +1,5 @@
-package com.izouma.booster;
+package com.izouma.booster.fragment;
 
-import android.graphics.Color;
 import android.os.Bundle;
 
 import androidx.annotation.NonNull;
@@ -8,16 +7,13 @@ import androidx.annotation.Nullable;
 import androidx.fragment.app.Fragment;
 import androidx.lifecycle.ViewModelProvider;
 
-import android.text.Spannable;
-import android.text.SpannableString;
-import android.text.style.ForegroundColorSpan;
-import android.text.style.StyleSpan;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
-import com.izouma.booster.databinding.HomeFragmentBinding;
+import com.izouma.booster.R;
 import com.izouma.booster.databinding.MyFragmentBinding;
+import com.izouma.booster.viewModel.HomeViewModel;
 
 public class MyFragment extends Fragment {
 

+ 2 - 1
app/src/main/java/com/izouma/booster/ToolFragment.java → app/src/main/java/com/izouma/booster/fragment/ToolFragment.java

@@ -1,4 +1,4 @@
-package com.izouma.booster;
+package com.izouma.booster.fragment;
 
 import android.os.Bundle;
 
@@ -12,6 +12,7 @@ import android.view.View;
 import android.view.ViewGroup;
 
 import com.izouma.booster.databinding.ToolFragmentBinding;
+import com.izouma.booster.viewModel.HomeViewModel;
 
 public class ToolFragment extends Fragment {
 

+ 2 - 2
app/src/main/java/com/izouma/booster/HomeViewModel.java → app/src/main/java/com/izouma/booster/viewModel/HomeViewModel.java

@@ -1,4 +1,4 @@
-package com.izouma.booster;
+package com.izouma.booster.viewModel;
 
 import androidx.lifecycle.MutableLiveData;
 import androidx.lifecycle.ViewModel;
@@ -9,7 +9,7 @@ public class HomeViewModel extends ViewModel {
 
     public MutableLiveData<String> getUselessFileSize() {
         if (uselessFileSize == null) {
-            uselessFileSize = new MutableLiveData<String>();
+            uselessFileSize = new MutableLiveData<>();
         }
         return uselessFileSize;
     }

+ 40 - 0
app/src/main/java/com/izouma/booster/viewModel/KillViewModel.java

@@ -0,0 +1,40 @@
+package com.izouma.booster.viewModel;
+
+import android.content.pm.PackageInfo;
+
+import androidx.lifecycle.MutableLiveData;
+import androidx.lifecycle.ViewModel;
+
+import com.izouma.booster.activity.KillActivity;
+
+import java.util.List;
+
+public class KillViewModel extends ViewModel {
+
+    private MutableLiveData<KillActivity.Type> type;
+    private List<PackageInfo> packages;
+    private MutableLiveData<Integer> pkgIndex;
+
+    public MutableLiveData<KillActivity.Type> getType() {
+        if (type == null) {
+            type = new MutableLiveData<>();
+        }
+        return type;
+    }
+
+    public List<PackageInfo> getPackages() {
+        return packages;
+    }
+
+    public void setPackages(List<PackageInfo> packages) {
+        this.packages = packages;
+    }
+
+    public MutableLiveData<Integer> getPkgIndex() {
+        if (pkgIndex == null) {
+            pkgIndex = new MutableLiveData<>();
+        }
+        return pkgIndex;
+    }
+
+}

+ 1 - 1
app/src/main/java/com/izouma/booster/ScanViewModel.java → app/src/main/java/com/izouma/booster/viewModel/ScanViewModel.java

@@ -1,4 +1,4 @@
-package com.izouma.booster;
+package com.izouma.booster.viewModel;
 
 import androidx.lifecycle.ViewModel;
 

+ 148 - 0
app/src/main/res/layout/activity_clean.xml

@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".activity.CleanActivity">
+
+    <androidx.appcompat.widget.Toolbar
+        android:id="@+id/toolbar"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@color/light_green"
+        android:fitsSystemWindows="true"
+        app:layout_constraintTop_toTopOf="parent"
+        app:navigationIcon="?attr/homeAsUpIndicator"
+        app:title="@string/junk_clean"
+        app:titleTextColor="@color/white" />
+
+    <androidx.appcompat.widget.LinearLayoutCompat
+        android:id="@+id/top"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@color/light_green"
+        android:fitsSystemWindows="true"
+        android:orientation="vertical"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/toolbar">
+
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="16dp"
+            android:layout_marginBottom="32dp"
+            android:baselineAligned="true">
+
+            <TextView
+                android:id="@+id/tv_size"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="32dp"
+                android:text="34.8"
+                android:textColor="@color/white"
+                android:textSize="50sp"
+                android:textStyle="bold" />
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="4dp"
+                android:text="MB"
+                android:textColor="@color/white"
+                android:textSize="20sp" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="32dp"
+            android:layout_marginBottom="8dp"
+            android:gravity="center">
+
+            <ImageView
+                android:layout_width="14dp"
+                android:layout_height="14dp"
+                android:layout_marginEnd="8dp"
+                android:src="@android:drawable/ic_dialog_info"
+                app:tint="#b0ffffff" />
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/app_name"
+                android:textColor="#b0ffffff" />
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text=" "
+                android:textColor="#b0ffffff"
+                android:textSize="13sp" />
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/does_not_delete_private_data"
+                android:textColor="#b0ffffff"
+                android:textSize="13sp" />
+        </LinearLayout>
+    </androidx.appcompat.widget.LinearLayoutCompat>
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/list"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/top" />
+
+    <Button
+        android:layout_width="0dp"
+        android:layout_height="54dp"
+        android:layout_marginLeft="16dp"
+        android:layout_marginRight="16dp"
+        android:layout_marginBottom="16dp"
+        android:backgroundTint="@color/light_green"
+        android:stateListAnimator="@null"
+        android:text="@string/clean"
+        android:textColor="@color/white"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent" />
+
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:background="@color/light_green"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/toolbar">
+
+        <com.airbnb.lottie.LottieAnimationView
+            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_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <TextView
+            android:id="@+id/tv_countdown"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="8dp"
+            android:text="33.2KB"
+            android:textColor="@color/white"
+            android:textSize="30sp"
+            android:textStyle="bold"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/animation_view" />
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 67 - 0
app/src/main/res/layout/activity_kill.xml

@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/light_green"
+    android:fitsSystemWindows="true"
+    tools:context=".activity.ScanActivity">
+
+    <androidx.appcompat.widget.Toolbar
+        android:id="@+id/toolbar"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        app:layout_constraintTop_toTopOf="parent"
+        app:navigationIcon="?attr/homeAsUpIndicator"
+        app:titleTextColor="@color/white" />
+
+    <com.airbnb.lottie.LottieAnimationView
+        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_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:lottie_autoPlay="true"
+        app:lottie_loop="true" />
+
+    <ImageView
+        android:id="@+id/app_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:src="@mipmap/ic_launcher"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="@id/animation_view"
+        app:layout_constraintLeft_toLeftOf="@id/animation_view"
+        app:layout_constraintRight_toRightOf="@id/animation_view"
+        app:layout_constraintTop_toTopOf="@id/animation_view" />
+
+    <TextView
+        android:id="@+id/tv_anim_desc"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/analyzing_battery_usage"
+        android:textColor="@color/white"
+        android:textSize="18sp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/animation_view" />
+
+    <TextView
+        android:id="@+id/tv_progress"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="16dp"
+        android:text="@string/apps_stopped"
+        android:textColor="@color/white"
+        android:textSize="13sp"
+        android:visibility="gone"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/tv_anim_desc" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 1 - 1
app/src/main/res/layout/activity_main.xml

@@ -5,7 +5,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/background"
-    tools:context=".MainActivity">
+    tools:context=".activity.MainActivity">
 
     <androidx.viewpager2.widget.ViewPager2
         android:id="@+id/vp"

+ 2 - 2
app/src/main/res/layout/activity_scan.xml

@@ -6,14 +6,14 @@
     android:layout_height="match_parent"
     android:background="@color/light_green"
     android:fitsSystemWindows="true"
-    tools:context=".ScanActivity">
+    tools:context=".activity.ScanActivity">
 
     <androidx.appcompat.widget.Toolbar
         android:id="@+id/toolbar"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         app:layout_constraintTop_toTopOf="parent"
-        app:theme="@style/ThemeOverlay.AppCompat.Dark"
+        app:navigationIcon="?attr/homeAsUpIndicator"
         app:title="@string/security"
         app:titleTextColor="@color/white">
 

+ 12 - 2
app/src/main/res/layout/home_fragment.xml

@@ -4,7 +4,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    tools:context=".HomeFragment">
+    tools:context=".fragment.HomeFragment">
 
     <ImageView
         android:layout_width="match_parent"
@@ -15,11 +15,13 @@
         app:layout_constraintTop_toTopOf="parent" />
 
     <LinearLayout
+        android:id="@+id/btn_scan"
         android:layout_width="214dp"
         android:layout_height="214dp"
         android:layout_marginTop="115dp"
         android:background="@drawable/bg_home_scan"
         android:gravity="center"
+        android:orientation="vertical"
         app:layout_constraintLeft_toLeftOf="parent"
         app:layout_constraintRight_toRightOf="parent"
         app:layout_constraintTop_toTopOf="parent">
@@ -27,10 +29,18 @@
         <TextView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="@string/clean"
+            android:text="@string/scan"
             android:textColor="@color/white"
             android:textSize="18sp"
             android:textStyle="bold" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="8dp"
+            android:text="@string/virus_and_privacy"
+            android:textColor="@color/white"
+            android:textSize="12sp" />
     </LinearLayout>
 
     <GridLayout

+ 42 - 0
app/src/main/res/layout/item_junk_item.xml

@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="72dp"
+    android:gravity="start|center">
+
+    <TextView
+        android:id="@+id/tv_name"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:layout_weight="1"
+        android:text="应用程序"
+        android:textColor="@color/black"
+        android:textSize="16sp" />
+
+    <TextView
+        android:id="@+id/tv_size"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="16dp"
+        android:text="33.3KB"
+        android:textColor="@color/black"
+        android:textSize="14sp" />
+
+    <ProgressBar
+        android:id="@+id/progress"
+        android:layout_width="24dp"
+        android:layout_height="24dp"
+        android:layout_marginEnd="16dp"
+        android:indeterminate="true"
+        android:indeterminateTint="@color/light_green" />
+
+    <CheckBox
+        android:id="@+id/checkbox"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginRight="14dp"
+        android:buttonTint="@color/light_green"
+        android:checked="true"
+        android:visibility="gone" />
+</LinearLayout>

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

@@ -9,4 +9,5 @@
     <color name="teal_700">#FF018786</color>
     <color name="black">#FF000000</color>
     <color name="white">#FFFFFFFF</color>
+    <color name="list_divider">#ebebeb</color>
 </resources>

+ 9 - 7
app/src/main/res/values/strings.xml

@@ -26,14 +26,16 @@
     <string name="under_the_protection_of_booster">under the protection of $appName</string>
     <string name="days">Days</string>
     <string name="title_activity_scan">ScanActivity</string>
-    <!-- Strings used for fragments for navigation -->
-    <string name="first_fragment_label">First Fragment</string>
-    <string name="second_fragment_label">Second Fragment</string>
-    <string name="next">Next</string>
-    <string name="previous">Previous</string>
 
-    <string name="hello_first_fragment">Hello first fragment</string>
-    <string name="hello_second_fragment">Hello second fragment. Arg: %1$s</string>
     <string name="security">Security</string>
     <string name="safety_scanning">Safety Scanning</string>
+    <string name="need_permissions">Please grant READ_EXTERNAL_STORAGE permission</string>
+    <string name="analyzing_battery_usage">Analyzing Battery Usage …</string>
+    <string name="apps_stopped">apps stopped</string>
+    <string name="hibernating">Hibernating</string>
+    <string name="scan">SCAN</string>
+    <string name="virus_and_privacy"><![CDATA[Virus & Privacy]]></string>
+    <string name="scanning_cpu">Scanning CPU …</string>
+    <string name="scanning_ram">Scanning RAM …</string>
+    <string name="does_not_delete_private_data">doesn\'t delete private data</string>
 </resources>

+ 14 - 0
app/src/main/res/values/themes.xml

@@ -25,4 +25,18 @@
         <item name="windowActionBar">false</item>
         <item name="windowNoTitle">true</item>
     </style>
+
+    <style name="Theme.Booster.Scan" parent="Theme.AppCompat.Light.NoActionBar">
+        <item name="colorPrimary">@color/light_green</item>
+        <item name="colorPrimaryVariant">@color/light_green</item>
+        <item name="colorOnPrimary">@color/background</item>
+        <item name="colorSecondary">@color/teal_200</item>
+        <item name="colorSecondaryVariant">@color/teal_700</item>
+        <item name="colorOnSecondary">@color/black</item>
+
+        <item name="android:screenOrientation">portrait</item>
+        <item name="android:windowTranslucentStatus">true</item>
+        <item name="android:statusBarColor" tools:targetApi="l">@android:color/transparent</item>
+        <item name="colorControlNormal">@color/white</item>
+    </style>
 </resources>

Деякі файли не було показано, через те що забагато файлів було змінено