0

I am using this approach to fetch data from Firebase and everything working fine, except first time when user install the app it didn't get data, but when app is reopened than everything works fine. The problem I found out is its not calling addListenerForSingleValueEvent 1st time.

Please help me on this it should also fetch data when user install the app for very first time.

 private fun fetchData(onComplete: ((Boolean) -> Unit)?=null) {
        val database = FirebaseDatabase.getInstance().reference
        var ref: DatabaseReference? = null
        if (context?.packageName?.contains(".dev") == false) {

            ref = database.child("sticker_packs")
        } else {
            ref = database.child("sticker_packs_devs")

            Timber.d("it debug mode")
        }
        val phoneQuery = ref.orderByChild("identifier")
        val firebaseList = ArrayList<StickerPack>()
        phoneQuery.addListenerForSingleValueEvent(object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {
                for (singleSnapshot in dataSnapshot.children) {
                    Timber.e(TAG, "onDataChange: ${singleSnapshot.child("stickers").value}")
                    val stickerPacks: StickerPack? = singleSnapshot.getValue<StickerPack>()

                    stickerspack = stickerPacks
                    stickers = stickerPacks
                    val unzipLocation = "${path}/${stickerPacks?.pack_id}"

                    if (stickerPacks != null) {
                        Timber.d("zipfilepath ${stickerPacks.zip_file}")
                    }
                    val tryIconPath = "$unzipLocation/try"
                    val trypath = File(tryIconPath)
                    val trayFile = trypath.listFiles()
                    var tryiconImage = ""
                    trayFile?.forEach {
                        if (it.name.contains(".png")) {
                            tryiconImage = it.name
                        }
                        Timber.d("try icon g $tryiconImage")
                    }
                    stickerPacks?.tray_image_file = tryiconImage
                    val pkg = "${Package_Head}${PACKAGE_NAME}"
                    stickerPacks?.publisherEmail = getString(R.string.feedback_email)
                    stickerPacks?.publisherWebsite = getString(R.string.privacy_policy_link)
                    stickerPacks?.privacyPolicyWebsite = getString(R.string.privacy_policy_link)
                    stickerPacks?.licenseAgreementWebsite =
                        getString(R.string.privacy_policy_link_1)
                    stickerPacks?.isWhitelisted = true
                    stickerPacks?.android_play_store_link = pkg
                    if (stickerPacks != null) {
                        firebaseList.add(stickerPacks)
                    }
                }
                Timber.e(TAG, "onDataChangecache: ${firebaseList.size}")
                Timber.e(TAG, "arraylist1: ${firebaseList.size}")
//                val getListFromMainActivity=listDataBase
                val getListFromMainActivity = Hawk.get("listfromactivity", ArrayList<StickerPack>())
                Timber.d("CheckIfNull ${getListFromMainActivity.size}")
                if (getListFromMainActivity.isNullOrEmpty() && getListFromMainActivity.size <= 0) {
                    onComplete?.invoke(false)
                }else{
                    onComplete?.invoke(true)
                    context?.let {
                        adapter?.setData(
                            it, getListFromMainActivity, requireActivity(), this@StickersFragment
                        )
                    }
                }
                Hawk.put("sticker_packs", firebaseList)
                view?.linlaHeaderProgress?.visibility = View.GONE
                if (view?.linlaHeaderProgress?.visibility == View.GONE) {
                    //spinnerDialog()
                }
                Timber.e(TAG, "onDataChe0:$dataSnapshot ")
            }

            override fun onCancelled(databaseError: DatabaseError) {
                Timber.e(TAG, "onCancelled", databaseError.toException())
            }
        })
    }

class StickerPack : Parcelable {
    var pack_id: String=""
    var pack_Name: String=""
    var publisher: String=""
    var tray_image_file: String=""
    var publisherEmail: String="" //exclude
    var publisherWebsite: String="" //exclude
    var privacyPolicyWebsite: String="" //exclude
    var licenseAgreementWebsite: String="" //exclude
    var iosAppStoreLink: String="" //exclude
    private var stickers: List<Sticker>? = null
    var totalSize: Long = 0
        private set
    var android_play_store_link: String=""
    var isWhitelisted = false //exclude
    var animated_sticker_pack:Boolean= false
    var zip_file: String?=null

}
Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807

1 Answers1

0

My guess is that you have disk caching enable, in which case you shouldn't use addListenerForSingleValueEvent. Instead use the newer get() method and the latest SDK version and do:

phoneQuery.get().addOnSuccessListener {
    Log.i("firebase", "Got value ${it.value}")

    for (singleSnapshot in it.value.children) {
        Timber.e(TAG, "onDataChange: ${singleSnapshot.child("stickers").value}")
        ...
    }
}.addOnFailureListener{
    Log.e("firebase", "Error getting data", it)
}

Also see:

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
  • thanks for the answer but problem was something else, It took a long to figured it out what causing the mess and finally I got what I was looking for. – user19499909 Oct 26 '22 at 11:02