package com.hlq.capture; import android.Manifest; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.os.IBinder; import android.provider.Settings; import android.security.KeyChain; import android.support.annotation.NonNull; import android.support.design.widget.Snackbar; import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; import android.support.v7.app.AppCompatActivity; import android.view.MotionEvent; import android.view.View; import com.hlq.capture.fragment.CaptureListFragment; import com.hlq.capture.fragment.HelpFragment; import com.hlq.capture.service.CaptureBinder; import com.hlq.capture.service.CaptureService; import com.hlq.capture.util.ProxyUtil; import com.hlq.capture.util.SPUtil; public class MainActivity extends AppCompatActivity implements CaptureBinder.OnProxyStartedListener { private static final int REQUEST_STORAGE = 1; private static final int REQUEST_INSTALL_CER = 2; private ServiceConnection mConn; private CaptureBinder mBinder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState == null) { getSupportFragmentManager() .beginTransaction() .add(R.id.fl_content,new CaptureListFragment(),CaptureListFragment.TAG) .commitAllowingStateLoss(); } startProxy(); } private void startProxy() { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { bindCaptureService(); } else { ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE},REQUEST_STORAGE); } } private void bindCaptureService() { if (mConn != null) { return; } Intent intent = new Intent(this, CaptureService.class); intent.putExtra(CaptureService.KEY_STORE_DIR,SPUtil.getCaptureDir().getAbsolutePath()); mConn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mBinder = (CaptureBinder) service; if (mBinder.getProxyState() != CaptureService.STATE_INIT) { onProxyStarted(); } else { mBinder.setStartedListener(MainActivity.this); } } @Override public void onServiceDisconnected(ComponentName name) { } }; bindService(intent, mConn ,BIND_AUTO_CREATE); } @Override public void onProxyStarted() { if (!mBinder.isProxyStarted()) { runOnUiThread(new Runnable() { @Override public void run() { Snackbar.make(getWindow().getDecorView(),"端口被占用或其他异常,启动失败!",Snackbar.LENGTH_SHORT).show(); } }); return; } if (!SPUtil.getBoolean(this,SPUtil.KEY_IS_INSTALL_CER,false)) { byte[] cerBytes = mBinder.getCerBytes(); if (cerBytes != null) { Intent intent = KeyChain.createInstallIntent(); intent.putExtra(KeyChain.EXTRA_CERTIFICATE, cerBytes); intent.putExtra(KeyChain.EXTRA_NAME, "CapturePacket CA Certificate"); startActivityForResult(intent, REQUEST_INSTALL_CER); } } boolean result = ProxyUtil.setProxy(this, CaptureService.PROXY_PORT); final String text = result ? "Set proxy host success !!!" : "Set proxy host failure ~~~"; runOnUiThread(new Runnable() { @Override public void run() { Snackbar.make(getWindow().getDecorView(),text,Snackbar.LENGTH_SHORT).show(); } }); if (result) { Fragment fragment = getSupportFragmentManager().findFragmentByTag(CaptureListFragment.TAG); if (fragment instanceof CaptureListFragment) { ((CaptureListFragment) fragment).onProxyStarted(mBinder); } } } @Override public void finish() { super.finish(); System.exit(0); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_STORAGE) { for (int i = 0; i < permissions.length; i++) { if (Manifest.permission.WRITE_EXTERNAL_STORAGE.equals(permissions[i])) { if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { bindCaptureService(); } else { Snackbar snackbar = Snackbar.make(getWindow().getDecorView(), "需要允许读写SD卡的权限!", Snackbar.LENGTH_INDEFINITE); snackbar.setAction("去设置", new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.parse("package:"+getPackageName())); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); finish(); } }); snackbar.show(); } } } } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_INSTALL_CER) { String tipText; if (resultCode == RESULT_OK) { SPUtil.putBoolean(this,SPUtil.KEY_IS_INSTALL_CER,true); tipText = "Install certificate success !!!"; } else { tipText = "Install certificate failure !!!"; } Snackbar.make(getWindow().getDecorView(),tipText,Snackbar.LENGTH_SHORT).show(); } } @Override protected void onDestroy() { super.onDestroy(); if (mConn != null) { unbindService(mConn); } } @Override public void onBackPressed() { if (getSupportFragmentManager().findFragmentByTag(HelpFragment.TAG) != null && getSupportFragmentManager().popBackStackImmediate()){ return; } if (mBinder == null || !mBinder.isProxyStarted()) { super.onBackPressed(); } else { if (!moveTaskToBack(false)) { super.onBackPressed(); } } } @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { Fragment fragment = getSupportFragmentManager().findFragmentByTag(CaptureListFragment.TAG); if (fragment != null) { CaptureListFragment listFragment = (CaptureListFragment) fragment; listFragment.onDispatchTouchEvent(ev); } } return super.dispatchTouchEvent(ev); } }