From ea7f82ed1a031af1fdab4b904e533b020628f6c1 Mon Sep 17 00:00:00 2001
From: Hans-Christoph Steiner <hans@eds.org>
Date: Thu, 30 Jan 2014 16:16:56 -0500
Subject: [PATCH] add menu item to enable NFC to RepoDetails view

It is now possible to beam a repo config via NFC but just selecting the
repo in FDroid, then touching two NFC devices together, and clicking on the
FDroid one.  There is no indication that NFC is off, so this commit adds a
menu item that makes it easy to enable the required NFC settings for
sending a repo to another device via NFC.
---
 res/values/strings.xml                        |  3 ++
 .../fdroid/fdroid/NfcNotEnabledActivity.java  | 43 +++++++++++++++
 .../views/fragments/RepoDetailsFragment.java  | 52 ++++++++++++++++---
 3 files changed, 92 insertions(+), 6 deletions(-)
 create mode 100644 src/org/fdroid/fdroid/NfcNotEnabledActivity.java

diff --git a/res/values/strings.xml b/res/values/strings.xml
index 3ded618fa..0895ad430 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -9,6 +9,7 @@
 	<string name="version">Version</string>
 	<string name="edit">Edit</string>
 	<string name="delete">Delete</string>
+	<string name="enable_nfc_send">Enable NFC Send…</string>
 	<string name="cache_downloaded">App cache</string>
 	<string name="cache_downloaded_on">Keep downloaded apk files on SD card</string>
 	<string name="cache_downloaded_off">Do not keep any apk files</string>
@@ -73,6 +74,8 @@
 	<string name="process_wait_title">Please Wait</string>
 	<string name="process_update_msg">Updating application list…</string>
 	<string name="download_server">Getting application from</string>
+	<string name="nfc_is_not_enabled">NFC is not enabled!</string>
+	<string name="go_to_nfc_settings">Go to NFC Settings…</string>
 
 	<string name="repo_add_url">Repository address</string>
 	<string name="repo_add_fingerprint">Fingerprint (optional)</string>
diff --git a/src/org/fdroid/fdroid/NfcNotEnabledActivity.java b/src/org/fdroid/fdroid/NfcNotEnabledActivity.java
new file mode 100644
index 000000000..711a17f97
--- /dev/null
+++ b/src/org/fdroid/fdroid/NfcNotEnabledActivity.java
@@ -0,0 +1,43 @@
+
+package org.fdroid.fdroid;
+
+import android.annotation.TargetApi;
+import android.app.Activity;
+import android.content.Intent;
+import android.nfc.NfcAdapter;
+import android.os.Build;
+import android.os.Bundle;
+import android.provider.Settings;
+
+@TargetApi(14)
+// aka Android 4.0 aka Ice Cream Sandwich
+public class NfcNotEnabledActivity extends Activity {
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        final Intent intent = new Intent();
+        if (Build.VERSION.SDK_INT >= 16) {
+            /*
+             * ACTION_NFC_SETTINGS was added in 4.1 aka Jelly Bean MR1 as a
+             * separate thing from ACTION_NFCSHARING_SETTINGS. It is now
+             * possible to have NFC enabled, but not "Android Beam", which is
+             * needed for NDEF. Therefore, we detect the current state of NFC,
+             * and steer the user accordingly.
+             */
+            if (NfcAdapter.getDefaultAdapter(this).isEnabled())
+                intent.setAction(Settings.ACTION_NFCSHARING_SETTINGS);
+            else
+                intent.setAction(Settings.ACTION_NFC_SETTINGS);
+        } else if (Build.VERSION.SDK_INT >= 14) {
+            // this API was added in 4.0 aka Ice Cream Sandwich
+            intent.setAction(Settings.ACTION_NFCSHARING_SETTINGS);
+        } else {
+            // no NFC support, so nothing to do here
+            finish();
+            return;
+        }
+        startActivity(intent);
+        finish();
+    }
+}
diff --git a/src/org/fdroid/fdroid/views/fragments/RepoDetailsFragment.java b/src/org/fdroid/fdroid/views/fragments/RepoDetailsFragment.java
index d86807c0d..4e762d238 100644
--- a/src/org/fdroid/fdroid/views/fragments/RepoDetailsFragment.java
+++ b/src/org/fdroid/fdroid/views/fragments/RepoDetailsFragment.java
@@ -1,9 +1,13 @@
 package org.fdroid.fdroid.views.fragments;
 
+import android.annotation.TargetApi;
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.content.ContentValues;
 import android.content.DialogInterface;
+import android.content.Intent;
+import android.nfc.NfcAdapter;
+import android.os.Build;
 import android.os.Bundle;
 import android.support.v4.app.Fragment;
 import android.support.v4.view.MenuItemCompat;
@@ -50,6 +54,9 @@ public class RepoDetailsFragment extends Fragment {
 
     private static final int DELETE = 0;
     private static final int UPDATE = 1;
+    private static final int ENABLE_NFC = 2;
+
+    private MenuItem enableNfc = null;
 
     // TODO: Currently initialised in onCreateView. Not sure if that is the
     // best way to go about this...
@@ -244,18 +251,51 @@ public class RepoDetailsFragment extends Fragment {
         MenuItemCompat.setShowAsAction(delete,
             MenuItemCompat.SHOW_AS_ACTION_IF_ROOM |
             MenuItemCompat.SHOW_AS_ACTION_WITH_TEXT);
+    }
 
+    @Override
+    public void onPrepareOptionsMenu(Menu menu) {
+        if (Build.VERSION.SDK_INT >= 14)
+            prepareNfcMenuItems(menu);
+    }
+
+    @TargetApi(16)
+    private void prepareNfcMenuItems(Menu menu) {
+        boolean needsEnableNfcMenuItem = false;
+        NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(getActivity());
+        if (Build.VERSION.SDK_INT < 16)
+            needsEnableNfcMenuItem = !nfcAdapter.isEnabled();
+        else
+            needsEnableNfcMenuItem = !nfcAdapter.isNdefPushEnabled();
+        if (needsEnableNfcMenuItem) {
+            if (enableNfc != null)
+                return; // already created
+            enableNfc = menu.add(Menu.NONE, ENABLE_NFC, 0, R.string.enable_nfc_send);
+            enableNfc.setIcon(android.R.drawable.ic_menu_preferences);
+            MenuItemCompat.setShowAsAction(enableNfc,
+                MenuItemCompat.SHOW_AS_ACTION_IF_ROOM |
+                MenuItemCompat.SHOW_AS_ACTION_WITH_TEXT);
+        } else if (enableNfc != null) {
+            // remove the existing MenuItem since NFC is now enabled
+            menu.removeItem(enableNfc.getItemId());
+            enableNfc = null;
+        }
     }
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
 
-        if (item.getItemId() == DELETE) {
-            promptForDelete();
-            return true;
-        } else if (item.getItemId() == UPDATE) {
-            performUpdate();
-            return true;
+        switch (item.getItemId()) {
+            case DELETE:
+                promptForDelete();
+                return true;
+            case UPDATE:
+                performUpdate();
+                return true;
+            case ENABLE_NFC:
+                Intent intent = new Intent(getActivity(), NfcNotEnabledActivity.class);
+                startActivity(intent);
+                return true;
         }
 
         return false;