Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
656516e
Build for Windows, Big File Dialog, Drag-n-Drop
abakum Jul 16, 2025
8d21e00
fix https://github.com/howeyc/crocgui/issues/37
abakum Jul 17, 2025
13d41d9
Big Save Dialog, On Cancel File Save Dialog
abakum Jul 17, 2025
b60669d
ru-RU
abakum Jul 17, 2025
5aef729
ru-RU append
abakum Jul 17, 2025
2b3c3e6
fyne.Do, fyne.App.Clipboard, metadata/ru-RU
abakum Jul 17, 2025
dd2808a
SelectIndex, Received \n delimited
abakum Jul 17, 2025
7a60eeb
Finally, the Receive tab doesn't freeze anymore,
abakum Jul 18, 2025
31a5e07
Shorter ru-RU
abakum Jul 18, 2025
85d3743
Export full log, locales
abakum Jul 18, 2025
18b11ab
-apk
abakum Jul 18, 2025
09f6ce5
Add LFS tracking for APK files
abakum Jul 18, 2025
a686875
lfs
abakum Jul 18, 2025
2db41d6
mobile, MultiWriter, restart, os.Args[1:], addPath
abakum Jul 19, 2025
bb10443
package, Stop
abakum Jul 21, 2025
f11becf
darwin
abakum Jul 21, 2025
b36ba2b
linux
abakum Jul 22, 2025
c9627d5
addEntry, copyPath, Makefile
abakum Jul 22, 2025
9ecc814
-status, copyCodeButton, debugBox, copyToUWC, SetCloseIntercept, clear
abakum Jul 23, 2025
2a198db
darwin, darm, locales
abakum Jul 23, 2025
265ee89
bin
abakum Jul 23, 2025
ec48dd5
processIntent, receiveURIFromIntent, setupIntentHandler
abakum Jul 24, 2025
be12a7b
uriFromIntent
abakum Jul 24, 2025
f52175d
handleBackPressed, quit, Lifecycle
abakum Jul 26, 2025
a9ea70d
receiveTextFromIntent, textFromIntent
abakum Jul 26, 2025
3ff0558
text, -clear, closured: deleteFile, addEntry, addPath, copyFromURC, S…
abakum Jul 28, 2025
1fd184d
copyToUWC, storage.Child, ShowFolderOpen fail on android,
abakum Jul 28, 2025
f82d3f6
-activeButtonHolder, buttons on top better for keyboard of mobile
abakum Jul 29, 2025
2487902
TOTP, CROC_SECRET, deleteAllButton
abakum Jul 30, 2025
9c260b9
darwin, darm
abakum Jul 30, 2025
bdabf09
addEntry, addPath, totp, ProgressWriter, xProgress
abakum Aug 1, 2025
a72514e
ProgressWriter, INTENT_THRESHOLD_MS, hashToFilename, text, done, NewP…
abakum Aug 1, 2025
2b1a1f7
ProgressWrapper, LabelWrapper, TotalSent, totalMax, total, hashed, ad…
abakum Aug 3, 2025
640ec1f
update, fe.Objects[0].Hide, fe.Objects[2].Hide, os.Getenv("DISPLAY"),…
abakum Aug 10, 2025
76e0299
crocgui.app, darm/crocgui.app
abakum Aug 10, 2025
e1cf1f1
Child, downloads, TOTP, ShowFileLocation, saveAllFiles, saveAllButton…
abakum Sep 2, 2025
5fcabfb
entryText, ShowFileLocation, MaterialFiles, addFileButton, exportButt…
abakum Sep 15, 2025
57adc86
locales
abakum Sep 21, 2025
b5d8eb5
-takePersistableUriPermissions, locales
abakum Sep 26, 2025
0ff56c9
-fileExists, refresh, -reset, noRestart, log.Error(err.Error()), os.…
abakum Oct 3, 2025
7acacdc
ZeroWidthJoiner, log.go, notification_android.go, restart, locale
abakum Oct 12, 2025
7286e0c
LogD in Write, refreshWindow, refresh, -SelectIndex
abakum Oct 15, 2025
13b6cac
excludeFromRecents, -logToAndroid, github.com/timob/jnigi, log_androi…
abakum Oct 19, 2025
fa7b48d
get_api_level, excludeFromRecents, atags, wtags, tags
abakum Oct 20, 2025
9e5442a
excludeFromRecents, SetOnExitedForeground
abakum Oct 20, 2025
750526c
LogD in JNI
abakum Oct 21, 2025
62572b9
-unused
abakum Oct 21, 2025
0a29a1d
fileSave, receiveURIFromIntent, receiveTextFromIntent
abakum Oct 21, 2025
2455b09
oldPath, addEntry, refresh, NewProgressWriter
abakum Oct 22, 2025
212d708
sync to fyne.Do, removeEntry on send, ProgressWriter, sbShow
abakum Oct 22, 2025
5230f3d
excludeFromRecents
abakum Oct 22, 2025
47096cd
CanCreateSymlinks, PSL, Symlink, Readlink,
abakum Oct 23, 2025
aa124ce
detectMimeType, reload, removeEntry, Rename, saveAllFiles, renameDir,…
abakum Oct 25, 2025
11d2e36
addEntry, Readlink, addPath, restart
abakum Oct 26, 2025
3e97b80
copyDirectory
abakum Oct 27, 2025
e561822
hashed, asMobile, ZipDirectory, a.Preferences().Bool("zip-unzip"),
abakum Oct 28, 2025
bb6a684
removeEntrys, ShowFolderOpen, renameDir, addFolderButton, copyDir, co…
abakum Oct 28, 2025
9e2549d
removeEntry, addEntry, addFolderButton, CopyDirectoryJNI
abakum Oct 29, 2025
31fc7d7
test
abakum Oct 30, 2025
230b494
copyFiles
abakum Oct 30, 2025
a437f9d
copyFiles, canList, eIsDir
abakum Oct 30, 2025
6fd90a1
copyFiles, canList, addPath,
abakum Oct 31, 2025
0b30c44
reload, ZipDirectoryProgress, zip.go
abakum Oct 31, 2025
58d5441
canList
abakum Nov 1, 2025
713a5ba
hasChild, getSize, copyFiles, dir_android.go,
abakum Nov 4, 2025
2008a0d
storageChild, fileChild, walk, -checkForSelfReference, reset, start, …
abakum Nov 4, 2025
e346b35
start, showPage, restart
abakum Nov 5, 2025
9b8f262
OnSelectedReload, moveAllLocal
abakum Nov 5, 2025
2115fcf
swapDir, reDir, -moveAllLocal
abakum Nov 6, 2025
f0dfd14
recvReady, swapDir, ready, removeEntrys, ZhangHai
abakum Nov 6, 2025
34a362e
join, addPath, isLinkDir
abakum Nov 6, 2025
601cab5
1.11.20
abakum Nov 6, 2025
bf3b536
countChild, IsDirectory
abakum Nov 7, 2025
d1fd8c1
IsDirectory, List, Reader, copyFiles, canRead, list, read,
abakum Nov 9, 2025
bd7881c
allEnabled, allShow, full_description.txt
abakum Nov 10, 2025
eecf0f1
locales
abakum Nov 10, 2025
bfd412c
IsDirectory, getSize, Reader, List. copyFiles, removeEntry, ShowFileS…
abakum Nov 12, 2025
4273131
ShowFilesSave, MiXplorer, reload, Rename, log
abakum Nov 12, 2025
4f0896e
test
abakum Nov 12, 2025
958342e
Parent, media_android.go
abakum Nov 13, 2025
0b9c3d2
-parent, filesSave, downloadButton
abakum Nov 13, 2025
026c747
entry, setupTOTP, ContentRemoveIcon, deleteAllButton, downloadButton,…
abakum Nov 14, 2025
de7b64b
ChildDownload, ModTime, setModTime, copyFiles, createDirectoriesInMed…
abakum Nov 16, 2025
27ab77c
size, cleanup, fileTreeShow, reload, treeButton, removeEntrys
abakum Nov 18, 2025
c7e5b44
zip
abakum Nov 19, 2025
caf0606
SetModTime
abakum Nov 19, 2025
539df01
OpenFileInDefaultApp
abakum Nov 19, 2025
a044062
os.Getenv CROC_*, macOS, tab.go, -rename.go
abakum Nov 20, 2025
17a26b5
cdLock, ready, seady, longCdLock, isEmptyFolder, hideCancel, showCanc…
abakum Nov 22, 2025
6f1ed88
toast
abakum Nov 23, 2025
a8165ed
removeEntrys, toast.go
abakum Nov 23, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Binaries
*.exe~
*.dll
*.so
*.dylib
/bin/

