xiongzhu před 5 roky
rodič
revize
0441dd8e45

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

@@ -1,11 +1,15 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
     package="com.izouma.booster">
 
     <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" />
+    <uses-permission
+        android:name="android.permission.PACKAGE_USAGE_STATS"
+        tools:ignore="ProtectedPermissions" />
 
     <application
         android:allowBackup="true"

+ 14 - 2
app/src/main/java/com/izouma/booster/Utils.java

@@ -1,6 +1,8 @@
 package com.izouma.booster;
 
 import android.Manifest;
+import android.app.ActivityManager;
+import android.app.usage.UsageStatsManager;
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
@@ -37,7 +39,8 @@ public class Utils {
             Manifest.permission.ACCESS_COARSE_LOCATION
     };
 
-    public static List<PackageInfo> getInstalledAppsPkgInfo(Context context) {
+    public static List<PackageInfo> getInstalledAppsPkgInfo(Context context, boolean running) {
+        UsageStatsManager m = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
         List<PackageInfo> mPackageInfoList = new ArrayList<>();
         try {
             List<PackageInfo> packageInfoList = context.getPackageManager().getInstalledPackages(PackageManager.GET_META_DATA);
@@ -45,7 +48,13 @@ public class Utils {
 
                 if (pi != null && pi.applicationInfo != null) {
                     if (!isSystemPackage(pi)) {
-                        mPackageInfoList.add(pi);
+                        if (running) {
+                            if (!m.isAppInactive(pi.packageName)) {
+                                mPackageInfoList.add(pi);
+                            }
+                        } else {
+                            mPackageInfoList.add(pi);
+                        }
                     }
                 }
             }
@@ -80,7 +89,10 @@ public class Utils {
 
     private static boolean hasPermission(Context context, String perm) {
         return (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(context, perm));
+    }
 
+    private static boolean isRunning(Context context, String packageName) {
+        return true;
     }
 
     public static String toSizeStr(long size) {

+ 10 - 1
app/src/main/java/com/izouma/booster/activity/KillActivity.java

@@ -7,6 +7,7 @@ import androidx.lifecycle.ViewModelProvider;
 
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
+import android.app.ActivityManager;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
@@ -144,6 +145,14 @@ public class KillActivity extends AppCompatActivity {
                 e.printStackTrace();
             }
         });
+
+
+        final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
+        final List<ActivityManager.RunningTaskInfo> recentTasks = activityManager.getRunningTasks(Integer.MAX_VALUE);
+
+        for (int i = 0; i < recentTasks.size(); i++) {
+            Log.d("Executed app", "Application executed : " + recentTasks.get(i).baseActivity.toShortString() + "\t\t ID: " + recentTasks.get(i).id + "");
+        }
     }
 
     private void startHibernate() {
@@ -155,7 +164,7 @@ public class KillActivity extends AppCompatActivity {
         binding.animationView.animate();
         binding.animationView.playAnimation();
 
-        viewModel.setPackages(Utils.getInstalledAppsPkgInfo(this));
+        viewModel.setPackages(Utils.getInstalledAppsPkgInfo(this, true));
         hibernateNext();
     }
 

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

@@ -1,17 +1,28 @@
 package com.izouma.booster.activity;
 
+import android.app.AppOpsManager;
+import android.app.usage.UsageStats;
+import android.app.usage.UsageStatsManager;
 import android.content.Context;
+import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.os.Build;
 import android.os.Bundle;
+import android.provider.Settings;
 import android.util.Log;
 import android.view.View;
 import android.widget.Toast;
 
+import androidx.activity.result.ActivityResultCallback;
+import androidx.activity.result.contract.ActivityResultContract;
+import androidx.activity.result.contract.ActivityResultContracts;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.lifecycle.ViewModelProvider;
 import androidx.viewpager2.widget.ViewPager2;
 
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 import com.izouma.booster.fragment.HomeFragment;
 import com.izouma.booster.fragment.MyFragment;
 import com.izouma.booster.R;
@@ -21,6 +32,8 @@ import com.izouma.booster.adapter.VpAdapter;
 import com.izouma.booster.databinding.ActivityMainBinding;
 import com.izouma.booster.viewModel.HomeViewModel;
 
+import java.util.List;
+
 public class MainActivity extends AppCompatActivity {
     private ActivityMainBinding binding;
     private HomeViewModel viewModel;
@@ -65,6 +78,22 @@ public class MainActivity extends AppCompatActivity {
         boolean getPermission = requestForPermission(getBaseContext());
     }
 
+    @Override
+    protected void onResume() {
+        super.onResume();
+        if (!hasAppOpsPermission()) {
+            new MaterialAlertDialogBuilder(this)
+                    .setMessage("need app usage permission")
+                    .setPositiveButton("open settings", (dialog, which) -> {
+                        dialog.dismiss();
+                        dialog.cancel();
+                        startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));
+                    })
+                    .setCancelable(false)
+                    .show();
+        }
+    }
+
     public boolean requestForPermission(Context context) {
 
         boolean isPermissionOn = true;
@@ -100,4 +129,14 @@ public class MainActivity extends AppCompatActivity {
             // permissions this app might request.
         }
     }
+
+    private boolean hasAppOpsPermission() {
+        AppOpsManager appOps = (AppOpsManager)
+                getSystemService(Context.APP_OPS_SERVICE);
+        int mode = 0;
+        mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,
+                android.os.Process.myUid(), getPackageName());
+        return mode == AppOpsManager.MODE_ALLOWED;
+    }
+
 }