package com.ittianyu.mobileguard.activity; import android.content.Intent; import android.graphics.Color; import android.os.SystemClock; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; import com.ittianyu.mobileguard.R; import com.ittianyu.mobileguard.activity.base.BaseActivityUpEnable; import com.ittianyu.mobileguard.constant.Constant; import com.ittianyu.mobileguard.dao.AntivirusDao; import com.ittianyu.mobileguard.domain.AppInfoBean; import com.ittianyu.mobileguard.domain.VirusBean; import com.ittianyu.mobileguard.engine.AppManagerEngine; import com.ittianyu.mobileguard.utils.EncryptionUtils; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.Timer; import java.util.TimerTask; /** * Using the Kingsoft antivirus database * You need replace the antivirus.db if you want to use in commerce */ public class AntivirusActivity extends BaseActivityUpEnable { // view private ImageView ivScan; private TextView tvUseTime; private LinearLayout llLog; private ProgressBar pbProgress; // data private Thread initDataThread; private int useTime = 0;// use time in second private Timer timer; private int progress = 0; private boolean running; private ArrayList<VirusBean> viruses = new ArrayList<>(); /** * construct method. set the action bar title */ public AntivirusActivity() { super(R.string.anti_virus); } /** * 1 */ @Override protected void initView() { setContentView(R.layout.activity_antivirus); // bind view ivScan = (ImageView) findViewById(R.id.iv_scan); tvUseTime = (TextView) findViewById(R.id.tv_use_time); llLog = (LinearLayout) findViewById(R.id.ll_log); pbProgress = (ProgressBar) findViewById(R.id.pb_progress); // start a rotate animation Animation rotateAnimation = AnimationUtils.loadAnimation(this, R.anim.rotate_forever); rotateAnimation.setDuration(2000); ivScan.startAnimation(rotateAnimation); } /** * 2 */ @Override protected void initData() { running = true; // start timer to count time TimerTask timerTask = new TimerTask() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { useTime++; tvUseTime.setText(formatTime(useTime)); } }); } }; timer = new Timer(true); timer.schedule(timerTask, 1000, 1000); // start a thead to scan app initDataThread = new Thread() { @Override public void run() { List<AppInfoBean> apps = AppManagerEngine.getInstalledAppInfo(AntivirusActivity.this, null); // set progress max value pbProgress.setMax(apps.size()); AntivirusDao dao = new AntivirusDao(AntivirusActivity.this); for (final AppInfoBean app: apps) { if(!running) {// safe exit return; } try { String md5 = EncryptionUtils.md5File(new File(app.getApkPath())); final VirusBean virusBean = dao.selectByMd5(md5); // set progress progress++; pbProgress.setProgress(progress); // add a TextView to llLog runOnUiThread(new Runnable() { @Override public void run() { // create TextView and add to llLog TextView textView = new TextView(AntivirusActivity.this); textView.setText(app.getName()); llLog.addView(textView, 0); // check whether is virus if(null != virusBean) { // the app is virus // set the text color red textView.setTextColor(Color.RED); } } }); // add virus to list if(null != virusBean) { virusBean.setPackageName(app.getPackageName()); viruses.add(virusBean); } // enhance the user feeling SystemClock.sleep(new Random().nextInt(1024)); } catch (IOException e) { e.printStackTrace(); } } // cancel the timer when complete scan apps timer.cancel(); // start result activity startResultActivity(); } }; initDataThread.start(); } /** * start result activity */ private void startResultActivity() { runOnUiThread(new Runnable() { @Override public void run() { Intent intent = new Intent(AntivirusActivity.this, AntivirusResultActivity.class); intent.putExtra(Constant.EXTRA_VIRUSES, viruses); startActivity(intent); finish(); } }); } /** * 3 */ @Override protected void initEvent() { } @Override protected void onDestroy() { super.onDestroy(); // prevent memory leak // if the activity exit, the child thread should stop running = false; // cancel the timer timer.cancel(); } /** * transfer the second to minute:second format. * @param second the time in second * @return a format String. Such as 05:30 */ private String formatTime(int second) { int minute = second / 60; second = second % 60; return String.format("%02d:%02d", minute, second); } }