flashwifi/app/src/main/java/com/flashwifi/wifip2p/MainActivity.java
2018-01-26 04:24:23 +01:00

548 lines
19 KiB
Java

package com.flashwifi.wifip2p;
import android.app.ActivityManager;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.net.wifi.p2p.WifiP2pManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.preference.PreferenceManager;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.flashwifi.wifip2p.billing.Accountant;
import com.flashwifi.wifip2p.broadcast.WiFiDirectBroadcastService;
import com.flashwifi.wifip2p.iotaAPI.Requests.WalletBalanceChecker;
import com.flashwifi.wifip2p.iotaFlashWrapper.Helpers;
import java.io.IOException;
import java.io.InputStream;
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener
{
private static final String TAG = "MainAct";
private String password;
private String seed;
private static final int PREF_UPDATE = 2;
private static final int BALANCE_RETRIEVE_TASK_COMPLETE = 1;
private Handler balanceHandler;
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private WiFiDirectBroadcastService mService;
private boolean mBound;
boolean doubleBackToExitPressedOnce = false;
BroadcastReceiver updateUIReceiver;
private boolean startHotspotFragmentAfterwards = false;
private boolean startSearchFragmentAfterwards = false;
private void subscribeToBroadcasts() {
IntentFilter filter = new IntentFilter();
filter.addAction("com.flashwifi.wifip2p.start_roaming");
filter.addAction("com.flashwifi.wifip2p.stop_roaming");
updateUIReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
try {
// hide progress bar
ProgressBar progressConnection = (ProgressBar) findViewById(R.id.progressConnection);
progressConnection.setVisibility(View.VISIBLE);
} catch (Exception e) {
}
if (intent.getAction().equals("com.flashwifi.wifip2p.start_roaming")) {
/*startRoamingView(intent.getStringExtra("peer_mac_address"),
intent.getStringExtra("ssid"),
intent.getStringExtra("key"));*/
} else if (intent.getAction().equals("com.flashwifi.wifip2p.stop_roaming")) {
Log.d(TAG, "onReceive: Reset billing state");
}
}
};
registerReceiver(updateUIReceiver, filter);
}
public boolean isTheServiceRunning() {
return isMyServiceRunning(WiFiDirectBroadcastService.class);
}
private boolean isMyServiceRunning(Class<?> serviceClass) {
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(service.service.getClassName())) {
return true;
}
}
return false;
}
@Override
protected void onPause() {
unbindWifiBroadcast();
unsubscribeFromBroadcast();
super.onPause();
}
@Override
protected void onDestroy() {
// ToDo: remove intent receivers of
super.onDestroy();
}
private void unbindWifiBroadcast() {
try {
unregisterReceiver(updateUIReceiver);
unbindService(mConnection);
mBound = false;
}
catch(IllegalArgumentException e) {
}
}
@Override
protected void onResume() {
super.onResume();
initEverything();
}
private void unsubscribeFromBroadcast() {
try {
unregisterReceiver(updateUIReceiver);
updateUIReceiver = null;
} catch (Exception e){
}
}
private void initUi() {
}
private String readFile(String name) {
InputStream ins = getResources().openRawResource(
getResources().getIdentifier(name,
"raw", getPackageName()));
try {
return Helpers.convertStreamToString(ins);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// get the secrets from the login screen
Intent intent = getIntent();
password = intent.getStringExtra("password");
seed = intent.getStringExtra("seed");
/*
// iotalibflash
String iotaflash = readFile("iotaflash");
String iotaflashhelper = readFile("iotaflashhelper");
try {
IotaFlashBridge.boot(iotaflash, iotaflashhelper);
Example.setup();
Example.transaction(Example.one, Example.two);
Example.transaction(Example.two, Example.one);
Example.transaction(Example.one, Example.two);
Example.transaction(Example.one, Example.two);
Example.close(Example.one, Example.two);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}*/
setBalanceHandler();
Accountant.getInstance().setSeed(seed);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
beginForegroundService();
Intent intent2 = new Intent(this, WiFiDirectBroadcastService.class);
bindService(intent2, mConnection, Context.BIND_AUTO_CREATE);
if (intent.getAction() != null) {
if (intent.getAction().equals(Constants.ACTION.HOTSPOT)) {
startHotspotFragmentAfterwards = true;
} else if (intent.getAction().equals(Constants.ACTION.SEARCH)) {
startSearchFragmentAfterwards = true;
} else {
Log.d(TAG, "onCreate: UNKWNOWN ACTION FOR MAIN");
}
} else {
// INITIAL CREATION OF ACTIVITY
updateBalance();
startStartFragment();
}
}
public WiFiDirectBroadcastService getmService() {
if (mBound) {
return mService;
}
return null;
}
private void beginForegroundService() {
if (!isTheServiceRunning()) {
Log.d(TAG, "beginForegroundService: The foreground service was not running");
Intent startIntent = new Intent(MainActivity.this, WiFiDirectBroadcastService.class);
startIntent.setAction(Constants.ACTION.STARTFOREGROUND_ACTION);
startIntent.putExtra("seed", seed);
startIntent.putExtra("password", password);
startService(startIntent);
} else {
Log.d(TAG, "beginForegroundService: Service is already running");
}
}
private void initEverything() {
subscribeToBroadcasts();
initUi();
}
@Override
protected void onStop() {
unbindWifiBroadcast();
unsubscribeFromBroadcast();
super.onStop();
}
public MenuItem getMenuItem(int i) {
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
Menu menu = navigationView.getMenu();
MenuItem item = menu.getItem(i);
item.setChecked(true);
return item;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
//getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_search) {
// Handle the camera action
return startSearchFragment();
} else if (id == R.id.nav_start) {
return startHotspotFragment();
// } else if (id == R.id.nav_itp) {
//
} else if (id == R.id.nav_fund) {
startFundWalletFragment();
} else if (id == R.id.nav_withdraw) {
startWithdrawWalletFragment();
// } else if (id == R.id.nav_conditions) {
} else if (id == R.id.nav_settings) {
startSettingsFragment();
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
private boolean settingsAreReady(){
// check whether all necessary settings were set by the user
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
String[] intVariables = new String[]{
"edit_text_sell_min_minutes",
"edit_text_sell_price",
"edit_text_sell_max_minutes",
"edit_text_buy_price",
"edit_text_client_minutes"
};
String val;
for (String variable: intVariables) {
val = prefs.getString(variable, null);
if (val == null) {
Log.d("Variable not set: ", "settingsAreReady: " + variable);
return false;
}
}
return true;
}
private void updateBalance() {
WalletBalanceChecker balanceChecker = new WalletBalanceChecker(this,this.getString(R.string.preference_file_key), seed, balanceHandler,PREF_UPDATE,true);
balanceChecker.execute();
}
public void startStartFragment() {
Fragment fragment = new StartFragment();
// Insert the fragment by replacing any existing fragment
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment)
.commit();
}
public boolean startSearchFragment() {
if (mBound && mService.isInRoleHotspot()) {
Toast.makeText(this, "Can't start search because you are hotspot", Toast.LENGTH_SHORT).show();
return false;
} else if (!settingsAreReady()) {
Toast.makeText(this, "Navigate to settings and assign all variables", Toast.LENGTH_SHORT).show();
return false;
} else {
Fragment fragment = new SearchFragment();
// Insert the fragment by replacing any existing fragment
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment)
.commit();
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
}
private void startRoamingView(String macAddress, String ssid, String key){
// disable WiFi P2P
if (mBound) {
mService.stopDiscovery(new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
Log.d("MainAct", "discovery stopped");
}
@Override
public void onFailure(int i) {
Log.d("MainAct", "discovery could not be stopped");
}
});
}
}
public boolean startHotspotFragment() {
if (mBound && mService.isInRoleConsumer()) {
Toast.makeText(this, "Can't start hotspot because you are searching", Toast.LENGTH_SHORT).show();
return false;
} else if (!settingsAreReady()) {
Toast.makeText(this, "Navigate to settings and assign all variables", Toast.LENGTH_SHORT).show();
return false;
} else {
Fragment fragment = new HotspotFragment();
Bundle args = new Bundle();
// Insert the fragment by replacing any existing fragment
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment)
.commit();
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
}
public void startFundWalletFragment() {
Fragment fragment = new FundWalletFragment();
Bundle bundle = new Bundle();
bundle.putString("seed", seed);
fragment.setArguments(bundle);
fragment.setRetainInstance(true);
if (mBound) {
mService.changeApplicationState(WiFiDirectBroadcastService.State.FUND_WALLET);
}
// Insert the fragment by replacing any existing fragment
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment)
.commit();
}
private void startWithdrawWalletFragment() {
Fragment fragment = new WithdrawWalletFragment();
Bundle bundle = new Bundle();
bundle.putString("seed", seed);
fragment.setArguments(bundle);
fragment.setRetainInstance(true);
if (mBound) {
mService.changeApplicationState(WiFiDirectBroadcastService.State.WITHDRAW_WALLET);
}
// Insert the fragment by replacing any existing fragment
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment)
.commit();
}
private void startSettingsFragment() {
Fragment fragment = new SettingsFragment();
Bundle bundle = new Bundle();
bundle.putString("seed", seed);
fragment.setArguments(bundle);
fragment.setRetainInstance(true);
if (mBound) {
mService.changeApplicationState(WiFiDirectBroadcastService.State.SETTINGS);
}
// Insert the fragment by replacing any existing fragment
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment)
.commit();
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
if (doubleBackToExitPressedOnce) {
super.onBackPressed();
return;
}
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, "Please click BACK again to exit", Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
doubleBackToExitPressedOnce=false;
}
}, 2000);
}
}
/** Defines callbacks for service binding, passed to bindService() */
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className,
IBinder service) {
// We've bound to LocalService, cast the IBinder and get LocalService instance
WiFiDirectBroadcastService.LocalBinder binder = (WiFiDirectBroadcastService.LocalBinder) service;
mService = binder.getService();
mBound = true;
mService.enableService();
if (startHotspotFragmentAfterwards) {
startHotspotFragmentAfterwards = false;
startHotspotFragment();
} else if (startSearchFragmentAfterwards) {
startSearchFragmentAfterwards = false;
startSearchFragment();
}
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
mBound = false;
}
};
private void setBalanceHandler() {
//Handle post-asynctask activities
balanceHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message inputMessage) {
switch (inputMessage.what) {
case BALANCE_RETRIEVE_TASK_COMPLETE:
AddressBalanceTransfer addressBalanceTransfer = (AddressBalanceTransfer) inputMessage.obj;
String returnStatus = addressBalanceTransfer.getMessage();
if (returnStatus.equals("noError")) {
makeToastBalance("Balance updated");
} else if (returnStatus.equals("hostError")) {
makeToastBalance("Unable to reach host (node)");
} else if (returnStatus.equals("addressError")) {
makeToastBalance("Error getting address");
} else if (returnStatus.equals("balanceError")) {
makeToastBalance("Error getting balance. May not be able to resolve host/node");
} else {
makeToastBalance("Unknown error");
}
}
}
};
}
private void makeToastBalance(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
}