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)