diff --git a/app/build.gradle b/app/build.gradle index 2930c8de..8ee31f17 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,8 +14,8 @@ android { applicationId "io.lbry.browser" minSdkVersion 21 targetSdkVersion 29 - versionCode 1611 - versionName "0.16.11" + versionCode 1612 + versionName "0.16.12" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -118,7 +118,7 @@ dependencies { androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' - __32bitImplementation 'io.lbry:lbrysdk32:0.86.1' -// __64bitImplementation 'io.lbry:lbrysdk64:0.86.1' + __32bitImplementation 'io.lbry:lbrysdk32:0.87.0' +// __64bitImplementation 'io.lbry:lbrysdk64:0.87.0' } diff --git a/app/src/main/java/io/lbry/browser/MainActivity.java b/app/src/main/java/io/lbry/browser/MainActivity.java index 03ec288d..1630f183 100644 --- a/app/src/main/java/io/lbry/browser/MainActivity.java +++ b/app/src/main/java/io/lbry/browser/MainActivity.java @@ -40,6 +40,7 @@ import android.view.KeyEvent; import android.view.MenuItem; import android.view.View; import android.view.Menu; +import android.view.ViewGroup; import android.view.WindowManager; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; @@ -2661,6 +2662,23 @@ public class MainActivity extends AppCompatActivity implements SdkStatusListener StartupStageAdapter adapter = new StartupStageAdapter(this, startupStages); listView.setAdapter(adapter); + // Add 1 pixel to listview height + int listHeight = Math.round(getResources().getDisplayMetrics().density); + + for (int i = 0; i < startupStages.size(); i++) { + View item = adapter.getView(i, null, listView); + item.measure(0, 0); + listHeight += item.getMeasuredHeight(); + } + + // Properly set listview height by adding all seven items and the divider heights + // and the additional 1 pixel so no vertical scroll bar is shown + ViewGroup.LayoutParams params = listView.getLayoutParams(); + params.height = listHeight + (listView.getCount() + 1) * listView.getDividerHeight(); + listView.setLayoutParams(params); + listView.invalidate(); + listView.requestLayout(); + findViewById(R.id.splash_view_loading_container).setVisibility(View.GONE); findViewById(R.id.splash_view_error_container).setVisibility(View.VISIBLE); } @@ -3007,6 +3025,17 @@ public class MainActivity extends AppCompatActivity implements SdkStatusListener String action = intent.getAction(); if (LbrynetService.ACTION_STOP_SERVICE.equals(action)) { MainActivity.this.receivedStopService = true; + + // STOP is meant to close everything, + // So destroy the player at this point (even with background play enabled) + if (appPlayer != null) { + playerNotificationManager.setPlayer(null); + stopExoplayer(); + nowPlayingClaim = null; + nowPlayingClaimUrl = null; + nowPlayingClaimBitmap = null; + } + MainActivity.this.finish(); } else if (LbrynetService.LBRY_SDK_SERVICE_STARTED.equals(action)) { // Rebuild the service notification diff --git a/app/src/main/java/io/lbry/browser/ui/channel/ChannelCommentsFragment.java b/app/src/main/java/io/lbry/browser/ui/channel/ChannelCommentsFragment.java index ce6dc6c3..c32d0f05 100644 --- a/app/src/main/java/io/lbry/browser/ui/channel/ChannelCommentsFragment.java +++ b/app/src/main/java/io/lbry/browser/ui/channel/ChannelCommentsFragment.java @@ -441,21 +441,7 @@ public class ChannelCommentsFragment extends Fragment implements SdkStatusListen return; } - Context context = getContext(); - if (context != null) { - String titleText = getResources().getString(R.string.comment_confirm_post); - String confirmText = getResources().getString(R.string.confirm_post_comment); - AlertDialog.Builder builder = new AlertDialog.Builder(context). - setTitle(titleText). - setMessage(confirmText) - .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - postComment(); - } - }).setNegativeButton(R.string.no, null); - builder.show(); - } + postComment(); } private void updatePostAsChannel(Claim channel) { 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 75750775..f7bb34e3 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 @@ -252,37 +252,22 @@ public class ChannelFragment extends BaseFragment implements FetchChannelsListen return; } - subscribing = true; boolean isFollowing = Lbryio.isFollowing(claim); - Subscription subscription = Subscription.fromClaim(claim); - view.setEnabled(false); - new ChannelSubscribeTask(getContext(), claim.getClaimId(), subscription, isFollowing, new ChannelSubscribeTask.ChannelSubscribeHandler() { - @Override - public void onSuccess() { - if (isFollowing) { - Lbryio.removeSubscription(subscription); - Lbryio.removeCachedResolvedSubscription(claim); - } else { - Lbryio.addSubscription(subscription); - Lbryio.addCachedResolvedSubscription(claim); - } - buttonFollowUnfollow.setEnabled(true); - subscribing = false; - checkIsFollowing(); - FollowingFragment.resetClaimSearchContent = true; - - Context context = getContext(); - if (context != null) { - context.sendBroadcast(new Intent(MainActivity.ACTION_SAVE_SHARED_USER_STATE)); - } - } - - @Override - public void onError(Exception exception) { - buttonFollowUnfollow.setEnabled(true); - subscribing = false; - } - }).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + if (isFollowing) { + Context context = getContext(); + AlertDialog.Builder builder = new AlertDialog.Builder(context). + setTitle(R.string.confirm_unfollow). + setMessage(R.string.confirm_unfollow_message) + .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + doFollowUnfollow(isFollowing, view); + } + }).setNegativeButton(R.string.no, null); + builder.show(); + } else { + doFollowUnfollow(isFollowing, view); + } } } }); @@ -290,6 +275,39 @@ public class ChannelFragment extends BaseFragment implements FetchChannelsListen return root; } + private void doFollowUnfollow(boolean isFollowing, View view) { + subscribing = true; + Subscription subscription = Subscription.fromClaim(claim); + view.setEnabled(false); + new ChannelSubscribeTask(getContext(), claim.getClaimId(), subscription, isFollowing, new ChannelSubscribeTask.ChannelSubscribeHandler() { + @Override + public void onSuccess() { + if (isFollowing) { + Lbryio.removeSubscription(subscription); + Lbryio.removeCachedResolvedSubscription(claim); + } else { + Lbryio.addSubscription(subscription); + Lbryio.addCachedResolvedSubscription(claim); + } + buttonFollowUnfollow.setEnabled(true); + subscribing = false; + checkIsFollowing(); + FollowingFragment.resetClaimSearchContent = true; + + Context context = getContext(); + if (context != null) { + context.sendBroadcast(new Intent(MainActivity.ACTION_SAVE_SHARED_USER_STATE)); + } + } + + @Override + public void onError(Exception exception) { + buttonFollowUnfollow.setEnabled(true); + subscribing = false; + } + }).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + private void deleteCurrentClaim() { if (claim != null) { Helper.setViewVisibility(layoutDisplayArea, View.GONE); 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 2d6c04ab..547228b5 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 @@ -823,42 +823,64 @@ public class FileViewFragment extends BaseFragment implements private View.OnClickListener followUnfollowListener = new View.OnClickListener() { @Override - public void onClick(View view) { + public void onClick(final View view) { if (claim != null && claim.getSigningChannel() != null) { Claim publisher = claim.getSigningChannel(); boolean isFollowing = Lbryio.isFollowing(publisher); - Subscription subscription = Subscription.fromClaim(publisher); - view.setEnabled(false); - Context context = getContext(); - new ChannelSubscribeTask(context, publisher.getClaimId(), subscription, isFollowing, new ChannelSubscribeTask.ChannelSubscribeHandler() { - @Override - public void onSuccess() { - if (isFollowing) { - Lbryio.removeSubscription(subscription); - Lbryio.removeCachedResolvedSubscription(publisher); - } else { - Lbryio.addSubscription(subscription); - Lbryio.addCachedResolvedSubscription(publisher); - } - view.setEnabled(true); - checkIsFollowing(); - FollowingFragment.resetClaimSearchContent = true; - - // Save shared user state - if (context != null) { - context.sendBroadcast(new Intent(MainActivity.ACTION_SAVE_SHARED_USER_STATE)); - } - } - - @Override - public void onError(Exception exception) { - view.setEnabled(true); - } - }).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + if (isFollowing) { + // show unfollow confirmation + Context context = getContext(); + AlertDialog.Builder builder = new AlertDialog.Builder(context). + setTitle(R.string.confirm_unfollow). + setMessage(R.string.confirm_unfollow_message) + .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + doFollowUnfollow(isFollowing, view); + } + }).setNegativeButton(R.string.no, null); + builder.show(); + } else { + doFollowUnfollow(isFollowing, view); + } } } }; + private void doFollowUnfollow(boolean isFollowing, View view) { + if (claim != null && claim.getSigningChannel() != null) { + Claim publisher = claim.getSigningChannel(); + Subscription subscription = Subscription.fromClaim(publisher); + view.setEnabled(false); + Context context = getContext(); + new ChannelSubscribeTask(context, publisher.getClaimId(), subscription, isFollowing, new ChannelSubscribeTask.ChannelSubscribeHandler() { + @Override + public void onSuccess() { + if (isFollowing) { + Lbryio.removeSubscription(subscription); + Lbryio.removeCachedResolvedSubscription(publisher); + } else { + Lbryio.addSubscription(subscription); + Lbryio.addCachedResolvedSubscription(publisher); + } + view.setEnabled(true); + checkIsFollowing(); + FollowingFragment.resetClaimSearchContent = true; + + // Save shared user state + if (context != null) { + context.sendBroadcast(new Intent(MainActivity.ACTION_SAVE_SHARED_USER_STATE)); + } + } + + @Override + public void onError(Exception exception) { + view.setEnabled(true); + } + }).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + } + private void resolveUrl(String url) { resolving = true; Helper.setViewVisibility(layoutDisplayArea, View.INVISIBLE); @@ -3033,21 +3055,7 @@ public class FileViewFragment extends BaseFragment implements return; } - Context context = getContext(); - if (context != null) { - String titleText = getResources().getString(R.string.comment_confirm_post); - String confirmText = getResources().getString(R.string.confirm_post_comment); - AlertDialog.Builder builder = new AlertDialog.Builder(context). - setTitle(titleText). - setMessage(confirmText) - .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - postComment(); - } - }).setNegativeButton(R.string.no, null); - builder.show(); - } + postComment(); } private void updatePostAsChannel(Claim channel) { diff --git a/app/src/main/java/io/lbry/browser/ui/wallet/WalletFragment.java b/app/src/main/java/io/lbry/browser/ui/wallet/WalletFragment.java index c22a4109..69ff7690 100644 --- a/app/src/main/java/io/lbry/browser/ui/wallet/WalletFragment.java +++ b/app/src/main/java/io/lbry/browser/ui/wallet/WalletFragment.java @@ -463,7 +463,7 @@ public class WalletFragment extends BaseFragment implements SdkStatusListener, W double sentAmount = actualSendAmount; String message = getResources().getQuantityString( R.plurals.you_sent_credits, sentAmount == 1.0 ? 1 : 2, - new DecimalFormat("#,###.##").format(sentAmount)); + new DecimalFormat("#,###.####").format(sentAmount)); Helper.setViewText(inputSendAddress, null); Helper.setViewText(inputSendAmount, null); if (view != null) { diff --git a/app/src/main/res/layout/app_bar_main.xml b/app/src/main/res/layout/app_bar_main.xml index a5c63065..3b46df68 100644 --- a/app/src/main/res/layout/app_bar_main.xml +++ b/app/src/main/res/layout/app_bar_main.xml @@ -159,10 +159,11 @@ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b5e22db8..53ae3a40 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -88,8 +88,6 @@ Please enter a comment to post. Please select a channel to post your comment as. Post - Confirm your comment - This will post your comment Your comment was successfully posted. Please select a channel to repost on. Reply @@ -103,6 +101,18 @@ This will purchase "%1$s" for %2$s credit This will purchase "%1$s" for %2$s credits + + Post and tip %1$s credit? + Post and tip %1$s credits? + + + Post for %1$s credit + Post for %1$s credits + + + This will post your comment with a tip of %1$s credit for %2$s + This will post your comment with a tip of %1$s credits for %2$s + There\'s nothing here yet.\nPlease check back later. @@ -111,6 +121,8 @@ reposted You will receive all notifications You will not receive notifications for this channel + Stop following channel? + Are you sure you want to stop following this channel? %1$s follower %1$s followers