ModernStorage is a group of libraries that provide an abstraction layer over storage on Android to simplify its interactions

Overview

ModernStorage

ModernStorage

ModernStorage is a group of libraries that provide an abstraction layer over storage on Android to simplify its interactions by apps developers. ModernStorage is:

  • Easy to use: ModernStorage focuses on API simplicity. Rather than calling four separate methods with the Android Framework API, you only need to call one.
  • Opinionated: ModernStorage is written by the Android DevRel team in collaboration with the Android Storage team, taking in account all the feedback from the developer community to address common issues when dealing with storage on Android.

Download

ModernStorage is available on mavenCentral().

// For MediaStore interactions
implementation("com.google.modernstorage:modernstorage-mediastore:1.0.0-alpha02")

// For Storage Access Framework interactions on API 26+
implementation("com.google.modernstorage:modernstorage-filesystem:1.0.0-alpha02")

Quick Start

  • For MediaStore interactions, check out the sample app
  • For non-media files on shared storage & SAF interactions, stay tuned for the upcoming filesystem package

Contributions

We're still at an early stage sharing the vision of ModernStorage and would love to have more feature requests and ideas proposed as issues. We would be glad to review pull requests, but keep in mind that we want to minimize expanding the API surface until we get more feedback from developers. Make sure to read the Contributing page first though.

License

