From 6d006e70b3375a4b6f86bc3e245e249b63322454 Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Tue, 12 Aug 2014 06:50:41 +0930 Subject: [PATCH] Always attempt to push swap repo via NFC. Previously, swap would only enable this if the user hadn't previously said "Don't show NFC message again". However, we really want people to be able to swap regardless of whether the actual UI message is shown or not. Refactored NfcBeamManager to NfcHelper, to allow extra utility methods to live there. Specifically, the process of sending a URI over NFC. Removed some superfluous debugging calls to Log.i(). --- src/org/fdroid/fdroid/AppDetails.java | 4 +-- src/org/fdroid/fdroid/FDroid.java | 3 +- .../{NfcBeamManager.java => NfcHelper.java} | 32 +++++++++++++++--- .../fdroid/views/RepoDetailsActivity.java | 29 +++++----------- .../fdroid/views/swap/NfcSwapFragment.java | 33 ------------------- .../fdroid/views/swap/SwapActivity.java | 11 ++++++- 6 files changed, 49 insertions(+), 63 deletions(-) rename src/org/fdroid/fdroid/{NfcBeamManager.java => NfcHelper.java} (57%) diff --git a/src/org/fdroid/fdroid/AppDetails.java b/src/org/fdroid/fdroid/AppDetails.java index 76c5c2ee5..c7f4b464a 100644 --- a/src/org/fdroid/fdroid/AppDetails.java +++ b/src/org/fdroid/fdroid/AppDetails.java @@ -1327,10 +1327,10 @@ public class AppDetails extends ActionBarActivity implements ProgressListener, A TextView statusView = (TextView) view.findViewById(R.id.status); if (getApp().isInstalled()) { statusView.setText(getString(R.string.details_installed, getApp().installedVersionName)); - NfcBeamManager.setAndroidBeam(getActivity(), getApp().id); + NfcHelper.setAndroidBeam(getActivity(), getApp().id); } else { statusView.setText(getString(R.string.details_notinstalled)); - NfcBeamManager.disableAndroidBeam(getActivity()); + NfcHelper.disableAndroidBeam(getActivity()); } } diff --git a/src/org/fdroid/fdroid/FDroid.java b/src/org/fdroid/fdroid/FDroid.java index ca0a265ff..b41e8550e 100644 --- a/src/org/fdroid/fdroid/FDroid.java +++ b/src/org/fdroid/fdroid/FDroid.java @@ -19,7 +19,6 @@ package org.fdroid.fdroid; -import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.app.NotificationManager; @@ -112,7 +111,7 @@ public class FDroid extends ActionBarActivity { protected void onResume() { super.onResume(); // AppDetails and RepoDetailsActivity set different NFC actions, so reset here - NfcBeamManager.setAndroidBeam(this, getApplication().getPackageName()); + NfcHelper.setAndroidBeam(this, getApplication().getPackageName()); checkForAddRepoIntent(); } diff --git a/src/org/fdroid/fdroid/NfcBeamManager.java b/src/org/fdroid/fdroid/NfcHelper.java similarity index 57% rename from src/org/fdroid/fdroid/NfcBeamManager.java rename to src/org/fdroid/fdroid/NfcHelper.java index 488fe7d67..b5e7e3f87 100644 --- a/src/org/fdroid/fdroid/NfcBeamManager.java +++ b/src/org/fdroid/fdroid/NfcHelper.java @@ -3,21 +3,44 @@ package org.fdroid.fdroid; import android.annotation.TargetApi; import android.app.Activity; +import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.net.Uri; +import android.nfc.NdefMessage; +import android.nfc.NdefRecord; import android.nfc.NfcAdapter; import android.os.Build; -@TargetApi(16) -public class NfcBeamManager { +public class NfcHelper { + @TargetApi(14) + private static NfcAdapter getAdapter(Context context) { + if (Build.VERSION.SDK_INT < 14) + return null; + + return NfcAdapter.getDefaultAdapter(context.getApplicationContext()); + } + + @TargetApi(14) + public static boolean setPushMessage(Activity activity, Uri toShare) { + NfcAdapter adapter = getAdapter(activity); + if (adapter != null) { + adapter.setNdefPushMessage(new NdefMessage(new NdefRecord[]{ + NdefRecord.createUri(toShare), + }), activity); + return true; + } + return false; + } + + @TargetApi(16) static void setAndroidBeam(Activity activity, String packageName) { if (Build.VERSION.SDK_INT < 16) return; PackageManager pm = activity.getPackageManager(); - NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(activity); + NfcAdapter nfcAdapter = getAdapter(activity); if (nfcAdapter != null) { ApplicationInfo appInfo; try { @@ -32,10 +55,11 @@ public class NfcBeamManager { } } + @TargetApi(16) static void disableAndroidBeam(Activity activity) { if (Build.VERSION.SDK_INT < 16) return; - NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(activity); + NfcAdapter nfcAdapter = getAdapter(activity); if (nfcAdapter != null) nfcAdapter.setBeamPushUris(null, activity); } diff --git a/src/org/fdroid/fdroid/views/RepoDetailsActivity.java b/src/org/fdroid/fdroid/views/RepoDetailsActivity.java index 6516e106f..426cd25e1 100644 --- a/src/org/fdroid/fdroid/views/RepoDetailsActivity.java +++ b/src/org/fdroid/fdroid/views/RepoDetailsActivity.java @@ -5,7 +5,6 @@ import android.annotation.TargetApi; import android.content.Intent; import android.net.Uri; import android.nfc.NdefMessage; -import android.nfc.NdefRecord; import android.nfc.NfcAdapter; import android.os.Build; import android.os.Bundle; @@ -17,6 +16,7 @@ import android.view.MenuItem; import android.widget.LinearLayout; import android.widget.Toast; import org.fdroid.fdroid.FDroidApp; +import org.fdroid.fdroid.NfcHelper; import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.data.Repo; import org.fdroid.fdroid.data.RepoProvider; @@ -67,27 +67,18 @@ public class RepoDetailsActivity extends ActionBarActivity { @TargetApi(14) private void setNfc() { - if (Build.VERSION.SDK_INT < 14) - return; - NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); - if (nfcAdapter == null) { - return; + if (NfcHelper.setPushMessage(this, Utils.getSharingUri(this, repo))) { + findViewById(android.R.id.content).post(new Runnable() { + @Override + public void run() { + onNewIntent(getIntent()); + } + }); } - nfcAdapter.setNdefPushMessage(new NdefMessage(new NdefRecord[] { - NdefRecord.createUri(Utils.getSharingUri(this, repo)), - }), this); - findViewById(android.R.id.content).post(new Runnable() { - @Override - public void run() { - Log.i(TAG, "Runnable.run()"); - onNewIntent(getIntent()); - } - }); } @Override public void onResume() { - Log.i(TAG, "onResume"); super.onResume(); // FDroid.java and AppDetails set different NFC actions, so reset here setNfc(); @@ -96,9 +87,6 @@ public class RepoDetailsActivity extends ActionBarActivity { @Override public void onNewIntent(Intent i) { - Log.i(TAG, "onNewIntent"); - Log.i(TAG, "action: " + i.getAction()); - Log.i(TAG, "data: " + i.getData()); // onResume gets called after this to handle the intent setIntent(i); } @@ -108,7 +96,6 @@ public class RepoDetailsActivity extends ActionBarActivity { if (Build.VERSION.SDK_INT < 9) return; if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(i.getAction())) { - Log.i(TAG, "ACTION_NDEF_DISCOVERED"); Parcelable[] rawMsgs = i.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); NdefMessage msg = (NdefMessage) rawMsgs[0]; diff --git a/src/org/fdroid/fdroid/views/swap/NfcSwapFragment.java b/src/org/fdroid/fdroid/views/swap/NfcSwapFragment.java index 1b550f18f..768cd234e 100644 --- a/src/org/fdroid/fdroid/views/swap/NfcSwapFragment.java +++ b/src/org/fdroid/fdroid/views/swap/NfcSwapFragment.java @@ -1,11 +1,5 @@ package org.fdroid.fdroid.views.swap; -import android.annotation.TargetApi; -import android.content.Context; -import android.nfc.NdefMessage; -import android.nfc.NdefRecord; -import android.nfc.NfcAdapter; -import android.os.Build; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; @@ -13,10 +7,8 @@ import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.CompoundButton; -import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.R; -import org.fdroid.fdroid.Utils; public class NfcSwapFragment extends Fragment { @@ -30,32 +22,7 @@ public class NfcSwapFragment extends Fragment { Preferences.get().setShowNfcDuringSwap(!isChecked); } }); - - setupNfc(); - return view; } - public static boolean isNfcSupported(Context context) { - return Build.VERSION.SDK_INT >= 14 && getNfcAdapter(context) != null; - } - - @TargetApi(10) - private static NfcAdapter getNfcAdapter(Context context) { - return NfcAdapter.getDefaultAdapter(context.getApplicationContext()); - } - - @TargetApi(10) - private void setupNfc() { - // the required NFC API was added in 4.0 aka Ice Cream Sandwich - if (Build.VERSION.SDK_INT >= 14) { - NfcAdapter nfcAdapter = getNfcAdapter(getActivity()); - if (nfcAdapter == null) - return; - nfcAdapter.setNdefPushMessage(new NdefMessage(new NdefRecord[] { - NdefRecord.createUri(Utils.getSharingUri(getActivity(), FDroidApp.repo)), - }), getActivity()); - } - } - } diff --git a/src/org/fdroid/fdroid/views/swap/SwapActivity.java b/src/org/fdroid/fdroid/views/swap/SwapActivity.java index 363fbd646..dfff84fdd 100644 --- a/src/org/fdroid/fdroid/views/swap/SwapActivity.java +++ b/src/org/fdroid/fdroid/views/swap/SwapActivity.java @@ -12,6 +12,7 @@ import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import org.fdroid.fdroid.FDroidApp; +import org.fdroid.fdroid.NfcHelper; import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.R; import org.fdroid.fdroid.Utils; @@ -146,7 +147,15 @@ public class SwapActivity extends ActionBarActivity implements SwapProcessManage } public void onAttemptNfc() { - if (Preferences.get().showNfcDuringSwap() && NfcSwapFragment.isNfcSupported(this)) { + // TODO: What if NFC is disabled? Hook up with NfcNotEnabledActivity? Or maybe only if they + // click a relevant button? + + // Even if they opted to skip the message which says "Touch devices to swap", + // we still want to actually enable the feature, so that they could touch + // during the wifi qr code being shown too. + boolean nfcMessageReady = NfcHelper.setPushMessage(this, Utils.getSharingUri(this, FDroidApp.repo)); + + if (Preferences.get().showNfcDuringSwap() && nfcMessageReady) { getSupportFragmentManager() .beginTransaction() .replace(android.R.id.content, new NfcSwapFragment(), STATE_NFC)