Compare commits

..

2 commits

Author SHA1 Message Date
pixel
ad31ff758c I'm working to display share button when long press on a claim #1133.
(https://github.com/lbryio/lbry-android/issues/1133)

 So far, I've got it working pretty well. Now, there's quite a few ways to implement a menu after a long press. Signal Messenger has a cool UI for when users long click on a message. But other apps like NewPipe just use a dialog to display other options.

 To keep things simple, I used a popup menu. Now, I added other menu items that you'd see in the FileViewFragment (download, repost, etc.). I added these because only putting "share" in the menu didn't seem like much of a menu.

 "Share" is the only menu item that actually works right now.
2021-10-01 17:34:04 -04:00
pixel
7c0ad62a98 I'm working to display share button when long press on a claim #1133.
(https://github.com/lbryio/lbry-android/issues/1133)

 So far, I've located the longClick method in the claimadapter.
 I put some Log.d messages to confirm that I can do something when I long press.
 Evreything's working so it looks like I can progress to implement a menu kind of selection for sharing.
2021-10-01 17:34:04 -04:00
6 changed files with 113 additions and 5 deletions

View file

@ -1 +0,0 @@

View file

@ -28,8 +28,6 @@ twitterConsumerKey=XXXXXX
twitterConsumerSecret=XXXXXX twitterConsumerSecret=XXXXXX
``` ```
Copy the file 'google-services.sample.json' to 'google-services.json' in the app/ folder.
Click the Sync button and when process finishes, the Run button to launch the app on your simulator or connected debugging device after the build process is complete. Click the Sync button and when process finishes, the Run button to launch the app on your simulator or connected debugging device after the build process is complete.
## Contributing ## Contributing
@ -39,7 +37,7 @@ Contributions to this project are welcome, encouraged, and compensated. For more
This project is MIT licensed. For the full license, see [LICENSE](LICENSE). This project is MIT licensed. For the full license, see [LICENSE](LICENSE).
## Security ## Security
We take security seriously. Please contact security@lbry.com regarding any security issues. Our PGP key is [here](https://lbry.com/faq/pgp-key) if you need it. We take security seriously. Please contact security@lbry.com regarding any security issues. Our PGP key is [here](https://keybase.io/lbry/key.asc) if you need it.
## Contact ## Contact
The primary contact for this project is [@akinwale](https://github.com/akinwale) (akinwale@lbry.com) The primary contact for this project is [@akinwale](https://github.com/akinwale) (akinwale@lbry.com)

View file

@ -1,14 +1,20 @@
package io.lbry.browser.adapter; package io.lbry.browser.adapter;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.text.format.DateUtils; import android.text.format.DateUtils;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.widget.PopupMenu;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
@ -21,7 +27,9 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import io.lbry.browser.MainActivity;
import io.lbry.browser.R; import io.lbry.browser.R;
import io.lbry.browser.exceptions.LbryUriException;
import io.lbry.browser.listener.SelectionModeListener; import io.lbry.browser.listener.SelectionModeListener;
import io.lbry.browser.model.Claim; import io.lbry.browser.model.Claim;
import io.lbry.browser.model.LbryFile; import io.lbry.browser.model.LbryFile;
@ -32,6 +40,7 @@ import lombok.Getter;
import lombok.Setter; import lombok.Setter;
public class ClaimListAdapter extends RecyclerView.Adapter<ClaimListAdapter.ViewHolder> { public class ClaimListAdapter extends RecyclerView.Adapter<ClaimListAdapter.ViewHolder> {
private static final String TAG = ClaimListAdapter.class.getSimpleName();
private static final int VIEW_TYPE_STREAM = 1; private static final int VIEW_TYPE_STREAM = 1;
private static final int VIEW_TYPE_CHANNEL = 2; private static final int VIEW_TYPE_CHANNEL = 2;
private static final int VIEW_TYPE_FEATURED = 3; // featured search result private static final int VIEW_TYPE_FEATURED = 3; // featured search result
@ -369,6 +378,11 @@ public class ClaimListAdapter extends RecyclerView.Adapter<ClaimListAdapter.View
vh.itemView.setOnLongClickListener(new View.OnLongClickListener() { vh.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override @Override
public boolean onLongClick(View view) { public boolean onLongClick(View view) {
if (original != null) {
showClaimPopupMenu(view, original);
}
if (!canEnterSelectionMode) { if (!canEnterSelectionMode) {
return false; return false;
} }
@ -519,6 +533,79 @@ public class ClaimListAdapter extends RecyclerView.Adapter<ClaimListAdapter.View
notifyDataSetChanged(); notifyDataSetChanged();
} }
public void showClaimPopupMenu(View view, Claim claim) {
Toast.makeText(context, "LONG CLICKED: " + claim.getTitle(), Toast.LENGTH_SHORT).show(); //Don't need, but it's nice to see it on the UI
Log.d(TAG, "LONG CLICKED: " + claim.getTitle());
//do I need to do a check if context is null?
PopupMenu popup = new PopupMenu(context, view);
popup.getMenuInflater().inflate(R.menu.menu_claim_popup, popup.getMenu());
popup.setGravity(Gravity.END);
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
int i = item.getItemId();
if (i == R.id.menu_claim_popup_share) {
//share the claim
Log.d(TAG, "Let's share: " + claim.getTitle());
try{
String shareUrl = LbryUri.parse(
!Helper.isNullOrEmpty(claim.getCanonicalUrl()) ? claim.getCanonicalUrl() :
(!Helper.isNullOrEmpty(claim.getShortUrl()) ? claim.getShortUrl() : claim.getPermanentUrl())).toTvString();
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT, shareUrl);
MainActivity.startingShareActivity = true;
Intent shareUrlIntent = Intent.createChooser(shareIntent, context.getString(R.string.share_lbry_content));
shareUrlIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(shareUrlIntent);
Log.d(TAG, "Sharing: " + shareUrl);
} catch (LbryUriException lbryUriException){
lbryUriException.printStackTrace();
}
return true;
}
else if (i == R.id.menu_claim_popup_support){
//support the claim
Log.d(TAG, "Let's support: " + claim.getTitle());
return true;
}
else if (i == R.id.menu_claim_popup_repost) {
//repost the claim
Log.d(TAG, "Let's repost: " + claim.getTitle());
return true;
}
else if (i == R.id.menu_claim_popup_download) {
//download the claim
Log.d(TAG, "Let's download: " + claim.getTitle());
return true;
}
else if (i == R.id.menu_claim_popup_report) {
//report the claim
Log.d(TAG, "Let's report: " + claim.getTitle());
return true;
}
else {
return onMenuItemClick(item);
}
}
});
popup.show();
}
public interface ClaimListItemListener { public interface ClaimListItemListener {
void onClaimClicked(Claim claim); void onClaimClicked(Claim claim);
} }

View file

@ -51,7 +51,7 @@ public final class Lbry {
public static final int TTL_CLAIM_SEARCH_VALUE = 120000; // 2-minute TTL for cache public static final int TTL_CLAIM_SEARCH_VALUE = 120000; // 2-minute TTL for cache
public static final String SDK_CONNECTION_STRING = "http://127.0.0.1:5279"; public static final String SDK_CONNECTION_STRING = "http://127.0.0.1:5279";
public static final String LBRY_TV_CONNECTION_STRING = "https://api.na-backend.odysee.com/api/v1/proxy"; public static final String LBRY_TV_CONNECTION_STRING = "https://api.lbry.tv/api/v1/proxy";
public static final String TAG = "Lbry"; public static final String TAG = "Lbry";
// Values to obtain from LBRY SDK status // Values to obtain from LBRY SDK status

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_claim_popup_share"
android:title="@string/share" />
<item android:id="@+id/menu_claim_popup_support"
android:title="@string/support" />
<item android:id="@+id/menu_claim_popup_repost"
android:title="@string/repost" />
<item android:id="@+id/menu_claim_popup_download"
android:title="@string/download" />
<item android:id="@+id/menu_claim_popup_report"
android:title="@string/report" />
</menu>

View file

@ -9,6 +9,7 @@
<item name="windowActionModeOverlay">true</item> <item name="windowActionModeOverlay">true</item>
<item name="android:windowBackground">@color/colorPrimaryDark</item> <item name="android:windowBackground">@color/colorPrimaryDark</item>
<item name="drawerArrowStyle">@style/AppTheme.DrawerArrowStyle</item> <item name="drawerArrowStyle">@style/AppTheme.DrawerArrowStyle</item>
<item name="popupMenuStyle">@style/ClaimPopupMenu</item>
<!--item name="android:windowLightStatusBar">true</item--> <!--item name="android:windowLightStatusBar">true</item-->
</style> </style>
@ -32,4 +33,9 @@
<item name="color">@color/actionBarForeground</item> <item name="color">@color/actionBarForeground</item>
</style> </style>
<style name="ClaimPopupMenu" parent="Widget.AppCompat.PopupMenu">
<item name="android:dropDownHorizontalOffset">-8dp</item>
<item name="android:dropDownVerticalOffset">8dp</item>
</style>
</resources> </resources>