From 380716f7ead9190088ef38073476b146d97ab693 Mon Sep 17 00:00:00 2001 From: Tanguy Herbron Date: Wed, 1 Aug 2018 01:02:41 +0200 Subject: [PATCH] Exchange config rework - Fix crash when binance sync error - New exchange list UI - New exchange configuration UI - Fix gradient background for Settings activity The new exchange configuration interface allows you to add (it should work) multiple accounts for each exchange If an account's keys are incorrect, the account and disabled and it's notified in the exchange list You can edit the exchange account later from the exchange list activity --- .idea/assetWizardSettings.xml | 10 +- .idea/caches/build_file_checksums.ser | Bin 545 -> 545 bytes app/build.gradle | 8 +- app/src/main/AndroidManifest.xml | 8 +- .../moodl/Activities/AddExchangeActivity.java | 173 ++++++++++++++++++ .../Transactions.java | 6 +- .../Activities/ExchangeListActivity.java | 21 ++- .../HomeActivityFragments/Summary.java | 7 +- .../moodl/Activities/SettingsActivity.java | 6 + .../moodl/DataManagers/BalanceManager.java | 18 +- .../moodl/DataManagers/DatabaseManager.java | 108 ++++++++++- .../ExchangeManager/BinanceManager.java | 12 +- .../ExchangeManager/Exchange.java | 29 ++- .../ExchangeManager/HitBtcManager.java | 11 +- .../LayoutManagers/CurrencyListAdapter.java | 2 +- .../LayoutManagers/ExchangeListAdapter.java | 32 ++++ .../main/res/drawable/ic_add_white_24dp.xml | 5 + .../ic_arrow_drop_down_white_24dp.xml | 5 + .../main/res/drawable/ic_money_off_24dp.xml | 5 + .../main/res/drawable/spinner_background.xml | 21 +++ .../main/res/layout/activity_add_exchange.xml | 74 ++++++++ .../layout/binance_exchange_setup_layout.xml | 93 ++++++++++ app/src/main/res/layout/cardview_currency.xml | 18 +- .../main/res/layout/cardview_watchlist.xml | 12 +- app/src/main/res/layout/exchange_cell.xml | 119 +++++++++--- .../main/res/layout/exchange_spinner_item.xml | 9 + .../layout/hitbtc_exchange_setup_layout.xml | 93 ++++++++++ app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values/arrays.xml | 7 + app/src/main/res/values/colors.xml | 5 +- app/src/main/res/values/dimens.xml | 5 +- app/src/main/res/values/strings.xml | 7 + app/src/main/res/values/styles.xml | 2 +- 33 files changed, 834 insertions(+), 98 deletions(-) create mode 100644 app/src/main/java/com/herbron/moodl/Activities/AddExchangeActivity.java create mode 100644 app/src/main/res/drawable/ic_add_white_24dp.xml create mode 100644 app/src/main/res/drawable/ic_arrow_drop_down_white_24dp.xml create mode 100644 app/src/main/res/drawable/ic_money_off_24dp.xml create mode 100644 app/src/main/res/drawable/spinner_background.xml create mode 100644 app/src/main/res/layout/activity_add_exchange.xml create mode 100644 app/src/main/res/layout/binance_exchange_setup_layout.xml create mode 100644 app/src/main/res/layout/exchange_spinner_item.xml create mode 100644 app/src/main/res/layout/hitbtc_exchange_setup_layout.xml create mode 100644 app/src/main/res/values/arrays.xml diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml index ae12ad6..0e83d31 100644 --- a/.idea/assetWizardSettings.xml +++ b/.idea/assetWizardSettings.xml @@ -3,6 +3,11 @@ diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index b761e370049dffc332bab16b6be4318abdfc2347..9c090e5037b5e0263a349d1ec3d92be60f542163 100644 GIT binary patch delta 35 tcmV+;0Nnqf1fc|wm;~`0sPK`TcM!o;C*mGwBOQ>fj$iFGach$!0sa?U503x< delta 35 tcmV+;0Nnqf1fc|wm;~*^Pfn4XcMyGc@sJezHAkSxB5o2WWu}uO0sa`e4`~1Z diff --git a/app/build.gradle b/app/build.gradle index 4c54bf0..f848c74 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,6 +12,10 @@ android { vectorDrawables.useSupportLibrary = true } + aaptOptions { + additionalParameters "--no-version-vectors" + } + dataBinding { enabled = true } @@ -34,12 +38,12 @@ android { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:27.1.1' + implementation 'com.android.support:support-v4:27.1.1' implementation 'com.android.support:design:27.1.1' implementation 'com.android.support:cardview-v7:27.1.1' implementation 'com.mcxiaoke.volley:library:1.0.19' implementation 'com.diogobernardino:williamchart:2.5.0' implementation 'com.android.support.constraint:constraint-layout:1.1.2' - implementation 'com.android.support:support-v4:27.1.1' implementation 'com.android.support:palette-v7:27.1.1' implementation 'com.daimajia.swipelayout:library:1.2.0@aar' implementation 'com.fasterxml.jackson.core:jackson-databind:2.8.5' @@ -61,5 +65,5 @@ dependencies { androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' implementation files('../libs/binance-api.jar') - implementation files('../libs/commons-codec-1.11.jar'); + implementation files('../libs/commons-codec-1.11.jar') } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1b4bdb1..4620055 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -43,7 +43,7 @@ + android:theme="@style/InputActivityTheme"> @@ -56,6 +56,12 @@ android:name="android.support.PARENT_ACTIVITY" android:value="com.herbron.moodl.Activities.HomeActivity" /> + + \ No newline at end of file diff --git a/app/src/main/java/com/herbron/moodl/Activities/AddExchangeActivity.java b/app/src/main/java/com/herbron/moodl/Activities/AddExchangeActivity.java new file mode 100644 index 0000000..5dca0ed --- /dev/null +++ b/app/src/main/java/com/herbron/moodl/Activities/AddExchangeActivity.java @@ -0,0 +1,173 @@ +package com.herbron.moodl.Activities; + +import android.content.Intent; +import android.support.design.widget.TextInputEditText; +import android.support.design.widget.TextInputLayout; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.support.v7.widget.AppCompatButton; +import android.support.v7.widget.Toolbar; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ImageButton; +import android.widget.LinearLayout; +import android.widget.Spinner; + +import com.herbron.moodl.DataManagers.DatabaseManager; +import com.herbron.moodl.DataManagers.ExchangeManager.Exchange; +import com.herbron.moodl.R; + +public class AddExchangeActivity extends AppCompatActivity { + + private LinearLayout setupExchangeLayout; + private Spinner exchangeSpinner; + private DatabaseManager databaseManager; + + private TextInputEditText accountLabelEditText; + private TextInputEditText accountDescriptionEditText; + private TextInputEditText publicKeyEditText; + private TextInputEditText secretKeyEditText; + private AppCompatButton saveExchangeButton; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_add_exchange); + getApplicationContext().setTheme(R.style.InputActivityTheme); + + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + databaseManager = new DatabaseManager(getBaseContext()); + + exchangeSpinner = findViewById(R.id.exchange_spinner); + + ArrayAdapter adapter = ArrayAdapter.createFromResource(this, + R.array.supported_exchanges, R.layout.exchange_spinner_item); + + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + + setupExchangeLayout = findViewById(R.id.exchange_setup_layout); + + exchangeSpinner.setAdapter(adapter); + + Intent callingIntent = getIntent(); + + if(callingIntent.getBooleanExtra("isEdit", false)) + { + startExchangeEditionForId(callingIntent.getIntExtra("exchangeId", -1)); + } + else + { + exchangeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + loadLayoutFor(position); + } + + @Override + public void onNothingSelected(AdapterView parent) { + + } + }); + } + + setupBackButton(); + } + + private void loadLayoutFor(int exchangeType) + { + setupExchangeLayout.removeAllViews(); + + switch (exchangeType) + { + case DatabaseManager.BINANCE_TYPE: + setupExchangeLayout = (LinearLayout) LayoutInflater.from(getApplicationContext()).inflate(R.layout.binance_exchange_setup_layout, setupExchangeLayout, true); + + bindSetupViews(); + break; + case DatabaseManager.HITBTC_TYPE: + setupExchangeLayout = (LinearLayout) LayoutInflater.from(getApplicationContext()).inflate(R.layout.hitbtc_exchange_setup_layout, setupExchangeLayout, true); + + bindSetupViews(); + break; + } + } + + private void startExchangeEditionForId(int exchangeId) + { + Exchange exchangeInfos = databaseManager.getExchangeFromId(exchangeId); + + loadLayoutFor(exchangeInfos.getType()); + + exchangeSpinner.setEnabled(false); + + accountLabelEditText.setText(exchangeInfos.getName()); + accountDescriptionEditText.setText(exchangeInfos.getDescription()); + publicKeyEditText.setText(exchangeInfos.getPublicKey()); + secretKeyEditText.setText(exchangeInfos.getPrivateKey()); + + saveExchangeButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(isEditTextFilled(accountLabelEditText) && isEditTextFilled(publicKeyEditText) && isEditTextFilled(secretKeyEditText)) + { + databaseManager.deleteExchangeAccountFromId(exchangeInfos.getId()); + databaseManager.addExchange(accountLabelEditText.getText().toString(), exchangeSpinner.getSelectedItemPosition() + , accountDescriptionEditText.getText().toString(), publicKeyEditText.getText().toString() + , secretKeyEditText.getText().toString()); + finish(); + } + } + }); + } + + private void bindSetupViews() + { + accountLabelEditText = findViewById(R.id.account_label_editText); + accountDescriptionEditText = findViewById(R.id.account_description_editText); + publicKeyEditText = findViewById(R.id.publicKey_editText); + secretKeyEditText = findViewById(R.id.secretKey_editText); + + saveExchangeButton = findViewById(R.id.saveExchangeButton); + + saveExchangeButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(isEditTextFilled(accountLabelEditText) && isEditTextFilled(publicKeyEditText) && isEditTextFilled(secretKeyEditText)) + { + databaseManager.addExchange(accountLabelEditText.getText().toString(), exchangeSpinner.getSelectedItemPosition() + , accountDescriptionEditText.getText().toString(), publicKeyEditText.getText().toString() + , secretKeyEditText.getText().toString()); + + finish(); + } + } + }); + } + + private boolean isEditTextFilled(TextInputEditText editText) + { + if(editText.getText().toString().equals("") || editText.getText().toString().equals(" ")) + { + editText.setError(getResources().getString(R.string.must_be_filled)); + + return false; + } + + return true; + } + + private void setupBackButton() + { + ImageButton backButton = findViewById(R.id.back_button); + backButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } +} diff --git a/app/src/main/java/com/herbron/moodl/Activities/DetailsActivityFragments/Transactions.java b/app/src/main/java/com/herbron/moodl/Activities/DetailsActivityFragments/Transactions.java index 4ab12ad..7798cf2 100644 --- a/app/src/main/java/com/herbron/moodl/Activities/DetailsActivityFragments/Transactions.java +++ b/app/src/main/java/com/herbron/moodl/Activities/DetailsActivityFragments/Transactions.java @@ -54,7 +54,7 @@ public class Transactions extends Fragment { currency = getActivity().getIntent().getParcelableExtra("currency"); databaseManager = new DatabaseManager(getContext()); - binanceManager = new BinanceManager(preferencesManager.getBinancePublicKey(), preferencesManager.getBinancePrivateKey()); + //binanceManager = new BinanceManager(preferencesManager.getBinancePublicKey(), preferencesManager.getBinancePrivateKey()); tradeLayout = view.findViewById(R.id.listTrades); transactionLayout = view.findViewById(R.id.listTransactions); @@ -63,8 +63,8 @@ public class Transactions extends Fragment { TransactionUpdater transactionUpdater = new TransactionUpdater(); transactionUpdater.execute(); - TradeUpdater updater = new TradeUpdater(); - updater.execute(); + /*TradeUpdater updater = new TradeUpdater(); + updater.execute();*/ return view; } diff --git a/app/src/main/java/com/herbron/moodl/Activities/ExchangeListActivity.java b/app/src/main/java/com/herbron/moodl/Activities/ExchangeListActivity.java index 053a6f6..df06da0 100644 --- a/app/src/main/java/com/herbron/moodl/Activities/ExchangeListActivity.java +++ b/app/src/main/java/com/herbron/moodl/Activities/ExchangeListActivity.java @@ -1,5 +1,6 @@ package com.herbron.moodl.Activities; +import android.content.Intent; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; @@ -24,6 +25,7 @@ public class ExchangeListActivity extends AppCompatActivity { private DatabaseManager databaseManager; private ListView exchangeListView; + private ExchangeListAdapter exchangeListAdapter; @Override protected void onCreate(Bundle savedInstanceState) { @@ -37,11 +39,7 @@ public class ExchangeListActivity extends AppCompatActivity { databaseManager = new DatabaseManager(this); - ArrayList exchangeList = new ArrayList<>(); - exchangeList.add(new Exchange(0, "Main account", BINANCE_TYPE, "Account with main balance & trading bot", "0000", "0000")); - exchangeList.add(new Exchange(1, "Hit account", HITBTC_TYPE, "BCN account and HIT", "0001", "0001")); - - ExchangeListAdapter exchangeListAdapter = new ExchangeListAdapter(getApplicationContext(), exchangeList); + exchangeListAdapter = new ExchangeListAdapter(getApplicationContext(), databaseManager.getExchanges()); exchangeListView = findViewById(R.id.exchange_listView); exchangeListView.setAdapter(exchangeListAdapter); @@ -50,12 +48,21 @@ public class ExchangeListActivity extends AppCompatActivity { fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) - .setAction("Action", null).show(); + Intent intent = new Intent(ExchangeListActivity.this, AddExchangeActivity.class); + startActivity(intent); } }); } + @Override + protected void onResume() { + super.onResume(); + + exchangeListAdapter.clear(); + exchangeListAdapter.addAll(databaseManager.getExchanges()); + exchangeListAdapter.notifyDataSetChanged(); + } + @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); diff --git a/app/src/main/java/com/herbron/moodl/Activities/HomeActivityFragments/Summary.java b/app/src/main/java/com/herbron/moodl/Activities/HomeActivityFragments/Summary.java index 29ec6be..98b08f9 100644 --- a/app/src/main/java/com/herbron/moodl/Activities/HomeActivityFragments/Summary.java +++ b/app/src/main/java/com/herbron/moodl/Activities/HomeActivityFragments/Summary.java @@ -585,7 +585,12 @@ public class Summary extends Fragment implements BalanceSwitchManagerInterface, @Override public void onBalanceError(String error) { - generateSnackBarError(error); + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + generateSnackBarError(error); + } + }); } private void generateSnackBarError(String error) diff --git a/app/src/main/java/com/herbron/moodl/Activities/SettingsActivity.java b/app/src/main/java/com/herbron/moodl/Activities/SettingsActivity.java index da88323..84c2a64 100644 --- a/app/src/main/java/com/herbron/moodl/Activities/SettingsActivity.java +++ b/app/src/main/java/com/herbron/moodl/Activities/SettingsActivity.java @@ -10,6 +10,8 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; import android.hardware.fingerprint.FingerprintManager; import android.os.Build; import android.os.Bundle; @@ -179,6 +181,10 @@ public class SettingsActivity extends AppCompatPreferenceActivity { // Show the Up button in the action bar. actionBar.setDisplayHomeAsUpEnabled(true); } + + Drawable gradientDrawable = getResources().getDrawable(R.drawable.gradient_background); + + actionBar.setBackgroundDrawable(gradientDrawable); } /** diff --git a/app/src/main/java/com/herbron/moodl/DataManagers/BalanceManager.java b/app/src/main/java/com/herbron/moodl/DataManagers/BalanceManager.java index 2d5018d..7e1cf05 100644 --- a/app/src/main/java/com/herbron/moodl/DataManagers/BalanceManager.java +++ b/app/src/main/java/com/herbron/moodl/DataManagers/BalanceManager.java @@ -26,14 +26,6 @@ import java.util.List; public class BalanceManager { - private String publicHitKey; - private String publicBinanceKey; - private String publicPoloniex; - private String privateHitKey; - private String privateBinanceKey; - private String privatePoloniex; - final private String hitBalanceUrl = "https://api.hitbtc.com/api/2/trading/balance"; - final private String detailUrl = "https://www.cryptocompare.com/api/data/coinlist/"; private RequestQueue requestQueue; private List binanceBalance; private List hitBalance; @@ -103,6 +95,8 @@ public class BalanceManager { binanceManagers.clear(); binanceManagers = databaseManager.getBinanceAccounts(); + + Log.d("moodl", "Number of binance accounts " + binanceManagers.size()); } public List getTotalBalance() @@ -113,6 +107,8 @@ public class BalanceManager { public void updateTotalBalance() { boolean isUpdated = false; + + updateExchangeKeys(); balanceCounter = 0; @@ -124,6 +120,7 @@ public class BalanceManager { for(int i = 0; i < binanceManagers.size(); i++) { + final int index = i; binanceManagers.get(i).updateBalance(new BinanceManager.BinanceCallBack() { @Override public void onSuccess() { @@ -132,6 +129,7 @@ public class BalanceManager { @Override public void onError(String error) { + databaseManager.disableExchangeAccount(binanceManagers.get(index).getId()); dataNotifierInterface.onBalanceError(error); } }); @@ -298,6 +296,8 @@ public class BalanceManager { currencyName = jsonObject.getString("CoinName"); } catch (JSONException e) { e.printStackTrace(); + } catch (NullPointerException e) { + currencyName = symbol; } return currencyName; @@ -312,6 +312,8 @@ public class BalanceManager { id = jsonObject.getInt("Id"); } catch (JSONException e) { e.printStackTrace(); + } catch (NullPointerException e) { + id = -1; } return id; diff --git a/app/src/main/java/com/herbron/moodl/DataManagers/DatabaseManager.java b/app/src/main/java/com/herbron/moodl/DataManagers/DatabaseManager.java index a66fddc..5fbbf2a 100644 --- a/app/src/main/java/com/herbron/moodl/DataManagers/DatabaseManager.java +++ b/app/src/main/java/com/herbron/moodl/DataManagers/DatabaseManager.java @@ -10,6 +10,7 @@ import android.util.Log; import com.herbron.moodl.DataManagers.CurrencyData.Currency; import com.herbron.moodl.DataManagers.CurrencyData.Transaction; import com.herbron.moodl.DataManagers.ExchangeManager.BinanceManager; +import com.herbron.moodl.DataManagers.ExchangeManager.Exchange; import com.herbron.moodl.DataManagers.ExchangeManager.HitBtcManager; import org.json.JSONArray; @@ -28,7 +29,7 @@ import java.util.List; public class DatabaseManager extends SQLiteOpenHelper{ - private static final int DATABASE_VERSION = 8; + private static final int DATABASE_VERSION = 10; private static final String DATABASE_NAME = "Currencies.db"; @@ -51,14 +52,15 @@ public class DatabaseManager extends SQLiteOpenHelper{ private static final String KEY_EXCHANGE_DESCRIPTION = "description"; private static final String KEY_EXCHANGE_PUBLIC_KEY = "publicKey"; private static final String KEY_EXCHANGE_SECRET_KEY = "secretKey"; + private static final String KEY_EXCHANGE_IS_ENABLED = "enabled"; private static final String KEY_WATCHLIST_ID = "idWatchlist"; private static final String KEY_WATCHLIST_SYMBOL = "symbol"; private static final String KEY_WATCHLIST_NAME = "name"; private static final String KEY_WATCHLIST_POSITION = "position"; - private static final int BINANCE_TYPE = 0; - private static final int HITBTC_TYPE = 1; + public static final int BINANCE_TYPE = 0; + public static final int HITBTC_TYPE = 1; public DatabaseManager(Context context) { @@ -81,11 +83,12 @@ public class DatabaseManager extends SQLiteOpenHelper{ db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_EXCHANGE_KEYS + "(" + KEY_EXCHANGE_ID + " INTEGER PRIMARY KEY," - + KEY_EXCHANGE_TYPE + " INTEGER," + KEY_EXCHANGE_NAME + " TEXT," + + KEY_EXCHANGE_TYPE + " INTEGER," + KEY_EXCHANGE_DESCRIPTION + " TEXT," + KEY_EXCHANGE_PUBLIC_KEY + " TEXT," - + KEY_EXCHANGE_SECRET_KEY + " TEXT" + + KEY_EXCHANGE_SECRET_KEY + " TEXT," + + KEY_EXCHANGE_IS_ENABLED + " INTEGER" + ");"); db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_WATCHLIST + "(" @@ -109,6 +112,12 @@ public class DatabaseManager extends SQLiteOpenHelper{ case 7: db.execSQL("ALTER TABLE " + TABLE_EXCHANGE_KEYS + " ADD " + KEY_EXCHANGE_TYPE + " INTEGER"); + case 8: + db.execSQL("DROP TABLE " + TABLE_EXCHANGE_KEYS); + onCreate(db); + case 9: + db.execSQL("ALTER TABLE " + TABLE_EXCHANGE_KEYS + + " ADD " + KEY_EXCHANGE_IS_ENABLED + " INTEGER"); } } @@ -151,7 +160,6 @@ public class DatabaseManager extends SQLiteOpenHelper{ cv.put(KEY_WATCHLIST_POSITION, position); db.update(TABLE_WATCHLIST, cv, KEY_WATCHLIST_SYMBOL + "='" + symbol + "'", null); - } private int getWatchlistRowCount(SQLiteDatabase db) @@ -164,6 +172,14 @@ public class DatabaseManager extends SQLiteOpenHelper{ return result.getInt(0); } + public void deleteExchangeAccountFromId(int id) + { + SQLiteDatabase db = this.getWritableDatabase(); + + db.delete(TABLE_EXCHANGE_KEYS, KEY_EXCHANGE_ID + " = " + id, null); + db.close(); + } + public void deleteCurrencyFromWatchlist(String symbol) { SQLiteDatabase db = this.getWritableDatabase(); @@ -172,6 +188,70 @@ public class DatabaseManager extends SQLiteOpenHelper{ db.close(); } + public void disableExchangeAccount(int id) + { + SQLiteDatabase db = this.getWritableDatabase(); + ContentValues cv = new ContentValues(); + + cv.put(KEY_EXCHANGE_IS_ENABLED, 0); + + db.update(TABLE_EXCHANGE_KEYS, cv, KEY_EXCHANGE_ID + "='" + id + "'", null); + } + + public Exchange getExchangeFromId(int exchangeId) + { + String selectQuerry = "SELECT * FROM " + TABLE_EXCHANGE_KEYS + " WHERE " + KEY_EXCHANGE_ID + " = " + exchangeId; + SQLiteDatabase db = this.getWritableDatabase(); + Cursor result = db.rawQuery(selectQuerry, null); + + Exchange selectedExchange = null; + + if(result.moveToFirst()) + { + selectedExchange = new Exchange(result.getInt(0), result.getString(1) + , result.getInt(2), result.getString(3) + , result.getString(4), result.getString(5) + , (result.getInt(6) == 1)); + } + + return selectedExchange; + } + + public ArrayList getExchanges() + { + String selectQuerry = "SELECT * FROM " + TABLE_EXCHANGE_KEYS; + SQLiteDatabase db = this.getWritableDatabase(); + Cursor result = db.rawQuery(selectQuerry, null); + + ArrayList exchanges = new ArrayList<>(); + + while(result.moveToNext()) + { + exchanges.add(new Exchange(result.getInt(0), result.getString(1) + , result.getInt(2), result.getString(3) + , result.getString(4), result.getString(5) + , (result.getInt(6) == 1))); + } + + return exchanges; + } + + public void addExchange(String name, int type, String description, String publicKey, String privateKey) + { + SQLiteDatabase db = this.getWritableDatabase(); + ContentValues values = new ContentValues(); + + values.put(KEY_EXCHANGE_NAME, name); + values.put(KEY_EXCHANGE_TYPE, type); + values.put(KEY_EXCHANGE_DESCRIPTION, description); + values.put(KEY_EXCHANGE_PUBLIC_KEY, publicKey); + values.put(KEY_EXCHANGE_SECRET_KEY, privateKey); + values.put(KEY_EXCHANGE_IS_ENABLED, 1); + + db.insert(TABLE_EXCHANGE_KEYS, null, values); + db.close(); + } + public JSONArray getDatabaseBackup(Context context, String table, boolean encryptData) { String selectQuerry = "SELECT * FROM " + table; @@ -346,7 +426,7 @@ public class DatabaseManager extends SQLiteOpenHelper{ public List getHitBtcAccounts(Context context) { - String searchQuerry = "SELECT * FROM " + TABLE_EXCHANGE_KEYS + " WHERE " + KEY_EXCHANGE_TYPE + "='" + HITBTC_TYPE + "'"; + String searchQuerry = "SELECT * FROM " + TABLE_EXCHANGE_KEYS + " WHERE " + KEY_EXCHANGE_TYPE + "='" + HITBTC_TYPE + "' AND " + KEY_EXCHANGE_IS_ENABLED + " = '1'"; SQLiteDatabase db = this.getWritableDatabase(); Cursor resultList = db.rawQuery(searchQuerry, null); @@ -354,7 +434,11 @@ public class DatabaseManager extends SQLiteOpenHelper{ while(resultList.moveToNext()) { - accountList.add(new HitBtcManager(context, resultList.getString(4), resultList.getString(5))); + Exchange exchange = new Exchange(resultList.getInt(0), resultList.getString(1) + , resultList.getInt(2), resultList.getString(3) + , resultList.getString(4), resultList.getString(5) + , (resultList.getInt(6) == 1)); + accountList.add(new HitBtcManager(context, exchange)); } resultList.close(); @@ -365,7 +449,7 @@ public class DatabaseManager extends SQLiteOpenHelper{ public List getBinanceAccounts() { - String searchQuerry = "SELECT * FROM " + TABLE_EXCHANGE_KEYS + " WHERE " + KEY_EXCHANGE_TYPE + "='" + BINANCE_TYPE + "'"; + String searchQuerry = "SELECT * FROM " + TABLE_EXCHANGE_KEYS + " WHERE " + KEY_EXCHANGE_TYPE + "='" + BINANCE_TYPE + "' AND " + KEY_EXCHANGE_IS_ENABLED + " = '1'"; SQLiteDatabase db = this.getWritableDatabase(); Cursor resultList = db.rawQuery(searchQuerry, null); @@ -373,7 +457,11 @@ public class DatabaseManager extends SQLiteOpenHelper{ while(resultList.moveToNext()) { - accountList.add(new BinanceManager(resultList.getString(4), resultList.getString(5))); + Exchange exchange = new Exchange(resultList.getInt(0), resultList.getString(1) + , resultList.getInt(2), resultList.getString(3) + , resultList.getString(4), resultList.getString(5) + , (resultList.getInt(6) == 1)); + accountList.add(new BinanceManager(exchange)); } resultList.close(); diff --git a/app/src/main/java/com/herbron/moodl/DataManagers/ExchangeManager/BinanceManager.java b/app/src/main/java/com/herbron/moodl/DataManagers/ExchangeManager/BinanceManager.java index 3007b2d..3b9a747 100644 --- a/app/src/main/java/com/herbron/moodl/DataManagers/ExchangeManager/BinanceManager.java +++ b/app/src/main/java/com/herbron/moodl/DataManagers/ExchangeManager/BinanceManager.java @@ -17,19 +17,15 @@ import java.util.List; * Created by Guitoune on 26/02/2018. */ -public class BinanceManager { - - private String publicKey; - private String privateKey; +public class BinanceManager extends Exchange { private List balance; private ArrayList trades; - private List pairSymbolList; + private static List pairSymbolList; - public BinanceManager(String publicKey, String privateKey) + public BinanceManager(Exchange exchange) { - this.publicKey = publicKey; - this.privateKey = privateKey; + super(exchange.id, exchange.name, exchange.type, exchange.description, exchange.publicKey, exchange.privateKey, exchange.isEnabled); createPairSymbolList(); } diff --git a/app/src/main/java/com/herbron/moodl/DataManagers/ExchangeManager/Exchange.java b/app/src/main/java/com/herbron/moodl/DataManagers/ExchangeManager/Exchange.java index 173a316..338c244 100644 --- a/app/src/main/java/com/herbron/moodl/DataManagers/ExchangeManager/Exchange.java +++ b/app/src/main/java/com/herbron/moodl/DataManagers/ExchangeManager/Exchange.java @@ -8,8 +8,9 @@ public class Exchange { protected String description; protected String publicKey; protected String privateKey; + protected boolean isEnabled; - public Exchange(int id, String name, int type, String description, String publicKey, String privateKey) + public Exchange(int id, String name, int type, String description, String publicKey, String privateKey, boolean isEnabled) { this.id = id; this.name = name; @@ -17,6 +18,27 @@ public class Exchange { this.description = description; this.publicKey = publicKey; this.privateKey = privateKey; + this.isEnabled = isEnabled; + } + + public boolean isEnabled() + { + return isEnabled; + } + + public String getPublicKey() + { + return publicKey; + } + + public String getPrivateKey() + { + return privateKey; + } + + public int getType() + { + return type; } public String getName() @@ -28,4 +50,9 @@ public class Exchange { { return description; } + + public int getId() + { + return id; + } } diff --git a/app/src/main/java/com/herbron/moodl/DataManagers/ExchangeManager/HitBtcManager.java b/app/src/main/java/com/herbron/moodl/DataManagers/ExchangeManager/HitBtcManager.java index b096c7e..9f89cd1 100644 --- a/app/src/main/java/com/herbron/moodl/DataManagers/ExchangeManager/HitBtcManager.java +++ b/app/src/main/java/com/herbron/moodl/DataManagers/ExchangeManager/HitBtcManager.java @@ -26,10 +26,8 @@ import java.util.Map; * Created by Guitoune on 26/02/2018. */ -public class HitBtcManager { +public class HitBtcManager extends Exchange { - private String publicKey; - private String privateKey; final private String hitBalanceUrl = "https://api.hitbtc.com/api/2/account/balance"; final private String hitTradingBalanceUrl = "https://api.hitbtc.com/api/2/trading/balance"; final private String tradeHistoryUrl = "https://api.hitbtc.com/api/2/history/trades?"; @@ -41,13 +39,12 @@ public class HitBtcManager { private List balance; private android.content.Context context; - public HitBtcManager(android.content.Context context, String publicKey, String privateKey) + public HitBtcManager(android.content.Context context, Exchange exchange) { + super(exchange.id, exchange.name, exchange.type, exchange.description, exchange.publicKey, exchange.privateKey, exchange.isEnabled); + this.context = context; requestQueue = Volley.newRequestQueue(context); - - this.publicKey = publicKey; - this.privateKey = privateKey; } private void createPairSymbolList() diff --git a/app/src/main/java/com/herbron/moodl/LayoutManagers/CurrencyListAdapter.java b/app/src/main/java/com/herbron/moodl/LayoutManagers/CurrencyListAdapter.java index 8c2a134..cf18847 100644 --- a/app/src/main/java/com/herbron/moodl/LayoutManagers/CurrencyListAdapter.java +++ b/app/src/main/java/com/herbron/moodl/LayoutManagers/CurrencyListAdapter.java @@ -68,7 +68,7 @@ public class CurrencyListAdapter extends BaseAdapter implements Filterable { } if (position % 2 == 0) - convertView.setBackgroundColor(context.getResources().getColor(R.color.listBackground2)); + convertView.setBackgroundColor(context.getResources().getColor(R.color.white)); else convertView.setBackgroundColor(context.getResources().getColor(R.color.listBackground)); diff --git a/app/src/main/java/com/herbron/moodl/LayoutManagers/ExchangeListAdapter.java b/app/src/main/java/com/herbron/moodl/LayoutManagers/ExchangeListAdapter.java index 5c7bfe3..75759c5 100644 --- a/app/src/main/java/com/herbron/moodl/LayoutManagers/ExchangeListAdapter.java +++ b/app/src/main/java/com/herbron/moodl/LayoutManagers/ExchangeListAdapter.java @@ -1,6 +1,7 @@ package com.herbron.moodl.LayoutManagers; import android.content.Context; +import android.content.Intent; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.LayoutInflater; @@ -12,9 +13,13 @@ import android.widget.Filter; import android.widget.Filterable; import android.widget.TextView; +import com.herbron.moodl.Activities.AddExchangeActivity; +import com.herbron.moodl.Activities.ExchangeListActivity; import com.herbron.moodl.DataManagers.CurrencyData.Currency; import com.herbron.moodl.DataManagers.CurrencyData.Trade; +import com.herbron.moodl.DataManagers.DatabaseManager; import com.herbron.moodl.DataManagers.ExchangeManager.Exchange; +import com.herbron.moodl.MoodlBox; import com.herbron.moodl.R; import java.util.ArrayList; @@ -28,6 +33,7 @@ public class ExchangeListAdapter extends ArrayAdapter { public ExchangeListAdapter(Context context, ArrayList exchanges) { super(context, android.R.layout.simple_list_item_1, exchanges); + this.context = context; } @@ -41,12 +47,38 @@ public class ExchangeListAdapter extends ArrayAdapter { convertView = LayoutInflater.from(getContext()).inflate(R.layout.exchange_cell, parent, false); } + final View finalConvertView = convertView; + TextView exchangeNameTextView = convertView.findViewById(R.id.exchange_name); TextView exchangeDescriptionTextView = convertView.findViewById(R.id.exchange_description); exchangeNameTextView.setText(exchange.getName()); exchangeDescriptionTextView.setText(exchange.getDescription()); + if(!exchange.isEnabled()) + { + convertView.findViewById(R.id.exchange_account_off_imageView).setVisibility(View.VISIBLE); + } + + convertView.findViewById(R.id.editExchangeInfosLayout).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent editExchangeAccountIntent = new Intent(context, AddExchangeActivity.class); + editExchangeAccountIntent.putExtra("isEdit", true); + editExchangeAccountIntent.putExtra("exchangeId", exchange.getId()); + context.startActivity(editExchangeAccountIntent); + } + }); + + convertView.findViewById(R.id.deleteExchangeInfosLayout).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + DatabaseManager databaseManager = new DatabaseManager(getContext()); + databaseManager.deleteExchangeAccountFromId(exchange.getId()); + MoodlBox.collapseH(finalConvertView); + } + }); + return convertView; } diff --git a/app/src/main/res/drawable/ic_add_white_24dp.xml b/app/src/main/res/drawable/ic_add_white_24dp.xml new file mode 100644 index 0000000..e3979cd --- /dev/null +++ b/app/src/main/res/drawable/ic_add_white_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_arrow_drop_down_white_24dp.xml b/app/src/main/res/drawable/ic_arrow_drop_down_white_24dp.xml new file mode 100644 index 0000000..65e1e42 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_drop_down_white_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_money_off_24dp.xml b/app/src/main/res/drawable/ic_money_off_24dp.xml new file mode 100644 index 0000000..ebcd2f4 --- /dev/null +++ b/app/src/main/res/drawable/ic_money_off_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/spinner_background.xml b/app/src/main/res/drawable/spinner_background.xml new file mode 100644 index 0000000..66a69c8 --- /dev/null +++ b/app/src/main/res/drawable/spinner_background.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_add_exchange.xml b/app/src/main/res/layout/activity_add_exchange.xml new file mode 100644 index 0000000..b0e956c --- /dev/null +++ b/app/src/main/res/layout/activity_add_exchange.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/binance_exchange_setup_layout.xml b/app/src/main/res/layout/binance_exchange_setup_layout.xml new file mode 100644 index 0000000..262b89d --- /dev/null +++ b/app/src/main/res/layout/binance_exchange_setup_layout.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/cardview_currency.xml b/app/src/main/res/layout/cardview_currency.xml index 6ff7032..0990113 100644 --- a/app/src/main/res/layout/cardview_currency.xml +++ b/app/src/main/res/layout/cardview_currency.xml @@ -40,7 +40,7 @@ android:layout_gravity="center_vertical" android:gravity="start" android:textColor="@color/mainTextViewColor" - android:textSize="@dimen/cardViewMainText" /> + android:textSize="@dimen/cardViewTitle" /> + android:textSize="@dimen/cardViewCaption" /> + android:textSize="@dimen/cardViewTitle" /> @@ -73,7 +73,7 @@ android:layout_height="wrap_content" android:gravity="start" android:textColor="@color/secondaryTextViewColor" - android:textSize="@dimen/cardViewMainText" + android:textSize="@dimen/cardViewTitle" android:visibility="gone"/> + android:textSize="@dimen/cardViewTitle" /> + android:textSize="@dimen/cardViewCaption" /> @@ -112,13 +112,13 @@ android:id="@+id/currencyFluctuationPercentageTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textSize="@dimen/cardViewMainText" /> + android:textSize="@dimen/cardViewTitle" /> + android:textSize="@dimen/cardViewCaption" /> @@ -143,7 +143,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/day_history" - android:textSize="@dimen/cardViewSecondaryText" /> + android:textSize="@dimen/cardViewCaption" /> + android:textSize="@dimen/cardViewTitle" /> + android:textSize="@dimen/cardViewCaption" /> @@ -86,7 +86,7 @@ android:layout_height="wrap_content" android:gravity="start" android:textColor="@color/secondaryTextViewColor" - android:textSize="@dimen/cardViewMainText" + android:textSize="@dimen/cardViewTitle" android:layout_weight="0.5"/> + android:textSize="@dimen/cardViewTitle" /> + android:textSize="@dimen/cardViewCaption" /> @@ -154,7 +154,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/day_history" - android:textSize="@dimen/cardViewSecondaryText" /> + android:textSize="@dimen/cardViewCaption" /> - - - - - - + android:layout_height="50dp" + android:id="@+id/swipeLayout"> + + + - + + + + + + + + + + + + + + + android:orientation="horizontal"> - + - + - + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/exchange_spinner_item.xml b/app/src/main/res/layout/exchange_spinner_item.xml new file mode 100644 index 0000000..fe90b78 --- /dev/null +++ b/app/src/main/res/layout/exchange_spinner_item.xml @@ -0,0 +1,9 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/hitbtc_exchange_setup_layout.xml b/app/src/main/res/layout/hitbtc_exchange_setup_layout.xml new file mode 100644 index 0000000..262b89d --- /dev/null +++ b/app/src/main/res/layout/hitbtc_exchange_setup_layout.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 38951af..51f5703 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -139,4 +139,5 @@ Supprimer les entrées manuelles actuelles Supprimer la liste suivie actuelle Supprimer les clefs API actuelles + Choose an exchange \ No newline at end of file diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml new file mode 100644 index 0000000..c37eb98 --- /dev/null +++ b/app/src/main/res/values/arrays.xml @@ -0,0 +1,7 @@ + + + + Binance + HitBTC + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 3012892..0454a96 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -28,7 +28,6 @@ #FFED143D #FF00E000 #FFEEEEEE - #FFFFFFFF #66999999 #FFF44336 #FF4CAF50 @@ -41,4 +40,8 @@ #FF689afe #22689afe #FFAAAAAA + #FF898989 + #66FFFFFF + + #FFF5BC00 \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 61b39ec..9144acb 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,6 +1,6 @@ - 15sp - 12sp + 16sp + 12sp 150dp 172dp @@ -15,4 +15,5 @@ 8dp 15dp + 16dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c479a64..2f96301 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -249,5 +249,12 @@ Wipe current entries Wipe current watchlist Wipe current API keys + ExchangeList + Choose an exchange + Account label + Public key + API Key + Secret Key + Informations diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 592b287..12c6d3a 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -10,7 +10,7 @@ @color/decrease -