/*
* Copyright (C) 2012 The CyanogenMod 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.profiles;
import java.util.UUID;
import android.app.Activity;
import android.app.Profile;
import android.app.ProfileManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.os.Parcelable;
import android.provider.Settings;
import android.widget.Toast;
import com.android.settings.R;
/**
* This activity handles NDEF_DISCOVERED intents with the cm/profile mime type.
* Tags should be encoded with the 16-byte UUID of the profile to be activated.
* Tapping a tag while that profile is already active will select the previously
* active profile.
*/
public class NFCProfile extends Activity {
private static final String PREFS_NAME = "NFCProfile";
private static final String PREFS_PREVIOUS_PROFILE = "previous-profile";
static final String PROFILE_MIME_TYPE = "cm/profile";
private ProfileManager mProfileManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mProfileManager = (ProfileManager) getSystemService(Context.PROFILE_SERVICE);
}
@Override
protected void onResume() {
super.onResume();
Intent intent = getIntent();
String action = intent.getAction();
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (rawMsgs != null) {
NdefMessage[] msgs = new NdefMessage[rawMsgs.length];
for (int i = 0; i < rawMsgs.length; i++) {
msgs[i] = (NdefMessage) rawMsgs[i];
for (NdefRecord record : msgs[i].getRecords()) {
String type = new String(record.getType());
byte[] payload = record.getPayload();
if (PROFILE_MIME_TYPE.equals(type) && payload != null
&& payload.length == 16) {
handleProfileMimeType(payload);
}
}
}
}
}
finish();
}
private void handleProfileMimeType(byte[] payload) {
UUID profileUuid = NFCProfileUtils.toUUID(payload);
boolean enabled = Settings.System.getInt(getContentResolver(),
Settings.System.SYSTEM_PROFILES_ENABLED, 1) == 1;
if (enabled) {
// Only do NFC profile changing if System Profile support is enabled
Profile currentProfile = mProfileManager.getActiveProfile();
Profile targetProfile = mProfileManager.getProfile(profileUuid);
if (targetProfile == null) {
// show profile selection for unknown tag
Intent i = new Intent(this, NFCProfileSelect.class);
i.putExtra(NFCProfileSelect.EXTRA_PROFILE_UUID, profileUuid.toString());
i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
this.startActivity(i);
} else {
// switch to profile
if (currentProfile == null || !currentProfile.getUuid().equals(profileUuid)) {
saveCurrentProfile();
switchTo(profileUuid);
} else {
Profile lastProfile = getPreviouslySelectedProfile();
if (lastProfile != null) {
switchTo(lastProfile.getUuid());
clearPreviouslySelectedProfile();
}
}
}
}
}
private void switchTo(UUID uuid) {
Profile p = mProfileManager.getProfile(uuid);
if (p != null) {
mProfileManager.setActiveProfile(uuid);
Toast.makeText(
this,
String.format(getResources().getString(R.string.profile_selected), p.getName()),
Toast.LENGTH_LONG).show();
NFCProfileUtils.vibrate(this);
}
}
private Profile getPreviouslySelectedProfile() {
Profile previous = null;
SharedPreferences prefs = getSharedPreferences(PREFS_NAME, 0);
String uuid = prefs.getString(PREFS_PREVIOUS_PROFILE, null);
if (uuid != null) {
previous = mProfileManager.getProfile(UUID.fromString(uuid));
}
return previous;
}
private void clearPreviouslySelectedProfile() {
SharedPreferences.Editor editor = getSharedPreferences(PREFS_NAME, 0).edit();
editor.remove(PREFS_PREVIOUS_PROFILE);
editor.commit();
}
private void saveCurrentProfile() {
Profile currentProfile = mProfileManager.getActiveProfile();
if (currentProfile != null) {
SharedPreferences.Editor editor = getSharedPreferences(PREFS_NAME, 0).edit();
editor.putString(PREFS_PREVIOUS_PROFILE, currentProfile.getUuid().toString());
editor.commit();
}
}
}