Java – Lock screen service before opening an application

Lock screen service before opening an application… here is a solution to the problem.

Lock screen service before opening an application

I’m trying to make an app that has a lock/password screen to protect your app before you open the selected app.

There are some on the market such as:

https://play.google.com/store/apps/details?id=com.domobile.applock&hl=en

This is an open source project on GitHub. https://github.com/twinone/AppLocker

I realized that even if the above app is killed, or RAM is cleared, or the phone is restarted, etc. The lock screen still shows the selected application.

Essentially, I want to implement the same thing they do, but at the moment I don’t have that through the service classes I wrote. I can lock the app, but I can’t when the app is terminated. I spent a lot of time learning about suspended intents, alert managers, broadcast receivers, and even working on sample source code

https://github.com/twinone/AppLocker/blob/master/src/com/twinone/locker/lock/AppLockService.java

But my implementation didn’t work out.

This is my service level:

package com.ibc.android.demo.appslist.app;

import android.app.ActivityManager;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.IBinder;
import android.util.Log;

import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
public class HeartBeat extends Service {

private static final String TAG = HeartBeat.class.getSimpleName();
    public Timer TIMER;

private static Set<AccessGranted> mAccessGrantedList = new HashSet<AccessGranted>();
    private Set<String> mLockedApps = new HashSet<String>();
    private long lastModified = 0;
    private BroadcastReceiver mScreenStateReceiver;
    private BroadcastReceiver mAccessGrantedReceiver;
    private File mLockedAppsFile;
    ArrayList<String> packagezList;
    SharedPreferences sharedPrefs;
    Map<String, ?> allEntries;
    SharedPreferences sharedPrefsapp;

String prefix;

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

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {

startService(new Intent(this, HeartBeat.class));

 Log.i("LocalService", "Received start id " + startId + ": " +
         intent);
         We want this service to continue running until it is explicitly
         stopped, so return sticky.
        if (TIMER == null) {

TIMER = new Timer(true);
            TIMER.scheduleAtFixedRate(new LockAppsTimerTask(), 1000, 250);

mScreenStateReceiver = new BroadcastReceiver() {

private boolean screenOff;

@Override
                public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
                        screenOff = true;
                    } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
                        screenOff = false;
                    }

if (screenOff) {
                        Log.i(TAG, "Cancel Timer");
                        TIMER.cancel();
                    } else {
                        Log.i(TAG, "Restart Timer");
                        TIMER = new Timer(true);
                        TIMER.scheduleAtFixedRate(new LockAppsTimerTask(), 1000, 250);
                    }
                }
            };

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
            filter.addAction(Intent.ACTION_SCREEN_OFF);
            registerReceiver(mScreenStateReceiver, filter);

mAccessGrantedReceiver = new BroadcastReceiver() {

@Override
                public void onReceive(Context context, Intent intent) {
                    String action = intent.getAction();
                    String packageName = intent.getStringExtra("packageName");
                    if (action.equals(Constants.ACTION_GRANT_ACCESS) && packageName != null) {
                        AccessGranted ag = new AccessGranted(packageName);
                        mAccessGrantedList.remove(ag);
                        mAccessGrantedList.add(ag);
                    }
                }
            };

IntentFilter filter2 = new IntentFilter(Constants.ACTION_GRANT_ACCESS);
            registerReceiver(mAccessGrantedReceiver, filter2);
        }
         this.stopSelf();

startforeground goes here

return START_STICKY;
    }

@Override
    public void onDestroy() {
        super.onDestroy();
        startService(new Intent(this, HeartBeat.class));
    }