# Test binary
*.test

# Output of the go coverage tool
*.out

# Dependency directories
vendor/
/go.mod
/go.sum

# IDE specific files
.idea/
.vscode/
*.swp
*.swo

# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

# Debug files
debug
*.log

# Temp files
*.tmp
*.temp
/tmp/
111 changes: 89 additions & 22 deletions AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,24 +1,91 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.github.howeyc.crocgui"
android:versionCode="40"
android:versionName="1.11.5">

<application android:label="Croc">
<activity android:name="org.golang.app.GoNativeActivity"
android:label="Croc"
android:configChanges="orientation|keyboardHidden|uiMode"
android:theme="@android:style/Theme">
<meta-data android:name="android.app.lib_name" android:value="croc" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>
package="com.github.howeyc.crocgui"
android:versionCode="1010"
android:versionName="1.11.23">

<application
android:label="Croc"
tools:ignore="GoogleAppIndexingWarning">

<activity
android:name="org.golang.app.GoNativeActivity"
android:label="Croc"
android:exported="true"
android:launchMode="singleTop"
android:excludeFromRecents="true"
android:theme="@android:style/Theme"
android:configChanges="keyboardHidden|orientation|screenSize|screenLayout|uiMode">

<meta-data android:name="android.app.lib_name" android:value="croc" />

