diff --git a/app/build.gradle b/app/build.gradle index cc0543b..b090563 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "news.androidtv.tvapprepo" minSdkVersion 21 targetSdkVersion 25 - versionCode 15 - versionName "1.1.2" + versionCode 16 + versionName "1.1.3" } buildTypes { release { @@ -48,21 +48,24 @@ repositories { maven { url 'https://maven.fabric.io/public' } } +ext { + supportLibrary = '25.3.1' + googlePlayServices = '11.2.0' +} dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:recyclerview-v7:25.1.0' - compile 'com.android.support:leanback-v17:25.1.0' - compile 'com.android.support:preference-leanback-v17:25.1.0' - compile 'com.android.support:appcompat-v7:25.1.0' - compile 'com.android.support:palette-v7:25.1.0' + compile "com.android.support:recyclerview-v7:$project.ext.supportLibrary" + compile "com.android.support:leanback-v17:$project.ext.supportLibrary" + compile "com.android.support:preference-leanback-v17:$project.ext.supportLibrary" + compile "com.android.support:appcompat-v7:$project.ext.supportLibrary" + compile "com.android.support:palette-v7:$project.ext.supportLibrary" - compile 'com.google.firebase:firebase-database:10.0.1' - compile 'com.google.android.gms:play-services-ads:10.0.1' - compile 'com.google.firebase:firebase-config:10.0.1' - compile 'com.google.firebase:firebase-ads:10.0.1' + compile "com.google.firebase:firebase-database:$project.ext.googlePlayServices" + compile "com.google.android.gms:play-services-ads:$project.ext.googlePlayServices" + compile "com.google.firebase:firebase-config:$project.ext.googlePlayServices" + compile "com.google.firebase:firebase-ads:$project.ext.googlePlayServices" -// compile 'com.colortv:android-sdk:2.1.0' compile 'com.github.bumptech.glide:glide:3.7.0' compile 'com.afollestad.material-dialogs:core:0.9.0.2' compile 'com.android.volley:volley:1.0.0' diff --git a/app/src/main/java/news/androidtv/tvapprepo/activities/AdvancedShortcutActivity.java b/app/src/main/java/news/androidtv/tvapprepo/activities/AdvancedShortcutActivity.java index 2ff1a27..041e91b 100644 --- a/app/src/main/java/news/androidtv/tvapprepo/activities/AdvancedShortcutActivity.java +++ b/app/src/main/java/news/androidtv/tvapprepo/activities/AdvancedShortcutActivity.java @@ -109,6 +109,7 @@ public void onClick(View v) { } private void publish() { + advancedOptions.updateContext(this); // We pass in a new context for this activity. boolean isGame = ((Switch) findViewById(R.id.switch_isgame)).isChecked(); String bannerUrl = ((EditText) findViewById(R.id.edit_banner)).getText().toString(); @@ -116,6 +117,7 @@ private void publish() { advancedOptions.setBannerUrl(bannerUrl); } advancedOptions.setIsGame(isGame); + Log.d(TAG, "Sending form data to GenerateShortcutHelper"); GenerateShortcutHelper.generateShortcut(this, resolveInfo, advancedOptions); } @@ -126,7 +128,7 @@ private void loadCustomIconography() { resolveInfo.activityInfo.name), callback); } else { - Toast.makeText(this, "Cannot set banner of non-app yet", Toast.LENGTH_SHORT).show(); + Toast.makeText(this, R.string.warning_no_banners_available, Toast.LENGTH_SHORT).show(); } } } diff --git a/app/src/main/java/news/androidtv/tvapprepo/model/AdvancedOptions.java b/app/src/main/java/news/androidtv/tvapprepo/model/AdvancedOptions.java index 3ccfe45..63dfbec 100644 --- a/app/src/main/java/news/androidtv/tvapprepo/model/AdvancedOptions.java +++ b/app/src/main/java/news/androidtv/tvapprepo/model/AdvancedOptions.java @@ -7,6 +7,7 @@ import android.os.Looper; import android.os.Parcel; import android.os.Parcelable; +import android.util.Log; import com.bumptech.glide.Glide; @@ -22,6 +23,8 @@ * Created by Nick on 3/20/2017. A model for storing advanced options in generating shortcuts. */ public class AdvancedOptions implements Parcelable { + private static final String TAG = AdvancedOptions.class.getSimpleName(); + private volatile int mReady = 0; private String mCategory = ""; private String mIconUrl = ""; @@ -115,6 +118,11 @@ public AdvancedOptions setIconBitmap(Bitmap bitmap) { return this; } + public void updateContext(Context context) { + // Swap out contexts. + this.mContext = context; + } + public boolean isReady() { return mReady == 0; } @@ -156,6 +164,9 @@ private void downloadBanner(final Context context, final String url, final Glide @Override public void run() { try { + if (context == null) { + throw new NullPointerException("Context is null"); + } Bitmap bitmap = Glide.with(context).load(url).asBitmap().into(320, 180).get(); ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); diff --git a/app/src/main/java/news/androidtv/tvapprepo/ui/ShortcutGeneratorDialogs.java b/app/src/main/java/news/androidtv/tvapprepo/ui/ShortcutGeneratorDialogs.java index 281a296..a27a348 100644 --- a/app/src/main/java/news/androidtv/tvapprepo/ui/ShortcutGeneratorDialogs.java +++ b/app/src/main/java/news/androidtv/tvapprepo/ui/ShortcutGeneratorDialogs.java @@ -37,11 +37,16 @@ public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) } String label = tag.replaceAll("(http://)|(https://)", ""); Log.d(TAG, IntentUriGenerator.generateWebBookmark(tag)); - AdvancedOptions options = new AdvancedOptions(activity) - .setIntentUri(IntentUriGenerator.generateWebBookmark(tag)) - .setIconUrl("https://raw.githubusercontent.com/ITVlab/TvAppRepo/master/promo/graphics/icon.png") // TODO Replace icon url - .setCustomLabel(label); - GenerateShortcutHelper.begin(activity, label, options); + try { + AdvancedOptions options = new AdvancedOptions(activity) + .setIntentUri(IntentUriGenerator.generateWebBookmark(tag)) + .setIconUrl("https://raw.githubusercontent.com/ITVlab/TvAppRepo/master/promo/graphics/icon.png") // TODO Replace icon url + .setCustomLabel(label); + GenerateShortcutHelper.begin(activity, label, options); + } catch (AdvancedOptions.StringLengthException exception) { + Toast.makeText(activity, exception.getMessage(), Toast.LENGTH_SHORT) + .show(); + } } }) .positiveText(R.string.generate_shortcut) diff --git a/app/src/main/java/news/androidtv/tvapprepo/utils/GenerateShortcutHelper.java b/app/src/main/java/news/androidtv/tvapprepo/utils/GenerateShortcutHelper.java index 8b4c3fd..683f173 100644 --- a/app/src/main/java/news/androidtv/tvapprepo/utils/GenerateShortcutHelper.java +++ b/app/src/main/java/news/androidtv/tvapprepo/utils/GenerateShortcutHelper.java @@ -138,6 +138,7 @@ public static void generateShortcut(final Activity activity, final ResolveInfo r new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { @Override public void run() { + Log.d(TAG, "Delaying until web ops are complete"); generateShortcut(activity, resolveInfo, options); } }, 200); diff --git a/app/src/main/java/news/androidtv/tvapprepo/utils/ShortcutPostTask.java b/app/src/main/java/news/androidtv/tvapprepo/utils/ShortcutPostTask.java index 1d9e02b..bb03204 100644 --- a/app/src/main/java/news/androidtv/tvapprepo/utils/ShortcutPostTask.java +++ b/app/src/main/java/news/androidtv/tvapprepo/utils/ShortcutPostTask.java @@ -2,29 +2,21 @@ import android.content.Context; import android.content.pm.ResolveInfo; -import android.graphics.Bitmap; -import android.os.AsyncTask; -import android.os.Handler; -import android.os.Looper; import android.util.Log; +import android.widget.Toast; import com.android.volley.AuthFailureError; import com.android.volley.DefaultRetryPolicy; -import com.android.volley.Network; import com.android.volley.NetworkResponse; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.Volley; -import com.bumptech.glide.Glide; import com.sketchproject.infogue.modules.VolleyMultipartRequest; -import java.io.ByteArrayOutputStream; -import java.io.File; import java.util.HashMap; import java.util.Map; -import java.util.concurrent.ExecutionException; import news.androidtv.tvapprepo.R; import news.androidtv.tvapprepo.model.AdvancedOptions; @@ -123,16 +115,21 @@ protected Map getByteData() { // file name could found file base or direct access from real path // for now just get bitmap data from ImageView if (options.getIcon() != null) { - params.put(FORM_APP_LOGO, new DataPart("file_avatar.png", options.getIcon(), + params.put(FORM_APP_LOGO, new DataPart("file_logo.png", options.getIcon(), "image/png")); } else if (app != null) { - params.put(FORM_APP_LOGO, new DataPart("file_avatar.png", - VolleyMultipartRequest.getFileDataFromDrawable(context, - app.activityInfo.loadIcon(context.getPackageManager())), - "image/png")); + try { + byte[] imageData = VolleyMultipartRequest.getFileDataFromDrawable(context, + app.activityInfo.loadIcon(context.getPackageManager())); + params.put(FORM_APP_LOGO, new DataPart("file_logo.png", imageData, + "image/png")); + } catch (ClassCastException e) { + Toast.makeText(context, R.string.error_getting_logo, + Toast.LENGTH_SHORT).show(); + } } if (options.getBanner() != null) { - params.put(FORM_APP_BANNER, new DataPart("file_avatar.png", options.getBanner(), + params.put(FORM_APP_BANNER, new DataPart("file_banner.png", options.getBanner(), "image/png")); } return params; diff --git a/app/src/main/java/tv/puppetmaster/tinydl/PackageInstaller.java b/app/src/main/java/tv/puppetmaster/tinydl/PackageInstaller.java index 9a90cf4..0057dc0 100644 --- a/app/src/main/java/tv/puppetmaster/tinydl/PackageInstaller.java +++ b/app/src/main/java/tv/puppetmaster/tinydl/PackageInstaller.java @@ -285,11 +285,12 @@ protected Integer doInBackground(String... urls) { (DownloadManager) mActivity.getSystemService(Context.DOWNLOAD_SERVICE); manager.enqueue(request); } catch (Exception e) { - Toast.makeText(mActivity.getApplicationContext(), e.getMessage(), + String errorMsg = e.getMessage() + ": " + downloadedFileName + ", " + + urls[0] + ", " + DOWNLOADS_DIRECTORY.toString(); + Toast.makeText(mActivity.getApplicationContext(), errorMsg, Toast.LENGTH_SHORT).show(); // Tell user about an error and throw with additional debug info. - throw new RuntimeException(e.getMessage() + ": " + downloadedFileName + ", " + - urls[0] + ", " + DOWNLOADS_DIRECTORY.toString()); + throw new RuntimeException(errorMsg); } Log.i(TAG, "Download request for " + urls[0] + " enqueued"); Log.d(TAG, "Should be saved to " + downloadedFileName); diff --git a/app/src/main/res/layout/activity_advanced.xml b/app/src/main/res/layout/activity_advanced.xml index 228b17e..0d221b5 100644 --- a/app/src/main/res/layout/activity_advanced.xml +++ b/app/src/main/res/layout/activity_advanced.xml @@ -25,11 +25,13 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> + + android:inputType="textUri|textWebEditText" /> Advanced Options Please wait. This may take up to 20 seconds. File Link - + Error - Volley cannot get file data for app icon + Cannot find custom banner packs for non-apps + diff --git a/build.gradle b/build.gradle index fb4ca1e..d890b3f 100644 --- a/build.gradle +++ b/build.gradle @@ -5,8 +5,8 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.+' - classpath 'com.google.gms:google-services:3.0.0' + classpath 'com.android.tools.build:gradle:2.2.0' + classpath 'com.google.gms:google-services:3.1.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } @@ -15,6 +15,9 @@ buildscript { allprojects { repositories { jcenter() + maven { + url "https://maven.google.com" + } } }