0
package com.project.applocker;

import android.app.ActivityManager;
import android.app.Service;
import android.app.usage.UsageStats;
import android.app.usage.UsageStatsManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import androidx.annotation.Nullable;

import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;


public class LockService extends Service {

    SaveState saveState;
    Context context;
    private String locked_app = null;
    private String current_app = null;
    SharedPreferences preferences;
    SharedPreferences.Editor editor;
    private int mInterval = 700;
    private Handler mHandler;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        mHandler = new Handler();
        startRepeatingTask();
        return START_STICKY;
    }
    Runnable mStatusChecker = new Runnable() {
        @Override
        public void run() {
            try {
                try {
                    context = LockService.this;
                    preferences=context.getSharedPreferences("chosen_apps", context.MODE_PRIVATE);
                    editor = preferences.edit();
                    saveState = new SaveState(context);
                    current_app = getRecentApps(context);
                  //  Log.d("current app:",current_app);
                    boolean lock_apps = saveState.getState();
                    if (lock_apps){
                        if (preferences.getBoolean(current_app,false)){
                            locked_app = getRecentApps(context);
                            startUnlockActivity(getRecentApps(context));
                        }
                    }
                    if (!lock_apps){
                        if(!current_app.contains("com.project.applocker")&&!current_app.equals(locked_app)){
                            saveState.saveState("true");
                        }
                        if (current_app.equals(locked_app)){
                        }
                    }
                }catch (Exception e){

                }

            } finally {
                mHandler.postDelayed(mStatusChecker, mInterval);
            }
        }
    };
    void startRepeatingTask() {
        mStatusChecker.run();
    }

    void stopRepeatingTask() {
        mHandler.removeCallbacks(mStatusChecker);
    }

    public String getRecentApps(Context context){
        String topPackageName = null;
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            UsageStatsManager mUsageStatsManager = (UsageStatsManager)context.getSystemService(Context.USAGE_STATS_SERVICE);
            long time = System.currentTimeMillis();
            List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000*10, time);
            if(stats != null) {
                SortedMap<Long,UsageStats> mySortedMap = new TreeMap<Long,UsageStats>();
                for (UsageStats usageStats : stats) {
                    mySortedMap.put(usageStats.getLastTimeUsed(),usageStats);
                }
                if(!mySortedMap.isEmpty()) {
                    topPackageName =  mySortedMap.get(mySortedMap.lastKey()).getPackageName();
                }
            }
        }else {
            ActivityManager am = (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE);
            List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
            ComponentName componentInfo = taskInfo.get(0).topActivity;
            topPackageName = componentInfo.getPackageName();
        }
        return topPackageName;
    }
    public void startUnlockActivity(String packagename){
        if (ManageLockType.getLockType().equals("tp")){
            Intent i = new Intent(LockService.this,EnterNormalPIN.class);
            i.putExtra("app",packagename);
            i.putExtra("try","true");
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(i);
        }
        if (ManageLockType.getLockType().equals("pin")){
            Intent i = new Intent(LockService.this,EnterNormalPIN.class);
            i.putExtra("app",packagename);
            i.putExtra("pin","true");
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(i);
        }
        if (ManageLockType.getLockType().equals("pattern")){
            Intent i = new Intent(LockService.this,EnterPatternLock.class);
            i.putExtra("app",packagename);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(i);
        }

    }
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        stopRepeatingTask();
    }
}
2020-04-08 10:06:25.162 8577-8577/com.project.applocker E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.project.applocker, PID: 8577
    java.lang.RuntimeException: Unable to stop service com.project.applocker.LockService@96e7439: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.os.Handler.removeCallbacks(java.lang.Runnable)' on a null object reference
        at android.app.ActivityThread.handleStopService(ActivityThread.java:3717)
        at android.app.ActivityThread.access$1700(ActivityThread.java:199)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1686)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.os.Handler.removeCallbacks(java.lang.Runnable)' on a null object reference
        at com.project.applocker.LockService.stopRepeatingTask(LockService.java:78)
        at com.project.applocker.LockService.onDestroy(LockService.java:136)
        at android.app.ActivityThread.handleStopService(ActivityThread.java:3697)
        at android.app.ActivityThread.access$1700(ActivityThread.java:199) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1686) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:193) 
        at android.app.ActivityThread.main(ActivityThread.java:6669) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 
Miss Chanandler Bong
  • 4,081
  • 10
  • 26
  • 36
  • Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.os.Handler.removeCallbacks(java.lang.Runnable)' on a null object reference at com.project.applocker.LockService.stopRepeatingTask(LockService.java:78) at com.project.applocker.LockService.onDestroy(LockService.java:136) – Masood Tech Apr 08 '20 at 17:30
  • Clearly, `mhandler` is `null` in `stopRepeatingTask` ... – Stephen C Apr 10 '20 at 07:48

0 Answers0