aboutsummaryrefslogtreecommitdiffstats
path: root/project/src/fil/libre/repwifiapp/activities
diff options
context:
space:
mode:
Diffstat (limited to 'project/src/fil/libre/repwifiapp/activities')
-rw-r--r--project/src/fil/libre/repwifiapp/activities/CreditsActivity.java56
-rw-r--r--project/src/fil/libre/repwifiapp/activities/InputPasswordActivity.java112
-rw-r--r--project/src/fil/libre/repwifiapp/activities/LongTaskActivity.java174
-rw-r--r--project/src/fil/libre/repwifiapp/activities/MainActivity.java378
-rw-r--r--project/src/fil/libre/repwifiapp/activities/NetworkDetailsActivity.java145
-rw-r--r--project/src/fil/libre/repwifiapp/activities/SelectNetworkActivity.java222
-rw-r--r--project/src/fil/libre/repwifiapp/activities/ShowStatusActivity.java131
7 files changed, 1218 insertions, 0 deletions
diff --git a/project/src/fil/libre/repwifiapp/activities/CreditsActivity.java b/project/src/fil/libre/repwifiapp/activities/CreditsActivity.java
new file mode 100644
index 0000000..4a0cb4c
--- /dev/null
+++ b/project/src/fil/libre/repwifiapp/activities/CreditsActivity.java
@@ -0,0 +1,56 @@
+//
+// Copyright 2017 Filippo "Fil" Bergamo <fil.bergamo@riseup.net>
+//
+// This file is part of RepWifiApp.
+//
+// RepWifiApp is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// RepWifiApp is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with RepWifiApp. If not, see <http://www.gnu.org/licenses/>.
+//
+// ********************************************************************
+
+package fil.libre.repwifiapp.activities;
+
+import fil.libre.repwifiapp.R;
+
+import android.os.Bundle;
+import android.app.Activity;
+import android.text.Html;
+import android.text.method.LinkMovementMethod;
+import android.text.method.ScrollingMovementMethod;
+import android.view.Menu;
+import android.widget.TextView;
+
+public class CreditsActivity extends Activity {
+
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_credits);
+
+ String content = getResources().getString(R.string.credit_text);
+ TextView tv = (TextView)findViewById(R.id.txt_credits);
+ tv.setMovementMethod(new ScrollingMovementMethod());
+ tv.setText(Html.fromHtml(content));
+ tv.setMovementMethod(LinkMovementMethod.getInstance());
+
+ }
+
+ @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_credits, menu);
+ return true;
+ }
+
+}
diff --git a/project/src/fil/libre/repwifiapp/activities/InputPasswordActivity.java b/project/src/fil/libre/repwifiapp/activities/InputPasswordActivity.java
new file mode 100644
index 0000000..e46d7d9
--- /dev/null
+++ b/project/src/fil/libre/repwifiapp/activities/InputPasswordActivity.java
@@ -0,0 +1,112 @@
+//
+// Copyright 2017 Filippo "Fil" Bergamo <fil.bergamo@riseup.net>
+//
+// This file is part of RepWifiApp.
+//
+// RepWifiApp is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// RepWifiApp is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with RepWifiApp. If not, see <http://www.gnu.org/licenses/>.
+//
+// ********************************************************************
+
+package fil.libre.repwifiapp.activities;
+
+
+import fil.libre.repwifiapp.Commons;
+import fil.libre.repwifiapp.R;
+import fil.libre.repwifiapp.helpers.AccessPointInfo;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.text.InputType;
+import android.view.Menu;
+import android.view.View;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.CompoundButton.OnCheckedChangeListener;
+import android.widget.EditText;
+import android.widget.TextView;
+
+
+public class InputPasswordActivity extends Activity implements OnCheckedChangeListener{
+
+ AccessPointInfo apinfo = null;
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ setContentView(R.layout.activity_input_password);
+
+ CheckBox c = (CheckBox)findViewById(R.id.chk_show_pass);
+ c.setOnCheckedChangeListener(this);
+
+ setTitle("Input password");
+
+ TextView v = (TextView)findViewById(R.id.txt_insert_pass);
+
+ //get the network to set password to:
+ this.apinfo = (AccessPointInfo)getIntent().getSerializableExtra(Commons.EXTRA_APINFO);
+ v.append(" " + apinfo.getSSID());
+
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ //super.onCreateOptionsMenu(menu);
+ //getMenuInflater().inflate(R.menu.activity_input_password, menu);
+ return true;
+ }
+
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+
+ if(buttonView == findViewById(R.id.chk_show_pass)){
+ chkShowPassChanged();
+ }
+ }
+
+ public void onBtnNextClick(View v){
+
+ EditText txpass = (EditText)findViewById(R.id.txt_password);
+ String pass = txpass.getText().toString();
+ if (pass.length()>0){
+
+ this.apinfo.setPassword(pass);
+
+ Intent intent = new Intent();
+ intent.putExtra(Commons.EXTRA_APINFO, this.apinfo);
+ setResult(RESULT_OK, intent);
+ finish();
+
+ }
+
+
+ }
+
+ public void chkShowPassChanged(){
+
+ CheckBox c = (CheckBox)findViewById(R.id.chk_show_pass);
+ EditText txtPass = (EditText)findViewById(R.id.txt_password);
+
+ if (c.isChecked()){
+ txtPass.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
+ txtPass.setSelection(txtPass.getText().length());
+ }else{
+ txtPass.setInputType(129);
+ txtPass.setSelection(txtPass.getText().length());
+ }
+
+ }
+
+}
diff --git a/project/src/fil/libre/repwifiapp/activities/LongTaskActivity.java b/project/src/fil/libre/repwifiapp/activities/LongTaskActivity.java
new file mode 100644
index 0000000..a9f010a
--- /dev/null
+++ b/project/src/fil/libre/repwifiapp/activities/LongTaskActivity.java
@@ -0,0 +1,174 @@
+package fil.libre.repwifiapp.activities;
+
+
+import fil.libre.repwifiapp.Commons;
+import fil.libre.repwifiapp.R;
+import fil.libre.repwifiapp.helpers.AccessPointInfo;
+import fil.libre.repwifiapp.helpers.ConnectionStatus;
+import fil.libre.repwifiapp.helpers.Utils;
+
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.view.Menu;
+import android.widget.TextView;
+import android.app.Activity;
+import android.content.Intent;
+
+public class LongTaskActivity extends Activity {
+
+
+ private class Task extends AsyncTask<Object, Object, Object>{
+
+ private int REQ_CODE;
+
+ public Task(int reqCode, Object input){
+ this.REQ_CODE = reqCode;
+ }
+
+ @Override
+ protected Object doInBackground(Object... params) {
+
+ Object ret = null;
+
+ switch (this.REQ_CODE){
+
+ case Commons.RequestCode.CONNECT:
+
+ ret = Commons.connectionEngine.connect((AccessPointInfo)params[0]);
+ break;
+
+ case Commons.RequestCode.NETWORKS_GET:
+
+ ret = Commons.connectionEngine.getAvailableNetworks();
+ break;
+
+ case Commons.RequestCode.STATUS_GET:
+
+ ret = Commons.connectionEngine.getConnectionStatus();
+ break;
+
+ default:
+
+ break;
+
+ }
+
+ return ret;
+
+ }
+
+ protected void onPostExecute(Object result) {
+ taskCompleted(result, this.REQ_CODE);
+ }
+
+ }
+
+ private AccessPointInfo currentNetwork = null;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState){
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_long_task);
+
+ startTask();
+
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu){
+ return true;
+ }
+
+ private void startTask() {
+
+ //retrieve the request code:
+ Intent intent = getIntent();
+ if (! intent.hasExtra(Commons.EXTRA_REQCODE)){
+ this.setResult(RESULT_CANCELED);
+ finish();
+ }
+
+ Object input = null;
+ int reqCode = intent.getExtras().getInt(Commons.EXTRA_REQCODE);
+
+ switch (reqCode) {
+
+ case Commons.RequestCode.CONNECT:
+ setTitle("Connecting...");
+ setMessage("Connecting...");
+ //Extract AccessPointInfo
+ input = intent.getExtras().getSerializable(Commons.EXTRA_APINFO);
+ currentNetwork = (AccessPointInfo)input;
+ break;
+
+ case Commons.RequestCode.NETWORKS_GET:
+ setTitle("Scanning...");
+ setMessage("Scanning for Networks...");
+
+ case Commons.RequestCode.STATUS_GET:
+ setTitle("Checking status...");
+ setMessage("Checking status...");
+
+ default:
+ setTitle("Please wait...");
+ setMessage("Please wait...");
+ break;
+ }
+
+ Task task = new Task(reqCode, input);
+ task.execute(input);
+
+ }
+
+ private void taskCompleted(Object result, int reqCode){
+
+ Utils.logDebug("Finished long task reqCode: "+ reqCode,1);
+
+ //Return to caller:
+ Intent intent = this.getIntent();
+
+
+ switch (reqCode){
+
+ case Commons.RequestCode.CONNECT:
+
+ intent.putExtra(Commons.EXTRA_BOOLEAN, (Boolean)result);
+ intent.putExtra(Commons.EXTRA_APINFO, this.currentNetwork);
+ break;
+
+ case Commons.RequestCode.NETWORKS_GET:
+
+ intent.putExtra(Commons.EXTRA_APINFO_ARR, (AccessPointInfo[])result);
+ break;
+
+ case Commons.RequestCode.STATUS_GET:
+
+ intent.putExtra(Commons.EXTRA_CONSTATUS, (ConnectionStatus)result);
+ break;
+
+ default:
+
+ Utils.logDebug("Task terminating in null: ",1);
+ break;
+
+ }
+
+ this.setResult(RESULT_OK, intent);
+ finish();
+
+ }
+
+
+ private void setMessage(String msg) {
+ TextView txt = (TextView)findViewById(R.id.txt_msg);
+ txt.setText(msg);
+ }
+
+ @Override
+ public void onBackPressed() {
+ //suppress
+ }
+
+
+
+}
diff --git a/project/src/fil/libre/repwifiapp/activities/MainActivity.java b/project/src/fil/libre/repwifiapp/activities/MainActivity.java
new file mode 100644
index 0000000..aa92767
--- /dev/null
+++ b/project/src/fil/libre/repwifiapp/activities/MainActivity.java
@@ -0,0 +1,378 @@
+//
+// Copyright 2017 Filippo "Fil" Bergamo <fil.bergamo@riseup.net>
+//
+// This file is part of RepWifiApp.
+//
+// RepWifiApp is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// RepWifiApp is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with RepWifiApp. If not, see <http://www.gnu.org/licenses/>.
+//
+// ********************************************************************
+
+package fil.libre.repwifiapp.activities;
+
+
+
+
+
+import java.io.IOException;
+
+import fil.libre.repwifiapp.Commons;
+import fil.libre.repwifiapp.R;
+import fil.libre.repwifiapp.Commons.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.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.Toast;
+
+public class MainActivity extends Activity{
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+
+ setImage();
+ setupSharedResources();
+
+ RootCommand su = new RootCommand(null);
+ try {
+ su.execute();
+ } catch (Exception e) {
+ Utils.logError("Error while trying to get first Super User access. Aborting.",e);
+ finish();
+ }
+
+ try {
+ Commons.initObjects();
+ } catch (Exception e) {
+ Utils.logError("Error on creating engine. Aborting.",e);
+ finish();
+ }
+
+
+ checkConnectionStatus();
+
+
+ }
+
+ @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();
+ return true;
+
+ default:
+ return true;
+ }
+ }
+
+ @Override
+ public void onRestart(){
+ super.onRestart();
+
+ ConnectionStatus status = Commons.connectionEngine.getConnectionStatus();
+ if (status != null && status.isConnected()){
+ launchStatusActivity(status);
+ }
+
+ }
+
+ @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 = (boolean)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 setupSharedResources(){
+ Commons.colorThemeDark = getResources().getColor(R.color.ThemeDark);
+ Commons.colorThemeLight = getResources().getColor(R.color.ThemeLight);
+ Commons.colorBlack = getResources().getColor(R.color.black);
+ Commons.setAppDataFolder(getExternalFilesDir(null).getAbsolutePath());
+ }
+
+ 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 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 void doScan(){
+
+ 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);
+ }
+
+ }
+
+}
diff --git a/project/src/fil/libre/repwifiapp/activities/NetworkDetailsActivity.java b/project/src/fil/libre/repwifiapp/activities/NetworkDetailsActivity.java
new file mode 100644
index 0000000..e43eee2
--- /dev/null
+++ b/project/src/fil/libre/repwifiapp/activities/NetworkDetailsActivity.java
@@ -0,0 +1,145 @@
+//
+// Copyright 2017 Filippo "Fil" Bergamo <fil.bergamo@riseup.net>
+//
+// This file is part of RepWifiApp.
+//
+// RepWifiApp is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// RepWifiApp is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with RepWifiApp. If not, see <http://www.gnu.org/licenses/>.
+//
+// ********************************************************************
+
+package fil.libre.repwifiapp.activities;
+
+import java.util.Date;
+
+
+import fil.libre.repwifiapp.Commons;
+import fil.libre.repwifiapp.R;
+import fil.libre.repwifiapp.helpers.AccessPointInfo;
+
+import android.os.Bundle;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.text.format.DateFormat;
+import android.view.Menu;
+import android.view.View;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.TextView;
+import android.widget.CompoundButton.OnCheckedChangeListener;
+
+public class NetworkDetailsActivity extends Activity implements OnCheckedChangeListener {
+
+ private AccessPointInfo currentNetwor;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_network_details);
+
+ CheckBox c = (CheckBox)findViewById(R.id.chk_show_pass_details);
+ c.setOnCheckedChangeListener(this);
+
+ Intent intent = getIntent();
+ if (! intent.hasExtra(Commons.EXTRA_APINFO)){
+ this.setResult(RESULT_CANCELED);
+ this.finish();
+ return;
+ }
+
+ this.currentNetwor = (AccessPointInfo)intent.getExtras().getSerializable(Commons.EXTRA_APINFO);
+ if (this.currentNetwor == null){
+ this.setResult(RESULT_CANCELED);
+ this.finish();
+ return;
+ }
+
+ loadNetwork(false);
+
+ }
+
+ @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_manage_networks, menu);
+ return true;
+ }
+
+ private void loadNetwork(boolean showPassword){
+
+ setTitle(this.currentNetwor.getSSID());
+
+ TextView v = (TextView)findViewById(R.id.txt_net_details);
+ v.setText("SSID: " + this.currentNetwor.getSSID());
+ v.append("\nBSSID: " + this.currentNetwor.getBSSID());
+
+ long lastused = this.currentNetwor.getLastTimeUsed();
+ if (lastused > 0){
+ Date ts = new Date(lastused);
+ String formstring = "dd-MMM-yyyy kk:mm:ss";
+ v.append("\nLast Used: " + DateFormat.format(formstring, ts));
+ }
+
+ if (showPassword){
+ v.append("\n\nPassword:\n" + this.currentNetwor.getPassword());
+ }else{
+ v.append("\n\n\n");
+ }
+
+ }
+
+ public void btnDeleteClick(View v){
+
+
+ AlertDialog.Builder dlgAlert = new AlertDialog.Builder(this);
+ dlgAlert.setMessage("Are you sure you want to delete this network?");
+ dlgAlert.setPositiveButton("Yes",new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton) {
+ returnResult(true);
+ }
+ });
+ dlgAlert.setNegativeButton("NO",new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton) {
+ //nothing
+ }
+ });
+
+ dlgAlert.setCancelable(true);
+ dlgAlert.create().show();
+
+ }
+
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+
+ if (buttonView == findViewById(R.id.chk_show_pass_details)){
+ loadNetwork(isChecked);
+ }
+
+ }
+
+ private void returnResult(boolean delete){
+
+ Intent i = new Intent();
+ i.putExtra(Commons.EXTRA_DELETE, delete);
+ i.putExtra(Commons.EXTRA_APINFO, this.currentNetwor);
+ this.setResult(RESULT_OK,i);
+ finish();
+
+ }
+
+
+
+}
diff --git a/project/src/fil/libre/repwifiapp/activities/SelectNetworkActivity.java b/project/src/fil/libre/repwifiapp/activities/SelectNetworkActivity.java
new file mode 100644
index 0000000..275ce08
--- /dev/null
+++ b/project/src/fil/libre/repwifiapp/activities/SelectNetworkActivity.java
@@ -0,0 +1,222 @@
+//
+// Copyright 2017 Filippo "Fil" Bergamo <fil.bergamo@riseup.net>
+//
+// This file is part of RepWifiApp.
+//
+// RepWifiApp is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// RepWifiApp is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with RepWifiApp. If not, see <http://www.gnu.org/licenses/>.
+//
+// ********************************************************************
+
+package fil.libre.repwifiapp.activities;
+
+
+
+
+import fil.libre.repwifiapp.Commons;
+import fil.libre.repwifiapp.R;
+import fil.libre.repwifiapp.helpers.AccessPointInfo;
+import fil.libre.repwifiapp.helpers.NetworkButton;
+import fil.libre.repwifiapp.helpers.Utils;
+
+import android.os.Bundle;
+import android.app.Activity;
+import android.content.Intent;
+import android.view.Gravity;
+import android.view.Menu;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup.LayoutParams;
+import android.widget.Button;
+import android.widget.TableLayout;
+import android.widget.TableRow;
+import android.widget.TextView;
+
+public class SelectNetworkActivity extends Activity implements OnClickListener {
+
+ private AccessPointInfo[] aps;
+
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_select_network);
+
+ setTitle("Select network");
+
+ getNetworks();
+
+ }
+
+ @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_select_network, menu);
+ return true;
+ }
+
+ private void writeOut(String msg) {
+
+ TextView v = (TextView)findViewById(R.id.txt_selnets);
+ v.setText(msg);
+
+ }
+
+ private void getNetworks(){
+
+ Intent intent = getIntent();
+ if(! intent.hasExtra(Commons.EXTRA_APINFO_ARR)){
+ this.setResult(RESULT_CANCELED);
+ finish();
+ return;
+ }
+ AccessPointInfo[] nets = (AccessPointInfo[])intent.getExtras().getSerializable(Commons.EXTRA_APINFO_ARR);
+ if (nets == null){
+ this.setResult(RESULT_CANCELED);
+ finish();
+ return;
+ }
+
+ int reqCode = intent.getExtras().getInt(Commons.EXTRA_REQCODE);
+
+ this.aps = nets;
+
+ if (reqCode == Commons.RequestCode.SELECT_CONN){
+ showNetworksForConnection(nets);
+ }
+ else{
+ showNetworksForManagement(nets);
+ }
+
+ }
+
+ public void btnScanClick(View v){
+ returnResults(null, true);
+ }
+
+ @Override
+ public void onClick(View v) {
+
+ if (v instanceof NetworkButton){
+ networkNameClick((NetworkButton)v);
+ }
+
+ }
+
+ public void networkNameClick(NetworkButton b){
+
+ for(AccessPointInfo i : this.aps){
+
+ if (i.getBSSID().equals(b.getNetworkBSSID())){
+
+ returnResults(i,false);
+
+ }
+
+ }
+ }
+
+ private void returnResults(AccessPointInfo i, boolean rescan){
+
+ Intent intent = new Intent();
+ intent.putExtra(Commons.EXTRA_APINFO, i);
+ intent.putExtra(Commons.EXTRA_RESCAN, rescan);
+ setResult(RESULT_OK, intent);
+ finish();
+
+ }
+
+ private void showNetworksForConnection(AccessPointInfo[] info) {
+
+ if (info == null){
+ Utils.logError("Unable to retrieve network list!");
+ writeOut("Unable to retrieve network list!");
+ return;
+ }
+
+ if (info.length == 0){
+ writeOut("No network found.");
+ toggleBtnRescan(true);
+ return;
+ }
+
+ writeOut("Select the network you want to connect to:");
+ toggleBtnRescan(false);
+
+ for (AccessPointInfo i : info){
+
+ addButtonForNetwork(i);
+
+ }
+
+ }
+
+ private void showNetworksForManagement(AccessPointInfo[] info){
+
+ if (info == null || info.length == 0){
+ return;
+ }
+
+ writeOut("Select network info to manage:");
+ toggleBtnRescan(false);
+
+ for (AccessPointInfo i : info){
+
+ addButtonForNetwork(i);
+
+ }
+
+ }
+
+ private void toggleBtnRescan(boolean enable) {
+
+ Button b = (Button)findViewById(R.id.btn_rescan);
+ if (enable){
+ b.setVisibility(View.VISIBLE);
+ }
+ else{
+ b.setVisibility(View.INVISIBLE);
+ }
+ }
+
+ private void addButtonForNetwork(AccessPointInfo info){
+
+ TableLayout s = (TableLayout)findViewById(R.id.table_networks);
+ TableLayout.LayoutParams tableParams = new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.WRAP_CONTENT);
+ TableRow row = new TableRow(this);
+ TableRow.LayoutParams rowParams = new TableRow.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
+ rowParams.gravity = Gravity.FILL_HORIZONTAL;
+ row.setPadding(10, 10, 10, 10);
+ row.setLayoutParams(rowParams);
+ row.setGravity(Gravity.FILL_HORIZONTAL);
+ row.setLayoutParams(rowParams);
+
+ NetworkButton button = new NetworkButton(this, info.getBSSID());
+
+ TableRow.LayoutParams params = new TableRow.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
+ button.setLayoutParams(params);
+ button.setBackgroundColor(Commons.colorThemeDark);
+ button.setTextColor(Commons.colorThemeLight);
+ button.setTextSize(20);
+ button.setPadding(10, 10, 10, 10);
+ button.setGravity(Gravity.CENTER_HORIZONTAL);
+ button.setText(info.getSSID());
+ button.setOnClickListener(this);
+
+ row.addView(button,params);
+ s.addView(row,tableParams);
+ s.setGravity(Gravity.FILL_HORIZONTAL);
+
+ }
+
+}
diff --git a/project/src/fil/libre/repwifiapp/activities/ShowStatusActivity.java b/project/src/fil/libre/repwifiapp/activities/ShowStatusActivity.java
new file mode 100644
index 0000000..2674737
--- /dev/null
+++ b/project/src/fil/libre/repwifiapp/activities/ShowStatusActivity.java
@@ -0,0 +1,131 @@
+//
+// Copyright 2017 Filippo "Fil" Bergamo <fil.bergamo@riseup.net>
+//
+// This file is part of RepWifiApp.
+//
+// RepWifiApp is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// RepWifiApp is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with RepWifiApp. If not, see <http://www.gnu.org/licenses/>.
+//
+// ********************************************************************
+
+
+
+package fil.libre.repwifiapp.activities;
+
+
+import fil.libre.repwifiapp.Commons;
+import fil.libre.repwifiapp.R;
+import fil.libre.repwifiapp.helpers.ConnectionStatus;
+import fil.libre.repwifiapp.helpers.Utils;
+
+import android.os.Bundle;
+import android.app.Activity;
+import android.view.Menu;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+import android.widget.Toast;
+
+public class ShowStatusActivity extends Activity {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_show_status);
+ showStatus();
+
+ }
+
+ @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_show_status, menu);
+ return true;
+ }
+
+ @Override
+ public void onRestart(){
+ super.onRestart();
+ showStatus();
+ }
+
+ private void setMessage(String msg){
+ TextView view = (TextView)findViewById(R.id.txt_status);
+ view.setText(msg);
+ }
+
+ private void showStatus(){
+
+ ConnectionStatus status = Commons.connectionEngine.getConnectionStatus();
+ if (status == null){
+ this.finish();
+
+ }else if (status.isConnected()){
+ Utils.logDebug("StatusActivity isConnected,showing buttons");
+ setMessage("Connected to " + status.SSID + "\n\n" + "IP Address: " + status.IP + "\n");
+ toggleBtnDisconnect(true);
+
+
+ }else{
+ Utils.logDebug("StatusActivity status Else");
+ setMessage("Status:\n" + status.status);
+ toggleBtnDisconnect(false);
+
+ }
+ }
+
+ private void toggleBtnDisconnect(boolean enable){
+
+ Button b = (Button)findViewById(R.id.btn_disconnect);
+ Button bk = (Button)findViewById(R.id.btn_back);
+ b.setEnabled(enable);
+ bk.setEnabled(! enable);
+
+ if (enable){
+ b.setVisibility(View.VISIBLE);
+ bk.setVisibility(View.INVISIBLE);
+ }else{
+ b.setVisibility(View.INVISIBLE);
+ bk.setVisibility(View.VISIBLE);
+ }
+
+ }
+
+ public void onBtnDisconnectClick(View v){
+
+ boolean res = Commons.connectionEngine.disconnect();
+ String msg = "";
+ if (res){
+ msg = "Disconnected.";
+ }
+ else{
+ msg = "FAILED to disconnect!";
+ }
+
+ Toast toast = Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT);
+ toast.show();
+
+ showStatus();
+
+ }
+
+ public void onBtnMainClick(View v){
+ finish();
+ }
+
+ @Override
+ public void onBackPressed() {
+ moveTaskToBack(true);
+ }
+
+}