├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── LICENSE ├── README.md ├── build.gradle ├── docs ├── allclasses-frame.html ├── allclasses-noframe.html ├── com │ └── filestack │ │ └── android │ │ ├── CameraFragment.html │ │ ├── CloudAuthFragment.html │ │ ├── CloudListFragment.html │ │ ├── FilestackPicker.Builder.html │ │ ├── FilestackPicker.html │ │ ├── FsActivity.html │ │ ├── FsConstants.html │ │ ├── LocalFilesFragment.html │ │ ├── Selection.SimpleSaver.html │ │ ├── Selection.html │ │ ├── SpacingDecoration.html │ │ ├── Theme.Builder.html │ │ ├── Theme.html │ │ ├── UploadService.html │ │ ├── internal │ │ ├── BackButtonListener.html │ │ ├── CameraFragment.html │ │ ├── CloudAuthFragment.html │ │ ├── CloudListFragment.html │ │ ├── Constants.html │ │ ├── LocalFilesFragment.html │ │ ├── SelectionSaver.Listener.html │ │ ├── SelectionSaver.html │ │ ├── Selector.Multi.html │ │ ├── Selector.Single.html │ │ ├── Selector.html │ │ ├── SimpleSelectionSaver.html │ │ ├── SourceInfo.html │ │ ├── SpacingDecoration.html │ │ ├── SquareImageView.html │ │ ├── UploadService.html │ │ ├── Util.html │ │ ├── package-frame.html │ │ ├── package-summary.html │ │ └── package-tree.html │ │ ├── package-frame.html │ │ ├── package-summary.html │ │ └── package-tree.html ├── constant-values.html ├── deprecated-list.html ├── help-doc.html ├── index-all.html ├── index.html ├── overview-frame.html ├── overview-summary.html ├── overview-tree.html ├── package-list ├── script.js ├── serialized-form.html └── stylesheet.css ├── filestack ├── .gitignore ├── build.gradle ├── consumer-proguard-rules.pro ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── filestack │ │ └── android │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── filestack │ │ │ └── android │ │ │ ├── FilestackPicker.java │ │ │ ├── FsActivity.java │ │ │ ├── FsConstants.java │ │ │ ├── Selection.java │ │ │ ├── Theme.java │ │ │ ├── internal │ │ │ ├── BackButtonListener.java │ │ │ ├── CameraFragment.java │ │ │ ├── CloudAuthFragment.java │ │ │ ├── CloudListAdapter.java │ │ │ ├── CloudListFragment.java │ │ │ ├── CloudListViewHolder.java │ │ │ ├── Constants.java │ │ │ ├── LocalFilesFragment.java │ │ │ ├── SelectionFactory.java │ │ │ ├── SelectionSaver.java │ │ │ ├── Selector.java │ │ │ ├── SimpleSelectionSaver.java │ │ │ ├── SourceInfo.java │ │ │ ├── SpacingDecoration.java │ │ │ ├── SquareImageView.java │ │ │ ├── UploadService.java │ │ │ ├── Util.java │ │ │ └── package-info.java │ │ │ └── package-info.java │ └── res │ │ ├── drawable-hdpi │ │ ├── filestack__ic_menu_upload_done_white.png │ │ ├── filestack__ic_menu_upload_fail_white.png │ │ └── filestack__ic_menu_upload_white.png │ │ ├── drawable-mdpi │ │ ├── filestack__ic_menu_upload_done_white.png │ │ ├── filestack__ic_menu_upload_fail_white.png │ │ └── filestack__ic_menu_upload_white.png │ │ ├── drawable-v21 │ │ ├── filestack__ic_menu_upload_done_white.xml │ │ ├── filestack__ic_menu_upload_fail_white.xml │ │ └── filestack__ic_menu_upload_white.xml │ │ ├── drawable-xhdpi │ │ ├── filestack__ic_menu_upload_done_white.png │ │ ├── filestack__ic_menu_upload_fail_white.png │ │ └── filestack__ic_menu_upload_white.png │ │ ├── drawable-xxhdpi │ │ ├── filestack__ic_menu_upload_done_white.png │ │ ├── filestack__ic_menu_upload_fail_white.png │ │ └── filestack__ic_menu_upload_white.png │ │ ├── drawable-xxxhdpi │ │ ├── filestack__ic_menu_upload_done_white.png │ │ ├── filestack__ic_menu_upload_fail_white.png │ │ └── filestack__ic_menu_upload_white.png │ │ ├── drawable │ │ ├── filestack__ic_list_checkbox.xml │ │ ├── filestack__ic_menu_grid_white.xml │ │ ├── filestack__ic_menu_list_white.xml │ │ ├── filestack__ic_menu_square_white.xml │ │ ├── filestack__ic_menu_upload_done_white.xml │ │ ├── filestack__ic_menu_upload_fail_white.xml │ │ ├── filestack__ic_menu_upload_white.xml │ │ ├── filestack__ic_source_amazon_drive.xml │ │ ├── filestack__ic_source_box.xml │ │ ├── filestack__ic_source_camera.xml │ │ ├── filestack__ic_source_camera_video.xml │ │ ├── filestack__ic_source_device.xml │ │ ├── filestack__ic_source_dropbox.xml │ │ ├── filestack__ic_source_facebook.xml │ │ ├── filestack__ic_source_github.xml │ │ ├── filestack__ic_source_gmail.xml │ │ ├── filestack__ic_source_google_drive.xml │ │ ├── filestack__ic_source_google_photos.xml │ │ ├── filestack__ic_source_instagram.xml │ │ ├── filestack__ic_source_onedrive.xml │ │ └── filestack__list_grid_divider.xml │ │ ├── layout-sw600dp │ │ └── filestack__activity_filestack.xml │ │ ├── layout │ │ ├── filestack__activity_filestack.xml │ │ ├── filestack__app_bar_filestack.xml │ │ ├── filestack__cloud_grid_item.xml │ │ ├── filestack__cloud_list_item.xml │ │ ├── filestack__fragment_auth.xml │ │ ├── filestack__fragment_camera.xml │ │ ├── filestack__fragment_cloud_list.xml │ │ ├── filestack__fragment_local_files.xml │ │ └── filestack__nav_header_filestack.xml │ │ ├── menu │ │ └── filestack__menu.xml │ │ ├── values-land │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── public.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── filestack │ └── android │ └── internal │ └── SelectorTest.kt ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── logo.svg ├── samples └── form │ ├── .gitignore │ ├── app │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── filestack │ │ │ └── android │ │ │ └── samples │ │ │ └── ExampleInstrumentedTest.java │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── filestack │ │ │ │ └── android │ │ │ │ └── samples │ │ │ │ └── form │ │ │ │ ├── CompleteFragment.java │ │ │ │ ├── EntryActivity.java │ │ │ │ ├── FormFragment.java │ │ │ │ ├── LoadingFragment.java │ │ │ │ └── MainActivity.java │ │ └── res │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable │ │ │ └── ic_launcher_background.xml │ │ │ ├── layout │ │ │ ├── activity_main.xml │ │ │ ├── fragment_complete.xml │ │ │ ├── fragment_form.xml │ │ │ └── fragment_loading.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── values │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ │ │ └── xml │ │ │ └── file_paths.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── filestack │ │ └── android │ │ └── samples │ │ └── ExampleUnitTest.java │ ├── build.gradle │ ├── gradle.properties │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ └── settings.gradle ├── settings.gradle └── tester ├── .gitignore ├── build.gradle ├── filestack-tester.keystore ├── media └── recording.gif ├── proguard-rules.pro └── src ├── androidTest └── java │ └── com │ └── filestack │ └── android │ └── demo │ └── ExampleInstrumentedTest.java ├── main ├── AndroidManifest.xml ├── java │ └── com │ │ └── filestack │ │ └── android │ │ └── demo │ │ ├── EntryActivity.java │ │ ├── MainActivity.java │ │ ├── SettingsActivity.java │ │ ├── SettingsFragment.java │ │ └── UploadStatusReceiver.java └── res │ ├── layout │ ├── activity_main.xml │ └── activity_settings.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── values │ ├── colors.xml │ ├── strings.xml │ └── styles.xml │ └── xml │ ├── file_paths.xml │ └── preferences.xml └── test └── java └── com └── filestack └── android └── demo └── ExampleUnitTest.java /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .gradle 3 | .idea 4 | *.iml 5 | /build 6 | local.properties 7 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: android 2 | android: 3 | components: 4 | - tools 5 | - platform-tools 6 | - tools 7 | - build-tools-28.0.3 8 | - android-28 9 | 10 | script: ./gradlew filestack:build -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | ext.kotlin_version = '1.6.21' 5 | repositories { 6 | jcenter() 7 | google() 8 | } 9 | dependencies { 10 | classpath 'com.android.tools.build:gradle:7.4.2' 11 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 12 | 13 | // NOTE: Do not place your application dependencies here; they belong 14 | // in the individual module build.gradle files 15 | } 16 | } 17 | 18 | allprojects { 19 | repositories { 20 | mavenLocal() 21 | jcenter() 22 | google() 23 | } 24 | } 25 | 26 | task clean(type: Delete) { 27 | delete rootProject.buildDir 28 | } 29 | -------------------------------------------------------------------------------- /docs/allclasses-frame.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | All Classes (filestack 5.3.0 API) 7 | 8 | 9 | 10 | 11 | 12 |

All Classes

13 |
14 | 39 |
40 | 41 | 42 | -------------------------------------------------------------------------------- /docs/allclasses-noframe.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | All Classes (filestack 5.3.0 API) 7 | 8 | 9 | 10 | 11 | 12 |

All Classes

13 |
14 | 39 |
40 | 41 | 42 | -------------------------------------------------------------------------------- /docs/com/filestack/android/internal/package-frame.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | com.filestack.android.internal (filestack 5.3.0 API) 7 | 8 | 9 | 10 | 11 | 12 |

com.filestack.android.internal

13 |
14 |

Interfaces

15 | 21 |

Classes

22 | 36 |
37 | 38 | 39 | -------------------------------------------------------------------------------- /docs/com/filestack/android/package-frame.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | com.filestack.android (filestack 5.3.0 API) 7 | 8 | 9 | 10 | 11 | 12 |

com.filestack.android

13 |
14 |

Classes

15 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/deprecated-list.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Deprecated List (filestack 5.3.0 API) 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 42 |
43 | 70 | 71 |
72 |

Deprecated API

73 |

Contents

74 | 77 |
78 |
79 | 80 | 81 | 105 |
106 | 107 |
108 | 109 | 110 |
Skip navigation links
111 | 112 | 113 | 114 | 123 |
124 | 151 | 152 | 153 | 154 | -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | filestack 5.3.0 API 7 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | <noscript> 69 | <div>JavaScript is disabled on your browser.</div> 70 | </noscript> 71 | <h2>Frame Alert</h2> 72 | <p>This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. Link to <a href="overview-summary.html">Non-frame version</a>.</p> 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /docs/overview-frame.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Overview List (filestack 5.3.0 API) 7 | 8 | 9 | 10 | 11 | 12 |
All Classes
13 |
14 |

Packages

15 | 19 |
20 |

 

21 | 22 | 23 | -------------------------------------------------------------------------------- /docs/overview-summary.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Overview (filestack 5.3.0 API) 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 42 |
43 | 70 | 71 |
72 |

filestack 5.3.0 API

73 |
74 |
75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 87 | 88 | 89 | 90 | 93 | 94 | 95 |
Packages 
PackageDescription
com.filestack.android 85 |
Filestack is an easy API for file uploading, conversion, and delivery.
86 |
com.filestack.android.internal 91 |
Internal API.
92 |
96 |
97 | 98 |
99 | 100 | 101 |
Skip navigation links
102 | 103 | 104 | 105 | 114 |
115 | 142 | 143 | 144 | 145 | -------------------------------------------------------------------------------- /docs/package-list: -------------------------------------------------------------------------------- 1 | com.filestack.android 2 | com.filestack.android.internal 3 | -------------------------------------------------------------------------------- /docs/script.js: -------------------------------------------------------------------------------- 1 | function show(type) 2 | { 3 | count = 0; 4 | for (var key in methods) { 5 | var row = document.getElementById(key); 6 | if ((methods[key] & type) != 0) { 7 | row.style.display = ''; 8 | row.className = (count++ % 2) ? rowColor : altColor; 9 | } 10 | else 11 | row.style.display = 'none'; 12 | } 13 | updateTabs(type); 14 | } 15 | 16 | function updateTabs(type) 17 | { 18 | for (var value in tabs) { 19 | var sNode = document.getElementById(tabs[value][0]); 20 | var spanNode = sNode.firstChild; 21 | if (value == type) { 22 | sNode.className = activeTableTab; 23 | spanNode.innerHTML = tabs[value][1]; 24 | } 25 | else { 26 | sNode.className = tableTab; 27 | spanNode.innerHTML = "" + tabs[value][1] + ""; 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /docs/serialized-form.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Serialized Form (filestack 2.0.0-alpha.2 API) 7 | 8 | 9 | 10 | 11 | 12 | 22 | 25 | 26 |
27 | 28 | 29 |
Skip navigation links
30 | 31 | 32 | 33 | 41 |
42 | 69 | 70 |
71 |

Serialized Form

72 |
73 |
74 | 105 |
106 | 107 |
108 | 109 | 110 |
Skip navigation links
111 | 112 | 113 | 114 | 122 |
123 | 150 | 151 | 152 | 153 | -------------------------------------------------------------------------------- /filestack/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /filestack/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.jfrog.bintray' version '1.7.3' 3 | } 4 | 5 | apply plugin: 'com.android.library' 6 | apply plugin: 'kotlin-android' 7 | 8 | group = 'com.filestack' 9 | version = '6.0.0' 10 | project.archivesBaseName = 'filestack-android' 11 | 12 | android { 13 | compileSdkVersion 33 14 | 15 | defaultConfig { 16 | minSdkVersion 16 17 | targetSdkVersion 33 18 | multiDexEnabled = true 19 | 20 | testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' 21 | 22 | vectorDrawables { 23 | useSupportLibrary true 24 | } 25 | 26 | resourcePrefix 'filestack__' 27 | buildConfigField "String", "FILESTACK_ANDROID_VERSION", "\"$version\"" 28 | 29 | } 30 | buildTypes { 31 | release { 32 | minifyEnabled false 33 | consumerProguardFile 'consumer-proguard-rules.pro' 34 | } 35 | } 36 | } 37 | 38 | dependencies { 39 | api 'com.filestack:filestack-java:0.9.0' 40 | 41 | implementation 'androidx.appcompat:appcompat:1.0.0' 42 | implementation 'com.google.android.material:material:1.0.0' 43 | implementation 'androidx.browser:browser:1.0.0' 44 | 45 | implementation 'com.squareup.picasso:picasso:2.5.2' 46 | implementation 'io.reactivex.rxjava2:rxandroid:2.1.0' 47 | 48 | androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0', { 49 | exclude group: 'com.android.support', module: 'support-annotations' 50 | }) 51 | testImplementation 'junit:junit:4.12' 52 | testImplementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 53 | } 54 | 55 | task sourcesJar(type: Jar) { 56 | from android.sourceSets.main.java.srcDirs 57 | classifier = 'sources' 58 | } 59 | 60 | task javadoc(type: Javadoc) { 61 | source = android.sourceSets.main.java.srcDirs 62 | options.addStringOption('Xdoclint:none', '-quiet') 63 | classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) 64 | destinationDir = file("../docs/") 65 | } 66 | 67 | // Add dependencies to javadoc classpath so annotations work 68 | afterEvaluate { 69 | javadoc.classpath += files(android.libraryVariants.collect { variant -> 70 | variant.javaCompiler.classpath.files 71 | }) 72 | } 73 | 74 | task javadocJar(type: Jar, dependsOn: javadoc) { 75 | classifier = 'javadoc' 76 | from javadoc.destinationDir 77 | } 78 | 79 | artifacts { 80 | archives javadocJar 81 | archives sourcesJar 82 | } 83 | 84 | bintray { 85 | user = project.hasProperty('bintrayUser') ? project.property('bintrayUser') 86 | : System.getenv('BINTRAY_USER') 87 | key = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') 88 | : System.getenv('BINTRAY_API_KEY') 89 | configurations = ['archives'] 90 | publish = true 91 | pkg { 92 | repo = 'maven' 93 | userOrg = 'filestack' 94 | name = 'filestack-android' 95 | desc = 'Official Android SDK for Filestack.' 96 | 97 | publicDownloadNumbers = true 98 | licenses = ['Apache-2.0'] 99 | 100 | websiteUrl = 'https://filestack.com' 101 | vcsUrl = 'https://github.com/filestack/filestack-android.git' 102 | issueTrackerUrl = 'https://github.com/filestack/filestack-android/issues' 103 | 104 | githubRepo = 'filestack/filestack-android' 105 | githubReleaseNotesFile = 'CHANGELOG.md' 106 | 107 | version { 108 | name = project.version 109 | vcsTag = project.version 110 | released = new Date() 111 | } 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /filestack/consumer-proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/saten/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | # filestack-java-specific rules 27 | -keep public class com.filestack.internal.responses.** { 28 | private *; 29 | (...); 30 | } 31 | 32 | -keep public class com.filestack.CloudResponse { 33 | private *; 34 | (...); 35 | } 36 | 37 | -keep public class com.filestack.CloudItem { 38 | private *; 39 | (...); 40 | } 41 | 42 | -keep public class com.filestack.AppInfo { 43 | private *; 44 | (...); 45 | } 46 | 47 | # OkHttp-specific rules 48 | -dontwarn javax.annotation.** 49 | -keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase 50 | -dontwarn org.codehaus.mojo.animal_sniffer.* 51 | -dontwarn okhttp3.internal.platform.ConscryptPlatform 52 | 53 | # Okio-specific rules 54 | -dontwarn okio.** 55 | 56 | -dontwarn com.squareup.okhttp.* 57 | -------------------------------------------------------------------------------- /filestack/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/saten/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /filestack/src/androidTest/java/com/filestack/android/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.filestack.android; 2 | 3 | import android.content.Context; 4 | import androidx.test.platform.app.InstrumentationRegistry; 5 | import androidx.test.ext.junit.runners.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.filestack.android.test", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /filestack/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 12 | 13 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /filestack/src/main/java/com/filestack/android/FsConstants.java: -------------------------------------------------------------------------------- 1 | package com.filestack.android; 2 | 3 | public class FsConstants { 4 | // Options for the picker UI 5 | /** Expects boolean value. Selections won't get uploaded automatically if set to false. */ 6 | public static final String EXTRA_AUTO_UPLOAD = "autoUpload"; 7 | /** Expects {{@link com.filestack.Config}}. Sets credential and other account info. */ 8 | public static final String EXTRA_CONFIG = "config"; 9 | /** Expects {{@link java.util.ArrayList}}. Sets sources to enable. */ 10 | public static final String EXTRA_SOURCES = "sources"; 11 | /** Expects {{@link com.filestack.StorageOptions}}. Sets options for how to store uploads. */ 12 | public static final String EXTRA_STORE_OPTS = "storeOpts"; 13 | /** Expects string array. Sets MIME types that are allowed to be selected. */ 14 | public static final String EXTRA_MIME_TYPES = "mimeTypes"; 15 | /** 16 | * Expects boolean. If true, multiple files can be selected for upload. 17 | * Settings this value to false restricts the selection to only one file. 18 | * Defaults to true. 19 | */ 20 | public static final String EXTRA_ALLOW_MULTIPLE_FILES = "multipleFiles"; 21 | 22 | /** Action for upload broadcast intent filter. */ 23 | public static final String BROADCAST_UPLOAD = "com.filestack.android.BROADCAST_UPLOAD"; 24 | 25 | static final String EXTRA_DISPLAY_VERSION_INFORMATION = "displayVersionInformation"; 26 | static final String EXTRA_THEME = "theme"; 27 | 28 | // Keys to access data from result intents 29 | /** For selections, returns {{@link java.util.ArrayList}} of {{@link Selection}} objects. */ 30 | public static final String EXTRA_SELECTION_LIST = "selectionList"; 31 | /** For uploads, returns the {{@link Selection}} that corresponded to this upload. */ 32 | public static final String EXTRA_SELECTION = "selection"; 33 | /** For uploads, returns upload metadata as {{@link com.filestack.FileLink}}. */ 34 | public static final String EXTRA_FILE_LINK = "fileLink"; 35 | /** For uploads, returns upload status string. */ 36 | public static final String EXTRA_STATUS = "status"; 37 | /** For uploads, returns upload percent uploaded. */ 38 | public static final String EXTRA_PERCENT = "percent"; 39 | /** Indicates an upload completed successfully. */ 40 | public static final String STATUS_COMPLETE = "complete"; 41 | /** Indicates an upload is still in progress. */ 42 | public static final String STATUS_IN_PROGRESS = "inProgress"; 43 | /** Indicates an upload failed. */ 44 | public static final String STATUS_FAILED = "failed"; 45 | 46 | } 47 | -------------------------------------------------------------------------------- /filestack/src/main/java/com/filestack/android/Selection.java: -------------------------------------------------------------------------------- 1 | package com.filestack.android; 2 | 3 | import android.net.Uri; 4 | import android.os.Parcel; 5 | import android.os.Parcelable; 6 | 7 | /** Metadata for a user selection (but not yet upload) of a local or cloud file. */ 8 | public class Selection implements Parcelable { 9 | public static final Parcelable.Creator CREATOR = new Creator(); 10 | 11 | private String provider; 12 | private String path; 13 | private Uri uri; 14 | private int size; 15 | private String mimeType; 16 | private String name; 17 | 18 | /** Constructor for local file. 19 | * 20 | * @deprecated Creation of this class should not be available to any consumers of the library. 21 | * Access to this class is scheduled to be removed in future versions. 22 | * */ 23 | @Deprecated 24 | public Selection(String provider, String path, String mimeType, String name) { 25 | this.provider = provider; 26 | this.path = path; 27 | this.mimeType = mimeType; 28 | this.name = name; 29 | } 30 | 31 | /** Constructor for local file. 32 | * 33 | * @deprecated Creation of this class should not be available to any consumers of the library. 34 | * Access to this class is scheduled to be removed in future versions. 35 | * */ 36 | @Deprecated 37 | public Selection(String provider, Uri uri, int size, String mimeType, String name) { 38 | this.provider = provider; 39 | this.uri = uri; 40 | this.size = size; 41 | this.mimeType = mimeType; 42 | this.name = name; 43 | } 44 | 45 | @Override 46 | public boolean equals(Object o) { 47 | if (this == o) return true; 48 | if (o == null || getClass() != o.getClass()) return false; 49 | 50 | Selection selection = (Selection) o; 51 | 52 | if (size != selection.size) return false; 53 | if (provider != null ? !provider.equals(selection.provider) : selection.provider != null) 54 | return false; 55 | if (path != null ? !path.equals(selection.path) : selection.path != null) return false; 56 | if (uri != null ? !uri.equals(selection.uri) : selection.uri != null) return false; 57 | if (mimeType != null ? !mimeType.equals(selection.mimeType) : selection.mimeType != null) 58 | return false; 59 | return name != null ? name.equals(selection.name) : selection.name == null; 60 | } 61 | 62 | @Override 63 | public int hashCode() { 64 | int result = provider != null ? provider.hashCode() : 0; 65 | result = 31 * result + (path != null ? path.hashCode() : 0); 66 | result = 31 * result + (uri != null ? uri.hashCode() : 0); 67 | result = 31 * result + size; 68 | result = 31 * result + (mimeType != null ? mimeType.hashCode() : 0); 69 | result = 31 * result + (name != null ? name.hashCode() : 0); 70 | return result; 71 | } 72 | 73 | /** The source this file came from. */ 74 | public String getProvider() { 75 | return provider; 76 | } 77 | 78 | /** The path of this file in a cloud provider. Null if a local file. */ 79 | public String getPath() { 80 | return path; 81 | } 82 | 83 | /** The Android system URI of this file. Null if a cloud file. */ 84 | public Uri getUri() { 85 | return uri; 86 | } 87 | 88 | /** Size in bytes. */ 89 | public int getSize() { 90 | return size; 91 | } 92 | 93 | public String getMimeType() { 94 | return mimeType; 95 | } 96 | 97 | public String getName() { 98 | return name; 99 | } 100 | 101 | private static class Creator implements Parcelable.Creator { 102 | @Override 103 | public Selection createFromParcel(Parcel in) { 104 | return new Selection(in); 105 | } 106 | 107 | @Override 108 | public Selection[] newArray(int size) { 109 | return new Selection[size]; 110 | } 111 | } 112 | 113 | public int describeContents() { 114 | return 0; 115 | } 116 | 117 | public void writeToParcel(Parcel out, int flags) { 118 | out.writeString(provider); 119 | out.writeString(path); 120 | out.writeParcelable(uri, flags); 121 | out.writeInt(size); 122 | out.writeString(mimeType); 123 | out.writeString(name); 124 | } 125 | 126 | private Selection(Parcel in) { 127 | provider = in.readString(); 128 | path = in.readString(); 129 | uri = in.readParcelable(Uri.class.getClassLoader()); 130 | size = in.readInt(); 131 | mimeType = in.readString(); 132 | name = in.readString(); 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /filestack/src/main/java/com/filestack/android/Theme.java: -------------------------------------------------------------------------------- 1 | package com.filestack.android; 2 | 3 | import android.graphics.Color; 4 | import android.os.Parcel; 5 | import android.os.Parcelable; 6 | import androidx.annotation.ColorInt; 7 | 8 | public class Theme implements Parcelable { 9 | 10 | static Theme defaultTheme() { 11 | return new Builder().build(); 12 | } 13 | 14 | private final String title; 15 | private final int backgroundColor; 16 | private final int accentColor; 17 | private final int textColor; 18 | 19 | private Theme(Builder builder) { 20 | this.title = builder.title; 21 | this.backgroundColor = builder.backgroundColor; 22 | this.accentColor = builder.accentColor; 23 | this.textColor = builder.textColor; 24 | } 25 | 26 | public String getTitle() { 27 | return title; 28 | } 29 | 30 | public int getBackgroundColor() { 31 | return backgroundColor; 32 | } 33 | 34 | public int getAccentColor() { 35 | return accentColor; 36 | } 37 | 38 | public int getTextColor() { 39 | return textColor; 40 | } 41 | 42 | public static class Builder { 43 | String title = "Filestack Picker"; 44 | int backgroundColor = Color.WHITE; 45 | int accentColor = Color.parseColor("#FF9800"); 46 | int textColor = Color.parseColor("#89000000"); 47 | 48 | /** 49 | * Title of the Picker. 50 | */ 51 | public Builder title(String title) { 52 | this.title = title; 53 | return this; 54 | } 55 | 56 | /** 57 | * Background color. Displayed in lists and a navigation drawer. 58 | * Used also as a text color for toolbar title and 59 | * buttons on authorization/local/camera screens. 60 | * @param backgroundColor int representation of a color 61 | */ 62 | public Builder backgroundColor(@ColorInt int backgroundColor) { 63 | this.backgroundColor = backgroundColor; 64 | return this; 65 | } 66 | 67 | /** 68 | * Accent color. Used as a color for toolbar, selection markers and navigation drawer items. 69 | * @param accentColor int representation of a color 70 | */ 71 | public Builder accentColor(@ColorInt int accentColor) { 72 | this.accentColor = accentColor; 73 | return this; 74 | } 75 | 76 | /** 77 | * Text color. Used as a color for text in camera/local/authorization/file list screens. 78 | * @param textColor int representation of a color 79 | */ 80 | public Builder textColor(@ColorInt int textColor) { 81 | this.textColor = textColor; 82 | return this; 83 | } 84 | 85 | /** 86 | * Builds a new theme based on provided parameters. 87 | * @return new {@link Theme} instance 88 | */ 89 | public Theme build() { 90 | return new Theme(this); 91 | } 92 | } 93 | 94 | protected Theme(Parcel in) { 95 | title = in.readString(); 96 | backgroundColor = in.readInt(); 97 | accentColor = in.readInt(); 98 | textColor = in.readInt(); 99 | } 100 | 101 | @Override 102 | public void writeToParcel(Parcel dest, int flags) { 103 | dest.writeString(title); 104 | dest.writeInt(backgroundColor); 105 | dest.writeInt(accentColor); 106 | dest.writeInt(textColor); 107 | } 108 | 109 | @Override 110 | public int describeContents() { 111 | return 0; 112 | } 113 | 114 | public static final Creator CREATOR = new Creator() { 115 | @Override 116 | public Theme createFromParcel(Parcel in) { 117 | return new Theme(in); 118 | } 119 | 120 | @Override 121 | public Theme[] newArray(int size) { 122 | return new Theme[size]; 123 | } 124 | }; 125 | } 126 | -------------------------------------------------------------------------------- /filestack/src/main/java/com/filestack/android/internal/BackButtonListener.java: -------------------------------------------------------------------------------- 1 | package com.filestack.android.internal; 2 | 3 | /** 4 | * Communicates back button presses between activity and fragments. Needed to traverse backwards 5 | * in cloud files list. 6 | */ 7 | public interface BackButtonListener { 8 | boolean onBackPressed(); 9 | } 10 | -------------------------------------------------------------------------------- /filestack/src/main/java/com/filestack/android/internal/CloudAuthFragment.java: -------------------------------------------------------------------------------- 1 | package com.filestack.android.internal; 2 | 3 | import android.content.res.ColorStateList; 4 | import android.net.Uri; 5 | import android.os.Bundle; 6 | import androidx.annotation.Nullable; 7 | import androidx.browser.customtabs.CustomTabsIntent; 8 | import androidx.fragment.app.Fragment; 9 | import androidx.core.content.ContextCompat; 10 | import androidx.core.view.ViewCompat; 11 | import androidx.core.widget.ImageViewCompat; 12 | import android.view.LayoutInflater; 13 | import android.view.Menu; 14 | import android.view.View; 15 | import android.view.ViewGroup; 16 | import android.widget.Button; 17 | import android.widget.ImageView; 18 | import android.widget.TextView; 19 | 20 | import com.filestack.android.R; 21 | import com.filestack.android.Theme; 22 | 23 | /** Displays "cloud auth required" message and creates an intent to open the link in the browser. */ 24 | public class CloudAuthFragment extends Fragment implements BackButtonListener { 25 | private final static String ARG_SOURCE = "source"; 26 | private final static String ARG_AUTH_URL = "authUrl"; 27 | private final static String ARG_THEME = "theme"; 28 | 29 | private final static int[] TEXT_VIEW_IDS = { 30 | R.id.title, R.id.description, R.id.button, R.id.action }; 31 | 32 | private SourceInfo sourceInfo; 33 | private String authUrl; 34 | 35 | public static CloudAuthFragment create(String source, String authUrl, Theme theme) { 36 | CloudAuthFragment fragment = new CloudAuthFragment(); 37 | Bundle args = new Bundle(); 38 | args.putString(ARG_SOURCE, source); 39 | args.putString(ARG_AUTH_URL, authUrl); 40 | args.putParcelable(ARG_THEME, theme); 41 | fragment.setArguments(args); 42 | return fragment; 43 | } 44 | 45 | @Override 46 | public void onCreate(@Nullable Bundle savedInstanceState) { 47 | super.onCreate(savedInstanceState); 48 | 49 | Bundle args = getArguments(); 50 | sourceInfo = Util.getSourceInfo(args.getString(ARG_SOURCE)); 51 | authUrl = args.getString(ARG_AUTH_URL); 52 | } 53 | 54 | @Nullable 55 | @Override 56 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 57 | @Nullable Bundle savedInstanceState) { 58 | 59 | View baseView = inflater.inflate(R.layout.filestack__fragment_auth, container, false); 60 | 61 | ImageView iconView = baseView.findViewById(R.id.icon); 62 | iconView.setImageResource(sourceInfo.getIconId()); 63 | 64 | Theme theme = getArguments().getParcelable(ARG_THEME); 65 | String target = "Cloud"; 66 | String replacement = getString(sourceInfo.getTextId()); 67 | for (int id : TEXT_VIEW_IDS) { 68 | TextView textView = baseView.findViewById(id); 69 | textView.setTextColor(theme.getTextColor()); 70 | Util.textViewReplace(textView, target, replacement); 71 | } 72 | Button button = baseView.findViewById(R.id.button); 73 | button.setOnClickListener(new View.OnClickListener() { 74 | @Override 75 | public void onClick(View v) { 76 | openAuthPage(authUrl); 77 | } 78 | }); 79 | 80 | ViewCompat.setBackgroundTintList(button, ColorStateList.valueOf(theme.getAccentColor())); 81 | button.setTextColor(theme.getBackgroundColor()); 82 | ImageViewCompat.setImageTintList(iconView, ColorStateList.valueOf(theme.getTextColor())); 83 | 84 | return baseView; 85 | } 86 | 87 | @Override 88 | public void onPrepareOptionsMenu(Menu menu) { 89 | super.onPrepareOptionsMenu(menu); 90 | menu.findItem(R.id.action_logout).setVisible(false); 91 | menu.findItem(R.id.action_toggle_list_grid).setVisible(false); 92 | } 93 | 94 | private void openAuthPage(String authUrl) { 95 | CustomTabsIntent intent = new CustomTabsIntent.Builder().build(); 96 | intent.launchUrl(requireContext(), Uri.parse(authUrl)); 97 | } 98 | 99 | @Override 100 | public boolean onBackPressed() { 101 | return false; 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /filestack/src/main/java/com/filestack/android/internal/CloudListViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.filestack.android.internal; 2 | 3 | import android.content.Context; 4 | import android.content.res.ColorStateList; 5 | import androidx.annotation.ColorInt; 6 | import androidx.core.graphics.ColorUtils; 7 | import androidx.core.widget.ImageViewCompat; 8 | import androidx.recyclerview.widget.RecyclerView; 9 | import android.view.View; 10 | import android.widget.ImageView; 11 | import android.widget.TextView; 12 | 13 | import com.filestack.android.R; 14 | import com.filestack.android.Theme; 15 | import com.squareup.picasso.Picasso; 16 | 17 | /** 18 | * Holds references to view elements inside {{@link RecyclerView}} list items. 19 | * {{@link CloudListFragment}}, {{@link CloudListAdapter}}, and {{@link CloudListViewHolder}} work 20 | * together to create the cloud sources list. 21 | * 22 | * @see 23 | * https://developer.android.com/guide/topics/ui/layout/recyclerview 24 | */ 25 | class CloudListViewHolder extends RecyclerView.ViewHolder { 26 | private TextView nameView; 27 | private TextView infoView; 28 | private ImageView iconView; 29 | private ImageView checkboxView; 30 | 31 | CloudListViewHolder(View listItemView) { 32 | super(listItemView); 33 | this.nameView = listItemView.findViewById(R.id.name); 34 | this.infoView = listItemView.findViewById(R.id.info); 35 | this.iconView = listItemView.findViewById(R.id.icon); 36 | this.checkboxView = listItemView.findViewById(R.id.checkbox); 37 | } 38 | 39 | public void setId(int id) { 40 | itemView.setId(id); 41 | } 42 | 43 | public void setName(String name) { 44 | if (nameView != null) { 45 | nameView.setText(name); 46 | } 47 | } 48 | 49 | public void setInfo(String info) { 50 | if (infoView != null) { 51 | infoView.setText(info); 52 | } 53 | } 54 | 55 | public void setInfoVisible(boolean isVisible) { 56 | if (infoView != null) { 57 | infoView.setVisibility(isVisible ? View.VISIBLE : View.GONE); 58 | } 59 | } 60 | 61 | public void setIcon(String url) { 62 | if (iconView != null) { 63 | Context context = iconView.getContext(); 64 | Picasso.with(context).load(url).into(iconView); 65 | } 66 | } 67 | 68 | public void apply(Theme theme) { 69 | if (nameView != null) { 70 | nameView.setTextColor(theme.getTextColor()); 71 | } 72 | 73 | if (infoView!= null) { 74 | infoView.setTextColor(ColorUtils.setAlphaComponent(theme.getTextColor(), 220)); 75 | } 76 | 77 | ImageViewCompat.setImageTintList(checkboxView, ColorStateList.valueOf(theme.getAccentColor())); 78 | 79 | } 80 | 81 | void setOnClickListener(View.OnClickListener listener) { 82 | itemView.setOnClickListener(listener); 83 | } 84 | 85 | void setSelected(boolean selected) { 86 | if (selected) { 87 | checkboxView.setVisibility(View.VISIBLE); 88 | } else { 89 | checkboxView.setVisibility(View.INVISIBLE); 90 | } 91 | } 92 | 93 | void setEnabled(boolean enabled) { 94 | float alpha = enabled ? 1.0f : 0.45f; 95 | iconView.setAlpha(alpha); 96 | if (nameView != null) { 97 | nameView.setAlpha(alpha); 98 | infoView.setAlpha(alpha); 99 | } 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /filestack/src/main/java/com/filestack/android/internal/Constants.java: -------------------------------------------------------------------------------- 1 | package com.filestack.android.internal; 2 | 3 | import static android.app.Activity.RESULT_FIRST_USER; 4 | 5 | public class Constants { 6 | static final int REQUEST_MEDIA_CAPTURE = RESULT_FIRST_USER; 7 | } 8 | -------------------------------------------------------------------------------- /filestack/src/main/java/com/filestack/android/internal/LocalFilesFragment.java: -------------------------------------------------------------------------------- 1 | package com.filestack.android.internal; 2 | 3 | import android.app.Activity; 4 | import android.content.ClipData; 5 | import android.content.ContentResolver; 6 | import android.content.Intent; 7 | import android.content.res.ColorStateList; 8 | import android.database.Cursor; 9 | import android.net.Uri; 10 | import android.os.Bundle; 11 | import android.provider.OpenableColumns; 12 | import androidx.annotation.Nullable; 13 | import androidx.fragment.app.Fragment; 14 | import androidx.core.view.ViewCompat; 15 | import androidx.core.widget.ImageViewCompat; 16 | import android.view.LayoutInflater; 17 | import android.view.Menu; 18 | import android.view.View; 19 | import android.view.ViewGroup; 20 | import android.widget.Button; 21 | import android.widget.ImageView; 22 | 23 | import com.filestack.android.FsConstants; 24 | import com.filestack.android.R; 25 | import com.filestack.android.Selection; 26 | import com.filestack.android.Theme; 27 | 28 | import java.util.ArrayList; 29 | 30 | import static android.app.Activity.RESULT_FIRST_USER; 31 | 32 | /** 33 | * Handles opening system file browser and processing results for local file selection. 34 | * 35 | * @see 36 | * https://developer.android.com/guide/topics/providers/document-provider 37 | */ 38 | public class LocalFilesFragment extends Fragment implements View.OnClickListener { 39 | private static final String ARG_ALLOW_MULTIPLE_FILES = "multipleFiles"; 40 | private static final int READ_REQUEST_CODE = RESULT_FIRST_USER; 41 | private static final String ARG_THEME = "theme"; 42 | 43 | public static Fragment newInstance(boolean allowMultipleFiles, Theme theme) { 44 | Fragment fragment = new LocalFilesFragment(); 45 | Bundle args = new Bundle(); 46 | args.putBoolean(ARG_ALLOW_MULTIPLE_FILES, allowMultipleFiles); 47 | args.putParcelable(ARG_THEME, theme); 48 | fragment.setArguments(args); 49 | return fragment; 50 | } 51 | 52 | @Nullable 53 | @Override 54 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) { 55 | View view = inflater.inflate(R.layout.filestack__fragment_local_files, container, false); 56 | Button openGalleryButton = view.findViewById(R.id.select_gallery); 57 | openGalleryButton.setOnClickListener(this); 58 | Theme theme = getArguments().getParcelable(ARG_THEME); 59 | ViewCompat.setBackgroundTintList(openGalleryButton, ColorStateList.valueOf(theme.getAccentColor())); 60 | openGalleryButton.setTextColor(theme.getBackgroundColor()); 61 | ImageViewCompat.setImageTintList((ImageView) view.findViewById(R.id.icon), ColorStateList.valueOf(theme.getTextColor())); 62 | return view; 63 | } 64 | 65 | @Override 66 | public void onPrepareOptionsMenu(Menu menu) { 67 | super.onPrepareOptionsMenu(menu); 68 | menu.findItem(R.id.action_logout).setVisible(false); 69 | menu.findItem(R.id.action_toggle_list_grid).setVisible(false); 70 | } 71 | 72 | @Override 73 | public void onClick(View view) { 74 | startFilePicker(); 75 | } 76 | 77 | private void startFilePicker() { 78 | final Intent intent; 79 | if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { 80 | intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 81 | intent.addCategory(Intent.CATEGORY_OPENABLE); 82 | boolean allowMultipleFiles = getArguments().getBoolean(ARG_ALLOW_MULTIPLE_FILES, true); 83 | intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, allowMultipleFiles); 84 | intent.setType("*/*"); 85 | 86 | Intent launchIntent = getActivity().getIntent(); 87 | String[] mimeTypes = launchIntent.getStringArrayExtra(FsConstants.EXTRA_MIME_TYPES); 88 | if (mimeTypes != null) { 89 | intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes); 90 | } 91 | startActivityForResult(intent, READ_REQUEST_CODE); 92 | } else { 93 | intent = new Intent(Intent.ACTION_GET_CONTENT); 94 | intent.setType("*/*"); 95 | startActivityForResult(intent, READ_REQUEST_CODE); 96 | } 97 | } 98 | 99 | @Override 100 | public void onActivityResult(int requestCode, int resultCode, Intent resultData) { 101 | 102 | if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) { 103 | ClipData clipData = resultData.getClipData(); 104 | ArrayList uris = new ArrayList<>(); 105 | 106 | if (clipData != null) { 107 | for (int i = 0; i < clipData.getItemCount(); i++) { 108 | uris.add(clipData.getItemAt(i).getUri()); 109 | } 110 | } else { 111 | uris.add(resultData.getData()); 112 | } 113 | 114 | for (Uri uri : uris) { 115 | Selection selection = processUri(uri); 116 | Util.getSelectionSaver().toggleItem(selection); 117 | } 118 | } 119 | } 120 | 121 | private Selection processUri(Uri uri) { 122 | ContentResolver resolver = getActivity().getContentResolver(); 123 | 124 | Cursor cursor = null; 125 | try { 126 | cursor = resolver.query(uri, null, null, null, null, null); 127 | if (cursor != null && cursor.moveToFirst()) { 128 | int nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); 129 | int sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE); 130 | 131 | // We can't upload files without knowing the size 132 | if (cursor.isNull(sizeIndex)) { 133 | return null; 134 | } 135 | 136 | String name = cursor.getString(nameIndex); 137 | int size = cursor.getInt(sizeIndex); 138 | String mimeType = resolver.getType(uri); 139 | return SelectionFactory.from(uri, size, mimeType, name); 140 | } else { 141 | return null; 142 | } 143 | } finally { 144 | if (cursor != null) { 145 | cursor.close(); 146 | } 147 | } 148 | } 149 | } 150 | -------------------------------------------------------------------------------- /filestack/src/main/java/com/filestack/android/internal/SelectionFactory.java: -------------------------------------------------------------------------------- 1 | package com.filestack.android.internal; 2 | 3 | import android.net.Uri; 4 | 5 | import com.filestack.CloudItem; 6 | import com.filestack.Sources; 7 | import com.filestack.android.Selection; 8 | 9 | class SelectionFactory { 10 | 11 | public static Selection from(String sourceId, CloudItem cloudItem) { 12 | return new Selection(sourceId, cloudItem.getPath(), cloudItem.getMimetype(), 13 | cloudItem.getName()); 14 | } 15 | 16 | public static Selection from(Uri uri, int size, String mimeType, String name) { 17 | return new Selection(Sources.DEVICE, uri, size, mimeType, name); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /filestack/src/main/java/com/filestack/android/internal/SelectionSaver.java: -------------------------------------------------------------------------------- 1 | package com.filestack.android.internal; 2 | 3 | import com.filestack.android.Selection; 4 | 5 | import java.util.ArrayList; 6 | 7 | /** Manages a user's file selections. Used to save selections and notify others about changes. */ 8 | public interface SelectionSaver { 9 | boolean toggleItem(Selection selection); 10 | boolean isSelected(Selection selection); 11 | void setItemChangeListener(Listener listener); 12 | ArrayList getItems(); 13 | void clear(); 14 | boolean isEmpty(); 15 | interface Listener { 16 | void onEmptyChanged(boolean isEmpty); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /filestack/src/main/java/com/filestack/android/internal/Selector.java: -------------------------------------------------------------------------------- 1 | package com.filestack.android.internal; 2 | 3 | import com.filestack.android.Selection; 4 | 5 | public interface Selector { 6 | boolean toggle(Selection selection); 7 | boolean isSelected(Selection selection); 8 | 9 | class Single implements Selector { 10 | 11 | private final SelectionSaver selectionSaver; 12 | 13 | public Single(SelectionSaver selectionSaver) { 14 | this.selectionSaver = selectionSaver; 15 | } 16 | 17 | @Override 18 | public boolean toggle(Selection selection) { 19 | if (selectionSaver.isEmpty()) { 20 | return selectionSaver.toggleItem(selection); 21 | } else if (selectionSaver.getItems().get(0).equals(selection)) { 22 | return selectionSaver.toggleItem(selection); 23 | } 24 | return false; 25 | } 26 | 27 | @Override 28 | public boolean isSelected(Selection selection) { 29 | return selectionSaver.isSelected(selection); 30 | } 31 | } 32 | 33 | class Multi implements Selector { 34 | 35 | private SelectionSaver selectionSaver; 36 | 37 | public Multi(SelectionSaver selectionSaver) { 38 | this.selectionSaver = selectionSaver; 39 | } 40 | 41 | @Override 42 | public boolean toggle(Selection selection) { 43 | return selectionSaver.toggleItem(selection); 44 | } 45 | 46 | @Override 47 | public boolean isSelected(Selection selection) { 48 | return selectionSaver.isSelected(selection); 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /filestack/src/main/java/com/filestack/android/internal/SimpleSelectionSaver.java: -------------------------------------------------------------------------------- 1 | package com.filestack.android.internal; 2 | 3 | import com.filestack.android.Selection; 4 | 5 | import java.util.ArrayList; 6 | 7 | /** 8 | * Implementation of {{@link SelectionSaver}}. Just saves selections to an {{@link ArrayList}}. 9 | */ 10 | public class SimpleSelectionSaver implements SelectionSaver { 11 | private ArrayList selections = new ArrayList<>(); 12 | private Listener listener; 13 | 14 | @Override 15 | public void setItemChangeListener(Listener listener) { 16 | if (listener == null) { 17 | return; 18 | } 19 | this.listener = listener; 20 | this.listener.onEmptyChanged(isEmpty()); 21 | } 22 | 23 | @Override 24 | public ArrayList getItems() { 25 | return selections; 26 | } 27 | 28 | @Override 29 | public void clear() { 30 | if (selections.size() != 0) { 31 | selections.clear(); 32 | if (listener != null) { 33 | listener.onEmptyChanged(true); 34 | } 35 | } 36 | } 37 | 38 | @Override 39 | public boolean isEmpty() { 40 | return selections.size() == 0; 41 | } 42 | 43 | @Override 44 | public boolean toggleItem(Selection item) { 45 | boolean isSaved; 46 | 47 | boolean wasEmpty = isEmpty(); 48 | 49 | if (isSelected(item)) { 50 | selections.remove(item); 51 | isSaved = false; 52 | } else { 53 | selections.add(item); 54 | isSaved = true; 55 | } 56 | 57 | boolean isEmpty = isEmpty(); 58 | 59 | if (listener != null && wasEmpty != isEmpty) { 60 | listener.onEmptyChanged(isEmpty); 61 | } 62 | 63 | return isSaved; 64 | } 65 | 66 | @Override 67 | public boolean isSelected(Selection item) { 68 | return selections.contains(item); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /filestack/src/main/java/com/filestack/android/internal/SourceInfo.java: -------------------------------------------------------------------------------- 1 | package com.filestack.android.internal; 2 | 3 | /** Holds res info about a "source" files can be selected from e.g. local, google, facebook. */ 4 | public class SourceInfo { 5 | private String id; 6 | private int iconId; 7 | private int textId; 8 | private int colorId; 9 | 10 | SourceInfo(String id, int iconId, int textId, int colorId) { 11 | this.id = id; 12 | this.iconId = iconId; 13 | this.textId = textId; 14 | this.colorId = colorId; 15 | } 16 | 17 | public String getId() { 18 | return id; 19 | } 20 | 21 | public int getIconId() { 22 | return iconId; 23 | } 24 | 25 | public int getTextId() { 26 | return textId; 27 | } 28 | 29 | public int getColorId() { 30 | return colorId; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /filestack/src/main/java/com/filestack/android/internal/SpacingDecoration.java: -------------------------------------------------------------------------------- 1 | package com.filestack.android.internal; 2 | 3 | import android.graphics.Rect; 4 | import androidx.recyclerview.widget.GridLayoutManager; 5 | import androidx.recyclerview.widget.LinearLayoutManager; 6 | import androidx.recyclerview.widget.RecyclerView; 7 | import androidx.recyclerview.widget.StaggeredGridLayoutManager; 8 | import android.view.View; 9 | 10 | // Taken from https://stackoverflow.com/a/32971704/5121687 11 | // TODO Still needs tweaking, offsets aren't exactly correct 12 | // In a 3 column grid, the middle items are a few pixels larger than first and last 13 | 14 | /** 15 | * Adds spacing between items in a {@link RecyclerView}. Works with {@link LinearLayoutManager}, 16 | * {@link GridLayoutManager}, and {@link StaggeredGridLayoutManager}. Only handles vertical 17 | * orientation. 18 | */ 19 | class SpacingDecoration extends RecyclerView.ItemDecoration { 20 | private final int hSpacing; 21 | private final int vSpacing; 22 | private final boolean includeEdge; 23 | 24 | SpacingDecoration(int hSpacing, int vSpacing, boolean includeEdge) { 25 | this.hSpacing = hSpacing; 26 | this.vSpacing = vSpacing; 27 | this.includeEdge = includeEdge; 28 | } 29 | 30 | @Override 31 | public void getItemOffsets(Rect outRect, View view, RecyclerView parent, 32 | RecyclerView.State state) { 33 | 34 | super.getItemOffsets(outRect, view, parent, state); 35 | 36 | int position = parent.getChildAdapterPosition(view); 37 | RecyclerView.LayoutManager manager = parent.getLayoutManager(); 38 | 39 | if (manager instanceof GridLayoutManager) { 40 | GridLayoutManager gridManager = (GridLayoutManager) manager; 41 | int spanCount = gridManager.getSpanCount(); 42 | int column = position % spanCount; 43 | getGridItemOffsets(outRect, position, column, spanCount); 44 | 45 | } else if (parent.getLayoutManager() instanceof StaggeredGridLayoutManager) { 46 | StaggeredGridLayoutManager staggeredManager = (StaggeredGridLayoutManager) manager; 47 | int spanCount = staggeredManager.getSpanCount(); 48 | StaggeredGridLayoutManager.LayoutParams params; 49 | params = (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams(); 50 | int column = params.getSpanIndex(); 51 | getGridItemOffsets(outRect, position, column, spanCount); 52 | 53 | } else if (manager instanceof LinearLayoutManager) { 54 | outRect.left = hSpacing; 55 | outRect.right = hSpacing; 56 | 57 | if (includeEdge) { 58 | if (position == 0) { 59 | outRect.top = vSpacing; 60 | } 61 | outRect.bottom = vSpacing; 62 | } else { 63 | if (position > 0) { 64 | outRect.top = vSpacing; 65 | } 66 | } 67 | } 68 | } 69 | 70 | private void getGridItemOffsets(Rect outRect, int position, int column, int spanCount) { 71 | if (includeEdge) { 72 | outRect.left = hSpacing * (spanCount - column) / spanCount; 73 | outRect.right = hSpacing * (column + 1) / spanCount; 74 | if (position < spanCount) { 75 | outRect.top = vSpacing; 76 | } 77 | outRect.bottom = vSpacing; 78 | } else { 79 | outRect.left = hSpacing * column / spanCount; 80 | outRect.right = hSpacing * (spanCount - 1 - column) / spanCount; 81 | if (position >= spanCount) { 82 | outRect.top = vSpacing; 83 | } 84 | } 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /filestack/src/main/java/com/filestack/android/internal/SquareImageView.java: -------------------------------------------------------------------------------- 1 | package com.filestack.android.internal; 2 | 3 | import android.content.Context; 4 | import androidx.appcompat.widget.AppCompatImageView; 5 | import android.util.AttributeSet; 6 | 7 | public class SquareImageView extends AppCompatImageView { 8 | public SquareImageView(Context context, AttributeSet attrs) { 9 | super(context, attrs); 10 | } 11 | 12 | @SuppressWarnings("SuspiciousNameCombination") 13 | @Override 14 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 15 | super.onMeasure(widthMeasureSpec, widthMeasureSpec); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /filestack/src/main/java/com/filestack/android/internal/package-info.java: -------------------------------------------------------------------------------- 1 | /** Internal API. Not covered under versioning. */ 2 | package com.filestack.android.internal; -------------------------------------------------------------------------------- /filestack/src/main/java/com/filestack/android/package-info.java: -------------------------------------------------------------------------------- 1 | /** Filestack is an easy API for file uploading, conversion, and delivery. */ 2 | package com.filestack.android; -------------------------------------------------------------------------------- /filestack/src/main/res/drawable-hdpi/filestack__ic_menu_upload_done_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filestack/filestack-android/ac9e5120560f90c9aad0985a13f297bce5282fdd/filestack/src/main/res/drawable-hdpi/filestack__ic_menu_upload_done_white.png -------------------------------------------------------------------------------- /filestack/src/main/res/drawable-hdpi/filestack__ic_menu_upload_fail_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filestack/filestack-android/ac9e5120560f90c9aad0985a13f297bce5282fdd/filestack/src/main/res/drawable-hdpi/filestack__ic_menu_upload_fail_white.png -------------------------------------------------------------------------------- /filestack/src/main/res/drawable-hdpi/filestack__ic_menu_upload_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filestack/filestack-android/ac9e5120560f90c9aad0985a13f297bce5282fdd/filestack/src/main/res/drawable-hdpi/filestack__ic_menu_upload_white.png -------------------------------------------------------------------------------- /filestack/src/main/res/drawable-mdpi/filestack__ic_menu_upload_done_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filestack/filestack-android/ac9e5120560f90c9aad0985a13f297bce5282fdd/filestack/src/main/res/drawable-mdpi/filestack__ic_menu_upload_done_white.png -------------------------------------------------------------------------------- /filestack/src/main/res/drawable-mdpi/filestack__ic_menu_upload_fail_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filestack/filestack-android/ac9e5120560f90c9aad0985a13f297bce5282fdd/filestack/src/main/res/drawable-mdpi/filestack__ic_menu_upload_fail_white.png -------------------------------------------------------------------------------- /filestack/src/main/res/drawable-mdpi/filestack__ic_menu_upload_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filestack/filestack-android/ac9e5120560f90c9aad0985a13f297bce5282fdd/filestack/src/main/res/drawable-mdpi/filestack__ic_menu_upload_white.png -------------------------------------------------------------------------------- /filestack/src/main/res/drawable-v21/filestack__ic_menu_upload_done_white.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable-v21/filestack__ic_menu_upload_fail_white.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable-v21/filestack__ic_menu_upload_white.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable-xhdpi/filestack__ic_menu_upload_done_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filestack/filestack-android/ac9e5120560f90c9aad0985a13f297bce5282fdd/filestack/src/main/res/drawable-xhdpi/filestack__ic_menu_upload_done_white.png -------------------------------------------------------------------------------- /filestack/src/main/res/drawable-xhdpi/filestack__ic_menu_upload_fail_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filestack/filestack-android/ac9e5120560f90c9aad0985a13f297bce5282fdd/filestack/src/main/res/drawable-xhdpi/filestack__ic_menu_upload_fail_white.png -------------------------------------------------------------------------------- /filestack/src/main/res/drawable-xhdpi/filestack__ic_menu_upload_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filestack/filestack-android/ac9e5120560f90c9aad0985a13f297bce5282fdd/filestack/src/main/res/drawable-xhdpi/filestack__ic_menu_upload_white.png -------------------------------------------------------------------------------- /filestack/src/main/res/drawable-xxhdpi/filestack__ic_menu_upload_done_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filestack/filestack-android/ac9e5120560f90c9aad0985a13f297bce5282fdd/filestack/src/main/res/drawable-xxhdpi/filestack__ic_menu_upload_done_white.png -------------------------------------------------------------------------------- /filestack/src/main/res/drawable-xxhdpi/filestack__ic_menu_upload_fail_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filestack/filestack-android/ac9e5120560f90c9aad0985a13f297bce5282fdd/filestack/src/main/res/drawable-xxhdpi/filestack__ic_menu_upload_fail_white.png -------------------------------------------------------------------------------- /filestack/src/main/res/drawable-xxhdpi/filestack__ic_menu_upload_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filestack/filestack-android/ac9e5120560f90c9aad0985a13f297bce5282fdd/filestack/src/main/res/drawable-xxhdpi/filestack__ic_menu_upload_white.png -------------------------------------------------------------------------------- /filestack/src/main/res/drawable-xxxhdpi/filestack__ic_menu_upload_done_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filestack/filestack-android/ac9e5120560f90c9aad0985a13f297bce5282fdd/filestack/src/main/res/drawable-xxxhdpi/filestack__ic_menu_upload_done_white.png -------------------------------------------------------------------------------- /filestack/src/main/res/drawable-xxxhdpi/filestack__ic_menu_upload_fail_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filestack/filestack-android/ac9e5120560f90c9aad0985a13f297bce5282fdd/filestack/src/main/res/drawable-xxxhdpi/filestack__ic_menu_upload_fail_white.png -------------------------------------------------------------------------------- /filestack/src/main/res/drawable-xxxhdpi/filestack__ic_menu_upload_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/filestack/filestack-android/ac9e5120560f90c9aad0985a13f297bce5282fdd/filestack/src/main/res/drawable-xxxhdpi/filestack__ic_menu_upload_white.png -------------------------------------------------------------------------------- /filestack/src/main/res/drawable/filestack__ic_list_checkbox.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable/filestack__ic_menu_grid_white.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable/filestack__ic_menu_list_white.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable/filestack__ic_menu_square_white.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable/filestack__ic_menu_upload_done_white.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable/filestack__ic_menu_upload_fail_white.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable/filestack__ic_menu_upload_white.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable/filestack__ic_source_amazon_drive.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable/filestack__ic_source_box.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable/filestack__ic_source_camera.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable/filestack__ic_source_camera_video.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable/filestack__ic_source_device.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable/filestack__ic_source_dropbox.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable/filestack__ic_source_facebook.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable/filestack__ic_source_github.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable/filestack__ic_source_gmail.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable/filestack__ic_source_google_drive.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable/filestack__ic_source_google_photos.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable/filestack__ic_source_instagram.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable/filestack__ic_source_onedrive.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | -------------------------------------------------------------------------------- /filestack/src/main/res/drawable/filestack__list_grid_divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | -------------------------------------------------------------------------------- /filestack/src/main/res/layout-sw600dp/filestack__activity_filestack.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 21 | 22 | 23 | 24 | 29 | 30 | 37 | 38 | 45 | 46 | 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /filestack/src/main/res/layout/filestack__activity_filestack.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 15 | 16 | 21 | 22 | 28 | 29 | 30 | 31 | 35 | 36 | 37 | 38 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /filestack/src/main/res/layout/filestack__app_bar_filestack.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /filestack/src/main/res/layout/filestack__cloud_grid_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /filestack/src/main/res/layout/filestack__cloud_list_item.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 15 | 16 | 25 | 26 | 37 | 38 | 39 | 43 | 44 | 54 | 55 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /filestack/src/main/res/layout/filestack__fragment_auth.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 23 | 24 | 37 | 38 | 49 | 50 |