예제 #1
0
 private void clearAuthorizingDevices() {
   HashSet<BluetoothDevice> devices = mNotification.getAuthoringDevices();
   Iterator iterator = devices.iterator();
   if (iterator.hasNext()) {
     authorizeResponse((BluetoothDevice) iterator.next(), false);
   }
 }
예제 #2
0
        @Override
        public void onReceive(Context context, Intent intent) {
          String action = intent.getAction();
          log("receive intent:" + action);
          if (action.equals(BluetoothMap.ACTION_AUTHORIZE_RESULT)) {
            boolean allow = intent.getBooleanExtra(BluetoothMap.EXTRA_RESULT, false);
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

            authorizeResponse(device, allow);
          } else if (action.equals(BluetoothMap.ACTION_DISCONNECT_DEVICE)) {
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            disconnect(device);
          } else if (action.equals(BluetoothDevice.ACTION_NAME_CHANGED)) {
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            int state = mNotification.getDeviceState(device);
            if (state == BluetoothMap.STATE_AUTHORIZING) {
              mNotification.createNotification(
                  BluetoothMapNotification.ALERT_TYPE_AUTHORIZE, device, false);
            } else if (state == BluetoothMap.STATE_CONNECTED) {
              mNotification.createNotification(
                  BluetoothMapNotification.ALERT_TYPE_CONNECT, device, false);
            }
          } else if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) {
            int state =
                intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.BOND_NONE);
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            if (state == BluetoothDevice.BOND_NONE && mManager.isConnected(device)) {
              disconnect(device);
            }
          } else if (action.equals(BluetoothMapNotification.ACTION_MAP_CLEAR_NOTIFICATION)) {
            clearAuthorizingDevices();
          } else if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
            // when proxy binds to the service using BIND_AUTO_CREATE, the onDestroy will not be
            // called
            int state = BluetoothAdapter.getDefaultAdapter().getState();
            if (state == BluetoothAdapter.STATE_TURNING_OFF) {
              clearService();
            } else if (state == BluetoothAdapter.STATE_ON) {
              initService();
            }
          }
        }
예제 #3
0
  private synchronized boolean authorizeResponse(BluetoothDevice device, boolean accept) {
    boolean ret = false;
    // check the server state
    log("authorizeResponse: accept=" + accept);
    if (getState() == BluetoothMap.STATE_ENABLED || getState() == BluetoothMap.STATE_DISABLING) {
      int result = (accept == true) ? MAP.RESULT_OK : MAP.RESULT_ERROR;

      mNotification.removeNotification(BluetoothMapNotification.ALERT_TYPE_AUTHORIZE, device);

      authorizeResponseNative(device.getAddress(), result);
      ret = true;
    } else {
      log("MAP service has not been initialized");
      ret = false;
    }
    return ret;
  }
