From 0a9e3c749c869d5611d78ed694bc51a2ca6264ce Mon Sep 17 00:00:00 2001 From: Floens Date: Tue, 28 Jul 2015 20:58:19 +0200 Subject: [PATCH] Add android beam support --- Clover/app/src/main/AndroidManifest.xml | 33 ++++------------- .../chan/ui/activity/StartActivity.java | 20 +++++++++- .../chan/ui/controller/ThreadController.java | 37 ++++++++++++++++++- 3 files changed, 63 insertions(+), 27 deletions(-) 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); }