From b60b5d16c38c0643864afc7dd6c1cf42f2491931 Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Sun, 24 May 2020 10:11:31 +0100 Subject: [PATCH] fix crash bugs reported in Play Store --- app/build.gradle | 1 + .../browser/tasks/MergeSubscriptionsTask.java | 10 +++-- .../browser/tasks/claim/ClaimListTask.java | 3 +- .../browser/tasks/claim/ClaimSearchTask.java | 4 +- .../tasks/wallet/LoadSharedUserStateTask.java | 2 +- .../browser/ui/channel/ChannelFragment.java | 26 ++++++------ .../ui/findcontent/FileViewFragment.java | 20 ++++++--- .../ui/findcontent/FollowingFragment.java | 32 ++++++++------- .../ui/findcontent/SearchFragment.java | 41 +++++++++++-------- .../browser/ui/publish/PublishFragment.java | 17 ++++---- .../java/io/lbry/browser/utils/Helper.java | 3 ++ .../io/lbry/browser/utils/LbryAnalytics.java | 15 ++++++- 12 files changed, 108 insertions(+), 66 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7a6f27a..44bc168 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -63,6 +63,7 @@ dependencies { implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0' implementation 'androidx.preference:preference:1.1.1' implementation 'androidx.webkit:webkit:1.3.0-alpha02' + implementation 'androidx.camera:camera-core:1.0.0-beta03' implementation 'androidx.camera:camera-camera2:1.0.0-beta03' implementation 'androidx.camera:camera-lifecycle:1.0.0-beta03' implementation 'androidx.camera:camera-view:1.0.0-alpha10' diff --git a/app/src/main/java/io/lbry/browser/tasks/MergeSubscriptionsTask.java b/app/src/main/java/io/lbry/browser/tasks/MergeSubscriptionsTask.java index 892ad6b..3d3a49c 100644 --- a/app/src/main/java/io/lbry/browser/tasks/MergeSubscriptionsTask.java +++ b/app/src/main/java/io/lbry/browser/tasks/MergeSubscriptionsTask.java @@ -84,9 +84,13 @@ public class MergeSubscriptionsTask extends AsyncTask options = new HashMap<>(); - options.put("claim_id", uri.getChannelClaimId()); - options.put("channel_name", Helper.normalizeChannelName(local.getChannelName())); - Lbryio.parseResponse(Lbryio.call("subscription", "new", options, context)); + String channelClaimId = uri.getChannelClaimId(); + String channelName = Helper.normalizeChannelName(local.getChannelName()); + if (!Helper.isNullOrEmpty(channelClaimId) && !Helper.isNullOrEmpty(channelName)) { + options.put("claim_id", channelClaimId); + options.put("channel_name", channelName); + Lbryio.parseResponse(Lbryio.call("subscription", "new", options, context)); + } } catch (LbryUriException | LbryioRequestException | LbryioResponseException ex) { // pass Log.e(TAG, String.format("subscription/new failed: %s", ex.getMessage()), ex); diff --git a/app/src/main/java/io/lbry/browser/tasks/claim/ClaimListTask.java b/app/src/main/java/io/lbry/browser/tasks/claim/ClaimListTask.java index b017a0b..592aab5 100644 --- a/app/src/main/java/io/lbry/browser/tasks/claim/ClaimListTask.java +++ b/app/src/main/java/io/lbry/browser/tasks/claim/ClaimListTask.java @@ -62,7 +62,8 @@ public class ClaimListTask extends AsyncTask> { Helper.setViewVisibility(progressView, View.GONE); if (handler != null) { if (claims != null) { - handler.onSuccess(claims); + // TODO: Add fix for handling invalid reposts in ClaimListAdapter + handler.onSuccess(Helper.filterInvalidReposts(claims)); } else { handler.onError(error); } diff --git a/app/src/main/java/io/lbry/browser/tasks/claim/ClaimSearchTask.java b/app/src/main/java/io/lbry/browser/tasks/claim/ClaimSearchTask.java index 696eb60..8b243b8 100644 --- a/app/src/main/java/io/lbry/browser/tasks/claim/ClaimSearchTask.java +++ b/app/src/main/java/io/lbry/browser/tasks/claim/ClaimSearchTask.java @@ -29,7 +29,7 @@ public class ClaimSearchTask extends AsyncTask> { } protected List doInBackground(Void... params) { try { - return Helper.filterInvalidReposts(Lbry.claimSearch(options, connectionString)); + return Lbry.claimSearch(options, connectionString); } catch (ApiCallException ex) { error = ex; return null; @@ -39,7 +39,7 @@ public class ClaimSearchTask extends AsyncTask> { Helper.setViewVisibility(progressView, View.GONE); if (handler != null) { if (claims != null) { - handler.onSuccess(claims, claims.size() < Helper.parseInt(options.get("page_size"), 0)); + handler.onSuccess(Helper.filterInvalidReposts(claims), claims.size() < Helper.parseInt(options.get("page_size"), 0)); } else { handler.onError(error); } diff --git a/app/src/main/java/io/lbry/browser/tasks/wallet/LoadSharedUserStateTask.java b/app/src/main/java/io/lbry/browser/tasks/wallet/LoadSharedUserStateTask.java index ac94112..244840a 100644 --- a/app/src/main/java/io/lbry/browser/tasks/wallet/LoadSharedUserStateTask.java +++ b/app/src/main/java/io/lbry/browser/tasks/wallet/LoadSharedUserStateTask.java @@ -105,7 +105,7 @@ public class LoadSharedUserStateTask extends AsyncTask { if (db != null) { DatabaseHelper.createOrUpdateTag(tag, db); } - } catch (SQLiteException ex) { + } catch (SQLiteException | IllegalStateException ex) { // pass } } diff --git a/app/src/main/java/io/lbry/browser/ui/channel/ChannelFragment.java b/app/src/main/java/io/lbry/browser/ui/channel/ChannelFragment.java index 3299aec..ff6750a 100644 --- a/app/src/main/java/io/lbry/browser/ui/channel/ChannelFragment.java +++ b/app/src/main/java/io/lbry/browser/ui/channel/ChannelFragment.java @@ -322,19 +322,21 @@ public class ChannelFragment extends BaseFragment implements FetchChannelsListen boolean updateRequired = false; Map params = getParams(); - if (params.containsKey("claim")) { - Claim claim = (Claim) params.get("claim"); - if (claim != null && !claim.equals(this.claim)) { - this.claim = claim; - updateRequired = true; + if (params != null) { + if (params.containsKey("claim")) { + Claim claim = (Claim) params.get("claim"); + if (claim != null && !claim.equals(this.claim)) { + this.claim = claim; + updateRequired = true; + } } - } - if (params.containsKey("url")) { - String newUrl = params.get("url").toString(); - if (claim == null || !newUrl.equalsIgnoreCase(url)) { - this.claim = null; - this.url = newUrl; - updateRequired = true; + if (params.containsKey("url")) { + String newUrl = params.get("url").toString(); + if (claim == null || !newUrl.equalsIgnoreCase(url)) { + this.claim = null; + this.url = newUrl; + updateRequired = true; + } } } diff --git a/app/src/main/java/io/lbry/browser/ui/findcontent/FileViewFragment.java b/app/src/main/java/io/lbry/browser/ui/findcontent/FileViewFragment.java index e6bcbb6..ed0e9f6 100644 --- a/app/src/main/java/io/lbry/browser/ui/findcontent/FileViewFragment.java +++ b/app/src/main/java/io/lbry/browser/ui/findcontent/FileViewFragment.java @@ -1104,7 +1104,9 @@ public class FileViewFragment extends BaseFragment implements @Override public void onError(Exception error) { actionDelete.setEnabled(true); - showError(error.getMessage()); + if (error != null) { + showError(error.getMessage()); + } } }); task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); @@ -2055,17 +2057,23 @@ public class FileViewFragment extends BaseFragment implements if (claim != null) { claim.setFile(null); } - ((ImageView) getView().findViewById(R.id.file_view_action_download_icon)).setImageResource(R.drawable.ic_download); - Helper.setViewVisibility(getView().findViewById(R.id.file_view_download_progress), View.GONE); - Helper.setViewVisibility(getView().findViewById(R.id.file_view_unsupported_container), View.GONE); + View root = getView(); + if (root != null) { + ((ImageView) root.findViewById(R.id.file_view_action_download_icon)).setImageResource(R.drawable.ic_download); + Helper.setViewVisibility(root.findViewById(R.id.file_view_download_progress), View.GONE); + Helper.setViewVisibility(root.findViewById(R.id.file_view_unsupported_container), View.GONE); + } checkIsFileComplete(); restoreMainActionButton(); } private void restoreMainActionButton() { - getView().findViewById(R.id.file_view_main_action_loading).setVisibility(View.INVISIBLE); - getView().findViewById(R.id.file_view_main_action_button).setVisibility(View.VISIBLE); + View root = getView(); + if (root != null) { + root.findViewById(R.id.file_view_main_action_loading).setVisibility(View.INVISIBLE); + root.findViewById(R.id.file_view_main_action_button).setVisibility(View.VISIBLE); + } } @Override diff --git a/app/src/main/java/io/lbry/browser/ui/findcontent/FollowingFragment.java b/app/src/main/java/io/lbry/browser/ui/findcontent/FollowingFragment.java index de7052c..2e4b84f 100644 --- a/app/src/main/java/io/lbry/browser/ui/findcontent/FollowingFragment.java +++ b/app/src/main/java/io/lbry/browser/ui/findcontent/FollowingFragment.java @@ -524,8 +524,9 @@ public class FollowingFragment extends BaseFragment implements } private void updateChannelFilterListAdapter(List resolvedSubs, boolean reset) { - if (channelFilterListAdapter == null) { - channelFilterListAdapter = new ChannelFilterListAdapter(getContext()); + Context context = getContext(); + if (channelFilterListAdapter == null && context != null) { + channelFilterListAdapter = new ChannelFilterListAdapter(context); channelFilterListAdapter.setListener(new ChannelItemSelectionListener() { @Override public void onChannelItemSelected(Claim claim) { @@ -560,14 +561,16 @@ public class FollowingFragment extends BaseFragment implements }); } - if (horizontalChannelList != null && horizontalChannelList.getAdapter() == null) { - horizontalChannelList.setAdapter(channelFilterListAdapter); + if (channelFilterListAdapter != null) { + if (horizontalChannelList != null && horizontalChannelList.getAdapter() == null) { + horizontalChannelList.setAdapter(channelFilterListAdapter); + } + if (reset) { + channelFilterListAdapter.clearClaims(); + channelFilterListAdapter.setSelectedItem(null); + } + channelFilterListAdapter.addClaims(resolvedSubs); } - if (reset) { - channelFilterListAdapter.clearClaims(); - channelFilterListAdapter.setSelectedItem(null); - } - channelFilterListAdapter.addClaims(resolvedSubs); } private void fetchClaimSearchContent() { @@ -626,11 +629,12 @@ public class FollowingFragment extends BaseFragment implements } private void updateSuggestedDoneButtonText() { - int selected = suggestedChannelAdapter == null ? 0 : suggestedChannelAdapter.getSelectedCount(); - int remaining = MIN_SUGGESTED_SUBSCRIBE_COUNT - selected; - String buttonText = remaining <= 0 ? getString(R.string.done) : getString(R.string.n_remaining, remaining); - if (suggestedDoneButton != null) { - suggestedDoneButton.setText(buttonText); + Context context = getContext(); + if (context != null) { + int selected = suggestedChannelAdapter == null ? 0 : suggestedChannelAdapter.getSelectedCount(); + int remaining = MIN_SUGGESTED_SUBSCRIBE_COUNT - selected; + String buttonText = remaining <= 0 ? getString(R.string.done) : getString(R.string.n_remaining, remaining); + Helper.setViewText(suggestedDoneButton, buttonText); } } diff --git a/app/src/main/java/io/lbry/browser/ui/findcontent/SearchFragment.java b/app/src/main/java/io/lbry/browser/ui/findcontent/SearchFragment.java index 901d57f..4f6050a 100644 --- a/app/src/main/java/io/lbry/browser/ui/findcontent/SearchFragment.java +++ b/app/src/main/java/io/lbry/browser/ui/findcontent/SearchFragment.java @@ -239,31 +239,36 @@ public class SearchFragment extends BaseFragment implements public void onSuccess(List claims, boolean hasReachedEnd) { contentHasReachedEnd = hasReachedEnd; searchLoading = false; - - if (resultListAdapter == null) { - resultListAdapter = new ClaimListAdapter(claims, getContext()); - resultListAdapter.addFeaturedItem(buildFeaturedItem(query)); - resolveFeaturedItem(buildVanityUrl(query)); - resultListAdapter.setListener(SearchFragment.this); - if (resultList != null) { - resultList.setAdapter(resultListAdapter); + Context context = getContext(); + if (context != null) { + if (resultListAdapter == null) { + resultListAdapter = new ClaimListAdapter(claims, context); + resultListAdapter.addFeaturedItem(buildFeaturedItem(query)); + resolveFeaturedItem(buildVanityUrl(query)); + resultListAdapter.setListener(SearchFragment.this); + if (resultList != null) { + resultList.setAdapter(resultListAdapter); + } + } else { + resultListAdapter.addItems(claims); } - } else { - resultListAdapter.addItems(claims); - } - int itemCount = resultListAdapter.getItemCount(); - noQueryView.setVisibility(View.GONE); - noResultsView.setVisibility(itemCount == 0 ? View.VISIBLE : View.GONE); - noResultsView.setText(getString(R.string.search_no_results, currentQuery)); + int itemCount = resultListAdapter.getItemCount(); + Helper.setViewVisibility(noQueryView, View.GONE); + Helper.setViewVisibility(noResultsView, itemCount == 0 ? View.VISIBLE : View.GONE); + Helper.setViewText(noResultsView, getString(R.string.search_no_results, currentQuery)); + } } @Override public void onError(Exception error) { + Context context = getContext(); int itemCount = resultListAdapter == null ? 0 : resultListAdapter.getItemCount(); - noQueryView.setVisibility(View.GONE); - noResultsView.setVisibility(itemCount == 0 ? View.VISIBLE : View.GONE); - noResultsView.setText(getString(R.string.search_no_results, currentQuery)); + Helper.setViewVisibility(noQueryView, View.GONE); + Helper.setViewVisibility(noResultsView, itemCount == 0 ? View.VISIBLE : View.GONE); + if (context != null) { + Helper.setViewText(noResultsView, getString(R.string.search_no_results, currentQuery)); + } searchLoading = false; } }); diff --git a/app/src/main/java/io/lbry/browser/ui/publish/PublishFragment.java b/app/src/main/java/io/lbry/browser/ui/publish/PublishFragment.java index af3a7ef..bd4dd9c 100644 --- a/app/src/main/java/io/lbry/browser/ui/publish/PublishFragment.java +++ b/app/src/main/java/io/lbry/browser/ui/publish/PublishFragment.java @@ -52,6 +52,7 @@ import io.lbry.browser.utils.LbryAnalytics; public class PublishFragment extends BaseFragment implements CameraPermissionListener, FilePickerListener, StoragePermissionListener { + private boolean cameraPreviewInitialized; private PreviewView cameraPreview; private RecyclerView galleryGrid; private GalleryGridAdapter adapter; @@ -122,7 +123,7 @@ public class PublishFragment extends BaseFragment implements private void displayPreviewWithCameraX() { Context context = getContext(); - if (context != null) { + if (context != null && MainActivity.hasPermission(Manifest.permission.CAMERA, context)) { cameraProviderFuture = ProcessCameraProvider.getInstance(context); cameraProviderFuture.addListener(new Runnable() { @Override @@ -137,6 +138,7 @@ public class PublishFragment extends BaseFragment implements Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner) context, cameraSelector, preview); preview.setSurfaceProvider(cameraPreview.createSurfaceProvider(camera.getCameraInfo())); + cameraPreviewInitialized = true; } } catch (ExecutionException | InterruptedException ex) { // pass @@ -267,7 +269,9 @@ public class PublishFragment extends BaseFragment implements activity.removeFilePickerListener(this); } } - CameraX.unbindAll(); + if (cameraPreviewInitialized) { + CameraX.unbindAll(); + } super.onStop(); } @@ -361,13 +365,13 @@ public class PublishFragment extends BaseFragment implements public void onCameraPermissionRefused() { if (takePhotoPending) { takePhotoPending = false; - Snackbar.make(getView(), R.string.camera_permission_rationale_photo, Toast.LENGTH_LONG). + Snackbar.make(getView(), R.string.camera_permission_rationale_photo, Snackbar.LENGTH_LONG). setBackgroundTint(Color.RED).setTextColor(Color.WHITE).show(); return; } recordPending = false; - Snackbar.make(getView(), R.string.camera_permission_rationale_record, Toast.LENGTH_LONG). + Snackbar.make(getView(), R.string.camera_permission_rationale_record, Snackbar.LENGTH_LONG). setBackgroundTint(Color.RED).setTextColor(Color.WHITE).show(); } @@ -395,9 +399,8 @@ public class PublishFragment extends BaseFragment implements @Override public void onStoragePermissionRefused() { - Snackbar.make(getView(), R.string.storage_permission_rationale_videos, Snackbar.LENGTH_LONG).setBackgroundTint( - ContextCompat.getColor(getContext(), R.color.red) - ).show(); + Snackbar.make(getView(), R.string.storage_permission_rationale_videos, Snackbar.LENGTH_LONG). + setBackgroundTint(Color.RED).setTextColor(Color.WHITE).show(); } public String getSuggestedPublishUrl() { diff --git a/app/src/main/java/io/lbry/browser/utils/Helper.java b/app/src/main/java/io/lbry/browser/utils/Helper.java index 108d287..2bac1c0 100644 --- a/app/src/main/java/io/lbry/browser/utils/Helper.java +++ b/app/src/main/java/io/lbry/browser/utils/Helper.java @@ -705,6 +705,9 @@ public final class Helper { } } public static String normalizeChannelName(String channelName) { + if (Helper.isNullOrEmpty(channelName)) { + return ""; + } if (!channelName.startsWith("@")) { return String.format("@%s", channelName); } diff --git a/app/src/main/java/io/lbry/browser/utils/LbryAnalytics.java b/app/src/main/java/io/lbry/browser/utils/LbryAnalytics.java index ce20980..57162a2 100644 --- a/app/src/main/java/io/lbry/browser/utils/LbryAnalytics.java +++ b/app/src/main/java/io/lbry/browser/utils/LbryAnalytics.java @@ -32,8 +32,17 @@ public class LbryAnalytics { analytics = FirebaseAnalytics.getInstance(context); } + public static void checkInitAnalytics(Context context) { + if (analytics == null && context != null) { + analytics = FirebaseAnalytics.getInstance(context); + } + } + public static void setCurrentScreen(Activity activity, String name, String className) { - analytics.setCurrentScreen(activity, name, className); + checkInitAnalytics(activity); + if (analytics != null) { + analytics.setCurrentScreen(activity, name, className); + } } public static void logEvent(String name) { @@ -41,7 +50,9 @@ public class LbryAnalytics { } public static void logEvent(String name, Bundle bundle) { - analytics.logEvent(name, bundle); + if (analytics != null) { + analytics.logEvent(name, bundle); + } } public static void logException(String message, String exceptionName) {