Copyright 2021 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Comments
  • Request: add easy way to prepare a DocumentFile by file-path

    Request: add easy way to prepare a DocumentFile by file-path

    Because Google said that the current API (of DocumentFile.fromFile) doesn't provide it, and that it doesn't plan on adding such a thing either: https://issuetracker.google.com/issues/179478996#comment11

    My request was that given a file-path, I should be able to reach it via DocumentFile (assuming I have access to the file, and that indeed it's a file on the device file system), and perform all operations on it like any other DocumentFile instance.

    opened by AndroidDeveloperLB 8
  • Introducing Kotlin linter checks in github actions

    Introducing Kotlin linter checks in github actions

    Adding Ktlint linter for kotlin as a static GitHub check will reduce the code review period and improve code style

    Found the following errors when checked with Ktlint 0.37.1^v

    /home/farees/opensource/modernstorage/media/src/androidTest/java/com/google/modernstorage/media/ExampleInstrumentedTest.kt:1:1: File must end with a newline (\n)
    /home/farees/opensource/modernstorage/media/src/main/java/com/google/modernstorage/media/CustomActivityResultContracts.kt:39:1: Needless blank line(s)
    /home/farees/opensource/modernstorage/media/src/main/java/com/google/modernstorage/media/MediaCollection.kt:1:1: File must end with a newline (\n)
    /home/farees/opensource/modernstorage/media/src/main/java/com/google/modernstorage/media/MediaCollection.kt:34:16: Missing spacing after "when"
    /home/farees/opensource/modernstorage/media/src/main/java/com/google/modernstorage/media/MediaCollection.kt:41:16: Missing spacing after "when"
    /home/farees/opensource/modernstorage/media/src/main/java/com/google/modernstorage/media/MediaCollection.kt:47:1: Needless blank line(s)
    /home/farees/opensource/modernstorage/media/src/main/java/com/google/modernstorage/media/MediaCollection.kt:59:16: Missing spacing after "when"
    /home/farees/opensource/modernstorage/media/src/main/java/com/google/modernstorage/media/MediaCollection.kt:66:16: Missing spacing after "when"
    /home/farees/opensource/modernstorage/media/src/main/java/com/google/modernstorage/media/MediaQuery.kt:1:1: File must end with a newline (\n)
    /home/farees/opensource/modernstorage/media/src/main/java/com/google/modernstorage/media/MediaResource.kt:1:1: File must end with a newline (\n)
    /home/farees/opensource/modernstorage/media/src/main/java/com/google/modernstorage/media/MediaStoreClient.kt:1:1: File must end with a newline (\n)
    /home/farees/opensource/modernstorage/media/src/main/java/com/google/modernstorage/media/MediaStoreClient.kt:19:1: Imports must be ordered in lexicographic order without any empty lines in-between
    /home/farees/opensource/modernstorage/media/src/main/java/com/google/modernstorage/media/Permission.kt:1:1: File must end with a newline (\n)
    /home/farees/opensource/modernstorage/media/src/main/java/com/google/modernstorage/media/StorageLocation.kt:1:1: File must end with a newline (\n)
    /home/farees/opensource/modernstorage/media/src/main/java/com/google/modernstorage/media/StorageLocation.kt:23:1: Missing space after //
    /home/farees/opensource/modernstorage/media/src/test/java/com/google/modernstorage/media/ExampleUnitTest.kt:1:1: File must end with a newline (\n)
    /home/farees/opensource/modernstorage/sample/src/androidTest/java/com/google/modernstorage/sample/ExampleInstrumentedTest.kt:1:1: File must end with a newline (\n)
    /home/farees/opensource/modernstorage/sample/src/main/java/com/google/modernstorage/sample/MainActivity.kt:1:1: File must end with a newline (\n)
    /home/farees/opensource/modernstorage/sample/src/main/java/com/google/modernstorage/sample/MainActivity.kt:42:1: Unexpected indentation (16) (should be 12)
    /home/farees/opensource/modernstorage/sample/src/main/java/com/google/modernstorage/sample/mediastore/MediaStoreFragment.kt:155:11: Missing spacing after "if"
    /home/farees/opensource/modernstorage/sample/src/main/java/com/google/modernstorage/sample/mediastore/MediaStoreFragment.kt:161:1: Unexpected blank line(s) before "}"
    /home/farees/opensource/modernstorage/sample/src/main/java/com/google/modernstorage/sample/mediastore/MediaStoreViewModel.kt:1:1: File must end with a newline (\n)
    /home/farees/opensource/modernstorage/sample/src/main/java/com/google/modernstorage/sample/mediastore/MediaStoreViewModel.kt:58:15: Missing spacing after "if"
    /home/farees/opensource/modernstorage/sample/src/main/java/com/google/modernstorage/sample/mediastore/SampleData.kt:1:1: File must end with a newline (\n)
    /home/farees/opensource/modernstorage/sample/src/main/java/com/google/modernstorage/sample/mediastore/SampleData.kt:21:1: Exceeded max line length (100) (cannot be auto-corrected)
    /home/farees/opensource/modernstorage/sample/src/main/java/com/google/modernstorage/sample/mediastore/SampleData.kt:22:1: Exceeded max line length (100) (cannot be auto-corrected)
    /home/farees/opensource/modernstorage/sample/src/main/java/com/google/modernstorage/sample/mediastore/SampleData.kt:23:1: Exceeded max line length (100) (cannot be auto-corrected)
    /home/farees/opensource/modernstorage/sample/src/main/java/com/google/modernstorage/sample/mediastore/SampleData.kt:24:1: Exceeded max line length (100) (cannot be auto-corrected)
    /home/farees/opensource/modernstorage/sample/src/main/java/com/google/modernstorage/sample/mediastore/SampleData.kt:28:1: Exceeded max line length (100) (cannot be auto-corrected)
    /home/farees/opensource/modernstorage/sample/src/main/java/com/google/modernstorage/sample/mediastore/SampleData.kt:29:1: Exceeded max line length (100) (cannot be auto-corrected)
    /home/farees/opensource/modernstorage/sample/src/main/java/com/google/modernstorage/sample/mediastore/SampleData.kt:30:1: Exceeded max line length (100) (cannot be auto-corrected)
    /home/farees/opensource/modernstorage/sample/src/main/java/com/google/modernstorage/sample/mediastore/SampleData.kt:31:1: Exceeded max line length (100) (cannot be auto-corrected)
    /home/farees/opensource/modernstorage/sample/src/test/java/com/google/modernstorage/sample/ExampleUnitTest.kt:1:1: File must end with a newline (\n)
    
    
    opened by FareesHussain 5
  • Introduce result type

    Introduce result type

    • [x] ~~Upgrade ModernStorage to 1.5.10~~ Keep using Kotlin 1.4.32 due to compiler bug
    • [x] Rename MediaStoreClient.kt to MediaStoreRepository.kt
    • [x] Add permission handlers to MediaStoreRepository
    • [x] Rename MediaResource to FileResource
    • [x] Add @Parcelize to FileResource
    • [x] Expand media support to audio files
    • [x] Simplify API naming
    • [x] Add file scanning feature
    • [x] Update sample app
    • [x] Add guide
    • [x] Upgrade project version
    • [x] Add docs publishing action
    opened by yrezgui 4
  • Running sample fails due to 502, remove jcenter?

    Running sample fails due to 502, remove jcenter?

    Describe the bug

    I'm trying to run the sample, but in current stable AS I get an issue

    Error resolving plugin [id: 'org.jetbrains.dokka', version: '1.4.32']
    > Could not resolve all dependencies for configuration 'detachedConfiguration2'.
       > Could not determine artifacts for org.jetbrains.dokka:org.jetbrains.dokka.gradle.plugin:1.4.32
          > Could not get resource 'https://plugins.gradle.org/m2/org/jetbrains/dokka/org.jetbrains.dokka.gradle.plugin/1.4.32/org.jetbrains.dokka.gradle.plugin-1.4.32.jar'.
             > Could not HEAD 'https://jcenter.bintray.com/org/jetbrains/dokka/org.jetbrains.dokka.gradle.plugin/1.4.32/org.jetbrains.dokka.gradle.plugin-1.4.32.jar'. Received status code 502 from server: Bad Gateway
    

    I understand we can't do anything about the 502, and it might be temporary, but maybe we can try to remove jcenter/bintray repo?

    opened by ColtonIdle 3
  • Migrating build logic from Groovy to Kotlin (KTS)

    Migrating build logic from Groovy to Kotlin (KTS)

    Migrate all .gradle (groovy files) to .gradle.kts (Kotlin DSL)

    Benefits Auto-completion and content assist Quick documentation Navigation to source Refactoring and more

    enhancement 
    opened by akhilesh0707 3
  • Adding Bazel support in the sample

    Adding Bazel support in the sample

    Adding Bazel support in the sample as an example of how to use the library for the apps that use Bazel.

    may be just a wiki or complete bazel setup. Might be blocked until the library is added to maven

    MediaStore 
    opened by FareesHussain 3
  • Typo in a repository tag

    Typo in a repository tag

    Discussed in https://github.com/google/modernstorage/discussions/45

    Originally posted by ragunathjawahar August 7, 2021 The repository has a typo in the tag storace-access-framework should this be storage-access-framework?

    opened by nic0lette 2
  • [filesystem] Make `PlatformContract` methods match `DocumentsContract`

    [filesystem] Make `PlatformContract` methods match `DocumentsContract`

    Instead of various methods which are identical, or almost identical, to the DocumentsContract, make PlatformContract define an interface which matches the Android version (with the exception of using java.net.URI rather than android.net.Uri for testing on non-Android devices)

    Interface or abstract class? Both could have default implementations that would allow defining helper methods.

    Perhaps best would be an interface for DocumentsContract and then a class that uses that interface for defining lower level helper methods that can be used by the filesystem classes without worrying about DocumentsContract at all.

    enhancement Filesystem 
    opened by nic0lette 2
  • Fix a few mistakes in permissions.md

    Fix a few mistakes in permissions.md

    Minor fixes in the permissions.md

    • Fixes getPermissions not being called from class, from what look to be a variable
    • Fixes createdBy being outside of RequestAccess.Args in Compose example
    opened by ghostbear 1
  • Add Bill of Material

    Add Bill of Material

    This adds a Bill of Material to easier add dependencies without needing to defining version for each of them. Note it doesn't include the deprecated modules or the sample app. Out over the modules ModernStorage has it also includes Okio this way any project that want to use the tested version that ModernStorage use they don't need to define the version for that.

    Usage in projects:

    implementation("com.google.modernstorage:modernstorage-bom:{{ lib_version }}")
    implementation("com.google.modernstorage:modernstorage-permissions")
    implementation("com.google.modernstorage:modernstorage-photopicker")
    implementation("com.google.modernstorage:modernstorage-storage")
    implementation("com.squareup.okio:okio")
    
    opened by ghostbear 1
  • Get storage permissions & remove old packages

    Get storage permissions & remove old packages

    • [x] Remove mediastore & filesystem modules
    • [x] Add better support for Java usage
    • [x] Add Bill of Material (thanks to @ghostbear)
    • [x] Add StoragePermissions.getPermissions method
    opened by yrezgui 1
  • Failed to resolve: com.google.modernstorage:modernstorage-permissions:1.0.0-alpha06

    Failed to resolve: com.google.modernstorage:modernstorage-permissions:1.0.0-alpha06

    Error when building app with modernstorage

    FAILURE: Build completed with 8 failures.
    
    1: Task failed with an exception.
    -----------
    * What went wrong:
    Execution failed for task ':app:dataBindingMergeDependencyArtifactsCvsDebug'.
    > Could not resolve all files for configuration ':app:cvsDebugCompileClasspath'.
       > Failed to transform modernstorage-storage-1.0.0-alpha06.aar (com.google.modernstorage:modernstorage-storage:1.0.0-alpha06) to match attributes {artifactType=android-databinding, org.gradle.category=library, org.gradle.dependency.bundling=external, org.gradle.libraryelements=aar, org.gradle.status=release, org.gradle.usage=java-api}.
          > Could not find modernstorage-storage-1.0.0-alpha06.aar (com.google.modernstorage:modernstorage-storage:1.0.0-alpha06).
            Searched in the following locations:
                https://plugins.gradle.org/m2/com/google/modernstorage/modernstorage-storage/1.0.0-alpha06/modernstorage-storage-1.0.0-alpha06.aar
    
    * Try:
    Run with --info or --debug option to get more log output. Run with --scan to get full insights.
    
    * Exception is:
    org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:dataBindingMergeDependencyArtifactsCvsDebug'.
    	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:38)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:79)
    ...
    
    

    To Reproduce

    Steps to reproduce the behavior:

    1. Add implementation("com.google.modernstorage:modernstorage-permissions:1.0.0-alpha06") implementation("com.google.modernstorage:modernstorage-storage:1.0.0-alpha06")
    2. Build app
    3. Run app
    4. See error

    Environment:

    • Android OS version: 13 beta2
    • Target SDK version 31
    • Device: Google Pixel 6
    • ModernStorage version: 1.0.0-alpha06

    Additional context

    mavenCentral() added in build.gradle

    opened by gabriel-TheCode 1
  • [Idea] AndroidX Activity added ActivityResultContracts$PickVisualMedia. modernstorage-photopicker won't be needed anymore.

    [Idea] AndroidX Activity added ActivityResultContracts$PickVisualMedia. modernstorage-photopicker won't be needed anymore.

    Version 1.6.0-alpha03

    April 27, 2022

    androidx.activity:activity:1.6.0-alpha03, androidx.activity:activity-compose:1.6.0-alpha03, and androidx.activity:activity-ktx:1.6.0-alpha03 are released.

    • Note: This version will only compile against the Android 13 Developer Beta 1 SDK.

    New Features

    • Added ActivityResultContracts.PickVisualMedia and ActivityResultContracts.PickMultipleVisualMedia for providing a backward compatible contract that uses MediaStore.ACTION_PICK_IMAGES when the Photo Picker is available and Intent.ACTION_OPEN_DOCUMENT when it is not available.
    enhancement 
    opened by VincentJoshuaET 1
  • Upgrade AGP & move all dependencies to Version Catalog

    Upgrade AGP & move all dependencies to Version Catalog

    Upgrades Gradle to 7.4 which makes Version Catalog stable 🎉

    Also, moves dependencies and plugins which weren't previous able to go into Version Catalog into it

    opened by ghostbear 0
  •  java.lang.IllegalArgumentException: MIME type

    java.lang.IllegalArgumentException: MIME type

    Hi!

    Describe the bug

    Crash app

    To Reproduce

    Steps to reproduce the behavior:

    1. Open AddMediaScreen.
    2. Click on "Add Video" or "Add Audio"
     java.lang.IllegalArgumentException: MIME type video/mp4 cannot be inserted into content://media/external/images/media; expected MIME type under image/*
            at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:172)
            at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:142)
            at android.content.ContentProviderProxy.insert(ContentProviderNative.java:549)
            at android.content.ContentResolver.insert(ContentResolver.java:2149)
            at android.content.ContentResolver.insert(ContentResolver.java:2111)
            at com.google.modernstorage.storage.AndroidFileSystem.createMediaStoreUri(AndroidFileSystem.kt:425)
            at com.google.modernstorage.sample.mediastore.MediaStoreViewModel$addMedia$1.invokeSuspend(MediaStoreViewModel.kt:76)
    

    It seems to fix the error you need to change the following: in MediaStoreViewModel change field "Collection" For video ->

    collection = MediaStore.Video.Media.getContentUri("external")
    

    For Audio ->

      collection = MediaStore.Audio.Media.getContentUri("external")
    
    opened by Normalnick12 0
  • SQLiteConstraintException in createMediaStoreUri

    SQLiteConstraintException in createMediaStoreUri

    Describe the bug

    I'm using modernstorage to save a file from the web to my Downloads folder. In certain situations, the following error occurs:

    java.util.concurrent.ExecutionException: android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: files._data (code 2067 SQLITE_CONSTRAINT_UNIQUE)
            at androidx.work.impl.utils.futures.AbstractFuture.getDoneValue(AbstractFuture.java:516)
            at androidx.work.impl.utils.futures.AbstractFuture.get(AbstractFuture.java:475)
            at androidx.work.impl.WorkerWrapper$2.run(WorkerWrapper.java:321)
            at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
            at java.lang.Thread.run(Thread.java:923)
         Caused by: android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: files._data (code 2067 SQLITE_CONSTRAINT_UNIQUE)
            at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:178)
            at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:142)
            at android.content.ContentProviderProxy.insert(ContentProviderNative.java:549)
            at android.content.ContentResolver.insert(ContentResolver.java:2149)
            at android.content.ContentResolver.insert(ContentResolver.java:2111)
            at com.google.modernstorage.storage.SharedFileSystem.createMediaStoreUri(SharedFileSystem.kt:266)
    

    To Reproduce

    As I managed to find out, this happens if you download a file in the application, then clear the application data and try to download the same file again.

    Environment:

    • Android OS version: Android 11
    • Target SDK version: API 31
    • Device: Xiaomi Mi 8 (PE)
    • ModernStorage version: v1.0.0-alpha03

    Additional context

    Some peaces of code, witch I use:

            val destPath = fileSystem.createMediaStoreUri(
                filename = depFileName,
                directory = getExternalStorageDir().absolutePath
            )?.toPath()
    
        private fun getExternalStorageDir(): File {
            return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                applicationContext.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)!!
            } else {
                @Suppress("DEPRECATION")
                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
            }
        }
    
    opened by SteinerOk 2
