Skip to content

Commit cbeb04b

Browse files
authored
Merge pull request #203 from kaczmarkiewiczp/dev
Improve settings layout and fix crash when sharing files
2 parents 2bdb018 + 99d8610 commit cbeb04b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1973
-1222
lines changed

.idea/assetWizardSettings.xml

+3-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/caches/build_file_checksums.ser

0 Bytes
Binary file not shown.

app/build.gradle

+4-4
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ android {
77
applicationId "ca.pkay.rcloneexplorer"
88
minSdkVersion 21
99
targetSdkVersion 27
10-
versionCode 25
11-
versionName "1.7.0-DEV"
10+
versionCode 26
11+
versionName "1.7.1-DEV"
1212
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
1313
}
1414
buildTypes {
@@ -34,15 +34,15 @@ dependencies {
3434
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
3535
implementation 'com.android.support:design:27.1.1'
3636
implementation 'com.android.support:customtabs:27.1.1'
37-
implementation "com.leinardi.android:speed-dial:1.0-alpha03"
37+
implementation "com.leinardi.android:speed-dial:1.0.2"
3838
implementation 'us.feras.mdv:markdownview:1.1.0'
3939
implementation 'jp.wasabeef:recyclerview-animators:2.3.0'
4040
implementation 'com.github.GrenderG:Toasty:1.3.0'
4141
implementation 'com.android.support:support-v4:27.1.1'
4242
implementation 'com.github.bumptech.glide:glide:4.7.1'
4343
implementation 'com.google.firebase:firebase-core:16.0.1'
4444
implementation 'com.crashlytics.sdk.android:crashlytics:2.9.4'
45-
implementation 'com.google.firebase:firebase-messaging:17.1.0'
45+
implementation 'com.google.firebase:firebase-messaging:17.3.0'
4646
annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
4747
testImplementation 'junit:junit:4.12'
4848
androidTestImplementation 'com.android.support.test:runner:1.0.2'

app/src/main/AndroidManifest.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@
8282
android:parentActivityName=".AboutActivity"
8383
android:theme="@style/AppTheme.NoActionBar" />
8484
<activity
85-
android:name=".SettingsActivity"
85+
android:name=".Settings.SettingsActivity"
8686
android:label="@string/title_activity_settings"
8787
android:theme="@style/AppTheme.NoActionBar" />
8888
<activity

app/src/main/assets/changelog.md

+9
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
### 1.7.1
2+
* **New:** Redesign settings layout
3+
* **Update:** Libraries
4+
* **Fix:** Some bugs with pinned navigation drawer remotes
5+
* **Fix:** Crash when sharing files with the app
6+
* **Fix:** Some other crashes
7+
8+
***
9+
110
### 1.7.0
211
* **New:** Show progress in upload, download, and sync notifications
312
* **New:** Pin remotes to navigation drawer

app/src/main/java/ca/pkay/rcloneexplorer/FilePicker.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,16 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
116116
if (!destinationPickerType) {
117117
speedDialView.setVisibility(View.INVISIBLE);
118118
}
119-
speedDialView.setMainFabOnClickListener(new View.OnClickListener() {
119+
speedDialView.setOnChangeListener(new SpeedDialView.OnChangeListener() {
120120
@Override
121-
public void onClick(View v) {
121+
public boolean onMainActionSelected() {
122122
fabClicked();
123+
return false;
124+
}
125+
126+
@Override
127+
public void onToggleChanged(boolean isOpen) {
128+
123129
}
124130
});
125131
}

app/src/main/java/ca/pkay/rcloneexplorer/Fragments/FileExplorerFragment.java

+24-34
Original file line numberDiff line numberDiff line change
@@ -256,22 +256,27 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c
256256
}
257257

258258
fab = view.findViewById(R.id.fab);
259-
fab.setSpeedDialOverlayLayout((SpeedDialOverlayLayout)view.findViewById(R.id.fab_overlay));
260-
fab.setMainFabOnClickListener(new View.OnClickListener() {
259+
fab.setOverlayLayout((SpeedDialOverlayLayout)view.findViewById(R.id.fab_overlay));
260+
fab.setOnActionSelectedListener(new SpeedDialView.OnActionSelectedListener() {
261261
@Override
262-
public void onClick(View v) {
263-
if (fab.isFabMenuOpen()) {
264-
fab.closeOptionsMenu();
262+
public boolean onActionSelected(SpeedDialActionItem actionItem) {
263+
switch (actionItem.getId()) {
264+
case R.id.fab_add_folder:
265+
onCreateNewDirectory();
266+
break;
267+
case R.id.fab_upload:
268+
onUploadFiles();
269+
break;
265270
}
271+
return false;
266272
}
267273
});
268-
fab.addFabOptionItem(new SpeedDialActionItem.Builder(R.id.fab_upload, R.drawable.ic_file_upload)
274+
fab.addActionItem(new SpeedDialActionItem.Builder(R.id.fab_upload, R.drawable.ic_file_upload)
269275
.setLabel(getString(R.string.fab_upload_files))
270276
.create());
271-
fab.addFabOptionItem(new SpeedDialActionItem.Builder(R.id.fab_add_folder, R.drawable.ic_create_new_folder)
277+
fab.addActionItem(new SpeedDialActionItem.Builder(R.id.fab_add_folder, R.drawable.ic_create_new_folder)
272278
.setLabel(getString(R.string.fab_new_folder))
273279
.create());
274-
setFabClickListeners();
275280

276281
breadcrumbView = ((FragmentActivity) context).findViewById(R.id.breadcrumb_view);
277282
breadcrumbView.setOnClickListener(this);
@@ -751,23 +756,6 @@ private void showFileProperties(FileItem fileItem) {
751756
}
752757
}
753758

754-
private void setFabClickListeners() {
755-
fab.setOptionFabSelectedListener(new SpeedDialView.OnOptionFabSelectedListener() {
756-
@Override
757-
public void onOptionFabSelected(SpeedDialActionItem speedDialActionItem) {
758-
fab.closeOptionsMenu();
759-
switch (speedDialActionItem.getId()) {
760-
case R.id.fab_add_folder:
761-
onCreateNewDirectory();
762-
break;
763-
case R.id.fab_upload:
764-
onUploadFiles();
765-
break;
766-
}
767-
}
768-
});
769-
}
770-
771759
private void setBottomBarClickListeners(final View view) {
772760
view.findViewById(R.id.file_download).setOnClickListener(new View.OnClickListener() {
773761
@Override
@@ -1113,8 +1101,8 @@ public boolean onBackButtonPressed() {
11131101
} else if (isSearchMode) {
11141102
searchClicked();
11151103
return true;
1116-
} else if (fab.isFabMenuOpen()) {
1117-
fab.closeOptionsMenu();
1104+
} else if (fab.isOpen()) {
1105+
fab.close(true);
11181106
return true;
11191107
} else if (pathStack.isEmpty()) {
11201108
return false;
@@ -1334,8 +1322,8 @@ public void onClick(DialogInterface dialog, int which) {
13341322

13351323
@Override
13361324
public void onBreadCrumbClicked(String path) {
1337-
if (fab.isFabMenuOpen()) {
1338-
fab.closeOptionsMenu();
1325+
if (fab.isOpen()) {
1326+
fab.close(true);
13391327
}
13401328
if (isSearchMode) {
13411329
searchClicked();
@@ -1834,17 +1822,19 @@ protected Boolean doInBackground(FileItem... fileItems) {
18341822
rclone.logErrorOutput(process);
18351823
}
18361824

1837-
return process.exitValue() == 0;
1825+
return process != null && process.exitValue() == 0;
18381826
}
18391827

18401828
@Override
18411829
protected void onPostExecute(Boolean status) {
18421830
super.onPostExecute(status);
1843-
if (loadingDialog != null) {
1844-
if (loadingDialog.isStateSaved()) {
1845-
loadingDialog.dismissAllowingStateLoss();
1846-
} else {
1831+
if (loadingDialog.isStateSaved()) {
1832+
loadingDialog.dismissAllowingStateLoss();
1833+
} else {
1834+
try {
18471835
loadingDialog.dismiss();
1836+
} catch (NullPointerException e) {
1837+
return;
18481838
}
18491839
}
18501840
if (!status) {

app/src/main/java/ca/pkay/rcloneexplorer/Fragments/RemotesFragment.java

+22-9
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ public interface OnRemoteClickListener {
5555
}
5656

5757
public interface AddRemoteToNavDrawer {
58-
void addRemoteToNavDrawer(RemoteItem remoteItem);
59-
void removeRemoteFromNavDrawer(RemoteItem remoteItem);
58+
void addRemoteToNavDrawer();
59+
void removeRemoteFromNavDrawer();
6060
}
6161

6262
/**
@@ -100,11 +100,17 @@ public void onClick(View view) {
100100
});
101101

102102
SpeedDialView speedDialView = view.findViewById(R.id.fab);
103-
speedDialView.setMainFabOnClickListener(new View.OnClickListener() {
103+
speedDialView.setOnChangeListener(new SpeedDialView.OnChangeListener() {
104104
@Override
105-
public void onClick(View v) {
105+
public boolean onMainActionSelected() {
106106
Intent intent = new Intent(context, RemoteConfig.class);
107107
startActivityForResult(intent, CONFIG_RECREATE_REQ_CODE);
108+
return false;
109+
}
110+
111+
@Override
112+
public void onToggleChanged(boolean isOpen) {
113+
108114
}
109115
});
110116
return view;
@@ -122,11 +128,17 @@ public void onClick(View v) {
122128
recyclerView.setAdapter(recyclerViewAdapter);
123129

124130
SpeedDialView speedDialView = view.findViewById(R.id.fab);
125-
speedDialView.setMainFabOnClickListener(new View.OnClickListener() {
131+
speedDialView.setOnChangeListener(new SpeedDialView.OnChangeListener() {
126132
@Override
127-
public void onClick(View v) {
133+
public boolean onMainActionSelected() {
128134
Intent intent = new Intent(context, RemoteConfig.class);
129135
startActivityForResult(intent, CONFIG_REQ_CODE);
136+
return false;
137+
}
138+
139+
@Override
140+
public void onToggleChanged(boolean isOpen) {
141+
130142
}
131143
});
132144

@@ -301,7 +313,7 @@ private void pinToDrawer(RemoteItem remoteItem) {
301313
editor.putStringSet(getString(R.string.shared_preferences_drawer_pinned_remotes), pinnedRemotes);
302314
editor.apply();
303315

304-
pinToDrawerListener.addRemoteToNavDrawer(remoteItem);
316+
pinToDrawerListener.addRemoteToNavDrawer();
305317
}
306318

307319
private void unpinFromDrawer(RemoteItem remoteItem) {
@@ -318,7 +330,7 @@ private void unpinFromDrawer(RemoteItem remoteItem) {
318330
editor.putStringSet(getString(R.string.shared_preferences_drawer_pinned_remotes), pinnedRemotes);
319331
editor.apply();
320332

321-
pinToDrawerListener.removeRemoteFromNavDrawer(remoteItem);
333+
pinToDrawerListener.removeRemoteFromNavDrawer();
322334
}
323335

324336
private void deleteRemote(final RemoteItem remoteItem) {
@@ -373,8 +385,9 @@ protected void onPostExecute(Void aVoid) {
373385
Set<String> drawerPinnedRemote = sharedPreferences.getStringSet(getString(R.string.shared_preferences_drawer_pinned_remotes), new HashSet<String>());
374386
if (drawerPinnedRemote.contains(remoteItem.getName())) {
375387
drawerPinnedRemote.remove(remoteItem.getName());
376-
editor.putStringSet(getString(R.string.shared_preferences_drawer_pinned_remotes), new HashSet<String>(pinnedRemotes));
388+
editor.putStringSet(getString(R.string.shared_preferences_drawer_pinned_remotes), new HashSet<>(pinnedRemotes));
377389
editor.apply();
390+
pinToDrawerListener.removeRemoteFromNavDrawer();
378391
}
379392

380393
recyclerViewAdapter.removeItem(remoteItem);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package ca.pkay.rcloneexplorer.Fragments;
2+
3+
import android.content.Context;
4+
import android.os.Bundle;
5+
import android.support.annotation.NonNull;
6+
import android.support.annotation.Nullable;
7+
import android.support.v4.app.Fragment;
8+
import android.support.v4.app.FragmentActivity;
9+
import android.support.v7.widget.LinearLayoutManager;
10+
import android.support.v7.widget.RecyclerView;
11+
import android.view.LayoutInflater;
12+
import android.view.View;
13+
import android.view.ViewGroup;
14+
15+
import java.util.Collections;
16+
import java.util.List;
17+
18+
import ca.pkay.rcloneexplorer.Items.RemoteItem;
19+
import ca.pkay.rcloneexplorer.R;
20+
import ca.pkay.rcloneexplorer.Rclone;
21+
import ca.pkay.rcloneexplorer.RecyclerViewAdapters.ShareRemotesRecyclerViewAdapter;
22+
import jp.wasabeef.recyclerview.animators.LandingAnimator;
23+
24+
public class ShareRemotesFragment extends Fragment {
25+
26+
private List<RemoteItem> remotes;
27+
private OnRemoteClickListener remoteClickListener;
28+
private Context context;
29+
30+
public interface OnRemoteClickListener {
31+
void onRemoteClick(RemoteItem remote);
32+
}
33+
34+
/**
35+
* Mandatory empty constructor for the fragment manager to instantiate the
36+
* fragment (e.g. upon screen orientation changes).
37+
*/
38+
public ShareRemotesFragment() {
39+
}
40+
41+
@SuppressWarnings("unused")
42+
public static ShareRemotesFragment newInstance() {
43+
return new ShareRemotesFragment();
44+
}
45+
46+
@Override
47+
public void onCreate(@Nullable Bundle savedInstanceState) {
48+
super.onCreate(savedInstanceState);
49+
if (getContext() == null) {
50+
return;
51+
}
52+
53+
((FragmentActivity) context).setTitle(getString(R.string.remotes_toolbar_title));
54+
Rclone rclone = new Rclone(getContext());
55+
remotes = rclone.getRemotes();
56+
Collections.sort(remotes);
57+
}
58+
59+
@Nullable
60+
@Override
61+
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
62+
View view = inflater.inflate(R.layout.fragment_share_remotes_list, container, false);
63+
64+
final Context context = view.getContext();
65+
RecyclerView recyclerView = view.findViewById(R.id.share_remotes_list);
66+
recyclerView.setItemAnimator(new LandingAnimator());
67+
recyclerView.setLayoutManager(new LinearLayoutManager(context));
68+
ShareRemotesRecyclerViewAdapter recyclerViewAdapter = new ShareRemotesRecyclerViewAdapter(remotes, remoteClickListener);
69+
recyclerView.setAdapter(recyclerViewAdapter);
70+
71+
return view;
72+
}
73+
74+
@Override
75+
public void onAttach(Context context) {
76+
super.onAttach(context);
77+
this.context = context;
78+
if (context instanceof OnRemoteClickListener) {
79+
remoteClickListener = (OnRemoteClickListener) context;
80+
} else {
81+
throw new RuntimeException(context.toString() + " must implement OnRemoteClickListener");
82+
}
83+
}
84+
85+
@Override
86+
public void onDetach() {
87+
super.onDetach();
88+
context = null;
89+
remoteClickListener = null;
90+
}
91+
}

app/src/main/java/ca/pkay/rcloneexplorer/MainActivity.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import ca.pkay.rcloneexplorer.Fragments.FileExplorerFragment;
5151
import ca.pkay.rcloneexplorer.Fragments.RemotesFragment;
5252
import ca.pkay.rcloneexplorer.Items.RemoteItem;
53+
import ca.pkay.rcloneexplorer.Settings.SettingsActivity;
5354
import es.dmoral.toasty.Toasty;
5455
import io.fabric.sdk.android.Fabric;
5556

@@ -476,7 +477,7 @@ private void startPinnedRemote(RemoteItem remoteItem) {
476477
}
477478

478479
@Override
479-
public void addRemoteToNavDrawer(RemoteItem remoteItem) {
480+
public void addRemoteToNavDrawer() {
480481
Menu menu = navigationView.getMenu();
481482

482483
// remove all items and add them again so that it's in alpha order
@@ -488,7 +489,7 @@ public void addRemoteToNavDrawer(RemoteItem remoteItem) {
488489
}
489490

490491
@Override
491-
public void removeRemoteFromNavDrawer(RemoteItem remoteItem) {
492+
public void removeRemoteFromNavDrawer() {
492493
Menu menu = navigationView.getMenu();
493494

494495
// remove all items and add them again so that it's in alpha order
@@ -586,10 +587,12 @@ protected void onPostExecute(Boolean success) {
586587
editor.apply();
587588

588589
if (rclone.isConfigEncrypted()) {
590+
pinRemotesToDrawer(); // this will clear any previous pinned remotes
589591
askForConfigPassword();
590592
} else {
591593
AppShortcutsHelper.removeAllAppShortcuts(context);
592594
AppShortcutsHelper.populateAppShortcuts(context, rclone.getRemotes());
595+
pinRemotesToDrawer();
593596
startRemotesFragment();
594597
}
595598
}

0 commit comments

Comments
 (0)