package com.gogolook.uicomparerunner; import java.util.ArrayList; import android.app.Activity; import android.content.DialogInterface; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.util.Pair; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; import android.widget.Toast; import com.gogolook.uicomparerunner.socket.SocketClient; import com.gogolook.uicomparerunner.socket.SocketClient.OnWriteCallBackListener; import com.gogolook.uicomparerunner.socket.SocketClient.SocketStatusListener; import com.gogolook.uicomparerunner.socket.SocketInstruction; import com.gogolook.uicomparerunner.views.layout.GmMainLayout; import com.james.utils.LogUtils; import com.james.views.FreeEditText; import com.james.views.FreeTextButton; import com.james.views.FreeTextView; import com.james.views.dialog.DialogBuilder; public class GmMainActivity extends Activity implements OnClickListener { private GmMainLayout mainLayout; private FreeEditText addressEdit; private FreeEditText portEdit; private FreeTextButton connectButton; private FreeTextView deviceText; private FreeTextView socketText; private ImageView simulationImage; private FreeTextButton selectDeviceButton; private FreeTextButton selectScriptButton; private FreeTextButton selectApkButton; private SocketClient socketClient; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setLayout(); findView(); setView(); setListener(); } private void setLayout() { mainLayout = new GmMainLayout(this); setContentView(mainLayout); } private void findView() { addressEdit = mainLayout.addressEdit; portEdit = mainLayout.portEdit; connectButton = mainLayout.connectButton; deviceText = mainLayout.deviceText; socketText = mainLayout.socketText; simulationImage = mainLayout.simulationImage; selectDeviceButton = mainLayout.selectDeviceButton; selectScriptButton = mainLayout.selectScriptButton; selectApkButton = mainLayout.selectApkButton; } private void setView() { } private void setListener() { connectButton.setOnClickListener(this); selectDeviceButton.setOnClickListener(this); selectScriptButton.setOnClickListener(this); selectApkButton.setOnClickListener(this); } @Override public void onClick(View v) { if (v.equals(connectButton)) { if (connectButton.getText().toString().equalsIgnoreCase("Connect")) { initSocket(); socketClient.connect(); } else { socketClient.close(); } } else if (v.equals(selectDeviceButton)) { socketClient.write(SocketInstruction.GET_ALL_DEVICES); } else if (v.equals(selectScriptButton)) { socketClient.write(SocketInstruction.GET_ALL_SCRIPTS); } else if (v.equals(selectApkButton)) { socketClient.write(SocketInstruction.GET_ALL_APKS); } } public void onDestroy() { super.onDestroy(); if (socketClient != null) { socketClient.close(); } } private void initSocket() { String address = addressEdit.getText().toString(); int port = Integer.parseInt(portEdit.getText().toString()); socketClient = new SocketClient(address, port, new SocketStatusListener() { @Override public void onStatusChanged() { runOnUiThread(new Runnable() { public void run() { if (socketClient == null) return; if (socketClient.isWaiting()) { socketText.setText("Waiting"); connectButton.setText("Connect"); selectDeviceButton.setEnabled(false); selectScriptButton.setEnabled(false); selectApkButton.setEnabled(false); } else if (socketClient.isConnected()) { socketText.setText("Connected"); connectButton.setText("Disconnect"); selectDeviceButton.setEnabled(true); selectScriptButton.setEnabled(true); selectApkButton.setEnabled(true); } else { socketText.setText("Disconnected..."); deviceText.setText("Current Device: null"); connectButton.setText("Connect"); selectDeviceButton.setEnabled(false); selectScriptButton.setEnabled(false); selectApkButton.setEnabled(false); } } }); } @Override public void onSocketException(final Exception e) { runOnUiThread(new Runnable() { public void run() { Toast.makeText(GmMainActivity.this, e.toString(), Toast.LENGTH_LONG).show(); } }); } @Override public void onRead(final byte[] readByte) { runOnUiThread(new Runnable() { public void run() { String recieve = new String(readByte).trim(); if (recieve.startsWith(SocketInstruction.SOCKET_CONNECTED)) { // TODO deviceText.setText("Current Device: " + recieve.split(SocketInstruction.separator)[1]); } else if (recieve.startsWith(SocketInstruction.GET_ALL_DEVICES)) { selectDevice(recieve.split(SocketInstruction.separator)[1]); } else if (recieve.startsWith(SocketInstruction.GET_ALL_SCRIPTS)) { selectScript(recieve.split(SocketInstruction.separator)[1]); } else if (recieve.startsWith(SocketInstruction.COMPLETE_RUNNING_SCRIPT)) { socketText.setText("Auto-testing completed."); } else if (recieve.startsWith(SocketInstruction.GET_ALL_APKS)) { selectApk(recieve.split(SocketInstruction.separator)[1]); } else if (recieve.startsWith(SocketInstruction.COMPLETE_INSTALLING_APK)) { socketText.setText("Install new APK completed."); } else if (recieve.startsWith(SocketInstruction.ERROR_MESSAGE)) { Toast.makeText(GmMainActivity.this, recieve.split(SocketInstruction.separator)[1], Toast.LENGTH_SHORT).show(); } else { setScreenshotToImageView(readByte); } } }); } }); } private void selectDevice(String recieve) { final ArrayList<Pair<String, String>> items = getAllDevices(recieve); DialogBuilder.showSingleSelectDialog(GmMainActivity.this, "Select a Device", items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, final int which) { socketClient.write(SocketInstruction.SET_DEVICE + SocketInstruction.separator + items.get(which).second, new OnWriteCallBackListener() { @Override public void onWriteCallBack() { runOnUiThread(new Runnable() { public void run() { socketText.setText("Select: " + items.get(which).second); } }); } }); } }); } private ArrayList<Pair<String, String>> getAllDevices(String text) { String[] splits = text.split("\n"); ArrayList<Pair<String, String>> devices = new ArrayList<Pair<String, String>>(); for (String split : splits) { if (split.contains(" ")) { String device = split.split(" ")[0]; devices.add(new Pair<String, String>(device, device)); } } return devices; } private void selectScript(String recieve) { final ArrayList<Pair<String, String>> items = getAllItems(recieve); DialogBuilder.showSingleSelectDialog(GmMainActivity.this, "Select a Script", items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, final int which) { socketClient.write(SocketInstruction.SET_SCRIPT + SocketInstruction.separator + items.get(which).second, new OnWriteCallBackListener() { @Override public void onWriteCallBack() { runOnUiThread(new Runnable() { public void run() { socketText.setText("Start running: " + items.get(which).second); } }); } }); } }); } private void selectApk(String recieve) { final ArrayList<Pair<String, String>> items = getAllItems(recieve); DialogBuilder.showSingleSelectDialog(GmMainActivity.this, "Select a APK to Install", items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, final int which) { socketClient.write(SocketInstruction.SET_APK + SocketInstruction.separator + items.get(which).second, new OnWriteCallBackListener() { @Override public void onWriteCallBack() { runOnUiThread(new Runnable() { public void run() { socketText.setText("Start installing: " + items.get(which).second); } }); } }); } }); } private ArrayList<Pair<String, String>> getAllItems(String text) { String[] splits = text.split(","); ArrayList<Pair<String, String>> scripts = new ArrayList<Pair<String, String>>(); for (String script : splits) { scripts.add(new Pair<String, String>(script, script)); } return scripts; } private void setScreenshotToImageView(byte[] readByte) { BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inDither = true; opt.inPreferredConfig = Bitmap.Config.ARGB_8888; LogUtils.i(getClass().getSimpleName(), "bytes.length: " + readByte.length); Bitmap bitmap = BitmapFactory.decodeByteArray(readByte, 0, readByte.length, opt); simulationImage.setImageBitmap(bitmap); } }