At the time of making this app, I was doing two things: first, studying the Computer Programming Analyst program at Georgian College; and second, writing articles for the Igromania video game magazine portal. One of the courses required us to make an actual project for an actual client. Adding these two things to the student developer group that we assembled in college, boom, SSU Digital developed the Igromania Android App, a solid MVP of it at least, in the span of 3 or 4 months.

I was assigned the role of Scrum Master in the team—the guy who talks the most during SCRUM meetings, overlooks the task tracker, and makes sure that everyone gets a task to work on and the client is satisfied with the progress.

Semantic Navigation

The other half of my responsibilities in the project was coding. Obviously, I’m a programmer after all. The Igromania Android App was developed using Android Studio as the main IDE and written in Kotlin. We had a server that scraped the Igromania website for article data, prepared that into data that we could parse in the application, and pushed that data into Firebase. The application would then build up the feed of articles and the article itself, one text component by another. Personally, I worked the most on feed generation and article generation. And some meta Android stuff here and there, as well as Google Play set-up and configuration.

Language and notifications settings

At the end of the course, the application featured an article feed, article generation, commenting, user favorite article collections, personal account registration, offline cache support, and visuals done with Material Design guidelines. Well, that’s the closest that we could achieve with our student minds.

In case you are interested, here is some code from our GitHub that handled the article generation:

fun constructArticle(feed: FavouriteFeed, data: DocumentSnapshot) {

        var content: Map<String, ArrayList<String>> = mutableMapOf();
        try {
            content = data.get("content") as Map<String, ArrayList<String>>
            Log.d("CONTENTLOG", "" + (data.getString("headMedia")))
            setHead(
                data.getString("title")!!,
                "",
                data.getString("author")!!,
                data.getString("headMedia")!!
            )
        } catch (e: Exception) {
            transferToWebView();
        }

        var counter = 0;
        try {
            while (content.get(counter.toString()) != null) {

                var field = content.get(counter.toString()) as ArrayList<String>

                    when (field.get(0)) {
                        "p" -> createParagraph(field.get(1))
                        "h2" -> createH2(field.get(1))
                        "youtube" -> createYouTube(
                            field.get(2),
                            field.get(1)
                        ) //TODO: Set proper description, will ya?
                        "img" -> {
                            var imgURLArray: ArrayList<String> = arrayListOf()

                            for (i in 2 until field.size) {
                                imgURLArray.add(field.get(i))

                            }
                            //TODO("IMAGES ARE NOT IMPLEMENTED YET!")
                            Log.d("LOGIMG", imgURLArray.toString())
                            createImages(imgURLArray, field.get(1))
                        }
                        "h3" -> createH3(field.get(1))
                        "endDiv" -> createEndDivider()
                        "grayblock" -> createGreybox(field.get(1))
                        "opinion" -> {
                            //var pArray: ArrayList<String> = arrayListOf()

                            createOpinion(field.get(1), field.get(2))
                        }
                        "interview" -> {
                            createInterview(field.get(1), field.get(2), field.get(3))
                        }
                        "endDiv" -> {
                            createEndDivider();
                        }
                    }
                    Log.d("CONSTRUCTARTICLE", "" + data.get(counter.toString()))
                    counter++;
                }
            } catch (e: Exception){
            Log.e("ERROR_BUILDER", e.message)
            transferToWebView();
        }

    }

    fun setHead(title: String, desc: String, author: String, imgURL: String) {
        tv_title.setText(title)
        tv_description.setText(desc)
        tv_author.setText(author)
        Picasso.get().load(imgURL).into(iv_CV)
    }

    fun createParagraph(text: String?) {
        var tv = TextView(this)
        val view = LayoutInflater.from(this@ArticleView)
            .inflate(R.layout.article_paragraph, layout_content, false)

        if (!text.isNullOrEmpty()) {
            view.findViewById<TextView>(R.id.part_tv_paragraph).text = Html.fromHtml(text)
            view.findViewById<TextView>(R.id.part_tv_paragraph).movementMethod =
                LinkMovementMethod.getInstance()
        }

        layout_content.addView(view)
    }

    fun createH2(text: String?) {
        val view = LayoutInflater.from(this@ArticleView)
            .inflate(R.layout.article_h2, layout_content, false)
        if (!text.isNullOrEmpty()) {
            view.findViewById<TextView>(R.id.part_tv_h2).text = Html.fromHtml(text)
        }

        layout_content.addView(view)
    }

    fun createH3(text: String?) {
        val view = LayoutInflater.from(this@ArticleView)
            .inflate(R.layout.article_h3, layout_content, false)
        if (!text.isNullOrEmpty()) {
            view.findViewById<TextView>(R.id.part_tv_h3).setText(text)
        }

        layout_content.addView(view)
    }

    fun createGreybox(text: String?) {
        val view = LayoutInflater.from(this@ArticleView)
            .inflate(R.layout.article_greybox, layout_content, false)

        if (!text.isNullOrEmpty()) {
            view.findViewById<TextView>(R.id.part_tv_greyboxText).text = Html.fromHtml(text)
            view.findViewById<TextView>(R.id.part_tv_greyboxText).movementMethod =
                LinkMovementMethod.getInstance()
        }

        layout_content.addView(view)
    }

Success

By the way, shout-outs to Mike, Ben, Alice, Ron, and Jaret!