diff --git a/app/src/main/java/io/xpipe/app/platform/ClipboardHelper.java b/app/src/main/java/io/xpipe/app/platform/ClipboardHelper.java index 24cece7aa..379fef150 100644 --- a/app/src/main/java/io/xpipe/app/platform/ClipboardHelper.java +++ b/app/src/main/java/io/xpipe/app/platform/ClipboardHelper.java @@ -25,13 +25,19 @@ public class ClipboardHelper { private static void apply(Map map, boolean showNotification) { Clipboard clipboard = Clipboard.getSystemClipboard(); + var hasText = map.containsKey(DataFormat.PLAIN_TEXT); + var hasUrl = map.containsKey(DataFormat.URL); Map contents = Stream.of( - DataFormat.PLAIN_TEXT, - DataFormat.URL, - DataFormat.RTF, - DataFormat.HTML, + // When we copy textual content, erase RTF and HTML clipboard to + // not keep different variants of text in the clipboard + hasText || hasUrl ? null : DataFormat.RTF, + hasText || hasUrl ? null : DataFormat.HTML, + // Do the same for text and URLs + hasUrl && !hasText ? null : DataFormat.PLAIN_TEXT, + hasText && !hasUrl ? null : DataFormat.URL, DataFormat.IMAGE, DataFormat.FILES) + .filter(dataFormat -> dataFormat != null) .map(dataFormat -> { try { // This can fail if the clipboard data is invalid diff --git a/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java b/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java index a7c29e38c..09dcedff9 100644 --- a/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java +++ b/app/src/main/java/io/xpipe/app/prefs/ExternalApplicationType.java @@ -65,7 +65,7 @@ public interface ExternalApplicationType extends PrefsValue { getApplicationName())) .readStdoutIfPossible(); return out.isPresent() && !out.get().isBlank() && out.get().contains(getApplicationName() + ".app") - ? out.map(s -> Path.of(s)) + ? out.map(s -> Path.of(s.lines().toList().getFirst())) : Optional.empty(); } } diff --git a/app/src/main/java/io/xpipe/app/storage/DataStorageQuery.java b/app/src/main/java/io/xpipe/app/storage/DataStorageQuery.java index 8c24a3fd1..39e925dcd 100644 --- a/app/src/main/java/io/xpipe/app/storage/DataStorageQuery.java +++ b/app/src/main/java/io/xpipe/app/storage/DataStorageQuery.java @@ -203,7 +203,7 @@ public class DataStorageQuery { try { return Pattern.compile(toRegex(exact ? globPattern.toLowerCase() : "**" + globPattern.toLowerCase() + "**")); } catch (Throwable e) { - return Pattern.compile(Pattern.quote(globPattern)); + return Pattern.compile(Pattern.quote(globPattern.toLowerCase())); } } } diff --git a/app/src/main/java/io/xpipe/app/store/SingletonSessionStoreProvider.java b/app/src/main/java/io/xpipe/app/store/SingletonSessionStoreProvider.java index e5499762d..867660717 100644 --- a/app/src/main/java/io/xpipe/app/store/SingletonSessionStoreProvider.java +++ b/app/src/main/java/io/xpipe/app/store/SingletonSessionStoreProvider.java @@ -69,6 +69,12 @@ public interface SingletonSessionStoreProvider extends DataStoreProvider { t.setCustomVisibility(Bindings.createBooleanBinding( () -> { + // This can be called while reloading the storage + // where an entry is made invalid + if (sec.getEntry().getStore() == null) { + return false; + } + SingletonSessionStore s = sec.getWrapper().getEntry().getStore().asNeeded(); return supportsSession(s) && (showToggleWhenInactive(s) || s.isSessionEnabled()); diff --git a/app/src/main/java/io/xpipe/app/util/BooleanScope.java b/app/src/main/java/io/xpipe/app/util/BooleanScope.java index 810e8e241..2dc7fded1 100644 --- a/app/src/main/java/io/xpipe/app/util/BooleanScope.java +++ b/app/src/main/java/io/xpipe/app/util/BooleanScope.java @@ -31,23 +31,19 @@ public class BooleanScope implements AutoCloseable { return this; } - public BooleanScope start() { - synchronized (prop) { - if (wait) { - while (prop.get()) { - ThreadHelper.sleep(50); - } + public synchronized BooleanScope start() { + if (wait) { + while (prop.get()) { + ThreadHelper.sleep(50); } - prop.setValue(true); - - return this; } + prop.setValue(true); + + return this; } @Override - public void close() { - synchronized (prop) { - prop.setValue(false); - } + public synchronized void close() { + prop.setValue(false); } }