package cn.darkal.networkdiagnosis.Activity;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.provider.Settings;
import android.security.KeyChain;
import android.support.design.widget.Snackbar;
import android.support.v7.app.ActionBar;
import android.util.Log;
import android.view.MenuItem;
import android.widget.Toast;
import com.tencent.bugly.Bugly;
import com.tencent.bugly.beta.Beta;
import net.lightbody.bmp.BrowserMobProxy;
import net.lightbody.bmp.proxy.dns.AdvancedHostResolver;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import cn.darkal.networkdiagnosis.R;
import cn.darkal.networkdiagnosis.SysApplication;
import cn.darkal.networkdiagnosis.Utils.DeviceUtils;
import cn.darkal.networkdiagnosis.Utils.FileUtil;
import cn.darkal.networkdiagnosis.Utils.SharedPreferenceUtils;
import cn.darkal.networkdiagnosis.View.LoadingDialog;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
/**
* A {@link PreferenceActivity} that presents a set of application settings. On
* handset devices, settings are presented as a single list. On tablets,
* settings are split by category, with category headers shown to the left of
* the list of settings.
* <p/>
* See <a href="http://developer.android.com/design/patterns/settings.html">
* Android Design: Settings</a> for design guidelines and the <a
* href="http://developer.android.com/guide/topics/ui/settings.html">Settings
* API Guide</a> for more information on developing a Settings UI.
*/
public class SettingsActivity extends AppCompatPreferenceActivity implements Preference.OnPreferenceChangeListener {
ListPreference lp;//创建一个ListPreference对象
Preference hostPreference;
String path;
/**
* Helper method to determine if the device has an extra-large screen. For
* example, 10" tablets are extra-large.
*/
private static boolean isXLargeTablet(Context context) {
return (context.getResources().getConfiguration().screenLayout
& Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupActionBar();
addPreferencesFromResource(R.xml.pref_data_sync);
lp = (ListPreference) findPreference("select_ua");
//设置获取ListPreference中发生的变化
lp.setOnPreferenceChangeListener(this);
lp.setSummary(lp.getEntry());
findPreference("system_host").setOnPreferenceChangeListener(this);
findPreference("install_cert").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
changeSystemProxy();
return false;
}
});
findPreference("system_proxy").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
return false;
}
});
findPreference("app_version").setSummary(DeviceUtils.getVersion(this));
findPreference("app_version").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
try {
Beta.checkUpgrade();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
});
hostPreference = findPreference("app_host");
hostPreference.setSummary(getHost());
}
/**
* Set up the {@link android.app.ActionBar}, if the API is available.
*/
private void setupActionBar() {
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
// Show the Up button in the action bar.
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
/**
* {@inheritDoc}
*/
@Override
public boolean onIsMultiPane() {
return isXLargeTablet(this);
}
//让所选择的项显示出来,获取变化并显示出来
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (preference instanceof ListPreference) {
//把preference这个Preference强制转化为ListPreference类型
ListPreference listPreference = (ListPreference) preference;
//获取ListPreference中的实体内容
CharSequence[] entries = listPreference.getEntries();
//获取ListPreference中的实体内容的下标值
int index = listPreference.findIndexOfValue((String) newValue);
//把listPreference中的摘要显示为当前ListPreference的实体内容中选择的那个项目
listPreference.setSummary(entries[index]);
}
// 设置hosts
if (preference.getKey().equals("system_host")) {
DeviceUtils.changeHost(((SysApplication)getApplication()).proxy,newValue.toString());
hostPreference.setSummary(getHost());
}
return true;
}
public void installCert() {
final String CERTIFICATE_RESOURCE = "/sslSupport/ca-certificate-rsa.cer";
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();
}
}
private LoadingDialog loadingDialog;
public void showLoading(final String text) {
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
if (loadingDialog == null) {
loadingDialog = new LoadingDialog(SettingsActivity.this, text);
}
loadingDialog.show();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public void dismissLoading() {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (loadingDialog != null) {
loadingDialog.dismiss();
loadingDialog = null;
}
}
});
}
@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();
}
}
}
public void changeSystemProxy() {
installCert();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onPause() {
super.onPause();
}
public String getHost() {
String result = "";
BrowserMobProxy browserMobProxy = ((SysApplication) getApplication()).proxy;
AdvancedHostResolver advancedHostResolver = browserMobProxy.getHostNameResolver();
for (String key : advancedHostResolver.getHostRemappings().keySet()) {
result += key + " " + advancedHostResolver.getHostRemappings().get(key) + "\n";
}
return result.length() > 1 ? result.substring(0, result.length() - 1) : "无";
}
}