Releases(1.0.0-alpha06)
  • 1.0.0-alpha06(Feb 7, 2022)

    What's Changed

    • doc: correct usage of ActivityResultContract launch method by @sebastinto in https://github.com/google/modernstorage/pull/86
    • Add support for file paths by @yrezgui in https://github.com/google/modernstorage/pull/87

    New Contributors

    • @sebastinto made their first contribution in https://github.com/google/modernstorage/pull/86

    Full Changelog: https://github.com/google/modernstorage/compare/1.0.0-alpha05...1.0.0-alpha06

    Source code(tar.gz)
    Source code(zip)
    sample-debug.apk(40.09 MB)
  • 1.0.0-alpha05(Jan 21, 2022)

    What's Changed

    • Convert Groovy to Kotlin DSL by @ghostbear in https://github.com/google/modernstorage/pull/79
    • Add RequestAccess ActivityResultContract & migrate to Gradle KTS by @yrezgui in https://github.com/google/modernstorage/pull/84

    Full Changelog: https://github.com/google/modernstorage/compare/1.0.0-alpha04...1.0.0-alpha05

    Source code(tar.gz)
    Source code(zip)
    sample-debug.apk(40.16 MB)
  • 1.0.0-alpha04(Jan 19, 2022)

    What's Changed

    • Update sample to make demo compatible with API 21+ (API 29+ previously) by @yrezgui in https://github.com/google/modernstorage/pull/63
    • Fix code snippets in permissions guide by @yrezgui in https://github.com/google/modernstorage/pull/65
    • Add storage permissions usage guide by @yrezgui in https://github.com/google/modernstorage/pull/72
    • Remove gradlePluginPortal from repositories list by @yrezgui in https://github.com/google/modernstorage/pull/73
    • Add Photo Picker guide to navigation by @yrezgui in https://github.com/google/modernstorage/pull/75
    • Fix module versioning in documentation by @yrezgui in https://github.com/google/modernstorage/pull/76
    • Get storage permissions & remove old packages by @yrezgui in https://github.com/google/modernstorage/pull/77
    • Add Bill of Material by @ghostbear in https://github.com/google/modernstorage/pull/78

    Full Changelog: https://github.com/google/modernstorage/compare/1.0.0-alpha03...1.0.0-alpha04

    Source code(tar.gz)
    Source code(zip)
    sample-debug.apk(40.19 MB)
  • 1.0.0-alpha03(Jan 12, 2022)

    What's Changed

    • Migrate jcenter to mavenCentral by @utzcoz in https://github.com/google/modernstorage/pull/5
    • Rename media package to mediastore by @yrezgui in https://github.com/google/modernstorage/pull/13
    • Improve project infrastructure by @yrezgui in https://github.com/google/modernstorage/pull/20
    • Add basic github action to test build by @utzcoz in https://github.com/google/modernstorage/pull/9
    • Update README with correct maven coordinates by @saket in https://github.com/google/modernstorage/pull/22
    • Publish to Maven by @yrezgui in https://github.com/google/modernstorage/pull/21
    • Introduce result type by @yrezgui in https://github.com/google/modernstorage/pull/24
    • Add convertMediaUriToContentUri method in MediaStoreRepository by @yrezgui in https://github.com/google/modernstorage/pull/31
    • Run publish docs GitHub action when PR is merged to main by @yrezgui in https://github.com/google/modernstorage/pull/32
    • Add some .idea files to the repo by @nic0lette in https://github.com/google/modernstorage/pull/38
    • Add Filesystem package by @yrezgui in https://github.com/google/modernstorage/pull/35
    • Fix doc navigation link by @yrezgui in https://github.com/google/modernstorage/pull/40
    • Api ref links by @nic0lette in https://github.com/google/modernstorage/pull/52
    • New architecture based on Okio and separated utility libraries by @yrezgui in https://github.com/google/modernstorage/pull/59

    New Contributors

    • @utzcoz made their first contribution in https://github.com/google/modernstorage/pull/5
    • @saket made their first contribution in https://github.com/google/modernstorage/pull/22

    Full Changelog: https://github.com/google/modernstorage/commits/1.0.0-alpha03

    Source code(tar.gz)
    Source code(zip)
    sample-debug.apk(40.16 MB)
