Add android beam support

multisite
Floens 10 years ago
parent ba372c93ba
commit 0a9e3c749c
  1. 33
      Clover/app/src/main/AndroidManifest.xml
  2. 20
      Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java
  3. 37
      Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java

@ -35,43 +35,26 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
android:name=".ui.activity.BoardActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="4chan.org"
android:pathPrefix="/"
android:scheme="http" />
<data
android:host="4chan.org"
android:pathPrefix="/"
android:scheme="https" />
<data
android:host="www.4chan.org"
android:pathPrefix="/"
android:scheme="http" />
<data
android:host="www.4chan.org"
android:pathPrefix="/"
android:scheme="https" />
<data
android:host="boards.4chan.org"
android:pathPrefix="/"
android:scheme="http" />
<data
android:host="boards.4chan.org"
android:pathPrefix="/"
android:scheme="https" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="4chan.org" />
<data android:host="www.4chan.org" />
<data android:host="boards.4chan.org" />
</intent-filter>
</activity>
<activity android:name=".test.TestActivity" />

@ -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);
}

@ -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);
}

Loading…
Cancel
Save