| /* |
| * Copyright (C) 2015 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.cts.verifier.managedprovisioning; |
| |
| import android.app.Activity; |
| import android.app.admin.DevicePolicyManager; |
| import android.content.ActivityNotFoundException; |
| import android.content.ComponentName; |
| import android.content.Context; |
| import android.content.Intent; |
| import android.graphics.Bitmap; |
| import android.graphics.Canvas; |
| import android.graphics.Color; |
| import android.graphics.Paint; |
| import android.graphics.Rect; |
| import android.net.Uri; |
| import android.nfc.NfcAdapter; |
| import android.os.Bundle; |
| import android.os.UserManager; |
| import android.support.v4.content.FileProvider; |
| import android.util.Log; |
| import android.view.View; |
| import android.view.View.OnClickListener; |
| import android.widget.Toast; |
| |
| import com.android.cts.verifier.R; |
| |
| import java.io.File; |
| import java.io.FileNotFoundException; |
| import java.io.FileOutputStream; |
| |
| public class NfcTestActivity extends Activity { |
| private static final String TAG = "NfcTestActivity"; |
| |
| /* package */ static final String EXTRA_DISALLOW_BY_POLICY = "disallowByPolicy"; |
| |
| private static final String NFC_BEAM_PACKAGE = "com.android.nfc"; |
| private static final String NFC_BEAM_ACTIVITY = "com.android.nfc.BeamShareActivity"; |
| private static final String SAMPLE_IMAGE_FILENAME = "image_to_share.jpg"; |
| private static final String SAMPLE_IMAGE_CONTENT = "sample image"; |
| private static final int MARGIN = 80; |
| private static final int TEXT_SIZE = 200; |
| |
| private ComponentName mAdminReceiverComponent; |
| private DevicePolicyManager mDevicePolicyManager; |
| private UserManager mUserMangaer; |
| private NfcAdapter mNfcAdapter; |
| private boolean mDisallowByPolicy; |
| |
| @Override |
| protected void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| setContentView(R.layout.byod_nfc_test_activity); |
| |
| mAdminReceiverComponent = new ComponentName(this, DeviceAdminTestReceiver.class.getName()); |
| mDevicePolicyManager = (DevicePolicyManager) getSystemService( |
| Context.DEVICE_POLICY_SERVICE); |
| mUserMangaer = (UserManager) getSystemService(Context.USER_SERVICE); |
| mDisallowByPolicy = getIntent().getBooleanExtra(EXTRA_DISALLOW_BY_POLICY, false); |
| if (mDisallowByPolicy) { |
| mDevicePolicyManager.addUserRestriction(mAdminReceiverComponent, |
| UserManager.DISALLOW_OUTGOING_BEAM); |
| } |
| |
| final Uri uri = createUriForImage(SAMPLE_IMAGE_FILENAME, SAMPLE_IMAGE_CONTENT); |
| Uri[] uris = new Uri[] { uri }; |
| |
| mNfcAdapter = NfcAdapter.getDefaultAdapter(this); |
| mNfcAdapter.setBeamPushUris(uris, this); |
| |
| findViewById(R.id.manual_beam_button).setOnClickListener(new OnClickListener() { |
| @Override |
| public void onClick(View view) { |
| mNfcAdapter.invokeBeam(NfcTestActivity.this); |
| } |
| }); |
| findViewById(R.id.intent_share_button).setOnClickListener(new OnClickListener() { |
| @Override |
| public void onClick(View view) { |
| Intent shareIntent = new Intent(Intent.ACTION_SEND); |
| shareIntent.putExtra(Intent.EXTRA_STREAM, uri); |
| shareIntent.setType("image/jpg"); |
| shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); |
| // Specify the package name of NfcBeamActivity so that the tester don't need to |
| // select the activity manually. |
| shareIntent.setClassName(NFC_BEAM_PACKAGE, NFC_BEAM_ACTIVITY); |
| try { |
| startActivity(shareIntent); |
| } catch (ActivityNotFoundException e) { |
| Toast.makeText(NfcTestActivity.this, |
| R.string.provisioning_byod_cannot_resolve_beam_activity, |
| Toast.LENGTH_SHORT).show(); |
| Log.e(TAG, "Nfc beam activity not found", e); |
| } |
| } |
| }); |
| } |
| |
| @Override |
| public void finish() { |
| if (mUserMangaer.hasUserRestriction(UserManager.DISALLOW_OUTGOING_BEAM)) { |
| mDevicePolicyManager.clearUserRestriction(mAdminReceiverComponent, |
| UserManager.DISALLOW_OUTGOING_BEAM); |
| } |
| super.finish(); |
| } |
| |
| /** |
| * Creates a Bitmap image that contains red on white text with a specified margin. |
| * @param text Text to be displayed in the image. |
| * @return A Bitmap image with the above specification. |
| */ |
| private Bitmap createSampleImage(String text) { |
| Paint paint = new Paint(); |
| paint.setStyle(Paint.Style.FILL); |
| paint.setTextSize(TEXT_SIZE); |
| Rect rect = new Rect(); |
| paint.getTextBounds(text, 0, text.length(), rect); |
| int w = 2 * MARGIN + rect.right - rect.left; |
| int h = 2 * MARGIN + rect.bottom - rect.top; |
| Bitmap dest = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); |
| Canvas canvas = new Canvas(); |
| canvas.setBitmap(dest); |
| paint.setColor(Color.WHITE); |
| canvas.drawPaint(paint); |
| paint.setColor(Color.RED); |
| canvas.drawText(text, MARGIN - rect.left, MARGIN - rect.top, paint); |
| return dest; |
| } |
| |
| private Uri createUriForImage(String name, String text) { |
| final File file = new File(getFilesDir() + File.separator + "images" |
| + File.separator + name); |
| file.getParentFile().mkdirs(); //if the folder doesn't exists it is created |
| try { |
| createSampleImage(text).compress(Bitmap.CompressFormat.JPEG, 100, |
| new FileOutputStream(file)); |
| } catch (FileNotFoundException e) { |
| return null; |
| } |
| return FileProvider.getUriForFile(this, |
| "com.android.cts.verifier.managedprovisioning.fileprovider", file); |
| } |
| } |