Skip to content

Commit 33cb8a5

Browse files
authored
Merge pull request #5 from ukrainefield/feature/google-analytics
Feature/google analytics
2 parents 6d16552 + 0ec008d commit 33cb8a5

File tree

16 files changed

+224
-20
lines changed

16 files changed

+224
-20
lines changed

app/.idea/deploymentTargetDropDown.xml

Lines changed: 17 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/app/src/main/java/nl/gardensnakes/ukrainefield/BookmarkFragment.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import androidx.recyclerview.widget.RecyclerView
1111
import com.google.firebase.analytics.FirebaseAnalytics
1212
import nl.gardensnakes.ukrainefield.data.remote.SavedPreferences
1313
import nl.gardensnakes.ukrainefield.helper.BookmarkHelper
14+
import nl.gardensnakes.ukrainefield.helper.FirebaseHelper
1415
import nl.gardensnakes.ukrainefield.view.adapter.FeedCardAdapter
1516

1617
class BookmarkFragment : Fragment() {
@@ -34,6 +35,7 @@ class BookmarkFragment : Fragment() {
3435
val view = inflater.inflate(R.layout.fragment_bookmark, container, false)
3536

3637
mFirebaseAnalytics = FirebaseAnalytics.getInstance(view.context);
38+
FirebaseHelper.updateCurrentScreen(mFirebaseAnalytics, this.requireActivity(), this.javaClass.simpleName, this.javaClass.simpleName)
3739

3840
useProxyServer = SavedPreferences.useProxyServer(requireContext())
3941
feedRecyclerView = view.findViewById(R.id.bookmark_recycler_view)
@@ -48,7 +50,7 @@ class BookmarkFragment : Fragment() {
4850
else {
4951
noBookmarksText.visibility = View.GONE
5052
feedRecyclerView.visibility = View.VISIBLE
51-
feedCardAdapter = FeedCardAdapter(bookmarkedItems.sortedByDescending { it.epochTime}, true)
53+
feedCardAdapter = FeedCardAdapter(bookmarkedItems.sortedByDescending { it.epochTime}, mFirebaseAnalytics, true)
5254
feedRecyclerView.adapter = feedCardAdapter
5355
feedRecyclerView.layoutManager = LinearLayoutManager(view.context);
5456
}

app/app/src/main/java/nl/gardensnakes/ukrainefield/MapFragment.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import kotlinx.coroutines.*
1515
import nl.gardensnakes.ukrainefield.data.remote.FeedService
1616
import nl.gardensnakes.ukrainefield.data.remote.MapService
1717
import nl.gardensnakes.ukrainefield.data.remote.SavedPreferences
18+
import nl.gardensnakes.ukrainefield.helper.FirebaseHelper
1819
import nl.gardensnakes.ukrainefield.helper.SwipeRefreshHelper
1920
import nl.gardensnakes.ukrainefield.view.adapter.FeedCardAdapter
2021
import nl.gardensnakes.ukrainefield.view.adapter.MapCardAdapter
@@ -45,13 +46,14 @@ class MapFragment : Fragment() {
4546
val view = inflater.inflate(R.layout.fragment_map, container, false)
4647

4748
mFirebaseAnalytics = FirebaseAnalytics.getInstance(view.context);
49+
FirebaseHelper.updateCurrentScreen(mFirebaseAnalytics, this.requireActivity(), this.javaClass.simpleName, this.javaClass.simpleName)
4850

4951
useProxyServer = SavedPreferences.useProxyServer(requireContext())
5052

5153
swipeRefreshLayout = view.findViewById(R.id.map_refresh_layout)
5254
mapRecyclerView = view.findViewById(R.id.map_recycle_view)
5355

54-
mapCardAdapter = MapCardAdapter(emptyList())
56+
mapCardAdapter = MapCardAdapter(emptyList(), mFirebaseAnalytics)
5557
mapRecyclerView.adapter = mapCardAdapter
5658

5759
setupRefreshLayout()
@@ -73,7 +75,7 @@ class MapFragment : Fragment() {
7375
val feedData = feedService.getAllMaps()
7476
swipeRefreshLayout.isRefreshing = false
7577
if(feedData != null && context != null) {
76-
mapCardAdapter = MapCardAdapter(feedData.mapData)
78+
mapCardAdapter = MapCardAdapter(feedData.mapData, mFirebaseAnalytics)
7779
mapRecyclerView.adapter = mapCardAdapter
7880
mapRecyclerView.layoutManager = LinearLayoutManager(requireView().context);
7981
}

app/app/src/main/java/nl/gardensnakes/ukrainefield/MediaDetailActivity.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.github.piasy.biv.loader.glide.GlideImageLoader
1212
import com.github.piasy.biv.view.BigImageView
1313
import com.google.firebase.analytics.FirebaseAnalytics
1414
import nl.gardensnakes.ukrainefield.data.remote.HttpRoutes
15+
import nl.gardensnakes.ukrainefield.helper.FirebaseHelper
1516
import nl.gardensnakes.ukrainefield.helper.PreferenceHelper
1617

1718
class MediaDetailActivity : AppCompatActivity() {
@@ -27,6 +28,7 @@ class MediaDetailActivity : AppCompatActivity() {
2728
super.onCreate(savedInstanceState)
2829

2930
mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
31+
FirebaseHelper.updateCurrentScreen(mFirebaseAnalytics, this, this.javaClass.simpleName, this.javaClass.simpleName)
3032

3133
BigImageViewer.initialize(GlideImageLoader.with(this));
3234
setContentView(R.layout.activity_media_detail)

app/app/src/main/java/nl/gardensnakes/ukrainefield/NewsFeedFragment.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.google.firebase.analytics.FirebaseAnalytics
1313
import kotlinx.coroutines.*
1414
import nl.gardensnakes.ukrainefield.data.remote.FeedService
1515
import nl.gardensnakes.ukrainefield.data.remote.SavedPreferences
16+
import nl.gardensnakes.ukrainefield.helper.FirebaseHelper
1617
import nl.gardensnakes.ukrainefield.helper.SwipeRefreshHelper
1718
import nl.gardensnakes.ukrainefield.view.adapter.FeedCardAdapter
1819

@@ -42,13 +43,14 @@ class NewsFeedFragment : Fragment() {
4243
val view = inflater.inflate(R.layout.fragment_newsfeed, container, false)
4344

4445
mFirebaseAnalytics = FirebaseAnalytics.getInstance(view.context);
46+
FirebaseHelper.updateCurrentScreen(mFirebaseAnalytics, this.requireActivity(), this.javaClass.simpleName, this.javaClass.simpleName)
4547

4648
useProxyServer = SavedPreferences.useProxyServer(requireContext())
4749

4850
swipeRefreshLayout = view.findViewById(R.id.newsfeed_refresh_layout)
4951
feedRecyclerView = view.findViewById(R.id.newsfeed_recycle_view)
5052

51-
feedCardAdapter = FeedCardAdapter(emptyList())
53+
feedCardAdapter = FeedCardAdapter(emptyList(), mFirebaseAnalytics)
5254
feedRecyclerView.adapter = feedCardAdapter
5355

5456
setupRefreshLayout()
@@ -70,7 +72,7 @@ class NewsFeedFragment : Fragment() {
7072
val feedData = feedService.getAllFeed()
7173
swipeRefreshLayout.isRefreshing = false
7274
if(feedData != null && context != null) {
73-
feedCardAdapter = FeedCardAdapter(feedData.messages)
75+
feedCardAdapter = FeedCardAdapter(feedData.messages, mFirebaseAnalytics)
7476
feedRecyclerView.adapter = feedCardAdapter
7577
feedRecyclerView.layoutManager = LinearLayoutManager(requireView().context);
7678
}
Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,67 @@
11
package nl.gardensnakes.ukrainefield
22

3+
import android.content.Intent
4+
import android.net.Uri
35
import android.os.Bundle
4-
import android.preference.*
6+
import androidx.core.content.ContextCompat
57
import androidx.preference.Preference
68
import androidx.preference.PreferenceFragmentCompat
9+
import com.google.firebase.analytics.FirebaseAnalytics
710
import nl.gardensnakes.ukrainefield.helper.BookmarkHelper
11+
import nl.gardensnakes.ukrainefield.helper.Consts
12+
import nl.gardensnakes.ukrainefield.helper.FirebaseHelper
813

914
class SettingsFragment : PreferenceFragmentCompat() {
1015

16+
private lateinit var mFirebaseAnalytics: FirebaseAnalytics
17+
1118
override fun onCreate(savedInstanceState: Bundle?) {
1219
super.onCreate(savedInstanceState)
20+
mFirebaseAnalytics = FirebaseAnalytics.getInstance(requireContext());
21+
FirebaseHelper.updateCurrentScreen(mFirebaseAnalytics, this.requireActivity(), this.javaClass.simpleName, this.javaClass.simpleName)
1322
}
1423

1524
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
1625
setPreferencesFromResource(R.xml.settings, rootKey)
26+
setupResetBookmarksClick()
27+
setupNewsSourcesClick()
28+
setupGithubReposClick()
29+
setupTwitterClick()
30+
}
31+
32+
private fun setupResetBookmarksClick() {
1733
findPreference<Preference>("reset_bookmarks")?.setOnPreferenceClickListener {
34+
FirebaseHelper.logResetBookmarks(mFirebaseAnalytics)
1835
context?.let { context -> BookmarkHelper().resetBookmarks(context) }
1936
true
2037
}
2138
}
39+
40+
private fun setupTwitterClick() {
41+
findPreference<Preference>("twitter_link")?.setOnPreferenceClickListener {
42+
FirebaseHelper.logVisitOfficialLink(mFirebaseAnalytics, Consts.TWITTER_LINK)
43+
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(Consts.TWITTER_LINK))
44+
ContextCompat.startActivity(requireContext(), browserIntent, null)
45+
true
46+
}
47+
}
48+
49+
private fun setupGithubReposClick() {
50+
findPreference<Preference>("github_link")?.setOnPreferenceClickListener {
51+
FirebaseHelper.logVisitOfficialLink(mFirebaseAnalytics, Consts.GITHUB_LINK)
52+
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(Consts.GITHUB_LINK))
53+
ContextCompat.startActivity(requireContext(), browserIntent, null)
54+
true
55+
}
56+
}
57+
58+
private fun setupNewsSourcesClick() {
59+
findPreference<Preference>("news_sources_link")?.setOnPreferenceClickListener {
60+
FirebaseHelper.logVisitOfficialLink(mFirebaseAnalytics, Consts.NEWSSOURCES_LINK)
61+
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(Consts.NEWSSOURCES_LINK))
62+
ContextCompat.startActivity(requireContext(), browserIntent, null)
63+
true
64+
}
65+
}
66+
2267
}

app/app/src/main/java/nl/gardensnakes/ukrainefield/helper/BookmarkHelper.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ class BookmarkHelper {
102102
ret = stringBuilder.toString()
103103
}
104104
} catch (e: FileNotFoundException) {
105+
resetBookmarks(context)
105106
Log.e("BookmarkHelper", "File not found: $e")
106107
} catch (e: IOException) {
107108
Log.e("BookmarkHelper", "Can not read file: $e")
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package nl.gardensnakes.ukrainefield.helper
2+
3+
object Consts {
4+
val NEWSSOURCES_LINK: String = "https://github.com/ukrainefield/data-fetcher/blob/main/consts.json"
5+
val GITHUB_LINK: String = "https://github.com/ukrainefield"
6+
val TWITTER_LINK: String = "https://twitter.com/fieldukraine"
7+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package nl.gardensnakes.ukrainefield.helper
2+
3+
import android.app.Activity
4+
import android.os.Bundle
5+
import com.google.firebase.analytics.FirebaseAnalytics
6+
7+
class FirebaseHelper {
8+
companion object {
9+
fun updateCurrentScreen(firebase: FirebaseAnalytics, activity: Activity, activityName: String, className: String){
10+
firebase.setCurrentScreen(activity, activityName, className);
11+
}
12+
fun logShareEvent(firebase: FirebaseAnalytics, messageUrl: String){
13+
val params = Bundle()
14+
params.putString("share_message", messageUrl)
15+
firebase.logEvent("eventShareMessage", params)
16+
}
17+
fun logOpenInBrowserEvent(firebase: FirebaseAnalytics, messageUrl: String){
18+
val params = Bundle()
19+
params.putString("open_message_in_browser", messageUrl)
20+
firebase.logEvent("eventOpenMessageInBrowser", params)
21+
}
22+
fun logBookmarkEvent(firebase: FirebaseAnalytics, messageId: String){
23+
val params = Bundle()
24+
params.putString("message_id", messageId)
25+
firebase.logEvent("eventBookmarkMessage", params)
26+
}
27+
fun logUnbookmarkEvent(firebase: FirebaseAnalytics, messageUrl: String){
28+
val params = Bundle()
29+
params.putString("message_id", messageUrl)
30+
firebase.logEvent("eventUnbookmarkMessage", params)
31+
}
32+
fun logVisitOfficialLink(firebase: FirebaseAnalytics, linkUrl: String){
33+
val params = Bundle()
34+
params.putString("link_url", linkUrl)
35+
firebase.logEvent("eventVisitOfficialLink", params)
36+
}
37+
fun logResetBookmarks(firebase: FirebaseAnalytics){
38+
val params = Bundle()
39+
firebase.logEvent("eventResetBookmarks", params)
40+
}
41+
}
42+
}

app/app/src/main/java/nl/gardensnakes/ukrainefield/view/adapter/FeedCardAdapter.kt

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,19 @@ import androidx.recyclerview.widget.RecyclerView
1212
import com.afdhal_fa.imageslider.ImageSlider
1313
import com.afdhal_fa.imageslider.`interface`.ItemClickListener
1414
import com.afdhal_fa.imageslider.model.SlideUIModel
15+
import com.google.firebase.analytics.FirebaseAnalytics
1516
import nl.gardensnakes.ukrainefield.MediaDetailActivity
1617
import nl.gardensnakes.ukrainefield.R
1718
import nl.gardensnakes.ukrainefield.data.remote.HttpRoutes
1819
import nl.gardensnakes.ukrainefield.data.remote.dto.feed.FeedMessageResponse
1920
import nl.gardensnakes.ukrainefield.helper.BookmarkHelper
21+
import nl.gardensnakes.ukrainefield.helper.FirebaseHelper
2022
import nl.gardensnakes.ukrainefield.helper.PreferenceHelper
2123
import nl.gardensnakes.ukrainefield.helper.TimeHelper
2224
import java.lang.Exception
2325

2426

25-
class FeedCardAdapter(private var mList: List<FeedMessageResponse>, private val deleteOnUnBookmark: Boolean = false) :
27+
class FeedCardAdapter(private var mList: List<FeedMessageResponse>, private val mFirebaseAnalytics: FirebaseAnalytics, private val deleteOnUnBookmark: Boolean = false) :
2628
RecyclerView.Adapter<FeedCardAdapter.ViewHolder>() {
2729

2830
lateinit var context: Context
@@ -42,7 +44,6 @@ class FeedCardAdapter(private var mList: List<FeedMessageResponse>, private val
4244
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
4345

4446
val feedData = mList[position]
45-
val bookmarkHelper = BookmarkHelper()
4647

4748
resetView(holder)
4849

@@ -70,7 +71,7 @@ class FeedCardAdapter(private var mList: List<FeedMessageResponse>, private val
7071
holder.postedAtText.text =
7172
"${context.getString(R.string.posted_at)} ${TimeHelper.epochToTimeString(feedData.epochTime.toLong())}"
7273

73-
updateBookmarkText(feedData.messageURL ?: "", holder, position)
74+
updateBookmarkText(feedData.messageURL ?: "", holder, position, false)
7475

7576
if (feedData.videos.isEmpty() && feedData.images.isEmpty()) {
7677
holder.imageSlide.visibility = View.GONE
@@ -105,15 +106,17 @@ class FeedCardAdapter(private var mList: List<FeedMessageResponse>, private val
105106
}
106107

107108
holder.shareView.setOnClickListener {
109+
FirebaseHelper.logShareEvent(mFirebaseAnalytics, feedData.messageURL ?: "Unknown")
108110
val sendIntent = Intent()
109111
sendIntent.action = Intent.ACTION_SEND
110-
sendIntent.putExtra(Intent.EXTRA_SUBJECT, getTitleText(feedData));
112+
sendIntent.putExtra(Intent.EXTRA_SUBJECT, getTitleText(feedData))
111113
sendIntent.putExtra(Intent.EXTRA_TEXT, feedData.messageURL)
112114
sendIntent.type = "text/plain"
113115
startActivity(context, sendIntent, null)
114116
}
115117

116118
holder.browserButtonView.setOnClickListener {
119+
FirebaseHelper.logOpenInBrowserEvent(mFirebaseAnalytics, feedData.messageURL ?: "Unkown")
117120
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(feedData.messageURL))
118121
startActivity(context, browserIntent, null)
119122
}
@@ -130,12 +133,18 @@ class FeedCardAdapter(private var mList: List<FeedMessageResponse>, private val
130133
return mList.size
131134
}
132135

133-
private fun updateBookmarkText(messageUrl: String, holder: ViewHolder, position: Int){
134-
var isBookmarked = BookmarkHelper().isFavorite(messageUrl, context)
136+
private fun updateBookmarkText(messageUrl: String, holder: ViewHolder, position: Int, logEvent: Boolean = true){
137+
val isBookmarked = BookmarkHelper().isFavorite(messageUrl, context)
135138
if(isBookmarked){
139+
if(logEvent) {
140+
FirebaseHelper.logBookmarkEvent(mFirebaseAnalytics, messageUrl)
141+
}
136142
holder.bookmarkButton.text = context.getString(R.string.remove_bookmark)
137143
}
138144
else{
145+
if(logEvent) {
146+
FirebaseHelper.logUnbookmarkEvent(mFirebaseAnalytics, messageUrl)
147+
}
139148
holder.bookmarkButton.text = context.getString(R.string.bookmark)
140149
if(deleteOnUnBookmark){
141150
try {
@@ -166,7 +175,7 @@ class FeedCardAdapter(private var mList: List<FeedMessageResponse>, private val
166175

167176
// Holds the views for adding it to image and text
168177
class ViewHolder(ItemView: View) : RecyclerView.ViewHolder(ItemView) {
169-
val imageSlide = itemView.findViewById<ImageSlider>(R.id.feed_card_thumbnail)
178+
val imageSlide: ImageSlider = itemView.findViewById(R.id.feed_card_thumbnail)
170179
val titleView: TextView = itemView.findViewById(R.id.feed_card_title)
171180
val textView: TextView = itemView.findViewById(R.id.feed_card_text)
172181
val postedAtText: TextView = itemView.findViewById(R.id.feed_card_posted_at_text)

0 commit comments

Comments
 (0)