summaryrefslogtreecommitdiffstats
path: root/src/com/android/swe/browser/NfcHandler.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/swe/browser/NfcHandler.java')
-rw-r--r--src/com/android/swe/browser/NfcHandler.java109
1 files changed, 109 insertions, 0 deletions
diff --git a/src/com/android/swe/browser/NfcHandler.java b/src/com/android/swe/browser/NfcHandler.java
new file mode 100644
index 00000000..0dd85769
--- /dev/null
+++ b/src/com/android/swe/browser/NfcHandler.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.browser;
+
+import android.app.Activity;
+import android.nfc.NdefMessage;
+import android.nfc.NdefRecord;
+import android.nfc.NfcAdapter;
+import android.nfc.NfcEvent;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+
+import java.util.concurrent.CountDownLatch;
+
+/** This class implements sharing the URL of the currently
+ * shown browser page over NFC. Sharing is only active
+ * when the activity is in the foreground and resumed.
+ * Incognito tabs will not be shared over NFC.
+ */
+public class NfcHandler implements NfcAdapter.CreateNdefMessageCallback {
+ static final String TAG = "BrowserNfcHandler";
+ static final int GET_PRIVATE_BROWSING_STATE_MSG = 100;
+
+ final Controller mController;
+
+ Tab mCurrentTab;
+ boolean mIsPrivate;
+ CountDownLatch mPrivateBrowsingSignal;
+
+ public static void register(Activity activity, Controller controller) {
+ NfcAdapter adapter = NfcAdapter.getDefaultAdapter(activity.getApplicationContext());
+ if (adapter == null) {
+ return; // NFC not available on this device
+ }
+ NfcHandler handler = null;
+ if (controller != null) {
+ handler = new NfcHandler(controller);
+ }
+
+ adapter.setNdefPushMessageCallback(handler, activity);
+ }
+
+ public static void unregister(Activity activity) {
+ // Passing a null controller causes us to disable
+ // the callback and release the ref to out activity.
+ register(activity, null);
+ }
+
+ public NfcHandler(Controller controller) {
+ mController = controller;
+ }
+
+ final Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ if (msg.what == GET_PRIVATE_BROWSING_STATE_MSG) {
+ mIsPrivate = mCurrentTab.getWebView().isPrivateBrowsingEnabled();
+ mPrivateBrowsingSignal.countDown();
+ }
+ }
+ };
+
+ @Override
+ public NdefMessage createNdefMessage(NfcEvent event) {
+ mCurrentTab = mController.getCurrentTab();
+ if ((mCurrentTab != null) && (mCurrentTab.getWebView() != null)) {
+ // We can only read the WebView state on the UI thread, so post
+ // a message and wait.
+ mPrivateBrowsingSignal = new CountDownLatch(1);
+ mHandler.sendMessage(mHandler.obtainMessage(GET_PRIVATE_BROWSING_STATE_MSG));
+ try {
+ mPrivateBrowsingSignal.await();
+ } catch (InterruptedException e) {
+ return null;
+ }
+ }
+
+ if ((mCurrentTab == null) || mIsPrivate) {
+ return null;
+ }
+
+ String currentUrl = mCurrentTab.getUrl();
+ if (currentUrl != null) {
+ try {
+ return new NdefMessage(NdefRecord.createUri(currentUrl));
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "IllegalArgumentException creating URI NdefRecord", e);
+ return null;
+ }
+ } else {
+ return null;
+ }
+ }
+}