folder_android.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. //go:build android
  2. // +build android
  3. package mobile
  4. /*
  5. #cgo LDFLAGS: -landroid -llog -lEGL -lGLESv2
  6. #include <stdbool.h>
  7. #include <stdlib.h>
  8. bool canListURI(uintptr_t jni_env, uintptr_t ctx, char* uriCstr);
  9. bool createListableURI(uintptr_t jni_env, uintptr_t ctx, char* uriCstr);
  10. char *listURI(uintptr_t jni_env, uintptr_t ctx, char* uriCstr);
  11. */
  12. import "C"
  13. import (
  14. "errors"
  15. "strings"
  16. "unsafe"
  17. "fyne.io/fyne/v2"
  18. "fyne.io/fyne/v2/internal/driver/mobile/app"
  19. "fyne.io/fyne/v2/storage"
  20. )
  21. func canListURI(uri fyne.URI) bool {
  22. uriStr := C.CString(uri.String())
  23. defer C.free(unsafe.Pointer(uriStr))
  24. listable := false
  25. app.RunOnJVM(func(_, env, ctx uintptr) error {
  26. listable = bool(C.canListURI(C.uintptr_t(env), C.uintptr_t(ctx), uriStr))
  27. return nil
  28. })
  29. return listable
  30. }
  31. func createListableURI(uri fyne.URI) error {
  32. uriStr := C.CString(uri.String())
  33. defer C.free(unsafe.Pointer(uriStr))
  34. ok := false
  35. app.RunOnJVM(func(_, env, ctx uintptr) error {
  36. ok = bool(C.createListableURI(C.uintptr_t(env), C.uintptr_t(ctx), uriStr))
  37. return nil
  38. })
  39. if ok {
  40. return nil
  41. }
  42. return errors.New("failed to create directory")
  43. }
  44. func listURI(uri fyne.URI) ([]fyne.URI, error) {
  45. uriStr := C.CString(uri.String())
  46. defer C.free(unsafe.Pointer(uriStr))
  47. var str *C.char
  48. app.RunOnJVM(func(_, env, ctx uintptr) error {
  49. str = C.listURI(C.uintptr_t(env), C.uintptr_t(ctx), uriStr)
  50. return nil
  51. })
  52. parts := strings.Split(C.GoString(str), "|")
  53. var list []fyne.URI
  54. for _, part := range parts {
  55. if len(part) == 0 {
  56. continue
  57. }
  58. list = append(list, storage.NewURI(part))
  59. }
  60. return list, nil
  61. }