Skip to content

Commit 169c218

Browse files
authored
Merge pull request #64 from kaczmarkiewiczp/dev
v1.2.2
2 parents 7a29df8 + 90c129a commit 169c218

20 files changed

+287
-112
lines changed

.idea/assetWizardSettings.xml

+2-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

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ android {
66
applicationId "ca.pkay.rcloneexplorer"
77
minSdkVersion 21
88
targetSdkVersion 27
9-
versionCode 10
10-
versionName "1.2.1"
9+
versionCode 11
10+
versionName "1.2.2"
1111
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
1212
}
1313
buildTypes {

app/src/main/assets/changelog.md

+8
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
### 1.2.2
2+
* **Update:** Rclone to version 1.41
3+
* **New:** App shortcuts
4+
* **Fix:** Color picker not working on sdk 21
5+
* **Fix:** Rclone not getting updated
6+
7+
***
8+
19
### 1.2.1
210
* **New:** Dark theme!
311
* **Fix:** Crash when starting app for the first time

app/src/main/assets/rclone-arm32

1.66 MB
Binary file not shown.

app/src/main/assets/rclone-arm64

3.27 MB
Binary file not shown.

app/src/main/assets/rclone-x86_32

1.69 MB
Binary file not shown.

app/src/main/java/ca/pkay/rcloneexplorer/Dialogs/ColorPickerDialog.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.app.Dialog;
44
import android.content.Context;
55
import android.content.DialogInterface;
6+
import android.content.res.ColorStateList;
67
import android.os.Bundle;
78
import android.support.annotation.NonNull;
89
import android.support.v4.app.DialogFragment;
@@ -11,6 +12,7 @@
1112
import android.util.TypedValue;
1213
import android.view.LayoutInflater;
1314
import android.view.View;
15+
import android.widget.ImageView;
1416
import android.widget.LinearLayout;
1517

1618
import ca.pkay.rcloneexplorer.R;
@@ -70,8 +72,8 @@ private void createLayout(View view) {
7072
int i = 0;
7173
for (final int color : colorChoices) {
7274
View item = layoutInflater.inflate(R.layout.color_picker_item, null);
73-
View colorOption = item.findViewById(R.id.color_option);
74-
colorOption.getBackground().setTint(color);
75+
ImageView colorOption = item.findViewById(R.id.color_option);
76+
colorOption.setColorFilter(color);
7577

7678
if (color == defaultColor) {
7779
(item.findViewById(R.id.checkmark)).setVisibility(View.VISIBLE);
@@ -104,10 +106,10 @@ public void onClick(View v) {
104106

105107
while (i < 5) { // add dummy items so that layout is even
106108
View item = layoutInflater.inflate(R.layout.color_picker_item, null);
107-
View colorOption = item.findViewById(R.id.color_option);
109+
ImageView colorOption = item.findViewById(R.id.color_option);
108110
TypedValue typedValue = new TypedValue();
109111
context.getTheme().resolveAttribute(R.attr.cardColor, typedValue, true);
110-
colorOption.getBackground().setTint(typedValue.data);
112+
colorOption.setColorFilter(typedValue.data);
111113
rowLayout.addView(item);
112114
i++;
113115
}

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

+5-2
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) {
128128
setHasOptionsMenu(true);
129129

130130
SharedPreferences sharedPreferences = context.getSharedPreferences(MainActivity.SHARED_PREFS_TAG, Context.MODE_PRIVATE);
131-
sortOrder = sharedPreferences.getInt(SHARED_PREFS_SORT_ORDER, -1);
131+
sortOrder = sharedPreferences.getInt(SHARED_PREFS_SORT_ORDER, SortDialog.ALPHA_ASCENDING);
132132

133133
//networkStateReceiver = ((MainActivity)context).getNetworkStateReceiver();
134134
rclone = new Rclone(getContext());
@@ -440,7 +440,9 @@ private void showSortMenu() {
440440
.setListener(new SortDialog.OnClickListener() {
441441
@Override
442442
public void onPositiveButtonClick(int sortById, int sortOrderId) {
443-
sortSelected(sortById, sortOrderId);
443+
if (directoryContent != null && !directoryContent.isEmpty()) {
444+
sortSelected(sortById, sortOrderId);
445+
}
444446
}
445447
})
446448
.setSortOrder(sortOrder)
@@ -590,6 +592,7 @@ public void onDirectoryClicked(FileItem fileItem) {
590592
}
591593
path = fileItem.getPath();
592594
recyclerViewAdapter.clear();
595+
directoryContent.clear();
593596
fetchDirectoryTask = new FetchDirectoryContent().execute();
594597

595598
}

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

+141
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,11 @@
1010
import android.content.IntentFilter;
1111
import android.content.SharedPreferences;
1212
import android.content.pm.PackageManager;
13+
import android.content.pm.ShortcutInfo;
14+
import android.content.pm.ShortcutManager;
1315
import android.graphics.Bitmap;
1416
import android.graphics.BitmapFactory;
17+
import android.graphics.drawable.Icon;
1518
import android.net.ConnectivityManager;
1619
import android.net.Uri;
1720
import android.os.AsyncTask;
@@ -37,6 +40,9 @@
3740

3841
import java.io.File;
3942
import java.io.IOException;
43+
import java.util.ArrayList;
44+
import java.util.Collections;
45+
import java.util.List;
4046

4147
import ca.pkay.rcloneexplorer.BroadcastReceivers.NetworkStateReceiver;
4248
import ca.pkay.rcloneexplorer.Dialogs.InputDialog;
@@ -54,6 +60,8 @@ public class MainActivity extends AppCompatActivity
5460
private static final int READ_REQUEST_CODE = 42; // code when opening rclone config file
5561
private static final int REQUEST_PERMISSION_CODE = 62; // code when requesting permissions
5662
private static final int SETTINGS_CODE = 71; // code when coming back from settings
63+
private final String APP_SHORTCUT_REMOTE_NAME = "arg_remote_name";
64+
private final String APP_SHORTCUT_REMOTE_TYPE = "arg_remote_type";
5765
private NavigationView navigationView;
5866
private Rclone rclone;
5967
private Fragment fragment;
@@ -94,10 +102,26 @@ public void onClick(View v) {
94102
}
95103
});
96104

105+
Intent intent = getIntent();
106+
Bundle bundle = intent.getExtras();
107+
108+
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
109+
int lastVersionCode = sharedPreferences.getInt(getString(R.string.pref_key_version_code), -1);
110+
int currentVersionCode = BuildConfig.VERSION_CODE;
111+
97112
if (!rclone.isRcloneBinaryCreated()) {
98113
new CreateRcloneBinary().execute();
114+
} else if (lastVersionCode < currentVersionCode) {
115+
new CreateRcloneBinary().execute();
116+
SharedPreferences.Editor editor = sharedPreferences.edit();
117+
editor.putInt(getString(R.string.pref_key_version_code), currentVersionCode);
118+
editor.apply();
99119
} else if (rclone.isConfigEncrypted()) {
100120
askForConfigPassword();
121+
} else if (bundle != null && bundle.containsKey(APP_SHORTCUT_REMOTE_NAME) && bundle.containsKey(APP_SHORTCUT_REMOTE_TYPE)) {
122+
String remoteName = bundle.getString(APP_SHORTCUT_REMOTE_NAME);
123+
String remoteType = bundle.getString(APP_SHORTCUT_REMOTE_TYPE);
124+
startRemote(remoteName, remoteType);
101125
} else {
102126
startRemotesFragment();
103127
}
@@ -269,14 +293,129 @@ public void requestPermissions() {
269293
}
270294
}
271295

296+
private void addRemotesToShortcutList() {
297+
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.N_MR1) {
298+
return;
299+
}
300+
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
301+
if (shortcutManager == null) {
302+
return;
303+
}
304+
shortcutManager.removeAllDynamicShortcuts();
305+
306+
List<RemoteItem> remoteItemList = rclone.getRemotes();
307+
List<ShortcutInfo> shortcutInfoList = new ArrayList<>();
308+
309+
for (RemoteItem remoteItem : remoteItemList) {
310+
String id = remoteItem.getName().replaceAll(" ", "_");
311+
312+
Intent intent = new Intent(Intent.ACTION_MAIN, Uri.EMPTY, this, MainActivity.class);
313+
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
314+
intent.putExtra(APP_SHORTCUT_REMOTE_NAME, remoteItem.getName());
315+
intent.putExtra(APP_SHORTCUT_REMOTE_TYPE, remoteItem.getType());
316+
317+
ShortcutInfo shortcut = new ShortcutInfo.Builder(this, id)
318+
.setShortLabel(remoteItem.getName())
319+
.setIcon(Icon.createWithResource(context, getRemoteIcon(remoteItem.getType())))
320+
.setIntent(intent)
321+
.build();
322+
shortcutInfoList.add(shortcut);
323+
if (shortcutInfoList.size() == 4) {
324+
break;
325+
}
326+
}
327+
shortcutManager.setDynamicShortcuts(shortcutInfoList);
328+
}
329+
330+
private void addRemoteToShortcutList(RemoteItem remoteItem) {
331+
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.N_MR1) {
332+
return;
333+
}
334+
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
335+
if (shortcutManager == null) {
336+
return;
337+
}
338+
339+
String id = remoteItem.getName().replaceAll(" ", "_");
340+
341+
List<ShortcutInfo> shortcutInfoList = shortcutManager.getDynamicShortcuts();
342+
for (ShortcutInfo shortcutInfo : shortcutInfoList) {
343+
if (shortcutInfo.getId().equals(id)) {
344+
shortcutManager.reportShortcutUsed(id);
345+
return;
346+
}
347+
}
348+
349+
Intent intent = new Intent(Intent.ACTION_MAIN, Uri.EMPTY, this, MainActivity.class);
350+
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
351+
intent.putExtra(APP_SHORTCUT_REMOTE_NAME, remoteItem.getName());
352+
intent.putExtra(APP_SHORTCUT_REMOTE_TYPE, remoteItem.getType());
353+
354+
ShortcutInfo shortcut = new ShortcutInfo.Builder(this, id)
355+
.setShortLabel(remoteItem.getName())
356+
.setIcon(Icon.createWithResource(context, getRemoteIcon(remoteItem.getType())))
357+
.setIntent(intent)
358+
.build();
359+
360+
if (shortcutInfoList.size() >= 4) {
361+
ShortcutInfo removeId = shortcutInfoList.get(0);
362+
shortcutManager.removeDynamicShortcuts(Collections.singletonList(removeId.getId()));
363+
}
364+
shortcutManager.addDynamicShortcuts(Collections.singletonList(shortcut));
365+
shortcutManager.reportShortcutUsed(id);
366+
}
367+
368+
private int getRemoteIcon(String remoteType) {
369+
switch (remoteType) {
370+
case "crypt":
371+
return R.drawable.ic_lock_black;
372+
case "amazon cloud drive":
373+
return R.drawable.ic_amazon;
374+
case "b2":
375+
return R.drawable.ic_b2;
376+
case "drive":
377+
return R.drawable.ic_google_drive;
378+
case "dropbox":
379+
return R.drawable.ic_dropbox;
380+
case "google cloud storage":
381+
return R.drawable.ic_google;
382+
case "onedrive":
383+
return R.drawable.ic_onedrive;
384+
case "s3":
385+
return R.drawable.ic_amazon;
386+
case "yandex":
387+
return R.drawable.ic_yandex;
388+
case "box":
389+
return R.drawable.ic_box;
390+
case "sftp":
391+
return R.drawable.ic_terminal;
392+
default:
393+
return R.drawable.ic_cloud;
394+
}
395+
}
396+
272397
@Override
273398
public void onRemoteClick(RemoteItem remote) {
399+
startRemote(remote);
400+
}
401+
402+
private void startRemote(RemoteItem remote) {
274403
fragment = FileExplorerFragment.newInstance(remote.getName(), remote.getType());
275404
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
276405
transaction.replace(R.id.flFragment, fragment);
277406
transaction.addToBackStack(null);
278407
transaction.commit();
279408

409+
addRemoteToShortcutList(remote);
410+
navigationView.getMenu().getItem(0).setChecked(false);
411+
}
412+
413+
private void startRemote(String remoteName, String remoteType) {
414+
fragment = FileExplorerFragment.newInstance(remoteName, remoteType);
415+
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
416+
transaction.replace(R.id.flFragment, fragment);
417+
transaction.commit();
418+
280419
navigationView.getMenu().getItem(0).setChecked(false);
281420
}
282421

