Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 964269d4 authored by Nihar Thakkar's avatar Nihar Thakkar
Browse files

Create carousel to display images on the home screen

parent 03d85c4d
Loading
Loading
Loading
Loading
+72 −2
Original line number Diff line number Diff line
package io.eelo.appinstaller.home

import android.arch.lifecycle.Observer
import android.arch.lifecycle.ViewModelProviders
import android.content.Context
import android.graphics.Bitmap
import android.os.Bundle
import android.os.Handler
import android.support.v4.app.Fragment
import android.support.v4.view.ViewPager
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import io.eelo.appinstaller.R
import io.eelo.appinstaller.home.viewmodel.HomeViewModel
import android.widget.Scroller

class HomeFragment : Fragment() {

    private lateinit var homeViewModel: HomeViewModel
    private lateinit var imageCarousel: ViewPager
    private var imagesList = ArrayList<Bitmap>()

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_home, container, false)
        val view = inflater.inflate(R.layout.fragment_home, container, false)

        homeViewModel = ViewModelProviders.of(activity!!).get(HomeViewModel::class.java)
        imageCarousel = view.findViewById(R.id.image_carousel)
        imageCarousel.visibility = View.GONE
        val imageCarouselAdapter = ImageCarouselAdapter(context!!, imagesList)

        // Initialise the image carousel
        val scroller = ViewPager::class.java.getDeclaredField("mScroller")
        scroller.isAccessible = true
        val imageCarouselScroller = ImageCarouselScroller(context!!)
        scroller.set(imageCarousel, imageCarouselScroller)
        imageCarousel.adapter = imageCarouselAdapter

        homeViewModel.loadCarouselImages()

        // Bind to the list of images for the carousel
        homeViewModel.getCarouselImages().observe(this, Observer {
            imagesList.clear()
            imagesList.addAll(homeViewModel.getCarouselImages().value!!)
            imageCarouselAdapter.notifyDataSetChanged()
            imageCarousel.visibility = View.VISIBLE
            imageCarousel.setCurrentItem(0, false)
            ImageCarouselTimer(((imageCarouselAdapter.count - 1) * 4000).toLong(), 4000).start()
        })

        return view
    }

    private inner class ImageCarouselTimer(private var millisInFuture: Long, private val countDownInterval: Long) {
        fun start() {
            val handler = Handler()
            val counter = object : Runnable {
                override fun run() {
                    if (millisInFuture <= 0) {
                        imageCarousel.setCurrentItem(0, true)
                    } else {
                        imageCarousel.setCurrentItem(imageCarousel.currentItem + 1, true)
                        millisInFuture -= countDownInterval
                        handler.postDelayed(this, countDownInterval)
                    }
                }
            }
            handler.postDelayed(counter, countDownInterval)
        }
    }

    // Custom scroller to reduce scrolling animation speed of view pager
    private inner class ImageCarouselScroller(context: Context) : Scroller(context) {

        private val mDuration = 2000

        override fun startScroll(startX: Int, startY: Int, dx: Int, dy: Int, duration: Int) {
            super.startScroll(startX, startY, dx, dy, mDuration)
        }

        override fun startScroll(startX: Int, startY: Int, dx: Int, dy: Int) {
            super.startScroll(startX, startY, dx, dy, mDuration)
        }
    }
}
+39 −0
Original line number Diff line number Diff line
package io.eelo.appinstaller.home

import android.content.Context
import android.graphics.Bitmap
import android.support.v4.view.PagerAdapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.LinearLayout
import io.eelo.appinstaller.R

class ImageCarouselAdapter(context: Context, private val images: ArrayList<Bitmap>) : PagerAdapter() {

    private val layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater

    override fun isViewFromObject(view: View, `object`: Any): Boolean {
        return view == `object` as LinearLayout
    }

    override fun getCount(): Int {
        return images.size
    }

    override fun instantiateItem(container: ViewGroup, position: Int): Any {
        val itemView = layoutInflater.inflate(R.layout.image_carousel_item, container, false)

        val imageView = itemView.findViewById(R.id.image) as ImageView
        imageView.setImageBitmap(images[position])

        container.addView(itemView)

        return itemView
    }

    override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
        container.removeView(`object` as LinearLayout)
    }
}
+15 −1
Original line number Diff line number Diff line
package io.eelo.appinstaller.home.model

import android.arch.lifecycle.MutableLiveData
import android.graphics.Bitmap

class HomeModel : HomeModelInterface {
    val imagesList = MutableLiveData<ArrayList<Bitmap>>()

    init {
        if (imagesList.value == null) {
            imagesList.value = ArrayList()
        }
    }

    override fun loadCarouselImages() {
        // TODO Load carousel images
    }
}
+2 −1
Original line number Diff line number Diff line
package io.eelo.appinstaller.home.model

interface HomeModelInterface {
    fun loadCarouselImages()
}
+0 −4
Original line number Diff line number Diff line
package io.eelo.appinstaller.home.viewModel

class HomeViewModel : HomeViewModelInterface {
}
 No newline at end of file
Loading