/*
* 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;
}
}