<!-- LAUNCHER intent -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

<!-- VIEW intent for files -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:mimeType="*/*" />
<data android:scheme="file" />
<data android:scheme="content" />
</intent-filter>

<!-- SEND intent -->
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>

<!-- SEND_MULTIPLE intent -->
<intent-filter>
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>

</activity>

<!-- Queries for file operations -->
<queries>
<intent>
<action android:name="android.intent.action.GET_CONTENT" />
<data android:mimeType="*/*" />
</intent>
<intent>
<action android:name="android.intent.action.OPEN_DOCUMENT" />
<data android:mimeType="*/*" />
</intent>
<intent>
<action android:name="android.intent.action.CREATE_DOCUMENT" />
<data android:mimeType="*/*" />
</intent>
<intent>
<action android:name="android.intent.action.ACTION_OPEN_DOCUMENT_TREE" />
<!-- <data android:mimeType="*/*" /> -->
</intent>
<!-- Query for DocumentsUI (file picker) -->
<package android:name="com.android.documentsui" />
</queries>
</application>

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="29" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED"
android:maxSdkVersion="33" />

<!-- For Android 13+ notifications -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
</manifest>
11 changes: 11 additions & 0 deletions FyneApp.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[Details]
Icon = "Icon.png"
Name = "crocgui"
ID = "com.github.howeyc.crocgui"
Version = "1.11.23"
Build = 1013

