diff --git a/Clover/app/src/main/AndroidManifest.xml b/Clover/app/src/main/AndroidManifest.xml
index f1efbee5..25e0e102 100644
--- a/Clover/app/src/main/AndroidManifest.xml
+++ b/Clover/app/src/main/AndroidManifest.xml
@@ -35,43 +35,26 @@ along with this program. If not, see .
android:name=".ui.activity.BoardActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/app_name">
+
-
+
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java
index e8834129..d7439fd7 100644
--- a/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java
+++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java
@@ -21,6 +21,9 @@ import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
+import android.nfc.NdefMessage;
+import android.nfc.NfcAdapter;
+import android.nfc.NfcEvent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.ViewGroup;
@@ -45,7 +48,7 @@ import org.floens.chan.utils.Logger;
import java.util.ArrayList;
import java.util.List;
-public class StartActivity extends AppCompatActivity {
+public class StartActivity extends AppCompatActivity implements NfcAdapter.CreateNdefMessageCallback {
private static final String TAG = "StartActivity";
private static final String STATE_KEY = "chan_state";
@@ -88,6 +91,11 @@ public class StartActivity extends AppCompatActivity {
// Do this after setContentView, or the decor creating will reset the background to a default non-null drawable
getWindow().setBackgroundDrawable(null);
+ NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this);
+ if (adapter != null) {
+ adapter.setNdefPushMessageCallback(this, this);
+ }
+
// Startup from background or url
boolean loadDefault = true;
if (savedInstanceState != null) {
@@ -173,6 +181,16 @@ public class StartActivity extends AppCompatActivity {
}
}
+ @Override
+ public NdefMessage createNdefMessage(NfcEvent event) {
+ Controller controller = rootNavigationController.getTop();
+ if (controller instanceof NfcAdapter.CreateNdefMessageCallback) {
+ return ((NfcAdapter.CreateNdefMessageCallback) controller).createNdefMessage(event);
+ } else {
+ return null;
+ }
+ }
+
public void addController(Controller controller) {
stack.add(controller);
}
diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java
index 2a4e3677..22a1fadd 100644
--- a/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java
+++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java
@@ -18,23 +18,31 @@
package org.floens.chan.ui.controller;
import android.content.Context;
+import android.nfc.NdefMessage;
+import android.nfc.NdefRecord;
+import android.nfc.NfcAdapter;
+import android.nfc.NfcEvent;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import org.floens.chan.Chan;
import org.floens.chan.R;
+import org.floens.chan.chan.ChanUrls;
import org.floens.chan.controller.Controller;
import org.floens.chan.core.model.Loadable;
import org.floens.chan.core.model.PostImage;
import org.floens.chan.ui.helper.RefreshUIMessage;
import org.floens.chan.ui.layout.ThreadLayout;
import org.floens.chan.ui.view.ThumbnailView;
+import org.floens.chan.utils.Logger;
import java.util.List;
import de.greenrobot.event.EventBus;
-public abstract class ThreadController extends Controller implements ThreadLayout.ThreadLayoutCallback, ImageViewerController.PreviewCallback, RootNavigationController.DrawerCallback, SwipeRefreshLayout.OnRefreshListener, RootNavigationController.ToolbarSearchCallback {
+public abstract class ThreadController extends Controller implements ThreadLayout.ThreadLayoutCallback, ImageViewerController.PreviewCallback, RootNavigationController.DrawerCallback, SwipeRefreshLayout.OnRefreshListener, RootNavigationController.ToolbarSearchCallback, NfcAdapter.CreateNdefMessageCallback {
+ private static final String TAG = "ThreadController";
+
protected ThreadLayout threadLayout;
private SwipeRefreshLayout swipeRefreshLayout;
@@ -98,6 +106,33 @@ public abstract class ThreadController extends Controller implements ThreadLayou
threadLayout.refreshFromSwipe();
}
+ @Override
+ public NdefMessage createNdefMessage(NfcEvent event) {
+ Loadable loadable = getLoadable();
+ String url = null;
+ NdefMessage message = null;
+
+ if (loadable != null) {
+ if (loadable.isThreadMode()) {
+ url = ChanUrls.getThreadUrlDesktop(loadable.board, loadable.no);
+ } else if (loadable.isCatalogMode()) {
+ url = ChanUrls.getCatalogUrlDesktop(loadable.board);
+ }
+ }
+
+ if (url != null) {
+ try {
+ Logger.d(TAG, "Pushing url " + url + " to android beam");
+ NdefRecord record = NdefRecord.createUri(url);
+ message = new NdefMessage(new NdefRecord[]{record});
+ } catch (IllegalArgumentException e) {
+ Logger.e(TAG, "NdefMessage create error", e);
+ }
+ }
+
+ return message;
+ }
+
public void presentRepliesController(Controller controller) {
presentController(controller);
}