mirror of
https://github.com/syncthing/syncthing-android.git
synced 2025-01-11 04:25:53 +00:00
Added "edit ignores" button (fixes #881)
This commit is contained in:
parent
3f0be34f3e
commit
42a87031f1
8 changed files with 75 additions and 7 deletions
|
@ -3,7 +3,9 @@ package com.nutomic.syncthingandroid.activities;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
|
import android.content.ActivityNotFoundException;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v7.widget.SwitchCompat;
|
import android.support.v7.widget.SwitchCompat;
|
||||||
|
@ -30,6 +32,8 @@ import com.nutomic.syncthingandroid.model.Folder;
|
||||||
import com.nutomic.syncthingandroid.service.SyncthingService;
|
import com.nutomic.syncthingandroid.service.SyncthingService;
|
||||||
import com.nutomic.syncthingandroid.util.TextWatcherAdapter;
|
import com.nutomic.syncthingandroid.util.TextWatcherAdapter;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -64,6 +68,8 @@ public class FolderActivity extends SyncthingActivity
|
||||||
|
|
||||||
private static final int FILE_VERSIONING_DIALOG_REQUEST = 3454;
|
private static final int FILE_VERSIONING_DIALOG_REQUEST = 3454;
|
||||||
|
|
||||||
|
private static final String IGNORE_FILE_NAME = ".stignore";
|
||||||
|
|
||||||
private Folder mFolder;
|
private Folder mFolder;
|
||||||
|
|
||||||
private EditText mLabelView;
|
private EditText mLabelView;
|
||||||
|
@ -73,6 +79,7 @@ public class FolderActivity extends SyncthingActivity
|
||||||
private ViewGroup mDevicesContainer;
|
private ViewGroup mDevicesContainer;
|
||||||
private TextView mVersioningDescriptionView;
|
private TextView mVersioningDescriptionView;
|
||||||
private TextView mVersioningTypeView;
|
private TextView mVersioningTypeView;
|
||||||
|
private TextView mEditIgnores;
|
||||||
|
|
||||||
private boolean mIsCreateMode;
|
private boolean mIsCreateMode;
|
||||||
private boolean mFolderNeedsToUpdate;
|
private boolean mFolderNeedsToUpdate;
|
||||||
|
@ -130,11 +137,13 @@ public class FolderActivity extends SyncthingActivity
|
||||||
mVersioningDescriptionView = findViewById(R.id.versioningDescription);
|
mVersioningDescriptionView = findViewById(R.id.versioningDescription);
|
||||||
mVersioningTypeView = findViewById(R.id.versioningType);
|
mVersioningTypeView = findViewById(R.id.versioningType);
|
||||||
mDevicesContainer = findViewById(R.id.devicesContainer);
|
mDevicesContainer = findViewById(R.id.devicesContainer);
|
||||||
|
mEditIgnores = findViewById(R.id.edit_ignores);
|
||||||
|
|
||||||
mPathView.setOnClickListener(view ->
|
mPathView.setOnClickListener(view ->
|
||||||
startActivityForResult(FolderPickerActivity.createIntent(this, mFolder.path), FolderPickerActivity.DIRECTORY_REQUEST_CODE));
|
startActivityForResult(FolderPickerActivity.createIntent(this, mFolder.path), FolderPickerActivity.DIRECTORY_REQUEST_CODE));
|
||||||
|
|
||||||
findViewById(R.id.versioningContainer).setOnClickListener(v -> showVersioningDialog());
|
findViewById(R.id.versioningContainer).setOnClickListener(v -> showVersioningDialog());
|
||||||
|
mEditIgnores.setOnClickListener(v -> editIgnores());
|
||||||
|
|
||||||
if (mIsCreateMode) {
|
if (mIsCreateMode) {
|
||||||
if (savedInstanceState != null) {
|
if (savedInstanceState != null) {
|
||||||
|
@ -148,6 +157,7 @@ public class FolderActivity extends SyncthingActivity
|
||||||
}
|
}
|
||||||
// Open keyboard on label view in edit mode.
|
// Open keyboard on label view in edit mode.
|
||||||
mLabelView.requestFocus();
|
mLabelView.requestFocus();
|
||||||
|
mEditIgnores.setEnabled(false);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
prepareEditMode();
|
prepareEditMode();
|
||||||
|
@ -166,6 +176,25 @@ public class FolderActivity extends SyncthingActivity
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void editIgnores() {
|
||||||
|
try {
|
||||||
|
File ignoreFile = new File(mFolder.path, IGNORE_FILE_NAME);
|
||||||
|
if (!ignoreFile.exists() && !ignoreFile.createNewFile()) {
|
||||||
|
Toast.makeText(this, R.string.create_ignore_file_error, Toast.LENGTH_SHORT).show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Intent intent = new Intent(Intent.ACTION_EDIT);
|
||||||
|
Uri uri = Uri.fromFile(ignoreFile);
|
||||||
|
intent.setDataAndType(uri, "text/plain");
|
||||||
|
startActivity(intent);
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.w(TAG, e);
|
||||||
|
} catch (ActivityNotFoundException e) {
|
||||||
|
Log.w(TAG, e);
|
||||||
|
Toast.makeText(this, R.string.edit_ignore_file_error, Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void showVersioningDialog() {
|
private void showVersioningDialog() {
|
||||||
Intent intent = new Intent(this, VersioningDialogActivity.class);
|
Intent intent = new Intent(this, VersioningDialogActivity.class);
|
||||||
intent.putExtras(getVersioningBundle());
|
intent.putExtras(getVersioningBundle());
|
||||||
|
@ -369,6 +398,7 @@ public class FolderActivity extends SyncthingActivity
|
||||||
mFolder.path = data.getStringExtra(FolderPickerActivity.EXTRA_RESULT_DIRECTORY);
|
mFolder.path = data.getStringExtra(FolderPickerActivity.EXTRA_RESULT_DIRECTORY);
|
||||||
mPathView.setText(mFolder.path);
|
mPathView.setText(mFolder.path);
|
||||||
mFolderNeedsToUpdate = true;
|
mFolderNeedsToUpdate = true;
|
||||||
|
mEditIgnores.setEnabled(true);
|
||||||
} else if (resultCode == Activity.RESULT_OK && requestCode == FILE_VERSIONING_DIALOG_REQUEST) {
|
} else if (resultCode == Activity.RESULT_OK && requestCode == FILE_VERSIONING_DIALOG_REQUEST) {
|
||||||
updateVersioning(data.getExtras());
|
updateVersioning(data.getExtras());
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ import android.content.Intent;
|
||||||
import android.content.ServiceConnection;
|
import android.content.ServiceConnection;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
|
|
||||||
|
import com.annimon.stream.Stream;
|
||||||
import com.nutomic.syncthingandroid.service.RestApi;
|
import com.nutomic.syncthingandroid.service.RestApi;
|
||||||
import com.nutomic.syncthingandroid.service.SyncthingService;
|
import com.nutomic.syncthingandroid.service.SyncthingService;
|
||||||
import com.nutomic.syncthingandroid.service.SyncthingServiceBinder;
|
import com.nutomic.syncthingandroid.service.SyncthingServiceBinder;
|
||||||
|
@ -46,7 +47,7 @@ public abstract class SyncthingActivity extends ToolbarBindingActivity implement
|
||||||
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
|
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
|
||||||
SyncthingServiceBinder binder = (SyncthingServiceBinder) iBinder;
|
SyncthingServiceBinder binder = (SyncthingServiceBinder) iBinder;
|
||||||
mSyncthingService = binder.getService();
|
mSyncthingService = binder.getService();
|
||||||
mServiceConnectedListeners.forEach(OnServiceConnectedListener::onServiceConnected);
|
Stream.of(mServiceConnectedListeners).forEach(OnServiceConnectedListener::onServiceConnected);
|
||||||
mServiceConnectedListeners.clear();
|
mServiceConnectedListeners.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
5
src/main/res/drawable/ic_visibility_off_black_24dp.xml
Normal file
5
src/main/res/drawable/ic_visibility_off_black_24dp.xml
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:drawable="@drawable/ic_visibility_off_black_24dp_inactive" android:state_enabled="false" />
|
||||||
|
<item android:drawable="@drawable/ic_visibility_off_black_24dp_active" />
|
||||||
|
</selector>
|
|
@ -0,0 +1,9 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="#8A000000"
|
||||||
|
android:pathData="M12,7c2.76,0 5,2.24 5,5 0,0.65 -0.13,1.26 -0.36,1.83l2.92,2.92c1.51,-1.26 2.7,-2.89 3.43,-4.75 -1.73,-4.39 -6,-7.5 -11,-7.5 -1.4,0 -2.74,0.25 -3.98,0.7l2.16,2.16C10.74,7.13 11.35,7 12,7zM2,4.27l2.28,2.28 0.46,0.46C3.08,8.3 1.78,10.02 1,12c1.73,4.39 6,7.5 11,7.5 1.55,0 3.03,-0.3 4.38,-0.84l0.42,0.42L19.73,22 21,20.73 3.27,3 2,4.27zM7.53,9.8l1.55,1.55c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.66 1.34,3 3,3 0.22,0 0.44,-0.03 0.65,-0.08l1.55,1.55c-0.67,0.33 -1.41,0.53 -2.2,0.53 -2.76,0 -5,-2.24 -5,-5 0,-0.79 0.2,-1.53 0.53,-2.2zM11.84,9.02l3.15,3.15 0.02,-0.16c0,-1.66 -1.34,-3 -3,-3l-0.17,0.01z"/>
|
||||||
|
</vector>
|
|
@ -0,0 +1,9 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="#42000000"
|
||||||
|
android:pathData="M12,7c2.76,0 5,2.24 5,5 0,0.65 -0.13,1.26 -0.36,1.83l2.92,2.92c1.51,-1.26 2.7,-2.89 3.43,-4.75 -1.73,-4.39 -6,-7.5 -11,-7.5 -1.4,0 -2.74,0.25 -3.98,0.7l2.16,2.16C10.74,7.13 11.35,7 12,7zM2,4.27l2.28,2.28 0.46,0.46C3.08,8.3 1.78,10.02 1,12c1.73,4.39 6,7.5 11,7.5 1.55,0 3.03,-0.3 4.38,-0.84l0.42,0.42L19.73,22 21,20.73 3.27,3 2,4.27zM7.53,9.8l1.55,1.55c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.66 1.34,3 3,3 0.22,0 0.44,-0.03 0.65,-0.08l1.55,1.55c-0.67,0.33 -1.41,0.53 -2.2,0.53 -2.76,0 -5,-2.24 -5,-5 0,-0.79 0.2,-1.53 0.53,-2.2zM11.84,9.02l3.15,3.15 0.02,-0.16c0,-1.66 -1.34,-3 -3,-3l-0.17,0.01z"/>
|
||||||
|
</vector>
|
|
@ -99,8 +99,7 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginEnd="@dimen/abc_action_bar_content_inset_material"
|
android:layout_marginEnd="@dimen/abc_action_bar_content_inset_material"
|
||||||
android:layout_marginRight="@dimen/abc_action_bar_content_inset_material"
|
android:layout_marginRight="@dimen/abc_action_bar_content_inset_material"
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat.Caption"
|
android:textAppearance="@style/TextAppearance.AppCompat.Caption" />
|
||||||
tools:ignore="HardcodedText" />
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<android.support.v7.widget.SwitchCompat
|
<android.support.v7.widget.SwitchCompat
|
||||||
|
|
|
@ -106,8 +106,7 @@
|
||||||
android:layout_marginLeft="75dp"
|
android:layout_marginLeft="75dp"
|
||||||
android:layout_marginStart="75dp"
|
android:layout_marginStart="75dp"
|
||||||
android:layout_marginTop="-20dp"
|
android:layout_marginTop="-20dp"
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat.Caption"
|
android:textAppearance="@style/TextAppearance.AppCompat.Caption" />
|
||||||
tools:ignore="HardcodedText" />
|
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/versioningDescription"
|
android:id="@+id/versioningDescription"
|
||||||
|
@ -115,8 +114,18 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginLeft="75dp"
|
android:layout_marginLeft="75dp"
|
||||||
android:layout_marginStart="75dp"
|
android:layout_marginStart="75dp"
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat.Caption"
|
android:textAppearance="@style/TextAppearance.AppCompat.Caption" />
|
||||||
tools:ignore="HardcodedText" />
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/edit_ignores"
|
||||||
|
style="@style/Widget.Syncthing.TextView.Label.Details"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:background="@null"
|
||||||
|
android:drawableLeft="@drawable/ic_visibility_off_black_24dp"
|
||||||
|
android:drawableStart="@drawable/ic_visibility_off_black_24dp"
|
||||||
|
android:text="@string/ignore_patterns"/>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
|
@ -167,6 +167,12 @@ Please report any problems you encounter via Github.</string>
|
||||||
|
|
||||||
<string name="dialog_discard_changes">Discard your changes?</string>
|
<string name="dialog_discard_changes">Discard your changes?</string>
|
||||||
|
|
||||||
|
<string name="ignore_patterns">Ignore Patterns</string>
|
||||||
|
|
||||||
|
<string name="create_ignore_file_error">Failed to create ignore file. Is the directory writable?</string>
|
||||||
|
|
||||||
|
<string name="edit_ignore_file_error">No text editor found</string>
|
||||||
|
|
||||||
<!-- DeviceActivity -->
|
<!-- DeviceActivity -->
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue