diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 376628a3f2b171a13356e0cf701344c994d1dd78..da7779866d1dbfc95eafb9bd8ff0d0f446ef9158 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/app/build.gradle b/app/build.gradle index 4a0020d2feeed75159f263c74a8c6ca33c7d6ba6..9a8b3358fffd0e5cdb508e69d61f2ac6ec7561a9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -41,6 +41,29 @@ android { abortOnError false } + testOptions.unitTests.includeAndroidResources true + +} + +buildscript { + repositories { + maven { url 'https://maven.fabric.io/public' } + } + + dependencies { + // These docs use an open ended version so that our plugin + // can be updated quickly in response to Android tooling updates + + // We recommend changing it to the latest version from our changelog: + // https://docs.fabric.io/android/changelog.html#fabric-gradle-plugin + classpath 'io.fabric.tools:gradle:1.+' + } +} + +apply plugin: 'io.fabric' + +repositories { + maven { url 'https://maven.fabric.io/public' } } ext { @@ -95,4 +118,10 @@ dependencies { testImplementation 'com.google.dagger:dagger:2.11' testAnnotationProcessor 'com.google.dagger:dagger-compiler:2.11' testCompileOnly 'javax.annotation:jsr250-api:1.0' + + //Analytics + implementation('com.crashlytics.sdk.android:crashlytics:2.9.2@aar') { + transitive = true; + } + implementation 'com.google.android.gms:play-services-analytics:15.0.2' } diff --git a/app/fabric.properties b/app/fabric.properties new file mode 100644 index 0000000000000000000000000000000000000000..77cfe8eb83a1d7d089fd79e1d78a31874af8bba0 --- /dev/null +++ b/app/fabric.properties @@ -0,0 +1,3 @@ +#Contains API Secret used to validate your application. Commit to internal source control; avoid making secret public. +#Thu May 10 08:27:52 CEST 2018 +apiSecret=09239bd53054ab397883ae3e88cf2d99d3dec138880fa23d2a322457b95b63c3 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78e0a39df309957afbe2937c289bece81b4b0b28..d1a6ceb8daf65f9cbdc19b28c81138415c835f1d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ package="me.szaki.xkcd.xkcdbrowser"> <uses-permission android:name="android.permission.INTERNET" /> + <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <application android:name=".XKCDBrowserApplication" @@ -35,6 +36,9 @@ android:name="android.support.PARENT_ACTIVITY" android:value="me.szaki.xkcd.xkcdbrowser.ui.favorites.FavoritesActivity" /> </activity> + <meta-data + android:name="io.fabric.ApiKey" + android:value="f85cd0b403e1dfb12558c873554e71e36c8eda3d" /> </application> </manifest> \ No newline at end of file diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/XKCDBrowserApplication.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/XKCDBrowserApplication.java index 02232510e2d10fea1e2ed573f559876f5fcf1f3e..480756a2cecca4560414449f0732079af3f70731 100644 --- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/XKCDBrowserApplication.java +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/XKCDBrowserApplication.java @@ -2,15 +2,38 @@ package me.szaki.xkcd.xkcdbrowser; import android.app.Application; +import com.crashlytics.android.Crashlytics; +import com.google.android.gms.analytics.GoogleAnalytics; +import com.google.android.gms.analytics.Tracker; + +import io.fabric.sdk.android.Fabric; import me.szaki.xkcd.xkcdbrowser.database.DBModule; import me.szaki.xkcd.xkcdbrowser.ui.UIModule; public class XKCDBrowserApplication extends Application { public static XKCDBrowserApplicationComponent injector; + private static GoogleAnalytics sAnalytics; + private static Tracker sTracker; @Override public void onCreate() { super.onCreate(); + Fabric.with(this, new Crashlytics()); + sAnalytics = GoogleAnalytics.getInstance(this); + sAnalytics.setLocalDispatchPeriod(15); injector = DaggerXKCDBrowserApplicationComponent.builder().uIModule(new UIModule(this)).dBModule(new DBModule(this)).build(); } + + /** + * Gets the default {@link Tracker} for this {@link Application}. + * @return tracker + */ + synchronized public Tracker getDefaultTracker() { + // To enable debug logging use: adb shell setprop log.tag.GAv4 DEBUG + if (sTracker == null) { + sTracker = sAnalytics.newTracker(R.xml.global_tracker); + } + + return sTracker; + } } diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailActivity.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailActivity.java index 4a2306aea88270cf908a970f11fae6b56cb6b6bc..50c685b6a0dc9e951cba9dbee8dc0348b81ffb19 100644 --- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailActivity.java +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailActivity.java @@ -7,8 +7,12 @@ import android.os.Bundle; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; +import android.util.Log; import android.widget.ImageView; +import com.google.android.gms.analytics.HitBuilders; +import com.google.android.gms.analytics.Tracker; + import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; @@ -26,6 +30,7 @@ public class DetailActivity extends AppCompatActivity implements DetailScreen { private ImageView detailImageView; private Long num; + private Tracker mTracker; public DetailActivity() { XKCDBrowserApplication.injector.inject(this); @@ -34,6 +39,10 @@ public class DetailActivity extends AppCompatActivity implements DetailScreen { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + + XKCDBrowserApplication application = (XKCDBrowserApplication) getApplication(); + mTracker = application.getDefaultTracker(); + setContentView(R.layout.activity_detail); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); @@ -86,4 +95,13 @@ public class DetailActivity extends AppCompatActivity implements DetailScreen { }; mainHandler.post(myRunnable); } + + @Override + protected void onResume() { + super.onResume(); + String name = "Detail"; + Log.i("HP", "Setting screen name: " + name); + mTracker.setScreenName("Image~" + name); + mTracker.send(new HitBuilders.ScreenViewBuilder().build()); + } } diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesActivity.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesActivity.java index 594478954cef364b48f1f4a26f11b47436735b11..92267aca075dd41498d0d68bfebf6b2d9e83e6ba 100644 --- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesActivity.java +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesActivity.java @@ -13,10 +13,14 @@ import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; +import android.util.Log; import android.view.MenuItem; import android.view.View; import android.widget.LinearLayout; +import com.google.android.gms.analytics.HitBuilders; +import com.google.android.gms.analytics.Tracker; + import java.util.List; import javax.inject.Inject; @@ -34,6 +38,7 @@ public class FavoritesActivity extends AppCompatActivity @Inject FavoritesPresenter favoritesPresenter; private FavoriteListAdapter mAdapter; + private Tracker mTracker; public FavoritesActivity() { XKCDBrowserApplication.injector.inject(this); @@ -42,6 +47,10 @@ public class FavoritesActivity extends AppCompatActivity @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + + XKCDBrowserApplication application = (XKCDBrowserApplication) getApplication(); + mTracker = application.getDefaultTracker(); + setContentView(R.layout.activity_favorites); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); @@ -77,6 +86,10 @@ public class FavoritesActivity extends AppCompatActivity @Override public void onBackPressed() { DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + mTracker.send(new HitBuilders.EventBuilder() + .setCategory("Action") + .setAction("Back") + .build()); if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else { @@ -120,6 +133,10 @@ public class FavoritesActivity extends AppCompatActivity @Override public void onClick(int position, View v) { + mTracker.send(new HitBuilders.EventBuilder() + .setCategory("Action") + .setAction("Select") + .build()); Intent i = new Intent(getApplicationContext(), DetailActivity.class); i.putExtra("num", mAdapter.getComicStripByNum(position).getNum()); startActivity(i); @@ -127,6 +144,10 @@ public class FavoritesActivity extends AppCompatActivity @Override public void onDeleteClick(int position, View v) { + mTracker.send(new HitBuilders.EventBuilder() + .setCategory("Action") + .setAction("Delete") + .build()); favoritesPresenter.deleteData(mAdapter.getComicStripByNum(position)); } @@ -151,5 +172,14 @@ public class FavoritesActivity extends AppCompatActivity favoritesPresenter.getData(); } + @Override + protected void onResume() { + super.onResume(); + String name = "Favorite"; + Log.i("HP", "Setting screen name: " + name); + mTracker.setScreenName("Image~" + name); + mTracker.send(new HitBuilders.ScreenViewBuilder().build()); + } + } diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainActivity.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainActivity.java index e361178857cbfbf47c866894fe7108f8d3697976..5911dc7eb499e5510ddae731eb601636de0bc191 100644 --- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainActivity.java +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainActivity.java @@ -3,24 +3,23 @@ package me.szaki.xkcd.xkcdbrowser.ui.main; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.net.Uri; import android.os.Bundle; import android.os.Handler; -import android.support.design.widget.FloatingActionButton; -import android.support.design.widget.Snackbar; -import android.view.View; import android.support.design.widget.NavigationView; +import android.support.design.widget.Snackbar; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; +import android.util.Log; import android.view.Menu; import android.view.MenuItem; -import android.widget.ImageButton; +import android.view.View; import android.widget.ImageView; -import android.widget.Toast; +import com.google.android.gms.analytics.HitBuilders; +import com.google.android.gms.analytics.Tracker; import java.io.IOException; import java.net.MalformedURLException; @@ -32,7 +31,6 @@ import me.szaki.xkcd.xkcdbrowser.R; import me.szaki.xkcd.xkcdbrowser.XKCDBrowserApplication; import me.szaki.xkcd.xkcdbrowser.network.model.Comic; import me.szaki.xkcd.xkcdbrowser.ui.favorites.FavoritesActivity; -import me.szaki.xkcd.xkcdbrowser.ui.favorites.FavoritesPresenter; public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, MainScreen { @@ -43,12 +41,17 @@ public class MainActivity extends AppCompatActivity private ImageView imageView; private Comic currentComic; private MenuItem favoriteButton; + private Tracker mTracker; @Override protected void onCreate(Bundle savedInstanceState) { XKCDBrowserApplication.injector.inject(this); super.onCreate(savedInstanceState); + + XKCDBrowserApplication application = (XKCDBrowserApplication) getApplication(); + mTracker = application.getDefaultTracker(); + setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); @@ -67,6 +70,11 @@ public class MainActivity extends AppCompatActivity findViewById(R.id.next_button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { + mTracker.send(new HitBuilders.EventBuilder() + .setCategory("Action") + .setAction("Next") + .build()); + favoriteButton.setCheckable(false); mainPresenter.getNext(); } @@ -75,6 +83,10 @@ public class MainActivity extends AppCompatActivity findViewById(R.id.previous_button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { + mTracker.send(new HitBuilders.EventBuilder() + .setCategory("Action") + .setAction("Previous") + .build()); favoriteButton.setCheckable(false); mainPresenter.getPrevious(); } @@ -83,6 +95,10 @@ public class MainActivity extends AppCompatActivity findViewById(R.id.random_button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { + mTracker.send(new HitBuilders.EventBuilder() + .setCategory("Action") + .setAction("Random") + .build()); favoriteButton.setCheckable(false); mainPresenter.getRandom(); } @@ -105,6 +121,10 @@ public class MainActivity extends AppCompatActivity // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); + mTracker.send(new HitBuilders.EventBuilder() + .setCategory("Action") + .setAction("Save") + .build()); //noinspection SimplifiableIfStatement if (id == R.id.favorite_button) { @@ -119,6 +139,10 @@ public class MainActivity extends AppCompatActivity @Override public void onBackPressed() { DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + mTracker.send(new HitBuilders.EventBuilder() + .setCategory("Action") + .setAction("Back") + .build()); if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else { @@ -228,4 +252,13 @@ public class MainActivity extends AppCompatActivity } + + @Override + protected void onResume() { + super.onResume(); + String name = "Main"; + Log.i("HP", "Setting screen name: " + name); + mTracker.setScreenName("Image~" + name); + mTracker.send(new HitBuilders.ScreenViewBuilder().build()); + } } diff --git a/app/src/main/res/xml/global_tracker.xml b/app/src/main/res/xml/global_tracker.xml new file mode 100644 index 0000000000000000000000000000000000000000..5e48287f2ec72709fd60a7c1489c3635c0965411 --- /dev/null +++ b/app/src/main/res/xml/global_tracker.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="ga_trackingId" translatable="false">UA-119008810-1</string> +</resources> \ No newline at end of file diff --git a/build.gradle b/build.gradle index 1a3d812308d49457ea04cd40dacb56edffcd19a5..7440c7995288c584d906634ffbfe56966a1e0ebe 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:3.1.2' - + classpath 'com.google.gms:google-services:3.0.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files