Showing preview only (804K chars total). Download the full file or copy to clipboard to get everything.
Repository: lunan0320/Pioneer
Branch: main
Commit: 107369941b2e
Files: 258
Total size: 672.7 KB
Directory structure:
gitextract_i2vhfrty/
├── Android_apk/
│ └── appAndroid.apk
├── Android_app/
│ ├── app/
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── proguard-rules.pro
│ │ └── src/
│ │ ├── androidTest/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── ABC/
│ │ │ └── pioneer/
│ │ │ └── app/
│ │ │ └── ExampleInstrumentedTest.java
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── assets/
│ │ │ │ ├── Pioneer.keystore
│ │ │ │ └── server.p12
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── ABC/
│ │ │ │ └── pioneer/
│ │ │ │ └── app/
│ │ │ │ ├── AppDelegate.java
│ │ │ │ ├── LoginActivity.java
│ │ │ │ ├── MainActivity.java
│ │ │ │ ├── RegisterActivity.java
│ │ │ │ ├── SplashActivity.java
│ │ │ │ ├── Target.java
│ │ │ │ ├── TargetListAdapter.java
│ │ │ │ ├── TokenActivity.java
│ │ │ │ ├── fragment/
│ │ │ │ │ ├── FragmentActivity1.java
│ │ │ │ │ ├── FragmentActivity2.java
│ │ │ │ │ └── FragmentActivity3.java
│ │ │ │ └── ignoreBatteryOpt.java
│ │ │ └── res/
│ │ │ ├── drawable/
│ │ │ │ ├── border_input_box.xml
│ │ │ │ ├── button_background.xml
│ │ │ │ ├── ic_launcher_background.xml
│ │ │ │ └── token_background.xml
│ │ │ ├── drawable-v24/
│ │ │ │ └── ic_launcher_foreground.xml
│ │ │ ├── layout/
│ │ │ │ ├── activity_bluetooth.xml
│ │ │ │ ├── activity_bottom_bar.xml
│ │ │ │ ├── activity_login.xml
│ │ │ │ ├── activity_payload.xml
│ │ │ │ ├── activity_register.xml
│ │ │ │ ├── activity_splash.xml
│ │ │ │ ├── activity_token.xml
│ │ │ │ ├── activity_token_pre.xml
│ │ │ │ ├── activity_user.xml
│ │ │ │ ├── custom_notification.xml
│ │ │ │ └── listview_targets_row.xml
│ │ │ ├── mipmap-anydpi-v26/
│ │ │ │ ├── ic_launcher.xml
│ │ │ │ └── ic_launcher_round.xml
│ │ │ └── values/
│ │ │ ├── colors.xml
│ │ │ ├── ic_launcher_background.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── ABC/
│ │ └── pioneer/
│ │ └── app/
│ │ └── ExampleUnitTest.java
│ ├── build.gradle
│ ├── gradle/
│ │ └── wrapper/
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
│ ├── gradle.properties
│ ├── gradlew
│ ├── gradlew.bat
│ ├── local.properties
│ ├── pioneer/
│ │ ├── .gitignore
│ │ ├── BuildConfig.java
│ │ ├── app/
│ │ │ └── BuildConfig.java
│ │ ├── build.gradle
│ │ ├── consumer-rules.pro
│ │ ├── proguard-rules.pro
│ │ └── src/
│ │ ├── androidTest/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── ABC/
│ │ │ └── pioneer/
│ │ │ └── sensor/
│ │ │ └── ExampleInstrumentedTest.java
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── ABC/
│ │ │ └── pioneer/
│ │ │ └── sensor/
│ │ │ ├── DefaultSensorDelegate.java
│ │ │ ├── Device.java
│ │ │ ├── PayloadSupplier.java
│ │ │ ├── Sensor.java
│ │ │ ├── SensorArray.java
│ │ │ ├── SensorDelegate.java
│ │ │ ├── analysis/
│ │ │ │ └── Sample.java
│ │ │ ├── ble/
│ │ │ │ ├── BLEDatabaseDelegate.java
│ │ │ │ ├── BLEDevice.java
│ │ │ │ ├── BLESensor.java
│ │ │ │ ├── BluetoothStateManager.java
│ │ │ │ ├── BluetoothStateManagerDelegate.java
│ │ │ │ ├── Configurations.java
│ │ │ │ ├── Database.java
│ │ │ │ ├── DeviceAttribute.java
│ │ │ │ ├── DeviceDelegate.java
│ │ │ │ ├── DeviceOperatingSystem.java
│ │ │ │ ├── DeviceState.java
│ │ │ │ ├── DeviceUpdatedComparator.java
│ │ │ │ ├── Receiver.java
│ │ │ │ ├── SpecificBLESensor.java
│ │ │ │ ├── SpecificBluetoothStateManager.java
│ │ │ │ ├── SpecificDatabase.java
│ │ │ │ ├── SpecificReceiver.java
│ │ │ │ ├── SpecificTransmitter.java
│ │ │ │ ├── Timer.java
│ │ │ │ ├── TimerDelegate.java
│ │ │ │ ├── Transmitter.java
│ │ │ │ ├── TxPower.java
│ │ │ │ └── filter/
│ │ │ │ ├── BLEAppleManuSeg.java
│ │ │ │ ├── BLEDeviceFilter.java
│ │ │ │ ├── BLEManuData.java
│ │ │ │ ├── BLEParser.java
│ │ │ │ ├── BLEScanResponseData.java
│ │ │ │ ├── BLESeg.java
│ │ │ │ ├── BLESegType.java
│ │ │ │ └── BLEServiceData.java
│ │ │ ├── client/
│ │ │ │ └── controller/
│ │ │ │ └── PioneerClient.java
│ │ │ ├── data/
│ │ │ │ ├── BatteryLog.java
│ │ │ │ ├── CalibrationLog.java
│ │ │ │ ├── ConcretePayloadDataFormatter.java
│ │ │ │ ├── ContactLog.java
│ │ │ │ ├── DetectionLog.java
│ │ │ │ ├── EventTimeIntervalLog.java
│ │ │ │ ├── PayloadDataFormatter.java
│ │ │ │ ├── StatisticsLog.java
│ │ │ │ └── TextFile.java
│ │ │ ├── datatype/
│ │ │ │ ├── Base64.java
│ │ │ │ ├── BluetoothState.java
│ │ │ │ ├── Calibration.java
│ │ │ │ ├── CalibrationMeasurementUnit.java
│ │ │ │ ├── Callback.java
│ │ │ │ ├── Data.java
│ │ │ │ ├── Encounter.java
│ │ │ │ ├── Float16.java
│ │ │ │ ├── ImmediateSendData.java
│ │ │ │ ├── InertiaLocationReference.java
│ │ │ │ ├── Int16.java
│ │ │ │ ├── Int32.java
│ │ │ │ ├── Int64.java
│ │ │ │ ├── Int8.java
│ │ │ │ ├── LegacyPayload.java
│ │ │ │ ├── Location.java
│ │ │ │ ├── LocationReference.java
│ │ │ │ ├── PayloadData.java
│ │ │ │ ├── PayloadSharingData.java
│ │ │ │ ├── PayloadTimestamp.java
│ │ │ │ ├── PlacenameLocationReference.java
│ │ │ │ ├── Proximity.java
│ │ │ │ ├── ProximityMeasurementUnit.java
│ │ │ │ ├── PseudoDeviceAddress.java
│ │ │ │ ├── RSSI.java
│ │ │ │ ├── RandomSource.java
│ │ │ │ ├── SensorState.java
│ │ │ │ ├── SensorType.java
│ │ │ │ ├── SignalCharacteristicData.java
│ │ │ │ ├── SignalCharacteristicDataType.java
│ │ │ │ ├── TargetIdentifier.java
│ │ │ │ ├── TimeInterval.java
│ │ │ │ ├── Triple.java
│ │ │ │ ├── Tuple.java
│ │ │ │ ├── UInt16.java
│ │ │ │ ├── UInt32.java
│ │ │ │ ├── UInt64.java
│ │ │ │ └── UInt8.java
│ │ │ ├── motion/
│ │ │ │ ├── ConcreteInertiaSensor.java
│ │ │ │ └── InertiaSensor.java
│ │ │ ├── payload/
│ │ │ │ ├── Crypto/
│ │ │ │ │ ├── BasicFunc.java
│ │ │ │ │ ├── CipherParameters.java
│ │ │ │ │ ├── ContactIdentifier.java
│ │ │ │ │ ├── ContactKey.java
│ │ │ │ │ ├── ContactKeySeed.java
│ │ │ │ │ ├── Digest.java
│ │ │ │ │ ├── DigestRandomGenerator.java
│ │ │ │ │ ├── ExtendedDigest.java
│ │ │ │ │ ├── GeneralDigest.java
│ │ │ │ │ ├── GenerateKey.java
│ │ │ │ │ ├── HMACSHA256.java
│ │ │ │ │ ├── HMac.java
│ │ │ │ │ ├── KeyParameter.java
│ │ │ │ │ ├── Mac.java
│ │ │ │ │ ├── MatchingKey.java
│ │ │ │ │ ├── MatchingKeySeed.java
│ │ │ │ │ ├── Memoable.java
│ │ │ │ │ ├── PioneerHMac.java
│ │ │ │ │ ├── PioneerHash.java
│ │ │ │ │ ├── PioneerPRG.java
│ │ │ │ │ ├── RandomGenerator.java
│ │ │ │ │ ├── SM3Digest.java
│ │ │ │ │ ├── SecretKey.java
│ │ │ │ │ ├── SpecificUsePayloadSupplier.java
│ │ │ │ │ ├── UsePayloadSupplier.java
│ │ │ │ │ └── Util.java
│ │ │ │ ├── DefaultPayloadSupplier.java
│ │ │ │ ├── DigitalSignature.java
│ │ │ │ └── extended/
│ │ │ │ ├── ConcreteExtendedDataSectionV1.java
│ │ │ │ ├── ConcreteExtendedDataV1.java
│ │ │ │ └── ExtendedData.java
│ │ │ └── service/
│ │ │ ├── AlarmReceiver.java
│ │ │ ├── Connection.java
│ │ │ ├── CustomTimer.java
│ │ │ ├── ForegroundService.java
│ │ │ ├── MatchDelegate.java
│ │ │ ├── NotificationService.java
│ │ │ └── PioneerDb.java
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── ABC/
│ │ └── pioneer/
│ │ └── sensor/
│ │ └── ExampleUnitTest.java
│ └── settings.gradle
├── IOS_app/
│ └── Pioneer_ios/
│ └── Pioneer Framework/
│ ├── Certificate/
│ │ ├── client.p12
│ │ └── server.cer
│ ├── Pioneer/
│ │ ├── ContactLogData/
│ │ │ └── ContactLog.xcdatamodeld/
│ │ │ ├── .xccurrentversion
│ │ │ └── ContactLog.xcdatamodel/
│ │ │ └── contents
│ │ ├── Crypto/
│ │ │ ├── CipherParameters.swift
│ │ │ ├── Crypto.swift
│ │ │ ├── Digest.swift
│ │ │ ├── DigestRandomNumber.swift
│ │ │ ├── ExtendedDigest.swift
│ │ │ ├── GeneralDigest.swift
│ │ │ ├── HMAC.swift
│ │ │ ├── KeyParameter.swift
│ │ │ ├── MAC.swift
│ │ │ ├── Memoable.swift
│ │ │ ├── PioneerHMac.swift
│ │ │ ├── PioneerHash.swift
│ │ │ ├── RandomGenerator.swift
│ │ │ ├── SM3Digest.swift
│ │ │ └── Util.swift
│ │ ├── Info.plist
│ │ ├── Manager/
│ │ │ ├── Connection.swift
│ │ │ ├── GlobalConfiguration.swift
│ │ │ ├── KeyManager.swift
│ │ │ ├── ManagerDelegate.swift
│ │ │ ├── Register.swift
│ │ │ └── UploadManager.swift
│ │ ├── Pioneer.h
│ │ └── Sensor/
│ │ ├── BLE/
│ │ │ ├── BLEDatabase.swift
│ │ │ ├── BLEReceiver.swift
│ │ │ ├── BLESensor.swift
│ │ │ ├── BLETransmitter.swift
│ │ │ └── BLEUtilities.swift
│ │ ├── Data/
│ │ │ ├── BatteryLog.swift
│ │ │ └── SensorLogger.swift
│ │ ├── Device.swift
│ │ ├── Extensions/
│ │ │ ├── DataExtensions.swift
│ │ │ └── DateExtensions.swift
│ │ ├── Location/
│ │ │ └── LocationSensor.swift
│ │ ├── Payload/
│ │ │ ├── PayloadDataMatcher.swift
│ │ │ ├── PayloadDataSupplier.swift
│ │ │ └── SpecificImplement/
│ │ │ ├── SpecificPayloadDataMatcher.swift
│ │ │ └── SpecificPayloadDataSupplier.swift
│ │ ├── Sensor.swift
│ │ ├── SensorArray.swift
│ │ └── SensorDelegate.swift
│ ├── Pioneer.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ ├── xcshareddata/
│ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ └── xcuserdata/
│ │ │ └── Beh.xcuserdatad/
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata/
│ │ └── Beh.xcuserdatad/
│ │ └── xcschemes/
│ │ └── xcschememanagement.plist
│ └── PioneerTests/
│ ├── Info.plist
│ └── PioneerTests.swift
├── README.md
├── Server/
│ ├── bin/
│ │ ├── db.properties
│ │ └── lib/
│ │ └── mysql-connector-java-5.1.49-bin.jar
│ └── src/
│ ├── com/
│ │ ├── bean/
│ │ │ ├── User.java
│ │ │ └── UserMessage.java
│ │ ├── controller/
│ │ │ ├── PioneerClient.java
│ │ │ └── PioneerServer.java
│ │ ├── dao/
│ │ │ ├── RandomGenerator.java
│ │ │ ├── TaskThread.java
│ │ │ ├── UserDao.java
│ │ │ └── UserDao_Imp.java
│ │ └── jdbc/
│ │ └── JDBCUtils.java
│ ├── db.properties
│ └── lib/
│ └── mysql-connector-java-5.1.49-bin.jar
├── Server_jar/
│ ├── META-INF/
│ │ └── MANIFEST.MF
│ ├── db.properties
│ ├── mysql-connector-java-5.1.49-bin.jar
│ ├── org.hamcrest.core_1.3.0.v20180420-1519.jar
│ └── org.junit_4.13.0.v20200204-1500.jar
└── Test/
├── Contribution.md
└── README.md
================================================
FILE CONTENTS
================================================
================================================
FILE: Android_app/app/.gitignore
================================================
/build
================================================
FILE: Android_app/app/build.gradle
================================================
plugins {
id 'com.android.application'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.sdu.pioneer.app"
minSdkVersion 26
targetSdkVersion 30
versionCode 1
versionName "1.2.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
lintOptions {
checkReleaseBuilds false
abortOnError false
}
packagingOptions {
exclude 'classes.dex'
exclude '**.**'
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation project(path: ':pioneer')
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
================================================
FILE: Android_app/app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
================================================
FILE: Android_app/app/src/androidTest/java/com/ABC/pioneer/app/ExampleInstrumentedTest.java
================================================
package com.ABC.pioneer.app;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.sdu.pioneer.app", appContext.getPackageName());
}
}
================================================
FILE: Android_app/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ABC.pioneer.app">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<application
android:name="com.ABC.pioneer.app.AppDelegate"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="Pioneer"
android:roundIcon="@mipmap/ic_launcher"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:launchMode="singleTop">
<activity
android:name="com.ABC.pioneer.app.MainActivity"
android:configChanges="orientation"
android:screenOrientation="portrait">
</activity>
<activity android:name=".LoginActivity">
</activity>
<activity android:name="com.ABC.pioneer.app.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.ABC.pioneer.app.RegisterActivity">
</activity>
<activity android:name="com.ABC.pioneer.app.TokenActivity">
</activity>
</application>
</manifest>
================================================
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/AppDelegate.java
================================================
package com.ABC.pioneer.app;
import android.app.Application;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Build;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import com.ABC.pioneer.sensor.Sensor;
import com.ABC.pioneer.sensor.SensorArray;
import com.ABC.pioneer.sensor.SensorDelegate;
import com.ABC.pioneer.sensor.datatype.Data;
import com.ABC.pioneer.sensor.datatype.ImmediateSendData;
import com.ABC.pioneer.sensor.datatype.PayloadData;
import com.ABC.pioneer.sensor.datatype.Proximity;
import com.ABC.pioneer.sensor.datatype.SensorType;
import com.ABC.pioneer.sensor.datatype.TargetIdentifier;
import com.ABC.pioneer.sensor.payload.Crypto.SpecificUsePayloadSupplier;
import com.ABC.pioneer.sensor.payload.Crypto.GenerateKey;
import com.ABC.pioneer.sensor.payload.Crypto.SecretKey;
import com.ABC.pioneer.sensor.service.NotificationService;
import java.util.List;
public class AppDelegate extends Application implements SensorDelegate {
private final static String tag =AppDelegate.class.getName();
private final static String NOTIFICATION_CHANNEL_ID = "PIONEER_NOTIFICATION_CHANNEL_ID";
private final static int NOTIFICATION_ID = NOTIFICATION_CHANNEL_ID.hashCode();
private static AppDelegate appDelegate = null;
public static SecretKey secretKey;
private static AppDelegate instance;
/// 生成唯一一致的设备标识符以测试检测和跟踪
private int identifier() {
final String text = Build.MODEL + ":" + Build.BRAND;
return text.hashCode();
}
// 接近检测传感器
static SensorArray sensor = null;
public static int getNotificationId() {
return NOTIFICATION_ID;
}
public static String getNotificationChannelId(){
return NOTIFICATION_CHANNEL_ID;
}
@Override
public PackageManager getPackageManager() {
return super.getPackageManager();
}
@Override
public void onCreate() {
super.onCreate();
final SharedPreferences sp_SecretKey = getSharedPreferences("SecretKey",MODE_PRIVATE);
appDelegate = this;
// 初始化前台服务以使应用程序在后台运行
this.createNotificationChannel();
NotificationService.shared(this).startForegroundService(this.getForegroundNotification(), NOTIFICATION_ID);
// 初始化传感器序列,用于给定的有效负载数据
if(sp_SecretKey.getString("SecretKey","").equals("")){
SharedPreferences.Editor edit_key = sp_SecretKey.edit();
secretKey = GenerateKey.secretKey();
edit_key.putString("SecretKey",secretKey.base64EncodedString());
edit_key.apply();
}
else {
final Data secretkeyData = new Data(sp_SecretKey.getString("SecretKey",""));
secretKey = new SecretKey(secretkeyData.value);
System.out.println(secretKey);
}
final SpecificUsePayloadSupplier payloadDataSupplier = new SpecificUsePayloadSupplier(secretKey);
sensor = new SensorArray(getApplicationContext(), payloadDataSupplier);
// 将appDelegate添加为侦听器,以记录和启动传感器的检测事件
sensor.add(this);
// 效率功能记录
// 测试
//PayloadData payloadData = sensor.payloadData();
// if (BuildConfig.DEBUG) {
// sensor.add(new ContactLog(this, "contacts.csv"));
// sensor.add(new StatisticsLog(this, "statistics.csv",payloadData));
// sensor.add(new DetectionLog(this,"detection.csv", payloadData));
// new BatteryLog(this, "battery.csv");
// if (Configurations.payloadDataUpdateTimeInterval != TimeInterval.never) {
// sensor.add(new EventTimeIntervalLog(this, "statistics_didRead.csv", payloadData, EventTimeIntervalLog.EventType.read));
// }
// }
// 传感器将通过UI开关(默认为ON)和蓝牙状态启动和停止
}
public static AppDelegate getInstance(){
return instance;
}
@Override
public void onTerminate() {
sensor.stop();
super.onTerminate();
}
// 获取应用程序委托
public static AppDelegate getAppDelegate() {
return appDelegate;
}
// 获取传感器
public Sensor sensor() {
return sensor;
}
private Notification getForegroundNotification() {
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
final PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
final NotificationCompat.Builder builder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle(this.getString(R.string.notification_content_title))
.setContentText(this.getString(R.string.notification_content_text))
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.setPriority(NotificationCompat.PRIORITY_DEFAULT);
final Notification notification = builder.build();
return notification;
}
// SensorDelegate用于记录接近检测到的事件
private void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
final int importance = NotificationManager.IMPORTANCE_DEFAULT;
final NotificationChannel channel = new NotificationChannel(
NOTIFICATION_CHANNEL_ID,
this.getString(R.string.notification_channel_name), importance);
channel.setDescription(this.getString(R.string.notification_channel_description));
final NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.createNotificationChannel(channel);
}
}
@Override
public void sensor(SensorType sensor, TargetIdentifier didDetect) {
}
@Override
public void sensor(SensorType sensor, PayloadData didRead, TargetIdentifier fromTarget) {
}
@Override
public void sensor(SensorType sensor, ImmediateSendData didReceive, TargetIdentifier fromTarget) {
}
@Override
public void sensor(SensorType sensor, List<PayloadData> didShare, TargetIdentifier fromTarget) {
}
@Override
public void sensor(SensorType sensor, Proximity didMeasure, TargetIdentifier fromTarget) {
}
}
================================================
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/LoginActivity.java
================================================
package com.ABC.pioneer.app;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
//登陆界面
public class LoginActivity extends AppCompatActivity {
// 本地变量
private SharedPreferences sp;
private SharedPreferences.Editor edit;
private Button loginbtn;
private Button regisbtn_jump;
private EditText et_phone;
@Override
protected void onCreate(Bundle savedInstanceState) {
// 检查已有登录状态
checkAutoLogin();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
// 初始化视图
initViews();
// 设置登录按钮事件
setupLoginButton();
// 设置注册跳转按钮事件
setupRegisterButton();
}
/**
* 检查是否已登录,如果是则自动跳转
*/
private void checkAutoLogin() {
sp = getSharedPreferences("PhoneNumber", MODE_PRIVATE);
String savedPhone = sp.getString("PhoneNumber", "");
if (!savedPhone.isEmpty()) {
jumpToMainActivity(getApplication());
finish();
}
}
/**
* 初始化所有视图组件
*/
private void initViews() {
loginbtn = (Button) findViewById(R.id.btn_login);
regisbtn_jump = (Button) findViewById(R.id.btn_register_jump);
et_phone = (EditText) findViewById(R.id.et_phone);
}
/**
* 设置登录按钮点击事件
*/
private void setupLoginButton() {
loginbtn.setOnClickListener(v -> {
String phone = et_phone.getText().toString().trim();
if (!isValidPhone(phone)) {
showToast("请输入正确的手机号");
return;
}
handleLoginLogic(phone);
});
}
/**
* 设置注册跳转按钮点击事件
*/
private void setupRegisterButton() {
regisbtn_jump.setOnClickListener(v -> {
Intent it = new Intent(getApplicationContext(), RegisterActivity.class);
startActivity(it);
});
}
/**
* 验证手机号格式
*/
private boolean isValidPhone(String phone) {
return phone != null && phone.length() == 11;
}
/**
* 处理登录逻辑
*/
private void handleLoginLogic(String phone) {
// 测试账号直接登录
if ("12345678901".equals(phone)) {
jumpToMainActivity(LoginActivity.this);
finish();
return;
}
String savedPhone = sp.getString("PhoneNumber", "");
if (savedPhone.isEmpty()) {
showToast("此电话号码未在本机注册过,请先注册");
} else if (!savedPhone.equals(phone)) {
showToast("此电话号码不是本机注册号码");
} else {
jumpToMainActivity(getApplicationContext());
finish();
}
}
/**
* 跳转到主界面
*/
private void jumpToMainActivity(Context context) {
Intent intent = new Intent(context, MainActivity.class);
startActivity(intent);
}
/**
* 显示Toast提示
*/
private void showToast(String message) {
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
}
}
================================================
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/MainActivity.java
================================================
package com.ABC.pioneer.app;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import com.ABC.pioneer.app.fragment.FragmentActivity1;
import com.ABC.pioneer.app.fragment.FragmentActivity2;
import com.ABC.pioneer.app.fragment.FragmentActivity3;
import com.ABC.pioneer.sensor.Sensor;
import com.ABC.pioneer.sensor.datatype.PayloadData;
import com.ABC.pioneer.sensor.datatype.TargetIdentifier;
import com.ABC.pioneer.sensor.service.AlarmReceiver;
import com.ABC.pioneer.sensor.service.CustomTimer;
import com.ABC.pioneer.sensor.service.MatchDelegate;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
public class MainActivity extends AppCompatActivity implements View.OnClickListener,MatchDelegate {
private final static int permissionRequestCode = 1249951875;
private long didDetect = 0, didRead = 0, didMeasure = 0, didShare = 0, didReceive = 0;
private final static int WARNING_NOTIFICATION_ID = "WARNING".hashCode();
private final Map<TargetIdentifier,PayloadData> targetIdentifiers = new ConcurrentHashMap<>();
private final Map<PayloadData,Target> payloads = new ConcurrentHashMap<>();
private final List<Target> targets = new ArrayList<>();
private TargetListAdapter targetListAdapter = null;
private AlertDialog dialog;
private RelativeLayout bottom_bar_bluetooth_btn;
private RelativeLayout bottom_bar_token_btn;
private RelativeLayout bottom_bar_user_btn;
private TextView bottom_bar_text_bluetooth;
private TextView bottom_bar_text_token;
private TextView bottom_bar_text_user;
private ImageView bottom_bar_image_bluetooth;
private ImageView bottom_bar_image_token;
private ImageView bottom_bar_image_user;
private LinearLayout main_bottom_bar;
private LinearLayout main_body;
private int TAG = 0;
private FragmentActivity1 fragmentActivity1;
private FragmentActivity2 fragmentActivity2;
private FragmentActivity3 fragmentActivity3;
public final static Sensor sensor = AppDelegate.getAppDelegate().sensor();
private static MainActivity instance;
public static MainActivity getInstance(){
// 因为我们程序运行后,Application是首先初始化的,如果在这里不用判断instance是否为空
return instance;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
instance = MainActivity.this;
// 开启接收器
final AlarmReceiver alarmReceiver = new AlarmReceiver(getApplicationContext(),this);
// 开启定时服务
Intent i = new Intent(this, CustomTimer.class);
startService(i);
setContentView(R.layout.activity_bottom_bar);
initView();
fragmentActivity1 = new FragmentActivity1();
fragmentActivity2 = new FragmentActivity2();
fragmentActivity3 = new FragmentActivity3();
setMain();
// 确保应用具有所有必需的权限
requestPermissions();
ignoreBatteryOpt.ignoreBatteryOptimization(this);
}
@Override
public void matchFound()
{
if(FragmentActivity1.foreground)
{
runOnUiThread(new Runnable() {
@Override
public void run() {
// 如果前台则弹出警告框,警告用户可能被感染
AlertDialog.Builder alertdialogbuilder = new AlertDialog.Builder(MainActivity.this);
alertdialogbuilder.setMessage("传感器检测到您与感染者有接触过,请及时到医院进行核酸检测");
alertdialogbuilder.setPositiveButton("确定", null);
alertdialogbuilder.setCancelable(true);
alertdialogbuilder.setIcon(R.drawable.ic_warning);
alertdialogbuilder.setTitle("接触警告");
final AlertDialog alertdialog1 = alertdialogbuilder.create();
alertdialog1.show();
try {
Field mAlert = AlertDialog.class.getDeclaredField("mAlert");
mAlert.setAccessible(true);
Object mAlertController = mAlert.get(alertdialog1);
Field mMessage = mAlertController.getClass().getDeclaredField("mMessageView");
mMessage.setAccessible(true);
TextView mMessageView = (TextView) mMessage.get(mAlertController);
mMessageView.setTextColor(Color.RED);
Field mTitleView = mAlertController.getClass().getDeclaredField("mTitleView");
mTitleView.setAccessible(true);
TextView title = (TextView) mTitleView.get(mAlertController);
title.setTextColor(Color.RED);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
});
}
else
{
// 如果在后台运行,则弹出一个notification告知用户可能被感染
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.notify(WARNING_NOTIFICATION_ID,getWarningNotification());
}
}
/// 请求传感器操作的应用程序权限。
private void requestPermissions() {
// Check and request permissions
final List<String> requiredPermissions = new ArrayList<>();
requiredPermissions.add(Manifest.permission.BLUETOOTH);
requiredPermissions.add(Manifest.permission.BLUETOOTH_ADMIN);
requiredPermissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
requiredPermissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
requiredPermissions.add(Manifest.permission.FOREGROUND_SERVICE);
}
requiredPermissions.add(Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
requiredPermissions.add(Manifest.permission.WAKE_LOCK);
final String[] requiredPermissionsArray = requiredPermissions.toArray(new String[0]);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(requiredPermissionsArray, permissionRequestCode);
} else {
ActivityCompat.requestPermissions(this, requiredPermissionsArray, permissionRequestCode);
}
}
/// 处理权限结果
@Override
public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == permissionRequestCode) {
boolean permissionsGranted = true;
for (int i = 0; i < permissions.length; i++) {
final String permission = permissions[i];
if (grantResults[i] != PERMISSION_GRANTED) {
permissionsGranted = false;
} else {
}
}
}
}
// 电量优化
private void showActivity(@NonNull String packageName) {
Intent intent = getPackageManager().getLaunchIntentForPackage(packageName);
startActivity(intent);
}
private void showActivity(@NonNull String packageName, @NonNull String activityDir) {
Intent intent = new Intent();
intent.setComponent(new ComponentName(packageName, activityDir));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
private Notification getWarningNotification() {
/*final Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);*/
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
final PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
final NotificationCompat.Builder builder = new NotificationCompat.Builder(this, AppDelegate.getNotificationChannelId())
.setSmallIcon(R.drawable.ic_notification)
.setColor(Color.RED)
.setContentTitle(this.getString(R.string.warning_notification_content_title))
.setContentText(this.getString(R.string.warning_notification_content_text))
.setWhen(System.currentTimeMillis())
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.setPriority(NotificationCompat.PRIORITY_DEFAULT);
final Notification notification = builder.build();
return notification;
}
private void setSelectStatus(int index) {
switch (index){
case 0:
//图片点击选择变换图片,颜色的改变,其他变为原来的颜色,并保持原有的图片
bottom_bar_image_bluetooth.setImageResource(R.drawable.ic_discover_choose);
bottom_bar_text_bluetooth.setTextColor(Color.parseColor("#0097F7"));
//其他的文本颜色不变
bottom_bar_text_token.setTextColor(Color.parseColor("#666666"));
bottom_bar_text_user.setTextColor(Color.parseColor("#666666"));
//图片也不变
bottom_bar_image_token.setImageResource(R.drawable.ic_token_icon);
bottom_bar_image_user.setImageResource(R.drawable.ic_user);
break;
case 1:
bottom_bar_image_token.setImageResource(R.drawable.ic_token_choose);
bottom_bar_text_token.setTextColor(Color.parseColor("#0097F7"));
bottom_bar_text_bluetooth.setTextColor(Color.parseColor("#666666"));
bottom_bar_text_user.setTextColor(Color.parseColor("#666666"));
bottom_bar_image_bluetooth.setImageResource(R.drawable.ic_discover_icon);
bottom_bar_image_user.setImageResource(R.drawable.ic_user);
break;
case 2:
bottom_bar_image_user.setImageResource(R.drawable.ic_user_choose);
bottom_bar_text_user.setTextColor(Color.parseColor("#0097F7"));
bottom_bar_text_token.setTextColor(Color.parseColor("#666666"));
bottom_bar_text_bluetooth.setTextColor(Color.parseColor("#666666"));
bottom_bar_image_bluetooth.setImageResource(R.drawable.ic_discover_icon);
bottom_bar_image_token.setImageResource(R.drawable.ic_token_icon);
break;
}
}
private void initView(){
//底部导航栏
bottom_bar_bluetooth_btn = findViewById(R.id.bottom_bar_bluetooth);
bottom_bar_token_btn = findViewById(R.id.bottom_bar_token);
bottom_bar_user_btn = findViewById(R.id.bottom_bar_user);
bottom_bar_text_bluetooth = findViewById(R.id.bottom_bar_text_bluetooth);
bottom_bar_text_token = findViewById(R.id.bottom_bar_text_token);
bottom_bar_text_user = findViewById(R.id.bottom_bar_text_user);
bottom_bar_image_bluetooth = findViewById(R.id.bottom_bar_image_bluetooth);
bottom_bar_image_token = findViewById(R.id.bottom_bar_image_token);
bottom_bar_image_user = findViewById(R.id.bottom_bar_image_user);
main_bottom_bar = findViewById(R.id.main_body_bar);
main_body = findViewById(R.id.main_body);
//设置点击事件
bottom_bar_bluetooth_btn.setOnClickListener(this);
bottom_bar_token_btn.setOnClickListener(this);
bottom_bar_user_btn.setOnClickListener(this);
}
private void setMain() {
//打开初始界面
TAG = 1;
this.getSupportFragmentManager().beginTransaction().add(R.id.fl_container,fragmentActivity1).commit();
}
@SuppressLint("NonConstantResourceId")
@Override
public void onClick(View v){
if(TAG == 0){
TAG = 1;
switch(v.getId()){
case R.id.bottom_bar_bluetooth:
getSupportFragmentManager().beginTransaction().add(R.id.fl_container,fragmentActivity1).commitAllowingStateLoss();
setSelectStatus(0);
break;
case R.id.bottom_bar_token:
getSupportFragmentManager().beginTransaction().add(R.id.fl_container,fragmentActivity2).commitAllowingStateLoss();
setSelectStatus(1);
break;
case R.id.bottom_bar_user:
getSupportFragmentManager().beginTransaction().add(R.id.fl_container,fragmentActivity3).commitAllowingStateLoss();
setSelectStatus(2);
break;
}
}
else{
switch(v.getId()){
case R.id.bottom_bar_bluetooth:
getSupportFragmentManager().beginTransaction().replace(R.id.fl_container,fragmentActivity1).commitAllowingStateLoss();
setSelectStatus(0);
break;
case R.id.bottom_bar_token:
getSupportFragmentManager().beginTransaction().replace(R.id.fl_container,fragmentActivity2).commitAllowingStateLoss();
setSelectStatus(1);
break;
case R.id.bottom_bar_user:
getSupportFragmentManager().beginTransaction().replace(R.id.fl_container,fragmentActivity3).commitAllowingStateLoss();
setSelectStatus(2);
break;
}
}
}
}
================================================
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/RegisterActivity.java
================================================
package com.ABC.pioneer.app;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.ABC.pioneer.sensor.SensorArray;
import com.ABC.pioneer.sensor.payload.Crypto.GenerateKey;
import com.ABC.pioneer.sensor.payload.Crypto.SecretKey;
import com.ABC.pioneer.sensor.payload.Crypto.SpecificUsePayloadSupplier;
import com.ABC.pioneer.sensor.service.Connection;
import java.io.IOException;
public class RegisterActivity extends AppCompatActivity {
private Button registerButton;
private EditText phoneEditText;
private String serverResponse = "";
private final Context appContext = AppDelegate.getInstance();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
initializeViews();
setupRegisterButton();
}
private void initializeViews() {
registerButton = findViewById(R.id.btn_register);
phoneEditText = findViewById(R.id.et_phone_1);
}
private void setupRegisterButton() {
registerButton.setOnClickListener(v -> handleRegistration());
}
private void handleRegistration() {
String phoneNumber = phoneEditText.getText().toString().trim();
if (!isValidPhoneNumber(phoneNumber)) {
showToast("请输入正确的手机号");
return;
}
performRegistration(phoneNumber);
}
private boolean isValidPhoneNumber(String phoneNumber) {
return phoneNumber.length() == 11;
}
private void performRegistration(String phoneNumber) {
SharedPreferences phonePrefs = getSharedPreferences("PhoneNumber", MODE_PRIVATE);
SharedPreferences secretKeyPrefs = getSharedPreferences("SecretKey", MODE_PRIVATE);
SecretKey currentSecretKey = AppDelegate.secretKey;
new Thread(() -> {
try {
Connection connection = new Connection(RegisterActivity.this);
connection.connectToServer();
serverResponse = connection.register(phoneNumber, currentSecretKey.base64EncodedString());
} catch (IOException e) {
// 处理连接异常
}
}).start().joinWithUiThread(this::processRegistrationResult);
}
private void processRegistrationResult() {
switch (serverResponse) {
case "0":
handleSuccessfulRegistration();
break;
case "1":
showToast("该手机号已被注册");
break;
case "2":
handleSecretKeyConflict();
break;
}
}
private void handleSuccessfulRegistration() {
SharedPreferences.Editor editor = getSharedPreferences("PhoneNumber", MODE_PRIVATE).edit();
editor.putString("PhoneNumber", phoneEditText.getText().toString().trim());
editor.apply();
showToast("注册成功");
}
private void handleSecretKeyConflict() {
showToast("SecretKey重复,已重新生成,请再次点击注册");
SharedPreferences.Editor editor = getSharedPreferences("SecretKey", MODE_PRIVATE).edit();
SecretKey newSecretKey = GenerateKey.secretKey();
editor.putString("SecretKey", newSecretKey.base64EncodedString());
editor.apply();
SpecificUsePayloadSupplier payloadSupplier = new SpecificUsePayloadSupplier(newSecretKey);
AppDelegate.sensor = new SensorArray(getApplicationContext(), payloadSupplier);
AppDelegate.sensor.add(AppDelegate.getAppDelegate());
}
private void showToast(String message) {
runOnUiThread(() ->
Toast.makeText(RegisterActivity.this, message, Toast.LENGTH_LONG).show()
);
}
// 辅助方法:在UI线程执行回调
private interface UiThreadCallback {
void execute();
}
private static void joinWithUiThread(Thread thread, Activity activity, UiThreadCallback callback) {
try {
thread.join();
activity.runOnUiThread(callback::execute);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
================================================
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/SplashActivity.java
================================================
package com.ABC.pioneer.app;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import androidx.appcompat.app.AppCompatActivity;
public class SplashActivity extends AppCompatActivity {
private final int SPLASH_DISPLAY_LENGHT = 2000; // 两秒后进入系统
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
Handler x = new Handler();//定义一个handle对象
x.postDelayed(new splashhandler(), 3000);//设置3秒钟延迟执行splashhandler线程。其实你这里可以再新建一个线程去执行初始化工作,如判断SD,网络状态等
}
class splashhandler implements Runnable{
public void run() {
startActivity(new Intent(getApplicationContext(),LoginActivity.class));// 这个线程的作用3秒后就是进入到你的登录界面
SplashActivity.this.finish();// 把当前的LaunchActivity结束掉
}
}
}
================================================
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/Target.java
================================================
package com.ABC.pioneer.app;
import com.ABC.pioneer.sensor.analysis.Sample;
import com.ABC.pioneer.sensor.datatype.ImmediateSendData;
import com.ABC.pioneer.sensor.datatype.PayloadData;
import com.ABC.pioneer.sensor.datatype.Proximity;
import com.ABC.pioneer.sensor.datatype.TargetIdentifier;
import com.ABC.pioneer.sensor.datatype.TimeInterval;
import java.util.Date;
public class Target {
private TargetIdentifier targetIdentifier = null;
private PayloadData payloadData = null;
private Date lastUpdatedAt = null;
private Proximity proximity = null;
private ImmediateSendData received = null;
private Date didRead = null, didMeasure = null, didShare = null, didReceive = null;
private Sample didReadTimeInterval = new Sample();
private Sample didMeasureTimeInterval = new Sample();
private Sample didShareTimeInterval = new Sample();
public Target(TargetIdentifier targetIdentifier, PayloadData payloadData) {
this.targetIdentifier = targetIdentifier;
this.payloadData = payloadData;
lastUpdatedAt = new Date();
didRead = lastUpdatedAt;
}
public TargetIdentifier targetIdentifier() {
return targetIdentifier;
}
public void targetIdentifier(TargetIdentifier targetIdentifier) {
//lastUpdatedAt = new Date();
this.targetIdentifier = targetIdentifier;
}
public PayloadData payloadData() {
return payloadData;
}
public Date lastUpdatedAt() {
return lastUpdatedAt;
}
public Proximity proximity() {
return proximity;
}
public void proximity(Proximity proximity) {
final Date date = new Date();
if (didMeasure != null) {
final TimeInterval timeInterval = new TimeInterval(didMeasure, date);
didMeasureTimeInterval.add(timeInterval.value);
}
/*lastUpdatedAt = date;
didMeasure = lastUpdatedAt;*/
didMeasure = date;
this.proximity = proximity;
}
public ImmediateSendData received() {
return received;
}
public void received(ImmediateSendData received) {
lastUpdatedAt = new Date();
didReceive = lastUpdatedAt;
this.received = received;
}
public Date didRead() {
return didRead;
}
public Sample didReadTimeInterval() { return didReadTimeInterval; }
public void didRead(Date date) {
if (didRead != null && date != null) {
final TimeInterval timeInterval = new TimeInterval(didRead, date);
didReadTimeInterval.add(timeInterval.value);
}
didRead = date;
lastUpdatedAt = didRead;
}
public Date didMeasure() {
return didMeasure;
}
public Sample didMeasureTimeInterval() {
return didMeasureTimeInterval;
}
public Date didShare() {
return didShare;
}
public void didShare(Date date) {
if (didShare != null && date != null) {
final TimeInterval timeInterval = new TimeInterval(didShare, date);
didShareTimeInterval.add(timeInterval.value);
}
didShare = date;
lastUpdatedAt = didShare;
}
public Sample didShareTimeInterval() {
return didShareTimeInterval;
}
}
================================================
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/TargetListAdapter.java
================================================
package com.ABC.pioneer.app;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.ABC.pioneer.sensor.payload.Crypto.SpecificUsePayloadSupplier;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.TimeZone;
//用于在UI上显示目标列表的目标列表适配器
public class TargetListAdapter extends ArrayAdapter<Target> {
private final static SimpleDateFormat dateFormatter = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
public TargetListAdapter(@NonNull Context context, List<Target> targets) {
super(context, R.layout.listview_targets_row, targets);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
final Target target = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.listview_targets_row, parent, false);
}
final TextView textLabel = (TextView) convertView.findViewById(R.id.targetTextLabel);
final TextView detailedTextLabel = (TextView) convertView.findViewById(R.id.targetDetailedTextLabel);
SimpleDateFormat Dateformat=new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
Dateformat.setTimeZone(TimeZone.getTimeZone("GMT+08"));
final StringBuilder labelText = new StringBuilder(target.payloadData().shortName());
final String didReceive = " (接收时间 : " + Dateformat.format(SpecificUsePayloadSupplier.parseStartTimeToLong(target.payloadData())) + ")";
textLabel.setText(labelText.toString() + didReceive);
if(SpecificUsePayloadSupplier.checkPayloadtime(target.payloadData())) {
detailedTextLabel.setText("更新时间 : " + dateFormatter.format(target.lastUpdatedAt()));
}
return convertView;
}
}
================================================
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/TokenActivity.java
================================================
// Android APP
// Token activity
package com.ABC.pioneer.app;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.ABC.pioneer.sensor.payload.Crypto.SpecificUsePayloadSupplier;
import com.ABC.pioneer.sensor.payload.Crypto.GenerateKey;
import com.ABC.pioneer.sensor.payload.Crypto.MatchingKey;
import com.ABC.pioneer.sensor.service.Connection;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Date;
// token activity
public class TokenActivity extends AppCompatActivity {
private Button tokenbtn;
private EditText tokenet;
DataInputStream in=null;
DataOutputStream out=null;
private String Maching_keys="";
private SharedPreferences sp;
String result = "";
String result1 = "";
Connection connection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_token);
sp = getSharedPreferences("PhoneNumber",MODE_PRIVATE);
tokenbtn = (Button)findViewById(R.id.btn_token);
tokenet = (EditText)findViewById(R.id.et_token);
MatchingKey[] MachingKeys = SpecificUsePayloadSupplier.matchingKeys;
tokenbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/*根据当前时间和app开启时间的时间差计算距开启已经过多少天,用天数i定位到MachingKeys[i],
这个即为当天的Machingkey,然后再向前找14天的Machingkey*/
final int date = GenerateKey.day(new Date());
String token = tokenet.getText().toString();
if (token.trim().length() != 6) {
Toast.makeText(TokenActivity.this, "请输入正确的Token号码", Toast.LENGTH_LONG).show();
return;
}
Thread thread = new Thread(new Runnable(){
@Override
public void run(){
try{
connection = new Connection(TokenActivity.this);
connection.ConnectToServer();
result = connection.Token(token);
if(result.equals("0")) {
String phone = sp.getString("PhoneNumber","默认值");
for(int i = 13; i >= 0; i--){
Maching_keys += MachingKeys[date - i].base64EncodedString();
}
result1 = connection.Token_TransmitMachingKeys(phone,Maching_keys);
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
if(result.equals("0")) {
Toast.makeText(TokenActivity.this, "验证通过", Toast.LENGTH_LONG).show();
Toast.makeText(TokenActivity.this, "成功上传ID和14天Maching_keys", Toast.LENGTH_LONG).show();
}
else if(result.equals("1")){
Toast.makeText(TokenActivity.this, "Token输入有误,请重新输入!", Toast.LENGTH_LONG).show();
}
}
});
}
}
================================================
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/fragment/FragmentActivity1.java
================================================
package com.ABC.pioneer.app.fragment;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.CompoundButton;
import android.widget.ListView;
import android.widget.Switch;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment;
import com.ABC.pioneer.app.MainActivity;
import com.ABC.pioneer.app.R;
import com.ABC.pioneer.app.Target;
import com.ABC.pioneer.app.TargetListAdapter;
import com.ABC.pioneer.sensor.SensorDelegate;
import com.ABC.pioneer.sensor.datatype.ImmediateSendData;
import com.ABC.pioneer.sensor.datatype.PayloadData;
import com.ABC.pioneer.sensor.datatype.Proximity;
import com.ABC.pioneer.sensor.datatype.SensorType;
import com.ABC.pioneer.sensor.datatype.TargetIdentifier;
import com.ABC.pioneer.sensor.payload.Crypto.SpecificUsePayloadSupplier;
import com.ABC.pioneer.sensor.service.PioneerDb;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.TimeZone;
import java.util.concurrent.ConcurrentHashMap;
public class FragmentActivity1 extends Fragment implements AdapterView.OnItemClickListener, SensorDelegate {
public static boolean foreground = false;
private long didDetect = 0, didRead = 0, didMeasure = 0, didShare = 0, didReceive = 0;
private final Map<TargetIdentifier, PayloadData> targetIdentifiers = new ConcurrentHashMap<>();
private final Map<PayloadData, Target> payloads = new ConcurrentHashMap<>();
private final List<Target> targets = new ArrayList<>();
private TargetListAdapter targetListAdapter = null;
private AlertDialog dialog;
private View view;
private final Context context = MainActivity.getInstance();
private TextView Read;
private TextView Measure;
private TextView Detect;
private TextView Share;
private TextView count;
private ListView targetsListView;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle saveInstanceState){
android.view.View view = inflater.inflate(R.layout.activity_bluetooth,container,false);
this.view = view;
initView(view);
return view;
}
private void initView(View view){
Read = (TextView)view.findViewById(R.id.didReadCount);
Measure = (TextView)view.findViewById(R.id.didMeasureCount);
Detect = (TextView)view.findViewById(R.id.didDetectCount);
Share = (TextView)view.findViewById(R.id.didShareCount);
count = (TextView)view.findViewById(R.id.detection);
targetsListView = (ListView)view.findViewById(R.id.targets);
}
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
//测试特定于UI的过程,以从传感器收集数据进行展示
@SuppressLint("UseSwitchCompatOrMaterialCode") final Switch onOffSwitch = Objects.requireNonNull(getActivity()).findViewById(R.id.sensorOnOffSwitch);
MainActivity.sensor.add(this);
onOffSwitch.setChecked(true);
MainActivity.sensor.start();
onOffSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
MainActivity.sensor.start();
} else {
MainActivity.sensor.stop();
}
}
});
//测试特定于UI的过程,以从传感器收集数据进行展示
targetListAdapter = new TargetListAdapter(context, targets);
targetsListView.setAdapter(targetListAdapter);
targetsListView.setOnItemClickListener(this);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle saveInstanceState){
super.onViewCreated(view, saveInstanceState);
}
// 更新目标表
private synchronized void updateTargets() {
// 根据短名称删除重复目标,并在时间戳上最后更新
final Map<String,Target> shortNames = new HashMap<>(payloads.size());
for (Map.Entry<PayloadData,Target> entry : payloads.entrySet()) {
final String shortName = entry.getKey().shortName();
final Target target = entry.getValue();
final Target duplicate = shortNames.get(shortName);
if (duplicate == null || duplicate.lastUpdatedAt().getTime() < target.lastUpdatedAt().getTime()) {
shortNames.put(shortName, target);
}
}
// 按字母顺序获取目标列表
final List<Target> targetList = new ArrayList<>(shortNames.values());
Collections.sort(targetList, new Comparator<Target>() {
@Override
public int compare(Target t0, Target t1) {
return t0.payloadData().shortName().compareTo(t1.payloadData().shortName());
}
});
// 更新用户界面
count.setText("接收数据包 (" + targetListAdapter.getCount() + ")");
targetListAdapter.clear();
targetListAdapter.addAll(targetList);
}
// 更新相应检测结果
private void updateCounts() {
Detect.setText(Long.toString(this.didDetect));
Read.setText(Long.toString(this.didRead));
Measure.setText(Long.toString(this.didMeasure));
Share.setText(Long.toString(this.didShare));
}
@Override
public void onResume() {
super.onResume();
foreground = true;
updateCounts();
updateTargets();
}
@Override
public void onPause() {
foreground = false;
super.onPause();
}
@Override
public void sensor(SensorType sensor, TargetIdentifier didDetect) {
this.didDetect++;
if (foreground) {
final String text = Long.toString(this.didDetect);
Objects.requireNonNull(getActivity()).runOnUiThread(new Runnable() {
@Override
public void run() {
Detect.setText(text);
}
});
}
}
@Override
public void sensor(SensorType sensor, PayloadData didRead, TargetIdentifier fromTarget) {
this.didRead++;
targetIdentifiers.put(fromTarget, didRead);
Target target = payloads.get(didRead);
if (target != null) {
target.didRead(new Date());
} else {
payloads.put(didRead, new Target(fromTarget, didRead));
}
if (foreground) {
final String text = Long.toString(this.didRead);
Objects.requireNonNull(getActivity()).runOnUiThread(new Runnable() {
@Override
public void run() {
Read.setText(text);
updateTargets();
}
});
}
PioneerDb db = new PioneerDb(context,"payloads",null,1);
db.insertPayloadData(didRead);
}
@Override
public void sensor(SensorType sensor, List<PayloadData> didShare, TargetIdentifier fromTarget) {
this.didShare++;
final Date now = new Date();
for (PayloadData didRead : didShare) {
targetIdentifiers.put(fromTarget, didRead);
Target target = payloads.get(didRead);
if (target != null) {
target.didRead(new Date());
} else {
payloads.put(didRead, new Target(fromTarget, didRead));
}
}
if (foreground) {
final String text = Long.toString(this.didShare);
Objects.requireNonNull(getActivity()).runOnUiThread(new Runnable() {
@Override
public void run() {
Share.setText(text);
updateTargets();
}
});
}
}
@Override
public void sensor(SensorType sensor, Proximity didMeasure, TargetIdentifier fromTarget) {
this.didMeasure++;
final PayloadData didRead = targetIdentifiers.get(fromTarget);
if (didRead != null) {
final Target target = payloads.get(didRead);
if (target != null) {
target.targetIdentifier(fromTarget);
target.proximity(didMeasure);
}
}
if (foreground) {
final String text = Long.toString(this.didMeasure);
Objects.requireNonNull(getActivity()).runOnUiThread(new Runnable() {
@Override
public void run() {
Measure.setText(text);
}
});
}
}
@Override
public void sensor(SensorType sensor, ImmediateSendData didReceive, TargetIdentifier fromTarget) {
this.didReceive++;
final PayloadData didRead = new PayloadData(didReceive.data.value);
if (didRead != null) {
final Target target = payloads.get(didRead);
if (target != null) {
targetIdentifiers.put(fromTarget, didRead);
target.targetIdentifier(fromTarget);
target.received(didReceive);
}
}
if (foreground) {
final String text = Long.toString(this.didReceive);
Objects.requireNonNull(getActivity()).runOnUiThread(new Runnable() {
@Override
public void run() {
updateTargets();
}
});
}
}
@Override
public void onItemClick(AdapterView<?> adapter, View view, int i, long l) {
final Target target = targetListAdapter.getItem(i);
final PayloadData payloadData = target.payloadData();
SimpleDateFormat dateformat=new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
dateformat.setTimeZone(TimeZone.getTimeZone("GMT+08"));
AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
LayoutInflater inflater = (LayoutInflater) Objects.requireNonNull(getContext()).getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View messageview = inflater.inflate(R.layout.activity_payload, null);
TextView ContactIdentifier = (TextView)messageview.findViewById(R.id.ContactIdentifier);
TextView StartTime = (TextView)messageview.findViewById(R.id.StartTime);
TextView EndTime = (TextView)messageview.findViewById(R.id.EndTime);
ContactIdentifier.append(SpecificUsePayloadSupplier.parseContactIdentifierToStr(payloadData));
final long startTime = SpecificUsePayloadSupplier.parseStartTimeToLong(payloadData);
StartTime.append(dateformat.format(startTime));
EndTime.append(dateformat.format(startTime+360000));
builder.setView(messageview);
builder.create();
dialog = builder.show();
}
}
================================================
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/fragment/FragmentActivity2.java
================================================
package com.ABC.pioneer.app.fragment;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment;
import com.ABC.pioneer.app.MainActivity;
import com.ABC.pioneer.app.R;
import com.ABC.pioneer.app.TokenActivity;
public class FragmentActivity2 extends Fragment {
LinearLayout token_pre;
private final Context context = MainActivity.getInstance();
private AlertDialog dialog;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle saveInstanceState){
android.view.View view = inflater.inflate(R.layout.activity_token_pre,container,false);
initView(view);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
token_pre.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent it=new Intent(getContext(), TokenActivity.class);//启动TokenActivity
startActivity(it);
}
});
}
private void initView(View view){
token_pre = (LinearLayout) view.findViewById(R.id.token_pre);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle saveInstanceState) {
super.onViewCreated(view, saveInstanceState);
}
}
================================================
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/fragment/FragmentActivity3.java
================================================
package com.ABC.pioneer.app.fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.ABC.pioneer.app.R;
import com.ABC.pioneer.sensor.SensorArray;
import com.ABC.pioneer.sensor.payload.Crypto.SpecificUsePayloadSupplier;
import java.util.Date;
public class FragmentActivity3 extends Fragment {
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle saveInstanceState){
android.view.View view = inflater.inflate(R.layout.activity_user,container,false);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
((TextView) getActivity().findViewById(R.id.device)).setText("设备名:" + SensorArray.deviceDescription);
((TextView) getActivity().findViewById(R.id.payload)).setText("本机数据包:"+SpecificUsePayloadSupplier.updatePayload(new Date()).shortName());
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle saveInstanceState){
super.onViewCreated(view, saveInstanceState);
}
}
================================================
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/ignoreBatteryOpt.java
================================================
package com.ABC.pioneer.app;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.PowerManager;
import android.provider.Settings;
import androidx.annotation.NonNull;
import static android.content.Context.POWER_SERVICE;
public class ignoreBatteryOpt {
static public void ignoreBatteryOptimization(Activity activity) {
PowerManager powerManager = (PowerManager)activity.getSystemService(POWER_SERVICE);
boolean hasIgnored = false;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
hasIgnored = powerManager.isIgnoringBatteryOptimizations(activity.getPackageName());
// 判断当前APP是否有加入电池优化的白名单,如果没有,弹出加入电池优化的白名单的设置对话框。
if(!hasIgnored) {
Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:"+activity.getPackageName()));
activity.startActivity(intent);
}
}
}
}
================================================
FILE: Android_app/app/src/main/res/drawable/border_input_box.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFFFFF" />
<corners
android:bottomLeftRadius="30dp"
android:bottomRightRadius="30dp"
android:topLeftRadius="30dp"
android:topRightRadius="30dp" />
<stroke
android:width="2dp"
android:color="@android:color/holo_blue_dark" />
</shape>
================================================
FILE: Android_app/app/src/main/res/drawable/button_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<gradient android:startColor="@color/systemBlue" android:endColor="@color/systemBlue"
android:angle="90"/> <!--背景颜色-->
<stroke android:width="1dip" android:color="@color/white"/><!--边框宽度及颜色-->
<corners android:radius="20dp"/><!--圆角-->
<padding android:left="5dp" android:top="5dp" android:right="5dp" android:bottom="5dp"/>
</shape>
</item>
</selector>
================================================
FILE: Android_app/app/src/main/res/drawable/ic_launcher_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector
android:height="108dp"
android:width="108dp"
android:viewportHeight="108"
android:viewportWidth="108"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z"/>
<path android:fillColor="#00000000" android:pathData="M9,0L9,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,0L19,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M29,0L29,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M39,0L39,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M49,0L49,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M59,0L59,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M69,0L69,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M79,0L79,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M89,0L89,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M99,0L99,108"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,9L108,9"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,19L108,19"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,29L108,29"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,39L108,39"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,49L108,49"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,59L108,59"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,69L108,69"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,79L108,79"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,89L108,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M0,99L108,99"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,29L89,29"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,39L89,39"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,49L89,49"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,59L89,59"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,69L89,69"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M19,79L89,79"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M29,19L29,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M39,19L39,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M49,19L49,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M59,19L59,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M69,19L69,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
<path android:fillColor="#00000000" android:pathData="M79,19L79,89"
android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
</vector>
================================================
FILE: Android_app/app/src/main/res/drawable/token_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<gradient android:startColor="@color/white" android:endColor="@color/white"
android:angle="90"/> <!--背景颜色-->
<stroke android:width="1dip" android:color="@color/systemBlue"/><!--边框宽度及颜色-->
<corners android:radius="10dp"/><!--圆角-->
<padding android:left="5dp" android:top="5dp" android:right="5dp" android:bottom="5dp"/>
</shape>
</item>
</selector>
================================================
FILE: Android_app/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>
================================================
FILE: Android_app/app/src/main/res/layout/activity_bluetooth.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/activity_bluetooth"
android:background="@color/systemGray6">
<ImageView
android:id="@+id/main_image"
android:layout_width="61dp"
android:layout_height="57dp"
android:src="@drawable/ic_pioneer_transparent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.045"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.023"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="57dp"
android:text="Pioneer"
android:textSize="40dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.06"
app:layout_constraintStart_toEndOf="@+id/main_image"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.023" />
<Switch
android:id="@+id/sensorOnOffSwitch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="@id/main_image"
app:layout_constraintRight_toRightOf="parent"
android:padding="10dp"
android:checked="true"/>
<TextView
android:id="@+id/Statistics"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="交互信息"
android:textSize="18sp"
android:textStyle="bold"
android:layout_marginTop="10dp"
android:paddingVertical="5dp"
android:paddingHorizontal="10dp"
android:background="@color/systemGray6"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/main_image" />
<LinearLayout
android:id="@+id/didCount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@color/systemGray6"
app:layout_constraintTop_toBottomOf="@+id/Statistics">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@color/systemBackground"
app:layout_constraintTop_toBottomOf="@id/payload"
android:id="@+id/Detect"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="0dp"
android:text="探测到的蓝牙设备: "
android:textSize="14sp" />
<TextView
android:id="@+id/didDetectCount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="17sp"
android:text="0" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@color/systemBackground"
app:layout_constraintTop_toBottomOf="@+id/didDetectCount"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:text="读取到的Payload: "/>
<TextView
android:id="@+id/didReadCount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="17sp"
android:text="0"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@color/systemBackground"
app:layout_constraintTop_toBottomOf="@+id/didReadCount">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:text="测距次数: "/>
<TextView
android:id="@+id/didMeasureCount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="17sp"
android:text="0"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@color/systemBackground"
app:layout_constraintTop_toBottomOf="@+id/didMeasureCount">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:text="数据共享: "/>
<TextView
android:id="@+id/didShareCount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="17sp"
android:text="0"/>
</LinearLayout>
<!--<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@color/systemBackground"
app:layout_constraintTop_toBottomOf="@+id/didShareCount">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:text="接收到的即时发送信息: "/>
<TextView
android:id="@+id/didReceiveCount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="17sp"
android:text="0"/>
</LinearLayout>-->
</LinearLayout>
<TextView
android:id="@+id/detection"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:background="@color/systemGray6"
android:paddingHorizontal="10dp"
android:paddingVertical="5dp"
android:text="接收数据包 (0)"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/didCount"
app:layout_constraintVertical_bias="0.0" />
<ListView
android:id="@+id/targets"
android:layout_width="match_parent"
android:layout_height="0dp"
android:fadeScrollbars="false"
android:fastScrollEnabled="true"
android:scrollbars="vertical"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/detection"
app:layout_constraintVertical_bias="0.0"
android:background="@android:color/white">
</ListView>
</androidx.constraintlayout.widget.ConstraintLayout>
================================================
FILE: Android_app/app/src/main/res/layout/activity_bottom_bar.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_body_bar"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:id="@+id/main_body"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<FrameLayout
android:id="@+id/fl_container"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@id/bottom_bar"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="1.0"
android:layout_weight="10"
/>
<LinearLayout
android:id="@+id/bottom_bar"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginStart="0dp"
android:layout_marginEnd="0dp"
android:background="?android:attr/windowBackground"
android:gravity="bottom"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_weight="1">
<RelativeLayout
android:id="@+id/bottom_bar_bluetooth"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
>
<TextView
android:id="@+id/bottom_bar_text_bluetooth"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="2dp"
android:gravity="center"
android:singleLine="true"
android:text="发现"
android:textColor="#666666"
android:textSize="14sp" />
<ImageView
android:id="@+id/bottom_bar_image_bluetooth"
android:layout_width="27dp"
android:layout_height="27dp"
android:layout_above="@+id/bottom_bar_text_bluetooth"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="3dp"
android:src="@drawable/ic_discover_icon" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/bottom_bar_token"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
<TextView
android:id="@+id/bottom_bar_text_token"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="3dp"
android:gravity="center"
android:singleLine="true"
android:text="Token"
android:textColor="#666666"
android:textSize="14sp" />
<ImageView
android:id="@+id/bottom_bar_image_token"
android:layout_width="27dp"
android:layout_height="27dp"
android:layout_above="@+id/bottom_bar_text_token"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="3dp"
android:src="@drawable/ic_token_icon" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/bottom_bar_user"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
<TextView
android:id="@+id/bottom_bar_text_user"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="3dp"
android:gravity="center"
android:singleLine="true"
android:text="我"
android:textColor="#666666"
android:textSize="14sp" />
<ImageView
android:id="@+id/bottom_bar_image_user"
android:layout_width="27dp"
android:layout_height="27dp"
android:layout_above="@+id/bottom_bar_text_user"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="3dp"
android:src="@drawable/ic_user" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
================================================
FILE: Android_app/app/src/main/res/layout/activity_login.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".LoginActivity"
android:background="#FAEBD7">
<TextView
android:id="@+id/tx_wel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Pioneer"
android:textSize="40dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.058"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.023"
/>
<ImageView
android:id="@+id/imageView"
android:layout_width="200dp"
android:layout_height="160dp"
android:src="@drawable/ic_pioneer_transparent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.194" />
<LinearLayout
android:id="@+id/linearLayout2"
style="@style/InputBoxStyle"
android:layout_width="303dp"
android:layout_height="50dp"
android:layout_below="@id/tx_wel"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.456">
<EditText
android:id="@+id/et_phone"
style="@style/EditTextStyle"
android:layout_width="285dp"
android:layout_height="50dp"
android:layout_weight="1"
android:ems="10"
android:hint="请输入手机号"
android:inputType="phone"
tools:ignore="MissingConstraints" />
</LinearLayout>
<Button
android:id="@+id/btn_login"
android:layout_width="100dp"
android:layout_height="45dp"
android:layout_marginTop="44dp"
android:layout_marginRight="40dp"
android:background="@drawable/button_background"
android:text="登录"
android:textColor="@color/white"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.225"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.563"
/>
<Button
android:id="@+id/btn_register_jump"
android:layout_width="100dp"
android:layout_height="45dp"
android:layout_marginTop="44dp"
android:background="@drawable/button_background"
android:text="注册"
android:textColor="@color/white"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.803"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.563" />
</androidx.constraintlayout.widget.ConstraintLayout>
================================================
FILE: Android_app/app/src/main/res/layout/activity_payload.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="临时标识符: "
android:id="@+id/ContactIdentifier"
></TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="有效期开始时间: "
android:id="@+id/StartTime"
></TextView>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="有效期结束时间: "
android:id="@+id/EndTime"
></TextView>
</LinearLayout>
================================================
FILE: Android_app/app/src/main/res/layout/activity_register.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".LoginActivity"
android:background="#FAEBD7">
<ImageView
android:id="@+id/imageView"
android:layout_width="200dp"
android:layout_height="160dp"
android:src="@drawable/ic_pioneer_transparent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.194" />
<TextView
android:id="@+id/tx_wel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Pioneer"
android:textSize="40dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.058"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.023"
/>
<LinearLayout
android:id="@+id/linearLayout2"
style="@style/InputBoxStyle"
android:layout_width="303dp"
android:layout_height="50dp"
android:layout_below="@id/tx_wel"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.456">
<EditText
android:id="@+id/et_phone_1"
style="@style/EditTextStyle"
android:layout_width="285dp"
android:layout_height="50dp"
android:layout_weight="1"
android:ems="10"
android:hint="请输入手机号"
android:inputType="phone"
tools:ignore="MissingConstraints" />
</LinearLayout>
<Button
android:id="@+id/btn_register"
android:layout_width="100dp"
android:layout_height="45dp"
android:layout_marginBottom="280dp"
android:background="@drawable/button_background"
android:text="注册"
android:textColor="@color/white"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/linearLayout" />
</androidx.constraintlayout.widget.ConstraintLayout>
================================================
FILE: Android_app/app/src/main/res/layout/activity_splash.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SplashActivity"
android:background="#FAEBD7">
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Pioneer"
android:textSize="80dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.496"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.219" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="您的安全就是我们最大的安心"
android:textSize="20dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.928" />
<ImageView
android:layout_width="248dp"
android:layout_height="220dp"
android:src="@drawable/ic_virus"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.558" />
</androidx.constraintlayout.widget.ConstraintLayout>
================================================
FILE: Android_app/app/src/main/res/layout/activity_token.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".TokenActivity"
android:id="@+id/activity_token"
>
<ImageView
android:id="@+id/token_image"
android:layout_width="61dp"
android:layout_height="57dp"
android:src="@drawable/ic_pioneer_white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.045"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.023" />
<TextView
android:layout_width="wrap_content"
android:layout_height="57dp"
android:text="Pioneer"
android:textSize="40dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.06"
app:layout_constraintStart_toEndOf="@+id/token_image"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.023" />
<LinearLayout
android:id="@+id/linearLayout"
style="@style/InputBoxStyle"
android:layout_width="300dp"
android:layout_height="50dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="48dp"
android:layout_marginBottom="50dp"
app:layout_constraintBottom_toTopOf="@+id/btn_register"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.495"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
tools:ignore="MissingConstraints">
<EditText
android:id="@+id/et_token"
style="@style/EditTextStyle"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:ems="10"
android:hint="请输入token"
android:inputType="text" />
</LinearLayout>
<Button
android:id="@+id/btn_token"
android:layout_width="100dp"
android:layout_height="45dp"
android:layout_marginTop="40dp"
android:background="@drawable/button_background"
android:text="验证"
android:textColor="@color/white"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/linearLayout"
app:layout_constraintVertical_bias="0.067"
tools:ignore="MissingConstraints" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginStart="70dp"
android:layout_marginTop="136dp"
android:layout_marginEnd="70dp"
android:layout_marginBottom="64dp"
android:text="Token验证"
android:textColor="@android:color/holo_blue_dark"
android:textSize="50dp"
app:layout_constraintBottom_toTopOf="@+id/linearLayout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.478"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>
================================================
FILE: Android_app/app/src/main/res/layout/activity_token_pre.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@color/systemGray6"
>
<ImageView
android:id="@+id/token_pre_image"
android:layout_width="61dp"
android:layout_height="57dp"
android:src="@drawable/ic_pioneer_transparent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.045"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.023" />
<TextView
android:layout_width="wrap_content"
android:layout_height="57dp"
android:text="Pioneer"
android:textSize="40dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.06"
app:layout_constraintStart_toEndOf="@+id/token_pre_image"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.023" />
<LinearLayout
android:id="@+id/token_pre"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@android:color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.158">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:layout_marginRight="145dp"
android:layout_marginBottom="10dp"
android:text="Token验证"
android:textColor="@android:color/black"
android:textSize="20dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.155" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
================================================
FILE: Android_app/app/src/main/res/layout/activity_user.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_user"
android:background="@color/systemGray6">
<ImageView
android:id="@+id/user_image"
android:layout_width="61dp"
android:layout_height="57dp"
android:src="@drawable/ic_pioneer_transparent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.045"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.023"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="57dp"
android:text="Pioneer"
android:textSize="40dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.06"
app:layout_constraintStart_toEndOf="@+id/user_image"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.023" />
<TextView
android:id="@+id/User"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="用户信息"
android:textSize="18sp"
android:textStyle="bold"
android:layout_marginTop="10dp"
android:paddingVertical="5dp"
android:paddingHorizontal="10dp"
android:background="@color/systemGray6"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/user_image"
/>
<TextView
android:id="@+id/device"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/User"
android:background="@android:color/white"
android:textColor="@android:color/black"
/>
<TextView
android:id="@+id/payload"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="10dp"
android:paddingHorizontal="10dp"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/device"
android:background="@android:color/white"
android:textColor="@android:color/black"/>
</androidx.constraintlayout.widget.ConstraintLayout>
================================================
FILE: Android_app/app/src/main/res/layout/custom_notification.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
================================================
FILE: Android_app/app/src/main/res/layout/listview_targets_row.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingVertical="8dp"
android:paddingHorizontal="10dp">
<TextView
android:id="@+id/targetTextLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="TextLabel"/>
<TextView
android:id="@+id/targetDetailedTextLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:text="更新时间:停止更新"/>
</LinearLayout>
================================================
FILE: Android_app/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>
================================================
FILE: Android_app/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>
================================================
FILE: Android_app/app/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#6200EE</color>
<color name="colorPrimaryDark">#3700B3</color>
<color name="colorAccent">#03DAC5</color>
<color name="systemGray">#8E8E93</color>
<color name="systemGray6">#F2F2F7</color>
<color name="systemBackground">#FFFFFF</color>
<color name="systemGreen">#34C759</color>
<color name="systemOrange">#FF9500</color>
<color name="systemRed">#FF3B30</color>
<color name="systemBlue">#007AFF</color>
<color name="white">#FFFFFF</color>
</resources>
================================================
FILE: Android_app/app/src/main/res/values/ic_launcher_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#ffffff</color>
</resources>
================================================
FILE: Android_app/app/src/main/res/values/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Pioneer</string>
<!-- Name of the Android notification channel. -->
<string name="notification_channel_name">Pioneer Status</string>
<string name="notification_channel_description">Notifications for current status of Pioneer</string>
<!-- Content title for foreground service notification -->
<string name="notification_content_title">接触追踪 </string>
<!-- Content text for foreground service notification -->
<string name="notification_content_text">传感器运行中</string>
<string name="warning_notification_content_title">接触警告</string>
<string name="warning_notification_content_text">传感器检测到您与感染者有接触过,请及时到医院进行核酸检测</string>
</resources>
================================================
FILE: Android_app/app/src/main/res/values/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<!--<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>-->
<item name="colorAccent">@color/colorAccent</item>
<item name="colorPrimary">@android:color/white</item>
<item name="colorPrimaryDark">#0097F7</item>
</style>
<style name="InputBoxStyle">
<item name="android:layout_centerHorizontal">true</item>
<item name="android:layout_marginLeft">18dp</item>
<item name="android:layout_marginRight">18dp</item>
<item name="android:background">@drawable/border_input_box</item>
<item name="android:gravity">center</item>
<item name="android:orientation">horizontal</item>
</style>
<style name="EditTextStyle">
<item name="android:layout_marginTop">5dp</item>
<item name="android:layout_marginRight">10dp</item>
<item name="android:layout_marginBottom">5dp</item>
<item name="android:layout_marginLeft">10dp</item>
<item name="android:background">@null</item>
</style>
</resources>
================================================
FILE: Android_app/app/src/test/java/com/ABC/pioneer/app/ExampleUnitTest.java
================================================
package com.ABC.pioneer.app;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() {
assertEquals(4, 2 + 2);
}
}
================================================
FILE: Android_app/build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.0.1"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
================================================
FILE: Android_app/gradle/wrapper/gradle-wrapper.properties
================================================
#Fri Apr 23 18:48:51 CST 2021
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
================================================
FILE: Android_app/gradle.properties
================================================
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app"s APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true
================================================
FILE: Android_app/gradlew
================================================
#!/usr/bin/env sh
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"
================================================
FILE: Android_app/gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
================================================
FILE: Android_app/local.properties
================================================
## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Sat May 08 22:37:11 CST 2021
sdk.dir=C\:\\Users\\12268\\AppData\\Local\\Android\\Sdk
================================================
FILE: Android_app/pioneer/.gitignore
================================================
/build
================================================
FILE: Android_app/pioneer/BuildConfig.java
================================================
/**
* Automatically generated file. DO NOT MODIFY
*/
package com.vmware.herald.app;
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.vmware.herald.app";
public static final String BUILD_TYPE = "debug";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.2.0";
}
================================================
FILE: Android_app/pioneer/app/BuildConfig.java
================================================
/**
* Automatically generated file. DO NOT MODIFY
*/
package com.ABC.pioneer.app;
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.vmware.herald.app";
public static final String BUILD_TYPE = "debug";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.2.0";
}
================================================
FILE: Android_app/pioneer/build.gradle
================================================
plugins {
id 'com.android.library'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
minSdkVersion 21
targetSdkVersion 30
versionCode 1
versionName "1.3.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'org.jetbrains:annotations:15.0'
testImplementation 'junit:junit:4.12'
testImplementation "org.json:json:20201115"
}
================================================
FILE: Android_app/pioneer/consumer-rules.pro
================================================
================================================
FILE: Android_app/pioneer/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
================================================
FILE: Android_app/pioneer/src/androidTest/java/com/ABC/pioneer/sensor/ExampleInstrumentedTest.java
================================================
package com.ABC.pioneer.sensor;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.sdu.pioneer.sensor.test", appContext.getPackageName());
}
}
================================================
FILE: Android_app/pioneer/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ABC.pioneer.sensor">
<!-- Must support Bluetooth LE -->
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
<!-- Permissions for Bluetooth LE as background process -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- Foreground service for Bluetooth LE as background process -->
<application>
<service
android:name="com.ABC.pioneer.sensor.service.ForegroundService"
android:foregroundServiceType="location" />
<service
android:name="com.ABC.pioneer.sensor.service.CustomTimer"/>
</application>
</manifest>
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/DefaultSensorDelegate.java
================================================
package com.ABC.pioneer.sensor;
import com.ABC.pioneer.sensor.datatype.ImmediateSendData;
import com.ABC.pioneer.sensor.datatype.PayloadData;
import com.ABC.pioneer.sensor.datatype.Proximity;
import com.ABC.pioneer.sensor.datatype.SensorType;
import com.ABC.pioneer.sensor.datatype.TargetIdentifier;
import java.util.List;
/// SensorDelegate的默认实现,用于使所有接口方法都可选。
public abstract class DefaultSensorDelegate implements SensorDelegate {
@Override
public void sensor(SensorType sensor, TargetIdentifier didDetect) {
}
@Override
public void sensor(SensorType sensor, PayloadData didRead, TargetIdentifier fromTarget) {
}
@Override
public void sensor(SensorType sensor, ImmediateSendData didReceive, TargetIdentifier fromTarget) {
}
@Override
public void sensor(SensorType sensor, List<PayloadData> didShare, TargetIdentifier fromTarget) {
}
@Override
public void sensor(SensorType sensor, Proximity didMeasure, TargetIdentifier fromTarget) {
}
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/Device.java
================================================
package com.ABC.pioneer.sensor;
import com.ABC.pioneer.sensor.datatype.TargetIdentifier;
import java.util.Date;
public class Device {
///设备注册时间戳
public final Date createdAt;
///上次任何更改,例如attribute更新
public Date lastUpdatedAt = null;
//临时设备标识符,例如 外设标识符UUID
public final TargetIdentifier identifier;
public Device(TargetIdentifier identifier) {
this.createdAt = new Date();
this.lastUpdatedAt = this.createdAt;
this.identifier = identifier;
}
public Device(Device device, TargetIdentifier identifier) {
this.createdAt = device.createdAt;
this.lastUpdatedAt = new Date();
this.identifier = identifier;
}
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/PayloadSupplier.java
================================================
// Copyright 2020 VMware, Inc.
// SPDX-License-Identifier: Apache-2.0
//
package com.ABC.pioneer.sensor;
import com.ABC.pioneer.sensor.datatype.Data;
import com.ABC.pioneer.sensor.datatype.LegacyPayload;
import com.ABC.pioneer.sensor.datatype.PayloadData;
import com.ABC.pioneer.sensor.datatype.PayloadTimestamp;
import java.util.List;
public interface PayloadSupplier {
LegacyPayload legacyPayload(PayloadTimestamp timestamp, Device device);
// 获取给定时间戳的有效负载。 使用它与任何有效负载生成器集成
PayloadData payload(PayloadTimestamp timestamp, Device device);
/// 将原始数据解析为有效载荷
List<PayloadData> payload(Data data);
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/Sensor.java
================================================
// Copyright 2020 VMware, Inc.
// SPDX-License-Identifier: Apache-2.0
//
package com.ABC.pioneer.sensor;
///用于检测和跟踪各种疾病传播媒介的传感器
public interface Sensor {
/// 添加delegate以响应传感器事件。
void add(SensorDelegate delegate);
/// 开始检测。
void start();
/// 停止检测。
void stop();
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/SensorArray.java
================================================
package com.ABC.pioneer.sensor;
import android.content.Context;
import com.ABC.pioneer.sensor.ble.Configurations;
import com.ABC.pioneer.sensor.ble.SpecificBLESensor;
import com.ABC.pioneer.sensor.data.CalibrationLog;
import com.ABC.pioneer.sensor.datatype.Data;
import com.ABC.pioneer.sensor.datatype.PayloadData;
import com.ABC.pioneer.sensor.datatype.PayloadTimestamp;
import com.ABC.pioneer.sensor.datatype.TargetIdentifier;
import com.ABC.pioneer.sensor.motion.ConcreteInertiaSensor;
import java.util.ArrayList;
import java.util.List;
// 用来集成多种探测和追踪方法的传感器列表
public class SensorArray implements Sensor {
private final Context context;
private final List<Sensor> sensorArray = new ArrayList<>();
private final PayloadData payloadData;
public final static String deviceDescription = android.os.Build.MODEL + " (Android " + android.os.Build.VERSION.SDK_INT + ")";
private final SpecificBLESensor specificBleSensor;
public SensorArray(final Context context, PayloadSupplier payloadSupplier) {
this.context = context;
// 定义 sensor 列表
specificBleSensor = new SpecificBLESensor(context, payloadSupplier);
sensorArray.add(specificBleSensor);
//惯性传感器配置用于自动RSSI距离校准数据捕获
if (Configurations.inertiaSensorEnabled) {
sensorArray.add(new ConcreteInertiaSensor(context));
add(new CalibrationLog(context, "calibration.csv"));
}
payloadData = payloadSupplier.payload(new PayloadTimestamp(), null);
}
///立即发送数据。
public boolean immediateSend(Data data, TargetIdentifier targetIdentifier) {
return specificBleSensor.immediateSend(data,targetIdentifier);
}
///立即发送给所有人(已连接/最近/附近)
public boolean immediateSendAll(Data data) {
return specificBleSensor.immediateSendAll(data);
}
public final PayloadData payloadData() {
return payloadData;
}
@Override
public void add(final SensorDelegate delegate) {
for (Sensor sensor : sensorArray) {
sensor.add(delegate);
}
}
@Override
public void start() {
for (Sensor sensor : sensorArray) {
sensor.start();
}
}
@Override
public void stop() {
for (Sensor sensor : sensorArray) {
sensor.stop();
}
}
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/SensorDelegate.java
================================================
// Copyright 2020 VMware, Inc.
// SPDX-License-Identifier: Apache-2.0
//
package com.ABC.pioneer.sensor;
import com.ABC.pioneer.sensor.datatype.ImmediateSendData;
import com.ABC.pioneer.sensor.datatype.PayloadData;
import com.ABC.pioneer.sensor.datatype.Proximity;
import com.ABC.pioneer.sensor.datatype.SensorType;
import com.ABC.pioneer.sensor.datatype.TargetIdentifier;
import java.util.List;
// 用来接受传感事件的传感器代理
public interface SensorDelegate {
// 用临时身份标识符探测周边设备
void sensor(SensorType sensor, TargetIdentifier didDetect);
// 从目标处读取payload
void sensor(SensorType sensor, PayloadData didRead, TargetIdentifier fromTarget);
// 从目标处写下立即传送的数据
void sensor(SensorType sensor, ImmediateSendData didReceive, TargetIdentifier fromTarget);
// 从一个目标处读取该目标最近从其它设备接收到的payload
void sensor(SensorType sensor, List<PayloadData> didShare, TargetIdentifier fromTarget);
// 测量和一个目标的接近度
void sensor(SensorType sensor, Proximity didMeasure, TargetIdentifier fromTarget);
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/analysis/Sample.java
================================================
package com.ABC.pioneer.sensor.analysis;
public class Sample {
protected long n = 0;
protected double m1 = 0, m2 = 0, m3 = 0, m4 = 0;
private double min = Double.MAX_VALUE, max = -Double.MAX_VALUE;
public Sample() {
}
public Sample(final double x, final long f) {
n = f;
m1 = x;
min = x;
max = x;
}
public synchronized void add(final double x) {
final long n1 = n;
n++;
final double delta = x - m1;
final double delta_n = delta / n;
final double delta_n2 = delta_n * delta_n;
final double term1 = delta * delta_n * n1;
m1 += delta_n;
m4 += term1 * delta_n2 * (n * n - 3 * n + 3) + 6 * delta_n2 * m2 - 4 * delta_n * m3;
m3 += term1 * delta_n * (n - 2) - 3 * delta_n * m2;
m2 += term1;
if (x < min) {
min = x;
}
if (x > max) {
max = x;
}
}
public void add(final double x, final long f) {
add(new Sample(x, f));
}
/**
* 将另一个样本分布合并到当前分布中
* 用于累积统计量计算,支持在线算法更新统计量
*
* @param distribution 要合并的样本分布
*/
public void add(final Sample distribution) {
// 如果当前样本为空,直接复制另一个样本的所有统计量
if (n == 0) {
copyStatisticsFrom(distribution);
return;
}
// 计算合并后的样本统计量
Sample combined = combineStatistics(distribution);
// 更新当前样本的统计量
updateCurrentStatistics(combined);
}
/**
* 从另一个样本复制所有统计量到当前样本
*/
private void copyStatisticsFrom(Sample source) {
n = source.n;
m1 = source.m1;
m2 = source.m2;
m3 = source.m3;
m4 = source.m4;
min = source.min;
max = source.max;
}
/**
* 计算合并后的统计量
*/
private Sample combineStatistics(Sample other) {
Sample combined = new Sample();
combined.n = n + other.n;
// 计算均值差异及其幂次
final double delta = other.m1 - m1;
final double delta2 = delta * delta;
final double delta3 = delta * delta2;
final double delta4 = delta2 * delta2;
// 计算合并后的各阶中心矩
combined.m1 = calculateCombinedMean(other, combined.n);
combined.m2 = calculateCombinedSecondMoment(other, delta2, combined.n);
combined.m3 = calculateCombinedThirdMoment(other, delta, delta3, combined.n);
combined.m4 = calculateCombinedFourthMoment(other, delta, delta2, delta4, combined.n);
// 更新最小最大值
combined.min = Math.min(min, other.min);
combined.max = Math.max(max, other.max);
return combined;
}
/**
* 计算合并后的均值
*/
private double calculateCombinedMean(Sample other, double combinedN) {
return (n * m1 + other.n * other.m1) / combinedN;
}
/**
* 计算合并后的二阶中心矩
*/
private double calculateCombinedSecondMoment(Sample other, double delta2, double combinedN) {
return m2 + other.m2 + delta2 * n * other.n / combinedN;
}
/**
* 计算合并后的三阶中心矩
*/
private double calculateCombinedThirdMoment(Sample other, double delta, double delta3, double combinedN) {
double term1 = m3 + other.m3;
double term2 = delta3 * n * other.n * (n - other.n) / (combinedN * combinedN);
double term3 = 3.0 * delta * (n * other.m2 - other.n * m2) / combinedN;
return term1 + term2 + term3;
}
/**
* 计算合并后的四阶中心矩
*/
private double calculateCombinedFourthMoment(Sample other, double delta, double delta2, double delta4, double combinedN) {
double term1 = m4 + other.m4;
double term2 = delta4 * n * other.n * (n * n - n * other.n + other.n * other.n)
/ (combinedN * combinedN * combinedN);
double term3 = 6.0 * delta2 * (n * n * other.m2 + other.n * other.n * m2)
/ (combinedN * combinedN);
double term4 = 4.0 * delta * (n * other.m3 - other.n * m3) / combinedN;
return term1 + term2 + term3 + term4;
}
/**
* 用合并后的统计量更新当前样本
*/
private void updateCurrentStatistics(Sample combined) {
n = combined.n;
m1 = combined.m1;
m2 = combined.m2;
m3 = combined.m3;
m4 = combined.m4;
min = combined.min;
max = combined.max;
}
public long count() {
return n;
}
//平均数
public Double mean() {
if (n > 0) {
return m1;
} else {
return null;
}
}
/**
* 计算并返回样本方差
* 方差是衡量数据离散程度的指标
*
* @return 样本方差值,如果样本数量不足则返回null
*/
public Double variance() {
if (n > 1) {
return m2 / (n - 1d);
} else {
return null;
}
}
/**
* 计算并返回样本标准差
* 标准差是方差的平方根,表示数据分布的离散程度
*
* @return 样本标准差,如果样本数量不足则返回null
*/
public Double standardDeviation() {
if (n > 1) {
return StrictMath.sqrt(m2 / (n - 1d));
} else {
return null;
}
}
/**
* 获取样本中的最小值
*
* @return 样本最小值,如果样本为空则返回null
*/
public Double min() {
if (n > 0) {
return min;
} else {
return null;
}
}
/**
* 获取样本中的最大值
*
* @return 样本最大值,如果样本为空则返回null
*/
public Double max() {
if (n > 0) {
return max;
} else {
return null;
}
}
/**
* 估计当前样本分布与另一个样本分布之间的距离
* 值为1表示分布相同,0表示完全不同
*
* @param otherSample 要比较的另一个样本
* @return 分布距离值,如果无法计算则返回null
*/
public Double distance(final Sample sample) {
return bhattacharyyaDistance(this, sample);
}
/**
* 计算两个分布之间的Bhattacharyya距离
* 用于估计两个分布相同的可能性
* 值为1表示两个分布完全相同,0表示完全不同
*
* @param firstSample 第一个样本
* @param secondSample 第二个样本
* @return Bhattacharyya距离值,如果无法计算则返回null
*/
private final static Double bhattacharyyaDistance(final Sample d1, final Sample d2) {
final Double v1 = d1.variance();
final Double v2 = d2.variance();
final Double m1 = d1.mean();
final Double m2 = d2.mean();
if (v1 == null || v2 == null || m1 == null || m2 == null) {
return null;
}
if (v1 == 0 && v2 == 0) {
if (m1 == m2) {
return 1.0;
} else {
return 0.0;
}
}
final Double sd1 = Math.sqrt(v1);
final Double sd2 = Math.sqrt(v2);
if (sd1 == null || sd2 == null) {
return null;
}
final double Dbc = Math.sqrt((2.0 * sd1 * sd2) / (v1 + v2))
* Math.exp(-1.0 / 4.0 * (Math.pow((m1 - m2), 2) / (v1 + v2)));
return Dbc;
}
/**
* 返回样本的字符串表示形式
*
* @return 包含样本统计信息的字符串
*/
@Override
public String toString() {
return String.format(
"[count=%d, mean=%.2f, sd=%.2f, min=%.2f, max=%.2f]",
count(),
mean(),
standardDeviation(),
min(),
max()
);
}
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/BLEDatabaseDelegate.java
================================================
package com.ABC.pioneer.sensor.ble;
/// 代表接收注册表创建/更新/删除事件
public interface BLEDatabaseDelegate {
void bleDatabaseDidCreate(BLEDevice device);
void bleDatabaseDidUpdate(BLEDevice device, DeviceAttribute attribute);
void bleDatabaseDidDelete(BLEDevice device);
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/BLEDevice.java
================================================
package com.ABC.pioneer.sensor.ble;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.le.ScanRecord;
import com.ABC.pioneer.sensor.Device;
import com.ABC.pioneer.sensor.datatype.Calibration;
import com.ABC.pioneer.sensor.datatype.CalibrationMeasurementUnit;
import com.ABC.pioneer.sensor.datatype.Data;
import com.ABC.pioneer.sensor.datatype.PayloadData;
import com.ABC.pioneer.sensor.datatype.PseudoDeviceAddress;
import com.ABC.pioneer.sensor.datatype.RSSI;
import com.ABC.pioneer.sensor.datatype.TargetIdentifier;
import com.ABC.pioneer.sensor.datatype.TimeInterval;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Queue;
public class BLEDevice extends Device {
/// BLE characteristics特征
private BluetoothGattCharacteristic signalCharacteristic = null;
private BluetoothGattCharacteristic payloadCharacteristic = null;
private BluetoothGattCharacteristic legacyPayloadCharacteristic = null;
protected byte[] signalCharacteristicWriteValue = null;
protected Queue<byte[]> signalCharacteristicWriteQueue = null;
private BluetoothGattCharacteristic modelCharacteristic = null;
private String model = null;
private BluetoothGattCharacteristic deviceNameCharacteristic = null;
private String deviceName = null;
/// 跟踪连接时间戳
private Date lastDiscoveredAt = null;
private Date lastConnectedAt = null;
/// 有效负载数据已与此对等方共享
protected final List<PayloadData> payloadSharingData = new ArrayList<>();
/// 跟踪写入时间戳
private Date lastWritePayloadAt = null;
private Date lastWriteRssiAt = null;
private Date lastWritePayloadSharingAt = null;
// 伪设备地址,用于跟踪不断更改地址的Android设备。
private PseudoDeviceAddress pseudoDeviceAddress = null;
// 用于侦听属性更新事件的委托
private final DeviceDelegate delegate;
/// 用于与此设备进行交互的Android蓝牙设备对象。
private BluetoothDevice peripheral = null;
/// 蓝牙设备连接状态。
private DeviceState state = DeviceState.disconnected;
/// 设备操作系统,这对于为每个平台选择不同的交互过程是必需的。
private DeviceOperatingSystem operatingSystem = DeviceOperatingSystem.unknown;
//通过payloadCharacteristic读取从设备获取的有效载荷数据
private PayloadData payloadData = null;
private Date lastPayloadDataUpdate = null;
/// 立即发送数据以发送到下一个设备
private Data immediateSendData = null;
/// 通过readRSSI或didDiscover进行最新的RSSI测量。
private RSSI rssi = null;
/// 在可用的情况下传输功率数据(仅由Android设备提供)
private TxPower txPower = null;
/// 如果设备是receive only设备?
private boolean receiveOnly = false;
/// 相应的ignore设置
private TimeInterval ignoreForDuration = null;
private Date ignoreUntil = null;
private ScanRecord scanRecord = null;
public TimeInterval timeIntervalSinceConnected() {
if (state() != DeviceState.connected) {
return TimeInterval.zero;
}
if (lastConnectedAt == null) {
return TimeInterval.zero;
}
return new TimeInterval((new Date().getTime() - lastConnectedAt.getTime()) / 1000);
}
/// 自上次属性值更新以来的时间间隔,此间隔用于标识可能已过期并且应从数据库中删除的设备。
public TimeInterval timeIntervalSinceLastUpdate() {
if (lastUpdatedAt == null) {
return TimeInterval.never;
}
return new TimeInterval((new Date().getTime() - lastUpdatedAt.getTime()) / 1000);
}
public String description() {
return "BLEDevice[" +
"id=" + identifier +
",os=" + operatingSystem +
",payload=" + payloadData() +
(pseudoDeviceAddress() != null ? ",address=" + pseudoDeviceAddress() : "") +
(deviceName() != null ? ",name=" + deviceName() : "") +
(model() != null ? ",model=" + model() : "") +
"]";
}
public BLEDevice(TargetIdentifier identifier, DeviceDelegate delegate) {
super(identifier);
this.delegate = delegate;
}
public PseudoDeviceAddress pseudoDeviceAddress() {
return pseudoDeviceAddress;
}
public void pseudoDeviceAddress(PseudoDeviceAddress pseudoDeviceAddress) {
if (this.pseudoDeviceAddress == null || !this.pseudoDeviceAddress.equals(pseudoDeviceAddress)) {
this.pseudoDeviceAddress = pseudoDeviceAddress;
lastUpdatedAt = new Date();
}
}
//设备状态
public DeviceState state() {
return state;
}
public void state(DeviceState state) {
this.state = state;
lastUpdatedAt = new Date();
if (state == DeviceState.connected) {
lastConnectedAt = lastUpdatedAt;
}
delegate.device(this, DeviceAttribute.state);
}
public DeviceOperatingSystem operatingSystem() {
return operatingSystem;
}
public void operatingSystem(DeviceOperatingSystem operatingSystem) {
lastUpdatedAt = new Date();
// 设置忽略时间戳
if (operatingSystem == DeviceOperatingSystem.ignore) {
if (ignoreForDuration == null) {
ignoreForDuration = TimeInterval.minute;
} else if (ignoreForDuration.value < TimeInterval.minutes(3).value) {
ignoreForDuration = new TimeInterval(Math.round(ignoreForDuration.value * 1.2));
}
ignoreUntil = new Date(lastUpdatedAt.getTime() + ignoreForDuration.millis());
} else {
ignoreUntil = null;
}
//如果已确认操作系统,则重置持续时间和请求计数的忽略
if (operatingSystem == DeviceOperatingSystem.ios || operatingSystem == DeviceOperatingSystem.android) {
ignoreForDuration = null;
}
//设置操作系统
if (this.operatingSystem != operatingSystem) {
this.operatingSystem = operatingSystem;
delegate.device(this, DeviceAttribute.operatingSystem);
}
}
/// 时间判断之后忽略该设备
public boolean ignore() {
if (ignoreUntil == null) {
return false;
}
if (new Date().getTime() < ignoreUntil.getTime()) {
return true;
}
return false;
}
//外围设备信息
public BluetoothDevice peripheral() {
return peripheral;
}
public void peripheral(BluetoothDevice peripheral) {
if (this.peripheral != peripheral) {
this.peripheral = peripheral;
lastUpdatedAt = new Date();
}
}
public void immediateSendData(Data immediateSendData) {
this.immediateSendData = immediateSendData;
}
public Data immediateSendData() {
return immediateSendData;
}
public RSSI rssi() {
return rssi;
}
public void rssi(RSSI rssi) {
this.rssi = rssi;
lastUpdatedAt = new Date();
delegate.device(this, DeviceAttribute.rssi);
}
public void legacyPayloadCharacteristic(BluetoothGattCharacteristic characteristic) {
this.legacyPayloadCharacteristic = characteristic;
}
public BluetoothGattCharacteristic legacyPayloadCharacteristic() {
return legacyPayloadCharacteristic;
}
public TxPower txPower() {
return txPower;
}
public void txPower(TxPower txPower) {
this.txPower = txPower;
lastUpdatedAt = new Date();
delegate.device(this, DeviceAttribute.txPower);
}
public PayloadData payloadData() {
return payloadData;
}
public void payloadData(PayloadData payloadData) {
this.payloadData = payloadData;
lastPayloadDataUpdate = new Date();
lastUpdatedAt = lastPayloadDataUpdate;
delegate.device(this, DeviceAttribute.payloadData);
}
public TimeInterval timeIntervalSinceLastPayloadDataUpdate() {
if (lastPayloadDataUpdate == null) {
return TimeInterval.never;
}
return new TimeInterval((new Date().getTime() - lastPayloadDataUpdate.getTime()) / 1000);
}
public Calibration calibration() {
if (txPower == null) {
return null;
}
return new Calibration(CalibrationMeasurementUnit.BLETransmitPower, new Double(txPower.value));
}
public boolean receiveOnly() {
return receiveOnly;
}
public void receiveOnly(boolean receiveOnly) {
this.receiveOnly = receiveOnly;
lastUpdatedAt = new Date();
}
public void invalidateCharacteristics() {
signalCharacteristic = null;
payloadCharacteristic = null;
modelCharacteristic = null;
deviceNameCharacteristic = null;
legacyPayloadCharacteristic = null;
}
public BluetoothGattCharacteristic signalCharacteristic() {
return signalCharacteristic;
}
public void signalCharacteristic(BluetoothGattCharacteristic characteristic) {
this.signalCharacteristic = characteristic;
lastUpdatedAt = new Date();
}
public BluetoothGattCharacteristic payloadCharacteristic() {
return payloadCharacteristic;
}
public void payloadCharacteristic(BluetoothGattCharacteristic characteristic) {
this.payloadCharacteristic = characteristic;
lastUpdatedAt = new Date();
}
public boolean supportsModelCharacteristic() { return null != modelCharacteristic; }
public BluetoothGattCharacteristic modelCharacteristic() { return modelCharacteristic; }
public void modelCharacteristic(BluetoothGattCharacteristic modelCharacteristic) {
this.modelCharacteristic = modelCharacteristic;
lastUpdatedAt = new Date();
}
public boolean supportsDeviceNameCharacteristic() { return null != deviceNameCharacteristic; }
public BluetoothGattCharacteristic deviceNameCharacteristic() { return deviceNameCharacteristic; }
public void deviceNameCharacteristic(BluetoothGattCharacteristic deviceNameCharacteristic) {
this.deviceNameCharacteristic = deviceNameCharacteristic;
lastUpdatedAt = new Date();
}
public String deviceName() { return deviceName; }
public void deviceName(String deviceName) {
this.deviceName = deviceName;
lastUpdatedAt = new Date();
}
public String model() { return model; }
public void model(String model) {
this.model = model;
lastUpdatedAt = new Date();
}
public void registerDiscovery() {
lastDiscoveredAt = new Date();
lastUpdatedAt = lastDiscoveredAt;
}
public void registerWritePayload() {
lastUpdatedAt = new Date();
lastWritePayloadAt = lastUpdatedAt;
}
public TimeInterval timeIntervalSinceLastWritePayload() {
if (lastWritePayloadAt == null) {
return TimeInterval.never;
}
return new TimeInterval((new Date().getTime() - lastWritePayloadAt.getTime()) / 1000);
}
public void registerWriteRssi() {
lastUpdatedAt = new Date();
lastWriteRssiAt = lastUpdatedAt;
}
public TimeInterval timeIntervalSinceLastWriteRssi() {
if (lastWriteRssiAt == null) {
return TimeInterval.never;
}
return new TimeInterval((new Date().getTime() - lastWriteRssiAt.getTime()) / 1000);
}
public void registerWritePayloadSharing() {
lastUpdatedAt = new Date();
lastWritePayloadSharingAt = lastUpdatedAt;
}
public TimeInterval timeIntervalSinceLastWritePayloadSharing() {
if (lastWritePayloadSharingAt == null) {
return TimeInterval.never;
}
return new TimeInterval((new Date().getTime() - lastWritePayloadSharingAt.getTime()) / 1000);
}
public TimeInterval timeIntervalUntilIgnoreExpires() {
if (ignoreUntil == null) {
return TimeInterval.zero;
}
if (ignoreUntil.getTime() == Long.MAX_VALUE) {
return TimeInterval.never;
}
return new TimeInterval((ignoreUntil.getTime() - new Date().getTime()) / 1000);
}
public boolean protocolIsPioneer() {
return signalCharacteristic != null && payloadCharacteristic != null;
}
public void scanRecord(ScanRecord scanRecord) {
this.scanRecord = scanRecord;
}
public ScanRecord scanRecord() {
return scanRecord;
}
public boolean protocolIsLegacy() {
return legacyPayloadCharacteristic != null && signalCharacteristic == null;
}
@Override
public String toString() {
return description();
}
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/BLESensor.java
================================================
package com.ABC.pioneer.sensor.ble;
import com.ABC.pioneer.sensor.Sensor;
public interface BLESensor extends Sensor {
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/BluetoothStateManager.java
================================================
package com.ABC.pioneer.sensor.ble;
import com.ABC.pioneer.sensor.datatype.BluetoothState;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
public interface BluetoothStateManager {
Queue<BluetoothStateManagerDelegate> delegates = new ConcurrentLinkedQueue<>();
BluetoothState state();
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/BluetoothStateManagerDelegate.java
================================================
package com.ABC.pioneer.sensor.ble;
import com.ABC.pioneer.sensor.datatype.BluetoothState;
public interface BluetoothStateManagerDelegate {
void bluetoothStateManager(BluetoothState didUpdateState);
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/Configurations.java
================================================
package com.ABC.pioneer.sensor.ble;
import com.ABC.pioneer.sensor.datatype.RandomSource;
import com.ABC.pioneer.sensor.datatype.TimeInterval;
import java.util.UUID;
/// 定义BLE传感器配置数据,例如 服务和特征性UUID
public class Configurations {
// BLE服务和特征性UUID,以及制造商ID
// Beacon: Service UUID。这是一个固定的UUID,使iOS设备即使在后台模式下也可以找到彼此。
// Android设备将需要首先使用制造商代码找到Apple设备,然后发现服务以识别实际的信标。
// -Service and characteristic UUIDs 是V4 UUID,它们是通过进行网络搜索以确保不返回任何结果而随机生成并经过测试的唯一性。
// 默认的Pioneer需要的UUID是 428132af-4746-42d3-801e-4572d65bfd9b
// -通过在基本UUID中设置值xxxx切换到16位UUID 0000xxxx-0000-1000-8000-00805F9B34FB
public static UUID serviceUUID = UUID.fromString("9ea51088-5add-438b-a269-dd6289844034");
// 用于android控制外围设备和中央设备之间连接的Signal Characteristic,例如:使彼此保持暂停状态
// -Characteristic UUID是随机生成的V4 UUID,已通过进行网络搜索来测试其唯一性,以确保其不返回任何结果。
public final static UUID androidSignalCharacteristicUUID = UUID.fromString("0ff27076-1fb2-4551-9670-7b468af8a9e7");
// 用于ios控制外围设备和中央设备之间连接的Signal Characteristic,例如:使彼此保持暂停状态
// -Characteristic UUID是随机生成的V4 UUID,已通过进行网络搜索来测试其唯一性,以确保其不返回任何结果。
public final static UUID iosSignalCharacteristicUUID = UUID.fromString("64451d23-b364-4967-bb43-51b82a56f3a5");
// 主要payload Characteristic UUID(读取),用于将有效载荷数据从外围设备分配到中央,例如:身份数据
// -特征性UUID是随机生成的V4 UUID,已通过进行网络搜索来测试其唯一性,以确保其不返回任何结果。
public final static UUID payloadCharacteristicUUID = UUID.fromString("2b5362a6-c995-4ab7-b744-cb366d4785bd");
/// 标准蓝牙服务和特征
/// 这些都是BLE标准中的固定UUID。
/// 通用访问服务的标准蓝牙Service UUID
/// -BLE标准的Service UUID
public final static UUID bluetoothGenericAccessServiceUUID = UUID.fromString("00001800-0000-1000-8000-00805f9b34fb");
/// 通用访问服务的标准蓝牙Characteristic UUID:设备名称
/// - BLE标准中的Characteristic UUID
public final static UUID bluetoothGenericAccessServiceDeviceNameCharacteristicUUID = UUID.fromString("00002a00-0000-1000-8000-00805f9b34fb");
/// 通用访问服务的标准蓝牙Characteristic UUID:设备名称
/// - BLE标准中的Characteristic UUID
public final static UUID bluetoothGenericAccessServiceAppearanceCharacteristicUUID = UUID.fromString("00002a01-0000-1000-8000-00805f9b34fb");
/// 设备信息服务的标准蓝牙Service UUID
/// - BLE标准中的Service UUID
public final static UUID bluetoothDeviceInformationServiceUUID = UUID.fromString("0000180a-0000-1000-8000-00805f9b34fb");
/// 设备信息服务的标准蓝牙Characteristic UUID:Model
/// - BLE标准中的Characteristic UUID
public final static UUID bluetoothDeviceInformationServiceModelCharacteristicUUID = UUID.fromString("00002a24-0000-1000-8000-00805f9b34fb");
/// 设备信息服务的标准蓝牙Characteristic UUID: 制造商数据
/// - BLE标准中的Characteristic UUID
public final static UUID bluetoothDeviceInformationServiceManufacturerCharacteristicUUID = UUID.fromString("00002a29-0000-1000-8000-00805f9b34fb");
/// 设备信息服务的标准蓝牙Characteristic UUID: TX Power
/// - BLE标准中的Characteristic UUID
public final static UUID bluetoothDeviceInformationServiceTxPowerCharacteristicUUID = UUID.fromString("00002a07-0000-1000-8000-00805f9b34fb");
/// 在Android上使用制造商数据来存储伪设备地址
/// -临时设定的ID
public final static int manufacturerIdForSensor = 65530;
/// BLE广告Apple的制造商ID,用于扫描后台iOS设备
public final static int manufacturerIdForApple = 76;
// BLE signal characteristic操作码
/// Signal characteristic用于写入有效负载的动作码,1字节动作代码 + 2字节小段int16的整型数据(payload长度)+payload数据
public final static byte signalCharacteristicActionWritePayload = (byte) 1;
/// /// Signal characteristic用于写入RSSI的动作码,1字节动作代码 + 4字节小段int32的RSSI数据
public final static byte signalCharacteristicActionWriteRSSI = (byte) 2;
/// Signal characteristic用于写入共享payload的动作码,1字节动作代码 + 2字节小段int16的整型数据(payload长度)+payload sharing数据
public final static byte signalCharacteristicActionWritePayloadSharing = (byte) 3;
/// 立即写操作码
public final static byte signalCharacteristicActionWriteImmediate = (byte) 4;
// 应用程序可配置BLE功能
/// 除了默认的Pioneer通信过程之外,还定期更新payload数据
/// - 使用此选项可根据应用程序payload寿命启用常规payload读取。
/// - 设置为.never以禁用此功能。
/// - 有效负载更新将以didRead的形式报告给SensorDelegate。
/// - 设置立即生效,无需重新启动BLESensor,也可以在BLESensor处于活动状态时应用。
public static TimeInterval payloadDataUpdateTimeInterval = TimeInterval.never;
// 过滤重复payload数据并抑制传感器代理响应(didRead:fromTarget)
/// - 设置为.never以禁用此功能。
/// - 设置时间间隔N以过滤最近N秒内看到的重复有效载荷数据
/// - 例如:60表示在最后一分钟过滤重复项
/// - 从所有目标过滤所有出现的payload数据
public static TimeInterval filterDuplicatePayloadData = TimeInterval.never;
// 共享有效负载的到期时间,以确保仅共享最近看到的有效负载
public static TimeInterval payloadSharingExpiryTimeInterval = new TimeInterval(5 * TimeInterval.minute.value);
/// 广播刷新时间间隔
public static TimeInterval advertRefreshTimeInterval = TimeInterval.minutes(15);
/// 用于生成伪设备地址的随机化方法,有关详细信息,请参见PseudoDeviceAddress和RandomSource文件。
/// - 设置为Random以获得可靠的连续运行
/// - 其他方法将在4-8小时后导致阻塞并在空闲设备上中断操作
/// - 阻塞会在 应用初始化,广告刷新和影响系统服务时 发生
public static RandomSource.Method pseudoDeviceAddressRandomisation = RandomSource.Method.Random;
public static boolean deviceIntrospectionEnabled = false;
public static boolean deviceFilterTrainingEnabled = false;
/// 根据消息模式定义设备过滤规则
/// - 避免连接到无法托管传感器服务的设备
/// - 与广告中的每个制造商特定的数据消息(十六进制格式)匹配
/// - Java正则表达式模式,不区分大小写,可在消息中的任何位置找到模式
/// - 切记要在消息开头添加^以进行匹配
/// - 在开发环境中使用deviceFilterTrainingEnabled来识别模式
public static String[] deviceFilterFeaturePatterns = new String[]{
"^10....04",
"^10....14",
"^0100000000000000000000000000000000",
"^05","^07","^09",
"^00","^1002","^06","^08","^03","^0C","^0D","^0F","^0E","^0B"
};
/// 启用惯性传感器
public static boolean inertiaSensorEnabled = false;
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/Database.java
================================================
package com.ABC.pioneer.sensor.ble;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.le.ScanResult;
import com.ABC.pioneer.sensor.datatype.PayloadData;
import com.ABC.pioneer.sensor.datatype.PayloadSharingData;
import com.ABC.pioneer.sensor.datatype.TargetIdentifier;
import java.util.List;
// 用于整理来自异步BLE操作的信息片段的注册表。
public interface Database {
// 添加用于处理数据库事件的委托
void add(BLEDatabaseDelegate delegate);
// 获取或创建用于整理来自异步BLE操作的信息的设备。
BLEDevice device(ScanResult scanResult);
// 获取或创建用于整理来自异步BLE操作的信息的设备。
BLEDevice device(BluetoothDevice bluetoothDevice);
/// 获取或创建用于整理来自异步BLE操作的信息的设备。
BLEDevice device(PayloadData payloadData);
/// 从TargetIdentifier获取设备
BLEDevice device(TargetIdentifier targetIdentifier);
/// 获取所有设备
List<BLEDevice> devices();
/// 删除设备
void delete(BLEDevice device);
/// 获取对等方的有效负载共享数据
PayloadSharingData payloadSharingData(BLEDevice peer);
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/DeviceAttribute.java
================================================
package com.ABC.pioneer.sensor.ble;
//BLE设备属性
public enum DeviceAttribute {
peripheral, state, operatingSystem, payloadData, rssi, txPower
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/DeviceDelegate.java
================================================
package com.ABC.pioneer.sensor.ble;
public interface DeviceDelegate {
void device(BLEDevice device, DeviceAttribute didUpdate);
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/DeviceOperatingSystem.java
================================================
package com.ABC.pioneer.sensor.ble;
public enum DeviceOperatingSystem {
android_tbc, android, ios_tbc, ios, ignore, shared, unknown
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/DeviceState.java
================================================
package com.ABC.pioneer.sensor.ble;
/// BLE设备连接状态
public enum DeviceState {
connecting, connected, disconnected
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/DeviceUpdatedComparator.java
================================================
package com.ABC.pioneer.sensor.ble;
import java.util.Comparator;
//设备更新比较器
//这里我们按最后一次更新的时间对device进行排序,以便于后续的操作
public class DeviceUpdatedComparator implements Comparator<BLEDevice> {
public int compare(BLEDevice a, BLEDevice b)
{
// 最后更新时间的降序(因此逻辑相反)
long bt = b.lastUpdatedAt.getTime();
long at = a.lastUpdatedAt.getTime();
if (bt > at) {
return 1;
}
if (bt < at) {
return -1;
}
return 0;
}
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/Receiver.java
================================================
package com.ABC.pioneer.sensor.ble;
import com.ABC.pioneer.sensor.Sensor;
import com.ABC.pioneer.sensor.SensorDelegate;
import com.ABC.pioneer.sensor.datatype.Data;
import com.ABC.pioneer.sensor.datatype.TargetIdentifier;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
//receiver扫描具有固定Service UUID 的外围设备
public interface Receiver extends Sensor {
Queue<SensorDelegate> delegates = new ConcurrentLinkedQueue<>();
/// 立即发送数据。
boolean immediateSend(Data data, TargetIdentifier targetIdentifier);
// 立即发送给所有人(已连接/最近/附近)
boolean immediateSendAll(Data data);
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/SpecificBLESensor.java
================================================
package com.ABC.pioneer.sensor.ble;
import android.content.Context;
import com.ABC.pioneer.sensor.PayloadSupplier;
import com.ABC.pioneer.sensor.SensorDelegate;
import com.ABC.pioneer.sensor.datatype.BluetoothState;
import com.ABC.pioneer.sensor.datatype.Data;
import com.ABC.pioneer.sensor.datatype.PayloadData;
import com.ABC.pioneer.sensor.datatype.Proximity;
import com.ABC.pioneer.sensor.datatype.ProximityMeasurementUnit;
import com.ABC.pioneer.sensor.datatype.RSSI;
import com.ABC.pioneer.sensor.datatype.SensorState;
import com.ABC.pioneer.sensor.datatype.SensorType;
import com.ABC.pioneer.sensor.datatype.TargetIdentifier;
import com.ABC.pioneer.sensor.datatype.TimeInterval;
import java.util.Date;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SpecificBLESensor implements BLESensor, BLEDatabaseDelegate, BluetoothStateManagerDelegate {
private final Queue<SensorDelegate> delegates = new ConcurrentLinkedQueue<>();
private final Transmitter transmitter;
private final Receiver receiver;
private final ExecutorService operationQueue = Executors.newSingleThreadExecutor();
// 记录有效负载数据以启用重复数据删除
private final Map<PayloadData, Date> didReadPayloadData = new ConcurrentHashMap<>();
public SpecificBLESensor(Context context, PayloadSupplier payloadSupplier) {
final BluetoothStateManager bluetoothStateManager = new SpecificBluetoothStateManager(context);
final Database database = new SpecificDatabase();
final Timer timer = new Timer(context);
bluetoothStateManager.delegates.add(this);
transmitter = new SpecificTransmitter(context, bluetoothStateManager, timer, payloadSupplier, database);
receiver = new SpecificReceiver(context, bluetoothStateManager, timer, database, transmitter, payloadSupplier);
database.add(this);
}
@Override
public void add(SensorDelegate delegate) {
delegates.add(delegate);
transmitter.add(delegate);
receiver.add(delegate);
}
@Override
public void start() {
transmitter.start();
receiver.start();
}
@Override
public void stop() {
transmitter.stop();
receiver.stop();
}
// BLEDatabaseDelegate
@Override
public void bleDatabaseDidUpdate(final BLEDevice device, DeviceAttribute attribute) {
switch (attribute) {
case rssi: {
final RSSI rssi = device.rssi();
if (rssi == null) {
return;
}
final Proximity proximity = new Proximity(ProximityMeasurementUnit.RSSI, (double) rssi.value, device.calibration());
operationQueue.execute(new Runnable() {
@Override
public void run() {
for (SensorDelegate delegate : delegates) {
delegate.sensor(SensorType.BLE, proximity, device.identifier);
}
}
});
final PayloadData payloadData = device.payloadData();
if (payloadData == null) {
return;
}
break;
}
case payloadData: {
final PayloadData payloadData = device.payloadData();
if (payloadData == null) {
return;
}
// 最近一次对有效负载进行重复数据删除
if (Configurations.filterDuplicatePayloadData != TimeInterval.never) {
final long removePayloadDataBefore = new Date().getTime() - Configurations.filterDuplicatePayloadData.millis();
for (Map.Entry<PayloadData, Date> entry : didReadPayloadData.entrySet()) {
if (entry.getValue().getTime() < removePayloadDataBefore) {
didReadPayloadData.remove(entry.getKey());
}
}
final Date lastReportedAt = didReadPayloadData.get(payloadData);
if (lastReportedAt != null) {
return;
}
didReadPayloadData.put(payloadData, new Date());
}
// 通知delegates
operationQueue.execute(new Runnable() {
@Override
public void run() {
for (SensorDelegate delegate : delegates) {
delegate.sensor(SensorType.BLE, payloadData, device.identifier);
}
}
});
break;
}
default: {
}
}
}
public boolean immediateSend(Data data, TargetIdentifier targetIdentifier) {
return receiver.immediateSend(data, targetIdentifier);
}
public boolean immediateSendAll(Data data) {
return receiver.immediateSendAll(data);
}
@Override
public void bleDatabaseDidCreate(final BLEDevice device) {
operationQueue.execute(new Runnable() {
@Override
public void run() {
for (SensorDelegate delegate : delegates) {
delegate.sensor(SensorType.BLE, device.identifier);
}
}
});
}
@Override
public void bleDatabaseDidDelete(BLEDevice device) {
}
// BluetoothStateManagerDelegate
@Override
public void bluetoothStateManager(BluetoothState didUpdateState) {
SensorState sensorState = SensorState.off;
if (didUpdateState == BluetoothState.poweredOn) {
sensorState = SensorState.on;
} else if (didUpdateState == BluetoothState.unsupported) {
sensorState = SensorState.unavailable;
}
}
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/SpecificBluetoothStateManager.java
================================================
package com.ABC.pioneer.sensor.ble;
import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import com.ABC.pioneer.sensor.datatype.BluetoothState;
/**
* 监测蓝牙状态是否变化
*/
public class SpecificBluetoothStateManager implements BluetoothStateManager {
private BluetoothState state = null;
private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(intent.getAction())) {
try {
final int nativeState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
switch (nativeState) {
case BluetoothAdapter.STATE_ON:
state = BluetoothState.poweredOn;
for (BluetoothStateManagerDelegate delegate : delegates) {
delegate.bluetoothStateManager(BluetoothState.poweredOn);
}
break;
case BluetoothAdapter.STATE_OFF:
state = BluetoothState.poweredOff;
for (BluetoothStateManagerDelegate delegate : delegates) {
delegate.bluetoothStateManager(BluetoothState.poweredOff);
}
break;
}
} catch (Throwable e) {
}
}
}
};
/**
* 监测蓝牙状态是否变化
*/
public SpecificBluetoothStateManager(Context context) {
state = state();
final IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
context.registerReceiver(broadcastReceiver, intentFilter);
}
@Override
public BluetoothState state() {
if (state == null) {
final BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null) {
state = BluetoothState.unsupported;
return state;
}
switch (BluetoothAdapter.getDefaultAdapter().getState()) {
case BluetoothAdapter.STATE_ON:
state = BluetoothState.poweredOn;
break;
case BluetoothAdapter.STATE_OFF:
case BluetoothAdapter.STATE_TURNING_OFF:
case BluetoothAdapter.STATE_TURNING_ON:
default:
state = BluetoothState.poweredOff;
break;
}
}
return state;
}
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/SpecificDatabase.java
================================================
package com.ABC.pioneer.sensor.ble;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.le.ScanRecord;
import android.bluetooth.le.ScanResult;
import com.ABC.pioneer.sensor.datatype.Data;
import com.ABC.pioneer.sensor.datatype.PayloadData;
import com.ABC.pioneer.sensor.datatype.PayloadSharingData;
import com.ABC.pioneer.sensor.datatype.PseudoDeviceAddress;
import com.ABC.pioneer.sensor.datatype.RSSI;
import com.ABC.pioneer.sensor.datatype.TargetIdentifier;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SpecificDatabase implements Database, DeviceDelegate {
private final Queue<BLEDatabaseDelegate> delegates = new ConcurrentLinkedQueue<>();
private final Map<TargetIdentifier, BLEDevice> database = new ConcurrentHashMap<>();
private final ExecutorService queue = Executors.newSingleThreadExecutor();
/// 获取Android设备的伪设备地址
private PseudoDeviceAddress pseudoDeviceAddress(final ScanResult scanResult) {
final ScanRecord scanRecord = scanResult.getScanRecord();
if (scanRecord == null) {
return null;
}
// Pioneer伪设备地址
if (scanRecord.getManufacturerSpecificData(Configurations.manufacturerIdForSensor) != null) {
final byte[] data = scanRecord.getManufacturerSpecificData(Configurations.manufacturerIdForSensor);
if (data != null && data.length == 6) {
return new PseudoDeviceAddress(data);
}
}
// 未找到
return null;
}
@Override
public void add(final BLEDatabaseDelegate delegate) {
delegates.add(delegate);
}
@Override
public BLEDevice device(final TargetIdentifier targetIdentifier) {
return database.get(targetIdentifier);
}
@Override
public BLEDevice device(final BluetoothDevice bluetoothDevice) {
final TargetIdentifier identifier = new TargetIdentifier(bluetoothDevice);
BLEDevice device = database.get(identifier);
if (device == null) {
final BLEDevice newDevice = new BLEDevice(identifier, this);
device = newDevice;
database.put(identifier, newDevice);
queue.execute(new Runnable() {
@Override
public void run() {
for (BLEDatabaseDelegate delegate : delegates) {
delegate.bleDatabaseDidCreate(newDevice);
}
}
});
}
device.peripheral(bluetoothDevice);
return device;
}
@Override
public BLEDevice device(final ScanResult scanResult) {
// 通过目标标识符获取设备
final BluetoothDevice bluetoothDevice = scanResult.getDevice();
final TargetIdentifier targetIdentifier = new TargetIdentifier(bluetoothDevice);
final BLEDevice existingDevice = database.get(targetIdentifier);
if (existingDevice != null) {
return existingDevice;
}
// 通过伪设备地址获取设备信息
final PseudoDeviceAddress pseudoDeviceAddress = pseudoDeviceAddress(scanResult);
if (pseudoDeviceAddress != null) {
// 重用现有的Android设备
BLEDevice deviceWithSamePseudoDeviceAddress = null;
for (final BLEDevice device : database.values()) {
if (device.pseudoDeviceAddress() != null && device.pseudoDeviceAddress().equals(pseudoDeviceAddress)) {
deviceWithSamePseudoDeviceAddress = device;
break;
}
}
if (deviceWithSamePseudoDeviceAddress != null) {
database.put(targetIdentifier, deviceWithSamePseudoDeviceAddress);
if (deviceWithSamePseudoDeviceAddress.peripheral() != bluetoothDevice) {
deviceWithSamePseudoDeviceAddress.peripheral(bluetoothDevice);
}
if (deviceWithSamePseudoDeviceAddress.operatingSystem() != DeviceOperatingSystem.android) {
deviceWithSamePseudoDeviceAddress.operatingSystem(DeviceOperatingSystem.android);
}
return deviceWithSamePseudoDeviceAddress;
}
// 创建新的Android设备
else {
final BLEDevice newDevice = device(bluetoothDevice);
newDevice.pseudoDeviceAddress(pseudoDeviceAddress);
newDevice.operatingSystem(DeviceOperatingSystem.android);
return newDevice;
}
}
// 创建新的设备
return device(bluetoothDevice);
}
@Override
public List<BLEDevice> devices() {
return new ArrayList<>(database.values());
}
@Override
public BLEDevice device(PayloadData payloadData) {
BLEDevice device = null;
for (BLEDevice candidate : database.values()) {
if (payloadData.equals(candidate.payloadData())) {
device = candidate;
break;
}
}
if (device == null) {
final TargetIdentifier identifier = new TargetIdentifier();
final BLEDevice newDevice = new BLEDevice(identifier, this);
device = newDevice;
database.put(identifier, newDevice);
queue.execute(new Runnable() {
@Override
public void run() {
for (BLEDatabaseDelegate delegate : delegates) {
delegate.bleDatabaseDidCreate(newDevice);
}
}
});
}
device.payloadData(payloadData);
return device;
}
@Override
public void delete(final BLEDevice device) {
if (device == null) {
return;
}
final List<TargetIdentifier> identifiers = new ArrayList<>();
for (final Map.Entry<TargetIdentifier,BLEDevice> entry : database.entrySet()) {
if (entry.getValue() == device) {
identifiers.add(entry.getKey());
}
}
if (identifiers.isEmpty()) {
return;
}
for (final TargetIdentifier identifier : identifiers) {
database.remove(identifier);
}
queue.execute(new Runnable() {
@Override
public void run() {
for (final BLEDatabaseDelegate delegate : delegates) {
delegate.bleDatabaseDidDelete(device);
}
}
});
}
// BLEDeviceDelegate
@Override
public void device(final BLEDevice device, final DeviceAttribute didUpdate) {
queue.execute(new Runnable() {
@Override
public void run() {
for (BLEDatabaseDelegate delegate : delegates) {
delegate.bleDatabaseDidUpdate(device, didUpdate);
}
}
});
}
@Override
public PayloadSharingData payloadSharingData(final BLEDevice peer) {
final RSSI rssi = peer.rssi();
if (rssi == null) {
return new PayloadSharingData(new RSSI(127), new Data(new byte[0]));
}
// 获取此设备最近查看过的其他设备
final List<BLEDevice> unknownDevices = new ArrayList<>();
final List<BLEDevice> knownDevices = new ArrayList<>();
for (BLEDevice device : database.values()) {
// 最近看过的设备信息
if (device.timeIntervalSinceLastUpdate().value >= Configurations.payloadSharingExpiryTimeInterval.value) {
continue;
}
// 设备含有payload数据
if (device.payloadData() == null) {
continue;
}
// 设备是IOS设备或者是receive-only(J16)设备
if (!(device.operatingSystem() == DeviceOperatingSystem.ios || device.receiveOnly())) {
continue;
}
// 设备是Pioneer设备
if (device.signalCharacteristic() == null) {
continue;
}
// payload数据不是连接方的数据
if (peer.payloadData() != null && (Arrays.equals(device.payloadData().value, peer.payloadData().value))) {
continue;
}
// 对于连接方来说,payload是新的payload
if (peer.payloadSharingData.contains(device.payloadData())) {
knownDevices.add(device);
} else {
unknownDevices.add(device);
}
}
// 最近看到的未知设备优先
final List<BLEDevice> devices = new ArrayList<>();
Collections.sort(unknownDevices, new Comparator<BLEDevice>() {
@Override
public int compare(BLEDevice d0, BLEDevice d1) {
return Long.compare(d1.lastUpdatedAt.getTime(), d0.lastUpdatedAt.getTime());
}
});
Collections.sort(knownDevices, new Comparator<BLEDevice>() {
@Override
public int compare(BLEDevice d0, BLEDevice d1) {
return Long.compare(d1.lastUpdatedAt.getTime(), d0.lastUpdatedAt.getTime());
}
});
devices.addAll(unknownDevices);
devices.addAll(knownDevices);
if (devices.size() == 0) {
return new PayloadSharingData(new RSSI(127), new Data(new byte[0]));
}
// 限制共享量,以避免通过BLE传输过多的数据
// 根据规范限制为512个字节,响应为510个字节,iOS需要响应
final Set<PayloadData> sharedPayloads = new HashSet<>(devices.size());
final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
for (BLEDevice device : devices) {
final PayloadData payloadData = device.payloadData();
if (payloadData == null) {
continue;
}
// 消除重复(当同一设备更改地址但旧版本尚未过期时,会发生这种情况)
if (sharedPayloads.contains(payloadData)) {
continue;
}
// 通过BLE传输限制限制有效负载共享
if (payloadData.value.length + byteArrayOutputStream.toByteArray().length > 510) {
break;
}
try {
byteArrayOutputStream.write(payloadData.value);
peer.payloadSharingData.add(payloadData);
sharedPayloads.add(payloadData);
} catch (Throwable e) {
}
}
final Data data = new Data(byteArrayOutputStream.toByteArray());
return new PayloadSharingData(rssi, data);
}
}
================================================
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/SpecificReceiver.java
================================================
package com.ABC.pioneer.sensor.ble;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGatt;
import android.bluetooth.BluetoothGattCallback;
import android.bluetooth.BluetoothGattCharacteristic;
import android.bluetooth.BluetoothGattService;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.le.BluetoothLeScanner;
import android.bluetooth.le.ScanCallback;
import android.bluetooth.le.ScanFilter;
import android.bluetooth.le.ScanRecord;
import android.bluetooth.le.ScanResult;
import android.bluetooth.le.ScanSettings;
import android.content.Context;
import android.os.Build;
import android.os.ParcelUuid;
import com.ABC.pioneer.sensor.PayloadSupplier;
import com.ABC.pioneer.sensor.SensorDelegate;
import com.ABC.pioneer.sensor.analysis.Sample;
import com.ABC.pioneer.sensor.ble.filter.BLEDeviceFilter;
import com.ABC.pioneer.sensor.datatype.BluetoothState;
import com.ABC.pioneer.sensor.datatype.Callback;
import com.ABC.pioneer.sensor.datatype.Data;
import com.ABC.pioneer.sensor.datatype.ImmediateSendData;
import com.ABC.pioneer.sensor.datatype.PayloadData;
import com.ABC.pioneer.sensor.datatype.PayloadSharingData;
import com.ABC.pioneer.sensor.datatype.RSSI;
import com.ABC.pioneer.sensor.datatype.SignalCharacteristicData;
import com.ABC.pioneer.sensor.datatype.SignalCharacteristicDataType;
import com.ABC.pioneer.sensor.datatype.TargetIdentifier;
import com.ABC.pioneer.sensor.datatype.TimeInterval;
import com.ABC.pioneer.sensor.payload.Crypto.SpecificUsePayloadSupplier;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Queue;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.UUID;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
public class SpecificReceiver extends BluetoothGattCallback implements Receiver {
// 扫描 开/关/过程 持续时间
private final static long scanOnDurationMillis = TimeInterval.seconds(4).millis();
private final static long scanRestDurationMillis = TimeInterval.seconds(1).millis();
private final static long scanProcessDurationMillis = TimeInterval.seconds(60).millis();
private final static long scanOffDurationMillis = TimeInterval.seconds(2).millis();
private final static long timeToConnectDeviceLimitMillis = TimeInterval.seconds(12).millis();
private final static Sample timeToConnectDevice = new Sample();
private final static Sample timeToProcessDevice = new Sample();
private final static int defaultMTU = 20;
private final Context context;
private final BluetoothStateManager bluetoothStateManager;
private final Database database;
private final Transmitter transmitter;
private final PayloadSupplier payloadSupplier;
private final BLEDeviceFilter deviceFilter;
private final ExecutorService operationQueue = Executors.newSingleThreadExecutor();
private final Queue<ScanResult> scanResults = new ConcurrentLinkedQueue<>();
private final AtomicBoolean receiverEnabled = new AtomicBoolean(false);
private enum NextTask {
nothing, readPayload, writePayload, writeRSSI, writePayloadSharing, immediateSend,
readModel, readDeviceName
}
private final ScanCallback scanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult scanResult) {
scanResults.add(scanResult);
// 在数据库中创建或更新设备
final BLEDevice device = database.device(scanResult);
device.registerDiscovery();
// 从扫描结果中读取RSSI
device.rssi(new RSSI(scanResult.getRssi()));
}
@Override
public void onBatchScanResults(List<ScanResult> results) {
for (ScanResult scanResult : results) {
onScanResult(0, scanResult);
}
}
@Override
public void onScanFailed(int errorCode) {
super.onScanFailed(errorCode);
}
};
/**
* 启用蓝牙后,Receiver会自动启动。
*/
public SpecificReceiver(Context context, BluetoothStateManager bluetoothStateManager, Timer timer, Database database, Transmitter transmitter, PayloadSupplier payloadSupplier) {
this.context = context;
this.bluetoothStateManager = bluetoothStateManager;
this.database = database;
this.transmitter = transmitter;
this.payloadSupplier = payloadSupplier;
timer.add(new ScanLoopTask());
if (Configurations.deviceFilterTrainingEnabled) {
Configurations.deviceIntrospectionEnabled = true;
Configurations.payloadDataUpdateTimeInterval = TimeInterval.minute;
this.deviceFilter = new BLEDeviceFilter(context, "filter.csv");
} else {
this.deviceFilter = new BLEDeviceFilter();
}
}
// BLEReceiver
@Override
public void add(SensorDelegate delegate) {
delegates.add(delegate);
}
@Override
public void start() {
if (receiverEnabled.compareAndSet(false, true)) {
} else {
}
}
@Override
public void stop() {
if (receiverEnabled.compareAndSet(true, false)) {
} else {
}
}
@Override
public boolean immediateSend(Data data, TargetIdentifier targetIdentifier) {
BLEDevice device = database.device(targetIdentifier);
if (null == device) {
return false;
}
final Data dataToSend = SignalCharacteristicData.encodeImmediateSend(new ImmediateSendData(data));
// 立即发送过程
// 1. 设置设备的立即发送数据
// 2. 启动与设备的连接
// 3. onConnectionStateChange()将触发服务和特征发现
// 4. signalCharacteristic发现将触发nextTask()
// 5. 如果已为设备设置了立即发送数据,则nextTask()将为.immediateSend
// 6. 将调用writeSignalCharacteristic()执行立即发送到signalCharacteristic
// 7. 写入信号数据后将触发onCharacteristicWrite()
// 8. 写入完成后,设备的立即发送数据将设置为null
// 9. 连接立即关闭
device.immediateSendData(dataToSend);
return taskConnectDevice(device);
}
@Override
public boolean immediateSendAll(Data data) {
// 编码数据
final Data dataToSend = SignalCharacteristicData.encodeImmediateSend(new ImmediateSendData(data));
// 按看到时间的降序排列(最新的优先)
// 选择Targets
SortedSet<BLEDevice> targets = new TreeSet<>(new DeviceUpdatedComparator());
// 在最后一分钟获取看到的目标(通过广告获取RSSI)
for (BLEDevice device : database.devices()) {
if (!device.ignore() && device.signalCharacteristic() != null && device.timeIntervalSinceLastUpdate().value < 60) {
targets.add(device);
}
}
// 发送信息
// 连接并立即发送给每个设备
// NOTE: 这个单独的循环还没有排序交互。 一旦工作,重构就可以了。
for (BLEDevice target : targets) {
target.immediateSendData(dataToSend);
}
// 现在强制执行乱序连接(并因此立即发送作为下一个操作)
for (BLEDevice target : targets) {
taskConnectDevice(target);
}
return true;
}
// 设定startScan-wait-stopScan-processScanResults-wait-repeat的扫描循环
private enum ScanLoopState {
scanStarting, scanStarted, scanStopping, scanStopped, processing, processed
}
private class ScanLoopTask implements TimerDelegate {
private ScanLoopState scanLoopState = ScanLoopState.processed;
private long lastStateChangeAt = System.currentTimeMillis();
private void state(final long now, ScanLoopState state) {
final long elapsed = now - lastStateChangeAt;
this.scanLoopState = state;
lastStateChangeAt = now;
}
private long timeSincelastStateChange(final long now) {
return now - lastStateChangeAt;
}
// 记录时间
@Override
public void bleTimer(final long now) {
switch (scanLoopState) {
case processed: {
if (receiverEnabled.get() && bluetoothStateManager.state() == BluetoothState.poweredOn) {
final long period = timeSincelastStateChange(now);
if (period >= scanOffDurationMillis) {
final BluetoothLeScanner bluetoothLeScanner = bluetoothLeScanner();
if (bluetoothLeScanner == null) {
return;
}
state(now, ScanLoopState.scanStarting);
startScan(bluetoothLeScanner, new Callback<Boolean>() {
@Override
public void accept(Boolean value) {
state(now, value ? ScanLoopState.scanStarted : ScanLoopState.scanStopped);
}
});
}
}
break;
}
case scanStarted: {
final long period = timeSincelastStateChange(now);
if (period >= scanOnDurationMillis) {
final BluetoothLeScanner bluetoothLeScanner = bluetoothLeScanner();
if (bluetoothLeScanner == null) {
return;
}
state(now, ScanLoopState.scanStopping);
stopScan(bluetoothLeScanner, new Callback<Boolean>() {
@Override
public void accept(Boolean value) {
state(now, ScanLoopState.scanStopped);
}
});
}
break;
}
case scanStopped: {
if (bluetoothStateManager.state() == BluetoothState.poweredOn) {
final long period = timeSincelastStateChange(now);
if (period >= scanRestDurationMillis) {
state(now, ScanLoopState.processing);
processScanResults(new Callback<Boolean>() {
@Override
public void accept(Boolean value) {
state(now, ScanLoopState.processed);
if (!receiverEnabled.get()) {
}
}
});
}
}
break;
}
}
}
private BluetoothLeScanner bluetoothLeScanner() {
final BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null) {
return null;
}
final BluetoothLeScanner bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner();
if (bluetoothLeScanner == null) {
return null;
}
return bluetoothLeScanner;
}
}
/// 获取BLE扫描器并开始扫描
private void startScan(final BluetoothLeScanner bluetoothLeScanner, final Callback<Boolean> callback) {
operationQueue.execute(new Runnable() {
@Override
public void run() {
try {
scanForPeripherals(bluetoothLeScanner);
if (callback != null) {
callback.accept(true);
}
} catch (Throwable e) {
if (callback != null) {
callback.accept(false);
}
}
}
});
}
/// 扫描广告传感器服务的设备以及所有Apple设备,如下所示:
// iOS后台广告不包含服务UUID。 传感器可能会花一些时间与没有重复运行传感器代码的Apple设备进行通信,
// 但是没有可靠的方法对此进行过滤,因为仅由于暂时性问题而可能会缺少该服务。
// 这将在taskConnect中处理。
private void scanForPeripherals(final BluetoothLeScanner bluetoothLeScanner) {
final List<ScanFilter> filter = new ArrayList<>(4);
// 在iOS(后台)设备上扫描Pioneer协议服务
filter.add(new ScanFilter.Builder().setManufacturerData(
Configurations.manufacturerIdForApple, new byte[0], new byte[0]).build());
// 在Android或iOS(前台)设备上扫描Pioneer协议服务
filter.add(new ScanFilter.Builder().setServiceUuid(
new ParcelUuid(Configurations.serviceUUID),
new ParcelUuid(new UUID(0xFFFFFFFFFFFFFFFFL, 0)))
.build());
final ScanSettings settings = new ScanSe
gitextract_i2vhfrty/
├── Android_apk/
│ └── appAndroid.apk
├── Android_app/
│ ├── app/
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── proguard-rules.pro
│ │ └── src/
│ │ ├── androidTest/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── ABC/
│ │ │ └── pioneer/
│ │ │ └── app/
│ │ │ └── ExampleInstrumentedTest.java
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── assets/
│ │ │ │ ├── Pioneer.keystore
│ │ │ │ └── server.p12
│ │ │ ├── java/
│ │ │ │ └── com/
│ │ │ │ └── ABC/
│ │ │ │ └── pioneer/
│ │ │ │ └── app/
│ │ │ │ ├── AppDelegate.java
│ │ │ │ ├── LoginActivity.java
│ │ │ │ ├── MainActivity.java
│ │ │ │ ├── RegisterActivity.java
│ │ │ │ ├── SplashActivity.java
│ │ │ │ ├── Target.java
│ │ │ │ ├── TargetListAdapter.java
│ │ │ │ ├── TokenActivity.java
│ │ │ │ ├── fragment/
│ │ │ │ │ ├── FragmentActivity1.java
│ │ │ │ │ ├── FragmentActivity2.java
│ │ │ │ │ └── FragmentActivity3.java
│ │ │ │ └── ignoreBatteryOpt.java
│ │ │ └── res/
│ │ │ ├── drawable/
│ │ │ │ ├── border_input_box.xml
│ │ │ │ ├── button_background.xml
│ │ │ │ ├── ic_launcher_background.xml
│ │ │ │ └── token_background.xml
│ │ │ ├── drawable-v24/
│ │ │ │ └── ic_launcher_foreground.xml
│ │ │ ├── layout/
│ │ │ │ ├── activity_bluetooth.xml
│ │ │ │ ├── activity_bottom_bar.xml
│ │ │ │ ├── activity_login.xml
│ │ │ │ ├── activity_payload.xml
│ │ │ │ ├── activity_register.xml
│ │ │ │ ├── activity_splash.xml
│ │ │ │ ├── activity_token.xml
│ │ │ │ ├── activity_token_pre.xml
│ │ │ │ ├── activity_user.xml
│ │ │ │ ├── custom_notification.xml
│ │ │ │ └── listview_targets_row.xml
│ │ │ ├── mipmap-anydpi-v26/
│ │ │ │ ├── ic_launcher.xml
│ │ │ │ └── ic_launcher_round.xml
│ │ │ └── values/
│ │ │ ├── colors.xml
│ │ │ ├── ic_launcher_background.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── ABC/
│ │ └── pioneer/
│ │ └── app/
│ │ └── ExampleUnitTest.java
│ ├── build.gradle
│ ├── gradle/
│ │ └── wrapper/
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
│ ├── gradle.properties
│ ├── gradlew
│ ├── gradlew.bat
│ ├── local.properties
│ ├── pioneer/
│ │ ├── .gitignore
│ │ ├── BuildConfig.java
│ │ ├── app/
│ │ │ └── BuildConfig.java
│ │ ├── build.gradle
│ │ ├── consumer-rules.pro
│ │ ├── proguard-rules.pro
│ │ └── src/
│ │ ├── androidTest/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── ABC/
│ │ │ └── pioneer/
│ │ │ └── sensor/
│ │ │ └── ExampleInstrumentedTest.java
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── ABC/
│ │ │ └── pioneer/
│ │ │ └── sensor/
│ │ │ ├── DefaultSensorDelegate.java
│ │ │ ├── Device.java
│ │ │ ├── PayloadSupplier.java
│ │ │ ├── Sensor.java
│ │ │ ├── SensorArray.java
│ │ │ ├── SensorDelegate.java
│ │ │ ├── analysis/
│ │ │ │ └── Sample.java
│ │ │ ├── ble/
│ │ │ │ ├── BLEDatabaseDelegate.java
│ │ │ │ ├── BLEDevice.java
│ │ │ │ ├── BLESensor.java
│ │ │ │ ├── BluetoothStateManager.java
│ │ │ │ ├── BluetoothStateManagerDelegate.java
│ │ │ │ ├── Configurations.java
│ │ │ │ ├── Database.java
│ │ │ │ ├── DeviceAttribute.java
│ │ │ │ ├── DeviceDelegate.java
│ │ │ │ ├── DeviceOperatingSystem.java
│ │ │ │ ├── DeviceState.java
│ │ │ │ ├── DeviceUpdatedComparator.java
│ │ │ │ ├── Receiver.java
│ │ │ │ ├── SpecificBLESensor.java
│ │ │ │ ├── SpecificBluetoothStateManager.java
│ │ │ │ ├── SpecificDatabase.java
│ │ │ │ ├── SpecificReceiver.java
│ │ │ │ ├── SpecificTransmitter.java
│ │ │ │ ├── Timer.java
│ │ │ │ ├── TimerDelegate.java
│ │ │ │ ├── Transmitter.java
│ │ │ │ ├── TxPower.java
│ │ │ │ └── filter/
│ │ │ │ ├── BLEAppleManuSeg.java
│ │ │ │ ├── BLEDeviceFilter.java
│ │ │ │ ├── BLEManuData.java
│ │ │ │ ├── BLEParser.java
│ │ │ │ ├── BLEScanResponseData.java
│ │ │ │ ├── BLESeg.java
│ │ │ │ ├── BLESegType.java
│ │ │ │ └── BLEServiceData.java
│ │ │ ├── client/
│ │ │ │ └── controller/
│ │ │ │ └── PioneerClient.java
│ │ │ ├── data/
│ │ │ │ ├── BatteryLog.java
│ │ │ │ ├── CalibrationLog.java
│ │ │ │ ├── ConcretePayloadDataFormatter.java
│ │ │ │ ├── ContactLog.java
│ │ │ │ ├── DetectionLog.java
│ │ │ │ ├── EventTimeIntervalLog.java
│ │ │ │ ├── PayloadDataFormatter.java
│ │ │ │ ├── StatisticsLog.java
│ │ │ │ └── TextFile.java
│ │ │ ├── datatype/
│ │ │ │ ├── Base64.java
│ │ │ │ ├── BluetoothState.java
│ │ │ │ ├── Calibration.java
│ │ │ │ ├── CalibrationMeasurementUnit.java
│ │ │ │ ├── Callback.java
│ │ │ │ ├── Data.java
│ │ │ │ ├── Encounter.java
│ │ │ │ ├── Float16.java
│ │ │ │ ├── ImmediateSendData.java
│ │ │ │ ├── InertiaLocationReference.java
│ │ │ │ ├── Int16.java
│ │ │ │ ├── Int32.java
│ │ │ │ ├── Int64.java
│ │ │ │ ├── Int8.java
│ │ │ │ ├── LegacyPayload.java
│ │ │ │ ├── Location.java
│ │ │ │ ├── LocationReference.java
│ │ │ │ ├── PayloadData.java
│ │ │ │ ├── PayloadSharingData.java
│ │ │ │ ├── PayloadTimestamp.java
│ │ │ │ ├── PlacenameLocationReference.java
│ │ │ │ ├── Proximity.java
│ │ │ │ ├── ProximityMeasurementUnit.java
│ │ │ │ ├── PseudoDeviceAddress.java
│ │ │ │ ├── RSSI.java
│ │ │ │ ├── RandomSource.java
│ │ │ │ ├── SensorState.java
│ │ │ │ ├── SensorType.java
│ │ │ │ ├── SignalCharacteristicData.java
│ │ │ │ ├── SignalCharacteristicDataType.java
│ │ │ │ ├── TargetIdentifier.java
│ │ │ │ ├── TimeInterval.java
│ │ │ │ ├── Triple.java
│ │ │ │ ├── Tuple.java
│ │ │ │ ├── UInt16.java
│ │ │ │ ├── UInt32.java
│ │ │ │ ├── UInt64.java
│ │ │ │ └── UInt8.java
│ │ │ ├── motion/
│ │ │ │ ├── ConcreteInertiaSensor.java
│ │ │ │ └── InertiaSensor.java
│ │ │ ├── payload/
│ │ │ │ ├── Crypto/
│ │ │ │ │ ├── BasicFunc.java
│ │ │ │ │ ├── CipherParameters.java
│ │ │ │ │ ├── ContactIdentifier.java
│ │ │ │ │ ├── ContactKey.java
│ │ │ │ │ ├── ContactKeySeed.java
│ │ │ │ │ ├── Digest.java
│ │ │ │ │ ├── DigestRandomGenerator.java
│ │ │ │ │ ├── ExtendedDigest.java
│ │ │ │ │ ├── GeneralDigest.java
│ │ │ │ │ ├── GenerateKey.java
│ │ │ │ │ ├── HMACSHA256.java
│ │ │ │ │ ├── HMac.java
│ │ │ │ │ ├── KeyParameter.java
│ │ │ │ │ ├── Mac.java
│ │ │ │ │ ├── MatchingKey.java
│ │ │ │ │ ├── MatchingKeySeed.java
│ │ │ │ │ ├── Memoable.java
│ │ │ │ │ ├── PioneerHMac.java
│ │ │ │ │ ├── PioneerHash.java
│ │ │ │ │ ├── PioneerPRG.java
│ │ │ │ │ ├── RandomGenerator.java
│ │ │ │ │ ├── SM3Digest.java
│ │ │ │ │ ├── SecretKey.java
│ │ │ │ │ ├── SpecificUsePayloadSupplier.java
│ │ │ │ │ ├── UsePayloadSupplier.java
│ │ │ │ │ └── Util.java
│ │ │ │ ├── DefaultPayloadSupplier.java
│ │ │ │ ├── DigitalSignature.java
│ │ │ │ └── extended/
│ │ │ │ ├── ConcreteExtendedDataSectionV1.java
│ │ │ │ ├── ConcreteExtendedDataV1.java
│ │ │ │ └── ExtendedData.java
│ │ │ └── service/
│ │ │ ├── AlarmReceiver.java
│ │ │ ├── Connection.java
│ │ │ ├── CustomTimer.java
│ │ │ ├── ForegroundService.java
│ │ │ ├── MatchDelegate.java
│ │ │ ├── NotificationService.java
│ │ │ └── PioneerDb.java
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── ABC/
│ │ └── pioneer/
│ │ └── sensor/
│ │ └── ExampleUnitTest.java
│ └── settings.gradle
├── IOS_app/
│ └── Pioneer_ios/
│ └── Pioneer Framework/
│ ├── Certificate/
│ │ ├── client.p12
│ │ └── server.cer
│ ├── Pioneer/
│ │ ├── ContactLogData/
│ │ │ └── ContactLog.xcdatamodeld/
│ │ │ ├── .xccurrentversion
│ │ │ └── ContactLog.xcdatamodel/
│ │ │ └── contents
│ │ ├── Crypto/
│ │ │ ├── CipherParameters.swift
│ │ │ ├── Crypto.swift
│ │ │ ├── Digest.swift
│ │ │ ├── DigestRandomNumber.swift
│ │ │ ├── ExtendedDigest.swift
│ │ │ ├── GeneralDigest.swift
│ │ │ ├── HMAC.swift
│ │ │ ├── KeyParameter.swift
│ │ │ ├── MAC.swift
│ │ │ ├── Memoable.swift
│ │ │ ├── PioneerHMac.swift
│ │ │ ├── PioneerHash.swift
│ │ │ ├── RandomGenerator.swift
│ │ │ ├── SM3Digest.swift
│ │ │ └── Util.swift
│ │ ├── Info.plist
│ │ ├── Manager/
│ │ │ ├── Connection.swift
│ │ │ ├── GlobalConfiguration.swift
│ │ │ ├── KeyManager.swift
│ │ │ ├── ManagerDelegate.swift
│ │ │ ├── Register.swift
│ │ │ └── UploadManager.swift
│ │ ├── Pioneer.h
│ │ └── Sensor/
│ │ ├── BLE/
│ │ │ ├── BLEDatabase.swift
│ │ │ ├── BLEReceiver.swift
│ │ │ ├── BLESensor.swift
│ │ │ ├── BLETransmitter.swift
│ │ │ └── BLEUtilities.swift
│ │ ├── Data/
│ │ │ ├── BatteryLog.swift
│ │ │ └── SensorLogger.swift
│ │ ├── Device.swift
│ │ ├── Extensions/
│ │ │ ├── DataExtensions.swift
│ │ │ └── DateExtensions.swift
│ │ ├── Location/
│ │ │ └── LocationSensor.swift
│ │ ├── Payload/
│ │ │ ├── PayloadDataMatcher.swift
│ │ │ ├── PayloadDataSupplier.swift
│ │ │ └── SpecificImplement/
│ │ │ ├── SpecificPayloadDataMatcher.swift
│ │ │ └── SpecificPayloadDataSupplier.swift
│ │ ├── Sensor.swift
│ │ ├── SensorArray.swift
│ │ └── SensorDelegate.swift
│ ├── Pioneer.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ ├── xcshareddata/
│ │ │ │ └── IDEWorkspaceChecks.plist
│ │ │ └── xcuserdata/
│ │ │ └── Beh.xcuserdatad/
│ │ │ └── UserInterfaceState.xcuserstate
│ │ └── xcuserdata/
│ │ └── Beh.xcuserdatad/
│ │ └── xcschemes/
│ │ └── xcschememanagement.plist
│ └── PioneerTests/
│ ├── Info.plist
│ └── PioneerTests.swift
├── README.md
├── Server/
│ ├── bin/
│ │ ├── db.properties
│ │ └── lib/
│ │ └── mysql-connector-java-5.1.49-bin.jar
│ └── src/
│ ├── com/
│ │ ├── bean/
│ │ │ ├── User.java
│ │ │ └── UserMessage.java
│ │ ├── controller/
│ │ │ ├── PioneerClient.java
│ │ │ └── PioneerServer.java
│ │ ├── dao/
│ │ │ ├── RandomGenerator.java
│ │ │ ├── TaskThread.java
│ │ │ ├── UserDao.java
│ │ │ └── UserDao_Imp.java
│ │ └── jdbc/
│ │ └── JDBCUtils.java
│ ├── db.properties
│ └── lib/
│ └── mysql-connector-java-5.1.49-bin.jar
├── Server_jar/
│ ├── META-INF/
│ │ └── MANIFEST.MF
│ ├── db.properties
│ ├── mysql-connector-java-5.1.49-bin.jar
│ ├── org.hamcrest.core_1.3.0.v20180420-1519.jar
│ └── org.junit_4.13.0.v20200204-1500.jar
└── Test/
├── Contribution.md
└── README.md
SYMBOL INDEX (1026 symbols across 152 files)
FILE: Android_app/app/src/androidTest/java/com/ABC/pioneer/app/ExampleInstrumentedTest.java
class ExampleInstrumentedTest (line 18) | @RunWith(AndroidJUnit4.class)
method useAppContext (line 20) | @Test
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/AppDelegate.java
class AppDelegate (line 33) | public class AppDelegate extends Application implements SensorDelegate {
method identifier (line 42) | private int identifier() {
method getNotificationId (line 51) | public static int getNotificationId() {
method getNotificationChannelId (line 54) | public static String getNotificationChannelId(){
method getPackageManager (line 58) | @Override
method onCreate (line 63) | @Override
method getInstance (line 109) | public static AppDelegate getInstance(){
method onTerminate (line 113) | @Override
method getAppDelegate (line 120) | public static AppDelegate getAppDelegate() {
method sensor (line 125) | public Sensor sensor() {
method getForegroundNotification (line 129) | private Notification getForegroundNotification() {
method createNotificationChannel (line 145) | private void createNotificationChannel() {
method sensor (line 161) | @Override
method sensor (line 165) | @Override
method sensor (line 169) | @Override
method sensor (line 173) | @Override
method sensor (line 178) | @Override
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/LoginActivity.java
class LoginActivity (line 15) | public class LoginActivity extends AppCompatActivity {
method onCreate (line 24) | @Override
method checkAutoLogin (line 45) | private void checkAutoLogin() {
method initViews (line 58) | private void initViews() {
method setupLoginButton (line 67) | private void setupLoginButton() {
method setupRegisterButton (line 83) | private void setupRegisterButton() {
method isValidPhone (line 93) | private boolean isValidPhone(String phone) {
method handleLoginLogic (line 100) | private void handleLoginLogic(String phone) {
method jumpToMainActivity (line 123) | private void jumpToMainActivity(Context context) {
method showToast (line 131) | private void showToast(String message) {
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/MainActivity.java
class MainActivity (line 46) | public class MainActivity extends AppCompatActivity implements View.OnC...
method getInstance (line 75) | public static MainActivity getInstance(){
method onCreate (line 80) | @Override
method matchFound (line 104) | @Override
method requestPermissions (line 151) | private void requestPermissions() {
method onRequestPermissionsResult (line 172) | @Override
method showActivity (line 188) | private void showActivity(@NonNull String packageName) {
method showActivity (line 193) | private void showActivity(@NonNull String packageName, @NonNull String...
method getWarningNotification (line 200) | private Notification getWarningNotification() {
method setSelectStatus (line 219) | private void setSelectStatus(int index) {
method initView (line 251) | private void initView(){
method setMain (line 272) | private void setMain() {
method onClick (line 278) | @SuppressLint("NonConstantResourceId")
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/RegisterActivity.java
class RegisterActivity (line 22) | public class RegisterActivity extends AppCompatActivity {
method onCreate (line 28) | @Override
method initializeViews (line 37) | private void initializeViews() {
method setupRegisterButton (line 42) | private void setupRegisterButton() {
method handleRegistration (line 46) | private void handleRegistration() {
method isValidPhoneNumber (line 57) | private boolean isValidPhoneNumber(String phoneNumber) {
method performRegistration (line 61) | private void performRegistration(String phoneNumber) {
method processRegistrationResult (line 77) | private void processRegistrationResult() {
method handleSuccessfulRegistration (line 91) | private void handleSuccessfulRegistration() {
method handleSecretKeyConflict (line 98) | private void handleSecretKeyConflict() {
method showToast (line 111) | private void showToast(String message) {
type UiThreadCallback (line 118) | private interface UiThreadCallback {
method execute (line 119) | void execute();
method joinWithUiThread (line 122) | private static void joinWithUiThread(Thread thread, Activity activity,...
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/SplashActivity.java
class SplashActivity (line 9) | public class SplashActivity extends AppCompatActivity {
method onCreate (line 12) | @Override
class splashhandler (line 21) | class splashhandler implements Runnable{
method run (line 22) | public void run() {
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/Target.java
class Target (line 13) | public class Target {
method Target (line 24) | public Target(TargetIdentifier targetIdentifier, PayloadData payloadDa...
method targetIdentifier (line 31) | public TargetIdentifier targetIdentifier() {
method targetIdentifier (line 35) | public void targetIdentifier(TargetIdentifier targetIdentifier) {
method payloadData (line 40) | public PayloadData payloadData() {
method lastUpdatedAt (line 44) | public Date lastUpdatedAt() {
method proximity (line 48) | public Proximity proximity() {
method proximity (line 52) | public void proximity(Proximity proximity) {
method received (line 64) | public ImmediateSendData received() {
method received (line 68) | public void received(ImmediateSendData received) {
method didRead (line 75) | public Date didRead() {
method didReadTimeInterval (line 79) | public Sample didReadTimeInterval() { return didReadTimeInterval; }
method didRead (line 81) | public void didRead(Date date) {
method didMeasure (line 90) | public Date didMeasure() {
method didMeasureTimeInterval (line 94) | public Sample didMeasureTimeInterval() {
method didShare (line 98) | public Date didShare() {
method didShare (line 102) | public void didShare(Date date) {
method didShareTimeInterval (line 111) | public Sample didShareTimeInterval() {
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/TargetListAdapter.java
class TargetListAdapter (line 23) | public class TargetListAdapter extends ArrayAdapter<Target> {
method TargetListAdapter (line 26) | public TargetListAdapter(@NonNull Context context, List<Target> target...
method getView (line 30) | @NonNull
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/TokenActivity.java
class TokenActivity (line 25) | public class TokenActivity extends AppCompatActivity {
method onCreate (line 35) | @Override
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/fragment/FragmentActivity1.java
class FragmentActivity1 (line 44) | public class FragmentActivity1 extends Fragment implements AdapterView....
method onCreateView (line 61) | @Override
method initView (line 69) | private void initView(View view){
method onActivityCreated (line 78) | @Override
method onViewCreated (line 103) | @Override
method updateTargets (line 109) | private synchronized void updateTargets() {
method updateCounts (line 134) | private void updateCounts() {
method onResume (line 142) | @Override
method onPause (line 150) | @Override
method sensor (line 158) | @Override
method sensor (line 172) | @Override
method sensor (line 196) | @Override
method sensor (line 223) | @Override
method sensor (line 245) | @Override
method onItemClick (line 271) | @Override
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/fragment/FragmentActivity2.java
class FragmentActivity2 (line 21) | public class FragmentActivity2 extends Fragment {
method onCreateView (line 25) | @Override
method onActivityCreated (line 32) | @Override
method initView (line 46) | private void initView(View view){
method onViewCreated (line 50) | @Override
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/fragment/FragmentActivity3.java
class FragmentActivity3 (line 19) | public class FragmentActivity3 extends Fragment {
method onCreateView (line 21) | @Override
method onActivityCreated (line 28) | @Override
method onViewCreated (line 35) | @Override
FILE: Android_app/app/src/main/java/com/ABC/pioneer/app/ignoreBatteryOpt.java
class ignoreBatteryOpt (line 15) | public class ignoreBatteryOpt {
method ignoreBatteryOptimization (line 17) | static public void ignoreBatteryOptimization(Activity activity) {
FILE: Android_app/app/src/test/java/com/ABC/pioneer/app/ExampleUnitTest.java
class ExampleUnitTest (line 12) | public class ExampleUnitTest {
method addition_isCorrect (line 13) | @Test
FILE: Android_app/pioneer/BuildConfig.java
class BuildConfig (line 6) | public final class BuildConfig {
FILE: Android_app/pioneer/app/BuildConfig.java
class BuildConfig (line 6) | public final class BuildConfig {
FILE: Android_app/pioneer/src/androidTest/java/com/ABC/pioneer/sensor/ExampleInstrumentedTest.java
class ExampleInstrumentedTest (line 18) | @RunWith(AndroidJUnit4.class)
method useAppContext (line 20) | @Test
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/DefaultSensorDelegate.java
class DefaultSensorDelegate (line 14) | public abstract class DefaultSensorDelegate implements SensorDelegate {
method sensor (line 16) | @Override
method sensor (line 20) | @Override
method sensor (line 24) | @Override
method sensor (line 28) | @Override
method sensor (line 33) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/Device.java
class Device (line 7) | public class Device {
method Device (line 15) | public Device(TargetIdentifier identifier) {
method Device (line 21) | public Device(Device device, TargetIdentifier identifier) {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/PayloadSupplier.java
type PayloadSupplier (line 14) | public interface PayloadSupplier {
method legacyPayload (line 15) | LegacyPayload legacyPayload(PayloadTimestamp timestamp, Device device);
method payload (line 18) | PayloadData payload(PayloadTimestamp timestamp, Device device);
method payload (line 21) | List<PayloadData> payload(Data data);
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/Sensor.java
type Sensor (line 8) | public interface Sensor {
method add (line 10) | void add(SensorDelegate delegate);
method start (line 13) | void start();
method stop (line 16) | void stop();
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/SensorArray.java
class SensorArray (line 20) | public class SensorArray implements Sensor {
method SensorArray (line 29) | public SensorArray(final Context context, PayloadSupplier payloadSuppl...
method immediateSend (line 44) | public boolean immediateSend(Data data, TargetIdentifier targetIdentif...
method immediateSendAll (line 49) | public boolean immediateSendAll(Data data) {
method payloadData (line 53) | public final PayloadData payloadData() {
method add (line 57) | @Override
method start (line 64) | @Override
method stop (line 71) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/SensorDelegate.java
type SensorDelegate (line 17) | public interface SensorDelegate {
method sensor (line 19) | void sensor(SensorType sensor, TargetIdentifier didDetect);
method sensor (line 22) | void sensor(SensorType sensor, PayloadData didRead, TargetIdentifier f...
method sensor (line 25) | void sensor(SensorType sensor, ImmediateSendData didReceive, TargetIde...
method sensor (line 28) | void sensor(SensorType sensor, List<PayloadData> didShare, TargetIdent...
method sensor (line 31) | void sensor(SensorType sensor, Proximity didMeasure, TargetIdentifier ...
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/analysis/Sample.java
class Sample (line 4) | public class Sample {
method Sample (line 9) | public Sample() {
method Sample (line 12) | public Sample(final double x, final long f) {
method add (line 19) | public synchronized void add(final double x) {
method add (line 38) | public void add(final double x, final long f) {
method add (line 48) | public void add(final Sample distribution) {
method copyStatisticsFrom (line 65) | private void copyStatisticsFrom(Sample source) {
method combineStatistics (line 78) | private Sample combineStatistics(Sample other) {
method calculateCombinedMean (line 104) | private double calculateCombinedMean(Sample other, double combinedN) {
method calculateCombinedSecondMoment (line 111) | private double calculateCombinedSecondMoment(Sample other, double delt...
method calculateCombinedThirdMoment (line 118) | private double calculateCombinedThirdMoment(Sample other, double delta...
method calculateCombinedFourthMoment (line 128) | private double calculateCombinedFourthMoment(Sample other, double delt...
method updateCurrentStatistics (line 141) | private void updateCurrentStatistics(Sample combined) {
method count (line 151) | public long count() {
method mean (line 156) | public Double mean() {
method variance (line 171) | public Double variance() {
method standardDeviation (line 186) | public Double standardDeviation() {
method min (line 199) | public Double min() {
method max (line 212) | public Double max() {
method distance (line 227) | public Double distance(final Sample sample) {
method bhattacharyyaDistance (line 240) | private final static Double bhattacharyyaDistance(final Sample d1, fin...
method toString (line 273) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/BLEDatabaseDelegate.java
type BLEDatabaseDelegate (line 5) | public interface BLEDatabaseDelegate {
method bleDatabaseDidCreate (line 6) | void bleDatabaseDidCreate(BLEDevice device);
method bleDatabaseDidUpdate (line 8) | void bleDatabaseDidUpdate(BLEDevice device, DeviceAttribute attribute);
method bleDatabaseDidDelete (line 10) | void bleDatabaseDidDelete(BLEDevice device);
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/BLEDevice.java
class BLEDevice (line 23) | public class BLEDevice extends Device {
method timeIntervalSinceConnected (line 75) | public TimeInterval timeIntervalSinceConnected() {
method timeIntervalSinceLastUpdate (line 86) | public TimeInterval timeIntervalSinceLastUpdate() {
method description (line 93) | public String description() {
method BLEDevice (line 104) | public BLEDevice(TargetIdentifier identifier, DeviceDelegate delegate) {
method pseudoDeviceAddress (line 109) | public PseudoDeviceAddress pseudoDeviceAddress() {
method pseudoDeviceAddress (line 113) | public void pseudoDeviceAddress(PseudoDeviceAddress pseudoDeviceAddres...
method state (line 123) | public DeviceState state() {
method state (line 127) | public void state(DeviceState state) {
method operatingSystem (line 136) | public DeviceOperatingSystem operatingSystem() {
method operatingSystem (line 141) | public void operatingSystem(DeviceOperatingSystem operatingSystem) {
method ignore (line 166) | public boolean ignore() {
method peripheral (line 177) | public BluetoothDevice peripheral() {
method peripheral (line 181) | public void peripheral(BluetoothDevice peripheral) {
method immediateSendData (line 188) | public void immediateSendData(Data immediateSendData) {
method immediateSendData (line 192) | public Data immediateSendData() {
method rssi (line 196) | public RSSI rssi() {
method rssi (line 200) | public void rssi(RSSI rssi) {
method legacyPayloadCharacteristic (line 207) | public void legacyPayloadCharacteristic(BluetoothGattCharacteristic ch...
method legacyPayloadCharacteristic (line 211) | public BluetoothGattCharacteristic legacyPayloadCharacteristic() {
method txPower (line 215) | public TxPower txPower() {
method txPower (line 219) | public void txPower(TxPower txPower) {
method payloadData (line 225) | public PayloadData payloadData() {
method payloadData (line 229) | public void payloadData(PayloadData payloadData) {
method timeIntervalSinceLastPayloadDataUpdate (line 236) | public TimeInterval timeIntervalSinceLastPayloadDataUpdate() {
method calibration (line 245) | public Calibration calibration() {
method receiveOnly (line 252) | public boolean receiveOnly() {
method receiveOnly (line 256) | public void receiveOnly(boolean receiveOnly) {
method invalidateCharacteristics (line 261) | public void invalidateCharacteristics() {
method signalCharacteristic (line 269) | public BluetoothGattCharacteristic signalCharacteristic() {
method signalCharacteristic (line 273) | public void signalCharacteristic(BluetoothGattCharacteristic character...
method payloadCharacteristic (line 278) | public BluetoothGattCharacteristic payloadCharacteristic() {
method payloadCharacteristic (line 282) | public void payloadCharacteristic(BluetoothGattCharacteristic characte...
method supportsModelCharacteristic (line 287) | public boolean supportsModelCharacteristic() { return null != modelCha...
method modelCharacteristic (line 289) | public BluetoothGattCharacteristic modelCharacteristic() { return mode...
method modelCharacteristic (line 291) | public void modelCharacteristic(BluetoothGattCharacteristic modelChara...
method supportsDeviceNameCharacteristic (line 296) | public boolean supportsDeviceNameCharacteristic() { return null != dev...
method deviceNameCharacteristic (line 298) | public BluetoothGattCharacteristic deviceNameCharacteristic() { return...
method deviceNameCharacteristic (line 300) | public void deviceNameCharacteristic(BluetoothGattCharacteristic devic...
method deviceName (line 305) | public String deviceName() { return deviceName; }
method deviceName (line 307) | public void deviceName(String deviceName) {
method model (line 312) | public String model() { return model; }
method model (line 314) | public void model(String model) {
method registerDiscovery (line 319) | public void registerDiscovery() {
method registerWritePayload (line 324) | public void registerWritePayload() {
method timeIntervalSinceLastWritePayload (line 329) | public TimeInterval timeIntervalSinceLastWritePayload() {
method registerWriteRssi (line 336) | public void registerWriteRssi() {
method timeIntervalSinceLastWriteRssi (line 341) | public TimeInterval timeIntervalSinceLastWriteRssi() {
method registerWritePayloadSharing (line 348) | public void registerWritePayloadSharing() {
method timeIntervalSinceLastWritePayloadSharing (line 353) | public TimeInterval timeIntervalSinceLastWritePayloadSharing() {
method timeIntervalUntilIgnoreExpires (line 360) | public TimeInterval timeIntervalUntilIgnoreExpires() {
method protocolIsPioneer (line 371) | public boolean protocolIsPioneer() {
method scanRecord (line 375) | public void scanRecord(ScanRecord scanRecord) {
method scanRecord (line 379) | public ScanRecord scanRecord() {
method protocolIsLegacy (line 383) | public boolean protocolIsLegacy() {
method toString (line 386) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/BLESensor.java
type BLESensor (line 6) | public interface BLESensor extends Sensor {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/BluetoothStateManager.java
type BluetoothStateManager (line 10) | public interface BluetoothStateManager {
method state (line 13) | BluetoothState state();
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/BluetoothStateManagerDelegate.java
type BluetoothStateManagerDelegate (line 6) | public interface BluetoothStateManagerDelegate {
method bluetoothStateManager (line 7) | void bluetoothStateManager(BluetoothState didUpdateState);
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/Configurations.java
class Configurations (line 10) | public class Configurations {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/Database.java
type Database (line 14) | public interface Database {
method add (line 16) | void add(BLEDatabaseDelegate delegate);
method device (line 19) | BLEDevice device(ScanResult scanResult);
method device (line 22) | BLEDevice device(BluetoothDevice bluetoothDevice);
method device (line 25) | BLEDevice device(PayloadData payloadData);
method device (line 28) | BLEDevice device(TargetIdentifier targetIdentifier);
method devices (line 31) | List<BLEDevice> devices();
method delete (line 34) | void delete(BLEDevice device);
method payloadSharingData (line 37) | PayloadSharingData payloadSharingData(BLEDevice peer);
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/DeviceAttribute.java
type DeviceAttribute (line 4) | public enum DeviceAttribute {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/DeviceDelegate.java
type DeviceDelegate (line 4) | public interface DeviceDelegate {
method device (line 5) | void device(BLEDevice device, DeviceAttribute didUpdate);
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/DeviceOperatingSystem.java
type DeviceOperatingSystem (line 4) | public enum DeviceOperatingSystem {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/DeviceState.java
type DeviceState (line 5) | public enum DeviceState {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/DeviceUpdatedComparator.java
class DeviceUpdatedComparator (line 8) | public class DeviceUpdatedComparator implements Comparator<BLEDevice> {
method compare (line 9) | public int compare(BLEDevice a, BLEDevice b)
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/Receiver.java
type Receiver (line 14) | public interface Receiver extends Sensor {
method immediateSend (line 18) | boolean immediateSend(Data data, TargetIdentifier targetIdentifier);
method immediateSendAll (line 21) | boolean immediateSendAll(Data data);
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/SpecificBLESensor.java
class SpecificBLESensor (line 28) | public class SpecificBLESensor implements BLESensor, BLEDatabaseDelegate...
method SpecificBLESensor (line 36) | public SpecificBLESensor(Context context, PayloadSupplier payloadSuppl...
method add (line 46) | @Override
method start (line 53) | @Override
method stop (line 59) | @Override
method bleDatabaseDidUpdate (line 68) | @Override
method immediateSend (line 128) | public boolean immediateSend(Data data, TargetIdentifier targetIdentif...
method immediateSendAll (line 132) | public boolean immediateSendAll(Data data) {
method bleDatabaseDidCreate (line 136) | @Override
method bleDatabaseDidDelete (line 149) | @Override
method bluetoothStateManager (line 155) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/SpecificBluetoothStateManager.java
class SpecificBluetoothStateManager (line 15) | public class SpecificBluetoothStateManager implements BluetoothStateMana...
method onReceive (line 18) | @Override
method SpecificBluetoothStateManager (line 46) | public SpecificBluetoothStateManager(Context context) {
method state (line 54) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/SpecificDatabase.java
class SpecificDatabase (line 31) | public class SpecificDatabase implements Database, DeviceDelegate {
method pseudoDeviceAddress (line 37) | private PseudoDeviceAddress pseudoDeviceAddress(final ScanResult scanR...
method add (line 53) | @Override
method device (line 58) | @Override
method device (line 63) | @Override
method device (line 84) | @Override
method devices (line 126) | @Override
method device (line 131) | @Override
method delete (line 160) | @Override
method device (line 191) | @Override
method payloadSharingData (line 203) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/SpecificReceiver.java
class SpecificReceiver (line 53) | public class SpecificReceiver extends BluetoothGattCallback implements R...
type NextTask (line 73) | private enum NextTask {
method onScanResult (line 79) | @Override
method onBatchScanResults (line 89) | @Override
method onScanFailed (line 96) | @Override
method SpecificReceiver (line 105) | public SpecificReceiver(Context context, BluetoothStateManager bluetoo...
method add (line 124) | @Override
method start (line 129) | @Override
method stop (line 136) | @Override
method immediateSend (line 143) | @Override
method immediateSendAll (line 166) | @Override
type ScanLoopState (line 194) | private enum ScanLoopState {
class ScanLoopTask (line 198) | private class ScanLoopTask implements TimerDelegate {
method state (line 202) | private void state(final long now, ScanLoopState state) {
method timeSincelastStateChange (line 208) | private long timeSincelastStateChange(final long now) {
method bleTimer (line 212) | @Override
method bluetoothLeScanner (line 272) | private BluetoothLeScanner bluetoothLeScanner() {
method startScan (line 289) | private void startScan(final BluetoothLeScanner bluetoothLeScanner, fi...
method scanForPeripherals (line 312) | private void scanForPeripherals(final BluetoothLeScanner bluetoothLeSc...
method processScanResults (line 329) | private void processScanResults(final Callback<Boolean> callback) {
method stopScan (line 344) | private void stopScan(final BluetoothLeScanner bluetoothLeScanner, fin...
method processScanResults (line 367) | private void processScanResults() {
method didDiscover (line 385) | private List<BLEDevice> didDiscover() {
method taskRemoveExpiredDevices (line 447) | private void taskRemoveExpiredDevices() {
method taskCorrectConnectionStatus (line 460) | private void taskCorrectConnectionStatus() {
method isAppleDevice (line 470) | private static boolean isAppleDevice(final ScanResult scanResult) {
method hasSensorService (line 481) | private static boolean hasSensorService(final ScanResult scanResult) {
method taskConnect (line 501) | private void taskConnect(final List<BLEDevice> discovered) {
method taskConnectDevice (line 526) | private boolean taskConnectDevice(final BLEDevice device) {
method onServicesDiscovered (line 608) | @Override
method onConnectionStateChange (line 661) | @Override
method serviceCharacteristic (line 679) | private BluetoothGattCharacteristic serviceCharacteristic(BluetoothGat...
method nextTaskForDevice (line 698) | private NextTask nextTaskForDevice(final BLEDevice device) {
method nextTask (line 780) | private void nextTask(BluetoothGatt gatt) {
method writeSignalCharacteristic (line 880) | private void writeSignalCharacteristic(BluetoothGatt gatt, NextTask ta...
type WriteAndroidSignalCharacteristicResult (line 914) | private enum WriteAndroidSignalCharacteristicResult {
method writeAndroidSignalCharacteristic (line 918) | private WriteAndroidSignalCharacteristicResult writeAndroidSignalChara...
method fragmentDataByMtu (line 938) | private Queue<byte[]> fragmentDataByMtu(byte[] data) {
method onMtuChanged (line 948) | @Override
method onCharacteristicRead (line 958) | @Override
method onCharacteristicWrite (line 1000) | @Override
method bleStatus (line 1053) | private static String bleStatus(final int status) {
method bleState (line 1061) | private static String bleState(final int state) {
method onScanFailedErrorCodeToString (line 1072) | private static String onScanFailedErrorCodeToString(final int errorCod...
method ConvertToLong (line 1086) | private static long ConvertToLong(String date, String format) {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/SpecificTransmitter.java
class SpecificTransmitter (line 57) | public class SpecificTransmitter implements Transmitter, BluetoothStateM...
method SpecificTransmitter (line 73) | public SpecificTransmitter(Context context, BluetoothStateManager blue...
method add (line 83) | @Override
method start (line 88) | @Override
method stop (line 95) | @Override
type AdvertLoopState (line 104) | private enum AdvertLoopState {
method bluetoothLeAdvertiser (line 109) | private BluetoothLeAdvertiser bluetoothLeAdvertiser() {
class AdvertLoopTask (line 127) | private class AdvertLoopTask implements TimerDelegate {
method state (line 133) | private void state(final long now, AdvertLoopState state) {
method timeSincelastStateChange (line 139) | private long timeSincelastStateChange(final long now) {
method bleTimer (line 143) | @Override
method stopAdvert (line 205) | private void stopAdvert(final BluetoothLeAdvertiser bluetoothLeAdverti...
method startAdvert (line 234) | private void startAdvert(final BluetoothLeAdvertiser bluetoothLeAdvert...
method payloadData (line 300) | @Override
method isSupported (line 305) | @Override
method bluetoothStateManager (line 310) | @Override
method startAdvertising (line 314) | private void startAdvertising(final BluetoothLeAdvertiser bluetoothLeA...
method startGattServer (line 332) | private static BluetoothGattServer startGattServer(final Context conte...
method setGattService (line 487) | private static void setGattService(final Context context, final Blueto...
method onConnectionStateChangeStatusToString (line 534) | private static String onConnectionStateChangeStatusToString(final int ...
method onStartFailureErrorCodeToString (line 549) | private static String onStartFailureErrorCodeToString(final int errorC...
method add (line 565) | private static PayloadData add(PayloadData init_payloadData){
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/Timer.java
class Timer (line 16) | public class Timer {
method run (line 23) | @Override
method Timer (line 34) | public Timer(Context context) {
method finalize (line 65) | @Override
method add (line 71) | public void add(TimerDelegate delegate) {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/TimerDelegate.java
type TimerDelegate (line 5) | public interface TimerDelegate {
method bleTimer (line 7) | void bleTimer(long currentTimeMillis);
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/Transmitter.java
type Transmitter (line 14) | public interface Transmitter extends Sensor {
method payloadData (line 22) | PayloadData payloadData();
method isSupported (line 27) | boolean isSupported();
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/TxPower.java
class TxPower (line 4) | public class TxPower {
method TxPower (line 7) | public TxPower(int value) {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/filter/BLEAppleManuSeg.java
class BLEAppleManuSeg (line 6) | public class BLEAppleManuSeg {
method BLEAppleManuSeg (line 13) | public BLEAppleManuSeg(int type, int reportedLength, byte[] dataBigEnd...
method toString (line 20) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/filter/BLEDeviceFilter.java
class BLEDeviceFilter (line 23) | public class BLEDeviceFilter {
class ShouldIgnore (line 30) | private final static class ShouldIgnore {
class FilterPattern (line 36) | public final static class FilterPattern {
method FilterPattern (line 39) | public FilterPattern(final String regularExpression, final Pattern p...
class MatchingPattern (line 46) | public final static class MatchingPattern {
method MatchingPattern (line 49) | public MatchingPattern(FilterPattern filterPattern, String message) {
method BLEDeviceFilter (line 56) | public BLEDeviceFilter() {
method BLEDeviceFilter (line 62) | public BLEDeviceFilter(final Context context, final String file) {
method BLEDeviceFilter (line 68) | public BLEDeviceFilter(final Context context, final String file, final...
method match (line 88) | protected static FilterPattern match(final List<FilterPattern> filterP...
method compilePatterns (line 105) | protected static List<FilterPattern> compilePatterns(final String[] re...
method extractMessages (line 121) | protected final static List<Data> extractMessages(final byte[] rawScan...
method extractFeatures (line 153) | private List<Data> extractFeatures(final ScanRecord scanRecord) {
method train (line 167) | public synchronized void train(final BLEDevice device, final boolean i...
method match (line 230) | protected final static MatchingPattern match(final List<FilterPattern>...
method match (line 262) | public MatchingPattern match(final BLEDevice device) {
method ignoreBasedOnStatistics (line 288) | private boolean ignoreBasedOnStatistics(final BLEDevice device) {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/filter/BLEManuData.java
class BLEManuData (line 7) | public class BLEManuData {
method BLEManuData (line 12) | public BLEManuData(final int manufacturer, final byte[] dataBigEndian,...
method toString (line 18) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/filter/BLEParser.java
class BLEParser (line 10) | public class BLEParser {
method parseScanResponse (line 11) | public static BLEScanResponseData parseScanResponse(byte[] raw, int of...
method extractSegments (line 16) | public static List<BLESeg> extractSegments(byte[] raw, int offset) {
method hex (line 49) | public static String hex(byte[] bytes) {
method binaryString (line 57) | public static String binaryString(byte[] bytes) {
method subDataBigEndian (line 66) | public static byte[] subDataBigEndian(byte[] raw, int offset, int leng...
method subDataLittleEndian (line 84) | public static byte[] subDataLittleEndian(byte[] raw, int offset, int l...
method extractTxPower (line 103) | public static Integer extractTxPower(List<BLESeg> segments) {
method extractManufacturerData (line 113) | public static List<BLEManuData> extractManufacturerData(List<BLESeg> s...
method extractAppleManufacturerSegments (line 131) | public static List <BLEAppleManuSeg> extractAppleManufacturerSegments(...
method extractServiceUUID16Data (line 162) | public static List<BLEServiceData> extractServiceUUID16Data(List<BLESe...
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/filter/BLEScanResponseData.java
class BLEScanResponseData (line 6) | public class BLEScanResponseData {
method BLEScanResponseData (line 10) | public BLEScanResponseData(int dataLength, List<BLESeg> segments) {
method toString (line 15) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/filter/BLESeg.java
class BLESeg (line 6) | public class BLESeg {
method BLESeg (line 13) | public BLESeg(BLESegType type, int dataLength, byte[] data, Data raw) {
method toString (line 20) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/filter/BLESegType.java
type BLESegType (line 8) | public enum BLESegType {
method BLESegType (line 43) | private BLESegType(String label, int code) {
method typeFor (line 48) | public static BLESegType typeFor(int code) {
method typeFor (line 56) | public static BLESegType typeFor(String commonName) {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/filter/BLEServiceData.java
class BLEServiceData (line 6) | public class BLEServiceData {
method BLEServiceData (line 12) | public BLEServiceData(final byte[] service, final byte[] dataBigEndian...
method toString (line 18) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/client/controller/PioneerClient.java
class PioneerClient (line 16) | public class PioneerClient {
method PioneerClient (line 23) | public PioneerClient(){
method PioneerClient (line 26) | public PioneerClient(String host, int port, Context context){
method createSSLContext (line 33) | public SSLContext createSSLContext(){
method run (line 64) | public SSLSocket run() throws IOException{
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/data/BatteryLog.java
class BatteryLog (line 12) | public class BatteryLog {
method BatteryLog (line 19) | public BatteryLog(final Context context, final String filename) {
method update (line 43) | private void update() {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/data/CalibrationLog.java
class CalibrationLog (line 12) | public class CalibrationLog extends DefaultSensorDelegate {
method CalibrationLog (line 16) | public CalibrationLog(final Context context, final String filename) {
method timestamp (line 23) | private static String timestamp() {
method csv (line 27) | private static String csv(String value) {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/data/ConcretePayloadDataFormatter.java
class ConcretePayloadDataFormatter (line 6) | public class ConcretePayloadDataFormatter implements PayloadDataFormatter {
method shortFormat (line 7) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/data/ContactLog.java
class ContactLog (line 16) | public class ContactLog extends DefaultSensorDelegate {
method ContactLog (line 21) | public ContactLog(final Context context, final String filename, Payloa...
method ContactLog (line 29) | public ContactLog(final Context context, final String filename) {
method timestamp (line 33) | private String timestamp() {
method csv (line 37) | private String csv(String value) {
method sensor (line 43) | @Override
method sensor (line 48) | @Override
method sensor (line 53) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/data/DetectionLog.java
class DetectionLog (line 18) | public class DetectionLog extends DefaultSensorDelegate {
method DetectionLog (line 26) | public DetectionLog(final Context context, final String filename, fina...
method DetectionLog (line 33) | public DetectionLog(final Context context, final String filename, fina...
method csv (line 37) | private String csv(String value) {
method write (line 41) | private void write() {
method sensor (line 69) | @Override
method sensor (line 76) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/data/EventTimeIntervalLog.java
class EventTimeIntervalLog (line 21) | public class EventTimeIntervalLog extends DefaultSensorDelegate {
type EventType (line 28) | public enum EventType {
method EventTimeIntervalLog (line 32) | public EventTimeIntervalLog(final Context context, final String filena...
method csv (line 38) | private String csv(String value) {
method add (line 42) | private void add(String payload) {
method sensor (line 60) | @Override
method sensor (line 69) | @Override
method sensor (line 80) | @Override
method sensor (line 91) | @Override
method write (line 110) | private void write() {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/data/PayloadDataFormatter.java
type PayloadDataFormatter (line 7) | public interface PayloadDataFormatter {
method shortFormat (line 8) | String shortFormat(PayloadData payloadData);
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/data/StatisticsLog.java
class StatisticsLog (line 22) | public class StatisticsLog extends DefaultSensorDelegate {
method StatisticsLog (line 29) | public StatisticsLog(final Context context, final String filename, fin...
method csv (line 34) | private String csv(String value) {
method add (line 38) | private void add(TargetIdentifier identifier) {
method add (line 46) | private void add(String payload) {
method write (line 60) | private void write() {
method sensor (line 97) | @Override
method sensor (line 103) | @Override
method sensor (line 108) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/data/TextFile.java
class TextFile (line 17) | public class TextFile {
method TextFile (line 20) | public TextFile(final Context context, final String filename) {
method contentsOf (line 33) | public synchronized String contentsOf() {
method getRootFolder (line 54) | private static File getRootFolder(final Context context) {
method empty (line 65) | public synchronized boolean empty() {
method write (line 70) | public synchronized void write(String line) {
method overwrite (line 81) | public synchronized void overwrite(String content) {
method csv (line 92) | public static String csv(String value) {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Base64.java
class Base64 (line 7) | public class Base64 {
method encode (line 25) | public static String encode(byte[] data) {
method decode (line 52) | public static byte[] decode(String data) {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/BluetoothState.java
type BluetoothState (line 5) | public enum BluetoothState {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Calibration.java
class Calibration (line 9) | public class Calibration {
method Calibration (line 15) | public Calibration(CalibrationMeasurementUnit unit, Double value) {
method description (line 21) | public String description() {
method equals (line 25) | @Override
method hashCode (line 34) | @Override
method toString (line 39) | @NonNull
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/CalibrationMeasurementUnit.java
type CalibrationMeasurementUnit (line 5) | public enum CalibrationMeasurementUnit {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Callback.java
type Callback (line 5) | public interface Callback<T> {
method accept (line 6) | void accept(T value);
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Data.java
class Data (line 9) | public class Data {
method Data (line 13) | public Data() {
method Data (line 17) | public Data(byte[] value) {
method Data (line 21) | public Data(final Data data) {
method Data (line 27) | public Data(byte repeating, int count) {
method Data (line 34) | public Data(String base64EncodedString) {
method base64EncodedString (line 38) | public String base64EncodedString() {
method hexEncodedString (line 42) | public String hexEncodedString() {
method fromHexEncodedString (line 55) | public final static Data fromHexEncodedString(String hexEncodedString) {
method description (line 65) | public String description() {
method subdata (line 70) | public Data subdata(int offset) {
method subdata (line 82) | public Data subdata(int offset, int length) {
method append (line 93) | public void append(Data data) {
method append (line 97) | private void append(byte[] data) {
method equals (line 104) | @Override
method hashCode (line 112) | @Override
method toString (line 117) | @Override
method append (line 124) | public void append(final UInt8 value) {
method uint8 (line 130) | public UInt8 uint8(final int index) {
method append (line 137) | public void append(final Int8 value) {
method int8 (line 143) | public Int8 int8(final int index) {
method append (line 150) | public void append(final UInt16 value) {
method uint16 (line 157) | public UInt16 uint16(final int index) {
method append (line 168) | public void append(final Int16 value) {
method int16 (line 175) | public Int16 int16(final int index) {
method append (line 185) | public void append(final UInt32 value) {
method uint32 (line 194) | public UInt32 uint32(final int index) {
method append (line 206) | public void append(final Int32 value) {
method int32 (line 215) | public Int32 int32(final int index) {
method append (line 227) | public void append(final UInt64 value) {
method uint64 (line 240) | public UInt64 uint64(final int index) {
method append (line 256) | public void append(final Int64 value) {
method int64 (line 269) | public Int64 int64(final int index) {
method append (line 285) | public void append(Float16 value) {
method float16 (line 289) | public Float16 float16(int index) {
type StringLengthEncodingOption (line 301) | public enum StringLengthEncodingOption {
method append (line 306) | public boolean append(final String value) {
method append (line 310) | public boolean append(final String value, final StringLengthEncodingOp...
class DecodedString (line 354) | public final static class DecodedString {
method DecodedString (line 359) | public DecodedString(final String value, final int start, final int ...
method string (line 366) | public DecodedString string(final int index) {
method string (line 370) | public DecodedString string(final int index, final StringLengthEncodin...
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Encounter.java
class Encounter (line 8) | public class Encounter {
method Encounter (line 14) | public Encounter(Proximity didMeasure, PayloadData withPayload, Date t...
method Encounter (line 20) | public Encounter(Proximity didMeasure, PayloadData withPayload) {
method Encounter (line 24) | public Encounter(String row) {
method csvString (line 57) | public String csvString() {
method isValid (line 67) | public boolean isValid() {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Float16.java
class Float16 (line 8) | public class Float16 {
method Float16 (line 12) | public Float16(float value) {
method Float16 (line 20) | public Float16(Data bigEndian) {
method float16 (line 29) | private static int float16(float values) {
method valueOf (line 52) | private static float valueOf(int hbits) {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/ImmediateSendData.java
class ImmediateSendData (line 5) | public class ImmediateSendData {
method ImmediateSendData (line 8) | public ImmediateSendData(final Data data) {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/InertiaLocationReference.java
class InertiaLocationReference (line 5) | public class InertiaLocationReference implements LocationReference {
method InertiaLocationReference (line 8) | public InertiaLocationReference(Double x, Double y, Double z) {
method description (line 15) | public String description() {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Int16.java
class Int16 (line 7) | public class Int16 {
method Int16 (line 13) | public Int16(int value) {
method equals (line 17) | @Override
method hashCode (line 25) | @Override
method toString (line 30) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Int32.java
class Int32 (line 7) | public class Int32 {
method Int32 (line 13) | public Int32(long value) {
method equals (line 17) | @Override
method hashCode (line 25) | @Override
method toString (line 30) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Int64.java
class Int64 (line 7) | public class Int64 {
method Int64 (line 13) | public Int64(long value) {
method equals (line 17) | @Override
method hashCode (line 25) | @Override
method toString (line 30) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Int8.java
class Int8 (line 7) | public class Int8 {
method Int8 (line 13) | public Int8(int value) {
method equals (line 17) | @Override
method hashCode (line 25) | @Override
method toString (line 30) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/LegacyPayload.java
class LegacyPayload (line 9) | public class LegacyPayload extends PayloadData {
type ProtocolName (line 11) | public enum ProtocolName {
method LegacyPayload (line 15) | public LegacyPayload(final UUID service, final byte[] value) {
method protocolName (line 20) | public ProtocolName protocolName() {
method shortName (line 30) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Location.java
class Location (line 7) | public class Location {
method Location (line 13) | public Location(LocationReference value, Date start, Date end) {
method description (line 20) | public String description() {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/LocationReference.java
type LocationReference (line 6) | public interface LocationReference {
method description (line 7) | String description();
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/PayloadData.java
class PayloadData (line 5) | public class PayloadData extends Data {
method PayloadData (line 7) | public PayloadData(byte[] value) {
method PayloadData (line 11) | public PayloadData(String base64EncodedString) {
method PayloadData (line 15) | public PayloadData(byte repeating, int count) {
method PayloadData (line 19) | public PayloadData() {
method shortName (line 23) | public String shortName() {
method toString (line 36) | public String toString() {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/PayloadSharingData.java
class PayloadSharingData (line 4) | public class PayloadSharingData {
method PayloadSharingData (line 8) | public PayloadSharingData(final RSSI rssi, final Data data) {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/PayloadTimestamp.java
class PayloadTimestamp (line 7) | public class PayloadTimestamp {
method PayloadTimestamp (line 10) | public PayloadTimestamp(Date value) {
method PayloadTimestamp (line 14) | public PayloadTimestamp() {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/PlacenameLocationReference.java
class PlacenameLocationReference (line 5) | public class PlacenameLocationReference implements LocationReference {
method PlacenameLocationReference (line 8) | public PlacenameLocationReference(String name) {
method description (line 12) | public String description() {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Proximity.java
class Proximity (line 9) | public class Proximity {
method Proximity (line 17) | public Proximity(ProximityMeasurementUnit unit, Double value) {
method Proximity (line 21) | public Proximity(ProximityMeasurementUnit unit, Double value, Calibrat...
method description (line 28) | public String description() {
method equals (line 35) | @Override
method hashCode (line 45) | @Override
method toString (line 50) | @NonNull
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/ProximityMeasurementUnit.java
type ProximityMeasurementUnit (line 5) | public enum ProximityMeasurementUnit {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/PseudoDeviceAddress.java
class PseudoDeviceAddress (line 10) | public class PseudoDeviceAddress {
method PseudoDeviceAddress (line 15) | public PseudoDeviceAddress(final RandomSource.Method method) {
method PseudoDeviceAddress (line 30) | public PseudoDeviceAddress() {
method PseudoDeviceAddress (line 34) | public PseudoDeviceAddress(final byte[] data) {
method PseudoDeviceAddress (line 39) | public PseudoDeviceAddress(final long value) {
method encode (line 44) | protected final static byte[] encode(final long value) {
method decode (line 50) | protected final static long decode(final byte[] data) {
method equals (line 60) | @Override
method hashCode (line 68) | @Override
method toString (line 73) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/RSSI.java
class RSSI (line 6) | public class RSSI {
method RSSI (line 9) | public RSSI(int value) {
method equals (line 13) | @Override
method hashCode (line 21) | @Override
method toString (line 26) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/RandomSource.java
class RandomSource (line 10) | public class RandomSource {
type Method (line 14) | public enum Method {
method RandomSource (line 19) | public RandomSource(final Method method) {
method addEntropy (line 25) | public synchronized void addEntropy(final long value) {
method nextBytes (line 32) | public void nextBytes(byte[] bytes) {
method nextInt (line 37) | public int nextInt() {
method nextLong (line 42) | public long nextLong() {
method nextDouble (line 47) | public double nextDouble() {
method init (line 55) | protected synchronized void init() {
method getRandom (line 84) | private synchronized final static Random getRandom() {
method getSecureRandomSingleton (line 109) | private synchronized final static Random getSecureRandomSingleton() {
method getSecureRandom (line 118) | private final static Random getSecureRandom() {
method getSecureRandomNIST (line 122) | private final static Random getSecureRandomNIST() {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/SensorState.java
type SensorState (line 5) | public enum SensorState {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/SensorType.java
type SensorType (line 6) | public enum SensorType {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/SignalCharacteristicData.java
class SignalCharacteristicData (line 11) | public class SignalCharacteristicData {
method encodeWriteRssi (line 17) | public static Data encodeWriteRssi(final RSSI rssi) {
method decodeWriteRSSI (line 26) | public static RSSI decodeWriteRSSI(final Data data) {
method encodeWritePayload (line 48) | public static Data encodeWritePayload(final PayloadData payloadData) {
method decodeWritePayload (line 59) | public static PayloadData decodeWritePayload(final Data data) {
method encodeWritePayloadSharing (line 92) | public static Data encodeWritePayloadSharing(final PayloadSharingData ...
method decodeWritePayloadSharing (line 104) | public static PayloadSharingData decodeWritePayloadSharing(final Data ...
method encodeImmediateSend (line 140) | public static Data encodeImmediateSend(final ImmediateSendData immedia...
method decodeImmediateSend (line 151) | public static ImmediateSendData decodeImmediateSend(final Data data) {
method detect (line 179) | public static SignalCharacteristicDataType detect(Data data) {
method signalDataActionCode (line 194) | private static byte signalDataActionCode(byte[] signalData) {
method int16 (line 201) | private static Short int16(byte[] data, int index) {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/SignalCharacteristicDataType.java
type SignalCharacteristicDataType (line 4) | public enum SignalCharacteristicDataType {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/TargetIdentifier.java
class TargetIdentifier (line 12) | public class TargetIdentifier {
method TargetIdentifier (line 15) | protected TargetIdentifier(final String value) {
method TargetIdentifier (line 20) | public TargetIdentifier() {
method TargetIdentifier (line 25) | public TargetIdentifier(BluetoothDevice bluetoothDevice) {
method equals (line 29) | @Override
method hashCode (line 37) | @Override
method toString (line 42) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/TimeInterval.java
class TimeInterval (line 9) | public class TimeInterval {
method TimeInterval (line 15) | public TimeInterval(long seconds) {
method TimeInterval (line 19) | public TimeInterval(Date date) {
method TimeInterval (line 23) | public TimeInterval(Date from, Date to) {
method minutes (line 27) | public static TimeInterval minutes(long minutes) {
method seconds (line 31) | public static TimeInterval seconds(long seconds) {
method millis (line 35) | public long millis() {
method equals (line 39) | @Override
method hashCode (line 47) | @Override
method toString (line 52) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Triple.java
class Triple (line 4) | public class Triple<A, B, C> {
method Triple (line 9) | public Triple(A a, B b, C c) {
method toString (line 15) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Tuple.java
class Tuple (line 5) | public class Tuple<A, B> {
method Tuple (line 9) | public Tuple(A a, B b) {
method toString (line 14) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/UInt16.java
class UInt16 (line 7) | public class UInt16 {
method UInt16 (line 13) | public UInt16(int value) {
method equals (line 17) | @Override
method hashCode (line 25) | @Override
method toString (line 30) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/UInt32.java
class UInt32 (line 7) | public class UInt32 {
method UInt32 (line 13) | public UInt32(long value) {
method equals (line 17) | @Override
method hashCode (line 25) | @Override
method toString (line 30) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/UInt64.java
class UInt64 (line 8) | public class UInt64 {
method UInt64 (line 16) | public UInt64(long value) {
method equals (line 20) | @Override
method hashCode (line 28) | @Override
method toString (line 33) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/UInt8.java
class UInt8 (line 7) | public class UInt8 {
method UInt8 (line 13) | public UInt8(int value) {
method equals (line 17) | @Override
method hashCode (line 25) | @Override
method toString (line 30) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/motion/ConcreteInertiaSensor.java
class ConcreteInertiaSensor (line 21) | public class ConcreteInertiaSensor implements InertiaSensor {
method onSensorChanged (line 28) | @Override
method onAccuracyChanged (line 46) | @Override
method ConcreteInertiaSensor (line 51) | public ConcreteInertiaSensor(final Context context) {
method add (line 57) | @Override
method start (line 62) | @Override
method stop (line 77) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/motion/InertiaSensor.java
type InertiaSensor (line 6) | public interface InertiaSensor extends Sensor {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/BasicFunc.java
class BasicFunc (line 9) | public class BasicFunc {
method h (line 12) | public static Data h(Data data) {
method t (line 24) | public static Data t(Data data) {
method t (line 29) | public static Data t(Data data, int n) {
method xor (line 34) | public static Data xor(Data left, Data right) {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/CipherParameters.java
type CipherParameters (line 6) | public interface CipherParameters
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/ContactIdentifier.java
class ContactIdentifier (line 7) | public class ContactIdentifier extends Data {
method ContactIdentifier (line 9) | public ContactIdentifier(Data value) {
method ContactIdentifier (line 13) | public ContactIdentifier(byte repeating, int count) {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/ContactKey.java
class ContactKey (line 8) | public class ContactKey extends Data {
method ContactKey (line 10) | public ContactKey(Data value) {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/ContactKeySeed.java
class ContactKeySeed (line 8) | public class ContactKeySeed extends Data {
method ContactKeySeed (line 10) | public ContactKeySeed(Data value) {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/Digest.java
type Digest (line 6) | public interface Digest
method getAlgorithmName (line 13) | public String getAlgorithmName();
method getDigestSize (line 20) | public int getDigestSize();
method update (line 27) | public void update(byte in);
method update (line 36) | public void update(byte[] in, int inOff, int len);
method doFinal (line 45) | public int doFinal(byte[] out, int outOff);
method reset (line 50) | public void reset();
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/DigestRandomGenerator.java
class DigestRandomGenerator (line 12) | public class DigestRandomGenerator
method cycleSeed (line 24) | private void cycleSeed()
method generateState (line 32) | private void generateState()
method digestAddCounter (line 46) | private void digestAddCounter(long seed)
method digestUpdate (line 55) | private void digestUpdate(byte[] inSeed)
method digestDoFinal (line 60) | private void digestDoFinal(byte[] result)
method addSeedMaterial (line 66) | public void addSeedMaterial(byte[] inSeed)
method addSeedMaterial (line 79) | public void addSeedMaterial(long rSeed)
method DigestRandomGenerator (line 90) | public DigestRandomGenerator(
method nextBytes (line 105) | public void nextBytes(byte[] bytes)
method nextBytes (line 110) | public void nextBytes(byte[] bytes, int start, int len)
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/ExtendedDigest.java
type ExtendedDigest (line 3) | public interface ExtendedDigest
method getByteLength (line 12) | public int getByteLength();
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/GeneralDigest.java
class GeneralDigest (line 3) | public abstract class GeneralDigest implements ExtendedDigest,Memoable{
method GeneralDigest (line 10) | protected GeneralDigest()
method GeneralDigest (line 15) | protected GeneralDigest(GeneralDigest t)
method GeneralDigest (line 20) | protected GeneralDigest(byte[] encodedState)
method copyIn (line 27) | protected void copyIn(GeneralDigest t)
method update (line 35) | public void update(byte in)
method update (line 48) | public void update(
method finish (line 85) | public void finish()
method reset (line 101) | public void reset()
method populateState (line 112) | protected void populateState(byte[] state)
method getByteLength (line 119) | public int getByteLength()
method processWord (line 124) | protected abstract void processWord(byte[] in, int inOff);
method processLength (line 126) | protected abstract void processLength(long bitLength);
method processBlock (line 128) | protected abstract void processBlock();
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/GenerateKey.java
class GenerateKey (line 10) | public class GenerateKey {
method date (line 21) | protected static Date date(String fromString) {
method getEpoch (line 31) | protected static TimeInterval getEpoch() {
method day (line 38) | public static int day(Date onDate) {
method period (line 43) | protected static int period(Date atTime) {
method secretKey (line 49) | public static SecretKey secretKey() {
method matchingKeys (line 64) | public static MatchingKey[] matchingKeys(SecretKey secretKey) {
method contactKeys (line 86) | public static ContactKey[] contactKeys(MatchingKey matchingKey) {
method contactIdentifier (line 105) | public static ContactIdentifier contactIdentifier(ContactKey contactKe...
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/HMACSHA256.java
class HMACSHA256 (line 5) | public class HMACSHA256 {
method GenerateMAC (line 6) | public static byte [] GenerateMAC(byte [] data, byte [] key) throws Ex...
method VerifyMAC (line 14) | public static boolean VerifyMAC(byte [] data, byte [] key,byte [] Mac_...
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/HMac.java
class HMac (line 10) | public class HMac
method getByteLength (line 33) | private static int getByteLength(
method HMac (line 57) | public HMac(
method HMac (line 63) | private HMac(
method getAlgorithmName (line 74) | public String getAlgorithmName()
method getUnderlyingDigest (line 79) | public Digest getUnderlyingDigest()
method init (line 84) | public void init(
method getMacSize (line 129) | public int getMacSize()
method update (line 134) | public void update(
method update (line 140) | public void update(
method doFinal (line 148) | public int doFinal(
method reset (line 186) | public void reset()
method xorPad (line 199) | private static void xorPad(byte[] pad, int len, byte n)
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/KeyParameter.java
class KeyParameter (line 3) | public class KeyParameter
method KeyParameter (line 8) | public KeyParameter(
method KeyParameter (line 14) | public KeyParameter(
method getKey (line 24) | public byte[] getKey()
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/Mac.java
type Mac (line 6) | public interface Mac
method init (line 15) | public void init(CipherParameters params)
method getAlgorithmName (line 23) | public String getAlgorithmName();
method getMacSize (line 30) | public int getMacSize();
method update (line 38) | public void update(byte in);
method update (line 45) | public void update(byte[] in, int inOff, int len);
method doFinal (line 56) | public int doFinal(byte[] out, int outOff);
method reset (line 62) | public void reset();
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/MatchingKey.java
class MatchingKey (line 7) | public class MatchingKey extends Data {
method MatchingKey (line 9) | public MatchingKey(Data value) {
method MatchingKey (line 13) | public MatchingKey(byte repeating, int count) {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/MatchingKeySeed.java
class MatchingKeySeed (line 7) | public class MatchingKeySeed extends Data {
method MatchingKeySeed (line 9) | public MatchingKeySeed(Data value) {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/Memoable.java
type Memoable (line 3) | public interface Memoable
method copy (line 9) | Memoable copy();
method reset (line 16) | void reset(Memoable other);
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/PioneerHMac.java
class PioneerHMac (line 3) | public class PioneerHMac {
method PioneerHMac (line 7) | public PioneerHMac(byte[] key)
method generateHMac (line 14) | public void generateHMac(byte[] message,byte[] mac)
method generateHMac (line 19) | public void generateHMac(byte[] message,int inoff,int len,byte[] mac,i...
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/PioneerHash.java
class PioneerHash (line 3) | public class PioneerHash {
method PioneerHash (line 6) | public PioneerHash()
method generateHash (line 11) | public void generateHash(byte[] message,byte[] hash)
method generateHash (line 16) | public void generateHash(byte[] message,int inoff,int len,byte[] hash,...
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/PioneerPRG.java
class PioneerPRG (line 5) | public class PioneerPRG {
method PioneerPRG (line 9) | public PioneerPRG()
method generateRandomNumber (line 15) | public void generateRandomNumber(byte[] bytes)
method generateRandomNumber (line 20) | public void generateRandomNumber(byte[] bytes, int start, int len)
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/RandomGenerator.java
type RandomGenerator (line 6) | public interface RandomGenerator
method addSeedMaterial (line 13) | void addSeedMaterial(byte[] seed);
method addSeedMaterial (line 20) | void addSeedMaterial(long seed);
method nextBytes (line 27) | void nextBytes(byte[] bytes);
method nextBytes (line 36) | void nextBytes(byte[] bytes, int start, int len);
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/SM3Digest.java
class SM3Digest (line 4) | public class SM3Digest
method SM3Digest (line 43) | public SM3Digest(SM3Digest t)
method SM3Digest (line 52) | public SM3Digest()
method copyIn (line 58) | private void copyIn(SM3Digest t)
method getAlgorithmName (line 65) | public String getAlgorithmName()
method getDigestSize (line 70) | public int getDigestSize()
method reset (line 78) | public void reset(Memoable other)
method copy (line 86) | public Memoable copy()
method reset (line 94) | public void reset()
method doFinal (line 111) | public int doFinal(byte[] out,
method processLength (line 126) | protected void processLength(long bitLength)
method processWord (line 148) | protected void processWord(byte[] in,
method P0 (line 168) | private int P0(final int x)
method P1 (line 175) | private int P1(final int x)
method FF0 (line 182) | private int FF0(final int x, final int y, final int z)
method FF1 (line 187) | private int FF1(final int x, final int y, final int z)
method GG0 (line 192) | private int GG0(final int x, final int y, final int z)
method GG1 (line 197) | private int GG1(final int x, final int y, final int z)
method processBlock (line 203) | protected void processBlock()
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/SecretKey.java
class SecretKey (line 7) | public class SecretKey extends Data {
method SecretKey (line 9) | public SecretKey(byte[] value) {
method SecretKey (line 13) | public SecretKey(byte repeating, int count) {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/SpecificUsePayloadSupplier.java
class SpecificUsePayloadSupplier (line 22) | public class SpecificUsePayloadSupplier extends DefaultPayloadSupplier i...
method SpecificUsePayloadSupplier (line 37) | public SpecificUsePayloadSupplier(SecretKey secretKey) {
method generateSecretKey (line 44) | public static SecretKey generateSecretKey() {
method matchingkey (line 48) | public MatchingKey matchingkey()
method parseMac (line 54) | public static Data parseMac(PayloadData payloadData) {
method parseContactIdentifier (line 59) | public static Data parseContactIdentifier(PayloadData payloadData) {
method parseStartTime (line 64) | public static Data parseStartTime(PayloadData payloadData) {
method contactIdentifiers (line 69) | public static ContactIdentifier[] contactIdentifiers(MatchingKey match...
method parseRawData (line 78) | public static Data parseRawData(PayloadData payloadData) {
method appendTimeandMac (line 83) | private static void appendTimeandMac(Date start_time, PayloadData payl...
method updatePayload (line 120) | public static PayloadData updatePayload(Date time){
method payload (line 136) | @Override
method contactIdentifier (line 154) | private ContactIdentifier contactIdentifier(Date time) {
method payload (line 190) | @Override
method checkPayloadtime (line 205) | public static boolean checkPayloadtime(PayloadData payloadData) {
method parseStartTimeToLong (line 228) | static public long parseStartTimeToLong(PayloadData payloadData) {
method parseContactIdentifierToStr (line 236) | static public String parseContactIdentifierToStr(PayloadData payloadDa...
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/UsePayloadSupplier.java
type UsePayloadSupplier (line 8) | public interface UsePayloadSupplier extends PayloadSupplier {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/Util.java
class Util (line 3) | public abstract class Util
method bigEndianToInt (line 5) | public static int bigEndianToInt(byte[] bs, int off)
method intToBigEndian (line 15) | public static void intToBigEndian(int n, byte[] bs, int off)
method intToBigEndian (line 23) | public static void intToBigEndian(int[] ns, byte[] bs, int off)
method bigEndianToLong (line 32) | public static long bigEndianToLong(byte[] bs, int off)
method longToBigEndian (line 39) | public static void longToBigEndian(long n, byte[] bs, int off)
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/DefaultPayloadSupplier.java
class DefaultPayloadSupplier (line 16) | public abstract class DefaultPayloadSupplier implements PayloadSupplier {
method legacyPayload (line 18) | @Override
method payload (line 23) | @Override
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/DigitalSignature.java
class DigitalSignature (line 5) | public class DigitalSignature extends Data {
method DigitalSignature (line 7) | public DigitalSignature(Data message){this.message = message;}
method DigitalSignature (line 8) | public DigitalSignature(){this.message = message;}
method genMAC (line 9) | public static Data genMAC(){return message;}
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/extended/ConcreteExtendedDataSectionV1.java
class ConcreteExtendedDataSectionV1 (line 6) | public class ConcreteExtendedDataSectionV1 {
method ConcreteExtendedDataSectionV1 (line 11) | public ConcreteExtendedDataSectionV1(UInt8 code, UInt8 length, Data da...
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/extended/ConcreteExtendedDataV1.java
class ConcreteExtendedDataV1 (line 18) | public class ConcreteExtendedDataV1 implements ExtendedData {
method ConcreteExtendedDataV1 (line 21) | public ConcreteExtendedDataV1() {
method ConcreteExtendedDataV1 (line 25) | public ConcreteExtendedDataV1(PayloadData unparsedData) {
method hasData (line 29) | @Override
method addSection (line 34) | @Override
method addSection (line 41) | @Override
method addSection (line 48) | @Override
method addSection (line 55) | @Override
method addSection (line 62) | @Override
method addSection (line 69) | @Override
method addSection (line 76) | @Override
method addSection (line 83) | @Override
method addSection (line 90) | @Override
method addSection (line 97) | @Override
method addSection (line 104) | @Override
method payload (line 111) | @Override
method getSections (line 116) | public List<ConcreteExtendedDataSectionV1> getSections() {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/extended/ExtendedData.java
type ExtendedData (line 15) | public interface ExtendedData {
method hasData (line 16) | boolean hasData();
method addSection (line 17) | void addSection(UInt8 code, UInt8 value);
method addSection (line 18) | void addSection(UInt8 code, UInt16 value);
method addSection (line 19) | void addSection(UInt8 code, UInt32 value);
method addSection (line 20) | void addSection(UInt8 code, UInt64 value);
method addSection (line 21) | void addSection(UInt8 code, Int8 value);
method addSection (line 22) | void addSection(UInt8 code, Int16 value);
method addSection (line 23) | void addSection(UInt8 code, Int32 value);
method addSection (line 24) | void addSection(UInt8 code, Int64 value);
method addSection (line 25) | void addSection(UInt8 code, Float16 value);
method addSection (line 26) | void addSection(UInt8 code, String value);
method addSection (line 27) | void addSection(UInt8 code, Data value);
method payload (line 28) | PayloadData payload();
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/service/AlarmReceiver.java
class AlarmReceiver (line 26) | public class AlarmReceiver {
method run (line 32) | @Override
method run (line 41) | @RequiresApi(api = Build.VERSION_CODES.O)
method onReceive (line 116) | @Override
method AlarmReceiver (line 127) | public AlarmReceiver(Context context,MatchDelegate delegate)
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/service/Connection.java
class Connection (line 13) | public class Connection {
method Connection (line 18) | public Connection() throws IOException {
method Connection (line 21) | public Connection(Context context) throws IOException {
method ConnectToServer (line 26) | public void ConnectToServer() {
method Register (line 44) | public String Register(String phone, String secretKey) {
method Token (line 66) | public String Token(String token) {
method Token_TransmitMachingKeys (line 84) | public String Token_TransmitMachingKeys(String phone,String Maching_ke...
method TransmitMachingKeys (line 95) | public String TransmitMachingKeys(String phone,String Maching_keys) th...
method Download_Message (line 107) | public String Download_Message() throws IOException {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/service/CustomTimer.java
class CustomTimer (line 13) | public class CustomTimer extends Service {
method onBind (line 17) | @Override
method onStartCommand (line 22) | @Override
method setUpdateDatabase (line 30) | private void setUpdateDatabase(Context context)
method setDownloadData (line 46) | private void setDownloadData(Context context)
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/service/ForegroundService.java
class ForegroundService (line 14) | public class ForegroundService extends Service {
method onCreate (line 18) | @Override
method onStartCommand (line 23) | @Override
method onDestroy (line 43) | @Override
method onBind (line 48) | @Override
method startForegroundService (line 53) | private void startForegroundService() {
method stopForegroundService (line 58) | private void stopForegroundService() {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/service/MatchDelegate.java
type MatchDelegate (line 3) | public interface MatchDelegate {
method matchFound (line 4) | void matchFound();
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/service/NotificationService.java
class NotificationService (line 14) | public class NotificationService {
method NotificationService (line 21) | private NotificationService(final Application application) {
method shared (line 27) | public final static NotificationService shared(final Application appli...
method startForegroundService (line 35) | public void startForegroundService(Notification notification, int noti...
method stopForegroundService (line 49) | public void stopForegroundService() {
method getForegroundServiceNotification (line 55) | public Notification getForegroundServiceNotification() {
method getForegroundServiceNotificationId (line 59) | public int getForegroundServiceNotificationId() {
FILE: Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/service/PioneerDb.java
class PioneerDb (line 22) | public class PioneerDb extends SQLiteOpenHelper{
method PioneerDb (line 27) | public PioneerDb(Context context, String name, CursorFactory factory,i...
method onCreate (line 32) | @Override
method onUpgrade (line 43) | @Override
method getTableNum (line 47) | public int getTableNum()
method deleteCurTable (line 53) | public void deleteCurTable()
method matchContactIdentifier (line 65) | private static boolean matchContactIdentifier(SQLiteDatabase database,...
method insertPayloadData (line 100) | public void insertPayloadData(PayloadData payloadData) {
method matchMatchingKey (line 119) | public boolean matchMatchingKey(MatchingKey matchingKey,int offset)
method updateTable (line 141) | public void updateTable()
FILE: Android_app/pioneer/src/test/java/com/ABC/pioneer/sensor/ExampleUnitTest.java
class ExampleUnitTest (line 12) | public class ExampleUnitTest {
method addition_isCorrect (line 13) | @Test
FILE: Server/src/com/bean/User.java
class User (line 6) | public class User implements Serializable{
method User (line 17) | public User() {
method User (line 21) | public User(String ID) {
method User (line 25) | public User(String ID,String key) {
method User (line 30) | public User(String id, String name, String key) {
method getId (line 37) | public String getId() {
method setId (line 41) | public void setId(String ID) {
method getKey (line 45) | public String getKey() {
method setKey (line 49) | public void setKey(String key) {
method getName (line 53) | public String getName() {
method setName (line 57) | public void setName(String Username) {
method getPassword (line 61) | public String getPassword() {
method setPassword (line 65) | public void setPassword(String Password) {
method getUsername (line 68) | public String getUsername() {
method setUsername (line 71) | public void setUsername(String Username) {
method getToken (line 74) | public String getToken() {
method setToken (line 77) | public void setToken(String token) {
method getMatchingKeys (line 80) | public String getMatchingKeys(int i) {
method setMatchingKeys (line 83) | public void setMatchingKeys(int i,String str) {
method getMatching_keys (line 86) | public String getMatching_keys() {
method setMatching_keys (line 89) | public void setMatching_keys(String Matching_keys) {
method toString (line 93) | @Override
FILE: Server/src/com/bean/UserMessage.java
class UserMessage (line 7) | public class UserMessage implements Serializable{
method UserMessage (line 17) | public UserMessage() { }
method UserMessage (line 19) | public UserMessage(int log) {
method UserMessage (line 22) | public UserMessage(String str) {
method UserMessage (line 25) | public UserMessage(String type,String str) {
method UserMessage (line 29) | public UserMessage(String type,User user) {
method UserMessage (line 33) | public UserMessage(String type,User user,String token) {
method getType (line 40) | public String getType() {
method getUser (line 43) | public User getUser() {
method getStr (line 46) | public String getStr() {
method getLog (line 49) | public int getLog() {
method getToken (line 52) | public String getToken() {
method setType (line 57) | public void setType(String type) {
method setStr (line 60) | public void setStr(String str) {
method setUser (line 63) | public void setUser(User user) {
method setToken (line 67) | public void setToken(String token) {
method setLog (line 70) | public void setLog(int log) {
method setMatchingKeys (line 74) | public void setMatchingKeys(int i,String MatchingKey) {
method getMatchingKeys (line 77) | public String[] getMatchingKeys() {
method toString (line 85) | @Override
FILE: Server/src/com/controller/PioneerClient.java
class PioneerClient (line 24) | public class PioneerClient {
method main (line 31) | public static void main(String[] args) throws UnknownHostException, IO...
method PioneerClient (line 36) | PioneerClient(){
method PioneerClient (line 39) | PioneerClient(String host, int port){
method createSSLContext (line 45) | private SSLContext createSSLContext(){
method run (line 83) | public void run() throws IOException{
class ClientThread (line 101) | static class ClientThread extends Thread{
method ClientThread (line 106) | ClientThread(SSLSocket sslSocket){
method run (line 109) | public void run() {
method MenuView (line 260) | private static String MenuView() {
FILE: Server/src/com/controller/PioneerServer.java
class PioneerServer (line 29) | public class PioneerServer {
method main (line 32) | public static void main(String[] args) throws IOException {
method PioneerServer (line 37) | public PioneerServer() {
method PioneerServer (line 40) | PioneerServer(int port) {
method createSSLContext (line 45) | public SSLContext createSSLContext() {
method run (line 71) | @SuppressWarnings({ "resource", "null" })
class ServerThread (line 116) | static class ServerThread {
method ServerThread (line 123) | ServerThread(SSLSocket sslSocket){
method run (line 126) | @SuppressWarnings("null")
FILE: Server/src/com/dao/RandomGenerator.java
class RandomGenerator (line 4) | public class RandomGenerator {
method GeneratePsuRandomString (line 7) | public static String GeneratePsuRandomString(int length)
method GeneratePsuRandomBytes (line 16) | public static byte [] GeneratePsuRandomBytes(int length)
method getSecureRandom (line 24) | public final static SecureRandom getSecureRandom() {
FILE: Server/src/com/dao/TaskThread.java
class TaskThread (line 15) | public class TaskThread extends Timer{
method start (line 36) | public void start() {
method addDay (line 62) | public Date addDay(Date date, int num) {
method Update_Infectedusers (line 68) | public void Update_Infectedusers() {
method Update_Contactedusers (line 113) | public void Update_Contactedusers() {
FILE: Server/src/com/dao/UserDao.java
type UserDao (line 6) | public interface UserDao {
method insert (line 8) | boolean insert(User user);
method delete (line 10) | boolean delete(User user);
method select_users_ID (line 13) | boolean select_users_ID(User user);
method select_users_key (line 14) | boolean select_users_key(User user);
method loginUser (line 17) | String loginUser(User user);
method ApplyToken (line 20) | String ApplyToken(User user);
method CheckToken (line 23) | String CheckToken(User user);
method Upload (line 26) | String Upload(User user,String token);
method Update_Infectedusers (line 29) | String Update_Infectedusers() ;
method Update_Contactedusers (line 32) | String Update_Contactedusers() ;
method Download (line 35) | String Download();
FILE: Server/src/com/dao/UserDao_Imp.java
class UserDao_Imp (line 13) | public class UserDao_Imp implements UserDao {
method Generate_token (line 48) | private String Generate_token() {
method select_users_ID (line 53) | @Override
method insert (line 78) | @Override
method delete (line 99) | @Override
method select_users_key (line 119) | @Override
method loginUser (line 143) | @Override
method loginManager (line 166) | public boolean loginManager(User user) {
method insert_token (line 184) | public boolean insert_token(User user,String token) {
method ApplyToken (line 203) | public String ApplyToken(User user) {
method CheckToken (line 237) | public String CheckToken(User user) {
method UploadMatching_key (line 264) | public void UploadMatching_key(User user) {
method DeleteToken (line 282) | public boolean DeleteToken(String token) {
method Upload (line 300) | public String Upload(User user,String token) {
method AutoUpload (line 326) | public String AutoUpload(User user) {
method Update_Infectedusers (line 346) | public String Update_Infectedusers() {
method Update_Contactedusers (line 391) | public String Update_Contactedusers() {
method Download (line 434) | public String Download() {
FILE: Server/src/com/jdbc/JDBCUtils.java
class JDBCUtils (line 13) | public class JDBCUtils {
method getConnection (line 40) | public static Connection getConnection() {
method close (line 52) | public static void close(Connection conn,Statement statement,ResultSet...
Condensed preview — 258 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (799K chars).
[
{
"path": "Android_app/app/.gitignore",
"chars": 6,
"preview": "/build"
},
{
"path": "Android_app/app/build.gradle",
"chars": 1331,
"preview": "plugins {\r\n id 'com.android.application'\r\n}\r\n\r\nandroid {\r\n compileSdkVersion 30\r\n buildToolsVersion \"30.0.3\"\r\n\r"
},
{
"path": "Android_app/app/proguard-rules.pro",
"chars": 770,
"preview": "# Add project specific ProGuard rules here.\r\n# You can control the set of applied configuration files using the\r\n# progu"
},
{
"path": "Android_app/app/src/androidTest/java/com/ABC/pioneer/app/ExampleInstrumentedTest.java",
"chars": 777,
"preview": "package com.ABC.pioneer.app;\r\n\r\nimport android.content.Context;\r\n\r\nimport androidx.test.platform.app.InstrumentationRegi"
},
{
"path": "Android_app/app/src/main/AndroidManifest.xml",
"chars": 1622,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n packag"
},
{
"path": "Android_app/app/src/main/java/com/ABC/pioneer/app/AppDelegate.java",
"chars": 6559,
"preview": "\npackage com.ABC.pioneer.app;\n\nimport android.app.Application;\nimport android.app.Notification;\nimport android.app.Notif"
},
{
"path": "Android_app/app/src/main/java/com/ABC/pioneer/app/LoginActivity.java",
"chars": 3443,
"preview": "package com.ABC.pioneer.app;\r\n\r\nimport android.content.Intent;\r\nimport android.content.SharedPreferences;\r\nimport androi"
},
{
"path": "Android_app/app/src/main/java/com/ABC/pioneer/app/MainActivity.java",
"chars": 14223,
"preview": "\npackage com.ABC.pioneer.app;\n\nimport android.Manifest;\nimport android.annotation.SuppressLint;\nimport android.app.Notif"
},
{
"path": "Android_app/app/src/main/java/com/ABC/pioneer/app/RegisterActivity.java",
"chars": 4470,
"preview": "package com.ABC.pioneer.app;\r\n\r\n\r\nimport android.content.Context;\r\nimport android.content.SharedPreferences;\r\nimport and"
},
{
"path": "Android_app/app/src/main/java/com/ABC/pioneer/app/SplashActivity.java",
"chars": 920,
"preview": "package com.ABC.pioneer.app;\r\n\r\nimport android.content.Intent;\r\nimport android.os.Bundle;\r\nimport android.os.Handler;\r\n\r"
},
{
"path": "Android_app/app/src/main/java/com/ABC/pioneer/app/Target.java",
"chars": 3277,
"preview": "\npackage com.ABC.pioneer.app;\n\nimport com.ABC.pioneer.sensor.analysis.Sample;\nimport com.ABC.pioneer.sensor.datatype.Imm"
},
{
"path": "Android_app/app/src/main/java/com/ABC/pioneer/app/TargetListAdapter.java",
"chars": 2006,
"preview": "\npackage com.ABC.pioneer.app;\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport android.view.V"
},
{
"path": "Android_app/app/src/main/java/com/ABC/pioneer/app/TokenActivity.java",
"chars": 3720,
"preview": "// Android APP \r\n// Token activity\r\n\r\npackage com.ABC.pioneer.app;\r\n\r\nimport android.content.SharedPreferences;\r\nimport "
},
{
"path": "Android_app/app/src/main/java/com/ABC/pioneer/app/fragment/FragmentActivity1.java",
"chars": 11402,
"preview": "package com.ABC.pioneer.app.fragment;\r\n\r\nimport android.annotation.SuppressLint;\r\nimport android.content.Context;\r\nimpor"
},
{
"path": "Android_app/app/src/main/java/com/ABC/pioneer/app/fragment/FragmentActivity2.java",
"chars": 1751,
"preview": "package com.ABC.pioneer.app.fragment;\r\n\r\nimport android.content.Context;\r\nimport android.content.Intent;\r\nimport android"
},
{
"path": "Android_app/app/src/main/java/com/ABC/pioneer/app/fragment/FragmentActivity3.java",
"chars": 1393,
"preview": "package com.ABC.pioneer.app.fragment;\r\n\r\nimport android.os.Bundle;\r\nimport android.view.LayoutInflater;\r\nimport android."
},
{
"path": "Android_app/app/src/main/java/com/ABC/pioneer/app/ignoreBatteryOpt.java",
"chars": 1126,
"preview": "package com.ABC.pioneer.app;\r\n\r\nimport android.app.Activity;\r\nimport android.content.Context;\r\nimport android.content.In"
},
{
"path": "Android_app/app/src/main/res/drawable/border_input_box.xml",
"chars": 434,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n\r\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\r\n <solid"
},
{
"path": "Android_app/app/src/main/res/drawable/button_background.xml",
"chars": 576,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\r\n <item"
},
{
"path": "Android_app/app/src/main/res/drawable/ic_launcher_background.xml",
"chars": 4941,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<vector\r\n android:height=\"108dp\"\r\n android:width=\"108dp\"\r\n android:view"
},
{
"path": "Android_app/app/src/main/res/drawable/token_background.xml",
"chars": 571,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\r\n <item"
},
{
"path": "Android_app/app/src/main/res/drawable-v24/ic_launcher_foreground.xml",
"chars": 1742,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:aap"
},
{
"path": "Android_app/app/src/main/res/layout/activity_bluetooth.xml",
"chars": 8214,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<androidx.constraintlayout.widget.ConstraintLayout\r\n xmlns:android=\"http://sc"
},
{
"path": "Android_app/app/src/main/res/layout/activity_bottom_bar.xml",
"chars": 5825,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<LinearLayout\r\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n "
},
{
"path": "Android_app/app/src/main/res/layout/activity_login.xml",
"chars": 3779,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas"
},
{
"path": "Android_app/app/src/main/res/layout/activity_payload.xml",
"chars": 852,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n an"
},
{
"path": "Android_app/app/src/main/res/layout/activity_register.xml",
"chars": 3030,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas"
},
{
"path": "Android_app/app/src/main/res/layout/activity_splash.xml",
"chars": 1996,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas"
},
{
"path": "Android_app/app/src/main/res/layout/activity_token.xml",
"chars": 4003,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas"
},
{
"path": "Android_app/app/src/main/res/layout/activity_token_pre.xml",
"chars": 2728,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<androidx.constraintlayout.widget.ConstraintLayout\r\n xmlns:android=\"http://sc"
},
{
"path": "Android_app/app/src/main/res/layout/activity_user.xml",
"chars": 3103,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<androidx.constraintlayout.widget.ConstraintLayout\r\n xmlns:android=\"http://sc"
},
{
"path": "Android_app/app/src/main/res/layout/custom_notification.xml",
"chars": 348,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<androidx.constraintlayout.widget.ConstraintLayout\r\n xmlns:android=\"http://sc"
},
{
"path": "Android_app/app/src/main/res/layout/listview_targets_row.xml",
"chars": 807,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n a"
},
{
"path": "Android_app/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
"chars": 269,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\r\n "
},
{
"path": "Android_app/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
"chars": 272,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\r\n "
},
{
"path": "Android_app/app/src/main/res/values/colors.xml",
"chars": 572,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<resources>\n <color name=\"colorPrimary\">#6200EE</color>\n <color name=\"colo"
},
{
"path": "Android_app/app/src/main/res/values/ic_launcher_background.xml",
"chars": 120,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <color name=\"ic_launcher_background\">#ffffff</color>\n</resources>"
},
{
"path": "Android_app/app/src/main/res/values/strings.xml",
"chars": 750,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n\n<resources>\n <string name=\"app_name\">Pioneer</string>\n\n <!-- Name of the "
},
{
"path": "Android_app/app/src/main/res/values/styles.xml",
"chars": 1292,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n\n<resources>\n <!-- Base application theme. -->\n <style name=\"AppTheme\" par"
},
{
"path": "Android_app/app/src/test/java/com/ABC/pioneer/app/ExampleUnitTest.java",
"chars": 396,
"preview": "package com.ABC.pioneer.app;\r\n\r\nimport org.junit.Test;\r\n\r\nimport static org.junit.Assert.*;\r\n\r\n/**\r\n * Example local uni"
},
{
"path": "Android_app/build.gradle",
"chars": 553,
"preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\r\nbuildscript {\r\n "
},
{
"path": "Android_app/gradle/wrapper/gradle-wrapper.properties",
"chars": 236,
"preview": "#Fri Apr 23 18:48:51 CST 2021\r\ndistributionBase=GRADLE_USER_HOME\r\ndistributionPath=wrapper/dists\r\nzipStoreBase=GRADLE_US"
},
{
"path": "Android_app/gradle.properties",
"chars": 1111,
"preview": "# Project-wide Gradle settings.\r\n# IDE (e.g. Android Studio) users:\r\n# Gradle settings configured through the IDE *will "
},
{
"path": "Android_app/gradlew",
"chars": 5296,
"preview": "#!/usr/bin/env sh\n\n##############################################################################\n##\n## Gradle start up"
},
{
"path": "Android_app/gradlew.bat",
"chars": 2260,
"preview": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@r"
},
{
"path": "Android_app/local.properties",
"chars": 368,
"preview": "## This file must *NOT* be checked into Version Control Systems,\r\n# as it contains information specific to your local co"
},
{
"path": "Android_app/pioneer/.gitignore",
"chars": 6,
"preview": "/build"
},
{
"path": "Android_app/pioneer/BuildConfig.java",
"chars": 409,
"preview": "/**\n * Automatically generated file. DO NOT MODIFY\n */\npackage com.vmware.herald.app;\n\npublic final class BuildConfig {\n"
},
{
"path": "Android_app/pioneer/app/BuildConfig.java",
"chars": 407,
"preview": "/**\n * Automatically generated file. DO NOT MODIFY\n */\npackage com.ABC.pioneer.app;\n\npublic final class BuildConfig {\n "
},
{
"path": "Android_app/pioneer/build.gradle",
"chars": 1005,
"preview": "plugins {\r\n id 'com.android.library'\r\n}\r\n\r\nandroid {\r\n compileSdkVersion 30\r\n buildToolsVersion \"30.0.3\"\r\n\r\n "
},
{
"path": "Android_app/pioneer/consumer-rules.pro",
"chars": 0,
"preview": ""
},
{
"path": "Android_app/pioneer/proguard-rules.pro",
"chars": 770,
"preview": "# Add project specific ProGuard rules here.\r\n# You can control the set of applied configuration files using the\r\n# progu"
},
{
"path": "Android_app/pioneer/src/androidTest/java/com/ABC/pioneer/sensor/ExampleInstrumentedTest.java",
"chars": 788,
"preview": "package com.ABC.pioneer.sensor;\r\n\r\nimport android.content.Context;\r\n\r\nimport androidx.test.platform.app.InstrumentationR"
},
{
"path": "Android_app/pioneer/src/main/AndroidManifest.xml",
"chars": 1169,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n packag"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/DefaultSensorDelegate.java",
"chars": 1013,
"preview": "\n\npackage com.ABC.pioneer.sensor;\n\nimport com.ABC.pioneer.sensor.datatype.ImmediateSendData;\nimport com.ABC.pioneer.sens"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/Device.java",
"chars": 695,
"preview": "package com.ABC.pioneer.sensor;\n\nimport com.ABC.pioneer.sensor.datatype.TargetIdentifier;\n\nimport java.util.Date;\n\npubli"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/PayloadSupplier.java",
"chars": 625,
"preview": "// Copyright 2020 VMware, Inc.\n// SPDX-License-Identifier: Apache-2.0\n//\n\npackage com.ABC.pioneer.sensor;\n\nimport com."
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/Sensor.java",
"chars": 292,
"preview": "// Copyright 2020 VMware, Inc.\n// SPDX-License-Identifier: Apache-2.0\n//\n\npackage com.ABC.pioneer.sensor;\n\n///用于检测和跟踪各"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/SensorArray.java",
"chars": 2326,
"preview": "\n\npackage com.ABC.pioneer.sensor;\n\nimport android.content.Context;\n\nimport com.ABC.pioneer.sensor.ble.Configurations;\nim"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/SensorDelegate.java",
"chars": 1007,
"preview": "// Copyright 2020 VMware, Inc.\n// SPDX-License-Identifier: Apache-2.0\n//\n\npackage com.ABC.pioneer.sensor;\n\nimport com."
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/analysis/Sample.java",
"chars": 7187,
"preview": "\npackage com.ABC.pioneer.sensor.analysis;\n\npublic class Sample {\n protected long n = 0;\n protected double m1 = 0, "
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/BLEDatabaseDelegate.java",
"chars": 277,
"preview": "\npackage com.ABC.pioneer.sensor.ble;\n\n/// 代表接收注册表创建/更新/删除事件\npublic interface BLEDatabaseDelegate {\n void bleDatabaseD"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/BLEDevice.java",
"chars": 12399,
"preview": "\npackage com.ABC.pioneer.sensor.ble;\n\nimport android.bluetooth.BluetoothDevice;\nimport android.bluetooth.BluetoothGattCh"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/BLESensor.java",
"chars": 123,
"preview": "\npackage com.ABC.pioneer.sensor.ble;\n\nimport com.ABC.pioneer.sensor.Sensor;\n\npublic interface BLESensor extends Sensor {"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/BluetoothStateManager.java",
"chars": 327,
"preview": "\n\npackage com.ABC.pioneer.sensor.ble;\n\nimport com.ABC.pioneer.sensor.datatype.BluetoothState;\n\nimport java.util.Queue;\ni"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/BluetoothStateManagerDelegate.java",
"chars": 208,
"preview": "\npackage com.ABC.pioneer.sensor.ble;\n\nimport com.ABC.pioneer.sensor.datatype.BluetoothState;\n\npublic interface Bluetooth"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/Configurations.java",
"chars": 5682,
"preview": "\npackage com.ABC.pioneer.sensor.ble;\n\nimport com.ABC.pioneer.sensor.datatype.RandomSource;\nimport com.ABC.pioneer.sensor"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/Database.java",
"chars": 954,
"preview": "\npackage com.ABC.pioneer.sensor.ble;\n\nimport android.bluetooth.BluetoothDevice;\nimport android.bluetooth.le.ScanResult;\n"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/DeviceAttribute.java",
"chars": 150,
"preview": "\npackage com.ABC.pioneer.sensor.ble;\n //BLE设备属性\npublic enum DeviceAttribute {\n peripheral, state, operatingSystem,"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/DeviceDelegate.java",
"chars": 138,
"preview": "\npackage com.ABC.pioneer.sensor.ble;\n\npublic interface DeviceDelegate {\n void device(BLEDevice device, DeviceAttribut"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/DeviceOperatingSystem.java",
"chars": 139,
"preview": "\npackage com.ABC.pioneer.sensor.ble;\n\npublic enum DeviceOperatingSystem {\n android_tbc, android, ios_tbc, ios, ignore"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/DeviceState.java",
"chars": 121,
"preview": "\npackage com.ABC.pioneer.sensor.ble;\n\n/// BLE设备连接状态\npublic enum DeviceState {\n connecting, connected, disconnected\n}\n"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/DeviceUpdatedComparator.java",
"chars": 498,
"preview": "\n\npackage com.ABC.pioneer.sensor.ble;\n\nimport java.util.Comparator;\n//设备更新比较器\n//这里我们按最后一次更新的时间对device进行排序,以便于后续的操作\npubli"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/Receiver.java",
"chars": 610,
"preview": "\n\npackage com.ABC.pioneer.sensor.ble;\n\nimport com.ABC.pioneer.sensor.Sensor;\nimport com.ABC.pioneer.sensor.SensorDelegat"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/SpecificBLESensor.java",
"chars": 6005,
"preview": "\n\npackage com.ABC.pioneer.sensor.ble;\n\nimport android.content.Context;\n\nimport com.ABC.pioneer.sensor.PayloadSupplier;\ni"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/SpecificBluetoothStateManager.java",
"chars": 2848,
"preview": "\npackage com.ABC.pioneer.sensor.ble;\n\nimport android.bluetooth.BluetoothAdapter;\nimport android.content.BroadcastReceive"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/SpecificDatabase.java",
"chars": 10690,
"preview": "\n\npackage com.ABC.pioneer.sensor.ble;\n\nimport android.bluetooth.BluetoothDevice;\nimport android.bluetooth.le.ScanRecord;"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/SpecificReceiver.java",
"chars": 45317,
"preview": "\n\npackage com.ABC.pioneer.sensor.ble;\n\nimport android.bluetooth.BluetoothAdapter;\nimport android.bluetooth.BluetoothDevi"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/SpecificTransmitter.java",
"chars": 27132,
"preview": "\n\npackage com.ABC.pioneer.sensor.ble;\n\nimport android.bluetooth.BluetoothAdapter;\nimport android.bluetooth.BluetoothDevi"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/Timer.java",
"chars": 2465,
"preview": "\npackage com.ABC.pioneer.sensor.ble;\n\nimport android.content.Context;\nimport android.os.PowerManager;\n\nimport com.ABC.pi"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/TimerDelegate.java",
"chars": 118,
"preview": "\n\npackage com.ABC.pioneer.sensor.ble;\n\npublic interface TimerDelegate {\n\n void bleTimer(long currentTimeMillis);\n}\n"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/Transmitter.java",
"chars": 817,
"preview": "\npackage com.ABC.pioneer.sensor.ble;\n\nimport com.ABC.pioneer.sensor.Sensor;\nimport com.ABC.pioneer.sensor.SensorDelegate"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/TxPower.java",
"chars": 158,
"preview": "\npackage com.ABC.pioneer.sensor.ble;\n\npublic class TxPower {\n public final int value;\n\n public TxPower(int value) "
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/filter/BLEAppleManuSeg.java",
"chars": 594,
"preview": "\npackage com.ABC.pioneer.sensor.ble.filter;\n\nimport com.ABC.pioneer.sensor.datatype.Data;\n\npublic class BLEAppleManuSeg "
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/filter/BLEDeviceFilter.java",
"chars": 11606,
"preview": "\npackage com.ABC.pioneer.sensor.ble.filter;\n\nimport android.bluetooth.le.ScanRecord;\nimport android.content.Context;\n\nim"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/filter/BLEManuData.java",
"chars": 770,
"preview": "\n\npackage com.ABC.pioneer.sensor.ble.filter;\n\nimport com.ABC.pioneer.sensor.datatype.Data;\n\npublic class BLEManuData {\n "
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/filter/BLEParser.java",
"chars": 7022,
"preview": "\npackage com.ABC.pioneer.sensor.ble.filter;\n\nimport com.ABC.pioneer.sensor.datatype.Data;\nimport com.ABC.pioneer.sensor."
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/filter/BLEScanResponseData.java",
"chars": 406,
"preview": "\npackage com.ABC.pioneer.sensor.ble.filter;\n\nimport java.util.List;\n\npublic class BLEScanResponseData {\n public int d"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/filter/BLESeg.java",
"chars": 771,
"preview": "\npackage com.ABC.pioneer.sensor.ble.filter;\n\nimport com.ABC.pioneer.sensor.datatype.Data;\n\npublic class BLESeg {\n pub"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/filter/BLESegType.java",
"chars": 2061,
"preview": "\npackage com.ABC.pioneer.sensor.ble.filter;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/// BLE广告类型-注意:出于某些原因,我们仅列"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/ble/filter/BLEServiceData.java",
"chars": 732,
"preview": "\npackage com.ABC.pioneer.sensor.ble.filter;\n\nimport com.ABC.pioneer.sensor.datatype.Data;\n\npublic class BLEServiceData {"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/client/controller/PioneerClient.java",
"chars": 2392,
"preview": "package com.ABC.pioneer.sensor.client.controller;\r\n\r\nimport android.content.Context;\r\nimport java.io.IOException;\r\nimpor"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/data/BatteryLog.java",
"chars": 2371,
"preview": "package com.ABC.pioneer.sensor.data;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.cont"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/data/CalibrationLog.java",
"chars": 825,
"preview": "\npackage com.ABC.pioneer.sensor.data;\n\nimport android.content.Context;\n\nimport com.ABC.pioneer.sensor.DefaultSensorDeleg"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/data/ConcretePayloadDataFormatter.java",
"chars": 287,
"preview": "\npackage com.ABC.pioneer.sensor.data;\n\nimport com.ABC.pioneer.sensor.datatype.PayloadData;\n\npublic class ConcretePayload"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/data/ContactLog.java",
"chars": 2192,
"preview": "\npackage com.ABC.pioneer.sensor.data;\n\nimport android.content.Context;\n\nimport com.ABC.pioneer.sensor.DefaultSensorDeleg"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/data/DetectionLog.java",
"chars": 2991,
"preview": "\npackage com.ABC.pioneer.sensor.data;\n\nimport android.content.Context;\n\nimport com.ABC.pioneer.sensor.DefaultSensorDeleg"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/data/EventTimeIntervalLog.java",
"chars": 5266,
"preview": "\npackage com.ABC.pioneer.sensor.data;\n\nimport android.content.Context;\n\nimport com.ABC.pioneer.sensor.DefaultSensorDeleg"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/data/PayloadDataFormatter.java",
"chars": 184,
"preview": "\n\npackage com.ABC.pioneer.sensor.data;\n\nimport com.ABC.pioneer.sensor.datatype.PayloadData;\n\npublic interface PayloadDat"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/data/StatisticsLog.java",
"chars": 3880,
"preview": "\n\npackage com.ABC.pioneer.sensor.data;\n\nimport android.content.Context;\n\nimport com.ABC.pioneer.sensor.DefaultSensorDele"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/data/TextFile.java",
"chars": 3298,
"preview": "\npackage com.ABC.pioneer.sensor.data;\n\nimport android.content.Context;\nimport android.media.MediaScannerConnection;\nimpo"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Base64.java",
"chars": 3345,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\nimport java.io.ByteArrayOutputStream;\n\n/// 不依赖Android API 26+的Base64编码和解码\npub"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/BluetoothState.java",
"chars": 125,
"preview": "\n\npackage com.ABC.pioneer.sensor.datatype;\n\npublic enum BluetoothState {\n unsupported, poweredOn, poweredOff, resetti"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Calibration.java",
"chars": 1008,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\nimport androidx.annotation.NonNull;\n\nimport java.util.Objects;\n\n/// 用于解释传感器与目"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/CalibrationMeasurementUnit.java",
"chars": 182,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\n/// 测量单元,用于校准接近传输数据值,例如 BLE发射功率\npublic enum CalibrationMeasurementUnit {\n "
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Callback.java",
"chars": 113,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\n/// 通用回调函数\npublic interface Callback<T> {\n void accept(T value);\n}\n"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Data.java",
"chars": 12935,
"preview": "\n\npackage com.ABC.pioneer.sensor.datatype;\n\nimport java.nio.charset.Charset;\nimport java.util.Arrays;\n\n/// 原始字节数组数据\npubl"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Encounter.java",
"chars": 3024,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\n\n/// 遇到记录,描述某一时刻与目标"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Float16.java",
"chars": 2312,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\nimport java.nio.ByteBuffer;\nimport java.nio.ByteOrder;\n\n/// IEEE 754二进制16格式16"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/ImmediateSendData.java",
"chars": 201,
"preview": "\n\npackage com.ABC.pioneer.sensor.datatype;\n\npublic class ImmediateSendData {\n public final Data data;\n // 立即传输数据\n "
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/InertiaLocationReference.java",
"chars": 601,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\n/// 时间点上的加速度(x,y,z)以米/秒为单位\npublic class InertiaLocationReference implements L"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Int16.java",
"chars": 877,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\nimport java.util.Objects;\n\n/// 有符号整型 (16 位)\npublic class Int16 {\n public f"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Int32.java",
"chars": 895,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\nimport java.util.Objects;\n\n/// 有符号整型 (32位)\npublic class Int32 {\n public fi"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Int64.java",
"chars": 869,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\nimport java.util.Objects;\n\n/// 有符号整型 (64位)\npublic class Int64 {\n public fi"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Int8.java",
"chars": 857,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\nimport java.util.Objects;\n\n/// 有符号整型(8位)\npublic class Int8 {\n public final"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/LegacyPayload.java",
"chars": 806,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\nimport com.ABC.pioneer.sensor.ble.Configurations;\n\nimport java.util.UUID;\n\n//"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Location.java",
"chars": 569,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\nimport java.util.Date;\n\n/// 原始位置数据,用于估算间接接触\npublic class Location {\n /// 测"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/LocationReference.java",
"chars": 140,
"preview": "\n\npackage com.ABC.pioneer.sensor.datatype;\n\n/// 用于估算间接暴露的原始位置数据,例如 WGS84坐标\npublic interface LocationReference {\n Stri"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/PayloadData.java",
"chars": 1024,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\n/// 从目标接收到的加密有效负载数据。 这很可能是目标的实际永久标识符的加密数据报。\npublic class PayloadData extends "
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/PayloadSharingData.java",
"chars": 260,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\npublic class PayloadSharingData {\n public final RSSI rssi;\n public fina"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/PayloadTimestamp.java",
"chars": 325,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\nimport java.util.Date;\n\n/// 有效负载时间戳记通常应为Date,但将来可能会更改为UInt64以使用服务器同步的相对时间戳记。\n"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/PlacenameLocationReference.java",
"chars": 317,
"preview": "\n\npackage com.ABC.pioneer.sensor.datatype;\n\npublic class PlacenameLocationReference implements LocationReference {\n p"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Proximity.java",
"chars": 1460,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\nimport androidx.annotation.NonNull;\n\nimport java.util.Objects;\n\n/// 用于估算传感器与目"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/ProximityMeasurementUnit.java",
"chars": 195,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\n/// 用于解释邻近数据值的测量单元。\npublic enum ProximityMeasurementUnit {\n /// 接收信号强度指示,例"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/PseudoDeviceAddress.java",
"chars": 2468,
"preview": "\n\npackage com.ABC.pioneer.sensor.datatype;\n\nimport com.ABC.pioneer.sensor.ble.Configurations;\n\nimport java.util.Objects;"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/RSSI.java",
"chars": 606,
"preview": "\n\npackage com.ABC.pioneer.sensor.datatype;\n\n/// RSSI单位为dBm。\npublic class RSSI {\n public final int value;\n\n public "
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/RandomSource.java",
"chars": 3999,
"preview": "\n\npackage com.ABC.pioneer.sensor.datatype;\n\n\nimport java.security.SecureRandom;\nimport java.util.Random;\n\n/// 随机数据来源\npub"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/SensorState.java",
"chars": 182,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\n/// 传感器状态\npublic enum SensorState {\n /// 传感器开启,处于活动状态且可运行\n on,\n ///传"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/SensorType.java",
"chars": 155,
"preview": "\n\npackage com.ABC.pioneer.sensor.datatype;\n\n/// 传感器类型作为目标标识符的限定符\npublic enum SensorType {\n /// 低功耗蓝牙(BLE)\n BLE,\n "
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/SignalCharacteristicData.java",
"chars": 7652,
"preview": "\n\npackage com.ABC.pioneer.sensor.datatype;\n\nimport com.ABC.pioneer.sensor.ble.Configurations;\n\nimport java.nio.ByteBuffe"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/SignalCharacteristicDataType.java",
"chars": 146,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\npublic enum SignalCharacteristicDataType {\n rssi, payload, payloadSharing,"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/TargetIdentifier.java",
"chars": 1021,
"preview": "\n\npackage com.ABC.pioneer.sensor.datatype;\n\nimport android.bluetooth.BluetoothDevice;\n\nimport java.util.Objects;\nimport "
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/TimeInterval.java",
"chars": 1439,
"preview": "\n\npackage com.ABC.pioneer.sensor.datatype;\n\nimport java.util.Date;\nimport java.util.Objects;\n\n/// 时间间隔(以秒为单位)。\npublic cl"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Triple.java",
"chars": 429,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\npublic class Triple<A, B, C> {\n public final A a;\n public final B b;\n "
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/Tuple.java",
"chars": 285,
"preview": "\n\npackage com.ABC.pioneer.sensor.datatype;\n\npublic class Tuple<A, B> {\n public final A a;\n public final B b;\n\n "
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/UInt16.java",
"chars": 812,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\nimport java.util.Objects;\n\n/// 无符号数整数(16位)\npublic class UInt16 {\n public f"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/UInt32.java",
"chars": 829,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\nimport java.util.Objects;\n\n/// 无符号数整数(32位)\npublic class UInt32 {\n public f"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/UInt64.java",
"chars": 924,
"preview": "\n\npackage com.ABC.pioneer.sensor.datatype;\n\nimport java.util.Objects;\n\n/// 无符号数整数(8位)\npublic class UInt64 {\n public f"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/datatype/UInt8.java",
"chars": 794,
"preview": "\npackage com.ABC.pioneer.sensor.datatype;\n\nimport java.util.Objects;\n\n/// 无符号数整数(8位)\npublic class UInt8 {\n public fin"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/motion/ConcreteInertiaSensor.java",
"chars": 2851,
"preview": "\n\npackage com.ABC.pioneer.sensor.motion;\n\nimport android.content.Context;\nimport android.hardware.Sensor;\nimport android"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/motion/InertiaSensor.java",
"chars": 130,
"preview": "\npackage com.ABC.pioneer.sensor.motion;\n\nimport com.ABC.pioneer.sensor.Sensor;\n\npublic interface InertiaSensor extends S"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/BasicFunc.java",
"chars": 1128,
"preview": "\npackage com.ABC.pioneer.sensor.payload.Crypto;\n\n\nimport com.ABC.pioneer.sensor.datatype.Data;\n\n\n/// 基本功能\npublic class B"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/CipherParameters.java",
"chars": 143,
"preview": "package com.ABC.pioneer.sensor.payload.Crypto;\r\n\r\n/**\r\n * all parameter classes implement this.\r\n */\r\npublic interface C"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/ContactIdentifier.java",
"chars": 324,
"preview": "\npackage com.ABC.pioneer.sensor.payload.Crypto;\n\nimport com.ABC.pioneer.sensor.datatype.Data;\n\n/// 临时身份标识\npublic class C"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/ContactKey.java",
"chars": 218,
"preview": "\n\npackage com.ABC.pioneer.sensor.payload.Crypto;\n\nimport com.ABC.pioneer.sensor.datatype.Data;\n\n/// Contact key\npublic c"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/ContactKeySeed.java",
"chars": 229,
"preview": "\n\npackage com.ABC.pioneer.sensor.payload.Crypto;\n\nimport com.ABC.pioneer.sensor.datatype.Data;\n\n/// Contact key 种子\npubli"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/Digest.java",
"chars": 1404,
"preview": "package com.ABC.pioneer.sensor.payload.Crypto;\r\n\r\n/**\r\n * interface that a message digest conforms to.\r\n */\r\npublic inte"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/DigestRandomGenerator.java",
"chars": 2941,
"preview": "package com.ABC.pioneer.sensor.payload.Crypto;\r\n\r\n/**\r\n * Random generation based on the digest with counter. Calling ad"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/ExtendedDigest.java",
"chars": 345,
"preview": "package com.ABC.pioneer.sensor.payload.Crypto;\r\n\r\npublic interface ExtendedDigest\r\n extends Digest\r\n{\r\n /**\r\n "
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/GeneralDigest.java",
"chars": 2830,
"preview": "package com.ABC.pioneer.sensor.payload.Crypto;\r\n\r\npublic abstract class GeneralDigest implements ExtendedDigest,Memoable"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/GenerateKey.java",
"chars": 3977,
"preview": "\npackage com.ABC.pioneer.sensor.payload.Crypto;\n\nimport com.ABC.pioneer.sensor.datatype.TimeInterval;\n\nimport java.text."
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/HMACSHA256.java",
"chars": 663,
"preview": "package com.ABC.pioneer.sensor.payload.Crypto;\r\n\r\nimport java.util.Arrays;\r\n\r\npublic class HMACSHA256 {\r\n public stat"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/HMac.java",
"chars": 4706,
"preview": "package com.ABC.pioneer.sensor.payload.Crypto;\r\n\r\nimport java.util.Hashtable;\r\n\r\n/**\r\n * HMAC implementation based on RF"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/KeyParameter.java",
"chars": 541,
"preview": "package com.ABC.pioneer.sensor.payload.Crypto;\r\n\r\npublic class KeyParameter\r\n implements CipherParameters\r\n{\r\n "
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/Mac.java",
"chars": 1903,
"preview": "package com.ABC.pioneer.sensor.payload.Crypto;\r\n\r\n/**\r\n * The base interface for implementations of message authenticati"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/MatchingKey.java",
"chars": 312,
"preview": "\npackage com.ABC.pioneer.sensor.payload.Crypto;\n\nimport com.ABC.pioneer.sensor.datatype.Data;\n\n/// Matching key\npublic c"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/MatchingKeySeed.java",
"chars": 231,
"preview": "\npackage com.ABC.pioneer.sensor.payload.Crypto;\n\nimport com.ABC.pioneer.sensor.datatype.Data;\n\n/// Matching key种子\npublic"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/Memoable.java",
"chars": 416,
"preview": "package com.ABC.pioneer.sensor.payload.Crypto;\r\n\r\npublic interface Memoable\r\n{\r\n /**\r\n * copy this Memoable objec"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/PioneerHMac.java",
"chars": 586,
"preview": "package com.ABC.pioneer.sensor.payload.Crypto;\r\n\r\npublic class PioneerHMac {\r\n Digest digest;\r\n Mac hmac;\r\n\r\n p"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/PioneerHash.java",
"chars": 492,
"preview": "package com.ABC.pioneer.sensor.payload.Crypto;\r\n\r\npublic class PioneerHash {\r\n Digest digest;\r\n\r\n public PioneerHa"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/PioneerPRG.java",
"chars": 689,
"preview": "package com.ABC.pioneer.sensor.payload.Crypto;\r\n\r\nimport java.security.SecureRandom;\r\n\r\npublic class PioneerPRG {\r\n D"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/RandomGenerator.java",
"chars": 955,
"preview": "package com.ABC.pioneer.sensor.payload.Crypto;\r\n\r\n/**\r\n * Generic interface for objects generating random bytes.\r\n */\r\np"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/SM3Digest.java",
"chars": 7778,
"preview": "package com.ABC.pioneer.sensor.payload.Crypto;\r\n\r\n\r\npublic class SM3Digest\r\n extends GeneralDigest\r\n{\r\n privat"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/SecretKey.java",
"chars": 306,
"preview": "\npackage com.ABC.pioneer.sensor.payload.Crypto;\n\nimport com.ABC.pioneer.sensor.datatype.Data;\n\n/// Secret key\npublic cla"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/SpecificUsePayloadSupplier.java",
"chars": 7287,
"preview": "\npackage com.ABC.pioneer.sensor.payload.Crypto;\n\n\nimport com.ABC.pioneer.sensor.Device;\n\nimport com.ABC.pioneer.sensor.d"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/UsePayloadSupplier.java",
"chars": 193,
"preview": "\n\npackage com.ABC.pioneer.sensor.payload.Crypto;\n\nimport com.ABC.pioneer.sensor.PayloadSupplier;\n\n///简单的有效载荷数据提供者。 有效载荷数"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/Crypto/Util.java",
"chars": 1238,
"preview": "package com.ABC.pioneer.sensor.payload.Crypto;\r\n\r\npublic abstract class Util\r\n{\r\n public static int bigEndianToInt(by"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/DefaultPayloadSupplier.java",
"chars": 1370,
"preview": "\n\npackage com.ABC.pioneer.sensor.payload;\n\nimport com.ABC.pioneer.sensor.Device;\nimport com.ABC.pioneer.sensor.PayloadSu"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/DigitalSignature.java",
"chars": 362,
"preview": "package com.ABC.pioneer.sensor.payload;\r\n\r\nimport com.ABC.pioneer.sensor.datatype.Data;\r\n\r\npublic class DigitalSignature"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/extended/ConcreteExtendedDataSectionV1.java",
"chars": 445,
"preview": "package com.ABC.pioneer.sensor.payload.extended;\n\nimport com.ABC.pioneer.sensor.datatype.Data;\nimport com.ABC.pioneer.se"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/extended/ConcreteExtendedDataV1.java",
"chars": 4218,
"preview": "package com.ABC.pioneer.sensor.payload.extended;\n\nimport com.ABC.pioneer.sensor.datatype.Data;\nimport com.ABC.pioneer.se"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/payload/extended/ExtendedData.java",
"chars": 1159,
"preview": "package com.ABC.pioneer.sensor.payload.extended;\n\nimport com.ABC.pioneer.sensor.datatype.Data;\nimport com.ABC.pioneer.se"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/service/AlarmReceiver.java",
"chars": 5427,
"preview": "package com.ABC.pioneer.sensor.service;\r\n\r\nimport android.content.BroadcastReceiver;\r\nimport android.content.Context;\r\ni"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/service/Connection.java",
"chars": 3512,
"preview": "package com.ABC.pioneer.sensor.service;\r\n\r\nimport android.content.Context;\r\n\r\nimport com.ABC.pioneer.sensor.client.contr"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/service/CustomTimer.java",
"chars": 2426,
"preview": "package com.ABC.pioneer.sensor.service;\r\n\r\nimport android.app.AlarmManager;\r\nimport android.app.PendingIntent;\r\nimport a"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/service/ForegroundService.java",
"chars": 1656,
"preview": "// Copyright 2020 VMware, Inc.\n// SPDX-License-Identifier: Apache-2.0\n//\n\npackage com.ABC.pioneer.sensor.service;\n\nimp"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/service/MatchDelegate.java",
"chars": 104,
"preview": "package com.ABC.pioneer.sensor.service;\r\n\r\npublic interface MatchDelegate {\r\n void matchFound();\r\n}\r\n"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/service/NotificationService.java",
"chars": 1924,
"preview": "// Copyright 2020 VMware, Inc.\n// SPDX-License-Identifier: Apache-2.0\n//\n\npackage com.ABC.pioneer.sensor.service;\n\nimp"
},
{
"path": "Android_app/pioneer/src/main/java/com/ABC/pioneer/sensor/service/PioneerDb.java",
"chars": 6180,
"preview": "package com.ABC.pioneer.sensor.service;\r\n\r\nimport android.content.ContentValues;\r\nimport android.content.Context;\r\nimpor"
},
{
"path": "Android_app/pioneer/src/test/java/com/ABC/pioneer/sensor/ExampleUnitTest.java",
"chars": 399,
"preview": "package com.ABC.pioneer.sensor;\r\n\r\nimport org.junit.Test;\r\n\r\nimport static org.junit.Assert.*;\r\n\r\n/**\r\n * Example local "
},
{
"path": "Android_app/settings.gradle",
"chars": 64,
"preview": "include ':pioneer'\r\ninclude ':app'\r\nrootProject.name = \"Pioneer\""
},
{
"path": "IOS_app/Pioneer_ios/Pioneer Framework/Pioneer/ContactLogData/ContactLog.xcdatamodeld/.xccurrentversion",
"chars": 181,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "IOS_app/Pioneer_ios/Pioneer Framework/Pioneer/ContactLogData/ContactLog.xcdatamodeld/ContactLog.xcdatamodel/contents",
"chars": 906,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<model type=\"com.apple.IDECoreDataModeler.DataModel\" documentVer"
},
{
"path": "IOS_app/Pioneer_ios/Pioneer Framework/Pioneer/Crypto/CipherParameters.swift",
"chars": 151,
"preview": "//\n// CipherParameters.swift\n// Pioneer for IOS\n//\n// Created by Beh on 2025/3/2..\n//\n\nimport Foundation\n\npublic prot"
},
{
"path": "IOS_app/Pioneer_ios/Pioneer Framework/Pioneer/Crypto/Crypto.swift",
"chars": 699,
"preview": "//\n// Crypto.swift\n// Pioneer for IOS\n//\n// Created by Beh on 2025/3/2.\n//\n\nimport Foundation\n\npublic class Crypto {\n"
},
{
"path": "IOS_app/Pioneer_ios/Pioneer Framework/Pioneer/Crypto/Digest.swift",
"chars": 364,
"preview": "//\n// Digest.swift\n// Pioneer for IOS\n//\n// Created by Beh on 2025/3/2.\n//\n\nimport Foundation\n\npublic protocol Digest"
},
{
"path": "IOS_app/Pioneer_ios/Pioneer Framework/Pioneer/Crypto/DigestRandomNumber.swift",
"chars": 2705,
"preview": "//\n// DigestRandomNumber.swift\n// Pioneer for IOS\n//\n// Created by Beh on 2025/3/2.\n//\n\nimport Foundation\n\npublic cla"
},
{
"path": "IOS_app/Pioneer_ios/Pioneer Framework/Pioneer/Crypto/ExtendedDigest.swift",
"chars": 182,
"preview": "//\n// ExtendedDigest.swift\n// Pioneer for IOS\n//\n// Created by Beh on 2025/3/2.\n//\n\nimport Foundation\n\npublic protoco"
},
{
"path": "IOS_app/Pioneer_ios/Pioneer Framework/Pioneer/Crypto/GeneralDigest.swift",
"chars": 3374,
"preview": "//\n// GeneralDigest.swift\n// Pioneer for IOS\n//\n// Created by Beh on 2025/3/2.\n//\n\nimport Foundation\n\npublic class Ge"
},
{
"path": "IOS_app/Pioneer_ios/Pioneer Framework/Pioneer/Crypto/HMAC.swift",
"chars": 4148,
"preview": "//\n// HMac.swift\n// Pioneer for IOS\n//\n// Created by Beh on 2025/3/2.\n//\n\nimport Foundation\n\npublic class HMAC : MAC\n"
},
{
"path": "IOS_app/Pioneer_ios/Pioneer Framework/Pioneer/Crypto/KeyParameter.swift",
"chars": 524,
"preview": "//\n// KeyParameter.swift\n// Pioneer for IOS\n//\n// Created by Beh on 2025/3/2.\n//\n\nimport Foundation\n\npublic class Key"
},
{
"path": "IOS_app/Pioneer_ios/Pioneer Framework/Pioneer/Crypto/MAC.swift",
"chars": 391,
"preview": "//\n// Mac.swift\n// Pioneer for IOS\n//\n// Created by Beh on 2025/3/2.\n//\n\nimport Foundation\n\nprotocol MAC\n{\n func m"
},
{
"path": "IOS_app/Pioneer_ios/Pioneer Framework/Pioneer/Crypto/Memoable.swift",
"chars": 198,
"preview": "//\n// Memoable.swift\n// Pioneer for IOS\n//\n// Created by Beh on 2025/3/2.\n//\n\nimport Foundation\n\npublic protocol Memo"
},
{
"path": "IOS_app/Pioneer_ios/Pioneer Framework/Pioneer/Crypto/PioneerHMac.swift",
"chars": 744,
"preview": "//\n// PioneerHMac.swift\n// Pioneer for IOS\n//\n// Created by Beh on 2025/3/2.\n//\n\nimport Foundation\n\npublic class Pion"
},
{
"path": "IOS_app/Pioneer_ios/Pioneer Framework/Pioneer/Crypto/PioneerHash.swift",
"chars": 633,
"preview": "//\n// PioneerHash.swift\n// Pioneer for IOS\n//\n// Created by Beh on 2025/3/2.\n//\n\nimport Foundation\n\npublic class Pion"
},
{
"path": "IOS_app/Pioneer_ios/Pioneer Framework/Pioneer/Crypto/RandomGenerator.swift",
"chars": 357,
"preview": "//\n// RandomGenerator.swift\n// Pioneer for IOS\n//\n// Created by Beh on 2025/3/2.\n//\n\nimport Foundation\n\npublic protoc"
},
{
"path": "IOS_app/Pioneer_ios/Pioneer Framework/Pioneer/Crypto/SM3Digest.swift",
"chars": 5952,
"preview": "//\n// SM3Digest.swift\n// Pioneer for IOS\n//\n// Created by Beh on 2025/3/2.\n//\n\nimport Foundation\n\npublic class SM3Dig"
},
{
"path": "IOS_app/Pioneer_ios/Pioneer Framework/Pioneer/Crypto/Util.swift",
"chars": 1640,
"preview": "//\n// Util.swift\n// Pioneer for IOS\n//\n// Created by Beh on 2025/3/2.\n//\n\nimport Foundation\n\npublic class Util\n{\n "
},
{
"path": "IOS_app/Pioneer_ios/Pioneer Framework/Pioneer/Info.plist",
"chars": 752,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "IOS_app/Pioneer_ios/Pioneer Framework/Pioneer/Manager/Connection.swift",
"chars": 6346,
"preview": "//\n// Connection.swift\n// Pioneer\n//\n// Created by Beh on 2025/3/2.\n//\n\nimport Network\nimport Foundation\n\npublic clas"
}
]
// ... and 58 more files (download for full content)
About this extraction
This page contains the full source code of the lunan0320/Pioneer GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 258 files (672.7 KB), approximately 178.9k tokens, and a symbol index with 1026 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.