Owner
Google
Google ❤️ Open Source
Google
✔️ Secure, simple key-value storage for Android

Hawk 2.0 Secure, simple key-value storage for android Important Note This version has no backward compatibility with Hawk 1+ versions. If you still wa

Orhan Obut 3.9k Dec 20, 2022
CloudStorageUtil - An Android library to make sync on Google Cloud Storage easier

gCloud Storage Utils An Android library to make sync on Google Cloud Storage eas

Evolve Asia 0 Jul 13, 2022
KmmCaching - An application that illustrates fetching data from remote data source and caching it in local storage

An application that illustrates fetching data from remote data source and caching it in local storage for both IOS and Android platforms using Kotlin Multiplatform Mobile and SqlDelight.

Felix Kariuki 5 Oct 6, 2022
Matches incoming and/or outgoing text messages against set rules and sends them over to webhook.

Textmatic If you ever wanted a tool to simply push the SMS (or text messages) from your phone to somewhere remote, this is it. This app matches all in

Float 2 Jan 7, 2022
Wrapper around the android Camera class that simplifies its usage

EasyCamera Wrapper around the android Camera class that simplifies its usage (read more about the process) Usage: // the surface where the preview wil

Bozhidar Bozhanov 641 Dec 29, 2022
Android Utilities Library build in kotlin Provide user 100 of pre defined method to create advanced native android app.

