package com.cfap.cfadevicemanager.services; import android.app.ActivityManager; import android.content.BroadcastReceiver; import android.content.ComponentName; 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.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Build; import android.util.Log; import android.widget.Toast; import java.lang.reflect.Field; import java.util.List; /** * Created by Shreya Jagarlamudi on 07/09/15. */ public class ForegroundActivityReceiver extends BroadcastReceiver{ private String TAG = "ForegroundActivityReceiver"; final int PROCESS_STATE_TOP = 2; private Context ctx; boolean connectedToCellularData; @Override public void onReceive(Context context, Intent intent) { ctx = context; connectedToCellularData = connToMobile(); if (connectedToCellularData==true){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) { foregroundTaskPostLollipop(); } else { foregroundTaskPre(); } } } public boolean connToMobile(){ final ConnectivityManager connMgr = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE); final android.net.NetworkInfo mobile = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); Log.e(TAG, "connToMobile: "+mobile.isConnected()); if (mobile.isConnected()) { return true; }else{ return false; } } public void foregroundTaskPostLollipop(){ // Log.e(TAG, "in/post Lollipop"); final PackageManager pm = ctx.getPackageManager(); Field field = null; try { field = ActivityManager.RunningAppProcessInfo.class.getDeclaredField("processState"); } catch (Exception ignored) { } ActivityManager activityManager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses(); if(appProcesses!=null){ for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) { try { PackageInfo pkgInfo = pm.getPackageInfo(appProcess.pkgList[0], PackageManager.GET_ACTIVITIES); if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND && appProcess.importanceReasonCode == ActivityManager.RunningAppProcessInfo.REASON_UNKNOWN){ Integer state = null; try { state = field.getInt(appProcess); } catch (Exception e) { } if (state != null && state == PROCESS_STATE_TOP) { if(appProcess.processName.equals("com.sec.android.app.launcher") || appProcess.processName.equals("com.cfap.cfadevicemanager") || (pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)!=0){ // Toast.makeText(ctx, "No applications are foreground at this time!", 3).show(); }else{ Toast.makeText(ctx, "You cannot access this application on cellular data plan", 3).show(); Intent i = new Intent(); i.setAction(Intent.ACTION_MAIN); i.addCategory(Intent.CATEGORY_HOME); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ctx.startActivity(i); } break; } } } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } } } } public void foregroundTaskPre(){ // Log.e(TAG, "in pre Lollipop") ActivityManager activityManager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE); final List<ActivityManager.RunningTaskInfo> taskInfo = activityManager.getRunningTasks(1); final ComponentName componentName = taskInfo.get(0).topActivity; final String[] activePackages = new String[1]; activePackages[0] = componentName.getPackageName(); Log.e(TAG, "is system package? "+isSystemApp(activePackages[0])); if(activePackages[0].equals("com.sec.android.app.launcher") || activePackages[0].equals("com.cfap.cfadevicemanager") || isSystemApp(activePackages[0])==true){ // Toast.makeText(ctx, "No applications are foreground at this time!", 3).show(); }else{ Toast.makeText(ctx, "You cannot access this application on cellular data plan", 3).show(); Intent i = new Intent(); i.setAction(Intent.ACTION_MAIN); i.addCategory(Intent.CATEGORY_HOME); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ctx.startActivity(i); } } public boolean isSystemApp(String packagename){ final PackageManager pm = ctx.getPackageManager(); List<PackageInfo> packs = pm.getInstalledPackages(0); for(int i=0; i < packs.size(); i++) { PackageInfo p = packs.get(i); ApplicationInfo a = p.applicationInfo; if(p.packageName.equals(packagename) && (a.flags & ApplicationInfo.FLAG_SYSTEM) == 1) { return true; } } return false; } }