· 6 years ago · Oct 31, 2019, 02:06 AM
1package com.sixmultiverse.heartnumber;
2
3import android.app.Dialog;
4import android.arch.lifecycle.Lifecycle;
5import android.arch.lifecycle.LifecycleObserver;
6import android.arch.lifecycle.OnLifecycleEvent;
7import android.arch.lifecycle.ProcessLifecycleOwner;
8import android.content.Context;
9import android.content.pm.PackageInfo;
10import android.content.pm.PackageManager;
11import android.content.res.Configuration;
12import android.content.res.Resources;
13import android.databinding.Observable;
14import android.graphics.Typeface;
15import android.os.Build;
16import android.os.Handler;
17import android.support.multidex.MultiDex;
18import android.support.multidex.MultiDexApplication;
19import android.support.v4.os.ConfigurationCompat;
20import android.text.TextUtils;
21import android.util.Base64;
22import android.util.Log;
23import android.view.Gravity;
24import android.widget.LinearLayout;
25import android.widget.TextView;
26import android.widget.Toast;
27
28import com.crashlytics.android.Crashlytics;
29import com.crashlytics.android.core.CrashlyticsCore;
30import com.facebook.stetho.Stetho;
31import com.google.firebase.FirebaseApp;
32import com.google.firebase.messaging.FirebaseMessaging;
33import com.google.gson.Gson;
34import com.google.gson.GsonBuilder;
35import com.google.gson.JsonArray;
36import com.google.gson.JsonElement;
37import com.google.gson.JsonObject;
38import com.google.gson.JsonParser;
39import com.sixmultiverse.heartnumber.Data.Local.Parameters;
40import com.sixmultiverse.heartnumber.Data.Local.SharedPreferencesHelper;
41import com.sixmultiverse.heartnumber.Data.Remote.CoinData;
42import com.sixmultiverse.heartnumber.Data.Remote.CurrencyData;
43import com.sixmultiverse.heartnumber.Data.Remote.ProductData;
44import com.sixmultiverse.heartnumber.Data.Remote.SophyRunData;
45import com.sixmultiverse.heartnumber.Data.Remote.TradeData;
46import com.sixmultiverse.heartnumber.Dialog.ButtonDialog;
47import com.sixmultiverse.heartnumber.Dialog.CheckUserInformationDialog;
48import com.sixmultiverse.heartnumber.Dialog.RecommendedListDialog;
49import com.sixmultiverse.heartnumber.Dialog.SetRecommenderDialog;
50import com.sixmultiverse.heartnumber.Network.BinanceAPI.entity.AssetBalance;
51import com.sixmultiverse.heartnumber.Network.BinanceAPI.entity.NewOrderResponse;
52import com.sixmultiverse.heartnumber.Network.BinanceRequest;
53import com.sixmultiverse.heartnumber.Network.BithumbAPI.BithumbRequest;
54import com.sixmultiverse.heartnumber.Network.BithumbAPI.BithumbResponseListener;
55import com.sixmultiverse.heartnumber.Network.BithumbAPI.BithumbUtil;
56import com.sixmultiverse.heartnumber.Network.BithumbAPI.response.BitAccountResponse;
57import com.sixmultiverse.heartnumber.Network.BithumbAPI.response.BitPlaceResponse;
58import com.sixmultiverse.heartnumber.Network.NetworkManager;
59import com.sixmultiverse.heartnumber.Network.ServerAPI.LoginRequest;
60import com.sixmultiverse.heartnumber.Network.ServerAPI.MarketPriceRequest;
61import com.sixmultiverse.heartnumber.Network.ServerAPI.NetworkPacket;
62import com.sixmultiverse.heartnumber.Network.ServerAPI.ProductRequest;
63import com.sixmultiverse.heartnumber.Network.ServerAPI.ServerUtil;
64import com.sixmultiverse.heartnumber.Network.ServerAPI.SophyRunRequest;
65import com.sixmultiverse.heartnumber.Network.ServerAPI.TradingRequest;
66import com.sixmultiverse.heartnumber.Push.NotificationManager;
67import com.sixmultiverse.heartnumber.Util.CrpPasswordManager;
68import com.sixmultiverse.heartnumber.Util.Event;
69import com.sixmultiverse.heartnumber.Util.LocaleHelper;
70import com.sixmultiverse.heartnumber.Util.PushEvent;
71import com.sixmultiverse.heartnumber.Util.Util;
72import com.sixmultiverse.heartnumber.Util.event.SettingEvent;
73import com.sixmultiverse.heartnumber.coinDetailNew.model.RunSetting;
74import com.sixmultiverse.heartnumber.coinDetailNew.view.fragments.ChartFragment;
75import com.sixmultiverse.heartnumber.ethWallet.model.FullWallet;
76import com.sixmultiverse.heartnumber.ethWallet.utils.WalletStorage;
77import com.sixmultiverse.heartnumber.ethWallet.utils.event.AppEvent;
78import com.sixmultiverse.heartnumber.ethWallet.utils.event.NetworkEvent;
79import com.sixmultiverse.heartnumber.ethWallet.utils.manager.EthWalletManager;
80import com.sixmultiverse.heartnumber.htnMain.model.OptionEnum;
81import com.sixmultiverse.heartnumber.htnMain.utils.Config;
82import com.twitter.sdk.android.core.DefaultLogger;
83import com.twitter.sdk.android.core.Twitter;
84import com.twitter.sdk.android.core.TwitterAuthConfig;
85import com.twitter.sdk.android.core.TwitterConfig;
86import com.twitter.sdk.android.tweetui.TweetUi;
87
88import org.greenrobot.eventbus.EventBus;
89import org.greenrobot.eventbus.Subscribe;
90import org.greenrobot.eventbus.ThreadMode;
91
92import java.security.MessageDigest;
93import java.security.NoSuchAlgorithmException;
94import java.util.ArrayList;
95import java.util.HashMap;
96import java.util.List;
97import java.util.Locale;
98import java.util.concurrent.TimeUnit;
99
100import io.fabric.sdk.android.Fabric;
101import io.reactivex.Scheduler;
102import io.reactivex.android.schedulers.AndroidSchedulers;
103import io.reactivex.disposables.CompositeDisposable;
104import io.reactivex.disposables.Disposable;
105import io.reactivex.schedulers.Schedulers;
106import retrofit2.Call;
107
108/**
109 * Created by Cathy Chae 2018. 5. 23.
110 */
111
112public class Application extends MultiDexApplication implements LifecycleObserver {
113
114 SharedPreferencesHelper spHelper;
115 ButtonDialog noticeDialog;
116 Gson gson = new GsonBuilder().disableHtmlEscaping().excludeFieldsWithoutExposeAnnotation().create();
117 Handler handler = new Handler();
118 /**
119 * The dialog for sending exchange API key to our server
120 */
121 CheckUserInformationDialog walletInfoDialog;
122 /**
123 * 추천 받은 내역
124 */
125 RecommendedListDialog recommendedListDialog;
126 CompositeDisposable disposables = new CompositeDisposable();
127 Disposable currencyChecking;
128 Disposable ping;
129 Observable.OnPropertyChangedCallback observingCallBack;
130 /**
131 * key : 거래소에서 받은 orderId
132 * value : 거래소에서 받은 체결 목록 리스트
133 */
134 private HashMap<Long, List<BitPlaceResponse>> completedTradingList = new HashMap<>();
135 private HashMap<Long, NewOrderResponse> completedTradingListBinance = new HashMap<>();
136
137
138 public static boolean isLoaded;
139
140 public static boolean isIsLoaded() {
141 return isLoaded;
142 }
143
144 public static void setIsLoaded(boolean isLoaded) {
145 Application.isLoaded = isLoaded;
146 }
147
148 @Override
149 public void onCreate() {
150 super.onCreate();
151
152 Parameters.application = this;
153 spHelper = SharedPreferencesHelper.getInstance();
154 noticeDialog = new ButtonDialog(this, getResources().getString(R.string.alarm), "", false);
155 walletInfoDialog = new CheckUserInformationDialog(this, CheckUserInformationDialog.CALL_BY_DETAIL);
156
157 initParameters();
158
159 setLibrary();
160
161 Util.subscribeEvent(this);
162
163 networkTask();
164
165 ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
166
167 }
168
169
170 //################################## ResultOfRequest #############################################################################
171 //요청한 내용이 공통 데이터를 업데이트 하는 내용일 경우
172 //중복으로 처리되는 것을 막기 위해 여기서 처리함
173 @Subscribe(threadMode = ThreadMode.ASYNC)
174 public void resultOfRequest(Event.ResultOfRequest params) {
175 NetworkPacket result = params.getResultPacket();
176 String noticeMsg = "";
177 if (result == null) return;
178 JsonObject attribute = new JsonObject();
179 try {
180 if (result.getContent() != null && result.getContent().getAttributes() != null)
181 attribute = result.getContent().getAttributes().getAsJsonObject();
182 } catch (Exception e) {
183 e.printStackTrace();
184 }
185 //데이터를 set 하거나, 여기저기서 공통으로 이뤄저야 하는건 여기서 처리함
186 switch (params.getTAG()) {
187 //Currency, MarketPrice, CoinInformation
188 case ServerUtil.TASK_INIT_INFORMATION:
189 if (params.getResultMsg().getRESULT_CODE() == ServerUtil.SUCCESS) {
190 Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
191 NetworkPacket resultPacket = params.getResultPacket();
192 NetworkPacket.Content content;
193 JsonArray contents = resultPacket.getContents();
194 JsonArray infoContents = new JsonArray();
195 JsonArray priceContents = new JsonArray();
196 for (JsonElement element : contents) {
197 content = gson.fromJson(element, NetworkPacket.Content.class);
198 switch (content.getpName()) {
199 case MarketPriceRequest.GET_CURRENCY_INFO:
200 CurrencyData.parsingCurrencyInfo(content.getItems());
201 break;
202 case MarketPriceRequest.GET_CURRENCY:
203 CurrencyData.parsingCurrencyData(content);
204 break;
205 case MarketPriceRequest.GET_COIN_INFO:
206 // Log.e("GET_COIN_INFO", Util.parsingJsonToString(content.getAttributes().getAsJsonObject(), "ECMK")+ " information : " + gson.toJson(element));
207 infoContents.add(element);
208 CoinData.parsingExchangeInfo(Util.parsingJsonToString(content.getAttributes().getAsJsonObject(), "ECID")
209 , Util.parsingJsonToString(content.getAttributes().getAsJsonObject(), "ECMK")
210 , content);
211 break;
212 case MarketPriceRequest.GET_COIN_MARKET_PRICE:
213 priceContents.add(element);
214 //Log.e("GET_COIN_INFO", Util.parsingJsonToString(content.getAttributes().getAsJsonObject(), "ECMK") + " marketPrice : " + gson.toJson(element));
215 //price of exchange
216 CoinData.parsingMarketPrice(content);
217 break;
218 }
219 }
220 EventBus.getDefault().post(new Event.ReadyToMain());
221 //Automatically update the currency in hourly.
222 currencyChecking = io.reactivex.Observable.interval(1, TimeUnit.HOURS)
223 .doOnNext(l -> MarketPriceRequest.getInstance().getCurrency())
224 .subscribeOn(AndroidSchedulers.mainThread())
225 .observeOn(Schedulers.io())
226 .subscribe();
227 disposables.add(currencyChecking);
228 }
229
230 break;
231
232
233 case ServerUtil.TASK_GET_MY_PRODUCT:
234 if (params.getResultMsg().getRESULT_CODE() == ServerUtil.SUCCESS)
235 ProductData.parsingMyProductItems(result.getContent().getItems());
236
237 break;
238 case ServerUtil.TASK_GET_TRANSACTION:
239 if (params.getResultMsg().getRESULT_CODE() == ServerUtil.SUCCESS) {
240 JsonArray transactions = new JsonArray();
241 for (JsonElement element : result.getContents().getAsJsonArray()) {
242 //Log.e("transactionList", " : " + gson.toJson(element.getAsJsonObject().get("ITEMS").getAsJsonArray()));
243 transactions.addAll(element.getAsJsonObject().get("ITEMS").getAsJsonArray());
244 }
245 TradeData.parsingTransaction(transactions);
246 }
247 break;
248
249 case ServerUtil.TASK_SET_PW:
250 if (params.getResultMsg().getRESULT_CODE() == ServerUtil.SUCCESS) {
251 EventBus.getDefault().post(new Event.ShowToast(getString(R.string.completed_device)));
252 //If this request succeed, requestLogin will be called
253 LoginRequest.getInstance().requestLogin();
254 }
255
256 break;
257
258 case ServerUtil.TASK_GET_USER:
259 case ServerUtil.TASK_GET_USER_PURCHASE:
260 JsonArray items = new JsonArray();
261 if (params.getResultMsg().getRESULT_CODE() == ServerUtil.SUCCESS) {
262 JsonObject attr = result.getContent().getAttributes().getAsJsonObject();
263 String recommenderID = Util.parsingJsonToString(attr, "NAME");
264 long recommenderMID = Util.parsingJsonToLong(attr, "MID");
265 String grade = Util.parsingJsonToString(attr, "GRADE");
266
267 if (grade.length() > 0 && !grade.equals(LoginRequest.GRADE_USER)) {
268 //기존해 등록했던 유저와 다르면 정보를 전송
269 if (!Parameters.getRecommenderId().get().equals(recommenderID)) {
270 items.add(new Gson().toJsonTree(new NetworkPacket.Item("RECOMMENDER", "NAME", recommenderID)));
271 items.add(new Gson().toJsonTree(new NetworkPacket.Item("RECOMMENDER", "MID", String.valueOf(recommenderMID))));
272 if (params.getTAG() == ServerUtil.TASK_GET_USER)
273 showToast(new Event.ShowToast(getString(R.string.recommender_set_success)));
274 }
275 Parameters.setRecommenderMid(recommenderMID);
276 Parameters.setRecommenderId(recommenderID);
277 } else {
278 noticeMsg = getString(R.string.disable_recommender);
279 noticeDialog.setContents(noticeMsg);
280 showDialog(noticeDialog);
281 //기존에 등록되어 있던 추천인이 더이상 추천인이 될 수 없을 경우
282 if (Parameters.hasRecommender()) {
283 items.add(new Gson().toJsonTree(new NetworkPacket.Item("RECOMMENDER", "NAME", "")));
284 items.add(new Gson().toJsonTree(new NetworkPacket.Item("RECOMMENDER", "MID", "")));
285 LoginRequest.getInstance().setUserPrivateData(items);
286 Parameters.setRecommenderId("");
287 Parameters.setRecommenderMid(0);
288 }
289 }
290
291
292 } else if (params.getResultMsg().getRESULT_CODE() == ServerUtil.ERROR_DATA_EMPTY) {
293 noticeMsg = getString(R.string.unregister_user);
294 noticeDialog.setContents(noticeMsg);
295 showDialog(noticeDialog);
296 if (Parameters.hasRecommender()) {
297 items.add(new Gson().toJsonTree(new NetworkPacket.Item("RECOMMENDER", "NAME", "")));
298 items.add(new Gson().toJsonTree(new NetworkPacket.Item("RECOMMENDER", "MID", "")));
299 LoginRequest.getInstance().setUserPrivateData(items);
300 Parameters.setRecommenderId("");
301 Parameters.setRecommenderMid(0);
302 }
303 }
304
305 if (items.size() > 0)
306 LoginRequest.getInstance().setUserPrivateData(items);
307
308 if (params.getTAG() == ServerUtil.TASK_GET_USER_PURCHASE)
309 EventBus.getDefault().post(new Event.CheckedRecommender());
310
311 break;
312
313 case ServerUtil.TASK_SET_USER_INFO:
314 NetworkPacket request = params.getRequestPacket();
315 for (JsonElement element : request.getContent().getItems()) {
316
317 JsonObject object = element.getAsJsonObject();
318
319
320 switch (Util.parsingJsonToString(object, "NAME")) {
321
322 case "BIRTHDATE": //생일 값 설정
323 Parameters.BIRTHDATE = Util.parsingJsonToString(object, "VALUE");
324 SharedPreferencesHelper.getInstance().setValue(SharedPreferencesHelper.USER_INFO,
325 "BIRTHDATE", Parameters.BIRTHDATE);
326 break;
327 case "GENDER": //성별 설정
328 Parameters.GENDER = Util.parsingJsonToInteger(object, "VALUE");
329 SharedPreferencesHelper.getInstance().setValue(SharedPreferencesHelper.USER_INFO,
330 "GENDER", Parameters.GENDER);
331 break;
332 case "NAME": //이름 설정
333 Parameters.NAME = Util.parsingJsonToString(object, "VALUE");
334 SharedPreferencesHelper.getInstance().setValue(SharedPreferencesHelper.USER_INFO,
335 "NAME", Parameters.NAME);
336 break;
337 case "BIRTHNATION_CODE": //태어난 국가
338 Parameters.BIRTHNATION_CODE = Util.parsingJsonToString(object, "VALUE");
339 SharedPreferencesHelper.getInstance().setValue(SharedPreferencesHelper.USER_INFO,
340 "BIRTHNATION", Parameters.BIRTHNATION_CODE);
341 break;
342 case "LOCALNATION": //살고 있는 지역
343 Parameters.LOCALNATION_CODE = Util.parsingJsonToString(object, "VALUE");
344 SharedPreferencesHelper.getInstance().setValue(SharedPreferencesHelper.USER_INFO,
345 "LOCALNATION", Parameters.LOCALNATION_CODE);
346 break;
347 case "SOPHYRUN": //예측알람
348 Parameters.setIsWatch(Util.parsingJsonToString(object, "VALUE").equals(Parameters.ALARM_ON));
349 break;
350 case "AUTOORDER": //자동주문알람
351 Parameters.setIsAuto(Util.parsingJsonToString(object, "VALUE").equals(Parameters.ALARM_ON));
352 break;
353 }
354 }
355 if (!Application.isIsLoaded() && request.getContent().getItems().size() > 0) {
356 EventBus.getDefault().post(SettingEvent.refreshEvent());
357 Application.setIsLoaded(true);
358 }
359 break;
360
361 case ServerUtil.TASK_DEL_USER_INFO:
362 JsonArray requestArray = params.getRequestPacket().getContent().getItems();
363 JsonArray resultArray = params.getResultPacket().getContent().getItems();
364 NetworkPacket.Item item;
365 for (int i = 0; i < requestArray.size(); i++) {
366 //If the data is successfully deleted, update it.
367 if (Util.parsingJsonToInteger(resultArray.get(i).getAsJsonObject(), "SUCCESS") != 0) {
368 item = gson.fromJson(requestArray.get(i), NetworkPacket.Item.class);
369 switch (item.TYPE) {
370 //regarding recommender
371 case "RECOMMENDER":
372 if (item.NAME.equals("MID")) Parameters.setRecommenderMid(0);
373 else if (item.NAME.equals("NAME")) Parameters.setRecommenderId("");
374 break;
375 }
376
377 }
378 //If the data is not deleted, show the notice.
379 else {
380 //EventBus.getDefault().post(new Event.ShowToast(""));
381 }
382 }
383 break;
384
385 case ServerUtil.TASK_LOGIN:
386
387 if (params.getResultMsg().getRESULT_CODE() == ServerUtil.SUCCESS) {
388
389 Parameters.setAUTHKEY(Util.parsingJsonToString(attribute, "AUTHKEY"));
390 Parameters.setMID(Util.parsingJsonToLong(attribute, "MID"));
391 String licenseCode = Util.parsingJsonToString(params.getRequestPacket().getContent().getAttributes().getAsJsonObject(), "ACCOUNTID");
392 Parameters.setIsLogin(true);
393
394 //매니저인지 체크 하기
395 if (params.getResultPacket().getContent().getAttributes().getAsJsonObject().get("MANAGER") != null) {
396 Parameters.setIsManager(Util.parsingJsonToInteger(params.getResultPacket().getContent().getAttributes().getAsJsonObject(), "MANAGER") > 0);
397 }
398 spHelper.setValue(SharedPreferencesHelper.USER_INFO, "LICENSE_CODE", licenseCode);
399
400 //If there are any requests before requesting login,
401 //they are added in request from tempRequests in networkManger
402 //They are executed by order
403 if (!NetworkManager.getTempRequests().isEmpty()) {
404 NetworkManager.getRequests().addAll(NetworkManager.getTempRequests());
405 NetworkManager.getTempRequests().clear();
406 }
407
408 //If login request is finished, we don't need to add request in tempRequests
409 //because there are not requests to proceed very first time
410 NetworkManager.setIsBlocking(false);
411
412 //변동률 데이터 받아올 것
413 MarketPriceRequest.getInstance().getChangeRateAll(false, Parameters.getExchangeID(), Parameters.getMarketID());
414
415 //상품 정보가 있다는 것은 유저 정보를 한번 받아왔다는 것이므로, 상품정보가 없을 경우에만, 정보를 받아옴
416 if (ProductData.getProductItems().size() == 0)
417 LoginRequest.getInstance().initUserInfo();
418
419 //로그인을 완료 했고, 사용자의 지갑 정보가 있다면
420 //토큰 시세를 가져옴
421 EthWalletManager.getInstance(getApplicationContext()).loadTokenPrices();
422
423 if (Parameters.isLogin())
424 LoginRequest.getInstance().getUserAccount(); //닉네임 및 최초 가입날짜를 받아옴 (Private Information 은 나뉘어있음)
425
426 } else {
427 switch (params.getResultMsg().getRESULT_CODE()) {
428 //유효하지 않은 앱
429 case ServerUtil.ERROR_INFO_EMPTY:
430 noticeMsg = getResources().getString(R.string.invalid_app);
431 break;
432
433 //현재 서비스 중이 아닙니다. 잠시후에 다시 시도하시기 바랍니다. (서비스 안되는 시간 알려주면 좋을 것 같음)
434 case ServerUtil.ERROR_INFO_INVALID:
435 noticeMsg = getResources().getString(R.string.server_test);
436 noticeDialog.setMode(ServerUtil.ERROR_INFO_INVALID); //앱 종료 시킬 것
437 break;
438
439 //가입되어 있지 않은 유저라면, 로그인 화면으로 이동, 본 액티비티는 종료
440 case ServerUtil.ERROR_DATA_EMPTY:
441// noticeMsg = getResources().getString(R.string.forced_update_app);
442// noticeDialog.setMode(ServerUtil.ERROR_DATA_EMPTY);
443 break;
444
445 //현재 버전이 스토어 버전보다 낮을 경우 강제 업데이트
446 case ServerUtil.ERROR_ARGUMENT_INVALID:
447 noticeMsg = getResources().getString(R.string.forced_update_app);
448 noticeDialog.setMode(ServerUtil.FORCED_UPDATE);
449
450 break;
451
452 //DB 오류로 가입이나 로그인이 불가능한 경우
453 case ServerUtil.ERROR_DB_MEMBER:
454 noticeMsg = getResources().getString(R.string.server_test) + "\n " + String.valueOf(ServerUtil.ERROR_DB_MEMBER);
455 break;
456
457 //다른 기기에서 로그인 중일 경우
458 case ServerUtil.ERROR_DATA_INVALID:
459 if (Parameters.isIsAppInForeground()) {
460 noticeMsg = getString(R.string.change_device);
461 noticeDialog.setOneOrTwoButton(true);
462 noticeDialog.setTitle(getString(R.string.change_device_title));
463 }
464 break;
465
466 default:
467 noticeMsg = params.getResultMsg().getMSG();
468 break;
469 }
470 if (noticeMsg.length() > 0) {
471 noticeDialog.setContents(noticeMsg);
472 //pw가 틀렸을 경우 mode 값을 바꿔서 넣어 주기 위해서
473 noticeDialog.setMode(params.getResultMsg().getRESULT_CODE() == (ServerUtil.ERROR_DATA_INVALID) ? ServerUtil.ERROR_PW_INVALID : params.getResultMsg().getRESULT_CODE());
474 showDialog(noticeDialog);
475 }
476 break;
477 }
478 break;
479
480 //setUserInfo
481 //유저 정보 받아온 이후에 해야할 작업들
482 case ServerUtil.TASK_INIT_USER_INFO:
483 if (params.getResultMsg().getRESULT_CODE() == ServerUtil.SUCCESS) {
484 initUserInfo(result); //파싱
485 // Handling Push when app is not running
486 if (Parameters.isIsPushFromBackground()) {
487 switch (Parameters.getPushType()) {
488 case Parameters.NOTIFICATION_BY_PREDICTION_ALARM: //예측 알람에 의해 실행되었을 경우
489 case Parameters.NOTIFICATION_BY_AUTO_ORDER_TRANSACTION: //자동 주문의 체결에 의해 실행되었을 경우
490 case Parameters.NOTIFICATION_BY_REPREDICTION: //재예측에 의해 실행되었을 경우
491 case Parameters.NOTIFICATION_BY_AUTO_ORDER_LOSSCUT: //손절에 의해 실행되었을 경우
492 case Parameters.NOTIFICATION_BY_AUTO_ORDER_END: //자동매수이 완료되어 실행되었을 경우
493 case Parameters.NOTIFICATION_BY_TRADE: {
494 EventBus.getDefault().post(PushEvent.pushEvent(PushEvent.Type.PUSH_COIN_DETAIL_SCREEN));
495 break;
496 }
497
498 case Parameters.NOTIFICATION_BY_PURCHASE:
499 case Parameters.NOTIFICATION_BY_PRODUCT:
500 default: {
501 EventBus.getDefault().post(PushEvent.pushEvent(PushEvent.Type.PUSH_MAIN_SCREEN));
502 break;
503 }
504 }
505 }
506 }
507 break;
508
509 case ServerUtil.TASK_GET_USER_ACCOUNT:
510 if (params.getResultMsg().getRESULT_CODE() == ServerUtil.SUCCESS) {
511 Parameters.setNickName(Util.parsingJsonToString
512 (attribute, "NIACKNAME"));
513 String registeredDate = Util.parsingJsonToString
514 (attribute, "CREATED");
515 Parameters.setRegisteredDate(Util.getStringToDate(registeredDate));
516 }
517 break;
518
519 case ServerUtil.TASK_GET_RECOMMENDER:
520 if (params.getResultMsg().getRESULT_CODE() == ServerUtil.SUCCESS) {
521 int maxCount = Util.parsingJsonToInteger(result.getContent().getAttributes().getAsJsonObject(),
522 "COUNT");
523 ProductData.parsingRecommendList(result.getContent().getItems());
524
525 handler.post(() -> {
526 recommendedListDialog = new RecommendedListDialog(this);
527 recommendedListDialog.show();
528 });
529 }
530 break;
531 case ServerUtil.TASK_GET_ALL_SOPHY_RUN:
532 if (params.getResultMsg().getRESULT_CODE() == ServerUtil.SUCCESS) {
533 SophyRunData.parsingSophyRunItems(result);
534 }
535 break;
536
537 //체결내역 parsing
538 case ServerUtil.TASK_GET_ON_GOING_TRANSACTION:
539 if (params.getResultMsg().getRESULT_CODE() == ServerUtil.SUCCESS) {
540 TradeData.parsingTransaction(result.getContent().getItems());
541 }
542 break;
543
544
545 case ServerUtil.TASK_GET_AUTO_ORDER_PRICE:
546 if (params.getResultMsg().getRESULT_CODE() == ServerUtil.SUCCESS) {
547 if (result.getContent() != null && result.getContent().getAttributes() != null) {
548 JsonArray jsonArray = SophyRunData.getResponses(result.getContent().getAttributes());
549 double totalPrice = 0;
550 String market = "";
551 double price = 0;
552 for (JsonElement element : jsonArray) {
553 market = Util.parsingJsonToString(element.getAsJsonObject(), "market");
554 price = Util.parsingJsonToDouble(element.getAsJsonObject(), "price");
555 totalPrice += CurrencyData.getPrice(price, market, Parameters.CURRENCY_USD);
556 }
557 Parameters.setUsedAmount(totalPrice);
558
559 //Log.e("USED_AMOUNT", " : " + totalPrice);
560 } else Parameters.setUsedAmount(0);
561 }
562 break;
563
564 case ServerUtil.TASK_GET_WALLET_INFO:
565 if (params.getResultMsg().getRESULT_CODE() == ServerUtil.SUCCESS) {
566 JsonObject object = result.getContent().getAttributes().getAsJsonObject();
567 Log.e("get_wallet_info", " aaaa: " + gson.toJson(object));
568 switch (Util.parsingJsonToString(object, "ECID")) {
569 case Parameters.BITHUMB_ID:
570 //암호화 된 apiKey, secretKey 를 저장
571 Parameters.getExchangeUtil(Parameters.BITHUMB_ID).setApiKeyEncrypted(object.get("APIKEY").getAsString(), object.get("SECRETKEY").getAsString());
572 BithumbRequest.getInstance().setUserInfo();
573 BithumbRequest.getInstance().checkWalletInfoDemo(); //빗썸 API 초기화
574 break;
575 case Parameters.UPBIT_ID:
576 break;
577
578 case Parameters.BINANCE_ID:
579 Parameters.getExchangeUtil(Parameters.BINANCE_ID).setApiKeyEncrypted(object.get("APIKEY").getAsString(), object.get("SECRETKEY").getAsString());
580 BinanceRequest.getInstance().getAccount(null);
581 break;
582 }
583 }
584 break;
585
586 /**TODO : 시간 확인할 것 BINANCE/BITHUMB*/
587 case ServerUtil.TASK_ADD_TRADE:
588 if (params.getResultMsg().getRESULT_CODE() == ServerUtil.SUCCESS) {
589 JsonObject object = result.getContent().getAttributes().getAsJsonObject();
590 long tid = Util.parsingJsonToLong(object, "TID");
591 long orderId = Util.parsingJsonToLong(object, "ECOID");
592
593 //매매 한 이후에 바로 체결이 되었을 경우 체결 리스트가 포함됨
594 if (completedTradingList.get(orderId) != null) {
595 List<BitPlaceResponse> responses = completedTradingList.get(orderId);
596
597 //addTransaction 을 통해서 체결된 목록을 추가하고
598 JsonObject jsonObject = params.getRequestPacket().getContent().getAttributes().getAsJsonObject();
599 TradeData.TradingItem tradingItem = new TradeData.TradingItem(tid,
600 Util.parsingJsonToString(jsonObject, "ECID"),
601 Util.parsingJsonToString(jsonObject, "ECSB"),
602 Util.parsingJsonToDouble(jsonObject, "UNIT"),
603 orderId);
604 TradingRequest.getInstance().addTransactions(tradingItem, responses);
605
606 //체결 된 코인의 양을 모두 더함
607 double total = 0;
608 for (BitPlaceResponse response : responses) {
609 total = total + Double.parseDouble(response.getUnits());
610 }
611 //주문한 코인의 양과 체결된 코인의 양이 같으므로 해당 주문은 체결이 완료 되었음.
612 //체결이 완료 되었음을 서버에 전송
613 if (tradingItem.getUnit() == total)
614 TradingRequest.getInstance().updateTrade(tradingItem, TradingRequest.REQUEST_ORDER_COMPLETE);
615
616 //체결이 완료되지 않았으면, 체결 여부를 확인하기 위해 trade 를 가져옴
617 else TradingRequest.getInstance().getTrade(tid);
618
619 //체결된 주문에대한 내용을 모두 서버에 전송했으므로 목록에서 제거
620 completedTradingList.remove(orderId);
621 }
622 //체결이 완료되지 않았으면, 체결 여부를 확인하기 위해 trade 를 가져옴
623 else TradingRequest.getInstance().getTrade(tid);
624 }
625 break;
626
627 case ServerUtil.TASK_GET_TRADE:
628 if (params.getResultMsg().getRESULT_CODE() == ServerUtil.SUCCESS) {
629 TradeData.parsingTradeList(result.getContent().getItems());
630 }
631 break;
632
633 case ServerUtil.TASK_ADD_TRANSACTION:
634
635 break;
636
637
638 //상품 구매
639 case ServerUtil.TASK_PURCHASE_PRODUCT:
640 if (params.getResultMsg().getRESULT_CODE() == ServerUtil.SUCCESS) {
641
642 }
643 //현재 결제가 진행중인 상품이 있음
644 else if (params.getResultMsg().getRESULT_CODE() == ServerUtil.ERROR_DATA_DUPLICATION) {
645
646 }
647 //패키지 상품은 중복 구매가 불가능 합니다. 사용기간이 만료 되면 구매 하시기 바랍니다.
648 else if (params.getResultMsg().getRESULT_CODE() == ServerUtil.DISABLE_TO_BUY_DUPRLCATION) {
649 noticeMsg = getString(R.string.disable_to_buy_duplication);
650 noticeDialog.setContents(noticeMsg);
651 showDialog(noticeDialog);
652 }
653
654 break;
655
656 case ServerUtil.TASK_PURCHASE_RESULT:
657 JsonObject attr = result.getContent().getAttributes().getAsJsonObject();
658 String productCode = Util.parsingJsonToString(attr, "CODE");
659 if (params.getResultMsg().getRESULT_CODE() == ServerUtil.SUCCESS) {
660 EventBus.getDefault().post(new Event.ShowToast(getString(R.string.completed_purchase) + " : " + ProductData.getProductName(productCode)));
661 //구매한 상품 상태를 업데이트 하기 위해 myProduct 를 한번 가져옴 (패키지 상품일 경우에만)
662 if (!productCode.equals(ProductRequest.PRODUCT_CODE_TRADE)) {
663 ProductRequest.getInstance().getMyProduct();
664 ProductRequest.getInstance().getPurchase();
665 }
666 } else {
667 EventBus.getDefault().post(new Event.ShowToast(getString(R.string.fail_purchase) + " : " + ProductData.getProductName(productCode)));
668 }
669 break;
670
671 //구매 목록
672 case ServerUtil.TASK_GET_PURCHASE_LIST:
673 if (params.getResultMsg().getRESULT_CODE() == ServerUtil.SUCCESS)
674 ProductData.parsingPurchasedList(result.getContent().getItems());
675 break;
676
677 case ServerUtil.TASK_SET_COUPON:
678 if (params.getResultMsg().getRESULT_CODE() == ServerUtil.SUCCESS) {
679 //쿠폰이 등록되었으면, 사용자의 상품 구매 리스트에 해당내용이 추가되었을 것이므로 확인할 것
680 ProductRequest.getInstance().getMyProduct();
681 JsonObject attributes = params.getRequestPacket().getContent().getAttributes().getAsJsonObject();
682 Parameters.setLicenseCode(Util.parsingJsonToString(attributes, "VALUE"));
683 EventBus.getDefault().post(new Event.ShowToast(getString(R.string.complete_regitser_license)));
684
685 } else {
686 switch (params.getResultMsg().getRESULT_CODE()) {
687 case ServerUtil.ERROR_DATA_EMPTY:
688 EventBus.getDefault().post(new Event.ShowToast(getString(R.string.unregister_license)));
689 break;
690 //해당 라이센스 코드는 이미 등록이 완료 되었습니다.
691 case ServerUtil.ERROR_DATA_LIMIT:
692 EventBus.getDefault().post(new Event.ShowToast(getString(R.string.used_license)));
693 break;
694 case ServerUtil.ERROR_EXPIRE_TO_USE:
695 EventBus.getDefault().post(new Event.ShowToast(getString(R.string.expire_to_use)));
696 break;
697 }
698 }
699 break;
700 case ServerUtil.TASK_USER_LOGOUT:
701 EventBus.getDefault().post(new Event.ShowToast(getApplicationContext().getString(R.string.logout_success)));
702 Util.refreshData();
703 break;
704 }
705 }
706
707 //요청 하는 곳 많아 application 에서 공통으로 관리 - MainActivity, CoinDetailActivity, SettingActivity
708
709 @Subscribe(threadMode = ThreadMode.MAIN)
710 public void showToast(Event.ShowToast params) {
711 if (params.getMsg().equals(getString(R.string.request_login)) && !Parameters.isIsAppInForeground())
712 return;
713
714 Toast toast = Toast.makeText(getApplicationContext(), params.getMsg(), Toast.LENGTH_SHORT);
715 // Toast contents Text 가운데 정렬
716 if (((LinearLayout) toast.getView()).getChildCount() > 0) {
717 TextView textView = (TextView) ((LinearLayout) toast.getView()).getChildAt(0);
718 textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL);
719 toast.show();
720 }
721 //handler.post(() -> Toast.makeText(getApplicationContext(), params.getMsg(), Toast.LENGTH_SHORT).show());
722 }
723
724//################################## Related api key #############################################################################
725
726 /**
727 * 거래소 정보를 입력하는 창을 요청했을 경우
728 */
729 @Subscribe(threadMode = ThreadMode.MAIN)
730 public void requestApiKey(Event.RequestExchangeApiKey params) {
731 //로그인이 되어있지 않은 상태라면 로그인을 요청함
732 if (!Parameters.isLogin() && Parameters.isIsAppInForeground()) {
733 EventBus.getDefault().post(new Event.ShowToast(getString(R.string.request_login)));
734 return;
735 }
736// //빗썸은 서비스 준비중이라고 문구 띄울 것
737// if (Parameters.getExchangeID().equals(Parameters.BITHUMB_ID)) {
738// EventBus.getDefault().post(new Event.ShowToast(getString(R.string.alarm_ready_for_service)));
739// return;
740// }
741
742
743 if (walletInfoDialog == null) {
744 walletInfoDialog = new CheckUserInformationDialog(this, 0);
745 }
746 walletInfoDialog.setMode(params.getMode());
747 handler.postDelayed(() -> {
748 walletInfoDialog.setLanguage(Parameters.application);
749 walletInfoDialog.show();
750 if (walletInfoDialog.binding.etInputConnectKey != null)
751 handler.postDelayed(() -> Util.showKeyBoard(getApplicationContext(), walletInfoDialog.binding.etInputConnectKey), 1);
752 }, 1);
753 }
754
755 @Subscribe(threadMode = ThreadMode.MAIN)
756 public void setRecommender(Event.SetRecommenderDialog params) {
757 SetRecommenderDialog dialog = new SetRecommenderDialog(getApplicationContext(), params.isBithumb());
758 if (Parameters.getActivity(Parameters.MAIN_ACTIVITY) != null)
759 dialog.setLanguage(Parameters.getActivity(Parameters.MAIN_ACTIVITY));
760 dialog.show();
761 if (dialog.dataBinding.etRecommenderId != null)
762 handler.postDelayed(() -> Util.showKeyBoard(getApplicationContext(), dialog.dataBinding.etRecommenderId), 10);
763 }
764
765
766//############################ Related network method ####################################################################################################
767
768 /**
769 * Network communication thread
770 */
771 public void networkTask() {
772 //Automatically send ping request hourly
773 ping = io.reactivex.Observable.interval(1, 60, TimeUnit.MINUTES)
774 .doOnNext(l -> {
775 LoginRequest.getInstance().ping();
776 })
777 .subscribeOn(AndroidSchedulers.mainThread())
778 .observeOn(Schedulers.io())
779 .subscribe();
780 disposables.add(ping);
781
782 /**
783 * 해결이 되지 않고 한꺼번에 쌓여있을 때 처리
784 * 줄지 않을 때
785 * TIMEOUT
786 *
787 * -> ex 너무 많이 쌓여있을 경우에 통신 사정이 안좋다고 사용자게 알리기
788 * 네트워크 상태 감시하는게 필요함. 막는게 있음 이 내용도 추가할 것.
789 *
790 * */
791 Scheduler.Worker worker = Schedulers.io().createWorker();
792 worker.schedule(() -> {
793 //통신이 실패했을 경우 3번 반복 하기 위한 count 를 세는 변수
794 int errorCount;
795 for (; ; ) {
796 //해당 통신이 완료 되었는지 여부
797 NetworkManager.Request request = null;
798 try {
799 request = NetworkManager.getRequests().take();
800 } catch (InterruptedException e) {
801 e.printStackTrace();
802 }
803
804 if (request == null) continue;
805 //인증이 필요한데 로그인 되어있지 않은 상태이면 로그인을 요청함
806 if (request.isAuth() && !Parameters.isLogin() && Parameters.isIsAppInForeground()) {
807 EventBus.getDefault().post(new Event.ShowToast(getString(R.string.request_login)));
808 continue;
809 }
810 Call<NetworkPacket> response = NetworkManager.getNetworkManagerServer()
811 .getPostResponse(request.getServerName(), request.isAuth(), request.getNetworkPacket());
812
813 boolean isDone = false;
814 errorCount = 0; //네트워크 통신하기 count 초기화
815 NetworkPacket result;
816 //통신이 실패했을 경우 2번 재 요청을 하기 위해서, 통신을 반복문 안에 넣음
817 while (!isDone) {
818 try {
819 //CrashReport 에 보낼 값
820 Crashlytics.setInt("requestPacket", request.getTAG());
821
822 if (errorCount > ServerUtil.ERROR_REPEAT_COUNT) {
823 isDone = true; //실패 후 3번 요청을 완료 했으면 더이상 진행하지 않음
824 break;
825 }
826 if (request.getTAG() != ServerUtil.TASK_GET_ALL_SOPHY_RUN ||
827 request.getTAG() != ServerUtil.TASK_INIT_USER_INFO) {
828 Log.e("REQUEST", ServerUtil.getNetworkTagName(request.getTAG()) + " : " + gson.toJson(request.getNetworkPacket(), NetworkPacket.class));
829 }
830
831 //이미 통신을 한번 진행했다면, 새롭게 생성해야함
832 if (response.isExecuted()) {
833 response.cancel();
834 response = NetworkManager.getNetworkManagerServer()
835 .getPostResponse(request.getServerName(), request.isAuth(), request.getNetworkPacket());
836 }
837
838 result = response.execute().body();
839
840 if (request.getTAG() != ServerUtil.TASK_GET_ALL_SOPHY_RUN ||
841 request.getTAG() != ServerUtil.TASK_INIT_USER_INFO) {
842 Log.e("RESULT ", ServerUtil.getNetworkTagName(request.getTAG()) + " : " + gson.toJson(result, NetworkPacket.class));
843 }
844
845 ServerUtil.NetworkResult resultMsg;
846 //받아온 값이 없다면 다시 진행할 수 있도록 함
847 if (result == null) {
848 errorCount++;
849 continue;
850 } else {
851 isDone = true; ///통신이 완료 된것이므로 종료
852 }
853 //통신을 성공해서 패킷을 받아왔다면 해당 내용을 파싱함
854 resultMsg = ServerUtil.networkResultMsg(result, request.getTAG(), getResources().getString(R.string.content_network_error_dialog));
855
856 //If request to just login, the validation of authKey is expired.
857 //So this packet should be checked very first time.
858 if (request.getTAG() == ServerUtil.JUST_LOGIN) {
859 if (resultMsg.getRESULT_CODE() == ServerUtil.SUCCESS) {
860 JsonObject attribute = new JsonObject();
861 try {
862 if (result.getContent() != null && result.getContent().getAttributes() != null)
863 attribute = result.getContent().getAttributes().getAsJsonObject();
864 } catch (Exception e) {
865 e.printStackTrace();
866 }
867 Parameters.setAUTHKEY(Util.parsingJsonToString(attribute, "AUTHKEY"));
868 Parameters.setMID(Util.parsingJsonToLong(attribute, "MID"));
869 Parameters.setIsLogin(true);
870
871 //Check the user is manger or not
872 if (result.getContent().getAttributes().getAsJsonObject().get("MANAGER") != null) {
873 Parameters.setIsManager(Util.parsingJsonToInteger(result.getContent().getAttributes().getAsJsonObject(), "MANAGER") > 0);
874 }
875
876 if (!NetworkManager.getTempRequests().isEmpty()) {
877 NetworkManager.getRequests().addAll(NetworkManager.getTempRequests());
878 NetworkManager.getTempRequests().clear();
879 }
880
881 //If login request is finished, we don't need to add request in tempRequests
882 //because there are not requests to proceed very first time
883 NetworkManager.setIsBlocking(false);
884
885 break;
886 } else {
887 //CrashReport 에 보낼 오류 값
888 Crashlytics.setString("resultPacket", request.getTAG() + " : " + result.getHeader().getError());
889
890 String noticeMsg = "";
891 switch (resultMsg.getRESULT_CODE()) {
892 //유효하지 않은 앱
893 case ServerUtil.ERROR_INFO_EMPTY:
894 noticeMsg = getResources().getString(R.string.invalid_app);
895 break;
896
897 //현재 서비스 중이 아닙니다. 잠시후에 다시 시도하시기 바랍니다. (서비스 안되는 시간 알려주면 좋을 것 같음)
898 case ServerUtil.ERROR_INFO_INVALID:
899 noticeMsg = getResources().getString(R.string.server_test);
900 noticeDialog.setMode(ServerUtil.ERROR_INFO_INVALID); //앱 종료 시킬 것
901 break;
902
903 //가입되어 있지 않은 유저라면, 로그인 화면으로 이동, 본 액티비티는 종료
904 case ServerUtil.ERROR_DATA_EMPTY:
905 // noticeMsg = getResources().getString(R.string.forced_update_app);
906 // noticeDialog.setMode(ServerUtil.ERROR_DATA_EMPTY);
907 break;
908
909 //현재 버전이 스토어 버전보다 낮을 경우 강제 업데이트
910 case ServerUtil.ERROR_ARGUMENT_INVALID:
911 try {
912 noticeMsg = getResources().getString(R.string.forced_update_app);
913 JsonObject attribute = new JsonObject();
914 if (result.getContent() != null && result.getContent().getAttributes() != null)
915 attribute = result.getContent().getAttributes().getAsJsonObject();
916 noticeDialog.setMode(ServerUtil.ERROR_ARGUMENT_INVALID, attribute.get("MESSAGE").toString());
917 } catch (Exception e) {
918 e.printStackTrace();
919 }
920 break;
921
922 //DB 오류로 가입이나 로그인이 불가능한 경우
923 case ServerUtil.ERROR_DB_MEMBER:
924 noticeMsg = getResources().getString(R.string.server_test) + "\n " + String.valueOf(ServerUtil.ERROR_DB_MEMBER);
925 break;
926
927 //다른 기기에서 로그인 중일 경우
928 case ServerUtil.ERROR_DATA_INVALID:
929 if (Parameters.isIsAppInForeground()) {
930 noticeMsg = getResources().getString(R.string.change_device);
931 noticeDialog.setOneOrTwoButton(true);
932 }
933 break;
934 }
935 if (noticeMsg.length() > 0) {
936 noticeDialog.setContents(noticeMsg);
937 //pw가 틀렸을 경우 mode 값을 바꿔서 넣어 주기 위해서
938 noticeDialog.setMode(resultMsg.getRESULT_CODE() == (ServerUtil.ERROR_DATA_INVALID) ? ServerUtil.ERROR_PW_INVALID : resultMsg.getRESULT_CODE());
939 showDialog(noticeDialog);
940 }
941 break;
942 }
943 }
944
945 switch (resultMsg.getRESULT_CODE()) {
946
947 //공통 오류 코드 처리
948 case ServerUtil.ERROR_SERVER_INVALID: //인증코드가 만료 되었을 경우
949 //If the server is under testing, the app should be stopped.
950 //It will be implemented in BaseActivity.
951 if (request.getTAG() == ServerUtil.TASK_ADD_SOPHY_RUN
952 || request.getTAG() == ServerUtil.TASK_ADD_SOPHY_AUTO
953 || request.getTAG() == ServerUtil.TASK_ADD_SECTION_ORDER
954 ) {
955 EventBus.getDefault().post(new Event.ResultOfRequest(request.getTAG(), resultMsg, request.getNetworkPacket(), result));
956 } else {
957 EventBus.getDefault().post(NetworkEvent.serverStoppedOrUpdated());
958 }
959 break;
960
961 //if the auth key is expired, request login again
962 case ServerUtil.ERROR_AUTH_KEY_INVALID:
963 case ServerUtil.ERROR_PKID_ORDER:
964 if (WalletStorage.getInstance(getApplicationContext()).isWalletAvailable() &&
965 //If already requested just login, another request already blocked due to authKey,
966 //There is no request to call login
967 !NetworkManager.isIsBlocking() &&
968 request.getTAG() != ServerUtil.JUST_LOGIN &&
969 request.getTAG() != ServerUtil.TASK_USER_LOGOUT) {
970
971 if (request.getTAG() != ServerUtil.TASK_PING) {
972 //If user has the wallet, request to login
973 LoginRequest.getInstance().justLogin();
974 //If the authKey is invalid, another requests which are needed authKey can't be executed
975 //So block the requests and then get the auth key by justLoginRequest
976 NetworkManager.setIsBlocking(true);
977 //After receiving valid authKey by justLoginRequest, it will be executed very first time.
978 //And this request will be added in tempRequests because networkManager is blocked
979 NetworkManager.addTopPriority(request.getTAG(), request.getServerName(), request.isAuth(), request.getNetworkPacket());
980 }
981// else{
982// Util.refreshData();
983// }
984 }
985 //TODO : If user doesn't have the wallet, we need to request to login again by the dialog
986 else {
987
988 }
989 Log.e("auth_key_invalid", gson.toJson(request) + " : " + gson.toJson(request.getNetworkPacket()));
990 break;
991
992 //update trade or tansaction
993 case ServerUtil.ERROR_DB_USER:
994 Log.e("duplication to call", "has to fix");
995 break;
996
997 //errorCode 가 Success 이거나, 해당 내용이 요청한 곳에서 처리돼야 할 경우
998 //결과를 이벤트로 전송
999 default:
1000 if (request.getPriority() == NetworkManager.REQUEST_BY_MONITORING)
1001 EventBus.getDefault().post(new Event.ResultOfRequestByService(request.getTAG(), resultMsg, request.getNetworkPacket(), result));
1002 else
1003 EventBus.getDefault().post(new Event.ResultOfRequest(request.getTAG(), resultMsg, request.getNetworkPacket(), result));
1004 break;
1005
1006 }
1007 break; //정보를 받아왔으므로, 본 Request 에 대한 통신은 종료함
1008 }
1009// catch (SocketTimeoutException e){
1010// EventBus.getDefault().post(new Event.ShowToast(getString(R.string.no_netwrok)));
1011// }
1012 catch (Exception e) {
1013 e.printStackTrace();
1014 Log.e("Exception", ServerUtil.getNetworkTagName(request.getTAG()) + " : " + e.toString());
1015 errorCount++;
1016 }
1017 }
1018 }
1019 });
1020 }
1021
1022 /**
1023 * 유저가 언어 정보 등록 안했으면, 한국어로 기본 갱신해줌
1024 * 회원 가입 후 상황에서 넣어줄 것
1025 */
1026 public void setLanguage(String language) {
1027 JsonArray items = new JsonArray();
1028 Parameters.setLanguage(language);
1029 spHelper.setValue(SharedPreferencesHelper.USER_INFO, "LANGUAGE", language);
1030 // 서버에 저장된 언어가 없어서 새로 저장해줄때만 서버로 보내면 됨. 서버언어와 쉐어드 언어가 달라서 서버언어로 다시 세팅해줄땐 서버로 다시 보낼필요 없을거같음. 나중에 확인해보기
1031 items.add(gson.toJsonTree(new NetworkPacket.Item("USER", "LANGUAGE", language)));
1032 LoginRequest.getInstance().setUserPrivateData(items);
1033 }
1034
1035//############################Initialized method ####################################################################################################
1036
1037 /**
1038 * SciChart Key
1039 */
1040 private void setSciChartLicense() {
1041 try {
1042 com.scichart.charting.visuals.SciChartSurface.setRuntimeLicenseKey(
1043 "<LicenseContract>" +
1044 "<Customer>CRP</Customer>" +
1045 "<OrderId>ABT180725-9721-45118</OrderId>" +
1046 "<LicenseCount>1</LicenseCount>" +
1047 "<IsTrialLicense>false</IsTrialLicense>" +
1048 "<SupportExpires>07/25/2019 00:00:00</SupportExpires>" +
1049 "<ProductCode>SC-ANDROID-2D-ENTERPRISE-SRC</ProductCode>" +
1050 "<KeyCode>3ed76e83a9a26e8da4a3a3d1e9e77933c248cfb8e434014a5003f66b1c853eef0579036b1f84d7d4a58c28686b5cbfdc78b4a87456a1c5848bd13212d63a02b0f9203d2f7e59d6879b69430a0dd30ed7040239d30ee8ba5caf67b2050aed30c7a53a17145bb93c5e74d65cdf8b51ca7bdca27d5e9631abd951795b230b4ebfdc4687853fd9953f79364237abea2982ec5c004f3e998b6e6656a2abd0d61783141d5ea1fad40a88da8a8f47</KeyCode>" +
1051 "</LicenseContract>"
1052 );
1053 } catch (Exception e) {
1054 e.printStackTrace();
1055 }
1056 }
1057
1058 /**
1059 * 거래소 정보 입력을 완료 하고, 해당 정보의 유효성 체크를 요청했을 경우
1060 */
1061 @Subscribe(threadMode = ThreadMode.MAIN)
1062 public void registerWalletInfo(CheckUserInformationDialog.WalletInputDialogEvent inputDialogEvent) {
1063
1064 String apiKey = inputDialogEvent.getConnectKey();
1065 String secretKey = inputDialogEvent.getSecretKey();
1066
1067 switch (inputDialogEvent.getExchangeId()) {
1068 case Parameters.BITHUMB_ID:
1069 Parameters.getExchangeUtil(Parameters.BITHUMB_ID).setApiKeyUnEncrypted(apiKey, secretKey);
1070 BithumbRequest.getInstance().setBithumbResponseListener(new BithumbResponseListener() {
1071 @Override
1072 public void getAccountInfo(BitAccountResponse response) {
1073 EventBus.getDefault().post(new Event.ShowToast(getString(R.string.set_wallet_info_success)));
1074 //다이얼로그 창 종료
1075 if (walletInfoDialog != null && walletInfoDialog.isShowing())
1076 walletInfoDialog.dismiss();
1077
1078 EventBus.getDefault().post(new Event.ResultRegisterExchangeKey(inputDialogEvent.getMode()));
1079 //등록된 지갑정보를 서버에 전송함
1080 TradingRequest.getInstance().setWalletInfo();
1081 BithumbRequest.getInstance().getWalletInfoDemo("");
1082
1083 CrpPasswordManager.getInstance()
1084 .initKeys(getApplicationContext(),
1085 Parameters.getExchangeUtil(Parameters.BITHUMB_ID).getApiKeyEncrypted(),
1086 Parameters.getExchangeUtil(Parameters.BITHUMB_ID).getSecretKeyEncrypted(),
1087 Parameters.BITHUMB_ID,
1088 String.valueOf(Parameters.getMID().get()));
1089
1090 }
1091
1092
1093 @Override
1094 public void errorData(String status, String message) {
1095 if (Integer.valueOf(status) == BithumbUtil.INVALID_APIKEY) {
1096 handler.postDelayed(() -> {
1097 EventBus.getDefault().post(new Event.ShowToast(getString(R.string.set_wallet_info_fail) + message));
1098 }, 1);
1099 CrpPasswordManager.getInstance()
1100 .clearKeys(getApplicationContext(), Parameters.BITHUMB_ID);
1101 Parameters.getExchangeUtil(Parameters.BITHUMB_ID).clearApiKeys();
1102 }
1103 }
1104 });
1105 BithumbRequest.getInstance().checkWalletInfoDemo();
1106 break;
1107
1108 case Parameters.BINANCE_ID:
1109 Parameters.getExchangeUtil(Parameters.BINANCE_ID).setApiKeyUnEncrypted(apiKey, secretKey);
1110 BinanceRequest.getInstance().getAccount()
1111 .subscribeOn(Schedulers.io())
1112 .observeOn(AndroidSchedulers.mainThread())
1113 .subscribe(response -> {
1114
1115 Parameters.getExchangeUtil(Parameters.BINANCE_ID).setAsVerified(true);
1116
1117 EventBus.getDefault().post(new Event.ShowToast(getString(R.string.set_wallet_info_success)));
1118 //다이얼로그 창 종료
1119 if (walletInfoDialog != null && walletInfoDialog.isShowing()) {
1120 walletInfoDialog.dismiss();
1121// BinanceUtil.setKey(BinanceUtil.getApiKey(), BinanceUtil.getSecretKey());
1122 CrpPasswordManager.getInstance()
1123 .initKeys(getApplicationContext(),
1124 Parameters.getExchangeUtil(Parameters.BINANCE_ID).getApiKeyEncrypted(),
1125 Parameters.getExchangeUtil(Parameters.BINANCE_ID).getSecretKeyEncrypted(),
1126 Parameters.BINANCE_ID,
1127 String.valueOf(Parameters.getMID().get()));
1128 }
1129 EventBus.getDefault().post(new Event.ResultRegisterExchangeKey(inputDialogEvent.getMode()));
1130 //등록된 지갑정보를 서버에 전송함
1131 TradingRequest.getInstance().setWalletInfo();
1132 BinanceRequest.getInstance().getAccount(null);
1133 System.out.println(response.toString());
1134 }, error -> {
1135 Log.e("error", " : " + error.getMessage());
1136
1137 String message = Parameters.getExchangeName(inputDialogEvent.getExchangeId()) + " " + getString(R.string.set_wallet_info_fail);
1138
1139// BinanceUtil.clearApiKey();
1140 CrpPasswordManager.getInstance()
1141 .clearKeys(getApplicationContext(), Parameters.BINANCE_ID);
1142 if (error.getMessage().contains("API-key format invalid.")) {
1143 message = getString(R.string.invalid_binance_api_warning);
1144 } else if (error.getMessage().contains("Unexpected char")) {
1145 message = getString(R.string.invalid_binance_api_warning);
1146 }
1147
1148 EventBus.getDefault().post(new Event.ShowToast(message));
1149 Parameters.getExchangeUtil(Parameters.BINANCE_ID).clearApiKeys();
1150 });
1151
1152 break;
1153 }
1154
1155 }
1156
1157 /**
1158 * Stetho, Twitter, Fabric, FCM 구독
1159 */
1160 private void setLibrary() {
1161 //Stetho 초기화
1162 Stetho.initialize(Stetho.newInitializerBuilder(this)
1163 .enableWebKitInspector(Stetho.defaultInspectorModulesProvider(this))
1164 .build());
1165
1166 //트위터 초기화
1167 TwitterConfig twitterConfig = new TwitterConfig.Builder(this)
1168 .logger(new DefaultLogger(Log.DEBUG))
1169 .twitterAuthConfig(new TwitterAuthConfig(getResources().getString(R.string.com_twitter_sdk_android_CONSUMER_KEY),
1170 getResources().getString(R.string.com_twitter_sdk_android_CONSUMER_SECRET)))
1171 .debug(true)
1172 .build();
1173 Twitter.initialize(twitterConfig);
1174 new Thread(TweetUi::getInstance).start();
1175
1176 //Fabric 초기화
1177 //디버깅 모드가 아닐 경우에만 crashReport 추가
1178 Crashlytics crashlyticsKit = new Crashlytics.Builder()
1179 .core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
1180 .build();
1181 Fabric.with(this, crashlyticsKit);
1182
1183 //FCM 구독
1184 FirebaseApp.initializeApp(this);
1185 FirebaseMessaging.getInstance().subscribeToTopic("news");
1186
1187 //API 26 부터는 NotificationChannel 을 생성하지 않으면, 알림이 오지 않으므로 반드시 설정해줘야함.
1188 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
1189 NotificationManager.createChannel(this);
1190 }
1191
1192// if (BuildConfig.DEBUG) {
1193// //메모리 누수 체킹하는 라이브러리 추가
1194// if (LeakCanary.isInAnalyzerProcess(this)) {
1195// return;
1196// }
1197// LeakCanary.install(this);
1198// }
1199
1200 setSciChartLicense();
1201 }
1202
1203 /**
1204 * For checking the change about language
1205 */
1206// @Override
1207// public void onConfigurationChanged(Configuration newConfig) {
1208// super.onConfigurationChanged(newConfig);
1209// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
1210// Log.e("setLanguage", " : onConfigurationChanged" + newConfig.getLocales().toLanguageTags());
1211// }
1212// }
1213
1214
1215 /**
1216 * For checking the change about language
1217 */
1218 @Override
1219 protected void attachBaseContext(Context base) {
1220 if (Parameters.application == null) Parameters.application = base;
1221 super.attachBaseContext(base);
1222 MultiDex.install(this);
1223 }
1224
1225 @Override
1226 public void onConfigurationChanged(Configuration newConfig) {
1227 super.onConfigurationChanged(newConfig);
1228 LocaleHelper.setLocale(this);
1229 }
1230
1231 @Override
1232 public void onLowMemory() {
1233 super.onLowMemory();
1234 }
1235
1236 /**
1237 * 통신을 통해 받아온 정보를 set 해줌
1238 * 구매한 상품목록을 가져온 후, 미체결 내용이 있은지 확인 함
1239 * Parsing InitUserInformation contents
1240 */
1241 public void initUserInfo(NetworkPacket result) {
1242
1243 ArrayList<ServerUtil.NetworkResult> resultMsgs;
1244 JsonArray contents;
1245 NetworkPacket.Content content;
1246 int TAG = ServerUtil.TASK_INIT_USER_INFO;
1247 ArrayList<String> errorPackets = new ArrayList<>();
1248 String language = "";
1249 contents = result.getContents();
1250
1251 for (JsonElement element : contents) {
1252 content = gson.fromJson(element.getAsJsonObject(), NetworkPacket.Content.class);
1253
1254 switch (content.getpName()) {
1255
1256 //유저 개인 정보
1257 case LoginRequest.GET_USER_PRIVATE_DATA:
1258 NetworkPacket.Item item;
1259 JsonParser parser = new JsonParser();
1260
1261 for (JsonElement userInfoElement : content.getItems()) {
1262 item = gson.fromJson(userInfoElement.getAsJsonObject(), NetworkPacket.Item.class);
1263 JsonObject attributes = parser.parse((userInfoElement.getAsJsonObject().get("ATTR").getAsString())).getAsJsonObject();
1264 item.setATTR(attributes);
1265 //Setting user privateData
1266 if (item.TYPE.equals("USER")) {
1267 switch (item.NAME) {
1268 default:
1269 spHelper.setValue(SharedPreferencesHelper.USER_INFO, item.NAME, item.VALUE);
1270 switch (item.NAME) {
1271 case "NAME": //It it isn't use anywhere.
1272 Parameters.NAME = item.VALUE;
1273 break;
1274 case "GENDER": //For setting the value in userInfoView.
1275 Parameters.GENDER = Integer.parseInt(item.VALUE);
1276 break;
1277 case "LANGUAGE":
1278 language = item.VALUE;
1279 if (!Parameters.language.get().equals(language))
1280 setLanguage(language);
1281 break;
1282 case "BIRTHDATE":
1283 Parameters.BIRTHDATE = item.VALUE;
1284 break;
1285 case "BIRTHNATION_CODE": //태어난 국가
1286 Parameters.BIRTHNATION_CODE = item.VALUE;
1287 SharedPreferencesHelper.getInstance().setValue(SharedPreferencesHelper.USER_INFO,
1288 "BIRTHNATION", item.VALUE);
1289 break;
1290 case "LOCALNATION": //살고 있는 지역
1291 Parameters.LOCALNATION_CODE = item.VALUE;
1292 SharedPreferencesHelper.getInstance().setValue(SharedPreferencesHelper.USER_INFO,
1293 "LOCALNATION", item.VALUE);
1294 break;
1295 case "SOPHYRUN": //예측알람
1296 Log.v("item SOPHYRUN : ", item.VALUE);
1297 Parameters.setIsWatch(item.VALUE.equals(Parameters.ALARM_ON));
1298 break;
1299 case "AUTOORDER": //자동주문알람
1300 Log.v("item AUTOORDER : ", item.VALUE);
1301
1302 Parameters.setIsAuto(item.VALUE.equals(Parameters.ALARM_ON));
1303 break;
1304 }
1305 break;
1306 //숫자로 저장해야 하는 값 Gender, level
1307 case "LEVEL":
1308 spHelper.setValue(SharedPreferencesHelper.USER_INFO, item.NAME, Integer.valueOf(item.VALUE));
1309 break;
1310 }
1311 } else if (item.TYPE.equals("RECOMMENDER")) {
1312 switch (item.NAME) {
1313 case "NAME":
1314 Parameters.setRecommenderId(item.VALUE);
1315 break;
1316 }
1317 } else if (item.TYPE.equals("PUSH")) {
1318 if (item.NAME.equals("OPTION")) {
1319 Parameters.setIsWatch(item.getATTR().get("SOPHYRUN").getAsString().equals(Parameters.ALARM_ON));
1320 Parameters.setIsAuto(item.getATTR().get("AUTOORDER").getAsString().equals(Parameters.ALARM_ON));
1321 }
1322 }
1323 }
1324 if (!Application.isIsLoaded() && content.getItems().size() > 0) {
1325 EventBus.getDefault().post(SettingEvent.refreshEvent());
1326 Application.setIsLoaded(true);
1327 }
1328
1329 break;
1330 case SophyRunRequest.GET_ALL_SOPHY_RUN:
1331 //Parsing the sophyRunItem
1332 SophyRunData.parsingSophyRunItems(result);
1333 break;
1334 //Set userApiKey value
1335 case TradingRequest.GET_WALLET_INFO:
1336 JsonObject object = content.getAttributes().getAsJsonObject();
1337 Log.e("get_wallet_info", " sss: " + gson.toJson(object) + " : " + Util.parsingJsonToString(object, "ECID"));
1338
1339 switch (Util.parsingJsonToString(object, "ECID")) {
1340 case Parameters.BITHUMB_ID:
1341 Log.e("get_wallet_info", " parsing : BITHUMB_ID" + gson.toJson(object));
1342 //암호화 된 apiKey, secretKey 를 저장
1343 Parameters.getExchangeUtil(Parameters.BITHUMB_ID).setApiKeyEncrypted(
1344 Util.parsingJsonToString(object, "APIKEY"), Util.parsingJsonToString(object, "SECRETKEY"));
1345 //빗썸 API 초기화
1346 CrpPasswordManager.getInstance()
1347 .initKeys(getApplicationContext(),
1348 Parameters.getExchangeUtil(Parameters.BITHUMB_ID).getApiKeyEncrypted(),
1349 Parameters.getExchangeUtil(Parameters.BITHUMB_ID).getSecretKeyEncrypted(),
1350 Parameters.BITHUMB_ID,
1351 String.valueOf(Parameters.getMID().get()));
1352
1353 BithumbRequest.getInstance().setUserInfo();
1354 BithumbRequest.getInstance().setBithumbResponseListener(new BithumbResponseListener() {
1355 @Override
1356 public void getAccountInfo(BitAccountResponse response) {
1357
1358 }
1359
1360 @Override
1361 public void errorData(String status, String message) {
1362 if (!TextUtils.isEmpty(status) && Integer.valueOf(status) == BithumbUtil.INVALID_APIKEY) {
1363 handler.postDelayed(() -> {
1364 EventBus.getDefault().post(new Event.ShowToast(getString(R.string.set_wallet_info_fail) + message));
1365 }, 1);
1366 Parameters.getExchangeUtil(Parameters.BITHUMB_ID).clearApiKeys();
1367 }
1368 }
1369 });
1370 BithumbRequest.getInstance().checkWalletInfoDemo();
1371 break;
1372 case Parameters.UPBIT_ID:
1373 break;
1374
1375 case Parameters.BINANCE_ID:
1376 Parameters.getExchangeUtil(Parameters.BINANCE_ID).setApiKeyEncrypted(object.get("APIKEY").getAsString(), object.get("SECRETKEY").getAsString());
1377 BinanceRequest.getInstance().getAccount(null);
1378 CrpPasswordManager.getInstance()
1379 .initKeys(getApplicationContext(),
1380 Parameters.getExchangeUtil(Parameters.BINANCE_ID).getApiKeyEncrypted(),
1381 Parameters.getExchangeUtil(Parameters.BINANCE_ID).getSecretKeyEncrypted(),
1382 Parameters.BINANCE_ID,
1383 String.valueOf(Parameters.getMID().get()));
1384 /**If user has the wallet
1385 * 1. check the balance of token
1386 * 2. check the */
1387 if (!WalletStorage.getInstance(getApplicationContext()).get().isEmpty()) {
1388 FullWallet fullWallet = WalletStorage.getInstance(getApplicationContext()).get().get(0);
1389 EthWalletManager.getInstance(getApplicationContext())
1390 .getEtherTokenBalance(fullWallet)
1391 .observeOn(AndroidSchedulers.mainThread())
1392 .subscribe(map -> {
1393 double tokenAmount = map.get("token");
1394 double userTokenBalanceInDollar = CurrencyData.getPrice(tokenAmount *
1395 EthWalletManager.getInstance(getApplicationContext()).htnTokenPrice.get().doubleValue(), Parameters.BTC_ID, Parameters.CURRENCY_USD);
1396 Config.setHtnBalance(userTokenBalanceInDollar);
1397 /**default is 1,000*/
1398 double availableValue = Config.DEFAULT_AMOUNT_AO;
1399 /**If user has the htnToken, available amount will be multiply 100*/
1400 if (userTokenBalanceInDollar * Config.MULTIPLY_VALUE > Parameters.getTotalAmount().get()) {
1401 availableValue = userTokenBalanceInDollar * Config.MULTIPLY_VALUE;
1402 Parameters.setTotalAmountByHtn(availableValue);
1403 }
1404
1405 /**update the totalValue from exchange*/
1406 if (Parameters.getExchangeID().equals(Parameters.BINANCE_ID) &&
1407 Parameters.getExchangeUtil().hasApiKey()) {
1408 double finalAvailableValue = availableValue;
1409 BinanceRequest.getInstance().getMarketValues()
1410 .subscribeOn(Schedulers.io())
1411 .observeOn(AndroidSchedulers.mainThread())
1412 .subscribe(results -> {
1413 double totalValue = 0;
1414 for (AssetBalance balance : results) {
1415 totalValue += CurrencyData.getPrice(Double.parseDouble(balance.getFree()), balance.getAsset(), Parameters.CURRENCY_USD);
1416 Parameters.getExchangeUtil().addBalance(balance.getAsset(), Double.parseDouble(balance.getFree()));
1417 }
1418 /**If user has the balance is lower than total amount, update the total amount*/
1419 if (finalAvailableValue > totalValue)
1420 Parameters.setTotalAmount(totalValue);
1421 else
1422 Parameters.setTotalAmount(finalAvailableValue);
1423 }, error -> {
1424 });
1425 } else {
1426 Parameters.setTotalAmount(availableValue);
1427 }
1428 }, error -> {
1429 });
1430 if (Parameters.isLogin())
1431 SophyRunRequest.getInstance().getAutoOrderPrice();
1432 }
1433 break;
1434 }
1435 break;
1436
1437
1438 //The list of order by our app (Manual)
1439 case TradingRequest.GET_TRADE:
1440 //Log.e("getTrade", " : " + gson.toJson(content));
1441 TradeData.parsingTradeList(content.getItems());
1442 //If the list of trade, request to transactions from our server
1443 if (TradeData.hasTradingList()) TradingRequest.getInstance().getTransaction();
1444 break;
1445
1446// //An ordered price by using AO
1447// case SophyRunRequest.GET_AUTO_ORDER_PRICE:
1448// content = gson.fromJson(element.getAsJsonObject(), NetworkPacket.Content.class);
1449// Parameters.USED_AMOUNT.set((int) content.getAttributes().getAsJsonObject().get("PRICE").getAsDouble());
1450// break;
1451
1452 //The list of product which we sell
1453 case ProductRequest.GET_PRODUCT:
1454 ProductData.parsingProductItems(content.getItems());
1455 break;
1456 //The list of product which user bought
1457 case ProductRequest.GET_PURCHASE:
1458 //Log.e("purchase", " : " + gson.toJson(content.getItems(), JsonArray.class));
1459 ProductData.parsingPurchasedList(content.getItems());
1460 break;
1461
1462 //The list of function which is followed user purchasing
1463 case ProductRequest.GET_MY_PRODUCT:
1464 content = gson.fromJson(element.getAsJsonObject(), NetworkPacket.Content.class);
1465 ProductData.parsingMyProductItems(content.getItems());
1466 break;
1467
1468
1469 }
1470 }
1471
1472 resultMsgs = ServerUtil.networkResultMsgs(getApplicationContext(), result, TAG, getString(R.string.content_network_error_dialog));
1473
1474 for (int i = 0; i < resultMsgs.size(); i++) {
1475 //오류가 생긴 통신에 한해서 재통신을 진행하기 위해서
1476 if (resultMsgs.get(i).getRESULT_CODE() != ServerUtil.SUCCESS)
1477 errorPackets.add(contents.get(i).getAsJsonObject().get("PNAME").toString());
1478 }
1479
1480 //오류가 있어 받아오지 못한 정보가 있다면, 개별적으로 통신 해 볼 것
1481 if (errorPackets.size() > 0) {
1482 for (String pName : errorPackets) {
1483 switch (pName) {
1484 case LoginRequest.GET_USER_PRIVATE_DATA:
1485 LoginRequest.getInstance().getUserPrivateData();
1486 break;
1487 case TradingRequest.GET_WALLET_INFO:
1488 TradingRequest.getInstance().getWalletInfo(false);
1489 break;
1490 case SophyRunRequest.GET_ALL_SOPHY_RUN:
1491 SophyRunRequest.getInstance().getAllSophyRun();
1492 case ProductRequest.GET_PURCHASE:
1493 break;
1494 }
1495 }
1496 }
1497
1498 if (language.length() == 0) setLanguage(Parameters.getLanguage().get());
1499 }
1500
1501 private void showDialog(Dialog dialog) {
1502 handler.postDelayed(() -> dialog.show(), 1);
1503 }
1504
1505 /**
1506 * Initialize the values stored in SharedPreferences that must be set before the app runs.
1507 */
1508
1509
1510 private void initParameters() {
1511
1512 Parameters.APP_ID = "com.heartnumber.andriod";
1513 ServerUtil.LOGIN_TYPE = ServerUtil.HTN_ETH_ADDRESS;
1514 ServerUtil.setServerUrl(Parameters.isTest() ? "http://220.117.149.205:8080/" : "https://htn.srps.xyz/");
1515
1516 /**Initialize the font for using the iconText in app*/
1517 Util.font = Typeface.createFromAsset(getApplicationContext().getAssets(), "fontello.ttf");
1518
1519 Parameters.setPkId();
1520
1521 /** Below value will be used in UserInfoView*/
1522 Parameters.USER_NATION_CODE = Locale.getDefault().getCountry();
1523
1524 /** defaultLanguage : 쉐어드에 저장된 LANGUAGE 값이 없을때 로케일에서 가져오는 언어코드.
1525 * 언어코드가 zh 일 경우에만 간체,번체 구분을 위해 국가코드까지 저장 */
1526 String defaultLanguage = Locale.getDefault().getLanguage();
1527 if(Locale.getDefault().getLanguage().equals(Locale.CHINESE.getLanguage())){
1528 defaultLanguage += "_" + Locale.getDefault().getCountry();
1529 }
1530
1531 /** Set language */
1532 String language = spHelper.getString(SharedPreferencesHelper.USER_INFO, "LANGUAGE",
1533 //If the value is empty, get the default locale value from the device
1534 defaultLanguage);
1535 Parameters.setLanguage(language);
1536
1537 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
1538 Log.e("hello", " : " + getApplicationContext().getResources().getConfiguration().getLocales().toString());
1539 }
1540
1541
1542 /**Set dateFormatter
1543 * 설정한 국가에 따라 기본 날짜값을 변경할 것
1544 * */
1545 String defaultDateFormatter = spHelper.getString(SharedPreferencesHelper.USER_INFO, "DATE_FORMAT", "");
1546 if (defaultDateFormatter.equals("") || defaultDateFormatter == null) {
1547 if (Parameters.getLanguage().get().equals("ko")) {
1548 defaultDateFormatter = "yyyy-MM-dd";
1549 } else {
1550 defaultDateFormatter = "dd-MM-yyyy";
1551 }
1552 }
1553
1554 spHelper.setValue(SharedPreferencesHelper.USER_INFO, "DATE_FORMAT", defaultDateFormatter);
1555
1556 Util.setDateFormat(defaultDateFormatter);
1557
1558
1559 /**Set the changeRate*/
1560 Parameters.setChangeRatePosition(spHelper.getInteger(SharedPreferencesHelper.USER_INFO, "CHANGE_RATE_POSITION", MarketPriceRequest.POSITION_CHANGE_RATE_6H));
1561 Parameters.CHART_PERIOD_POSITION = spHelper.getInteger(SharedPreferencesHelper.USER_INFO, "CHART_PERIOD_POSITION", ChartFragment.POSITION_1W);
1562
1563 /**Set the currency*/
1564 String defualtCurrency = localeToCurrencyKey();
1565 String userCurrency = spHelper.getString(SharedPreferencesHelper.USER_INFO, "CURRENCY", defualtCurrency);
1566 spHelper.setValue(SharedPreferencesHelper.USER_INFO, "CURRENCY", userCurrency);
1567 CurrencyData.setOutputCurrencyKey(userCurrency);
1568
1569 /**Set the theme (color)*/
1570 int color = Parameters.BLACK_THEME;
1571 //color = spHelper.getInteger(SharedPreferencesHelper.USER_INFO, "THEME", Parameters.BLACK_THEME);
1572 Parameters.color = new Parameters.Color(color);
1573
1574 /**Set the exchange and premium.
1575 * These two values cannot be same.*/
1576 String exchange = spHelper.getString(SharedPreferencesHelper.USER_INFO, "EXCHANGE", Parameters.BINANCE_ID);
1577 String market = spHelper.getString(SharedPreferencesHelper.USER_INFO, "MARKET", Parameters.BTC_ID);
1578 Parameters.initExchange(exchange, market);
1579
1580 String pExchange = spHelper.getString(SharedPreferencesHelper.USER_INFO, "P_EXCHANGE", Parameters.BITHUMB_ID);
1581 String pMarket = spHelper.getString(SharedPreferencesHelper.USER_INFO, "P_MARKET", Parameters.KRW_ID);
1582 Parameters.initPremium(pExchange, pMarket);
1583
1584 /**Set the autoOrder value
1585 * If "lossCutTrigger" is zero, the lossCut won't be performed
1586 * User doesn't want to use function of lossCut, the value will be set like "lossCutTrigger == lossCutOrderPer == 0"*/
1587 float lossCutTrigger = spHelper.getFloat(SharedPreferencesHelper.USER_INFO, "AUTO_TRADE_LOSSCUT_PERCENT", 0);
1588 float lossCutRatio = spHelper.getFloat(SharedPreferencesHelper.USER_INFO, "ORDER_PER", 0);
1589 double pricePerOne = (double) spHelper.getFloat(SharedPreferencesHelper.USER_INFO, "PRICE_PER_ONE_AUTOTRADE", Parameters.DEFAULT_AMOUNT);
1590 Parameters.autoTradeSetting = new Parameters.AutoTradeSetting();
1591 Parameters.autoTradeSetting.setStartPercent(spHelper.getInteger(SharedPreferencesHelper.USER_INFO, "AUTO_TRADE_START_PERCENT", 60));
1592 Parameters.autoTradeSetting.setEndPercent(100 - Parameters.autoTradeSetting.getStartPercent());
1593 Parameters.autoTradeSetting.setReachPer(lossCutTrigger);
1594 Parameters.autoTradeSetting.setOrderPer(lossCutRatio);
1595 Parameters.setAoOrderPrice(pricePerOne);
1596 Parameters.setAoOrderPriceCurrency(spHelper.getString(SharedPreferencesHelper.USER_INFO, "AUTO_TRADE_CURRENCY", Parameters.KRW_ID));
1597
1598 /**
1599 * Set the run setting
1600 *
1601 * */
1602 int runType = 0;
1603 int runRange = 0;
1604 int runOrderType = 0;
1605
1606
1607 Parameters.runSetting = new RunSetting(runType, runRange, runOrderType);
1608
1609
1610 /**Set the count of LimitOrderCount*/
1611 if (Parameters.getExchangeIdO().get().equals(Parameters.BINANCE_ID))
1612 Parameters.setLimitOrderCount(spHelper.getInteger(SharedPreferencesHelper.USER_INFO, "LIMIT_ORDER_COUNT_BINANCE", Parameters.DEFAULT_LIMIT_ORDER_COUNT_BINANCE));
1613 else
1614 Parameters.setLimitOrderCount(spHelper.getInteger(SharedPreferencesHelper.USER_INFO, "LIMIT_ORDER_COUNT", Parameters.DEFAULT_LIMIT_ORDER_COUNT));
1615
1616 /**Set the birthDay*/
1617 //Parameters.BIRTHDATE = spHelper.getString(SharedPreferencesHelper.USER_INFO, "BIRTHDATE");
1618
1619 /**Set the gender*/
1620// if (!spHelper.getInteger(SharedPreferencesHelper.USER_INFO, "GENDER"))
1621 //Parameters.GENDER = spHelper.getInteger(SharedPreferencesHelper.USER_INFO, "GENDER", Parameters.GENDER);
1622
1623 setAppParameters();
1624
1625 observingCallBack = new Observable.OnPropertyChangedCallback() {
1626 @Override
1627 public void onPropertyChanged(Observable sender, int propertyId) {
1628 if (sender == Parameters.getExchangeIdO()) {
1629 if (Parameters.getExchangeIdO().get().equals(Parameters.BINANCE_ID))
1630 Parameters.setLimitOrderCount(spHelper.getInteger(SharedPreferencesHelper.USER_INFO, "LIMIT_ORDER_COUNT_BINANCE", Parameters.DEFAULT_LIMIT_ORDER_COUNT_BINANCE));
1631 else
1632 Parameters.setLimitOrderCount(spHelper.getInteger(SharedPreferencesHelper.USER_INFO, "LIMIT_ORDER_COUNT", Parameters.DEFAULT_LIMIT_ORDER_COUNT));
1633 }
1634 }
1635 };
1636
1637 Parameters.setTotalAmount(Config.DEFAULT_AMOUNT_AO);
1638
1639 Parameters.getExchangeIdO().addOnPropertyChangedCallback(observingCallBack);
1640
1641 //If app version is test, remove limit number of prediction/ao.
1642 //if (Parameters.isTest()) Config.PREDICTION_LIMIT = 10000;
1643
1644 Parameters.setBackLinePosition(spHelper.getInteger(SharedPreferencesHelper.USER_INFO, "BACK_LINE_POSITION", 2));
1645 Parameters.setMarketItemViewType(spHelper.getInteger(SharedPreferencesHelper.USER_INFO, "MARKET_ITEM_VIEW_TYPE", OptionEnum.BACK_LINE.ordinal()));
1646
1647 /**get htnToken price from HOTBIT*/
1648 EthWalletManager.getInstance(getApplicationContext()).loadTokenPriceFromHotbit();
1649
1650 Log.e("hello", "start");
1651
1652 }
1653
1654 /**
1655 * App version, code, key (keyStore)
1656 */
1657 private void setAppParameters() {
1658 try {
1659 //현재 사용자가 사용하고 있는 앱의 버전 코드 및 버젼 명
1660 //Gradle 과 Manifest 에 기입되어있는 값으로 체킹함.해당 값을 통해서 강제 업데이트 할 것인지 여부를 알려 줌.
1661 PackageInfo info = getPackageManager().getPackageInfo(
1662 getPackageName(),
1663 PackageManager.GET_SIGNATURES);
1664 for (android.content.pm.Signature signature : info.signatures) {
1665 MessageDigest md = MessageDigest.getInstance("SHA");
1666 md.update(signature.toByteArray());
1667 //Log.e("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
1668
1669 //EventBus.getDefault().post(new Event.ShowToast(Base64.encodeToString(md.digest(), Base64.DEFAULT));
1670 String appKey = Base64.encodeToString(md.digest(), Base64.DEFAULT);
1671 //Parameters.APP_KEY = appKey.substring(0, appKey.length()-2);
1672 Parameters.APP_VER = info.versionCode;
1673 //TODO : 숫자 반드시 변경할 것
1674 //Parameters.APP_VER = 5;
1675 Parameters.APP_VERSION_NAME = info.versionName;
1676
1677 Log.e("APP_KEY", " : " + Parameters.APP_KEY);
1678 //Toast.makeText(getApplicationContext(), Parameters.APP_KEY, Toast.LENGTH_LONG).show();
1679 }
1680 } catch (PackageManager.NameNotFoundException e) {
1681
1682 } catch (NoSuchAlgorithmException e) {
1683
1684 }
1685 }
1686
1687 public String localeToCurrencyKey() {
1688 Locale locale = ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0);
1689 String localeCountry = locale.getCountry();
1690 String defaultCurrencyKey = Parameters.USDT_ID;
1691
1692 switch (localeCountry) {
1693
1694 case "AU": //AUD
1695 CurrencyData.setOutputCurrencyKey("AUD");
1696 defaultCurrencyKey = "AUD";
1697 break;
1698
1699 case "CA": //CAD
1700 CurrencyData.setOutputCurrencyKey("CAD");
1701 defaultCurrencyKey = "CAD";
1702 break;
1703
1704 case "CH": //CHF
1705 CurrencyData.setOutputCurrencyKey("CHF");
1706 defaultCurrencyKey = "CHF";
1707
1708 break;
1709
1710 case "CN": //CNY
1711 CurrencyData.setOutputCurrencyKey("CNY");
1712 defaultCurrencyKey = "CNY";
1713
1714 break;
1715
1716 case "GB": //GBP
1717 CurrencyData.setOutputCurrencyKey("GBP");
1718 defaultCurrencyKey = "GBP";
1719
1720 break;
1721
1722 case "HK": //HKD
1723 CurrencyData.setOutputCurrencyKey("HKD");
1724 defaultCurrencyKey = "HKD";
1725
1726 break;
1727
1728 case "IN": //INR
1729 CurrencyData.setOutputCurrencyKey("INR");
1730 defaultCurrencyKey = "INR";
1731 break;
1732
1733 case "JP": //JPY
1734 CurrencyData.setOutputCurrencyKey("JPY");
1735 defaultCurrencyKey = "JPY";
1736 break;
1737
1738 case "KR": //KRW
1739 CurrencyData.setOutputCurrencyKey("KRW");
1740 defaultCurrencyKey = "KRW";
1741 break;
1742
1743 case "MX": //MXN
1744 CurrencyData.setOutputCurrencyKey("MXN");
1745 defaultCurrencyKey = "MXN";
1746 break;
1747
1748 case "MY": //MYR
1749 CurrencyData.setOutputCurrencyKey("MYR");
1750 defaultCurrencyKey = "MYR";
1751 break;
1752
1753 case "RU": //RUB
1754 CurrencyData.setOutputCurrencyKey("RUB");
1755 defaultCurrencyKey = "RUB";
1756 break;
1757
1758 case "SG": //SGD
1759 CurrencyData.setOutputCurrencyKey("SGD");
1760 defaultCurrencyKey = "SGD";
1761 break;
1762
1763 case "TH": //THB
1764 CurrencyData.setOutputCurrencyKey("THB");
1765 defaultCurrencyKey = "THB";
1766 break;
1767
1768 case "US": //USD
1769 CurrencyData.setOutputCurrencyKey("USD");
1770 defaultCurrencyKey = "USD";
1771 break;
1772
1773 /* case "": //BNB
1774 CurrencyData.setInputCurrencyKey("BNB"); // null 체크해줘야함
1775 break;
1776
1777 case "": //BTC
1778 CurrencyData.setInputCurrencyKey("BTC"); // null 체크해줘야함
1779 break;
1780
1781 case "": //ETH
1782 CurrencyData.setInputCurrencyKey("ETH"); // null 체크해줘야함
1783 break;
1784
1785 case "": //EUR
1786 CurrencyData.setInputCurrencyKey("EUR"); // null 체크해줘야함
1787 break;
1788
1789 case "": //GOLD
1790 CurrencyData.setInputCurrencyKey("GOLD"); // null 체크해줘야함
1791 break;*/
1792 }
1793
1794 return defaultCurrencyKey;
1795 }
1796
1797 /**
1798 * Checking the lifeCycle status for application
1799 * 1. ON_START :
1800 * 1) If the application is reserved to kill, remove it.
1801 * Because user is using this app, we don't need to kill it.
1802 * 2) setIsAppInForeground -> true
1803 * 3) setAppState by eventBus -> false
1804 * 2. ON_STOP :
1805 * 1) setIsAppInForeground -> true
1806 * 2) setAppState by eventBus -> false
1807 * 3) If user are not using this app, reserve to kill it.
1808 * 4) If the currency is checking the update by RxJava, just remove it.
1809 */
1810 @OnLifecycleEvent(Lifecycle.Event.ON_START)
1811 public void onAppForegrounded() {
1812 Log.e("status", "fore");
1813 Parameters.setIsAppInForeground(true);
1814 EventBus.getDefault().post(AppEvent.appState(false));
1815 }
1816
1817 @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
1818 public void onAppBackgrounded() {
1819 Log.e("status", "back");
1820 Parameters.setIsAppInForeground(false);
1821 EventBus.getDefault().post(AppEvent.appState(true));
1822 if (currencyChecking != null) disposables.remove(currencyChecking);
1823
1824 }
1825}