/* * Copyright (C) 2013 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.settings; import android.app.Activity; import android.app.AlertDialog; import android.app.PendingIntent; import android.content.DialogInterface; import android.content.Intent; import android.nfc.NfcAdapter; import android.nfc.NfcUnlock; import android.nfc.Tag; import android.os.Bundle; import android.os.Handler; import android.os.PowerManager; import android.provider.Settings; import android.view.Menu; import android.widget.ImageView; import android.widget.TextView; public class PairNfcDevice extends Activity { private static String TAG = PairNfcDevice.class.getName(); private TextView mStatusText; private ImageView mStatusImage; private PendingIntent mPendingIntent; private NfcAdapter mAdapter; private Handler mHandler = new Handler(); private PowerManager.WakeLock mWakeLock; private NfcUnlock mNfcUnlock; // If pairing fails, we immediately get a new intent that would not leave time for the user to // read the error message. So we'll just drop it and the user has to try again. // TEST private boolean mWaitingForDeviceDelayed; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_nfc_pairing); mStatusText = (TextView) findViewById(R.id.status_text); mStatusImage = (ImageView) findViewById(R.id.status_image); mAdapter = NfcAdapter.getDefaultAdapter(this); mPendingIntent = PendingIntent.getActivity( this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); mNfcUnlock = NfcUnlock.getInstance(mAdapter); setWaitingForDeviceMode(); } @Override public boolean onCreateOptionsMenu(Menu menu) { return false; } public void onPause() { super.onPause(); mAdapter.disableForegroundDispatch(this); if (mWakeLock != null) { mWakeLock.release(); } } public void onResume() { super.onResume(); if (!mAdapter.isEnabled()) { // We need the user to start NFC. AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); dialogBuilder.setMessage(R.string.enable_nfc); dialogBuilder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { startActivity(new Intent(Settings.ACTION_NFC_SETTINGS)); } }); dialogBuilder.show(); } mAdapter.enableForegroundDispatch(this, mPendingIntent, null, null); if (mWakeLock == null) { PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, TAG); } mWakeLock.acquire(); } @Override public void onNewIntent(Intent intent) { Tag tag = (Tag) intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); if (!mWaitingForDeviceDelayed) { processTag(tag); } } private void processTag(Tag tag) { if (mNfcUnlock.registerTag(tag)) { setPairingSucceededMode(); } else { setPairingFailedMode(); } } private void setWaitingForDeviceModeDelayed(int delayInMs) { mWaitingForDeviceDelayed = true; mHandler.postDelayed(new Runnable() { @Override public void run() { mWaitingForDeviceDelayed = false; setWaitingForDeviceMode(); } }, delayInMs); } private void setWaitingForDeviceMode() { mStatusImage.setImageResource(R.drawable.no_ring_detected); mStatusText.setText(R.string.status_no_ring_detected); } private void setPairingFailedMode() { setErrorMode(R.string.status_error_pairing_failed); } private void setPairingSucceededMode() { mStatusImage.setImageResource(R.drawable.ring_paired); mStatusText.setText(R.string.status_device_paired); // Automatically quit. mHandler.postDelayed(new Runnable() { @Override public void run() { finish(); } }, 1000); } private void setErrorMode(int errorMsgResourceId) { mStatusText.setText(errorMsgResourceId); setWaitingForDeviceModeDelayed(2500); } }