Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 98d711e0ca | |||
| 99c848b1b7 | |||
| fe26af88b4 | |||
| 6af6ff80ba |
@@ -59,8 +59,6 @@ jobs:
|
||||
rm build/outputs/apk/foss/release/*universal*
|
||||
./gradlew assembleGplayRelease
|
||||
mv build/outputs/apk/gplay/release/*universal* build/outputs/apk/foss/release/ArcaneChat-gplay.apk
|
||||
mv build/outputs/mapping/fossRelease/mapping.txt build/outputs/mapping/fossRelease/mapping-foss.txt
|
||||
mv build/outputs/mapping/gplayRelease/mapping.txt build/outputs/mapping/fossRelease/mapping-gplay.txt
|
||||
|
||||
- name: Release on GitHub
|
||||
uses: softprops/action-gh-release@v1
|
||||
@@ -69,9 +67,7 @@ jobs:
|
||||
body: '[<img src="store/get-it-on-gplay.png" alt="Get it on Google Play" height="48">](https://play.google.com/store/apps/details?id=com.github.arcanechat) [<img src="store/get-it-on-fdroid.png" alt="Get it on F-Droid" height="48">](https://f-droid.org/packages/chat.delta.lite) [<img src="store/get-it-on-github.png" alt="Get it on GitHub" height="48">](https://github.com/ArcaneChat/android/releases/latest/download/ArcaneChat-gplay.apk)'
|
||||
prerelease: ${{ contains(github.event.ref, '-beta') }}
|
||||
fail_on_unmatched_files: true
|
||||
files: |
|
||||
build/outputs/apk/foss/release/*.apk
|
||||
build/outputs/mapping/fossRelease/mapping-*.txt
|
||||
files: build/outputs/apk/foss/release/*.apk
|
||||
|
||||
- name: Release on ZapStore
|
||||
run: |
|
||||
|
||||
|
Before Width: | Height: | Size: 135 KiB After Width: | Height: | Size: 137 KiB |
|
Before Width: | Height: | Size: 283 KiB After Width: | Height: | Size: 287 KiB |
|
Before Width: | Height: | Size: 250 KiB After Width: | Height: | Size: 256 KiB |
|
Before Width: | Height: | Size: 446 KiB After Width: | Height: | Size: 447 KiB |
@@ -202,8 +202,7 @@ public class InputPanel extends ConstraintLayout
|
||||
|
||||
public void setSubjectVisible(boolean visible) {
|
||||
subjectText.setVisibility(visible ? View.VISIBLE : View.GONE);
|
||||
// don't make it visible if visible is false to avoid showing it while recording audio and an event triggers setSubjectVisible(false)
|
||||
if (visible) emojiToggle.setVisibility(View.GONE);
|
||||
emojiToggle.setVisibility(!visible ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
|
||||
public String getSubject() {
|
||||
|
||||
@@ -122,8 +122,26 @@ public class PersistentBlobProvider {
|
||||
}
|
||||
|
||||
public Uri createForExternal(@NonNull Context context, @NonNull String mimeType) throws IOException, IllegalStateException, NullPointerException {
|
||||
File target = new File(getExternalDir(context), System.currentTimeMillis() + "." + getExtensionFromMimeType(mimeType));
|
||||
return FileProviderUtil.getUriFor(context, target);
|
||||
String filename = System.currentTimeMillis() + "." + getExtensionFromMimeType(mimeType);
|
||||
|
||||
// Try external cache first
|
||||
try {
|
||||
File externalDir = getExternalDir(context);
|
||||
File target = new File(externalDir, filename);
|
||||
return FileProviderUtil.getUriFor(context, target);
|
||||
} catch (IllegalArgumentException e) {
|
||||
// FileProvider doesn't support the external cache path (e.g., on removable SD card).
|
||||
// Note: getExternalDir() already falls back to internal cache when external cache is null,
|
||||
// but when external cache exists on a removable SD card, FileProvider may reject it.
|
||||
// In that case, we explicitly use internal cache which FileProvider always supports.
|
||||
Log.w(TAG, "FileProvider doesn't support external cache path, falling back to internal cache", e);
|
||||
File internalDir = context.getCacheDir();
|
||||
if (internalDir == null) {
|
||||
throw new IOException("no cache directory available");
|
||||
}
|
||||
File target = new File(internalDir, filename);
|
||||
return FileProviderUtil.getUriFor(context, target);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean delete(@NonNull Context context, @NonNull Uri uri) {
|
||||
|
||||
@@ -88,27 +88,7 @@ public final class FetchForegroundService extends Service {
|
||||
.setSmallIcon(R.drawable.notification_permanent)
|
||||
.build();
|
||||
|
||||
try {
|
||||
startForeground(NotificationCenter.ID_FETCH, notification);
|
||||
} catch (Exception e) {
|
||||
Log.w(TAG, "Failed to start foreground service, falling back to synchronous fetch", e);
|
||||
synchronized (SERVICE_LOCK) {
|
||||
service = null;
|
||||
}
|
||||
stopSelf();
|
||||
// Fallback to synchronous fetching when foreground service fails
|
||||
fetchingSynchronously = true;
|
||||
if (ApplicationContext.getDcAccounts().backgroundFetch(10)) {
|
||||
synchronized (STOP_NOTIFIER) {
|
||||
while (fetchingSynchronously) {
|
||||
try {
|
||||
STOP_NOTIFIER.wait();
|
||||
} catch (InterruptedException ex) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
startForeground(NotificationCenter.ID_FETCH, notification);
|
||||
|
||||
Util.runOnAnyBackgroundThread(() -> {
|
||||
Log.i(TAG, "Starting fetch");
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<paths>
|
||||
<cache-path name="cache" path="." />
|
||||
<external-cache-path name="external_cache" path="." />
|
||||
<external-files-path name="external_files" path="." />
|
||||
|
||||
<!-- this is needed for access to the cache dir in SD card -->
|
||||
<root-path name="external_root" path="/storage/" />
|
||||
|
||||
<external-path name="external_pictures" path="Pictures"/>
|
||||
<external-path name="external_video" path="Movies"/>
|
||||
<external-path name="external_audio" path="Music"/>
|
||||
<external-path name="external_download" path="Download"/>
|
||||
</paths>
|
||||
</paths>
|
||||