• Breaking News

    Wednesday, August 12, 2020

    Android Dev - Gallerit, a sample Reddit gallery

    Android Dev - Gallerit, a sample Reddit gallery


    Gallerit, a sample Reddit gallery

    Posted: 12 Aug 2020 02:23 AM PDT

    Gallerit, a sample Reddit gallery

    https://preview.redd.it/zmtij01whjg51.png?width=2560&format=png&auto=webp&s=8083011caaf4c3822ccbab2e3be568caea18b240

    Hi guys , I created a small Android application to search images on Reddit. Just search for a subreddit and the top images will be shown (they can also be saved). The goal of the project is to demonstrate best practices using modern Android development tools.

    Project characteristics:

    • 100% Kotlin
    • MVVM
    • Repository Pattern
    • A single activity architecture (Navigation component)
    • Android Jetpack
    • Coroutines & Flow
    • Reactive UI
    • Testing
    • Dependency Injection (Koin)
    • Gradle Kotlin DSL
    • Material Design

    Hope it can be of help or inspiration for someone!

    Gallerit: https://github.com/auron567/Gallerit

    submitted by /u/auron567
    [link] [comments]

    I challenge you to recreate this animation (Android Native).

    Posted: 12 Aug 2020 08:55 AM PDT

    Assets or Resource Raw folder of Android?

    Posted: 12 Aug 2020 04:06 AM PDT

    (Self-Taught) Android Devs of Reddit: Show your portfolio

    Posted: 11 Aug 2020 05:37 PM PDT

    Hello there! (General Kenobi!)

    As a self-taught, future super awesome Android developer :D I am really curious about your portfolios and especially those of self-taught and more especially that got you the job :)

    Show off what you got and feel free to add some comments :)

    submitted by /u/hunnihundert
    [link] [comments]

    How do you deal with Multiple Themes?

    Posted: 12 Aug 2020 04:28 AM PDT

    Hi,

    I was wondering how other developers deal with having multiple themes in their apps, now that
    Material Components and DayNight are widely used?

    It's easy when you have a light and a dark version, since you can handle everything with minimal code through AppCompatDelegate. But let's say you want light, dark and AMOLED. Or a couple of variations for each. What is the best approach?

    This is how I did:

    - I have my main theme: MyStyle, inheriting from DayNight, representing light and dark.

    - I have another one: MyStyle_amoled, inheriting from MyStyle, with attributes override only in the dark version to make it AMOLED.

    This way it follows the system toggle when changing from light to dark, and in the settings, the user can choose the type of dark mode to get, Default or AMOLED.

    This is ugly IMO, since you still have to make a base activity class overriding OnCreate() and OnResume() and use setTheme() accordingly. And your user clicking the back button will see the theme changing for a split second as it recreate().

    Is there a better way?

    It would be nice to manage themes through qualifiers having: -light, -night, -amoled, -version3... folders in your res/ and then just bind the qualifier you choose to the system setting.

    submitted by /u/Kirk-Bushman
    [link] [comments]

    Records and Pattern Matching for Instanceof Finalized in JDK 16

    Posted: 12 Aug 2020 03:08 AM PDT

    Unit Tests — Argument Captor with Mockito

    Posted: 12 Aug 2020 10:28 AM PDT

    Is there's no way to have testers test the APK (internal testing, internal app sharing, etc) until your app is published/approved by Google?

    Posted: 12 Aug 2020 06:39 AM PDT

    This is my first time submitting an app to the Google Play app store. I filled out everything, green checkmarks everywhere, added testers etc. Using the "new Google Play Console" it seemed to indicate that the app was ready for internal testing. I was able to use the "Copy link" to get a link to send to my testers.. including myself. I can click on that link, but then the link to the APK leads to a 404. I tried to enable the 'internal app sharing', added myself as a valid uploader.. but am getting the "you don't have permission to upload for this bundle id" error. After doing more reading, it seems like none of these testing channels are available until the app is "published". The new console is super ambiguous about this, the old console does say it's "pending publication".

    So do I understand correctly that I can't use internal testing or internal app sharing until the app is "published" ?

    I want to do weeks if not months of testing before I make it available to the public, just didn't expect it would take days (or weeks) before I can even begin this testing

    submitted by /u/spar_x
    [link] [comments]

    Turning a Camera Feed into a Solved Sudoku

    Posted: 12 Aug 2020 06:15 AM PDT

    Documentation bug being closed as obsolete

    Posted: 12 Aug 2020 10:39 AM PDT

    Here's a bug that was marked as obsolete even though the issue is in the documentation and still occurs. If anyone from google is listening... we need a better way to report issues in docs.

    https://issuetracker.google.com/issues/143630828

    submitted by /u/leggo_tech
    [link] [comments]

    Why is getBlob() retrieving Integer data from my Blob column in my database?

    Posted: 12 Aug 2020 09:41 AM PDT

    I am trying to display the data from my SQLite database to the recycler views. The data I am trying to display is an image & text. For the images in my database, I converted the image resources into bitmaps then into bytes & stored the bytes in my Blob column. However, when I am trying to retrieve the bytes from the column using the getBlob()I receive an exception.

    The exception is android.database.sqlite.SQLiteException: unknown error (code 0 SQLITE_OK): INTEGER data in nativeGetBlob. I know that this exception is occurring because the getBlob()retrieves Integer data from my Blob column. But I don't understand I put bytes into my Blob column, so why is getBlob()retrieving Integer data?

    I have tried using the getInt()but that doesn't work because my adapter uses BitmapFactory.decodeByteArray()which expects a byte parameter to convert the bytes from my column into a bitmap.

    SQLite database:

    package com.myapps.myapplication; import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.util.Log; import java.util.ArrayList; import java.io.ByteArrayOutputStream; public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DB_NAME = "starbuzz"; private static final int DB_VERSION = 6; private Context context; private ArrayList <Bitmap> bitmapArray; private byte [] byteArray; public MyDatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); this.context = context; } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE GROCERY_ITEMS (" + "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + "NAME TEXT, " + "IMAGE_RESOURCE_ID BLOB);"); upgradeDatabase(db); } public void upgradeDatabase (SQLiteDatabase db) { convertToBitmap(); byteArray = convertToByte(); addItems(db); } public void convertToBitmap () { Bitmap faan = BitmapFactory.decodeResource(context.getResources(), R.drawable.faan); Bitmap milk = BitmapFactory.decodeResource (context.getResources(), R.drawable.milk); Bitmap egg = BitmapFactory.decodeResource (context.getResources(), R.drawable.egg); Bitmap toilet_tissue = BitmapFactory.decodeResource (context.getResources(), R.drawable.toilet_tissue); Bitmap kitchen_tissue = BitmapFactory.decodeResource (context.getResources(), R.drawable.kitchen_tissue); Bitmap bread = BitmapFactory.decodeResource (context.getResources(), R.drawable.bread); Bitmap potatoe = BitmapFactory.decodeResource (context.getResources(), R.drawable.potatoe); Bitmap onion = BitmapFactory.decodeResource (context.getResources(), R.drawable.onion); Bitmap flour = BitmapFactory.decodeResource (context.getResources(), R.drawable.flour); Bitmap tomatoe = BitmapFactory.decodeResource (context.getResources(), R.drawable.tomatoe); Bitmap corriandor = BitmapFactory.decodeResource (context.getResources(), R.drawable.corriandor); bitmapArray = new ArrayList <Bitmap> (); bitmapArray.add(faan); bitmapArray.add (milk); bitmapArray.add (egg); bitmapArray.add (toilet_tissue); bitmapArray.add (kitchen_tissue); bitmapArray.add (bread); bitmapArray.add (potatoe); bitmapArray.add (onion); bitmapArray.add (flour); bitmapArray.add (tomatoe); bitmapArray.add (corriandor); } public byte [] convertToByte () { ByteArrayOutputStream stream = new ByteArrayOutputStream (); for (Bitmap bitmap : bitmapArray) { bitmap.compress (Bitmap.CompressFormat.PNG, 0, stream); } return stream.toByteArray(); } public static Bitmap getImages (byte [] image) { return BitmapFactory.decodeByteArray(image, 0, image.length); } public void addItems (SQLiteDatabase db) { byte faan = byteArray [0]; byte milk = byteArray [1]; byte egg = byteArray [2]; byte toilet_tissue = byteArray [3]; byte kitchen_tissue = byteArray [4]; byte bread = byteArray [5]; byte potatoe = byteArray [6]; byte onion = byteArray [7]; byte flour = byteArray [8]; byte tomatoe = byteArray [9]; byte corriandor = byteArray [10]; insertItems (db, "Faan", faan); insertItems (db, "Milk", milk); insertItems (db, "Egg", egg); insertItems (db, "Toilet Tissue", toilet_tissue); insertItems (db, "Kitchen Tissue", kitchen_tissue); insertItems (db, "Bread", bread); insertItems (db, "Potatoe", potatoe); insertItems (db, "Onion", onion); insertItems (db, "Flour", flour); insertItems (db, "Tomatoe", tomatoe); insertItems (db, "Corriandor", corriandor); } public void insertItems (SQLiteDatabase db, String name, byte image) { ContentValues contentValues = new ContentValues(); contentValues.put ("NAME", name); contentValues.put ("IMAGE_RESOURCE_ID", image); db.insert ("GROCERY_ITEMS", null, contentValues); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("CREATE TABLE GROCERY_ITEMS (" + "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + "NAME TEXT, " + "IMAGE_RESOURCE_ID BLOB);"); upgradeDatabase(db); } } 

    Recycler View class:

    package com.myapps.myapplication; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; public class grocery_item extends AppCompatActivity { SQLiteDatabase db; Cursor cursor; protected void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.item_grocery); accessDataBase(); RecyclerView groceryRecycler = (RecyclerView) findViewById(R.id.grocery_recycler_view); captionedImagesAdapter adapter = new captionedImagesAdapter (this, cursor); GridLayoutManager layoutManager = new GridLayoutManager(this, 2, GridLayoutManager.VERTICAL, false); groceryRecycler.setLayoutManager(layoutManager); groceryRecycler.setAdapter (adapter); } public void accessDataBase () { MyDatabaseHelper databaseHelper = new MyDatabaseHelper(this); try { db = databaseHelper.getReadableDatabase(); cursor = db.query ("GROCERY_ITEMS", new String[] {"NAME", "IMAGE_RESOURCE_ID"}, null, null, null, null, null); } catch (SQLiteException e) { e.printStackTrace(); } } } 

    Recycler view adapter:

    package com.myapps.myapplication; import android.content.Context; import android.database.Cursor; import android.graphics.Bitmap; import android.util.Log; import android.view.LayoutInflater; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.recyclerview.widget.RecyclerView; import androidx.cardview.widget.CardView; public class captionedImagesAdapter extends RecyclerView.Adapter <captionedImagesAdapter.ViewHolder> { private Context context; private Cursor cursor; public captionedImagesAdapter (Context context, Cursor cursor) { this.context = context; this.cursor = cursor; } public captionedImagesAdapter.ViewHolder onCreateViewHolder (ViewGroup parent, int viewType) { LayoutInflater inflater = LayoutInflater.from(context); CardView cv = (CardView) inflater.inflate(R.layout.card_view, parent, false); return new ViewHolder (cv); } public void onBindViewHolder(ViewHolder holder, int position) { if (!cursor.moveToPosition(position)) { return; } String info_text = cursor.getString (0); byte [] info_image = cursor.getBlob(1); Bitmap bitmap = MyDatabaseHelper.getImages(info_image); holder.textView.setText(info_text); holder.imageView.setImageBitmap(bitmap); } public int getItemCount() { return cursor.getCount(); } public static class ViewHolder extends RecyclerView.ViewHolder { private ImageView imageView; private TextView textView; public ViewHolder(CardView view) { super(view); imageView = view.findViewById(R.id.info_image); textView = view.findViewById(R.id.info_text); } } } 

    Exception:

    android.database.sqlite.SQLiteException: unknown error (code 0 SQLITE_OK): INTEGER data in nativeGetBlob at android.database.CursorWindow.nativeGetBlob(Native Method) at android.database.CursorWindow.getBlob(CursorWindow.java:434) at android.database.AbstractWindowedCursor.getBlob(AbstractWindowedCursor.java:47) at com.myapps.myapplication.captionedImagesAdapter.onBindViewHolder(captionedImagesAdapter.java:43) at com.myapps.myapplication.captionedImagesAdapter.onBindViewHolder(captionedImagesAdapter.java:14) at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7178) at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7258) at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6125) at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6391) at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6231) at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6227) at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2330) at androidx.recyclerview.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:572) at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1591) at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:668) at androidx.recyclerview.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:170) at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4230) at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3941) at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4499) at android.view.View.layout(View.java:22085) at android.view.ViewGroup.layout(ViewGroup.java:6290) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at android.view.View.layout(View.java:22085) at android.view.ViewGroup.layout(ViewGroup.java:6290) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673) at android.widget.LinearLayout.onLayout(LinearLayout.java:1582) at android.view.View.layout(View.java:22085) at android.view.ViewGroup.layout(ViewGroup.java:6290) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at android.view.View.layout(View.java:22085) at android.view.ViewGroup.layout(ViewGroup.java:6290) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673) at android.widget.LinearLayout.onLayout(LinearLayout.java:1582) at android.view.View.layout(View.java:22085) at android.view.ViewGroup.layout(ViewGroup.java:6290) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332) at android.widget.FrameLayout.onLayout(FrameLayout.java:270) at com.android.internal.policy.DecorView.onLayout(DecorView.java:786) at android.view.View.layout(View.java:22085) at android.view.ViewGroup.layout(ViewGroup.java:6290) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:3333) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2810) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1930) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7988) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1154) at android.view.Choreographer.doCallbacks(Choreographer.java:977) at android.view.Choreographer.doFrame(Choreographer.java:893) at android.view.Choreographer$FrameHandler.handleMessage(Choreographer.java:1082) 2020-08-12 13:34:17.755 14399-14399/com.myapps.myapplication E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7682) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950) 
    submitted by /u/moezahidhabib
    [link] [comments]

    Android Studio AVD Emulator in AMD Ryzentosh

    Posted: 12 Aug 2020 08:37 AM PDT

    Hi everyone, I have just set up my new Ryzentosh just for mobile developing purposes and everything is working fine even the iOS Simulator.

    I am trying to set the Android Virtual Device (AVD) Manager from Android Studio up but I am getting the following error:

    "Your CPU does not support required features (VT-x or SVM)."

    I have AMD's Virtualization technology turned on in BIOS and it works fine on Windows, but not on macOS Catalina. I am on the latest OS version.

    Any advices? Thank you.

    submitted by /u/JotaZ_HG
    [link] [comments]

    IDEA: A app that has a button you can click once every 24h.

    Posted: 12 Aug 2020 08:24 AM PDT

    The name would be something like "Streaks" (idea from snapchats streaks)

    It would have a button that you can click ONCE every 24 hours, if you don't click the button in the 24 hour period your "score" resets and you need to start from the beginning.

    It would have a leaderboard where you can see who holds the biggest "streak".
    There could also be milestones like 7 day, a month etc "streak".

    Might be a stupid idea idk :D

    submitted by /u/sataprosenttia
    [link] [comments]

    Hello guys! I have a Question related to AlarmManager and Notifications.

    Posted: 12 Aug 2020 02:13 AM PDT

    I am working on an app that will send notifications to the user at a specific point in time defined by the user. So it will remind a user with 15 minutes before an event is happening. I've tried using AlarmManager and a BroadcastReceiver to send the notification, but it doesn't work when the app is closed. Do you have any idea or recommendation on what I should check?

    submitted by /u/Musafirul
    [link] [comments]

    Clan Architecture for Android (Once and for all)

    Posted: 12 Aug 2020 07:15 AM PDT

    Clan Architecture for Android (Once and for all)

    I've been doing an extensive research on Clean Architecture for Android, but every "author" has a different aproach to it. I think the biggest difference I've noticed is the number of layers they use, some of them use 3 layers (Presentation, Domain, Data), some use 5 layers, kind of, basically they use the previous 3 layers but they divide the presentation layer in "Presentation" and "Framework" also they divide the data layer in "Data" and "UseCases".

    Some authors place the Repository (in my case RepositoryMovies) inside the Data layer some others place RepositoryMovies inside the Domain layer, as you can see, is a little bit confusing, that's why today I ask you to try to unify this mess, or at least point begginers in the right direction.

    Let's say that in this case more abstraction is better, so we're going to use this one:

    https://preview.redd.it/qylwuxy2ykg51.png?width=250&format=png&auto=webp&s=f60277a64faaeaf2167fc0033c52849d0ead93f4

    I'm gonna give you a lot of classes or tools commonly used on Android projects and you should place them under the layer you think they belong to, keep in mind that you can elaborate whenever you feel like it, for example, you could divide RepositoryMovies into RepositoryMoviesInterface and RepositoryMoviesImplementation and place each one on a different layer. So here we go:

    - Movie (POJO)

    - RepositoryMovies

    - Dagger/Hilt (Components, Modules) *again, elaborate if you want to

    - Picasso/Glide

    - ViewModels

    - DatabaseMovies (Room)

    - DaoMovies (Room)

    - GSON/Moshi

    - Fragment

    - Activity

    - LiveData

    - Retrofit

    - UseCases

    - Extension Functions (Kotlin)

    - Coroutines (Kotlin)

    - Adapters (RecyclerView)

    - ViewHolders (RecyclerView)

    - BindingAdapters (Databinding)

    - Services

    - BroadcastReceivers

    Those are some of them, you can add what you thinks is going to make developer's life easier.

    submitted by /u/avilaxd
    [link] [comments]

    Why you should embrace Dependency Injection

    Posted: 11 Aug 2020 10:30 AM PDT

    A lightweight and beautiful tasks and calendar app for students.

    Posted: 11 Aug 2020 09:04 PM PDT

    As a college student, I keep forgetting my tasks and my incoming events in our university. That's why I've built Fokus. Fokus is a simple, lightweight tasks and calendar app tailored specifically for students.

    Code in GitHub

    submitted by /u/isaiahcollins02
    [link] [comments]

    Is there a list of how many major updates manufacturers release?

    Posted: 12 Aug 2020 02:57 AM PDT

    I know some manufacturers like Samsung only provide 2 years update to the phones they sell. After that you see no more major updates for this phone, only security fix if you are "lucky".

    What about the other manufacturers? Do they do the same? Is there a list available somewhere?

    submitted by /u/CrisalDroid
    [link] [comments]

    What CPC and eCPM does Admob have for USA?

    Posted: 12 Aug 2020 12:28 AM PDT

    I removed Admob an year ago because they suddenly started giving me very bad CPC ($0.05-0.1) for USA.

    I use FAN and here's what I get for USA users (Android only):

    • Interstitials

    CPC = $0.54

    eCPM = $9.12

    • Banner

    CPC = $0.27

    eCPM = $0.49

    I was wondering what Admob provides to see if FAN is paying good?

    submitted by /u/AwkwardShake
    [link] [comments]

    Going from Android native -> Unity. How's the learning curve?

    Posted: 12 Aug 2020 06:15 AM PDT

    Hey everyone, I'm what most companies would refer as Senior Android developer. I now use mostly Kotlin but I know Java and python quite well.

    I'd like to invest in Unity. I'd like to hear about Android devs who took the plunge as well. How long did it take you to "master" unity, what are the pitfalls, or the things that surprised you with your native background? Any good resources to learn Unity specifically for devs like us?

    Thank you!

    submitted by /u/BadPaddingException
    [link] [comments]

    Android Image Loaders: Picasso vs Glide vs Fresco

    Posted: 12 Aug 2020 05:32 AM PDT

    What should I do/need to know before developing and publishing an Android App?

    Posted: 12 Aug 2020 05:32 AM PDT

    Hello guys

    I apologize if this violates rule 2 I was told to post here.

    I want to begin making an Android app and already learn some basics android courses and Java beforehand but I heard there are some things I need to do.

    - I heard that you shouldn't use your personal email to the App or for publishing and instead use a developers account. Do developers account simply mean another email for strictly for business reasons or are still more to it. Similar to address. I don't have a unique mailing address, do I just stick to home address?

    - Does it matter what I put in the package name? I hear you put your company but I don't own a business just simply trying to make an app at home. What should I do there?

    Please tell me if there is anything else I need to know regarding the process

    submitted by /u/mrcipher0
    [link] [comments]

    App disappeared from Google Play Store

    Posted: 11 Aug 2020 08:33 PM PDT

    Hello,

    Our app disappeared from Google Play Store (that was the URL where it could be found - https://play.google.com/store/apps/details?id=com.villing.entegracoach) There is no information whatsoever of what and why that happened. I checked the Google Play Console, and there is no historical data or anything. It's like that app has never been there.

    I contacted Google, but there is no response for more than 2 weeks now.

    Any help and insights are appreciated.

    submitted by /u/dimoman
    [link] [comments]

    Google Android phone to assist with earthquake alerts and searches including Samsung and iPhone

    Posted: 12 Aug 2020 07:14 AM PDT

    What do most android devs trust for their backends nowadays?

    Posted: 11 Aug 2020 09:21 PM PDT

    Firebase and Parse seem to be good options, but I'm not an expert.

    submitted by /u/ZigZag8893
    [link] [comments]

    No comments:

    Post a Comment