package com.lechucksoftware.proxy.proxysettings.test;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.Typeface;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import com.lechucksoftware.proxy.proxysettings.App;
import com.lechucksoftware.proxy.proxysettings.R;
import com.lechucksoftware.proxy.proxysettings.constants.Constants;
import com.lechucksoftware.proxy.proxysettings.db.PacEntity;
import com.lechucksoftware.proxy.proxysettings.db.ProxyEntity;
import com.lechucksoftware.proxy.proxysettings.db.TagEntity;
import com.lechucksoftware.proxy.proxysettings.db.WiFiAPEntity;
import com.lechucksoftware.proxy.proxysettings.tasks.AsyncStartupActions;
import com.lechucksoftware.proxy.proxysettings.ui.base.BaseActivity;
import com.lechucksoftware.proxy.proxysettings.utils.ApplicationStatistics;
import com.lechucksoftware.proxy.proxysettings.utils.DBUtils;
import com.lechucksoftware.proxy.proxysettings.utils.Utils;
import com.nispok.snackbar.Snackbar;
import com.nispok.snackbar.SnackbarManager;
import com.nispok.snackbar.enums.SnackbarType;
import com.nispok.snackbar.listeners.ActionClickListener;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import be.shouldit.proxy.lib.APL;
import timber.log.Timber;
/**
* Created by marco on 10/10/13.
*/
public class DeveloperOptionsActivity extends BaseActivity
{
public static final String TAG = DeveloperOptionsActivity.class.getSimpleName();
public LinearLayout testDBContainer;
private ScrollView testLogScroll;
private Button addWifiNetworksBtn;
private DeveloperOptionsActivity developerOptionsActivity;
public enum TestAction
{
ADD_PROXY,
ADD_TEST_WIFI_NETWORKS,
REMOVE_TEST_WIFI_NETWORKS,
ADD_EXAMPLE_PROXIES,
ADD_TAGS,
SET_ALL_PROXIES,
CLEAR_ALL_PROXIES,
TEST_VALIDATION,
TEST_SERIALIZATION,
UPDATE_TAGS,
LIST_TAGS,
CLEAR_ALL,
BACKUP_DB,
TOGGLE_DEMO_MODE,
RUN_STARTUP_ACTIONS,
ASSIGN_PROXY
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(null); // DO NOT LOAD savedInstanceState since onSaveInstanceState(Bundle) is not overridden
Timber.d("Creating TestActivity");
developerOptionsActivity = this;
setContentView(R.layout.test_layout);
addWifiNetworksBtn = (Button) findViewById(R.id.add_wifi_networks);
addWifiNetworksBtn.setOnTouchListener(new View.OnTouchListener()
{
private Date touchEventStarted;
private Toast toast;
private Context context;
private Boolean touching;
public AsyncToast asyncToast;
@Override
public boolean onTouch(View view, MotionEvent motionEvent)
{
Timber.d("Touch Event: " + String.valueOf(motionEvent.getActionMasked()));
context = view.getContext();
if (motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN)
{
// Start touch
touchEventStarted = new Date();
touching = true;
asyncToast = new AsyncToast(developerOptionsActivity, touchEventStarted);
asyncToast.execute();
}
else if (motionEvent.getActionMasked() == MotionEvent.ACTION_UP ||
motionEvent.getActionMasked() == MotionEvent.ACTION_CANCEL)
{
// End touch
if (touchEventStarted != null)
{
Date touchEventEnd = new Date();
Long diff = touchEventEnd.getTime() - touchEventStarted.getTime();
int numWifis = (int) ((diff / 100) % 200) + 1;
addWifiNetworks(view, numWifis);
touching = false;
asyncToast.stop();
asyncToast.cancel(true);
}
}
return true;
}
});
testLogScroll = (ScrollView) findViewById(R.id.test_log);
testDBContainer = (LinearLayout) findViewById(R.id.testDBContainer);
}
public void APNTest(View view)
{
if (Build.VERSION.SDK_INT >= 19)
{
TestUtils.testAPN(this);
}
}
public void backupDB(View view)
{
final String filename = DBUtils.backupDB(this);
SnackbarManager.show(
Snackbar.with(this)
.type(SnackbarType.SINGLE_LINE)
.text(String.format("Saved on: '%s'", filename))
.swipeToDismiss(false)
.animation(false)
.color(Color.RED)
.actionLabel("OPEN")
.actionLabelTypeface(Typeface.DEFAULT_BOLD)
.actionListener(new ActionClickListener()
{
@Override
public void onActionClicked(Snackbar snackbar)
{
try
{
File fileToOpen = new File(filename);
Intent myIntent = new Intent();
myIntent.setAction(android.content.Intent.ACTION_VIEW);
myIntent.setDataAndType(Uri.fromFile(fileToOpen), "*/*");
startActivity(myIntent);
}
catch (Exception e)
{
Timber.e(e, "Exception during ActionsView enableWifiClickListener action");
}
}
})
.duration(Snackbar.SnackbarDuration.LENGTH_INDEFINITE));
}
public void addProxyClicked(View caller)
{
AsyncTest addAsyncProxy = new AsyncTest(this, TestAction.ADD_PROXY);
addAsyncProxy.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public void addWifiNetworks(View view, int numWifiToAdd)
{
AsyncTest addAsyncWifiNetworks = new AsyncTest(this, TestAction.ADD_TEST_WIFI_NETWORKS, numWifiToAdd);
addAsyncWifiNetworks.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public void removeWifiNetworks(View view)
{
AsyncTest removeAsyncWifiNetworks = new AsyncTest(this, TestAction.REMOVE_TEST_WIFI_NETWORKS);
removeAsyncWifiNetworks.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public void startStartupActions(View view)
{
AsyncTest startupActionsAsync = new AsyncTest(this, TestAction.RUN_STARTUP_ACTIONS);
startupActionsAsync.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public void addExampleProxyClicked(View caller)
{
AsyncTest addAsyncProxy = new AsyncTest(this, TestAction.ADD_EXAMPLE_PROXIES);
addAsyncProxy.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public void toggleDemoModeClicked(View caller)
{
AsyncTest toggleDemoMode = new AsyncTest(this, TestAction.TOGGLE_DEMO_MODE);
toggleDemoMode.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public void addTagsDBClicked(View caller)
{
AsyncTest addAsyncProxy = new AsyncTest(this, TestAction.ADD_TAGS);
addAsyncProxy.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public void setProxyForAllAp(View view)
{
AsyncTest setAllProxies = new AsyncTest(this, TestAction.SET_ALL_PROXIES);
setAllProxies.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public void clearProxyForAllAp(View view)
{
AsyncTest clearAsyncProxy = new AsyncTest(this, TestAction.CLEAR_ALL_PROXIES);
clearAsyncProxy.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public void testProxyValidations(View view)
{
AsyncTest testValidation = new AsyncTest(this, TestAction.TEST_VALIDATION);
testValidation.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public void testBugReporting(View caller)
{
APL.crash();
}
public void listDBProxies(View caller)
{
TextView textViewTest = new TextView(this);
testDBContainer.addView(textViewTest);
textViewTest.setTextSize(10);
Map<Long, ProxyEntity> savedProxies = App.getDBManager().getAllProxiesWithTAGs();
List<ProxyEntity> list = new ArrayList<ProxyEntity>(savedProxies.values());
for (ProxyEntity p : list)
{
textViewTest.append(p.toString() + "\n");
}
Map<Long, PacEntity> savedPac = App.getDBManager().getAllPac();
List<PacEntity> pacslist = new ArrayList<PacEntity>(savedPac.values());
for (PacEntity p : pacslist)
{
textViewTest.append(p.toString() + "\n");
}
}
public void listDBWifiAp(View caller)
{
TextView textViewTest = new TextView(this);
textViewTest.setTextSize(10);
testDBContainer.addView(textViewTest);
Map<Long, WiFiAPEntity> savedAp = App.getDBManager().getAllWifiAp();
List<WiFiAPEntity> list = new ArrayList<WiFiAPEntity>(savedAp.values());
for (WiFiAPEntity p : list)
{
textViewTest.append(p.toString() + "\n");
}
}
public void listDBTags(View caller)
{
TextView textViewTest = new TextView(this);
testDBContainer.addView(textViewTest);
textViewTest.setTextSize(10);
List<TagEntity> list = App.getDBManager().getAllTags();
for (TagEntity t : list)
{
textViewTest.append(t.toString() + "\n");
}
}
public void listPrefs(View view)
{
TextView textViewTest = new TextView(this);
testDBContainer.addView(textViewTest);
textViewTest.setTextSize(10);
SharedPreferences preferences = this.getSharedPreferences(Constants.PREFERENCES_FILENAME, MODE_MULTI_PROCESS);
Map<String, ?> prefsMap = preferences.getAll();
for (String key : prefsMap.keySet())
{
textViewTest.append("'" + key + "': " + prefsMap.get(key) + "\n");
}
}
public void clearOutput(View caller)
{
testDBContainer.removeAllViews();
}
public void testSerializationClicked(View caller)
{
AsyncTest addAsyncProxy = new AsyncTest(this, TestAction.TEST_SERIALIZATION);
addAsyncProxy.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public void clearPrefAndDB(View caller)
{
AsyncTest addAsyncProxy = new AsyncTest(this, TestAction.CLEAR_ALL);
addAsyncProxy.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
public class AsyncTest extends AsyncTask<Void, String, Void>
{
private final Object[] _params;
DeveloperOptionsActivity _developerOptionsActivity;
TextView textViewTest;
TestAction _action;
public AsyncTest(DeveloperOptionsActivity developerOptionsActivity, TestAction action, Object... params)
{
_developerOptionsActivity = developerOptionsActivity;
_action = action;
_params = params;
}
@Override
protected void onPostExecute(Void result)
{
_developerOptionsActivity.testLogScroll.fullScroll(View.FOCUS_DOWN);
}
@Override
protected void onPreExecute()
{
textViewTest = new TextView(_developerOptionsActivity);
textViewTest.setText("Started AsyncTestAction: " + _action);
textViewTest.setTextSize(10);
_developerOptionsActivity.testDBContainer.addView(textViewTest);
}
@Override
protected void onProgressUpdate(String... progress)
{
if (progress != null && progress.length > 0)
{
String msg = TextUtils.join("\n", progress);
textViewTest.setText(msg);
}
else
textViewTest.setText(_action.toString());
}
@Override
protected Void doInBackground(Void... params)
{
if (_action == TestAction.CLEAR_ALL)
{
TestUtils.resetPreferences(_developerOptionsActivity);
App.getDBManager().resetDB();
}
else if (_action == TestAction.ADD_EXAMPLE_PROXIES)
{
TestUtils.addProxyExamples(_developerOptionsActivity);
}
else if (_action == TestAction.ADD_TEST_WIFI_NETWORKS)
{
int numWifis = (Integer) _params[0];
for (int i = 0; i <= numWifis; i++)
{
String ssid = TestUtils.createFakeWifiNetwork(_developerOptionsActivity);
Timber.e("----------------------------------------------");
publishProgress(String.format("Created #[%d / %d] TEST Wi-Fi network: %s", i, numWifis, ssid));
try
{
Thread.sleep(500);
}
catch (InterruptedException e)
{
Timber.e(e, "Exception during sleep");
}
}
}
else if (_action == TestAction.REMOVE_TEST_WIFI_NETWORKS)
{
int removedCount = TestUtils.deleteFakeWifiNetworks(_developerOptionsActivity);
publishProgress(String.format("Removed #[%d] TEST Wi-Fi networks", removedCount));
}
else if (_action == TestAction.RUN_STARTUP_ACTIONS)
{
App.getAppStats().updateInstallationDetails();
publishProgress(App.getAppStats().toString());
AsyncStartupActions async = new AsyncStartupActions(_developerOptionsActivity);
async.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
else if (_action == TestAction.TOGGLE_DEMO_MODE)
{
// TODO: improve handling of preference cache
Utils.checkDemoMode(_developerOptionsActivity);
Utils.setDemoMode(_developerOptionsActivity, !App.getInstance().demoMode);
Utils.checkDemoMode(_developerOptionsActivity);
// for (WiFiApConfig conf : App.getWifiNetworksManager().getSortedWifiApConfigsList())
// {
// if (App.getInstance().demoMode)
// conf.setAPDescription(UIUtils.getRandomCodeName().toString());
// else
// conf.setAPDescription(null);
// }
}
else if (_action == TestAction.SET_ALL_PROXIES)
{
TestUtils.setProxyForAllAP(_developerOptionsActivity);
}
else if (_action == TestAction.CLEAR_ALL_PROXIES)
{
TestUtils.clearProxyForAllAP(_developerOptionsActivity);
}
else if (_action == TestAction.TEST_VALIDATION)
{
TestUtils.testValidation();
}
else
{
for (int i = 0; i < 10; i++)
{
switch (_action)
{
case ADD_PROXY:
TestUtils.addRandomProxy();
break;
case TEST_SERIALIZATION:
TestUtils.testSerialization();
break;
case ADD_TAGS:
TestUtils.addTags();
break;
case UPDATE_TAGS:
// TestUtils.addRandomProxy();
break;
}
publishProgress(String.valueOf(i));
}
}
return null;
}
}
private class AsyncToast extends AsyncTask<Void, String, Void>
{
private final Activity activity;
private final Date start;
Toast toast;
boolean run;
public AsyncToast(Activity callingActivity, Date eventStarted)
{
activity = callingActivity;
start = eventStarted;
run = true;
}
@Override
protected void onPostExecute(Void result)
{
}
@Override
protected void onPreExecute()
{
}
public void stop()
{
run = false;
}
@Override
protected void onProgressUpdate(String... progress)
{
if (toast != null)
{
toast.cancel();
}
Timber.d(progress[0]);
toast = Toast.makeText(activity, progress[0], Toast.LENGTH_SHORT);
toast.show();
}
@Override
protected Void doInBackground(Void... params)
{
while (run)
{
Date touchEventPartial = new Date();
Long diff = touchEventPartial.getTime() - start.getTime();
int numWifis = (int) ((diff / 100) % 200) + 1;
publishProgress("Num: " + String.valueOf(numWifis));
try
{
Thread.sleep(200);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
if (numWifis >= 200)
{
run = false;
}
}
return null;
}
}
}