[LinuxAndBSD]
GenericName = "GUI for croc"
Categories = ["FileTransfer"]
Comment = "A nice simple GUI for croc"
98 changes: 95 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,10 +1,102 @@
.PHONY: clean all
VSCODE_DIR := .vscode
SETTINGS_FILE := $(VSCODE_DIR)/settings.json
WSL_HOST_IP := $(shell ip route list default | awk '{print $$3}')

all: crocgui.apk
.PHONY: all clean arm arm64 386 amd64 linux window wsl darwin ios install darm emulator adb wsladb logcat atags tags wtags t

crocgui.apk: main.go send.go recv.go settings.go theme.go about.go AndroidManifest.xml fdroid-build.sh
atags:
@mkdir -p $(VSCODE_DIR)
@if [ -f $(SETTINGS_FILE) ]; then \
jq '.gopls["build.buildFlags"] = ["-tags=android"]' $(SETTINGS_FILE) > $(SETTINGS_FILE).tmp && \
mv $(SETTINGS_FILE).tmp $(SETTINGS_FILE); \
else \
echo '{"gopls": {"build.buildFlags": ["-tags=android"]}}' > $(SETTINGS_FILE); \
fi
@echo "Enabling Android build tags for gopls press Ctrl+Shift+P Go: Restart Language Server"

wtags:
@mkdir -p $(VSCODE_DIR)
@if [ -f $(SETTINGS_FILE) ]; then \
jq '.gopls["build.buildFlags"] = ["-tags=android"]' $(SETTINGS_FILE) > $(SETTINGS_FILE).tmp && \
mv $(SETTINGS_FILE).tmp $(SETTINGS_FILE); \
else \
echo '{"gopls": {"build.buildFlags": ["-tags=windows"]}}' > $(SETTINGS_FILE); \
fi
@echo "Enabling Windows build tags for gopls press Ctrl+Shift+P Go: Restart Language Server"

tags:
@mkdir -p $(VSCODE_DIR)
@if [ -f $(SETTINGS_FILE) ]; then \
jq 'del(.gopls["build.buildFlags"])' $(SETTINGS_FILE) > $(SETTINGS_FILE).tmp && \
mv $(SETTINGS_FILE).tmp $(SETTINGS_FILE); \
else \
echo '{}' > $(SETTINGS_FILE); \
fi
@echo "Reset build tags for gopls press Ctrl+Shift+P Go: Restart Language Server"

all: android

android: main.go send.go recv.go settings.go theme.go about.go AndroidManifest.xml fdroid-build.sh
ANDROID_HOME=~/android bash fdroid-build.sh test

clean:
go clean
rm crocgui.apk

arm: main.go send.go recv.go settings.go theme.go about.go AndroidManifest.xml
fyne package -os android/arm --release

arm64: main.go send.go recv.go settings.go theme.go about.go AndroidManifest.xml
fyne package -os android/arm64 --release

386: main.go send.go recv.go settings.go theme.go about.go AndroidManifest.xml
fyne package -os android/386 --release

amd64: main.go send.go recv.go settings.go theme.go about.go AndroidManifest.xml
fyne package -os android/amd64 --release

emulator:
emulator -avd Medium_Phone_API_36.1

adb:
adb install crocgui.apk

logcat:
adb logcat|grep "croc :"

wlogcat:
cmd.exe /c C:\Users\KAbak\AppData\Local\Android\Sdk\platform-tools\adb logcat|find "croc :"

wsladb:
export ADB_SERVER_SOCKET=tcp:$(WSL_HOST_IP):5037

linux: main.go send.go recv.go settings.go theme.go about.go
fyne package -os linux --release

windows: main.go send.go recv.go settings.go theme.go about.go
#sudo apt-get install gcc-mingw-w64-x86-64
CC=x86_64-w64-mingw32-gcc fyne package -os windows --release -tags=opengl

wsl: main.go send.go recv.go settings.go theme.go about.go
GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc GOFLAGS=-ldflags=-s go build -tags=opengl