Android Utilities Library build in kotlin Provide user 100 of pre defined method to create advanced native android app.

Shahid Iqbal 4 Nov 29, 2022
A collection of Android libraries for simplifying development

Andromeda A collection of Android libraries for simplifying development Usage Andromeda uses Jitpack for distribution, the following gradle dependency

Kyle Corry 11 Dec 6, 2022
Sample android setup for deploying libraries on maven central

Perfect-android-library-template This is how I prefer my android setup. This setup has a sample app and a deployable library that deploys to maven cen

Stefan Wärting 3 Dec 23, 2022
A collection of Android build scripts for various third-party libraries and the tooling to build them

ndkports A collection of Android build scripts for various third-party libraries and the tooling to build them. If you're an Android app developer loo

reSIProcate project 0 Jan 17, 2022
Android Shared preference wrapper than encrypts the values of Shared Preferences. It's not bullet proof security but rather a quick win for incrementally making your android app more secure.

Secure-preferences - Deprecated Please use EncryptedSharedPreferences from androidx.security in preferenced to secure-preference. (There are no active

Scott Alexander-Bown 1.5k Dec 24, 2022
Android library which makes it easy to handle the different obstacles while calling an API (Web Service) in Android App.

API Calling Flow API Calling Flow is a Android library which can help you to simplify handling different conditions while calling an API (Web Service)

Rohit Surwase 19 Nov 9, 2021
Gesture detector framework for multitouch handling on Android, based on Android's ScaleGestureDetector

Android Gesture Detectors Framework Introduction Since I was amazed Android has a ScaleGestureDetector since API level 8 but (still) no such thing as

null 1.1k Nov 30, 2022
Use Android as Rubber Ducky against another Android device

Use Android as Rubber Ducky against another Android device

null 1.4k Jan 9, 2023
A util for setting status bar style on Android App.

StatusBarUtil A util for setting status bar style on Android App. It can work above API 19(KitKat 4.4). 中文版点我 Sample Download StatusBarUtil-Demo Chang

Jaeger 8.8k Jan 6, 2023
A logger with a small, extensible API which provides utility on top of Android's normal Log class.

This is a logger with a small, extensible API which provides utility on top of Android's normal Log class. I copy this class into all the little apps

Jake Wharton 9.8k Dec 30, 2022
Java implementation of a Disk-based LRU cache which specifically targets Android compatibility.

Disk LRU Cache A cache that uses a bounded amount of space on a filesystem. Each cache entry has a string key and a fixed number of values. Each key m

Jake Wharton 5.7k Dec 31, 2022
a simple cache for android and java

ASimpleCache ASimpleCache 是一个为android制定的 轻量级的 开源缓存框架。轻量到只有一个java文件(由十几个类精简而来)。 1、它可以缓存什么东西? 普通的字符串、JsonObject、JsonArray、Bitmap、Drawable、序列化的java对象,和 b

Michael Yang 3.7k Dec 14, 2022
gRPC and protocol buffers for Android, Kotlin, and Java.

Wire “A man got to have a code!” - Omar Little See the project website for documentation and APIs. As our teams and programs grow, the variety and vol

Square 3.9k Dec 31, 2022
A robust native library loader for Android.

ReLinker A robust native library loader for Android. More information can be found in our blog post Min SDK: 9 JavaDoc Overview The Android PackageMan

Keepsafe 2.9k Dec 27, 2022