code: /*
   * Copyright 2016 Google Inc. All rights reserved.
   *
   * 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 org.physical_web.physicalweb;
  
  import android.annotation.TargetApi;
  import android.app.Activity;
  import android.bluetooth.BluetoothAdapter;
  import android.bluetooth.BluetoothManager;
  import android.content.BroadcastReceiver;
  import android.content.Context;
  import android.content.Intent;
  import android.content.IntentFilter;
  import android.net.Uri;
  import android.os.Build;
  import android.os.Bundle;
  import android.util.Patterns;
  import android.widget.Toast;
  
  import java.util.ArrayList;
  import java.util.List;
  import java.util.regex.Matcher;
  
  /**
   * This is the main entry point for the broadcasting service.
   * Handles the share intent.
   */
  public class BroadcastActivity extends Activity {
  
      private static final String TAG  = BroadcastActivity.class.getSimpleName();
      private static final int ENABLE_BLUETOOTH_REQUEST_ID = 1;
      public static final int MAX_URI_LENGTH = 18;
      private final BroadcastReceiver serverStartReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
          finish();
        }
      };
  
      @Override
      protected void onActivityResult (int requestCode, int resultCode, Intent data) {
          Log.d(TAG, "onActivityResult");
          if (requestCode == ENABLE_BLUETOOTH_REQUEST_ID && resultCode == -1) {
              checkBleAndStart();
          } else {
              Toast.makeText(this, getString(R.string.bt_on), Toast.LENGTH_LONG).show();
          }
          finish();
      }
  
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          registerReceiver(serverStartReceiver, new IntentFilter("server"));
      }
  
      @Override
      protected void onDestroy() {
          unregisterReceiver(serverStartReceiver);
          super.onDestroy();
      }
  
      @Override
      protected void onStart() {
          super.onStart();
          Intent intent = getIntent();
          String type = intent.getType();
          String text = intent.getStringExtra(Intent.EXTRA_TEXT);
          if (type.equals("text/plain")) {
              if (Build.VERSION.SDK_INT < 21) {
                  Toast.makeText(this, getString(R.string.ble_os_error),
                      Toast.LENGTH_LONG).show();
                  return;
              }
              if (!checkIfBluetoothIsEnabled()) {
                  Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                  startActivityForResult(enableBtIntent, ENABLE_BLUETOOTH_REQUEST_ID);
              } else {
                  checkBleAndStart();
              }
          } else if (type.startsWith("image/") || type.startsWith("text/html") ||
              type.startsWith("video") || type.startsWith("audio")) {
              Log.d(TAG, type);
              Uri fileUri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
              Log.d(TAG, fileUri.toString());
              startFileBroadcastService(fileUri.toString(), type);
          }
      }
  
      private void checkBleAndStart() {
          if (hasBleAdvertiseCapability()) {
              parseAndHandleUrl();
          } else {
              Toast.makeText(this, getString(R.string.ble_error),
                  Toast.LENGTH_LONG).show();
          }
          finish();
      }
  
      // Check if bluetooth is on
      private boolean checkIfBluetoothIsEnabled() {
          BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(
              Context.BLUETOOTH_SERVICE);
          BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
          if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) {
            Log.d(TAG, "not enabled");
              return false;
          }
          Log.d(TAG, "enabled");
          return true;
      }
  
      // Check if the given bluetooth hardware
      // on the current device supports ble advertisemetns
      @TargetApi(21)
      private boolean hasBleAdvertiseCapability() {
          BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(
              Context.BLUETOOTH_SERVICE);
          if (bluetoothManager.getAdapter().getBluetoothLeAdvertiser() == null) {
              Log.d(TAG, "cant advertise");
              return false;
          }
          Log.d(TAG, "can advertise");
          return true;
      }
  
      private void parseAndHandleUrl() {
          Intent intent = getIntent();
          String action = intent.getAction();
          String type = intent.getType();
          String text = intent.getStringExtra(Intent.EXTRA_TEXT);
          // Look to see if the text contains a URL
          String url = findUrlInText(text);
          // If the text is a URL
          if (url != null) {
              startBroadcastService(url);
          } else {
              Toast.makeText(this, getString(R.string.no_url_error),
                  Toast.LENGTH_LONG).show();
          }
      }
  
      private void startBroadcastService(String url) {
          Intent intent = new Intent(this, PhysicalWebBroadcastService.class);
          intent.putExtra(PhysicalWebBroadcastService.DISPLAY_URL_KEY, url);
          startService(intent);
      }
  
      private void startFileBroadcastService(String uri, String type) {
          Intent intent = new Intent(this, FileBroadcastService.class);
          intent.putExtra(FileBroadcastService.FILE_KEY, uri);
          intent.putExtra(FileBroadcastService.MIME_TYPE_KEY, type);
          startService(intent);
      }
  
      // Check if the given text contains a URL
      private String findUrlInText(String text) {
          List<String> urls = new ArrayList<>();
          Matcher m = Patterns.WEB_URL.matcher(text);
          while (m.find()) {
              String url = m.group();
              urls.add(url);
          }
          if (urls.size() > 0) {
              return urls.get(0);
          }
          return null;
      }
  }
  