diff options
Diffstat (limited to 'app/src/fil/libre/repwifiapp/activities/MainActivity.java')
-rw-r--r-- | app/src/fil/libre/repwifiapp/activities/MainActivity.java | 858 |
1 files changed, 429 insertions, 429 deletions
diff --git a/app/src/fil/libre/repwifiapp/activities/MainActivity.java b/app/src/fil/libre/repwifiapp/activities/MainActivity.java index aa179fb..6e667bf 100644 --- a/app/src/fil/libre/repwifiapp/activities/MainActivity.java +++ b/app/src/fil/libre/repwifiapp/activities/MainActivity.java @@ -21,447 +21,447 @@ package fil.libre.repwifiapp.activities; import java.io.IOException; +import java.net.SocketException; +import fil.libre.repwifiapp.ActivityLauncher; import fil.libre.repwifiapp.Commons; import fil.libre.repwifiapp.R; -import fil.libre.repwifiapp.Commons.RequestCode; +import fil.libre.repwifiapp.ActivityLauncher.RequestCode; import fil.libre.repwifiapp.helpers.AccessPointInfo; import fil.libre.repwifiapp.helpers.ConnectionStatus; import fil.libre.repwifiapp.helpers.NetworkManager; import fil.libre.repwifiapp.helpers.RootCommand; import fil.libre.repwifiapp.helpers.Utils; import android.os.Bundle; -import android.app.Activity; -import android.app.AlertDialog; -import android.content.DialogInterface; +import android.content.BroadcastReceiver; +import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.graphics.drawable.Drawable; -import android.view.Menu; -import android.view.MenuItem; +import android.hardware.usb.UsbManager; +import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.Toast; -public class MainActivity extends Activity{ - - private AlertDialog diag; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - - if(! Commons.init(this)){ - Utils.logDebug("Failed to initialize Commons. Aborting."); - finish(); - return; - } - - setImage(); - - //checkConnectionStatus(); - - } - - @Override - public void onStart(){ - super.onStart(); - Utils.logDebug("Main onStart()"); - - checkConditions(); - - ConnectionStatus status = Commons.connectionEngine.getConnectionStatus(); - if (status != null && status.isConnected()){ - Utils.logDebug("Main about to launch status activity..."); - launchStatusActivity(status); - } - - Utils.logDebug("Main onStart() returning."); - - } - - @Override - public void onStop(){ - super.onStop(); - - if (this.diag != null){ - this.diag.dismiss(); - } - - } - - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // Inflate the menu; this adds items to the action bar if it is present. - getMenuInflater().inflate(R.menu.activity_main, menu); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - // Handle item selection - switch (item.getItemId()) { - case R.id.menu_credits: - launchCreditsActivity(); - break; - - case R.id.menu_config: - launchSettingsActivity(); - break; - - default: - break; - } - - return true; - } - - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent intent){ - - Utils.logDebug("Main onActivityResult(): ",1); - - if (intent == null){ - return; - } - - if (resultCode != RESULT_OK){ - return; - } - - AccessPointInfo i = null; - if (intent.hasExtra(Commons.EXTRA_APINFO)){ - i = (AccessPointInfo)intent.getExtras().getSerializable(Commons.EXTRA_APINFO); - } - - switch (requestCode) { - - case RequestCode.PASS_INPUT: - handleResultSetPass(i); - break; - - case RequestCode.SELECT_CONN: - boolean rescan = intent.getExtras().getBoolean(Commons.EXTRA_RESCAN); - handleResultSelect(i, rescan); - break; - - case RequestCode.CONNECT: - boolean conres = intent.getExtras().getBoolean(Commons.EXTRA_BOOLEAN); - handleFinishedConnecting(conres, i); - break; - - case RequestCode.STATUS_GET: - ConnectionStatus status = (ConnectionStatus)intent.getExtras().getSerializable(Commons.EXTRA_CONSTATUS); - handleResultGetStatus(status); - break; - - case RequestCode.NETWORKS_GET: - AccessPointInfo[] nets = (AccessPointInfo[])intent.getExtras().getSerializable(Commons.EXTRA_APINFO_ARR); - launchSelectActivity(nets, true); - - case RequestCode.STATUS_SHOW: - //do nothing - break; - - case RequestCode.SELECT_DETAILS: - launchDetailsActivity(i); - break; - - case RequestCode.DETAILS_SHOW: - boolean del = intent.getExtras().getBoolean(Commons.EXTRA_DELETE); - if (del){ deleteNetwork(i); } - break; - - default: - - break; - - } - - - } - - private void setImage(){ - - ImageView img = (ImageView)findViewById(R.id.img_logo); - - try { - Drawable d = Drawable.createFromStream(getAssets().open("repwifi-logo-0.png"),null); - img.setImageDrawable(d); - } catch (IOException e) { - Utils.logError("Error while loading logo image",e); - } - - } - - - private void handleResultSelect(AccessPointInfo i, boolean rescan){ - - if (rescan){ - - doScan(); - - }else if (i != null){ - - if (i.needsPassword()){ - - //try to fetch network's password from storage - AccessPointInfo fromStorage = Commons.storage.getSavedNetwork(i); - if (fromStorage == null){ - - launchPasswordActivity(i); - return; - - }else{ - //use fetched network - i = fromStorage; - } - - } - - connectToNetwork(i); - } - - } - - private void handleResultSetPass(AccessPointInfo i){ - connectToNetwork(i); - } - - private void handleResultGetStatus(ConnectionStatus status){ - if (status != null && status.isConnected()){ - launchStatusActivity(status); - } - } - - private void handleFinishedConnecting(boolean connectionResult, AccessPointInfo info){ - - if(connectionResult && info.needsPassword()){ - - //Save network - if (Commons.storage.save(info)){ - Toast toast2 = Toast.makeText(getApplicationContext(), "Network Saved!",Toast.LENGTH_LONG); - toast2.show(); - - }else { - Toast toast2 = Toast.makeText(getApplicationContext(), "FAILED to save network!",Toast.LENGTH_LONG); - toast2.show(); - } - - checkConnectionStatus(); - - }else{ - //alert that connection failed - Toast toast = Toast.makeText(getApplicationContext(), "FAILED to connect!", Toast.LENGTH_LONG); - toast.show(); - } - } - - private void launchPasswordActivity(AccessPointInfo info){ - - Intent intent = new Intent(); - intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - intent.setClass(getApplicationContext(), InputPasswordActivity.class); - intent.putExtra(Commons.EXTRA_APINFO, info); - - startActivityForResult(intent, RequestCode.PASS_INPUT); - - } - - private void launchStatusActivity(ConnectionStatus status){ - - Intent intent = new Intent(); - intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - intent.putExtra(Commons.EXTRA_CONSTATUS, status); - intent.setClass(getApplicationContext(), ShowStatusActivity.class); - startActivityForResult(intent, RequestCode.STATUS_SHOW); - - } - - private void launchSelectActivity(AccessPointInfo[] nets,boolean forConnection){ - - Intent intent = new Intent(this, SelectNetworkActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - intent.putExtra(Commons.EXTRA_APINFO_ARR, nets); - - if (forConnection){ - intent.putExtra(Commons.EXTRA_REQCODE, RequestCode.SELECT_CONN); - startActivityForResult(intent, RequestCode.SELECT_CONN); - } - else{ - intent.putExtra(Commons.EXTRA_REQCODE, RequestCode.SELECT_DETAILS); - startActivityForResult(intent, RequestCode.SELECT_DETAILS); - } - - } - - private void launchDetailsActivity(AccessPointInfo info){ - - Intent intent = new Intent(this, NetworkDetailsActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - intent.putExtra(Commons.EXTRA_APINFO, info); - startActivityForResult(intent, RequestCode.DETAILS_SHOW); - - } - - private void launchCreditsActivity(){ - Intent intent = new Intent(this, CreditsActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - startActivityForResult(intent, RequestCode.NONE); - } - - private void launchSettingsActivity() { - Intent intent = new Intent(this, SettingsActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - startActivity(intent); - } - - private void deleteNetwork(AccessPointInfo info){ - - NetworkManager manager = new NetworkManager(Commons.getNetworkStorageFile()); - String msg = ""; - if (manager.remove(info)){ - msg = "Network info deleted!"; - }else{ - msg = "FAILED to delete network info!"; - } - - Toast toast = Toast.makeText(this, msg, Toast.LENGTH_LONG); - toast.show(); - - } - - private void connectToNetwork(AccessPointInfo info){ - - Intent intent = new Intent(this, LongTaskActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - intent.putExtra(Commons.EXTRA_REQCODE, RequestCode.CONNECT); - intent.putExtra(Commons.EXTRA_APINFO, info); - startActivityForResult(intent, RequestCode.CONNECT); - - } - - private void checkConnectionStatus(){ - - Intent intent = new Intent(this, LongTaskActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - intent.putExtra(Commons.EXTRA_REQCODE, RequestCode.STATUS_GET); - startActivityForResult(intent, RequestCode.STATUS_GET); - - } - - private boolean checkConditions(){ - return (checkRootEnabled() && checkInterface()); - } - - private boolean checkInterface(){ - - boolean res = Commons.connectionEngine.isInterfaceAvailable(Commons.INTERFACE_NAME); - - if(res == false ){ - String msg = getResources().getString(R.string.msg_interface_not_found); - showMessage(msg); - } - - return res; - - } - - private boolean checkRootEnabled(){ - - boolean result = false; - String msg = "Unknown Root error"; - RootCommand su = new RootCommand(null); - - int excode = -1; - - try { - excode = su.execute(); - } catch (Exception e) { - Utils.logError("Error while trying to get first Super User access.",e); - excode = -1; - result = false; - } - - switch (excode) { - case 0: - result = true; - break; - - case Commons.EXCOD_ROOT_DENIED: - result = false; - msg = getResources().getString(R.string.msg_root_denied); - break; - - case Commons.EXCOD_ROOT_DISABLED: - result = false; - msg = getResources().getString(R.string.msg_root_disabled); - break; - - default: - result = false; - msg = "Unknown Root error.\nExit code " + excode; - break; - } - - if (!result){ - showMessage(msg); - } - - return result; - - } - - private void doScan(){ - - if (!checkConditions()){ - return; - } - - Intent intent = new Intent(this, LongTaskActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - intent.putExtra(Commons.EXTRA_REQCODE, RequestCode.NETWORKS_GET); - startActivityForResult(intent, RequestCode.NETWORKS_GET); - - } - - public void btnScanClick(View v){ - - doScan(); - - } - - public void btnManageClick(View v){ - - NetworkManager manager = new NetworkManager(Commons.getNetworkStorageFile()); - AccessPointInfo[] infos = manager.getKnownNetworks(); - - if (infos == null || infos.length == 0){ - Toast toast = Toast.makeText(this, "No saved network", Toast.LENGTH_LONG); - toast.show(); - } - else{ - launchSelectActivity(infos, false); - } - - } - - private void showMessage(String msg){ - - AlertDialog.Builder dlgAlert = new AlertDialog.Builder(this); - dlgAlert.setMessage(msg); - dlgAlert.setPositiveButton("OK",new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int whichButton) { - return; - } - }); - - dlgAlert.setCancelable(false); - this.diag = dlgAlert.create(); - this.diag.show(); - - } - +public class MainActivity extends MenuEnabledActivity { + + private ActivityLauncher launcher = new ActivityLauncher(this); + private BroadcastReceiver detachReceiver; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + if (!Commons.init(this)) { + Utils.logDebug("Failed to initialize Commons. Aborting."); + finish(); + return; + } + + setImage(); + setUsbDeviceMonitor(); + } + + @Override + public void onStart() { + super.onStart(); + Utils.logDebug("Main onStart()"); + + Commons.updateNotification(this); + + if (handleIntent()) { + // app called for a specific intent. + // avoid any other task. + Log.d("RepWifi", "handleIntent returned true"); + return; + } + + checkConditions(); + + ConnectionStatus status = Commons.connectionEngine.getConnectionStatus(); + if (status != null && status.isConnected()) { + Utils.logDebug("Main about to launch status activity..."); + launcher.launchStatusActivity(status); + } + + Utils.logDebug("Main onStart() returning."); + + } + + private boolean handleIntent() { + + Intent i = getIntent(); + if (i != null && i.hasExtra(ActivityLauncher.EXTRA_REQCODE)) { + + switch (i.getIntExtra(ActivityLauncher.EXTRA_REQCODE, -1)) { + + case RequestCode.NONE: + moveTaskToBack(true); + + break; + + default: + break; + } + + return true; + + } else { + // no intent to handle. + return false; + } + + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent intent) { + + Utils.logDebug("Main onActivityResult(): ", 1); + + if (intent == null) { + return; + } + + if (resultCode != RESULT_OK) { + return; + } + + AccessPointInfo i = null; + if (intent.hasExtra(ActivityLauncher.EXTRA_APINFO)) { + Bundle xtras = intent.getExtras(); + i = (AccessPointInfo) xtras.getSerializable(ActivityLauncher.EXTRA_APINFO); + } + + switch (requestCode) { + + case RequestCode.PASS_INPUT: + handleResultSetPass(i); + break; + + case RequestCode.SELECT_CONN: + boolean rescan = intent.getExtras().getBoolean(ActivityLauncher.EXTRA_RESCAN); + handleResultSelect(i, rescan); + break; + + case RequestCode.CONNECT: + boolean conres = intent.getExtras().getBoolean(ActivityLauncher.EXTRA_BOOLEAN); + handleFinishedConnecting(conres, i); + break; + + case RequestCode.STATUS_GET: + ConnectionStatus status = (ConnectionStatus) intent.getExtras().getSerializable( + ActivityLauncher.EXTRA_CONSTATUS); + handleResultGetStatus(status); + break; + + case RequestCode.NETWORKS_GET: + AccessPointInfo[] nets = (AccessPointInfo[]) intent.getExtras().getSerializable( + ActivityLauncher.EXTRA_APINFO_ARR); + launcher.launchSelectActivity(nets, true, false); + + case RequestCode.STATUS_SHOW: + // do nothing + break; + + case RequestCode.SELECT_DETAILS: + launcher.launchDetailsActivity(i); + break; + + case RequestCode.DETAILS_SHOW: + boolean del = intent.getExtras().getBoolean(ActivityLauncher.EXTRA_DELETE); + if (del) { + deleteNetwork(i); + } + break; + + case RequestCode.CONNECT_HIDDEN: + + if (i != null) { + handleResultSelect(i, false); + } + break; + + default: + + break; + + } + + } + + private void setImage() { + + ImageView img = (ImageView) findViewById(R.id.img_logo); + + try { + Drawable d = Drawable.createFromStream(getAssets().open("repwifi-logo-0.png"), null); + img.setImageDrawable(d); + } catch (IOException e) { + Utils.logError("Error while loading logo image", e); + } + + } + + private void setUsbDeviceMonitor() { + detachReceiver = new BroadcastReceiver() { + public void onReceive(Context context, Intent intent) { + if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) { + handleUsbEvent(true); + } else if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) { + handleUsbEvent(false); + } + } + }; + + IntentFilter filter = new IntentFilter(); + filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); + registerReceiver(detachReceiver, filter); + + IntentFilter filt2 = new IntentFilter(); + filt2.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); + registerReceiver(detachReceiver, filt2); + } + + private boolean checkConditions() { + return (checkRootEnabled() && checkInterface(true)); + } + + private boolean checkInterface(boolean alert) { + + boolean res = false; + String msg = ""; + + try { + res = Commons.connectionEngine.isInterfaceAvailable(Commons.INTERFACE_NAME); + } catch (SocketException e) { + Utils.logError("SocketException during isInterfaceAvailable()", e); + msg = "Error while retrieving interface list!"; + res = false; + } + + if (res == false && alert) { + msg = getResources().getString(R.string.msg_interface_not_found); + Commons.showMessage(msg, this); + } + + return res; + + } + + private boolean checkRootEnabled() { + + boolean result = false; + String msg = "Unknown Root error"; + RootCommand su = new RootCommand(null); + + int excode = -1; + + try { + excode = su.execute(); + } catch (Exception e) { + Utils.logError("Error while trying to get first Super User access.", e); + excode = -1; + result = false; + } + + switch (excode) { + case 0: + result = true; + break; + + case Commons.EXCOD_ROOT_DENIED: + result = false; + msg = getResources().getString(R.string.msg_root_denied); + break; + + case Commons.EXCOD_ROOT_DISABLED: + result = false; + msg = getResources().getString(R.string.msg_root_disabled); + break; + + default: + result = false; + msg = "Unknown Root error.\nExit code " + excode; + break; + } + + if (!result) { + Commons.showMessage(msg, this); + } + + return result; + + } + + private void handleResultSelect(AccessPointInfo i, boolean rescan) { + + if (rescan) { + + doScan(); + + } else if (i != null) { + + if (i.needsPassword()) { + + // try to fetch network's password from storage + AccessPointInfo fromStorage = Commons.storage.getSavedNetwork(i); + if (fromStorage == null) { + + launcher.launchPasswordActivity(i); + return; + + } else { + // use fetched network + i = fromStorage; + } + + } + + launcher.launchLongTaskActivityConnect(i); + } + + } + + private void handleResultSetPass(AccessPointInfo i) { + launcher.launchLongTaskActivityConnect(i); + } + + private void handleResultGetStatus(ConnectionStatus status) { + if (status != null && status.isConnected()) { + launcher.launchStatusActivity(status); + } + } + + private void handleFinishedConnecting(boolean connectionResult, AccessPointInfo info) { + + if (connectionResult && info.needsPassword()) { + + ConnectionStatus status = Commons.connectionEngine.getConnectionStatus(); + if (status != null) { + // update APinfo with the right BSSID + info.setBssid(status.BSSID); + } + + // Save network + if (Commons.storage.save(info)) { + Toast toast2 = Toast.makeText(getApplicationContext(), "Network Saved!", + Toast.LENGTH_LONG); + toast2.show(); + + } else { + Toast toast2 = Toast.makeText(getApplicationContext(), "FAILED to save network!", + Toast.LENGTH_LONG); + toast2.show(); + } + + // show status + launcher.launchStatusActivity(status); + + } else { + // alert that connection failed + Toast toast = Toast.makeText(getApplicationContext(), "FAILED to connect!", + Toast.LENGTH_LONG); + toast.show(); + } + } + + private void deleteNetwork(AccessPointInfo info) { + + NetworkManager manager = new NetworkManager(Commons.getNetworkStorageFile()); + String msg = ""; + if (manager.remove(info)) { + msg = "Network info deleted!"; + } else { + msg = "FAILED to delete network info!"; + } + + Toast toast = Toast.makeText(this, msg, Toast.LENGTH_LONG); + toast.show(); + + } + + private void handleUsbEvent(boolean detached) { + + if (detached && !checkInterface(false)) { + // device disconnected, update the status bar: + Commons.updateNotification(this); + + } else if (Commons.isAutoConnectEnabled()) { + + try { + + // waits for a maximum of WAIT_ON_USB_ATTACHED milliseconds + // to let the interface being registered. + int msWaited = 0; + while (msWaited < Commons.WAIT_ON_USB_ATTACHED) { + + Thread.sleep(100); + msWaited += 100; + + if (checkInterface(false)) { + autoConnect(); + return; + } + } + + } catch (InterruptedException e) { + // ignores and exits; + return; + } + + } + + } + + private void autoConnect() { + + try { + + AccessPointInfo[] nets = Commons.connectionEngine.getAvailableNetworks(); + if (nets == null || nets.length == 0) { + return; + } + + for (AccessPointInfo i : nets) { + + if (Commons.storage.isKnown(i)) { + launcher.launchLongTaskActivityConnect(i); + return; + } + + } + + // if no network is known, shows available networks to the user. + launcher.launchSelectActivity(nets, true, false); + + } catch (Exception e) { + Utils.logError("Error while autoconnecting", e); + Commons.showMessage("An error occured while trying to auto-connect", this); + } + + } + + private void doScan() { + if (checkConditions()) { + launcher.launchLongTaskActivityScan(); + } + } + + public void btnScanClick(View v) { + doScan(); + } + + public void btnHiddenClick(View v) { + + if (checkConditions()) { + launcher.launchInputSsidActivity(); + } + + } + + public void btnManageClick(View v) { + launcher.launchSelectActivity(null, false, true); + } + } |