diff --git a/app/build.gradle b/app/build.gradle index d3bf478..b773edc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,16 +1,15 @@ apply plugin: 'com.android.application' - android { compileSdkVersion 24 - buildToolsVersion "24.0.0" + buildToolsVersion "24.0.2" defaultConfig { applicationId "news.androidtv.tvapprepo" minSdkVersion 21 targetSdkVersion 24 - versionCode 1 - versionName "0.0.1" + versionCode 2 + versionName "1.1.0" jackOptions { enabled true } @@ -27,18 +26,41 @@ android { } } +buildscript { + repositories { + mavenCentral() + maven { url 'https://maven.fabric.io/public' } + } + dependencies { + classpath 'com.android.tools.build:gradle:2.2.2' + classpath 'io.fabric.tools:gradle:1.22.0' + } +} + +apply plugin: 'io.fabric' + +repositories { + mavenCentral() + maven { url 'https://maven.fabric.io/public' } +} + + dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:recyclerview-v7:24.2.1' compile 'com.android.support:leanback-v17:24.2.1' compile 'com.android.support:appcompat-v7:24.2.1' - compile 'com.google.firebase:firebase-database:9.4.0' - compile 'com.google.android.gms:play-services-ads:9.4.0' + compile 'com.google.firebase:firebase-database:9.6.1' + compile 'com.google.android.gms:play-services-ads:9.6.1' compile 'com.colortv:android-sdk:1.6.0' compile 'com.github.bumptech.glide:glide:3.4.0' compile 'com.afollestad.material-dialogs:core:0.9.0.2' + + compile('com.crashlytics.sdk.android:crashlytics:2.6.5@aar') { + transitive = true; + } } apply plugin: 'com.google.gms.google-services' diff --git a/app/fabric.properties b/app/fabric.properties new file mode 100644 index 0000000..aa8990e --- /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. +#Fri Oct 21 21:23:32 EDT 2016 +apiSecret=e9a5cc1704503d82ba5e97ce66f40ba38972ff71c11134713e447a7ec8cc160f diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8939f8e..c283759 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ android:resource="@xml/provider_paths"/> + + \ No newline at end of file diff --git a/app/src/main/java/news/androidtv/tvapprepo/PrivateUtils.java b/app/src/main/java/news/androidtv/tvapprepo/PrivateUtils.java index 4647a4a..30c3223 100644 --- a/app/src/main/java/news/androidtv/tvapprepo/PrivateUtils.java +++ b/app/src/main/java/news/androidtv/tvapprepo/PrivateUtils.java @@ -1,8 +1,9 @@ -package news.androidtv.tvapprepo; - -/** - * Created by Nick on 10/21/2016. - */ - -public class PrivateUtils { -} +package news.androidtv.tvapprepo; + +/** + * Created by Nick on 10/21/2016. + */ + +public class PrivateUtils { + public static final String COLOR_TV_KEY = "6290e438-a188-4ae9-a8bc-4e23e1b97cbd"; +} diff --git a/app/src/main/java/news/androidtv/tvapprepo/activities/MainActivity.java b/app/src/main/java/news/androidtv/tvapprepo/activities/MainActivity.java index d1e0eb7..12045dd 100644 --- a/app/src/main/java/news/androidtv/tvapprepo/activities/MainActivity.java +++ b/app/src/main/java/news/androidtv/tvapprepo/activities/MainActivity.java @@ -17,6 +17,9 @@ import android.app.Activity; import android.os.Bundle; +import com.crashlytics.android.Crashlytics; + +import io.fabric.sdk.android.Fabric; import news.androidtv.tvapprepo.R; /* @@ -30,6 +33,7 @@ public class MainActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + Fabric.with(this, new Crashlytics()); checkSelfVersion(); } diff --git a/app/src/main/java/news/androidtv/tvapprepo/download/AbstractDownloadHelper.java b/app/src/main/java/news/androidtv/tvapprepo/download/AbstractDownloadHelper.java index 2c93b67..01165e2 100644 --- a/app/src/main/java/news/androidtv/tvapprepo/download/AbstractDownloadHelper.java +++ b/app/src/main/java/news/androidtv/tvapprepo/download/AbstractDownloadHelper.java @@ -1,70 +1,70 @@ -package news.androidtv.tvapprepo.download; - -import android.app.Activity; - -import com.colortv.android.AdPlacement; -import com.colortv.android.ColorTvAdListener; -import com.colortv.android.ColorTvError; -import com.colortv.android.ColorTvSdk; - -/** - * Created by Nick on 9/23/2016. - */ -public abstract class AbstractDownloadHelper { - private static final double AD_RATE = 1/1; - private static final boolean mDisableAds = false; - - private Activity mActivity; - - private ColorTvAdListener mListener = new ColorTvAdListener() { - @Override - public void onAdLoaded(String placement) { - ColorTvSdk.showAd(placement); - } - - @Override - public void onAdError(String placement, ColorTvError colorTvError) { - } - - @Override - public void onAdClosed(String placement, boolean watched) { - } - - @Override - public void onAdExpired(String placement) { - } - }; - - protected AbstractDownloadHelper() { - - } - - public AbstractDownloadHelper initialize(Activity activity) { - mActivity = activity; - ColorTvSdk.init(activity, getAppId()); - ColorTvSdk.setRecordAudioEnabled(false); - ColorTvSdk.onCreate(); - ColorTvSdk.registerAdListener(mListener); - return this; - } - - public void destroy() { - ColorTvSdk.onDestroy(); - } - - public AbstractDownloadHelper startDownload(String url) { - startDownload(url, AdPlacement.BETWEEN_LEVELS); - return this; - } - - public AbstractDownloadHelper startDownload(String url, String adType) { - // Starts download - // Also loads ad - if (!mDisableAds && Math.random() < AD_RATE) { - ColorTvSdk.loadAd(adType); - } - return this; - } - - public abstract String getAppId(); -} +package news.androidtv.tvapprepo.download; + +import android.app.Activity; + +import com.colortv.android.AdPlacement; +import com.colortv.android.ColorTvAdListener; +import com.colortv.android.ColorTvError; +import com.colortv.android.ColorTvSdk; + +/** + * Created by Nick on 9/23/2016. + */ +public abstract class AbstractDownloadHelper { + private static final double AD_RATE = 1/1; + private static final boolean mDisableAds = false; + + private Activity mActivity; + + private ColorTvAdListener mListener = new ColorTvAdListener() { + @Override + public void onAdLoaded(String placement) { + ColorTvSdk.showAd(placement); + } + + @Override + public void onAdError(String placement, ColorTvError colorTvError) { + } + + @Override + public void onAdClosed(String placement, boolean watched) { + } + + @Override + public void onAdExpired(String placement) { + } + }; + + protected AbstractDownloadHelper() { + + } + + public AbstractDownloadHelper initialize(Activity activity) { + mActivity = activity; + ColorTvSdk.init(activity, getAppId()); + ColorTvSdk.setRecordAudioEnabled(false); + ColorTvSdk.onCreate(); + ColorTvSdk.registerAdListener(mListener); + return this; + } + + public void destroy() { + ColorTvSdk.onDestroy(); + } + + public AbstractDownloadHelper startDownload(String url) { + startDownload(url, AdPlacement.BETWEEN_LEVELS); + return this; + } + + public AbstractDownloadHelper startDownload(String url, String adType) { + // Starts download + // Also loads ad + if (!mDisableAds && Math.random() < AD_RATE) { + ColorTvSdk.loadAd(adType); + } + return this; + } + + public abstract String getAppId(); +} diff --git a/app/src/main/java/news/androidtv/tvapprepo/download/ApkDownloadHelper.java b/app/src/main/java/news/androidtv/tvapprepo/download/ApkDownloadHelper.java index cfbf21f..7d671fa 100644 --- a/app/src/main/java/news/androidtv/tvapprepo/download/ApkDownloadHelper.java +++ b/app/src/main/java/news/androidtv/tvapprepo/download/ApkDownloadHelper.java @@ -1,68 +1,68 @@ -package news.androidtv.tvapprepo.download; - -import android.app.Activity; - -import java.io.File; - -import news.androidtv.tvapprepo.PrivateUtils; -import tv.puppetmaster.tinydl.PackageInstaller; - -/** - * Created by Nick on 9/23/2016. - */ -public class ApkDownloadHelper extends AbstractDownloadHelper { - private PackageInstaller mPackageInstaller; - - public ApkDownloadHelper(Activity activity) { - initialize(activity, null); - } - - public ApkDownloadHelper initialize(Activity activity, PackageInstaller.DownloadListener listener) { - super.initialize(activity); - mPackageInstaller = PackageInstaller.initialize(activity); - if (listener != null) { - mPackageInstaller.addListener(listener); - } - return this; - } - - @Override - public void destroy() { - super.destroy(); - mPackageInstaller.destroy(); - } - - @Override - public AbstractDownloadHelper startDownload(String url) { - mPackageInstaller.wget(url); - return super.startDownload(url); - } - - @Override - public AbstractDownloadHelper startDownload(String url, String adType) { - mPackageInstaller.wget(url); - return super.startDownload(url, adType); - } - - public PackageInstaller getPackageInstaller() { - return mPackageInstaller; - } - - @Override - public String getAppId() { - return PrivateUtils.COLOR_TV_KEY; - } - - // Wrapper methods - public void install(File file) { - mPackageInstaller.install(file); - } - - public void addListener(PackageInstaller.DownloadListener listener) { - mPackageInstaller.addListener(listener); - } - - public void removeListener(PackageInstaller.DownloadListener listener) { - mPackageInstaller.removeListener(listener); - } -} +package news.androidtv.tvapprepo.download; + +import android.app.Activity; + +import java.io.File; + +import news.androidtv.tvapprepo.PrivateUtils; +import tv.puppetmaster.tinydl.PackageInstaller; + +/** + * Created by Nick on 9/23/2016. + */ +public class ApkDownloadHelper extends AbstractDownloadHelper { + private PackageInstaller mPackageInstaller; + + public ApkDownloadHelper(Activity activity) { + initialize(activity, null); + } + + public ApkDownloadHelper initialize(Activity activity, PackageInstaller.DownloadListener listener) { + super.initialize(activity); + mPackageInstaller = PackageInstaller.initialize(activity); + if (listener != null) { + mPackageInstaller.addListener(listener); + } + return this; + } + + @Override + public void destroy() { + super.destroy(); + mPackageInstaller.destroy(); + } + + @Override + public AbstractDownloadHelper startDownload(String url) { + mPackageInstaller.wget(url); + return super.startDownload(url); + } + + @Override + public AbstractDownloadHelper startDownload(String url, String adType) { + mPackageInstaller.wget(url); + return super.startDownload(url, adType); + } + + public PackageInstaller getPackageInstaller() { + return mPackageInstaller; + } + + @Override + public String getAppId() { + return PrivateUtils.COLOR_TV_KEY; + } + + // Wrapper methods + public void install(File file) { + mPackageInstaller.install(file); + } + + public void addListener(PackageInstaller.DownloadListener listener) { + mPackageInstaller.addListener(listener); + } + + public void removeListener(PackageInstaller.DownloadListener listener) { + mPackageInstaller.removeListener(listener); + } +} diff --git a/app/src/main/java/news/androidtv/tvapprepo/fragments/MainFragment.java b/app/src/main/java/news/androidtv/tvapprepo/fragments/MainFragment.java index 2d3a636..6631007 100644 --- a/app/src/main/java/news/androidtv/tvapprepo/fragments/MainFragment.java +++ b/app/src/main/java/news/androidtv/tvapprepo/fragments/MainFragment.java @@ -76,6 +76,7 @@ public class MainFragment extends BrowseFragment { private static final int NUM_ROWS = 6; private static final int NUM_COLS = 15; + private boolean checkedForUpdates = true; private final Handler mHandler = new Handler(); private ArrayObjectAdapter mRowsAdapter; private Drawable mDefaultBackground; @@ -93,7 +94,7 @@ public void onApkDownloaded(File downloadedApkFile) { @Override public void onApkDownloadedNougat(final File downloadedApkFile) { new Handler(Looper.getMainLooper()).postDelayed( - () -> mApkDownloadHelper.install(downloadedApkFile), 1000 * 1); + () -> mApkDownloadHelper.install(downloadedApkFile), 1000 * 5); } @Override @@ -300,7 +301,12 @@ private void startBackgroundTimer() { } private void checkForAppUpdates(Apk apk) { + // Only tell the user once per session + if (checkedForUpdates) { + return; + } if (PackageInstallerUtils.isUpdateAvailable(getActivity(), apk)) { + checkedForUpdates = true; new AlertDialog.Builder(new ContextThemeWrapper(getActivity(), R.style.dialog_theme)) .setTitle(R.string.update_for_tv_app_repo) .setPositiveButton(R.string.update, (dialog, which) -> @@ -348,12 +354,9 @@ public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item, private class UpdateBackgroundTask extends TimerTask { @Override public void run() { - mHandler.post(new Runnable() { - @Override - public void run() { - if (mBackgroundURI != null) { - updateBackground(mBackgroundURI.toString()); - } + mHandler.post(() -> { + if (mBackgroundURI != null) { + updateBackground(mBackgroundURI.toString()); } }); } diff --git a/promo/sample_banners/inkwire.png b/promo/sample_banners/inkwire.png new file mode 100644 index 0000000..33546da Binary files /dev/null and b/promo/sample_banners/inkwire.png differ diff --git a/promo/screenshots/device-2016-10-08-202152.png b/promo/screenshots/device-2016-10-08-202152.png new file mode 100644 index 0000000..d74566f Binary files /dev/null and b/promo/screenshots/device-2016-10-08-202152.png differ diff --git a/promo/screenshots/device-2016-10-20-234842.png b/promo/screenshots/device-2016-10-20-234842.png new file mode 100644 index 0000000..16fbb02 Binary files /dev/null and b/promo/screenshots/device-2016-10-20-234842.png differ diff --git a/promo/screenshots/device-2016-10-21-003651.png b/promo/screenshots/device-2016-10-21-003651.png new file mode 100644 index 0000000..8cf05ea Binary files /dev/null and b/promo/screenshots/device-2016-10-21-003651.png differ