Home | History | Annotate | Download | only in bluetooth
      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