From 5a0b625dc0856bc844480fca34c78920aa75a38b Mon Sep 17 00:00:00 2001 From: mvp76 Date: Wed, 16 Nov 2016 14:42:59 +0100 Subject: [PATCH] Add Nearby to share (if applicable) --- .../java/org/fdroid/fdroid/AppDetails2.java | 35 +++++++++++-- .../fdroid/views/ShareChooserDialog.java | 52 +++++++++++-------- 2 files changed, 60 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/AppDetails2.java b/app/src/main/java/org/fdroid/fdroid/AppDetails2.java index 6b38149e8..500a075a0 100644 --- a/app/src/main/java/org/fdroid/fdroid/AppDetails2.java +++ b/app/src/main/java/org/fdroid/fdroid/AppDetails2.java @@ -3,6 +3,7 @@ package org.fdroid.fdroid; import android.annotation.SuppressLint; import android.app.Activity; import android.app.PendingIntent; +import android.bluetooth.BluetoothAdapter; import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; import android.content.Context; @@ -35,6 +36,7 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.view.Window; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; @@ -68,13 +70,15 @@ import java.util.ArrayList; import static android.support.v7.widget.RecyclerView.NO_POSITION; -public class AppDetails2 extends AppCompatActivity { +public class AppDetails2 extends AppCompatActivity implements ShareChooserDialog.ShareChooserDialogListener { private static final String TAG = "AppDetails2"; + private static final int REQUEST_ENABLE_BLUETOOTH = 2; private static final int REQUEST_PERMISSION_DIALOG = 3; private static final int REQUEST_UNINSTALL_DIALOG = 4; + private FDroidApp mFDroidApp; private App mApp; private RecyclerView mRecyclerView; private AppDetailsRecyclerViewAdapter mAdapter; @@ -83,6 +87,8 @@ public class AppDetails2 extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { + mFDroidApp = (FDroidApp) getApplication(); + //mFDroidApp.applyTheme(this); super.onCreate(savedInstanceState); setContentView(R.layout.app_details2); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); @@ -160,12 +166,31 @@ public class AppDetails2 extends AppCompatActivity { shareIntent.setType("text/plain"); shareIntent.putExtra(Intent.EXTRA_SUBJECT, mApp.name); shareIntent.putExtra(Intent.EXTRA_TEXT, mApp.name + " (" + mApp.summary + ") - https://f-droid.org/app/" + mApp.packageName); - ShareChooserDialog.createChooser((CoordinatorLayout) findViewById(R.id.rootCoordinator), this, shareIntent); + + boolean showNearbyItem = mApp.isInstalled() && mFDroidApp.bluetoothAdapter != null; + ShareChooserDialog.createChooser((CoordinatorLayout) findViewById(R.id.rootCoordinator), this, this, shareIntent, showNearbyItem); return true; } return super.onOptionsItemSelected(item); } + @Override + public void onNearby() { + /* + * If Bluetooth has not been enabled/turned on, then + * enabling device discoverability will automatically enable Bluetooth + */ + Intent discoverBt = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); + discoverBt.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 121); + startActivityForResult(discoverBt, REQUEST_ENABLE_BLUETOOTH); + // if this is successful, the Bluetooth transfer is started + } + + @Override + public void onResolvedShareIntent(Intent shareIntent) { + startActivity(shareIntent); + } + public class AppDetailsRecyclerViewAdapter extends RecyclerView.Adapter { @@ -715,9 +740,9 @@ public class AppDetails2 extends AppCompatActivity { @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { - //case REQUEST_ENABLE_BLUETOOTH: - // fdroidApp.sendViaBluetooth(this, resultCode, app.packageName); - // break; + case REQUEST_ENABLE_BLUETOOTH: + mFDroidApp.sendViaBluetooth(this, resultCode, mApp.packageName); + break; case REQUEST_PERMISSION_DIALOG: if (resultCode == Activity.RESULT_OK) { Uri uri = data.getData(); diff --git a/app/src/main/java/org/fdroid/fdroid/views/ShareChooserDialog.java b/app/src/main/java/org/fdroid/fdroid/views/ShareChooserDialog.java index 691b1ebf7..cddcd0d21 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/ShareChooserDialog.java +++ b/app/src/main/java/org/fdroid/fdroid/views/ShareChooserDialog.java @@ -15,6 +15,7 @@ import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; +import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; @@ -31,9 +32,12 @@ public class ShareChooserDialog extends BottomSheetDialogFragment { private RecyclerView mRecyclerView; private ArrayList mTargets; private int mParentWidth; + private Intent mShareIntent; + private boolean mShowNearby; public interface ShareChooserDialogListener { - void onItemSelected(ResolveInfo ri); + void onNearby(); + void onResolvedShareIntent(Intent shareIntent); } private ShareChooserDialogListener mListener; @@ -49,9 +53,10 @@ public class ShareChooserDialog extends BottomSheetDialogFragment { public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mParentWidth = getArguments().getInt("width", 640); - Intent intent = getArguments().getParcelable("intent"); + mShareIntent = getArguments().getParcelable("intent"); + mShowNearby = getArguments().getBoolean("showNearby", false); mTargets = new ArrayList<>(); - List resInfo = getContext().getPackageManager().queryIntentActivities(intent, 0); + List resInfo = getContext().getPackageManager().queryIntentActivities(mShareIntent, 0); if (resInfo != null && resInfo.size() > 0) { for (ResolveInfo resolveInfo : resInfo) { String packageName = resolveInfo.activityInfo.packageName; @@ -123,7 +128,9 @@ public class ShareChooserDialog extends BottomSheetDialogFragment { RecyclerView.Adapter init(List targetedShareIntents) { mIntents = new ArrayList<>(); - mIntents.add("Nearby"); + if (mShowNearby) { + mIntents.add("Nearby (string contents do not matter!)"); + } for (ResolveInfo ri : targetedShareIntents) { mIntents.add(ri); } @@ -146,7 +153,15 @@ public class ShareChooserDialog extends BottomSheetDialogFragment { @Override public void onBindViewHolder(VH holder, int position) { if (getItemViewType(position) == 1) { - //holder.label.setText((CharSequence)mIntents.get(position)); + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mListener != null) { + mListener.onNearby(); + } + dismiss(); + } + }); return; } final ResolveInfo ri = (ResolveInfo) mIntents.get(position); @@ -155,8 +170,13 @@ public class ShareChooserDialog extends BottomSheetDialogFragment { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - if (mListener != null) - mListener.onItemSelected(ri); + if (mListener != null) { + Intent intent = new Intent(mShareIntent); + ComponentName name = new ComponentName(ri.activityInfo.applicationInfo.packageName, + ri.activityInfo.name); + intent.setComponent(name); + mListener.onResolvedShareIntent(intent); + } dismiss(); } }); @@ -170,25 +190,13 @@ public class ShareChooserDialog extends BottomSheetDialogFragment { } - public static void createChooser(CoordinatorLayout rootView, final AppCompatActivity parent, final Intent shareIntent) { + public static void createChooser(CoordinatorLayout rootView, ShareChooserDialog.ShareChooserDialogListener listener, final AppCompatActivity parent, final Intent shareIntent, boolean showNearbyItem) { ShareChooserDialog d = new ShareChooserDialog(); - d.setListener(new ShareChooserDialog.ShareChooserDialogListener() { - @Override - public void onItemSelected(final ResolveInfo ri) { - startActivityForResolveInfo(ri); - } - - private void startActivityForResolveInfo(ResolveInfo ri) { - Intent intent = new Intent(shareIntent); - ComponentName name = new ComponentName(ri.activityInfo.applicationInfo.packageName, - ri.activityInfo.name); - intent.setComponent(name); - parent.startActivity(intent); - } - }); + d.setListener(listener); Bundle args = new Bundle(); args.putInt("width", rootView.getWidth()); args.putParcelable("intent", shareIntent); + args.putBoolean("showNearby", showNearbyItem); d.setArguments(args); d.show(parent.getSupportFragmentManager(), "Share"); }