darwin: main.go send.go recv.go settings.go theme.go about.go
fyne package -os darwin --release
cp -r crocgui.app /Applications/
cp crocgui.app/Contents/Info.plist darm/crocgui.app/Contents/
cp crocgui.app/Contents/Resources/* darm/crocgui.app/Contents/Resources/
mkdir -p darm/crocgui.app/Contents/MacOS

ios: main.go send.go recv.go settings.go theme.go about.go AndroidManifest.xml
fyne package -os ios --release

install:
GOFLAGS=-ldflags=-s go install

darm:
#brew install glfw
GOFLAGS=-ldflags=-s CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 go build -o darm/crocgui.app/Contents/MacOS/crocgui .&&cp -r darm/crocgui.app /Applications/

damd:
#brew install glfw
GOFLAGS=-ldflags=-s CGO_ENABLED=1 GOOS=darwin GOARCH=amd64 go build -o crocgui.app/Contents/MacOS/crocgui .&&cp -r crocgui.app /Applications/
21 changes: 13 additions & 8 deletions about.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"bufio"
"bytes"
"embed"
_ "embed"
"fmt"
"strings"

Expand All @@ -23,24 +22,26 @@ var crocguiLicense string
//go:embed third-party-licenses.txt
var thirdPartyLicenses string

func aboutTabItem() *container.TabItem {
func aboutTabItem(a fyne.App, _ fyne.Window) *container.TabItem {
longdescbytes, _ := metadata.ReadFile(fmt.Sprintf("metadata/%s/full_description.txt", langCode))
longdesc := string(longdescbytes)
longdesc = strings.ReplaceAll(longdesc, "<b>", "")
longdesc = strings.ReplaceAll(longdesc, "</b>", "")
aboutInfo := widget.NewLabel(longdesc)
aboutInfo.Wrapping = fyne.TextWrapWord

acLicense := widget.NewAccordion()
// acLicense := widget.NewAccordion()
var ais []*widget.AccordionItem

licenseReader := bytes.NewBufferString(crocguiLicense + thirdPartyLicenses)
currentLicense := ""
currentLibrary := "croc"
scanner := bufio.NewScanner(licenseReader)

for scanner.Scan() {
line := scanner.Text()
if strings.HasPrefix(line, "-----") {
acLicense.Append(widget.NewAccordionItem(currentLibrary, widget.NewLabel(currentLicense)))
ais = append(ais, widget.NewAccordionItem(currentLibrary, widget.NewLabel(currentLicense)))
currentLicense = ""
scanner.Scan()
scanner.Scan()
Expand All @@ -58,18 +59,22 @@ func aboutTabItem() *container.TabItem {
bfontLicense, rerr := fsFonts.ReadFile(fmt.Sprintf("internal/fonts/%s", fe.Name()))
if rerr == nil {
strLicense := string(bfontLicense)
acLicense.Append(widget.NewAccordionItem(fmt.Sprintf("Font: %s", fbase), widget.NewLabel(strLicense)))
// acLicense.Append(widget.NewAccordionItem(fmt.Sprintf("Font: %s", fbase), widget.NewLabel(strLicense)))
ais = append(ais, widget.NewAccordionItem(fmt.Sprintf("Font: %s", fbase), widget.NewLabel(strLicense)))
}
}
}

licenseToggle := widget.NewButton(lp("License Info"), func() {
w := fyne.CurrentApp().NewWindow(lp("License Info"))
w := a.NewWindow(lp("License Info"))

acLicense := widget.NewAccordion(ais...)

w.SetContent(container.NewScroll(acLicense))
w.Resize(fyne.NewSize(450, 800))
w.Resize(size)
w.Show()
})
return container.NewTabItemWithIcon(lp("About"), theme.InfoIcon(),
return container.NewTabItemWithIcon(ZeroWidthJoiner, theme.InfoIcon(), //lp("About")
container.NewVScroll(container.NewVBox(aboutInfo, licenseToggle)),
)
}
Loading