Skip to content
This repository was archived by the owner on Jun 27, 2020. It is now read-only.

Commit 42449e7

Browse files
author
Evgenii
authored
Merge pull request #110 from evgenii-kanivets/dropbox
[9h]. Dropbox backups
2 parents bc9b727 + d056a0c commit 42449e7

24 files changed

+633
-15
lines changed

app/build.gradle

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,11 @@ dependencies {
5050
compile 'com.android.support:support-v4:23.2.1'
5151
compile 'com.android.support:appcompat-v7:23.2.1'
5252
compile 'com.android.support:design:23.2.1'
53-
// View annotation bindings
54-
compile 'com.jakewharton:butterknife:7.0.1'
55-
// Dependency injection tool
56-
compile 'com.google.dagger:dagger:2.0.1'
57-
// Charts
58-
compile 'com.github.PhilJay:MPAndroidChart:v2.2.4'
59-
// Advanced logging tool
60-
compile 'com.jakewharton.timber:timber:4.1.2'
53+
54+
compile 'com.jakewharton:butterknife:7.0.1' // View annotation bindings
55+
compile 'com.google.dagger:dagger:2.0.1' // Dependency injection tool
56+
compile 'com.github.PhilJay:MPAndroidChart:v2.2.4' // Charts
57+
compile 'com.jakewharton.timber:timber:4.1.2' // Advanced logging tool
6158

6259
apt 'com.google.dagger:dagger-compiler:2.0.1'
6360
provided 'org.glassfish:javax.annotation:10.0-b28'
164 KB
Binary file not shown.

app/libs/json_simple-1.1.jar

15.7 KB
Binary file not shown.

app/src/main/AndroidManifest.xml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
package="com.blogspot.e_kanivets.moneytracker">
44

5+
<!-- Used only for Dropbox backup -->
6+
<uses-permission android:name="android.permission.INTERNET" />
7+
58
<application
69
android:name=".MtApp"
710
android:allowBackup="true"
@@ -78,6 +81,24 @@
7881
android:label="@string/title_import"
7982
android:screenOrientation="portrait"
8083
android:theme="@style/Theme.Default" />
84+
<activity
85+
android:name=".activity.external.BackupActivity"
86+
android:label="@string/backup_data"
87+
android:screenOrientation="portrait"
88+
android:theme="@style/Theme.Default" />
89+
<activity
90+
android:name="com.dropbox.client2.android.AuthActivity"
91+
android:configChanges="orientation|keyboard"
92+
android:launchMode="singleTask"
93+
android:theme="@android:style/Theme.Translucent.NoTitleBar">
94+
<intent-filter>
95+
<data android:scheme="db-5lqugcckdy9y6lj" />
96+
<action android:name="android.intent.action.VIEW" />
97+
98+
<category android:name="android.intent.category.BROWSABLE" />
99+
<category android:name="android.intent.category.DEFAULT" />
100+
</intent-filter>
101+
</activity>
81102

82103
<provider
83104
android:name="android.support.v4.content.FileProvider"

app/src/main/java/com/blogspot/e_kanivets/moneytracker/MtApp.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public void onCreate() {
3030
super.onCreate();
3131

3232
mtApp = this;
33-
component = buildComponent();
33+
buildAppComponent();
3434

3535
if (BuildConfig.DEBUG) Timber.plant(new Timber.DebugTree());
3636
else Timber.plant(new ReleaseTree());
@@ -40,6 +40,10 @@ public AppComponent getAppComponent() {
4040
return component;
4141
}
4242

43+
public void buildAppComponent() {
44+
component = buildComponent();
45+
}
46+
4347
private AppComponent buildComponent() {
4448
return DaggerAppComponent.builder()
4549
.cachedRepoModule(new CachedRepoModule(get()))

app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseActivity.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import android.support.annotation.LayoutRes;
66
import android.support.annotation.Nullable;
77
import android.support.annotation.StringRes;
8+
import android.support.v7.app.AlertDialog;
89
import android.support.v7.app.AppCompatActivity;
910
import android.support.v7.widget.Toolbar;
1011
import android.widget.Toast;
@@ -77,6 +78,18 @@ public void stopProgress() {
7778
getProgressBar().dismiss();
7879
}
7980

81+
public void showAlert(@Nullable String title, @Nullable String message) {
82+
AlertDialog.Builder builder = new AlertDialog.Builder(BaseActivity.this);
83+
builder.setTitle(title);
84+
builder.setMessage(message);
85+
builder.setPositiveButton(android.R.string.ok, null);
86+
builder.setCancelable(false);
87+
88+
AlertDialog dialog = builder.create();
89+
dialog.setCanceledOnTouchOutside(false);
90+
dialog.show();
91+
}
92+
8093
private ProgressDialog getProgressBar() {
8194
if (progressDialog == null) progressDialog = new ProgressDialog(this);
8295
return progressDialog;

app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseDrawerActivity.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import com.blogspot.e_kanivets.moneytracker.R;
1212
import com.blogspot.e_kanivets.moneytracker.activity.ChartsActivity;
13+
import com.blogspot.e_kanivets.moneytracker.activity.external.BackupActivity;
1314
import com.blogspot.e_kanivets.moneytracker.activity.external.ExportActivity;
1415
import com.blogspot.e_kanivets.moneytracker.activity.external.ImportActivity;
1516
import com.blogspot.e_kanivets.moneytracker.activity.SettingsActivity;
@@ -31,6 +32,7 @@ public abstract class BaseDrawerActivity extends BaseActivity
3132
private static final int REQUEST_RATES = 2;
3233
private static final int REQUEST_SETTINGS = 3;
3334
private static final int REQUEST_IMPORT = 4;
35+
protected static final int REQUEST_BACKUP = 5;
3436

3537
@Bind(R.id.drawer_layout)
3638
DrawerLayout drawer;
@@ -84,6 +86,11 @@ public boolean onNavigationItemSelected(MenuItem item) {
8486
startActivity(new Intent(BaseDrawerActivity.this, ChartsActivity.class));
8587
break;
8688

89+
case R.id.nav_backup:
90+
startActivityForResult(new Intent(BaseDrawerActivity.this, BackupActivity.class),
91+
REQUEST_BACKUP);
92+
break;
93+
8794
case R.id.nav_import:
8895
startActivityForResult(new Intent(BaseDrawerActivity.this, ImportActivity.class),
8996
REQUEST_IMPORT);
Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
package com.blogspot.e_kanivets.moneytracker.activity.external;
2+
3+
import android.content.DialogInterface;
4+
import android.support.annotation.NonNull;
5+
import android.support.v7.app.AlertDialog;
6+
import android.view.View;
7+
import android.widget.ArrayAdapter;
8+
import android.widget.ListView;
9+
10+
import com.blogspot.e_kanivets.moneytracker.MtApp;
11+
import com.blogspot.e_kanivets.moneytracker.R;
12+
import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity;
13+
import com.blogspot.e_kanivets.moneytracker.controller.BackupController;
14+
import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController;
15+
import com.dropbox.client2.DropboxAPI;
16+
import com.dropbox.client2.android.AndroidAuthSession;
17+
import com.dropbox.client2.session.AppKeyPair;
18+
19+
import java.util.List;
20+
21+
import javax.inject.Inject;
22+
23+
import butterknife.Bind;
24+
import butterknife.OnClick;
25+
import butterknife.OnItemClick;
26+
import timber.log.Timber;
27+
28+
public class BackupActivity extends BaseBackActivity {
29+
private static final String APP_KEY = "5lqugcckdy9y6lj";
30+
private static final String APP_SECRET = "psbu50k9713u68j";
31+
32+
@Inject
33+
PreferenceController preferenceController;
34+
@Inject
35+
BackupController backupController;
36+
37+
private DropboxAPI<AndroidAuthSession> dbApi;
38+
39+
@Bind(R.id.btn_backup_now)
40+
View btnBackupNow;
41+
@Bind(R.id.list_view)
42+
ListView listView;
43+
44+
@Override
45+
protected int getContentViewId() {
46+
return R.layout.activity_backup;
47+
}
48+
49+
@Override
50+
protected boolean initData() {
51+
getAppComponent().inject(BackupActivity.this);
52+
53+
AppKeyPair appKeys = new AppKeyPair(APP_KEY, APP_SECRET);
54+
String accessToken = preferenceController.readDropboxAccessToken();
55+
56+
AndroidAuthSession session = new AndroidAuthSession(appKeys);
57+
dbApi = new DropboxAPI<>(session);
58+
if (accessToken == null) dbApi.getSession().startOAuth2Authentication(BackupActivity.this);
59+
else {
60+
dbApi.getSession().setOAuth2AccessToken(accessToken);
61+
fetchBackups();
62+
}
63+
64+
return super.initData();
65+
}
66+
67+
@Override
68+
protected void initViews() {
69+
super.initViews();
70+
btnBackupNow.setEnabled(preferenceController.readDropboxAccessToken() != null);
71+
}
72+
73+
@Override
74+
protected void onResume() {
75+
super.onResume();
76+
77+
if (dbApi.getSession().authenticationSuccessful()) {
78+
try {
79+
// Required to complete auth, sets the access token on the session
80+
dbApi.getSession().finishAuthentication();
81+
preferenceController.writeDropboxAccessToken(dbApi.getSession().getOAuth2AccessToken());
82+
btnBackupNow.setEnabled(true);
83+
fetchBackups();
84+
} catch (IllegalStateException e) {
85+
Timber.e("Error authenticating: %s", e.getMessage());
86+
}
87+
}
88+
}
89+
90+
@OnClick(R.id.btn_backup_now)
91+
public void backupNow() {
92+
startProgress();
93+
backupController.makeBackup(dbApi, new BackupController.OnBackupListener() {
94+
@Override
95+
public void onBackupSuccess() {
96+
Timber.d("Backup success.");
97+
stopProgress();
98+
fetchBackups();
99+
}
100+
101+
@Override
102+
public void onBackupFailure(String reason) {
103+
Timber.d("Backup failure.");
104+
stopProgress();
105+
showToast(R.string.failed_create_backup);
106+
107+
if (BackupController.OnBackupListener.ERROR_AUTHENTICATION.equals(reason)) logout();
108+
}
109+
});
110+
}
111+
112+
@OnItemClick(R.id.list_view)
113+
public void restoreBackupClicked(int position) {
114+
final String backupName = listView.getAdapter().getItem(position).toString();
115+
116+
AlertDialog.Builder builder = new AlertDialog.Builder(BackupActivity.this);
117+
builder.setTitle(getString(R.string.warning));
118+
builder.setMessage(getString(R.string.want_erase_and_restore, backupName));
119+
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
120+
@Override
121+
public void onClick(DialogInterface dialog, int which) {
122+
restoreBackup(backupName);
123+
}
124+
});
125+
builder.setNegativeButton(android.R.string.cancel, null);
126+
builder.show();
127+
}
128+
129+
private void restoreBackup(final String backupName) {
130+
startProgress();
131+
backupController.restoreBackup(dbApi, backupName, new BackupController.OnRestoreBackupListener() {
132+
@Override
133+
public void onRestoreSuccess() {
134+
Timber.d("Restore success.");
135+
stopProgress();
136+
137+
AlertDialog.Builder builder = new AlertDialog.Builder(BackupActivity.this);
138+
builder.setTitle(getString(R.string.backup_is_restored));
139+
builder.setMessage(getString(R.string.backup_restored, backupName));
140+
builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
141+
@Override
142+
public void onDismiss(DialogInterface dialog) {
143+
MtApp.get().buildAppComponent();
144+
setResult(RESULT_OK);
145+
finish();
146+
}
147+
});
148+
builder.setPositiveButton(android.R.string.ok, null);
149+
builder.show();
150+
}
151+
152+
@Override
153+
public void onRestoreFailure(String reason) {
154+
Timber.d("Restore failure.");
155+
stopProgress();
156+
showToast(R.string.failed_restore_backup);
157+
158+
if (BackupController.OnRestoreBackupListener.ERROR_AUTHENTICATION.equals(reason))
159+
logout();
160+
}
161+
});
162+
}
163+
164+
private void fetchBackups() {
165+
startProgress();
166+
backupController.fetchBackups(dbApi, new BackupController.OnFetchBackupListListener() {
167+
@Override
168+
public void onBackupsFetched(@NonNull List<String> backupList) {
169+
stopProgress();
170+
ArrayAdapter<String> adapter = new ArrayAdapter<>(BackupActivity.this,
171+
android.R.layout.simple_list_item_1, backupList);
172+
listView.setAdapter(adapter);
173+
}
174+
});
175+
}
176+
177+
private void logout() {
178+
preferenceController.writeDropboxAccessToken(null);
179+
dbApi.getSession().startOAuth2Authentication(BackupActivity.this);
180+
btnBackupNow.setEnabled(false);
181+
}
182+
}

app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/MainActivity.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public class MainActivity extends BaseDrawerActivity {
4141
@SuppressWarnings("unused")
4242
private static final String TAG = "MainActivity";
4343

44-
private static final int REQUEST_ACTION_RECORD = 1;
44+
private static final int REQUEST_ACTION_RECORD = 6;
4545

4646
private List<Record> recordList;
4747
private Period period;
@@ -158,6 +158,11 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
158158
update();
159159
break;
160160

161+
case REQUEST_BACKUP:
162+
getAppComponent().inject(MainActivity.this);
163+
update();
164+
break;
165+
161166
default:
162167
break;
163168
}

0 commit comments

Comments
 (0)