package com.scottyab.rootbeer.sample; import android.content.Context; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.util.Log; import android.widget.ImageView; import com.scottyab.rootbeer.RootBeer; import com.scottyab.rootbeer.util.Utils; import java.util.ArrayList; import uk.co.barbuzz.beerprogressview.BeerProgressView; /** * class to pretend we are doing some really clever stuff that takes time * <p/> * Old skool Async - this could been nicer but just threw together at the mo */ public class CheckRootTask extends AsyncTask<Boolean, Integer, Boolean> { private static final int SLEEP_TIME = 70; private static final String TAG = "CheckRootTask"; private final BeerProgressView mBeerProgressView; private final Context mContext; private ArrayList<ImageView> mCheckRootimageViewList; private OnCheckRootFinishedListener mListener; private Drawable redCross; private Drawable greenTick; private boolean mIsCheck; public interface OnCheckRootFinishedListener { void onCheckRootFinished(boolean isRooted); } public CheckRootTask(Context ctx, OnCheckRootFinishedListener listener, BeerProgressView beerProgressView, ArrayList<ImageView> checkRootimageViewList) { mListener = listener; mBeerProgressView = beerProgressView; mContext = ctx; mCheckRootimageViewList = checkRootimageViewList; } @Override protected void onPreExecute() { super.onPreExecute(); redCross = mContext.getResources().getDrawable(R.drawable.ic_cross_red_24dp); greenTick = mContext.getResources().getDrawable(R.drawable.ic_tick_green_24dp); } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); Integer value = values[0]; mBeerProgressView.setBeerProgress(value); int index = (value / 8) - 1; boolean isCheck = value % 8 == 0; if (isCheck & index >= 0 & index < mCheckRootimageViewList.size()) { mCheckRootimageViewList.get(index).setImageDrawable(mIsCheck ? redCross : greenTick); } mIsCheck = false; } @Override protected Boolean doInBackground(Boolean... params) { RootBeer check = new RootBeer(mContext); check.setLogging(true); for (int i = 0; i < 90; i++) { try { Thread.sleep(SLEEP_TIME); } catch (InterruptedException e) { } switch (i) { case 8: mIsCheck = check.detectRootManagementApps(); Log.d(TAG, "Root Management Apps " + (mIsCheck ? "detected" : "not detected")); break; case 16: mIsCheck = check.detectPotentiallyDangerousApps(); Log.d(TAG, "PotentiallyDangerousApps " + (mIsCheck ? "detected" : "not detected")); break; case 24: mIsCheck = check.detectTestKeys(); Log.d(TAG, "TestKeys " + (mIsCheck ? "detected" : "not detected")); break; case 32: mIsCheck = check.checkForBusyBoxBinary(); Log.d(TAG, "BusyBoxBinary " + (mIsCheck ? "detected" : "not detected")); break; case 40: mIsCheck = check.checkForSuBinary(); Log.d(TAG, "SU Binary " + (mIsCheck ? "detected" : "not detected")); break; case 48: mIsCheck = check.checkSuExists(); Log.d(TAG, "2nd SU Binary check " + (mIsCheck ? "detected" : "not detected")); break; case 56: mIsCheck = check.checkForRWPaths(); Log.d(TAG, "ForRWPaths " + (mIsCheck ? "detected" : "not detected")); break; case 64: mIsCheck = check.checkForDangerousProps(); Log.d(TAG, "DangerousProps " + (mIsCheck ? "detected" : "not detected")); break; case 72: mIsCheck = check.checkForRootNative(); Log.d(TAG, "Root via native check " + (mIsCheck ? "detected" : "not detected")); break; case 80: mIsCheck = check.detectRootCloakingApps(); Log.d(TAG, "RootCloakingApps " + (mIsCheck ? "detected" : "not detected")); break; case 88: mIsCheck = Utils.isSelinuxFlagInEnabled(); Log.d(TAG, "Selinux Flag Is Enabled " + (mIsCheck ? "true" : "false")); break; } publishProgress(i); } return check.isRooted(); } @Override protected void onPostExecute(Boolean isRooted) { super.onPostExecute(isRooted); mListener.onCheckRootFinished(isRooted); } }