예제 #4
0
        //   @Override
        public void handleMessage(Message msg) {
          Instance instance;
          ArrayList<Instance> instances;
          int result = MAP.RESULT_ERROR;
          String addr;
          BluetoothDevice device = null;
          log("message received: " + msg.what);

          switch (msg.what) {
            case MAP_SERVER_ENABLE_CNF:
              /*to do: set state*/
              setState(BluetoothMap.STATE_ENABLED);
              sendMessage(obtainMessage(MAP_REGISTER_SERVER));
              onStateChanged(BluetoothMap.STATE_ENABLED);
              break;
            case MAP_SERVER_DISABLE_CNF:
              /*to do: set state*/
              mManager.removeAllInstances();
              setState(BluetoothMap.STATE_DISABLED);
              onStateChanged(BluetoothMap.STATE_DISABLED);
              deinitServer();
              break;
            case MAP_SERVER_REGISTER_CNF:
              instance = mManager.getInstanceById(msg.arg1);
              if (msg.arg2 >= 0 && instance != null) {
                instance.onInstanceRegistered();
              } else {
                mManager.removeInstance(msg.arg1);
              }
              break;
            case MAP_SERVER_DEREGISTER_CNF:
              instance = mManager.getInstanceById(msg.arg1);
              if (instance != null) {
                instance.onInstanceDeregistered();
              }
              mManager.removeInstance(msg.arg1);
              break;
            case MAP_SERVER_CONNECT_IND:
              instance = mManager.getInstanceById(msg.arg1);
              device = mAdapter.getRemoteDevice((String) msg.obj);
              if (instance != null) {
                instance.onDeviceConnected(device);
              } else {
                log("invalid instance ID is received");
                return;
              }

              mNotification.createNotification(
                  BluetoothMapNotification.ALERT_TYPE_CONNECT, device, true);
              break;
            case MAP_SERVER_DISCONNECT_CNF:
            case MAP_SERVER_DISCONNECT_IND:
              instance = mManager.getInstanceById(msg.arg1);
              device = mAdapter.getRemoteDevice((String) msg.obj);
              if (instance != null) {
                instance.onDeviceDisconnected(device);
              } else {
                log("invalid instance ID is received:" + msg.arg1);
              }
              if (mManager.getState(device) == BluetoothMap.STATE_DISCONNECTED) {
                mNotification.removeNotification(
                    BluetoothMapNotification.ALERT_TYPE_CONNECT, device);
              }
              if (mState == BluetoothMap.STATE_DISABLING) {
                removeMessages(MAP_DISCONNECT_INSTANCE_TIMEOUT, instance);
                disable(false);
              }
              break;
            case MAP_SERVER_SET_FOLDER:
              instance = mManager.getInstanceById(msg.arg1);
              if (msg.obj == null || instance == null) {
                log("SetFolderRequest or instance is null");
                return;
              }
              SetFolderRequest setFolderReq = (SetFolderRequest) msg.obj;
              result = instance.setFolder(setFolderReq);
              setFolderResponse(setFolderReq.getAddress(), msg.arg1, result);
              break;
            case MAP_SERVER_UPDATE_INBOX:
              instance = mManager.getInstanceById(msg.arg1);
              if (msg.obj == null || instance == null) {
                log("address or instance is null");
                return;
              }
              addr = (String) msg.obj;
              result = instance.updateInbox();
              updateInboxResponse(addr, msg.arg1, result);
              break;

            case MAP_SERVER_GET_MESSAGE_LIST:
              instance = mManager.getInstanceById(msg.arg1);
              if (msg.obj == null || instance == null) {
                log("address is null or instance is null");
                return;
              }
              MessageListRequest msgListReq = (MessageListRequest) msg.obj;
              MessageListObject msgListRsp = instance.getMessagelist(msgListReq);
              addr = msgListReq.getAddress();
              getMessageListResponse(addr, msg.arg1, MAP.RESULT_OK, msgListRsp);
              break;

            case MAP_SERVER_GET_FOLDER_LIST:
              instance = mManager.getInstanceById(msg.arg1);
              if (msg.obj == null || instance == null) {
                log("address is null or instance is null");
                return;
              }
              FolderListObject[] fodlerlistrsp = null;
              FolderListRequest folderListReq = (FolderListRequest) msg.obj;
              addr = folderListReq.getAddress();
              device = mAdapter.getRemoteDevice(addr);
              if (device != null && device.equals(instance.getDevice())) {
                fodlerlistrsp = instance.getFolderlist(folderListReq);
              }
              getFolderListResponse(addr, msg.arg1, MAP.RESULT_OK, fodlerlistrsp);
              break;
            case MAP_SERVER_GET_MESSAGE:
              instance = mManager.getInstanceById(msg.arg1);
              if (msg.obj == null || instance == null) {
                log("address is null or instance is null");
                return;
              }
              MessageRequest messagereq = (MessageRequest) msg.obj;
              BMessageObject messagersp = instance.getMessage(messagereq);
              if (messagersp != null) {
                result = MAP.RESULT_OK;
              }
              addr = messagereq.getAddress();
              getMessageResponse(addr, msg.arg1, result, messagersp);
              /*	if (messagersp != null) {
              messagersp.reset();
              } */
              break;
            case MAP_SERVER_SET_NOTIFICATION:
              instance = mManager.getInstanceById(msg.arg1);
              if (msg.obj == null || instance == null) {
                log("address is null or instance is null");
                return;
              }
              result = MAP.RESULT_OK;
              setNotificationRegResponse((String) msg.obj, msg.arg1, result);
              break;
            case MAP_SERVER_SEND_REPORT_CNF:
              instance = mManager.getInstanceById(msg.arg1);
              if (msg.obj == null || instance == null) {
                log("address is null or instance is null");
                return;
              }
              mEventManager.onEventSentCompleted();
              break;
            case MAP_SERVER_AUTHORIZE_IND:
              // TODO: launch an alert to notify user that a device is trying to access local
              // resource
              if (msg.obj == null) {
                log("address is null");
                return;
              }
              device = mAdapter.getRemoteDevice((String) msg.obj);
              int state = mNotification.getDeviceState(device);
              if (state == BluetoothMap.STATE_NONE) {
                mNotification.createNotification(
                    BluetoothMapNotification.ALERT_TYPE_AUTHORIZE, device, true);
              } else if (state == BluetoothMap.STATE_CONNECTED) {
                // already connected
                authorizeResponse(device, true);
              } else if (state == BluetoothMap.STATE_AUTHORIZING) {
                log("the device is authorizing");
                // do nothing
              } else {
                log("unexpected state : " + state);
                authorizeResponse(device, false);
              }
              break;
            case MAP_SERVER_PUSH_MESSAGE:
              instance = mManager.getInstanceById(msg.arg1);
              if (msg.obj == null || instance == null) {
                log("address is null or instance is null");
                return;
              }
              BMessageObject bMessageobject = instance.getBMessageObject();
              bMessageobject.reset();
              if (parseMessage((String) msg.obj, msg.arg1, bMessageobject) == false) {
                result = MAP.RESULT_ERROR;
              } else {
                if (instance.pushMessage(bMessageobject)) {
                  result = MAP.RESULT_OK;
                } else {
                  result = MAP.RESULT_ERROR;
                }
              }
              sendMessageResponse((String) msg.obj, msg.arg1, result, bMessageobject.getHandle());
              break;
              /*		case MAP_SERVER_DELETE_MESSAGE:
              instance = mManager.getInstanceById(msg.arg1);
              if (msg.obj == null || instance == null) {
              	log("address is null or instance is null");
              	return;
              }
              //BMessageObject bMessageobject = instance.getBMessageObject();
              //sendMessageResponse((String) msg.obj, msg.arg1 ,bMessageobject);
              if(instance.deleteMessage(msg.arg1, msg.arg2)){
              	result = MAP.RESULT_OK;
              } else {
              	result = MAP.RESULT_ERROR;
              }
              setMessageStatusResponse((String)msg.obj, msg.arg1, result);
              break;
              */
            case MAP_SERVER_SET_MESSAGE_STATUS:
              instance = mManager.getInstanceById(msg.arg1);
              if (msg.obj == null || instance == null) {
                log("address is null or instance is null");
                return;
              }
              StatusSwitchRequest req = (StatusSwitchRequest) msg.obj;
              if (instance.setMessageStatus(req)) {
                result = MAP.RESULT_OK;
              } else {
                result = MAP.RESULT_ERROR;
              }
              addr = req.getAddress();
              setMessageStatusResponse(addr, msg.arg1, result);
              break;
            case MAP_SERVER_MNS_DISCONNCET_CNF:
              device = mAdapter.getRemoteDevice((String) msg.obj);
              instances = mManager.getInstanceByDevice(device);
              for (int i = 0; i < instances.size(); i++) {
                instances.get(i).deregisterCallback();
              }
              if (mState == BluetoothMap.STATE_DISABLING) {
                disable(false);
              }
              break;
            case MAP_SERVER_MNS_CONNECT_CNF:
              if (msg.arg1 == MAP.RESULT_ERROR) {
                log("fail to set up mns connection");
              } else {
                device = mAdapter.getRemoteDevice((String) msg.obj);
                instances = mManager.getInstanceByDevice(device);
                for (int i = 0; i < instances.size(); i++) {
                  instances.get(i).registerCallback(mEventManager);
                }
              }
              break;
            case MAP_REGISTER_SERVER:
              if (NetworkUtil.isPhoneRadioReady()) {
                registerServer();
              } else {
                mRegSrvCnt++;
                if (mRegSrvCnt < 10) {
                  sendMessageDelayed(
                      obtainMessage(MAP_REGISTER_SERVER), REGISTER_SERVER_DELAY_DURATION);
                } else {
                  log("Network is still not ready after 10s, so phone radio maybe is in error");
                }
              }
              break;
            case MAP_DISCONNECT_INSTANCE_TIMEOUT:
              instance = (Instance) msg.obj;
              if (instance != null) {
                instance.onDeviceDisconnected(instance.getDevice());
                if (mState == BluetoothMap.STATE_DISABLING) {
                  disable(false);
                }
              }
              break;
            default:
              log("Unrecognized message");
          }
        }