1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.cts.verifier.bluetooth; 18 19 import com.android.cts.verifier.PassFailButtons; 20 import com.android.cts.verifier.R; 21 22 import java.lang.Math; 23 import java.util.Set; 24 import java.util.Map; 25 import java.util.HashMap; 26 27 import android.bluetooth.le.AdvertiseSettings; 28 import android.content.BroadcastReceiver; 29 import android.content.Context; 30 import android.content.Intent; 31 import android.content.IntentFilter; 32 import android.graphics.Color; 33 import android.os.Bundle; 34 import android.util.Log; 35 import android.widget.TextView; 36 import android.widget.Toast; 37 38 public class BleScannerPowerLevelActivity extends PassFailButtons.Activity { 39 40 private static final String TAG = "BleScannerPowerLevel"; 41 42 private Map<Integer, TextView> mMacText; 43 private Map<Integer, TextView> mCountText; 44 private Map<Integer, TextView> mRssiText; 45 private Map<Integer, TextView> mSetPowerText; 46 private Map<Integer, Integer> mCount; 47 private int[] mPowerLevel; 48 49 private static final int[] POWER_DBM = {-21, -15, -7, 1, 9}; 50 private static final int ADV_TX_POWER_LEVEL_ALLOWANCE = 5; 51 52 @Override 53 public void onCreate(Bundle savedInstanceState) { 54 super.onCreate(savedInstanceState); 55 setContentView(R.layout.ble_scanner_power_level); 56 setPassFailButtonClickListeners(); 57 setInfoResources(R.string.ble_power_level_name, 58 R.string.ble_power_level_info, -1); 59 60 mRssiText = new HashMap<Integer, TextView>(); 61 mCountText = new HashMap<Integer, TextView>(); 62 mCount = null; 63 mMacText = new HashMap<Integer, TextView>(); 64 mSetPowerText = new HashMap<Integer, TextView>(); 65 mPowerLevel = new int[]{AdvertiseSettings.ADVERTISE_TX_POWER_ULTRA_LOW, 66 AdvertiseSettings.ADVERTISE_TX_POWER_LOW, 67 AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM, 68 AdvertiseSettings.ADVERTISE_TX_POWER_HIGH}; 69 70 mMacText.put(AdvertiseSettings.ADVERTISE_TX_POWER_ULTRA_LOW, 71 (TextView)findViewById(R.id.ble_ultra_low_mac)); 72 mMacText.put(AdvertiseSettings.ADVERTISE_TX_POWER_LOW, 73 (TextView)findViewById(R.id.ble_low_mac)); 74 mMacText.put(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM, 75 (TextView)findViewById(R.id.ble_medium_mac)); 76 mMacText.put(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH, 77 (TextView)findViewById(R.id.ble_high_mac)); 78 79 mCountText.put(AdvertiseSettings.ADVERTISE_TX_POWER_ULTRA_LOW, 80 (TextView)findViewById(R.id.ble_ultra_low_count)); 81 mCountText.put(AdvertiseSettings.ADVERTISE_TX_POWER_LOW, 82 (TextView)findViewById(R.id.ble_low_count)); 83 mCountText.put(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM, 84 (TextView)findViewById(R.id.ble_medium_count)); 85 mCountText.put(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH, 86 (TextView)findViewById(R.id.ble_high_count)); 87 88 mRssiText.put(AdvertiseSettings.ADVERTISE_TX_POWER_ULTRA_LOW, 89 (TextView)findViewById(R.id.ble_ultra_low_rssi)); 90 mRssiText.put(AdvertiseSettings.ADVERTISE_TX_POWER_LOW, 91 (TextView)findViewById(R.id.ble_low_rssi)); 92 mRssiText.put(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM, 93 (TextView)findViewById(R.id.ble_medium_rssi)); 94 mRssiText.put(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH, 95 (TextView)findViewById(R.id.ble_high_rssi)); 96 97 mSetPowerText.put(AdvertiseSettings.ADVERTISE_TX_POWER_ULTRA_LOW, 98 (TextView)findViewById(R.id.ble_ultra_low_set_power)); 99 mSetPowerText.put(AdvertiseSettings.ADVERTISE_TX_POWER_LOW, 100 (TextView)findViewById(R.id.ble_low_set_power)); 101 mSetPowerText.put(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM, 102 (TextView)findViewById(R.id.ble_medium_set_power)); 103 mSetPowerText.put(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH, 104 (TextView)findViewById(R.id.ble_high_set_power)); 105 106 Intent intent = new Intent(this, BleScannerService.class); 107 intent.putExtra(BleScannerService.EXTRA_COMMAND, BleScannerService.COMMAND_POWER_LEVEL); 108 startService(intent); 109 } 110 111 @Override 112 public void onResume() { 113 super.onResume(); 114 115 IntentFilter filter = new IntentFilter(); 116 filter.addAction(BleScannerService.BLE_POWER_LEVEL); 117 filter.addAction(BleScannerService.BLE_PRIVACY_NEW_MAC_RECEIVE); 118 registerReceiver(onBroadcast, filter); 119 } 120 121 @Override 122 public void onPause() { 123 super.onPause(); 124 unregisterReceiver(onBroadcast); 125 } 126 127 @Override 128 public void onDestroy() { 129 super.onDestroy(); 130 stopService(new Intent(this, BleScannerService.class)); 131 } 132 133 private BroadcastReceiver onBroadcast = new BroadcastReceiver() { 134 @Override 135 public void onReceive(Context context, Intent intent) { 136 switch (intent.getAction()) { 137 case BleScannerService.BLE_POWER_LEVEL: 138 int powerLevelBit = intent.getIntExtra( 139 BleScannerService.EXTRA_POWER_LEVEL_BIT, -1); 140 int powerLevel = intent.getIntExtra(BleScannerService.EXTRA_POWER_LEVEL, -2); 141 if (powerLevelBit < 0 || powerLevelBit > 3) { 142 Toast.makeText(context, "Invalid power level", Toast.LENGTH_SHORT).show(); 143 break; 144 } 145 146 if (mCount == null) { 147 mCount = new HashMap<Integer, Integer>(); 148 for (int i : mPowerLevel) { 149 mCount.put(i, 0); 150 } 151 } 152 Integer t = mCount.get(powerLevelBit) + 1; 153 mCount.put(powerLevelBit, t); 154 mCountText.get(powerLevelBit).setText(t.toString()); 155 156 mMacText.get(powerLevelBit) 157 .setText(intent.getStringExtra(BleScannerService.EXTRA_MAC_ADDRESS)); 158 mRssiText.get(powerLevelBit) 159 .setText(intent.getStringExtra(BleScannerService.EXTRA_RSSI)); 160 161 if ((POWER_DBM[powerLevelBit] >= powerLevel) && 162 ((POWER_DBM[powerLevelBit] - ADV_TX_POWER_LEVEL_ALLOWANCE) <= powerLevel)) { 163 mSetPowerText.get(powerLevelBit).setText("Valid power level"); 164 } else { 165 mSetPowerText.get(powerLevelBit) 166 .setText("Unknown BLe advertise tx power: " + powerLevel); 167 } 168 break; 169 case BleScannerService.BLE_PRIVACY_NEW_MAC_RECEIVE: 170 Toast.makeText(context, "New MAC address detected", Toast.LENGTH_SHORT) 171 .show(); 172 break; 173 } 174 } 175 }; 176 } 177