package cn.darkal.networkdiagnosis.Activity; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.app.Activity; import android.app.SearchManager; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.security.KeyChain; import android.support.design.widget.NavigationView; import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.SearchView; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.ViewTreeObserver; import android.view.animation.OvershootInterpolator; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.bumptech.glide.Glide; import com.github.clans.fab.FloatingActionButton; import com.github.clans.fab.FloatingActionMenu; import com.google.zxing.QrCodeScanActivity; import com.tencent.bugly.crashreport.CrashReport; import net.gotev.uploadservice.ServerResponse; import net.gotev.uploadservice.UploadInfo; import net.gotev.uploadservice.UploadStatusDelegate; import net.lightbody.bmp.BrowserMobProxy; import net.lightbody.bmp.core.har.Har; import net.lightbody.bmp.core.har.HarPage; import org.json.JSONObject; import java.io.File; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Set; import butterknife.BindView; import butterknife.ButterKnife; import cn.darkal.networkdiagnosis.Adapter.FilterAdpter; import cn.darkal.networkdiagnosis.Bean.PageBean; import cn.darkal.networkdiagnosis.Fragment.BaseFragment; import cn.darkal.networkdiagnosis.Fragment.BackHandledInterface; import cn.darkal.networkdiagnosis.Fragment.NetworkFragment; import cn.darkal.networkdiagnosis.Fragment.PreviewFragment; import cn.darkal.networkdiagnosis.Fragment.WebViewFragment; import cn.darkal.networkdiagnosis.R; import cn.darkal.networkdiagnosis.SysApplication; import cn.darkal.networkdiagnosis.Utils.DeviceUtils; import cn.darkal.networkdiagnosis.Utils.FileUtils; import cn.darkal.networkdiagnosis.Utils.SharedPreferenceUtils; import cn.darkal.networkdiagnosis.Utils.ZipUtils; import cn.darkal.networkdiagnosis.View.LoadingDialog; /** * Created by xuzhou on 2016/8/10. * MainActivity */ public class MainActivity extends AppCompatActivity implements BackHandledInterface { public final static String CODE_URL = "#"; public final static String UPLOAD_URL = "#"; public final static String HOME_URL = "http://h5.darkal.cn/har/guide/widget.basic.html"; public final static String GUIDE_URL = "http://h5.darkal.cn/har/guide/widget.guide.html"; public final static int TYPE_NONE = 0; public final static int TYPE_SHARE = 1; public final static int TYPE_UPLOAD = 2; private int mLastHeightOfContainer; // 记录容器上一次的高度,用于检测高度变化 private int mHeightOfVisibility; Boolean isKeyboardOpen = false; Boolean shouldExitSearchView = false; private BaseFragment mBackHandedFragment; private long exitTime = 0; @BindView(R.id.fl_contain) public View rootView; @BindView(R.id.nav_view) public NavigationView navigationView; @BindView(R.id.fab) public FloatingActionMenu fam; @BindView(R.id.fab_share) public FloatingActionButton shareFab; @BindView(R.id.fab_upload) public FloatingActionButton uploadFab; @BindView(R.id.fab_preview) public FloatingActionButton previewFab; @BindView(R.id.fab_clear) public FloatingActionButton clearFab; // int lastX, lastY; // Boolean isMove = false; public SearchView searchView; public MenuItem homeItem; public MenuItem searchItem; public MenuItem filterMenuItem; public Set<String> disablePages = new HashSet<>(); public StringBuffer consoleLog = new StringBuffer(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); installCert(); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); ButterKnife.bind(this); initFloatingActionMenu(); OnGlobalLayoutListener globalLayoutListener = new OnGlobalLayoutListener(rootView); rootView.getViewTreeObserver().addOnGlobalLayoutListener(globalLayoutListener); getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); if (getIntent().getStringExtra("url") != null && getIntent().getStringExtra("url").length() > 0) { WebViewFragment webViewFragment = WebViewFragment.getInstance(); webViewFragment.loadUrl(getIntent().getStringExtra("url")); switchContent(webViewFragment); } else { switchContent(WebViewFragment.getInstance()); } DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.setDrawerListener(toggle); toggle.syncState(); NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(navigationItemListener); navigationView.getMenu().getItem(0).setChecked(true); // if (savedInstanceState != null && savedInstanceState.getInt("tab") != 0) { // switch (savedInstanceState.getInt("tab")) { // case 1: // switchContent(WebViewFragment.getInstance()); // break; // case 2: // switchContent(NetworkFragment.getInstance()); // break; // case 3: // switchContent(PreviewFragment.getInstance()); // break; // } // } // fab.setOnTouchListener(new View.OnTouchListener() { // @Override // public boolean onTouch(View view, MotionEvent motionEvent) { // //获取到手指处的横坐标和纵坐标 // int x = (int) motionEvent.getX(); // int y = (int) motionEvent.getY(); // switch (motionEvent.getAction()) { // case MotionEvent.ACTION_DOWN: // lastX = x; // lastY = y; // isMove = false; // break; // case MotionEvent.ACTION_MOVE: // //计算移动的距离 // int offX = x - lastX; // int offY = y - lastY; // if (offX * offX + offY * offY < 400 && !isMove) { // break; // } // view.offsetLeftAndRight(offX); // view.offsetTopAndBottom(offY); // isMove = true; // break; // case MotionEvent.ACTION_UP: // if (!isMove) { // createPage(); // } // break; // } // return true; // } // }); } public void createPage() { String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) .format(new Date(System.currentTimeMillis())); ((SysApplication) getApplication()).proxy.newPage(time); Snackbar.make(rootView, "HAR文件已创建新的分页:" + time, Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } @Override public void onBackPressed() { DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else if (fam.isOpened()) { fam.close(true); } else if (mBackHandedFragment == null || !(mBackHandedFragment instanceof WebViewFragment)) { switchContent(WebViewFragment.getInstance()); } else if (!mBackHandedFragment.onBackPressed()) { if ((System.currentTimeMillis() - exitTime) > 2000) { Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show(); exitTime = System.currentTimeMillis(); } else { finish(); System.exit(0); } } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); // MenuItem pageButton = menu.findItem(R.id.action_page); // pageButton.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { // @Override // public boolean onMenuItemClick(MenuItem item) { // createPage(); // return true; // } // }); filterMenuItem = menu.findItem(R.id.action_filter); homeItem = menu.findItem(R.id.action_home); searchItem = menu.findItem(R.id.search); // uaMenuItem = menu.findItem(R.id.ua); // logMenuItem = menu.findItem(R.id.log); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); searchView = (SearchView) searchItem.getActionView(); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setFocusable(false); searchView.setIconifiedByDefault(true); searchView.setMaxWidth(Integer.MAX_VALUE); searchView.setQueryHint("请输入URL关键字..."); searchView.setOnSearchClickListener(new View.OnClickListener() { @Override public void onClick(View v) { switchContent(PreviewFragment.getInstance()); } }); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { PreviewFragment.getInstance().filterItem(query); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0); return true; } @Override public boolean onQueryTextChange(String newText) { PreviewFragment.getInstance().filterItem(newText); shouldExitSearchView = newText.length() == 0; return false; } }); return true; } public void changeStateBar(Fragment fragment) { if (filterMenuItem != null && searchItem != null && homeItem != null) { if (fragment instanceof WebViewFragment) { homeItem.setVisible(true); } else { homeItem.setVisible(false); } if (fragment instanceof PreviewFragment) { filterMenuItem.setVisible(true); searchItem.setVisible(true); clearFab.setVisibility(View.VISIBLE); } else { filterMenuItem.setVisible(false); searchItem.setVisible(false); clearFab.setVisibility(View.GONE); } } } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if(id == R.id.action_home){ WebViewFragment webViewFragment = WebViewFragment.getInstance(); webViewFragment.loadUrl(HOME_URL); switchContent(webViewFragment); return true; } if(id == R.id.action_guide){ WebViewFragment webViewFragment = WebViewFragment.getInstance(); webViewFragment.loadUrl(GUIDE_URL); switchContent(webViewFragment); return true; } if (id == R.id.action_filter) { showFilter(this, TYPE_NONE); return true; } if (id == R.id.action_exit) { finish(); System.exit(0); return true; } return super.onOptionsItemSelected(item); } public NavigationView.OnNavigationItemSelectedListener navigationItemListener = new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem item) { // Handle navigation view item clicks here. int id = item.getItemId(); if (!SysApplication.isInitProxy) { Toast.makeText(MainActivity.this, "请等待程序初始化完成", Toast.LENGTH_LONG).show(); return true; } if (id == R.id.nav_camera) { Intent intent = new Intent(MainActivity.this, QrCodeScanActivity.class); startActivity(intent); } else if (id == R.id.nav_gallery) { switchContent(WebViewFragment.getInstance()); } // else if (id == R.id.nav_preview) { // switchContent(PreviewFragment.getInstance()); // } else if (id == R.id.nav_slideshow) { switchContent(NetworkFragment.getInstance()); } else if (id == R.id.nav_manage) { Intent intent = new Intent(MainActivity.this, SettingsActivity.class); startActivity(intent); } else if (id == R.id.nav_ua) { showUaDialog(); } else if (id == R.id.nav_cosole) { showLogDialog(); } else if (id == R.id.nav_host) { showHostDialog(); } else if (id == R.id.nav_page) { createPage(); } DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; } }; /** * 修改显示的内容 不会重新加载 **/ public void switchContent(Fragment to) { Boolean isAdded = false; try { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); if (getSupportFragmentManager().getFragments() != null) { for (Fragment f : getSupportFragmentManager().getFragments()) { if (to.getClass().isAssignableFrom(f.getClass())) { if (!f.isAdded()) { transaction.add(R.id.fl_contain, f, f.getClass().getName()); } else { transaction.show(f); } isAdded = true; } else { transaction.hide(f); f.setUserVisibleHint(false); } } } if (!isAdded) { if (!to.isAdded()) { // 先判断是否被add过 transaction.add(R.id.fl_contain, to, to.getClass().getName()).commitNow(); } else { transaction.show(to).commitNow(); // 隐藏当前的fragment,显示下一个 } } else { transaction.commitNow(); } if (getSupportFragmentManager().findFragmentByTag(to.getClass().getName()) != null) { getSupportFragmentManager().findFragmentByTag(to.getClass().getName()).setUserVisibleHint(true); } // setSelectedFragment((BaseFragment) to); } catch (Exception e) { e.printStackTrace(); } } @Override public void setSelectedFragment(BaseFragment selectedFragment) { this.mBackHandedFragment = selectedFragment; } public void installCert() { final String CERTIFICATE_RESOURCE = "/sslSupport/ca-certificate-rsa.cer"; Boolean isInstallCert = SharedPreferenceUtils.getBoolean(this, "isInstallCert", false); if (!isInstallCert) { Toast.makeText(this, "必须安装证书才可实现HTTPS抓包", Toast.LENGTH_LONG).show(); try { byte[] keychainBytes; InputStream bis = MainActivity.class.getResourceAsStream(CERTIFICATE_RESOURCE); keychainBytes = new byte[bis.available()]; bis.read(keychainBytes); Intent intent = KeyChain.createInstallIntent(); intent.putExtra(KeyChain.EXTRA_CERTIFICATE, keychainBytes); intent.putExtra(KeyChain.EXTRA_NAME, "NetworkDiagnosis CA Certificate"); startActivityForResult(intent, 3); } catch (Exception e) { e.printStackTrace(); } } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 3) { if (resultCode == Activity.RESULT_OK) { SharedPreferenceUtils.putBoolean(this,"isInstallCert", true); Toast.makeText(this, "安装成功", Toast.LENGTH_LONG).show(); } else { Toast.makeText(this, "安装失败", Toast.LENGTH_LONG).show(); } } } /** * 点击屏幕关闭键盘 */ @Override public boolean dispatchTouchEvent(MotionEvent ev) { Boolean shouldDispatchTouchEvent = false; if (ev.getAction() == MotionEvent.ACTION_DOWN) { View v = getCurrentFocus(); if (isShouldHideInput(v, ev)) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null && v != null) { if (isKeyboardOpen) { shouldDispatchTouchEvent = true; } imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } return shouldDispatchTouchEvent || super.dispatchTouchEvent(ev); } // 必不可少,否则所有的组件都不会有TouchEvent了 return getWindow().superDispatchTouchEvent(ev) || onTouchEvent(ev); } public boolean isShouldHideInput(View view, MotionEvent event) { if (view != null && (view instanceof EditText)) { int[] leftTop = {0, 0}; view.getLocationInWindow(leftTop); //获取输入框当前的location位置 int left = leftTop[0]; int top = leftTop[1]; int bottom = top + view.getHeight(); int right = left + view.getWidth(); if (event.getX() > left && event.getX() < right && event.getY() > top && event.getY() < bottom) { return false; } } return true; } private class OnGlobalLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener { private View mView; public OnGlobalLayoutListener(View view) { mView = view; } @Override public void onGlobalLayout() { int currentHeight = mView.getHeight(); if (currentHeight < mLastHeightOfContainer) { // 软键盘打开 if (mHeightOfVisibility == 0) { mHeightOfVisibility = currentHeight; } isKeyboardOpen = true; } else if (currentHeight > mLastHeightOfContainer && mLastHeightOfContainer != 0) { // 软键盘关闭 isKeyboardOpen = false; // 隐藏搜索框 if (shouldExitSearchView) { searchItem.collapseActionView(); } } mLastHeightOfContainer = currentHeight; } } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); try { setIntent(intent); handleUriStartupParams(); if (intent.getAction().equals("android.intent.action.SEARCH")) { switchContent(PreviewFragment.getInstance()); } }catch (Exception e){ e.printStackTrace(); } } @Override protected void onStart() { super.onStart(); handleUriStartupParams(); } /** * 启动的时候根据bundle参数决定切换到哪个tab */ private void handleUriStartupParams() { Intent intent = getIntent(); if (intent == null) { return; } Uri uri = intent.getData(); if (uri == null) { return; } // 这里要把data置空,否则每次进来锁屏解锁,都会触发这些逻辑 intent.setData(null); String query = uri.getQuery(); // "param="这个字符串已经占了6个字符了,所以query的长度至少要有8(加上花括号) if (query == null || query.length() < 8) { return; } try { // 通过uri.getQuery()得到的query已经是解码过的字符串了,不需要再decode String jsonString = query.substring(6); JSONObject json = new JSONObject(jsonString); WebViewFragment webViewFragment = WebViewFragment.getInstance(); webViewFragment.loadUrl(json.getString("url")); switchContent(webViewFragment); } catch (Exception e) { e.printStackTrace(); } } public void createZip(final Runnable callback) { showLoading("打包中"); new Thread(new Runnable() { @Override public void run() { try { final Har har = getFiltedHar(); final File saveHarFile = new File(Environment.getExternalStorageDirectory() + "/har/test.har"); har.writeTo(saveHarFile); ZipUtils.zip(Environment.getExternalStorageDirectory() + "/har", Environment.getExternalStorageDirectory() + "/test.zip"); rootView.post(new Runnable() { @Override public void run() { Snackbar.make(rootView, "HAR文件已保存至" + saveHarFile.getPath() + " 共计:" + har.getLog().getEntries().size() + "个请求", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); MainActivity.this.runOnUiThread(callback); } catch (Exception e) { rootView.post(new Runnable() { @Override public void run() { Snackbar.make(rootView, "HAR文件保存失败", Snackbar.LENGTH_LONG).setAction("Action", null).show(); } }); CrashReport.postCatchedException(e); e.printStackTrace(); } finally { dismissLoading(); } } }).start(); } public void shareZip() { Runnable runnable = new Runnable() { @Override public void run() { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("application/octet-stream"); intent.putExtra(Intent.EXTRA_SUBJECT, "分享HAR文件"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/test.zip"))); startActivity(Intent.createChooser(intent, "share")); } }; createZip(runnable); } public void uploadZip() { showUploadDialog(this); } public class MyUploadDelegate implements UploadStatusDelegate { @Override public void onProgress(UploadInfo uploadInfo) { Log.e("~~~~", uploadInfo.getProgressPercent() + ""); } @Override public void onError(UploadInfo uploadInfo, Exception exception) { dismissLoading(); Snackbar.make(rootView, "上传失败!", Snackbar.LENGTH_LONG).setAction("Action", null).show(); exception.printStackTrace(); CrashReport.postCatchedException(exception); } @Override public void onCompleted(UploadInfo uploadInfo, ServerResponse serverResponse) { try { JSONObject jsonObject = new JSONObject(serverResponse.getBodyAsString()); if (jsonObject.getInt("errId") == 0) { Snackbar.make(rootView, "上传成功!", Snackbar.LENGTH_LONG).setAction("Action", null).show(); } else if (jsonObject.getInt("errId") == 2 || jsonObject.getInt("errId") == 11004) { Snackbar.make(rootView, "验证码错误!", Snackbar.LENGTH_LONG).setAction("Action", null).show(); showUploadDialog(MainActivity.this); } else { Snackbar.make(rootView, "上传失败!", Snackbar.LENGTH_LONG).setAction("Action", null).show(); } } catch (Exception e) { Snackbar.make(rootView, "上传失败!", Snackbar.LENGTH_LONG).setAction("Action", null).show(); } dismissLoading(); } @Override public void onCancelled(UploadInfo uploadInfo) { dismissLoading(); } } private LoadingDialog loadingDialog; public void showLoading(String text) { try { if (loadingDialog == null) { loadingDialog = new LoadingDialog(this, text); } loadingDialog.show(); } catch (Exception e) { e.printStackTrace(); } } public void dismissLoading() { if (loadingDialog != null) { loadingDialog.dismiss(); loadingDialog = null; } } //显示基于Layout的AlertDialog private void showUploadDialog(Context context) { LayoutInflater inflater = LayoutInflater.from(this); View textEntryView = inflater.inflate(R.layout.alert_code, null); final EditText edtInput = (EditText) textEntryView.findViewById(R.id.et_code); final ImageView imageView = (ImageView) textEntryView.findViewById(R.id.iv_code); // final String uuid = SystemBasicInfo.getUUID(this); final String key = Math.random() + ""; Glide.with(this).load(CODE_URL + "?key=" + key + "&scene=2&t=" + Math.random()).into(imageView); // 点击刷新验证码 imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { edtInput.setText(""); Glide.with(MainActivity.this).load(CODE_URL + "?key=" + key + "&scene=2&t=" + Math.random()).into(imageView); } }); AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setCancelable(true); builder.setTitle("请输入验证码"); builder.setView(textEntryView); builder.setPositiveButton("确认", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(edtInput.getWindowToken(), 0); Runnable runnable = new Runnable() { @Override public void run() { String serverUrl = UPLOAD_URL + "?code=" + edtInput.getText() + "&os=Android&module=" + Build.MODEL.replace(" ", "") + "&key=" + key; showLoading("上传中"); FileUtils.uploadFiles(MainActivity.this, new MyUploadDelegate(), serverUrl, "upload", Environment.getExternalStorageDirectory() + "/test.zip"); } }; createZip(runnable); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(edtInput.getWindowToken(), 0); } }); builder.show(); } public void showFilter(final Context context, final int type) { BrowserMobProxy proxy = ((SysApplication) getApplication()).proxy; LayoutInflater inflater = LayoutInflater.from(this); View view = inflater.inflate(R.layout.alert_filter, null); ListView listView = (ListView) view.findViewById(R.id.list); List<HarPage> harPageList = proxy.getHar().getLog().getPages(); final List<PageBean> pageBeenList = new ArrayList<>(); for (HarPage harPage : harPageList) { PageBean pageBean = new PageBean(); if (disablePages.contains(harPage.getId())) { pageBean.setSelected(false); } pageBean.setName(harPage.getTitle()); pageBean.setCount(proxy.getHar(harPage.getId()).getLog().getEntries().size() + ""); pageBeenList.add(pageBean); } listView.setAdapter(new FilterAdpter(pageBeenList)); AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setCancelable(true); builder.setTitle("请选择分页"); builder.setView(view); builder.setPositiveButton("确认", null); builder.setNegativeButton("取消", null); class ConfirmListener implements View.OnClickListener { private AlertDialog alertDialog; public ConfirmListener(AlertDialog alertDialog) { this.alertDialog = alertDialog; } @Override public void onClick(View v) { disablePages.clear(); int entryCount = 0; int selectedCount = 0; for (PageBean pageBean : pageBeenList) { if (!pageBean.getSelected()) { disablePages.add(pageBean.getName()); } else { entryCount += pageBean.getCountInt(); selectedCount++; } } if (selectedCount > 0) { PreviewFragment.getInstance().notifyHarChange(); if (type == TYPE_SHARE) { shareZip(); } if (type == TYPE_UPLOAD) { if (selectedCount > 1 && entryCount > 1000) { Toast.makeText(context, "选择的请求总数过多,建议使用分享功能或减少选择", Toast.LENGTH_LONG).show(); } uploadZip(); } alertDialog.dismiss(); } else { Toast.makeText(context, "请至少选择一个分页", Toast.LENGTH_LONG).show(); } } } final AlertDialog alertDialog = builder.create(); alertDialog.setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface d) { alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener( new ConfirmListener(alertDialog)); } }); alertDialog.show(); } // 获取已选中的page public Set<String> getPageSet() { BrowserMobProxy proxy = ((SysApplication) getApplication()).proxy; Set<String> pageSet = new HashSet<>(); for (HarPage harPage : proxy.getHar().getLog().getPages()) { if (!disablePages.contains(harPage.getId())) { pageSet.add(harPage.getId()); } } return pageSet; } public Har getFiltedHar() { BrowserMobProxy proxy = ((SysApplication) getApplication()).proxy; return proxy.getHar(getPageSet()); } // @Override // protected void onSaveInstanceState(Bundle outState) { // int tab; // if (mBackHandedFragment instanceof PreviewFragment) { // tab = 3; // } else if (mBackHandedFragment instanceof NetworkFragment) { // tab = 2; // } else { // tab = 1; // } // outState.putInt("tab", tab); // super.onSaveInstanceState(outState); // } public void initFloatingActionMenu() { fam.setClosedOnTouchOutside(true); AnimatorSet set = new AnimatorSet(); ObjectAnimator scaleOutX = ObjectAnimator.ofFloat(fam.getMenuIconView(), "scaleX", 1.0f, 0.2f); ObjectAnimator scaleOutY = ObjectAnimator.ofFloat(fam.getMenuIconView(), "scaleY", 1.0f, 0.2f); ObjectAnimator scaleInX = ObjectAnimator.ofFloat(fam.getMenuIconView(), "scaleX", 0.2f, 1.0f); ObjectAnimator scaleInY = ObjectAnimator.ofFloat(fam.getMenuIconView(), "scaleY", 0.2f, 1.0f); scaleOutX.setDuration(50); scaleOutY.setDuration(50); scaleInX.setDuration(150); scaleInY.setDuration(150); scaleInX.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { fam.getMenuIconView().setImageResource(fam.isOpened() ? R.drawable.ic_file_upload_white_24dp : R.drawable.ic_close_white_24dp); if(mBackHandedFragment instanceof PreviewFragment){ if(fam.isOpened()){ clearFab.show(true); }else { clearFab.hide(true); } } } }); set.play(scaleOutX).with(scaleOutY); set.play(scaleInX).with(scaleInY).after(scaleOutX); set.setInterpolator(new OvershootInterpolator(2)); fam.setIconToggleAnimatorSet(set); shareFab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showFilter(MainActivity.this,TYPE_SHARE); fam.close(true); } }); uploadFab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showFilter(MainActivity.this,TYPE_UPLOAD); fam.close(true); } }); previewFab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { switchContent(PreviewFragment.getInstance()); fam.close(true); } }); clearFab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle("请确认是否清除所有请求?"); builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { ((SysApplication)getApplication()).proxy.getHar().getLog().clearAllEntries(); PreviewFragment.getInstance().notifyHarChange(); } }); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }); builder.create().show(); } }); } private String[] uaItem = new String[]{"手机浏览器", "微信环境", "手Q环境"}; public void showUaDialog() { DialogInterface.OnClickListener buttonListener = new ButtonOnClick(); AlertDialog.Builder builder = new AlertDialog.Builder(this); String selected = SharedPreferenceUtils.getString(this, "select_ua", "0"); int pos; try { pos = Integer.parseInt(selected); } catch (NumberFormatException e) { pos = -1; } builder.setTitle("环境切换"); builder.setSingleChoiceItems(uaItem, pos, buttonListener); builder.setPositiveButton("确认", buttonListener); builder.setNegativeButton("取消", buttonListener); builder.create().show(); } private class ButtonOnClick implements DialogInterface.OnClickListener { private int index = -1; // 表示选项的索引 @Override public void onClick(DialogInterface dialog, int which) { if (which >= 0) { index = which; } else { //用户单击的是【确定】按钮 if (which == DialogInterface.BUTTON_POSITIVE) { SharedPreferenceUtils.putString(MainActivity.this, "select_ua", index + ""); WebViewFragment.getInstance().setUserAgent(); } } } } public void showLogDialog(){ View textEntryView = LayoutInflater.from(this).inflate(R.layout.alert_textview, null); TextView edtInput = (TextView) textEntryView.findViewById(R.id.tv_content); edtInput.setText(consoleLog); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Console.log"); builder.setCancelable(true); builder.setView(textEntryView); builder.setPositiveButton("确认", null); builder.setNegativeButton("清空", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { consoleLog.setLength(0); } }); builder.show(); } public void showHostDialog(){ View textEntryView = LayoutInflater.from(this).inflate(R.layout.alert_edittext, null); final EditText editText = (EditText) textEntryView.findViewById(R.id.et_content); String host = SharedPreferenceUtils.getString(this, "system_host", ""); editText.setText(host); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setCancelable(true); builder.setView(textEntryView); builder.setTitle("HOST配置"); builder.setMessage("配置hosts,以空格分隔,每行一个"); builder.setPositiveButton("确认", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); SharedPreferenceUtils.putString(MainActivity.this, "system_host", editText.getText()+""); DeviceUtils.changeHost(((SysApplication)getApplication()).proxy,editText.getText()+""); } }); builder.setNegativeButton("清空", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); SharedPreferenceUtils.putString(MainActivity.this, "system_host", ""); DeviceUtils.changeHost(((SysApplication)getApplication()).proxy,editText.getText()+""); } }); builder.show(); } }