private class LockAppsTimerTask extends TimerTask {

@Override
        public void run() {

sharedPrefs = getApplicationContext().getSharedPreferences(getApplicationContext().getPackageName(), Context.MODE_PRIVATE);
            sharedPrefsapp = getApplicationContext().getSharedPreferences("appdb", Context.MODE_PRIVATE);
            allEntries= null;
             allEntries = sharedPrefsapp.getAll();

prefix = "m";
            packagezList= null;

packagezList = new ArrayList<String>();

for (Map.Entry<String, ?> entry : allEntries.entrySet()) {
                    Log.e("right key: ", entry.getKey() + "right value: " + entry.getValue().toString()  );
                    packagezList.add(entry.getKey());

}

/*        for (Map.Entry<String, ?> entry : allEntries.entrySet())
        {
            Check if the package name starts with the prefix.
            if (entry.getKey().startsWith(prefix)) {
                Add JUST the package name (trim off the prefix).
                packagezList.add(entry.getKey().substring(prefix.length()));
            packagezList.add(entry.getKey());

}
        }*/

for(Object object: packagezList){
                Log.e("YO!", (String) object);
            }

ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);

try {
                List<RecentTaskInfo> recentTasks = activityManager.getRecentTasks(1, ActivityManager.RECENT_IGNORE_UNAVAILABLE);
                ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
                List<ActivityManager.RunningTaskInfo> RunningTask = mActivityManager
                        .getRunningTasks(1);
                ActivityManager.RunningTaskInfo ar = RunningTask.get(0);
                String activityOnTop = ar.topActivity.getPackageName();

 Log.e("activity on Top", "" + activityOnTop);
                   Log.e(" My package name", "" + getApplicationContext().getPackageName());

for (Object data : newArrayList) {

for(Object object: packagezList){

 Provide the packagename(s) of apps here, you want to show password activity
                    if ((activityOnTop.contains((CharSequence) object)) &&
                            (!activityOnTop.contains(getApplicationContext().getPackageName()
                            ))) {  // you have to make this check even better

Intent i = new Intent(getApplicationContext(), LockScreenActivity.class);
                        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
                        i.putExtra( "", "");
                        startActivity(i);
                    }

}

} catch (Exception e) {
                Log.e("Foreground App", e.getMessage(), e);
            }
        }

}

} 

This is my LockScreen Activity class (the screen that appears when the selected application is opened):

package com.ibc.android.demo.appslist.app;

import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;

import com.spicycurryman.getdisciplined10.app.R;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class LockScreenActivity extends Activity {
    private static final String TAG = LockScreenActivity.class.getSimpleName();
    Map<String, ?> allEntries;
    SharedPreferences sharedPrefsapp;
    ArrayList<String> packagezList;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setup);

}
    @Override
    public void onBackPressed() {

 Grab a list of all running processes and their PIDs.
        ActivityManager am = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> pids = am.getRunningAppProcesses();

 Now loop through the list of PIDs and find Instagram's PID.
        sharedPrefsapp = getApplicationContext().getSharedPreferences("appdb", Context.MODE_PRIVATE);
        allEntries= null;
        allEntries = sharedPrefsapp.getAll();

prefix = "m";
        packagezList= null;

packagezList = new ArrayList<String>();

for (Map.Entry<String, ?> entry : allEntries.entrySet()) {
            Log.e("right key: ", entry.getKey() + "right value: " + entry.getValue().toString()  );
            packagezList.add(entry.getKey());
        }

 Killing any process for blocked applications when the back button is pressed while the lock screen is displayed

for(Object object: packagezList){
            am.killBackgroundProcesses((String) object);
            Log.d("Killed Background Process!: ", (String) object);

}

 Now that we've got the PID, kill the Instagram process.

 Now that we've got the PID, kill the Instagram process.

ActivityManager  am1 = (ActivityManager) getApplicationContext().getSystemService(ACTIVITY_SERVICE);

 Display confirmation here, finish() activity.
        Intent startMain = new Intent(Intent.ACTION_MAIN);
        startMain.addCategory(Intent.CATEGORY_HOME);
        startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(startMain);

startService(new Intent(this, HeartBeat.class));

/*      Intent iHeartBeatService = new Intent(this, HeartBeat.class);
        PendingIntent piHeartBeatService = PendingIntent.getService(this, 0, iHeartBeatService, PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(piHeartBeatService);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 300000, piHeartBeatService); */

finish();
        super.onBackPressed();
    }

}

Now I can lock the app, but I can’t when the app is terminated or the phone restarts. App lock apps on Google Play Store can still successfully lock apps with a PIN if all apps are force-stopped or phone restarts, memory cleared, etc.

How can I achieve this like those people?

Solution

I think you should try this…

 package com.ankit.vkapplock;

import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.util.Log;

public class StartupServiceReceiver extends BroadcastReceiver {
 @Override
 public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){

context.startService(new Intent(context, HeartBeat.class  ));

}

Don’t forget to add permissions for the start completion operation.

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

Related Problems and Solutions