@@ -356,6 +495,7 @@ protected void onPostExecute(Boolean success) {
356495
if (rclone.isConfigEncrypted()) {
357496
askForConfigPassword();
358497
} else {
498+
addRemotesToShortcutList();
359499
startRemotesFragment();
360500
}
361501
}
@@ -390,6 +530,7 @@ protected void onPostExecute(Boolean success) {
390530
askForConfigPassword();
391531
} else {
392532
findViewById(R.id.locked_config).setVisibility(View.GONE);
533+
addRemotesToShortcutList();
393534
startRemotesFragment();
394535
}
395536
}

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

+5-4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import android.support.v7.widget.Toolbar;
1414
import android.view.View;
1515
import android.widget.CompoundButton;
16+
import android.widget.ImageView;
1617
import android.widget.Switch;
1718
import android.widget.TextView;
1819

@@ -21,9 +22,9 @@
2122
public class SettingsActivity extends AppCompatActivity {
2223

2324
private View primaryColorElement;
24-
private View primaryColorPreview;
25+
private ImageView primaryColorPreview;
2526
private View accentColorElement;
26-
private View accentColorPreview;
27+
private ImageView accentColorPreview;
2728
private Switch darkThemeSwitch;
2829
private View darkThemeElement;
2930
private View notificationsElement;
@@ -194,7 +195,7 @@ private void onPrimaryColorSelected(int color) {
194195
editor.putInt(getString(R.string.pref_key_color_primary), color);
195196
editor.apply();
196197

197-
primaryColorPreview.getBackground().setTint(color);
198+
primaryColorPreview.setColorFilter(color);
198199
showSnackBar();
199200
}
200201

@@ -204,7 +205,7 @@ private void onAccentColorSelected(int color) {
204205
editor.putInt(getString(R.string.pref_key_color_accent), color);
205206
editor.apply();
206207

207-
accentColorPreview.getBackground().setTint(color);
208+
accentColorPreview.setColorFilter(color);
208209
showSnackBar();
209210
}
210211

app/src/main/res/drawable/grey_circle.xml

-5
This file was deleted.
+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="24dp"
3+
android:height="24dp"
4+
android:viewportWidth="24"
5+
android:viewportHeight="24">
6+
<path
7+
android:fillColor="#FF000000"
8+
android:pathData="M12,2A10,10 0,0 0,2 12A10,10 0,0 0,12 22A10,10 0,0 0,22 12A10,10 0,0 0,12 2Z"/>
9+
</vector>

app/src/main/res/layout/color_picker_item.xml

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66
android:paddingStart="8dp"
77
android:paddingEnd="8dp"
88
android:paddingTop="12dp">
9-
<View
9+
<ImageView
1010
android:id="@+id/color_option"
1111
android:layout_width="48dp"
1212
android:layout_height="48dp"
13-
android:backgroundTint="@color/colorPrimary"
14-
android:background="@drawable/grey_circle" />
13+
android:src="@drawable/ic_circle"
14+
android:contentDescription="@string/content_description_circle" />
1515
<ImageView
1616
android:id="@+id/checkmark"
1717
android:layout_width="48dp"

0 commit comments

Comments
 (0)