Home | History | Annotate | Download | only in bluetooth
      1 /*
      2  * Copyright (C) 2014 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.tv.settings.util.bluetooth;
     18 
     19 import android.text.TextUtils;
     20 
     21 import java.util.regex.Matcher;
     22 import java.util.regex.Pattern;
     23 
     24 /**
     25  * Helper functions and constants for reading the information passed via the Bluetooth
     26  * name of the hub.
     27  */
     28 public class BluetoothNameUtils {
     29     /*
     30      * matches string that
     31      *   - may or may not start with a one- or two-digit number followed by a space
     32      *   - a string surrounded by quotes
     33      *   - a string surrounded by parentheses
     34      */
     35     private static final Pattern NAME_PATTERN = Pattern.compile(
     36             "\"([0-9]{0,3}) ?(.*)\" \\((.*)\\)", Pattern.CASE_INSENSITIVE);
     37     private static final Pattern COLOR_PATTERN = Pattern.compile(
     38             "#([0-9a-f]{6})-#([0-9a-f]{6})(p?)(t?)(.*)", Pattern.CASE_INSENSITIVE);
     39 
     40     /**
     41      * Decode the setup type integer from the Bluetooth device name.
     42      * @param bluetoothName
     43      * @return The integer value of the setup code, or -1 if no code is present.
     44      */
     45     public static int getSetupType(String bluetoothName) {
     46         Matcher matcher = NAME_PATTERN.matcher(bluetoothName);
     47         if (!matcher.matches()) {
     48             return -1;
     49         }
     50 
     51         String typeStr = matcher.group(1);
     52 
     53         if (typeStr != null) {
     54             try {
     55                 return Integer.parseInt(typeStr);
     56             } catch (NumberFormatException e) {
     57                 return -1;
     58             }
     59         } else {
     60             return -1;
     61         }
     62     }
     63 
     64     /**
     65      * Decode the LED configuration contained in the input string.
     66      * @param bluetoothName
     67      * @return The LedConfiguration or none if one can not be parsed from the string.
     68      */
     69     public static LedConfiguration getColorConfiguration(String bluetoothName) {
     70         Matcher matcher = NAME_PATTERN.matcher(bluetoothName);
     71         if (!matcher.matches()) {
     72             return null;
     73         }
     74 
     75         final String cs = matcher.group(3);
     76         if (TextUtils.isEmpty(cs)) {
     77             return null;
     78         } else {
     79             final Matcher cm = COLOR_PATTERN.matcher(cs);
     80             if (!cm.matches()) {
     81                 return null;
     82             }
     83             LedConfiguration config = new LedConfiguration(
     84                     0xff000000 | Integer.parseInt(cm.group(1), 16),
     85                     0xff000000 | Integer.parseInt(cm.group(2), 16),
     86                     "p".equals(cm.group(3)));
     87             config.isTransient = "t".equals(cm.group(4));
     88             return config;
     89         }
     90     }
     91 
     92     /**
     93      * Check if the name matches the expected format for a hub Bluetooth name.
     94      * @param name
     95      * @return true if the pattern matches, false if it doesn't.
     96      */
     97     public static boolean isValidName(String name) {
     98         Matcher matcher = NAME_PATTERN.matcher(name);
     99         return matcher.matches();
    100     }
    101 
    102     private BluetoothNameUtils() {
    103         // DO NOT INSTANTIATE
    104     }
    105 }
    106