· 5 years ago · Jul 03, 2020, 04:46 AM
1package holidaylife.holidaysc.jp.myholiday.presentation.ui.fragment;
2
3import android.app.Activity;
4import android.content.Intent;
5import android.graphics.Color;
6import android.os.CountDownTimer;
7import android.util.Log;
8import android.util.Pair;
9import android.view.View;
10import android.widget.LinearLayout;
11import android.widget.ListView;
12import android.widget.TextView;
13
14import androidx.annotation.NonNull;
15
16import com.dropbox.core.DbxException;
17import com.dropbox.core.v2.files.CreateFolderResult;
18import com.dropbox.core.v2.files.DeleteResult;
19import com.dropbox.core.v2.files.FileMetadata;
20import com.google.android.gms.auth.api.signin.GoogleSignIn;
21import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
22import com.google.android.gms.auth.api.signin.GoogleSignInClient;
23import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
24import com.google.android.gms.common.api.Scope;
25import com.google.android.gms.tasks.OnCompleteListener;
26import com.google.android.gms.tasks.OnFailureListener;
27import com.google.android.gms.tasks.OnSuccessListener;
28import com.google.android.gms.tasks.Task;
29import com.google.api.client.extensions.android.http.AndroidHttp;
30import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential;
31import com.google.api.client.json.gson.GsonFactory;
32import com.google.api.services.drive.Drive;
33import com.google.api.services.drive.DriveScopes;
34import com.google.api.services.drive.model.About;
35import com.google.api.services.drive.model.File;
36import com.google.api.services.drive.model.FileList;
37import com.google.gson.Gson;
38
39import org.greenrobot.eventbus.EventBus;
40
41import java.io.IOException;
42import java.text.DecimalFormat;
43import java.util.ArrayList;
44import java.util.Calendar;
45import java.util.Collections;
46import java.util.HashMap;
47import java.util.Iterator;
48import java.util.List;
49import java.util.Map;
50import java.util.Objects;
51
52import butterknife.BindView;
53import butterknife.OnClick;
54import holidaylife.holidaysc.jp.myholiday.R;
55import holidaylife.holidaysc.jp.myholiday.common.Consts;
56import holidaylife.holidaysc.jp.myholiday.common.DateUtils;
57import holidaylife.holidaysc.jp.myholiday.common.PreferencesUtlis;
58import holidaylife.holidaysc.jp.myholiday.common.ShowMessage;
59import holidaylife.holidaysc.jp.myholiday.common.Utils;
60import holidaylife.holidaysc.jp.myholiday.data.api.result.TagCreateResult;
61import holidaylife.holidaysc.jp.myholiday.domain.setting.LinkedApp;
62import holidaylife.holidaysc.jp.myholiday.domain.timeline.TagTimeLine;
63import holidaylife.holidaysc.jp.myholiday.presentation.callback.CallBack;
64import holidaylife.holidaysc.jp.myholiday.presentation.eventbus.RefreshTimelineListEvent;
65import holidaylife.holidaysc.jp.myholiday.presentation.presenter.BasePresenter;
66import holidaylife.holidaysc.jp.myholiday.presentation.presenter.SettingLinkPresenter;
67import holidaylife.holidaysc.jp.myholiday.presentation.presenter.SettingTagPresenter;
68import holidaylife.holidaysc.jp.myholiday.presentation.ui.adapter.SettingLinkAdapter;
69import holidaylife.holidaysc.jp.myholiday.presentation.ui.dialog.DialogConfirm;
70import holidaylife.holidaysc.jp.myholiday.presentation.ui.dialog.DialogTimeConfirm;
71import holidaylife.holidaysc.jp.myholiday.presentation.ui.dialog.SynchronizeConfirmDialog;
72import holidaylife.holidaysc.jp.myholiday.presentation.ui.view.SettingLinkView;
73import holidaylife.holidaysc.jp.myholiday.presentation.ui.view.SettingTagView;
74import holidaylife.holidaysc.jp.myholiday.storage.ContentItemModel;
75import holidaylife.holidaysc.jp.myholiday.storage.DataModel;
76import holidaylife.holidaysc.jp.myholiday.storage.DropboxStorage;
77import holidaylife.holidaysc.jp.myholiday.storage.DropboxResultApi;
78import holidaylife.holidaysc.jp.myholiday.storage.LocalStorageUtils;
79import holidaylife.holidaysc.jp.myholiday.storage.dropbox.CreateFolderTask;
80import holidaylife.holidaysc.jp.myholiday.storage.dropbox.DeleteFileTask;
81import holidaylife.holidaysc.jp.myholiday.storage.dropbox.DownloadFileTask;
82import holidaylife.holidaysc.jp.myholiday.storage.dropbox.DropboxClientFactory;
83import holidaylife.holidaysc.jp.myholiday.storage.dropbox.UploadFileTask;
84import holidaylife.holidaysc.jp.myholiday.storage.googledrive.DriveServiceHelper;
85import holidaylife.holidaysc.jp.myholiday.storage.googledrive.GoogleDriveFileHolder;
86import rx.Observable;
87import rx.schedulers.Schedulers;
88
89public class SettingLinkFragment extends BaseFragment implements SettingLinkView, SettingTagView {
90
91 public static final String FRAG_TAG = SettingLinkFragment.class.getSimpleName();
92
93 @BindView(R.id.tv_dropbox_not_connect)
94 TextView tvDropboxNotConnect;
95 @BindView(R.id.tv_dropbox_date)
96 TextView tvDropboxDate;
97 @BindView(R.id.tv_dropbox_last_action)
98 TextView tvDropboxLastAction;
99
100 @BindView(R.id.tv_back_up_google_drive_not_back_up)
101 TextView tvBackupDriveNot;
102 @BindView(R.id.tv_back_up_google_drive_time)
103 TextView tvBackUpDriveTime;
104 @BindView(R.id.tv_back_up_google_drive_default)
105 TextView tvBackUpDriveDefault;
106
107 @BindView(R.id.lout_google_drive)
108 LinearLayout loutGoogleDrive;
109
110 @BindView(R.id.lv_Setting_Link)
111 ListView lvSettingLink;
112 private SettingLinkPresenter settingLinkPresenter;
113 private final int REQUEST_CODE_SIGN_IN = 1001;
114 private DriveServiceHelper mDriveServiceHelper;
115 private boolean isRootExits = false;
116 private LocalStorageUtils localStorageUtils;
117 private List<GoogleDriveFileHolder> listServerFoder = new ArrayList<>();
118 private List<String> listServerFolderName = new ArrayList<>();
119 private boolean isBackup = true;
120 private boolean isGoogleDrive = true;
121 private int countLoading;
122 private SettingLinkAdapter settingLinkAdapter;
123 private DropboxStorage dropboxStorage;
124 private SettingTagPresenter settingTagPresenter;
125 private CallBack callBack;
126 private boolean isNoCooperate = false;
127
128 public SettingLinkFragment() {
129 super();
130 }
131
132 @Override
133 public int getLayoutRes() {
134 return R.layout.fragment_setting_link;
135 }
136
137 @Override
138 public BasePresenter getPresenter() {
139 return null;
140 }
141
142 @Override
143 public void onResume() {
144 super.onResume();
145 if (callBack != null) {
146 callBack.execute();
147 callBack = null;
148 }
149 }
150
151 @Override
152 public void initView() {
153 localStorageUtils = new LocalStorageUtils(getContext());
154 dropboxStorage = new DropboxStorage();
155
156 settingLinkPresenter = new SettingLinkPresenter();
157 settingLinkPresenter.settingLinkView = this;
158 updateBackupDriverUI();
159 updateBackupDropboxUI();
160 settingLinkPresenter.getLinkedAppList();
161 settingTagPresenter = new SettingTagPresenter();
162 settingTagPresenter.settingTagView = this;
163 }
164
165 @Override
166 public void initData() {
167
168 }
169
170 private void updateBackupDropboxUI() {
171 if (PreferencesUtlis.getString(Consts.LINKED_APP_DROPBOX, "").equals("")) {
172 tvDropboxNotConnect.setVisibility(View.VISIBLE);
173 tvDropboxDate.setVisibility(View.GONE);
174 tvDropboxLastAction.setVisibility(View.GONE);
175 } else if (PreferencesUtlis.getString(Consts.LINKED_APP_DROPBOX, "").equals("1")) {
176 tvDropboxNotConnect.setVisibility(View.GONE);
177 tvDropboxDate.setVisibility(View.GONE);
178 tvDropboxLastAction.setVisibility(View.VISIBLE);
179 tvDropboxLastAction.setText(getString(R.string.content_back_up_not_synchronize));
180
181 } else {
182 tvDropboxNotConnect.setVisibility(View.GONE);
183 tvDropboxDate.setVisibility(View.VISIBLE);
184 tvDropboxDate.setText(PreferencesUtlis.getString(Consts.LINKED_APP_DROPBOX, ""));
185 tvDropboxLastAction.setVisibility(View.VISIBLE);
186 tvDropboxLastAction.setText(getString(R.string.content_back_up_synchronized));
187 }
188 }
189
190 private void updateBackupDriverUI() {
191 if (PreferencesUtlis.getString(Consts.LINKED_APP_DRIVER, "").equals("")) {
192 tvBackUpDriveDefault.setVisibility(View.VISIBLE);
193 tvBackUpDriveTime.setVisibility(View.GONE);
194 tvBackupDriveNot.setVisibility(View.GONE);
195 } else if (PreferencesUtlis.getString(Consts.LINKED_APP_DRIVER, "").equals("1")) {
196 tvBackUpDriveDefault.setVisibility(View.GONE);
197 tvBackUpDriveTime.setVisibility(View.GONE);
198 tvBackupDriveNot.setVisibility(View.VISIBLE);
199 tvBackupDriveNot.setText(getString(R.string.content_back_up_not_synchronize));
200 } else {
201 tvBackUpDriveDefault.setVisibility(View.GONE);
202 tvBackUpDriveTime.setVisibility(View.VISIBLE);
203 tvBackUpDriveTime.setText(PreferencesUtlis.getString(Consts.LINKED_APP_DRIVER, ""));
204 tvBackupDriveNot.setVisibility(View.VISIBLE);
205 tvBackupDriveNot.setText(getString(R.string.content_back_up_synchronized));
206 }
207 }
208
209 @OnClick(R.id.layout_dropbox)
210 public void clickLayoutDropbox() {
211// requestSignOut();
212
213 String tokenDropbox = PreferencesUtlis.getString(Consts.LINKED_APP_DROPBOX, "");
214 if (tokenDropbox.isEmpty()) {
215 showLoading();
216 DropboxStorage.login(this.getContext());
217 callBack = new CallBack() {
218 @Override
219 public void execute() {
220 String token = DropboxStorage.getToken();
221 dropboxStorage.initClient(token);
222 if (token != null) {
223 PreferencesUtlis.putString(Consts.LINKED_APP_DROPBOX, "1");
224 PreferencesUtlis.putString(Consts.TOKEN_DROPBOX, token);
225 updateBackupDropboxUI();
226 }
227 hideLoading();
228 }
229 };
230 } else {
231 onDropboxConfirmOption();
232 }
233 }
234
235 private void onDropboxConfirmOption() {
236 SynchronizeConfirmDialog.getInstance(new SynchronizeConfirmDialog.ConfirmListener() {
237 @Override
238 public void onCancel() {
239
240 }
241
242 @Override
243 public void onBackup() {
244 showLoading();
245 isBackup = true;
246 onDropboxSynchronize();
247 }
248
249 @Override
250 public void onRestore() {
251 showLoading();
252 isBackup = false;
253 onDropboxSynchronize();
254 }
255 }, getResources().getString(R.string.content_dialog_dropbox_back_up), getResources().getString(R.string.content_dialog_dropbox_restore)).show(getFragmentManager(), "SynchronizeConfirmDialog");
256 }
257
258 private void onDropboxSynchronize() {
259 new DownloadFileTask(getContext(), DropboxClientFactory.getClient(), new DownloadFileTask.Callback() {
260 @Override
261 public void onDownloadComplete(java.io.File result) {
262 checkJsonDropbox();
263 }
264
265 @Override
266 public void onError(Exception e) {
267 if (e.getMessage().contains("not_found") || e.getMessage().contains("No address")) {
268 uploadAllData2Dropbox(readJsonLocalFile());
269 }
270 }
271 }).execute(Consts.LocalStorage.TEMP_JSON_FOLDER_NAME, Consts.LocalStorage.JSON_FILE_NAME, "/" + Consts.LocalStorage.JSON_FILE_NAME);
272 }
273
274 private void checkJsonDropbox() {
275 DataModel serverDataModel = readJsonLocalFile(Consts.LocalStorage.TEMP_JSON_FOLDER_NAME);
276 DataModel localDataModel = readJsonLocalFile();
277
278 if (serverDataModel == null && localDataModel != null) {
279 uploadAllData2Dropbox(localDataModel);
280 } else if (localDataModel == null && serverDataModel != null) {
281 downloadAllDataFromDropbox(serverDataModel);
282 } else if (localDataModel != null) {
283 onDropboxSynchronize(localDataModel, serverDataModel);
284 }
285 }
286
287 private void detectFile(DataModel jsonServer) {
288 HashMap<String, ContentItemModel> meMap = jsonServer.getData();
289 Iterator myVeryOwnIterator = meMap.keySet().iterator();
290 while (myVeryOwnIterator.hasNext()) {
291 String key = (String) myVeryOwnIterator.next();
292 ContentItemModel value = meMap.get(key);
293 calSize(key, value);
294 }
295 }
296
297 private void calSize(String key, ContentItemModel item) {
298 final long[] total = {0};
299 Observable.create(subscriber -> {
300 try {
301 String path = "/" + key + "/";
302 String path2 = "";
303 HashMap<String, String> images = item.getImages();
304 for (String imageKey : images.keySet()) {
305 path2 = path + imageKey + "." + images.get(imageKey);
306 String ss = DropboxClientFactory.getClient().files().getMetadata(path2).toString();
307 subscriber.onNext(ss);
308 }
309 } catch (DbxException e) {
310 e.printStackTrace();
311 subscriber.onError(e);
312 }
313 }).subscribeOn(Schedulers.newThread())
314 .subscribe(s -> {
315 DropboxResultApi dropboxResultApi = new Gson().fromJson(s.toString(), DropboxResultApi.class);
316 total[0] += dropboxResultApi.getSize();
317
318 }, Throwable::printStackTrace, () -> {
319 Log.e("TAG", "Total = : " + total[0]/1024f);
320 });
321 }
322
323 private void onDropboxSynchronize(DataModel jsonLocal, DataModel jsonServer) {
324 showLoading();
325 HashMap<String, ContentItemModel> localDataModel = jsonLocal.getData();
326 HashMap<String, ContentItemModel> serverDataModel = jsonServer.getData();
327 detectFile(jsonServer);
328 DataModel tempDataModel = new DataModel();
329 tempDataModel.setData(new HashMap<>());
330 if (isBackup) {
331 for (Map.Entry<String, ContentItemModel> entry : localDataModel.entrySet()) {
332 if (!serverDataModel.containsKey(entry.getKey())) {
333 new CreateFolderTask(DropboxClientFactory.getClient(), new CreateFolderTask.Callback() {
334 @Override
335 public void onCreateFolderComplete(CreateFolderResult result) {
336 if (entry.getValue() != null && entry.getValue().getImages() != null)
337
338 for (Map.Entry<String, String> image : entry.getValue().getImages().entrySet()) {
339 if (image.getValue() != null && !image.getValue().equals("null"))
340 new UploadFileTask(getContext(), DropboxClientFactory.getClient(), new UploadFileTask.Callback() {
341 @Override
342 public void onUploadComplete(FileMetadata result) {
343
344 }
345
346 @Override
347 public void onError(Exception e) {
348
349 }
350 }).execute(localStorageUtils.getUriPhoto(entry.getKey(), image.getKey() + "." + image.getValue()).toString(), entry.getKey());
351 }
352 if (entry.getValue() != null && entry.getValue().getCover() != null && !entry.getValue().getCover().equals("") && !entry.getValue().getCover().equals("null"))
353 new UploadFileTask(getContext(), DropboxClientFactory.getClient(), new UploadFileTask.Callback() {
354 @Override
355 public void onUploadComplete(FileMetadata result) {
356
357 }
358
359 @Override
360 public void onError(Exception e) {
361
362 }
363 }).execute(localStorageUtils.getUriPhoto(entry.getKey(), entry.getValue().getCover()).toString(), entry.getKey());
364 }
365
366 @Override
367 public void onError(Exception e) {
368
369 }
370 }).execute("/" + entry.getKey());
371
372 tempDataModel.getData().put(entry.getKey(), entry.getValue());
373 }
374 }
375 } else {
376 for (Map.Entry<String, ContentItemModel> entry : serverDataModel.entrySet()) {
377 if (!localDataModel.containsKey(entry.getKey())) {
378 for (Map.Entry<String, String> image : entry.getValue().getImages().entrySet()) {
379 if (image.getValue() != null && !image.getValue().equals("null"))
380 new DownloadFileTask(getContext(), DropboxClientFactory.getClient(), new DownloadFileTask.Callback() {
381 @Override
382 public void onDownloadComplete(java.io.File result) {
383
384 }
385
386 @Override
387 public void onError(Exception e) {
388
389 }
390 }).execute(entry.getKey(), image.getKey() + "." + image.getValue(), "/" + entry.getKey() + "/" + image.getKey() + "." + image.getValue());
391 }
392
393 if (entry.getValue() != null && entry.getValue().getCover() != null && !entry.getValue().getCover().equals("null")) {
394 new DownloadFileTask(getContext(), DropboxClientFactory.getClient(), new DownloadFileTask.Callback() {
395 @Override
396 public void onDownloadComplete(java.io.File result) {
397
398 }
399
400 @Override
401 public void onError(Exception e) {
402
403 }
404 }).execute(entry.getKey(), entry.getValue().getCover(), "/" + entry.getKey() + "/" + entry.getValue().getCover());
405 }
406 tempDataModel.getData().put(entry.getKey(), entry.getValue());
407 }
408 }
409 }
410
411 for (Map.Entry<String, ContentItemModel> serverPostItem : serverDataModel.entrySet()) {
412 String postId = serverPostItem.getKey();
413 ContentItemModel serverPostContent = serverPostItem.getValue();
414
415 if (localDataModel.containsKey(postId)) {
416 ContentItemModel localPostContent = localDataModel.get(postId);
417
418 if (serverPostContent.getTime() - localPostContent.getTime() > 0) {
419
420 List<String> notUseList = new ArrayList<>();
421 for (Map.Entry<String, String> localImageItem : Objects.requireNonNull(localPostContent.getImages().entrySet())) {
422 if (!serverPostContent.getImages().containsKey(localImageItem.getKey())) {
423 notUseList.add(localImageItem.getKey() + "." + localImageItem.getValue());
424 }
425 }
426 localStorageUtils.removeNotUseFile(postId, notUseList);
427
428 if (isBackup) {
429 // backup case:
430
431 for (Map.Entry<String, String> localImageItem : Objects.requireNonNull(localPostContent.getImages().entrySet())) {
432 if (!serverPostContent.getImages().containsKey(localImageItem.getKey())) {
433
434 } else {
435 if (serverPostContent.getImages().get(localImageItem.getKey()) != null && serverPostContent.getImages().get(localImageItem.getKey()).equals("null")) {
436 new UploadFileTask(getContext(), DropboxClientFactory.getClient(), new UploadFileTask.Callback() {
437 @Override
438 public void onUploadComplete(FileMetadata result) {
439
440 }
441
442 @Override
443 public void onError(Exception e) {
444
445 }
446 }).execute(localStorageUtils.getUriPhoto(postId, localImageItem.getKey() + "." + localImageItem.getValue()).toString(), postId);
447 localPostContent.getImages().put(localImageItem.getKey(), "png");
448 }
449 }
450 }
451
452
453 tempDataModel.getData().put(postId, localPostContent);
454 } else {
455 // restore case:
456
457 for (Map.Entry<String, String> serverImageItem : Objects.requireNonNull(serverPostContent.getImages().entrySet())) {
458 if (!localPostContent.getImages().containsKey(serverImageItem.getKey()) || (localPostContent.getImages().containsKey(serverImageItem.getKey()) && !serverImageItem.getValue().equals("null"))) {
459 new DownloadFileTask(getContext(), DropboxClientFactory.getClient(), new DownloadFileTask.Callback() {
460 @Override
461 public void onDownloadComplete(java.io.File result) {
462
463 }
464
465 @Override
466 public void onError(Exception e) {
467
468 }
469 }).execute(postId, serverImageItem.getKey() + "." + serverImageItem.getValue(), "/" + postId + "/" + serverImageItem.getKey() + "." + serverImageItem.getValue());
470 }
471 }
472
473 if (serverPostContent != null && serverPostContent.getCover() != null && !serverPostContent.getCover().equals("null")) {
474 new DownloadFileTask(getContext(), DropboxClientFactory.getClient(), new DownloadFileTask.Callback() {
475 @Override
476 public void onDownloadComplete(java.io.File result) {
477
478 }
479
480 @Override
481 public void onError(Exception e) {
482
483 }
484 }).execute(postId, serverPostContent.getCover(), "/" + postId + "/" + serverPostContent.getCover());
485 }
486
487
488 tempDataModel.getData().put(postId, serverPostContent);
489 }
490 } else {
491
492 for (Map.Entry<String, String> serverImageItem : Objects.requireNonNull(serverPostContent.getImages().entrySet())) {
493 if (!localPostContent.getImages().containsKey(serverImageItem.getKey())) {
494 new DeleteFileTask(getContext(), DropboxClientFactory.getClient(), new DeleteFileTask.Callback() {
495 @Override
496 public void onDownloadComplete(DeleteResult result) {
497
498 }
499
500 @Override
501 public void onError(Exception e) {
502
503 }
504 }).execute("/" + postId + "/" + serverImageItem.getKey() + "." + serverImageItem.getValue());
505 }
506 }
507
508 if (serverPostContent.getCover() != null && !serverPostContent.getCover().equals("null") && localPostContent.getCover() != null && !localPostContent.getCover().equals("null")) {
509 new DeleteFileTask(getContext(), DropboxClientFactory.getClient(), new DeleteFileTask.Callback() {
510 @Override
511 public void onDownloadComplete(DeleteResult result) {
512
513 }
514
515 @Override
516 public void onError(Exception e) {
517
518 }
519 }).execute("/" + postId + "/" + serverPostContent.getCover());
520 }
521
522
523 if (isBackup) {
524
525 if (localPostContent != null && localPostContent.getCover() != null && !localPostContent.getCover().equals("null")) {
526 new UploadFileTask(getContext(), DropboxClientFactory.getClient(), new UploadFileTask.Callback() {
527 @Override
528 public void onUploadComplete(FileMetadata result) {
529
530 }
531
532 @Override
533 public void onError(Exception e) {
534
535 }
536 }).execute(localStorageUtils.getUriPhoto(postId, localPostContent.getCover()).toString(), postId);
537 }
538
539 for (Map.Entry<String, String> localImageItem : Objects.requireNonNull(localPostContent.getImages().entrySet())) {
540 if (!serverPostContent.getImages().containsKey(localImageItem.getKey()) || (serverPostContent.getImages().containsKey(localImageItem.getKey()) && !localImageItem.getValue().equals("null"))) {
541 new UploadFileTask(getContext(), DropboxClientFactory.getClient(), new UploadFileTask.Callback() {
542 @Override
543 public void onUploadComplete(FileMetadata result) {
544
545 }
546
547 @Override
548 public void onError(Exception e) {
549
550 }
551 }).execute(localStorageUtils.getUriPhoto(postId, localImageItem.getKey() + "." + localImageItem.getValue()).toString(), postId);
552 }
553 tempDataModel.getData().put(postId, localPostContent);
554 }
555 } else {
556 for (Map.Entry<String, String> serverImageItem : Objects.requireNonNull(serverPostContent.getImages().entrySet())) {
557 if (localPostContent.getImages().containsKey(serverImageItem.getKey())) {
558 new DownloadFileTask(getContext(), DropboxClientFactory.getClient(), new DownloadFileTask.Callback() {
559 @Override
560 public void onDownloadComplete(java.io.File result) {
561
562 }
563
564 @Override
565 public void onError(Exception e) {
566
567 }
568 }).execute(postId, serverImageItem.getKey() + "." + serverImageItem.getValue(), "/" + postId + "/" + serverImageItem.getKey() + "." + serverImageItem.getValue());
569 }
570 tempDataModel.getData().put(postId, serverPostContent);
571 }
572 }
573
574 }
575 }
576 }
577
578 localStorageUtils.writeObjectToFile(tempDataModel, Consts.LocalStorage.JSON_FILE_NAME);
579
580 new UploadFileTask(getContext(), DropboxClientFactory.getClient(), new UploadFileTask.Callback() {
581 @Override
582 public void onUploadComplete(FileMetadata result) {
583 updateTimeBackUpDropbox();
584
585 }
586
587 @Override
588 public void onError(Exception e) {
589
590 }
591 }).execute(localStorageUtils.getJsonPath(), "/");
592
593 showCountdown();
594 }
595
596 private void downloadAllDataFromDropbox(DataModel dataModel) {
597 showLoading();
598 for (Map.Entry<String, ContentItemModel> entry : dataModel.getData().entrySet()) {
599 String key = entry.getKey();
600 ContentItemModel contentItemModel = entry.getValue();
601
602 if (contentItemModel != null && contentItemModel.getCover() != null && !contentItemModel.getCover().equals("")) {
603 new DownloadFileTask(getContext(), DropboxClientFactory.getClient(), new DownloadFileTask.Callback() {
604 @Override
605 public void onDownloadComplete(java.io.File result) {
606
607 }
608
609 @Override
610 public void onError(Exception e) {
611
612 }
613 }).execute(key, contentItemModel.getCover(), "/" + entry.getKey() + "/" + contentItemModel.getCover());
614 }
615
616 for (Map.Entry<String, String> image : contentItemModel.getImages().entrySet()) {
617 new DownloadFileTask(getContext(), DropboxClientFactory.getClient(), new DownloadFileTask.Callback() {
618 @Override
619 public void onDownloadComplete(java.io.File result) {
620 updateTimeBackUpDropbox();
621 }
622
623 @Override
624 public void onError(Exception e) {
625
626 }
627 }).execute(key, image.getKey() + "." + image.getValue(), "/" + entry.getKey() + "/" + image.getKey() + "." + image.getValue());
628 }
629
630 }
631
632 localStorageUtils.writeObjectToFile(dataModel, Consts.LocalStorage.JSON_FILE_NAME);
633 showCountdown();
634 }
635
636 private void uploadAllData2Dropbox(DataModel dataModel) {
637 showLoading();
638 for (Map.Entry<String, ContentItemModel> entry : dataModel.getData().entrySet()) {
639 String key = entry.getKey();
640 ContentItemModel value = entry.getValue();
641
642 new CreateFolderTask(DropboxClientFactory.getClient(), new CreateFolderTask.Callback() {
643 @Override
644 public void onCreateFolderComplete(CreateFolderResult result) {
645 if (value != null)
646
647 for (Map.Entry<String, String> image : value.getImages().entrySet()) {
648 new UploadFileTask(getContext(), DropboxClientFactory.getClient(), new UploadFileTask.Callback() {
649 @Override
650 public void onUploadComplete(FileMetadata result) {
651
652 }
653
654 @Override
655 public void onError(Exception e) {
656
657 }
658 }).execute(localStorageUtils.getUriPhoto(key, image.getKey() + "." + image.getValue()).toString(), key);
659 }
660 }
661
662 @Override
663 public void onError(Exception e) {
664
665 }
666 }).execute("/" + key);
667 }
668
669 new UploadFileTask(getContext(), DropboxClientFactory.getClient(), new UploadFileTask.Callback() {
670 @Override
671 public void onUploadComplete(FileMetadata result) {
672 updateTimeBackUpDropbox();
673
674 }
675
676 @Override
677 public void onError(Exception e) {
678
679 }
680 }).execute(localStorageUtils.getJsonPath(), "/");
681
682 showCountdown();
683 }
684
685 private void updateTimeBackUpDropbox() {
686 if (isBackup) {
687 Calendar calendar = Calendar.getInstance();
688 DecimalFormat mFormat = new DecimalFormat("00");
689
690 String time = calendar.get(Calendar.YEAR) + "." + mFormat.format(Double.valueOf(calendar.get(Calendar.MONTH)) + 1) + "." + calendar.get(Calendar.DATE) + " " + calendar.get(Calendar.HOUR_OF_DAY) + ":" + calendar.get(Calendar.MINUTE);
691
692 PreferencesUtlis.putString(Consts.LINKED_APP_DROPBOX, time);
693 updateBackupDropboxUI();
694 }
695 }
696
697 @OnClick(R.id.lout_delete_all_posts)
698 public void onDeleteAllPosts() {
699 DialogConfirm dialogConfirm = new DialogConfirm(this.getContext(), new DialogConfirm.OnItemClickListener() {
700 @Override
701 public void onItemClick() {
702 settingLinkPresenter.deleteAllPosts();
703 }
704 });
705 dialogConfirm.show();
706 dialogConfirm.getTvTitle().setTextColor(Color.parseColor("#1A1A1A"));
707 dialogConfirm.getTvTitle().setText(getString(R.string.dialog_delete_all_posts_title));
708 dialogConfirm.getTvDescription().setText(getString(R.string.dialog_delete_all_posts_content));
709 dialogConfirm.getTvNext().setText(getString(R.string.dialog_delete_all_posts_btn_delete));
710 dialogConfirm.getTvNext().setTextColor(Color.parseColor("#FF3B30"));
711 }
712
713 @OnClick(R.id.layout_back)
714 public void clickToolbarBack(View view) {
715 getActivity().onBackPressed();
716 }
717
718 @OnClick(R.id.tv_unlink)
719 public void unlinkFunc() {
720 PreferencesUtlis.putString(Consts.LINKED_APP_DROPBOX, "");
721 updateBackupDropboxUI();
722
723 requestSignOut();
724 PreferencesUtlis.putString(Consts.LINKED_APP_DRIVER, "");
725 updateBackupDriverUI();
726
727 }
728
729 @Override
730 public void deleteAllPostsSuccess(String message) {
731 ShowMessage.onRequestSuccess(getContext(), message);
732 EventBus.getDefault().postSticky(new RefreshTimelineListEvent());
733
734 DataModel localDataModel = readJsonLocalFile();
735 if (localDataModel != null) {
736 for (Map.Entry<String, ContentItemModel> itemModelEntry : localDataModel.getData().entrySet()) {
737 itemModelEntry.getValue().setImages(new HashMap<>());
738 itemModelEntry.getValue().setCover("");
739 itemModelEntry.getValue().setTime(Calendar.getInstance().getTimeInMillis());
740 localStorageUtils.removeFolderInPhoto(itemModelEntry.getKey());
741 }
742 }
743
744
745 localStorageUtils.writeObjectToFile(localDataModel, Consts.LocalStorage.JSON_FILE_NAME);
746
747 }
748
749 @Override
750 public void getLinkedAppListSuccess(List<LinkedApp> linkedAppList) {
751 settingLinkAdapter = new SettingLinkAdapter(getContext(), linkedAppList, linkedApp -> {
752 linkedApp.setStartPostedAt(DateUtils.getCurrentTime());
753 DialogTimeConfirm.getInstance(new DialogTimeConfirm.TimeConfirmListener() {
754 @Override
755 public void onCancel() {
756
757 }
758
759 @Override
760 public void on3Months() {
761 linkedApp.setPastMonths(3);
762 linkedApp.setAutoPost(true);
763 settingLinkPresenter.changeLinkedAppAutoPost(linkedApp);
764 }
765
766 @Override
767 public void on6Months() {
768 linkedApp.setPastMonths(6);
769 linkedApp.setAutoPost(true);
770 settingLinkPresenter.changeLinkedAppAutoPost(linkedApp);
771 }
772
773 @Override
774 public void doNotCooperate() {
775 isNoCooperate = true;
776 linkedApp.setPastMonths(0);
777 linkedApp.setAutoPost(false);
778 settingLinkPresenter.changeLinkedAppAutoPost(linkedApp);
779 }
780 }).show(getFragmentManager(), FRAG_TAG);
781 });
782 lvSettingLink.setAdapter(settingLinkAdapter);
783 }
784
785 @Override
786 public void changeLinkedAppAutoPostSuccess(String message) {
787 //when selected do not cooperate
788 if (isNoCooperate) {
789 settingLinkAdapter.setAutoPost(false);
790 isNoCooperate = false;
791 } else {
792 settingLinkAdapter.setAutoPost(true);
793 }
794 settingTagPresenter.getTagList();
795 }
796
797 @Override
798 public void updateLinkedAppTagSuccess(String message) {
799 }
800
801 @Override
802 public void onRequestFailure(String message) {
803 ShowMessage.onRequestFailure(getContext(), message);
804 }
805
806 @Override
807 public void createTagSuccess(TagCreateResult.Result result) {
808 }
809
810 @Override
811 public void updateTagSuccess(String message) {
812
813 }
814
815 @Override
816 public void deleteTagSuccess(String message) {
817
818 }
819
820 @Override
821 public void getTagListTagSuccess(List<TagTimeLine> list) {
822 Utils.saveTagList(list);
823 }
824
825 @OnClick(R.id.lout_google_drive)
826 public void onGoogleDriveFunc() {
827 GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(getContext());
828
829 if (account == null) {
830 requestSignIn();
831 } else {
832 onConfirmOption();
833 }
834 }
835
836 private void onConfirmOption() {
837 SynchronizeConfirmDialog.getInstance(new SynchronizeConfirmDialog.ConfirmListener() {
838 @Override
839 public void onCancel() {
840
841 }
842
843 @Override
844 public void onBackup() {
845 isBackup = true;
846 onGoogleDriveSynchronize();
847 }
848
849 @Override
850 public void onRestore() {
851 isBackup = false;
852 onGoogleDriveSynchronize();
853 }
854 }, getResources().getString(R.string.content_dialog_google_drive_back_up), getResources().getString(R.string.content_dialog_google_drive_restore)).show(getFragmentManager(), "SynchronizeConfirmDialog");
855 }
856
857 private void onGoogleDriveSynchronize() {
858 showCountdown();
859 GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(getContext());
860
861 if (account == null) {
862 requestSignIn();
863 } else {
864 GoogleAccountCredential credential =
865 GoogleAccountCredential.usingOAuth2(
866 getContext(), Collections.singleton(DriveScopes.DRIVE_FILE));
867 credential.setSelectedAccount(account.getAccount());
868 com.google.api.services.drive.Drive googleDriveService =
869 new com.google.api.services.drive.Drive.Builder(
870 AndroidHttp.newCompatibleTransport(),
871 new GsonFactory(),
872 credential)
873 .setApplicationName("AppName")
874 .build();
875 mDriveServiceHelper = new DriveServiceHelper(googleDriveService);
876
877 getStorage();
878 showLoading();
879 isRootExits = false;
880 mDriveServiceHelper.queryFiles().addOnSuccessListener(new OnSuccessListener<FileList>() {
881 @Override
882 public void onSuccess(FileList fileList) {
883 for (File item : fileList.getFiles()) {
884 if (item.getName().equals("HolidayLife")) {
885 isRootExits = true;
886 showLoading();
887
888 mDriveServiceHelper.queryFiles(item.getId()).addOnSuccessListener(new OnSuccessListener<List<GoogleDriveFileHolder>>() {
889 @Override
890 public void onSuccess(List<GoogleDriveFileHolder> googleDriveFileHolders) {
891 boolean jsonExist = false;
892 listServerFoder.clear();
893 listServerFoder.addAll(googleDriveFileHolders);
894 for (GoogleDriveFileHolder googleDriveFileHolder : listServerFoder) {
895 listServerFolderName.add(googleDriveFileHolder.getName());
896
897 if (googleDriveFileHolder.getName().equals(Consts.LocalStorage.JSON_FILE_NAME)) {
898 readJsonServerFile(item.getId(), googleDriveFileHolder.getId());
899 jsonExist = true;
900 break;
901 }
902 }
903
904 if (!jsonExist && readJsonLocalFile() != null) {
905 uploadAllData2Server(item.getId(), readJsonLocalFile());
906 }
907 }
908 }).addOnFailureListener(new OnFailureListener() {
909 @Override
910 public void onFailure(@NonNull Exception e) {
911
912 }
913 });
914
915
916 break;
917 }
918 }
919
920 if (!isRootExits) {
921 createRootFolder();
922 }
923 }
924 }).addOnFailureListener(new OnFailureListener() {
925 @Override
926 public void onFailure(@NonNull Exception e) {
927 e.printStackTrace();
928 }
929 });
930 }
931 }
932
933 private void createRootFolder() {
934 mDriveServiceHelper.createFolder("HolidayLife", null).addOnSuccessListener(new OnSuccessListener<GoogleDriveFileHolder>() {
935 @Override
936 public void onSuccess(GoogleDriveFileHolder googleDriveFileHolder) {
937// mDriveServiceHelper.uploadFile(localStorageUtils.getFile(Consts.LocalStorage.JSON_FILE_NAME), DriveServiceHelper.TYPE_GOOGLE_DRIVE_FILE, googleDriveFileHolder.getId());
938 onGoogleDriveSynchronize();
939 }
940 }).addOnFailureListener(new OnFailureListener() {
941 @Override
942 public void onFailure(@NonNull Exception e) {
943
944 }
945 });
946 }
947
948 private void readJsonServerFile(String rootId, String fileId) {
949 mDriveServiceHelper.readFile(fileId).addOnSuccessListener(new OnSuccessListener<Pair<String, String>>() {
950 @Override
951 public void onSuccess(Pair<String, String> stringStringPair) {
952 String data = stringStringPair.second;
953 DataModel serverDataModel = null;
954 Gson gson = new Gson();
955
956 if (data != null && !data.isEmpty()) {
957 serverDataModel = gson.fromJson(data, DataModel.class);
958 }
959
960
961 checkJsonLocalandServer(readJsonLocalFile(), serverDataModel, rootId, fileId);
962 }
963 }).addOnFailureListener(new OnFailureListener() {
964 @Override
965 public void onFailure(@NonNull Exception e) {
966
967 }
968 });
969 }
970
971 private void checkJsonLocalandServer(DataModel jsonLocal, DataModel jsonServer, String rootId, String fileId) {
972 showLoading();
973 if (jsonServer == null && jsonLocal != null) {
974 uploadAllData2Server(rootId, jsonLocal);
975 } else if (jsonLocal == null && jsonServer != null) {
976 downloadAllData2Local(rootId, jsonServer);
977 } else if (jsonLocal != null) {
978 DataModel tempDataModel = new DataModel();
979 tempDataModel.setData(new HashMap<>());
980 if (isBackup) {
981 for (Map.Entry<String, ContentItemModel> entry : jsonLocal.getData().entrySet()) {
982 if (!jsonServer.getData().containsKey(entry.getKey())) {
983 mDriveServiceHelper.searchFolder(entry.getKey()).addOnSuccessListener(googleDriveFileHoldeItem -> {
984 if (googleDriveFileHoldeItem == null) {
985 mDriveServiceHelper.createFolder(entry.getKey(), rootId)
986 .addOnSuccessListener(googleDriveFileHolder -> {
987 if (entry.getValue().getCover() != null && !entry.getValue().getCover().isEmpty()) {
988 mDriveServiceHelper.uploadFile(localStorageUtils.getFile(entry.getKey(), entry.getValue().getCover()), DriveServiceHelper.TYPE_PNG_IMAGE, googleDriveFileHolder.getId());
989 }
990
991 if (entry.getValue().getImages() != null && entry.getValue().getImages().entrySet().size() > 0)
992 for (Map.Entry<String, String> entryItem : entry.getValue().getImages().entrySet()) {
993 if (entryItem.getValue() != null && !entryItem.getValue().equals("null")) {
994 String name = entryItem.getKey() + "." + entryItem.getValue();
995 mDriveServiceHelper.uploadFile(localStorageUtils.getFile(entry.getKey(), name), DriveServiceHelper.TYPE_PNG_IMAGE, googleDriveFileHolder.getId());
996 }
997 }
998
999// tempDataModel.getData().put(entry.getKey(), entry.getValue());
1000 });
1001 } else {
1002 if (entry.getValue().getCover() != null && !entry.getValue().getCover().isEmpty()) {
1003 mDriveServiceHelper.uploadFile(localStorageUtils.getFile(entry.getKey(), entry.getValue().getCover()), DriveServiceHelper.TYPE_PNG_IMAGE, googleDriveFileHoldeItem.getId());
1004 }
1005
1006 if (entry.getValue().getImages() != null && entry.getValue().getImages().entrySet().size() > 0)
1007 for (Map.Entry<String, String> entryItem : entry.getValue().getImages().entrySet()) {
1008 if (entryItem.getValue() != null && !entryItem.getValue().equals("null")) {
1009 String name = entryItem.getKey() + "." + entryItem.getValue();
1010 mDriveServiceHelper.uploadFile(localStorageUtils.getFile(entry.getKey(), name), DriveServiceHelper.TYPE_PNG_IMAGE, googleDriveFileHoldeItem.getId());
1011 }
1012 }
1013
1014 }
1015 }
1016
1017 );
1018
1019 tempDataModel.getData().put(entry.getKey(), entry.getValue());
1020 }
1021 }
1022 } else {
1023 for (Map.Entry<String, ContentItemModel> entry : jsonServer.getData().entrySet()) {
1024 if (!jsonLocal.getData().containsKey(entry.getKey()) && getDriverFolderByName(entry.getKey()) != null) {
1025 mDriveServiceHelper.queryFiles(getDriverFolderByName(entry.getKey()).getId())
1026 .addOnSuccessListener(new OnSuccessListener<List<GoogleDriveFileHolder>>() {
1027 @Override
1028 public void onSuccess(List<GoogleDriveFileHolder> googleDriveFileHolders) {
1029 for (GoogleDriveFileHolder googleDriveFileHolder : googleDriveFileHolders) {
1030 mDriveServiceHelper.downloadFile(localStorageUtils.initFileInPhoto(entry.getKey(), googleDriveFileHolder.getName()), googleDriveFileHolder.getId());
1031 }
1032 }
1033 })
1034 .addOnFailureListener(new OnFailureListener() {
1035 @Override
1036 public void onFailure(@NonNull Exception e) {
1037
1038 }
1039 });
1040
1041
1042 tempDataModel.getData().put(entry.getKey(), entry.getValue());
1043 }
1044 }
1045 }
1046 for (Map.Entry<String, ContentItemModel> serverPostItem : jsonServer.getData().entrySet()) {
1047 if (jsonLocal.getData().containsKey(serverPostItem.getKey())) {
1048 if (serverPostItem.getValue().getTime() - jsonLocal.getData().get(serverPostItem.getKey()).getTime() > 0) {
1049// List<String> notUseList = new ArrayList<>();
1050// for (Map.Entry<String, String> localImageItem : Objects.requireNonNull(jsonLocal.getData().get(serverPostItem.getKey()).getImages().entrySet())) {
1051// if (!serverPostItem.getValue().getImages().containsKey(localImageItem.getKey())) {
1052// notUseList.add(localImageItem.getKey() + "." + localImageItem.getValue());
1053// }
1054// }
1055// localStorageUtils.removeNotUseFile(serverPostItem.getKey(), notUseList);
1056
1057 if (isBackup) {
1058 for (Map.Entry<String, String> localImageItem : Objects.requireNonNull(jsonLocal.getData().get(serverPostItem.getKey())).getImages().entrySet()) {
1059 if (!Objects.requireNonNull(jsonServer.getData().get(serverPostItem.getKey())).getImages().containsKey(localImageItem.getKey())) {
1060 mDriveServiceHelper.uploadFile(localStorageUtils.getFile(serverPostItem.getKey(), localImageItem.getKey() + "." + localImageItem.getValue()), DriveServiceHelper.TYPE_PNG_IMAGE, getDriverFolderByName(serverPostItem.getKey()).getId());
1061 } else {
1062 if (localImageItem.getValue() != null && !localImageItem.getValue().equals("null") && jsonServer.getData().get(serverPostItem.getKey()).getImages().get(localImageItem.getKey()) == null || jsonServer.getData().get(serverPostItem.getKey()).getImages().get(localImageItem.getKey()).equals("null")) {
1063 mDriveServiceHelper.uploadFile(localStorageUtils.getFile(serverPostItem.getKey(), localImageItem.getKey() + "." + localImageItem.getValue()), DriveServiceHelper.TYPE_PNG_IMAGE, getDriverFolderByName(serverPostItem.getKey()).getId());
1064 }
1065 }
1066 }
1067
1068 if (jsonLocal.getData().get(serverPostItem.getKey()).getCover() != null && !jsonLocal.getData().get(serverPostItem.getKey()).getCover().equals("null")) {
1069 if (jsonServer.getData().get(serverPostItem.getKey()).getCover() == null || jsonServer.getData().get(serverPostItem.getKey()).getCover().equals("null")) {
1070 mDriveServiceHelper.uploadFile(localStorageUtils.getFile(serverPostItem.getKey(), jsonLocal.getData().get(serverPostItem.getKey()).getCover()), DriveServiceHelper.TYPE_PNG_IMAGE, getDriverFolderByName(serverPostItem.getKey()).getId());
1071 }
1072 }
1073
1074
1075 tempDataModel.getData().put(serverPostItem.getKey(), jsonLocal.getData().get(serverPostItem.getKey()));
1076
1077 } else {
1078 // restore case
1079 for (Map.Entry<String, String> serverImageItem : Objects.requireNonNull(jsonServer.getData().get(serverPostItem.getKey())).getImages().entrySet()) {
1080 if (!Objects.requireNonNull(jsonLocal.getData().get(serverPostItem.getKey())).getImages().containsKey(serverImageItem.getKey())) {
1081 mDriveServiceHelper.queryFiles(getDriverFolderByName(serverPostItem.getKey()).getId()).addOnSuccessListener(new OnSuccessListener<List<GoogleDriveFileHolder>>() {
1082 @Override
1083 public void onSuccess(List<GoogleDriveFileHolder> googleDriveFileHolders) {
1084 for (GoogleDriveFileHolder googleDriveFileHolder : googleDriveFileHolders) {
1085 if (googleDriveFileHolder.getName().equals(serverImageItem.getKey() + "." + serverImageItem.getValue())) {
1086 mDriveServiceHelper.downloadFile(localStorageUtils.initFileInPhoto(serverPostItem.getKey(), serverImageItem.getKey() + "." + serverImageItem.getValue()), googleDriveFileHolder.getId());
1087 }
1088
1089 if (jsonServer.getData().get(serverPostItem.getKey()).getCover() != null && !jsonServer.getData().get(serverPostItem.getKey()).getCover().equals("null") && jsonServer.getData().get(serverPostItem.getKey()).getCover().equals(googleDriveFileHolder.getName())) {
1090 mDriveServiceHelper.downloadFile(localStorageUtils.initFileInPhoto(serverPostItem.getKey(), jsonServer.getData().get(serverPostItem.getKey()).getCover()), googleDriveFileHolder.getId());
1091 }
1092 }
1093
1094 }
1095 });
1096 } else {
1097// if (serverImageItem.getValue() != null && !serverImageItem.getValue().equals("null") && jsonLocal.getData().get(serverPostItem.getKey()).getImages().get(serverImageItem.getKey()) == null || jsonServer.getData().get(serverPostItem.getKey()).getImages().get(serverPostItem.getKey()).equals("null")) {
1098//
1099// }
1100 }
1101 }
1102
1103
1104 tempDataModel.getData().put(serverPostItem.getKey(), jsonServer.getData().get(serverPostItem.getKey()));
1105 }
1106
1107 } else {
1108
1109 mDriveServiceHelper.queryFiles(getDriverFolderByName(serverPostItem.getKey()).getId()).addOnSuccessListener(new OnSuccessListener<List<GoogleDriveFileHolder>>() {
1110 @Override
1111 public void onSuccess(List<GoogleDriveFileHolder> googleDriveFileHolders) {
1112 for (GoogleDriveFileHolder googleDriveFileHolder : googleDriveFileHolders) {
1113 String name = googleDriveFileHolder.getName().substring(0, googleDriveFileHolder.getName().lastIndexOf("."));
1114 if (!jsonLocal.getData().get(serverPostItem.getKey()).getImages().containsKey(name) && !jsonLocal.getData().get(serverPostItem.getKey()).getCover().equals(googleDriveFileHolder.getName())) {
1115 mDriveServiceHelper.deleteFolderFile(googleDriveFileHolder.getId());
1116 }
1117 }
1118
1119
1120 }
1121 });
1122
1123
1124 if (isBackup) {
1125 List<String> notUseList = new ArrayList<>();
1126 for (Map.Entry<String, String> localImageItem : jsonLocal.getData().get(serverPostItem.getKey()).getImages().entrySet()) {
1127 if (!serverPostItem.getValue().getImages().containsKey(localImageItem.getKey())) {
1128 mDriveServiceHelper.uploadFile(localStorageUtils.getFile(serverPostItem.getKey(), localImageItem.getKey() + "." + localImageItem.getValue()), DriveServiceHelper.TYPE_PNG_IMAGE, getDriverFolderByName(serverPostItem.getKey()).getId());
1129// notUseList.add(localImageItem.getKey() + "." + localImageItem.getValue());
1130 } else {
1131 if (serverPostItem.getValue().getImages().get(localImageItem.getKey()) != null && serverPostItem.getValue().getImages().get(localImageItem.getKey()).equals("null")) {
1132 mDriveServiceHelper.uploadFile(localStorageUtils.getFile(serverPostItem.getKey(), localImageItem.getKey() + "." + localImageItem.getValue()), DriveServiceHelper.TYPE_PNG_IMAGE, getDriverFolderByName(serverPostItem.getKey()).getId());
1133 localImageItem.setValue("png");
1134 }
1135 }
1136 }
1137
1138 if (jsonLocal.getData().get(serverPostItem.getKey()).getCover() != null && !jsonLocal.getData().get(serverPostItem.getKey()).getCover().equals("null") && (!jsonLocal.getData().get(serverPostItem.getKey()).getCover().equals(jsonServer.getData().get(serverPostItem.getKey()).getCover()))) {
1139 mDriveServiceHelper.uploadFile(localStorageUtils.getFile(serverPostItem.getKey(), jsonLocal.getData().get(serverPostItem.getKey()).getCover()), DriveServiceHelper.TYPE_PNG_IMAGE, getDriverFolderByName(serverPostItem.getKey()).getId());
1140 }
1141// localStorageUtils.removeNotUseFile(serverPostItem.getKey(), notUseList);
1142 tempDataModel.getData().put(serverPostItem.getKey(), jsonLocal.getData().get(serverPostItem.getKey()));
1143 } else {
1144 // restore case
1145
1146 for (Map.Entry<String, String> serverImageItem : Objects.requireNonNull(jsonServer.getData().get(serverPostItem.getKey())).getImages().entrySet()) {
1147 if (!Objects.requireNonNull(jsonLocal.getData().get(serverPostItem.getKey())).getImages().containsKey(serverImageItem.getKey())) {
1148 mDriveServiceHelper.queryFiles(getDriverFolderByName(serverPostItem.getKey()).getId()).addOnSuccessListener(new OnSuccessListener<List<GoogleDriveFileHolder>>() {
1149 @Override
1150 public void onSuccess(List<GoogleDriveFileHolder> googleDriveFileHolders) {
1151 for (GoogleDriveFileHolder googleDriveFileHolder : googleDriveFileHolders) {
1152 if (googleDriveFileHolder.getName().equals(serverImageItem.getKey() + "." + serverImageItem.getValue())) {
1153 mDriveServiceHelper.downloadFile(localStorageUtils.initFileInPhoto(serverPostItem.getKey(), serverImageItem.getKey() + "." + serverImageItem.getValue()), googleDriveFileHolder.getId());
1154 }
1155 }
1156
1157
1158 }
1159 });
1160 } else {
1161 if (serverImageItem.getValue() != null && !serverImageItem.getValue().equals("null") && jsonServer.getData().get(serverPostItem.getKey()).getImages().get(serverImageItem.getKey()) == null || jsonServer.getData().get(serverPostItem.getKey()).getImages().get(serverImageItem.getKey()).equals("null")) {
1162 mDriveServiceHelper.queryFiles(getDriverFolderByName(serverPostItem.getKey()).getId()).addOnSuccessListener(new OnSuccessListener<List<GoogleDriveFileHolder>>() {
1163 @Override
1164 public void onSuccess(List<GoogleDriveFileHolder> googleDriveFileHolders) {
1165 for (GoogleDriveFileHolder googleDriveFileHolder : googleDriveFileHolders) {
1166 if (googleDriveFileHolder.getName().equals(serverImageItem.getKey() + "." + serverImageItem.getValue())) {
1167 mDriveServiceHelper.downloadFile(localStorageUtils.initFileInPhoto(serverPostItem.getKey(), serverImageItem.getKey() + "." + serverImageItem.getValue()), googleDriveFileHolder.getId());
1168 }
1169 }
1170 }
1171 });
1172 }
1173 }
1174 }
1175
1176 if (jsonServer.getData().get(serverPostItem.getKey()).getCover() != null && !jsonServer.getData().get(serverPostItem.getKey()).getCover().equals("null")) {
1177 if (jsonLocal.getData().get(serverPostItem.getKey()).getCover() == null || jsonLocal.getData().get(serverPostItem.getKey()).getCover().equals("null")) {
1178 mDriveServiceHelper.queryFiles(getDriverFolderByName(serverPostItem.getKey()).getId()).addOnSuccessListener(new OnSuccessListener<List<GoogleDriveFileHolder>>() {
1179 @Override
1180 public void onSuccess(List<GoogleDriveFileHolder> googleDriveFileHolders) {
1181 for (GoogleDriveFileHolder googleDriveFileHolder : googleDriveFileHolders) {
1182 if (googleDriveFileHolder.getName().equals(jsonServer.getData().get(serverPostItem.getKey()).getCover())) {
1183 mDriveServiceHelper.downloadFile(localStorageUtils.initFileInPhoto(serverPostItem.getKey(), googleDriveFileHolder.getName()), googleDriveFileHolder.getId());
1184 }
1185 }
1186 }
1187 });
1188 }
1189 }
1190
1191 tempDataModel.getData().put(serverPostItem.getKey(), jsonServer.getData().get(serverPostItem.getKey()));
1192
1193 }
1194 }
1195 }
1196 }
1197
1198 localStorageUtils.writeObjectToFile(tempDataModel, Consts.LocalStorage.JSON_FILE_NAME);
1199 updateFileJson(fileId);
1200 }
1201 }
1202
1203 private GoogleDriveFileHolder getDriverFolderByName(String id) {
1204 GoogleDriveFileHolder googleDriveFileHolder = null;
1205 for (GoogleDriveFileHolder item : listServerFoder) {
1206 if (item.getName().equals(id)) {
1207 googleDriveFileHolder = item;
1208 }
1209 }
1210
1211 return googleDriveFileHolder;
1212 }
1213
1214 private void downloadAllData2Local(String rootId, DataModel dataModel) {
1215 showLoading();
1216 for (Map.Entry<String, ContentItemModel> entry : dataModel.getData().entrySet()) {
1217 mDriveServiceHelper.queryFiles(getDriverFolderByName(entry.getKey()).getId())
1218 .addOnSuccessListener(new OnSuccessListener<List<GoogleDriveFileHolder>>() {
1219 @Override
1220 public void onSuccess(List<GoogleDriveFileHolder> googleDriveFileHolders) {
1221 for (GoogleDriveFileHolder googleDriveFileHolder : googleDriveFileHolders) {
1222 showLoading();
1223 mDriveServiceHelper.downloadFile(localStorageUtils.initFileInPhoto(entry.getKey(), googleDriveFileHolder.getName()), googleDriveFileHolder.getId())
1224 .addOnCompleteListener(new OnCompleteListener<Void>() {
1225 @Override
1226 public void onComplete(@NonNull Task<Void> task) {
1227
1228 }
1229 });
1230 }
1231 }
1232 })
1233 .addOnFailureListener(new OnFailureListener() {
1234 @Override
1235 public void onFailure(@NonNull Exception e) {
1236 }
1237 });
1238
1239
1240 }
1241
1242 localStorageUtils.writeObjectToFile(dataModel, Consts.LocalStorage.JSON_FILE_NAME);
1243 showCountdown();
1244 }
1245
1246 private void showCountdown() {
1247 showLoading();
1248 new CountDownTimer(90000, 1000) {
1249 public void onTick(long millisUntilFinished) {
1250
1251 //here you can have your logic to set text to edittext
1252 }
1253
1254 public void onFinish() {
1255 hideLoading();
1256 EventBus.getDefault().post(new RefreshTimelineListEvent());
1257 }
1258
1259 }.start();
1260 }
1261
1262 private void uploadAllData2Server(String rootId, DataModel dataModel) {
1263 showLoading();
1264
1265 for (Map.Entry<String, ContentItemModel> entry : dataModel.getData().entrySet()) {
1266 String key = entry.getKey();
1267 ContentItemModel value = entry.getValue();
1268 mDriveServiceHelper.createFolder(key, rootId).addOnSuccessListener(new OnSuccessListener<GoogleDriveFileHolder>() {
1269 @Override
1270 public void onSuccess(GoogleDriveFileHolder googleDriveFileHolder) {
1271 if (value.getCover() != null && !value.getCover().isEmpty()) {
1272 mDriveServiceHelper.uploadFile(localStorageUtils.getFile(key, value.getCover()), DriveServiceHelper.TYPE_PNG_IMAGE, googleDriveFileHolder.getId());
1273 }
1274
1275 if (value.getImages() != null && value.getImages().entrySet().size() > 0)
1276 for (Map.Entry<String, String> entry : value.getImages().entrySet()) {
1277 if (entry.getValue() != null && !entry.getValue().equals("null")) {
1278 String name = entry.getKey() + "." + entry.getValue();
1279 mDriveServiceHelper.uploadFile(localStorageUtils.getFile(key, name), DriveServiceHelper.TYPE_PNG_IMAGE, googleDriveFileHolder.getId());
1280 }
1281 }
1282 }
1283 }).addOnFailureListener(new OnFailureListener() {
1284 @Override
1285 public void onFailure(@NonNull Exception e) {
1286
1287 }
1288 }).addOnCompleteListener(new OnCompleteListener<GoogleDriveFileHolder>() {
1289 @Override
1290 public void onComplete(@NonNull Task<GoogleDriveFileHolder> task) {
1291 }
1292 });
1293 }
1294
1295
1296 uploadFileJson(rootId);
1297 }
1298
1299 private void uploadFileJson(String rootId) {
1300 showLoading();
1301 mDriveServiceHelper.uploadFile(localStorageUtils.getFile(Consts.LocalStorage.JSON_FILE_NAME), DriveServiceHelper.TYPE_TEXT_PLAIN, rootId)
1302 .addOnSuccessListener(new OnSuccessListener<GoogleDriveFileHolder>() {
1303 @Override
1304 public void onSuccess(GoogleDriveFileHolder googleDriveFileHolder) {
1305 updateTimeBackUpDriver();
1306 hideLoading();
1307 }
1308 }).addOnFailureListener(new OnFailureListener() {
1309 @Override
1310 public void onFailure(@NonNull Exception e) {
1311 e.printStackTrace();
1312 hideLoading();
1313 }
1314 });
1315
1316 showCountdown();
1317 }
1318
1319 private void updateTimeBackUpDriver() {
1320
1321 if (isBackup) {
1322 Calendar calendar = Calendar.getInstance();
1323 DecimalFormat mFormat = new DecimalFormat("00");
1324
1325 String time = calendar.get(Calendar.YEAR) + "." + mFormat.format(Double.valueOf(calendar.get(Calendar.MONTH)) + 1) + "." + calendar.get(Calendar.DATE) + " " + calendar.get(Calendar.HOUR_OF_DAY) + ":" + calendar.get(Calendar.MINUTE);
1326
1327 PreferencesUtlis.putString(Consts.LINKED_APP_DRIVER, time);
1328 updateBackupDriverUI();
1329 }
1330 }
1331
1332 private void updateFileJson(String fileId) {
1333 showCountdown();
1334 mDriveServiceHelper.updateFile(localStorageUtils.getFile(Consts.LocalStorage.JSON_FILE_NAME), DriveServiceHelper.TYPE_TEXT_PLAIN, fileId)
1335 .addOnSuccessListener(new OnSuccessListener<GoogleDriveFileHolder>() {
1336 @Override
1337 public void onSuccess(GoogleDriveFileHolder googleDriveFileHolder) {
1338 updateTimeBackUpDriver();
1339
1340 }
1341 }).addOnFailureListener(new OnFailureListener() {
1342 @Override
1343 public void onFailure(@NonNull Exception e) {
1344 e.printStackTrace();
1345
1346 }
1347 });
1348
1349 }
1350
1351 private DataModel readJsonLocalFile() {
1352 return readJsonLocalFile("");
1353 }
1354
1355 private DataModel readJsonLocalFile(String folderName) {
1356 DataModel dataModel = null;
1357 Gson gson = new Gson();
1358 String dataContent = localStorageUtils.readFromFile(Consts.LocalStorage.JSON_FILE_NAME, folderName);
1359 if (dataContent != null && !dataContent.isEmpty()) {
1360 dataModel = gson.fromJson(dataContent, DataModel.class);
1361 }
1362
1363 return dataModel;
1364 }
1365
1366 private void requestSignIn() {
1367 GoogleSignInOptions signInOptions =
1368 new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
1369 .requestEmail()
1370 .requestScopes(new Scope(DriveScopes.DRIVE_FILE))
1371 .build();
1372 GoogleSignInClient client = GoogleSignIn.getClient(getContext(), signInOptions);
1373
1374 // The result of the sign-in Intent is handled in onActivityResult.
1375 startActivityForResult(client.getSignInIntent(), REQUEST_CODE_SIGN_IN);
1376 }
1377
1378 private void requestSignOut() {
1379 GoogleSignInOptions signInOptions =
1380 new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
1381 .requestEmail()
1382 .requestScopes(new Scope(DriveScopes.DRIVE_FILE))
1383 .build();
1384 GoogleSignInClient client = GoogleSignIn.getClient(getContext(), signInOptions);
1385
1386 client.signOut();
1387 }
1388
1389 /**
1390 * Handles the {@code result} of a completed sign-in activity initiated from {@link
1391 * #requestSignIn()}.
1392 */
1393 private void handleSignInResult(Intent result) {
1394 GoogleSignIn.getSignedInAccountFromIntent(result)
1395 .addOnSuccessListener(googleAccount -> {
1396 // Use the authenticated account to sign in to the Drive service.
1397 GoogleAccountCredential credential =
1398 GoogleAccountCredential.usingOAuth2(
1399 getContext(), Collections.singleton(DriveScopes.DRIVE_FILE));
1400 credential.setSelectedAccount(googleAccount.getAccount());
1401 Drive googleDriveService =
1402 new Drive.Builder(
1403 AndroidHttp.newCompatibleTransport(),
1404 new GsonFactory(),
1405 credential)
1406 .setApplicationName("Drive API Migration")
1407 .build();
1408
1409 // The DriveServiceHelper encapsulates all REST API and SAF functionality.
1410 // Its instantiation is required before handling any onClick actions.
1411 mDriveServiceHelper = new DriveServiceHelper(googleDriveService);
1412 PreferencesUtlis.putString(Consts.LINKED_APP_DRIVER, "1");
1413 updateBackupDriverUI();
1414 getStorage();
1415 })
1416 .addOnFailureListener(exception -> {
1417
1418 });
1419 }
1420
1421 private void getStorage() {
1422 GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(getContext());
1423 com.google.api.services.drive.Drive service = null;
1424 if (account == null) {
1425 requestSignIn();
1426 } else {
1427 GoogleAccountCredential credential =
1428 GoogleAccountCredential.usingOAuth2(
1429 getContext(), Collections.singleton(DriveScopes.DRIVE_FILE));
1430 credential.setSelectedAccount(account.getAccount());
1431 service =
1432 new com.google.api.services.drive.Drive.Builder(
1433 AndroidHttp.newCompatibleTransport(),
1434 new GsonFactory(),
1435 credential)
1436 .setApplicationName("AppName")
1437 .build();
1438 }
1439
1440 Drive finalService = service;
1441 Observable.create(subscriber -> {
1442 try {
1443 if (finalService != null) {
1444 About about = finalService.about().get().setFields("user, storageQuota").execute();
1445 FileList fileList = finalService.files().list().setPageSize(10).setFields("nextPageToken, files(quotaBytesUsed)").execute();
1446 List<File> listFileResult = fileList.getFiles();
1447 Long total = 0L;
1448 for (int i = 0; i < listFileResult.size(); i++) {
1449 total += listFileResult.get(i).getQuotaBytesUsed();
1450 }
1451 subscriber.onNext(total);
1452 }
1453 } catch (IOException e) {
1454 subscriber.onError(e);
1455 System.out.println("An error occurred: " + e);
1456 }
1457
1458 }).subscribeOn(Schedulers.newThread())
1459 .subscribe(data -> {
1460 Long size = (Long) data;
1461 size = size / 1024L;
1462 Log.e("TAG", "Total = " + size);
1463 }, Throwable::printStackTrace, () -> {});
1464 }
1465
1466 @Override
1467 public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
1468 switch (requestCode) {
1469 case REQUEST_CODE_SIGN_IN:
1470 if (resultCode == Activity.RESULT_OK && resultData != null) {
1471 handleSignInResult(resultData);
1472 }
1473 break;
1474
1475 }
1476
1477 super.onActivityResult(requestCode, resultCode, resultData);
1478 }
1479
1480 @Override
1481 public void onDestroy() {
1482 showAppBar();
1483 super.onDestroy();
1484 }
1485
1486
1487}