From c5b82eb6024d66c628ee1d350ffa5b7cdd0c29ce Mon Sep 17 00:00:00 2001 From: Asura146 Date: Wed, 14 Aug 2024 00:47:43 +0900 Subject: [PATCH] =?UTF-8?q?=E3=81=99=E3=81=B9=E3=81=A6=E3=81=AE=E3=83=90?= =?UTF-8?q?=E3=82=B0=E3=82=92=E4=BF=AE=E6=AD=A3=E3=80=82=E3=81=9F=E3=81=B6?= =?UTF-8?q?=E3=82=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/childguard/HomeFragment.java | 23 +- .../com/example/childguard/MainActivity.java | 268 ++++++++++-------- .../childguard/SurveillanceService.java | 30 +- 3 files changed, 180 insertions(+), 141 deletions(-) diff --git a/app/src/main/java/com/example/childguard/HomeFragment.java b/app/src/main/java/com/example/childguard/HomeFragment.java index 7ae943f..19f2ca4 100644 --- a/app/src/main/java/com/example/childguard/HomeFragment.java +++ b/app/src/main/java/com/example/childguard/HomeFragment.java @@ -20,7 +20,7 @@ import androidx.fragment.app.FragmentTransaction; * Use the {@link HomeFragment#newInstance} factory method to * create an instance of this fragment. */ -public class HomeFragment extends Fragment implements OnEventListener { +public class HomeFragment extends Fragment { // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER @@ -82,8 +82,8 @@ public class HomeFragment extends Fragment implements OnEventListener { public void onResume() { super.onResume(); Log.d("HomeFragment", "onResume: called"); - this.updateUiState(getIsInCarLocal()); Log.d("isIncar", "onResume: " + getIsInCarLocal()); + this.updateUiState(getIsInCarLocal()); this.updateBluetoothSituation(isBluetoothConnected()); } @@ -96,7 +96,7 @@ public class HomeFragment extends Fragment implements OnEventListener { SharedPreferences pref = requireActivity().getSharedPreferences("app_situation", requireActivity().MODE_PRIVATE); Boolean isInCar = pref.getBoolean("isInCarPref", false); Log.d("isInCarPref","isInCar"+ isInCar); - return pref.getBoolean("isInCarPref", false); + return isInCar; } //画面遷移メソッド @@ -118,6 +118,7 @@ public class HomeFragment extends Fragment implements OnEventListener { */ private boolean updateUiState(boolean isInCar) { Log.d("HomeFragment", "updateUiState: called"); + Log.d("HomeFragment", "updateUiState:"+isInCar); // Init TextView tv; FrameLayout fl; @@ -134,7 +135,7 @@ public class HomeFragment extends Fragment implements OnEventListener { return false; } - if (!isInCar) { + if (isInCar) { //乗車状態にする fl.setBackground(ResourcesCompat.getDrawable(getResources(), R.drawable.frame_style_orange, null)); tv.setText(GET_ON); @@ -150,7 +151,7 @@ public class HomeFragment extends Fragment implements OnEventListener { /** * Bluetoothの接続状態の画面を切り替える */ - private boolean updateBluetoothSituation(Boolean BluetoothConnect) { + boolean updateBluetoothSituation(Boolean BluetoothConnect) { FrameLayout frameLayout; TextView textView; ImageView imageView; @@ -185,11 +186,11 @@ public class HomeFragment extends Fragment implements OnEventListener { } - @Override - public boolean onEvent(boolean isInCar) {//乗車状態と降車状態の変更を受け取ってupdateUiState()に渡す - Log.d("HomeFragment", "onEvent: called"); - - return updateUiState(isInCar); - } +// @Override +// public boolean onEvent(boolean isInCar) {//乗車状態と降車状態の変更を受け取ってupdateUiState()に渡す +// Log.d("HomeFragment", "onEvent: called"); +// +// return updateUiState(isInCar); +// } } diff --git a/app/src/main/java/com/example/childguard/MainActivity.java b/app/src/main/java/com/example/childguard/MainActivity.java index c33344f..c2b28ec 100644 --- a/app/src/main/java/com/example/childguard/MainActivity.java +++ b/app/src/main/java/com/example/childguard/MainActivity.java @@ -25,7 +25,6 @@ import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.app.NotificationCompat; -import androidx.fragment.app.Fragment; import com.google.android.material.bottomnavigation.BottomNavigationView; import com.google.firebase.firestore.DocumentReference; @@ -46,7 +45,7 @@ public class MainActivity extends AppCompatActivity { DocumentReference mDocRef; - private HomeFragment homeFragment; + private HomeFragment homeFragment = HomeFragment.newInstance("test", "test");; public static final String TAG = "InspirationQuote"; @@ -86,19 +85,26 @@ public class MainActivity extends AppCompatActivity { BottomNavigationView bottomNavigationView = findViewById(R.id.nav_view); this.homeFragment = HomeFragment.newInstance("test", "test"); + if(savedInstanceState == null){ + getSupportFragmentManager().beginTransaction() + .replace(findViewById(R.id.fragmentContainerView).getId(), this.homeFragment) + .addToBackStack(null) + .commit(); + } bottomNavigationView.setOnNavigationItemSelectedListener(v -> - { if (v.getItemId() == findViewById(R.id.navigation_home).getId()) { + Log.d("MainActivity", "navigation_home: called"); findViewById(R.id.fab_scan_qr_code).setVisibility(FrameLayout.VISIBLE); getSupportFragmentManager().beginTransaction() .replace(findViewById(R.id.fragmentContainerView).getId(), this.homeFragment) .addToBackStack(null) .commit(); - firebaseLink(); + //firebaseLink(); } else if (v.getItemId() == findViewById(R.id.navigation_settings).getId()) { + Log.d("MainActivity", "navigation_settings: called"); findViewById(R.id.fab_scan_qr_code).setVisibility(FrameLayout.GONE); getSupportFragmentManager().beginTransaction() .replace(findViewById(R.id.fragmentContainerView).getId(), SettingFragment.newInstance()) @@ -116,7 +122,6 @@ public class MainActivity extends AppCompatActivity { ScanOptions options = new ScanOptions(); options.setPrompt("QRコードを読み取ってください"); QrLauncher.launch(options); - }); //Bluetooth検知機能 @@ -141,14 +146,48 @@ public class MainActivity extends AppCompatActivity { @Override protected void onResume() { super.onResume(); - Log.d("onResume", "called"); - Log.d("onResume", "mDocRef is null"); + Log.d("MainActivity onResume", "called"); +// Log.d("MainActivity onResume", "mDocRef is null"); firebaseLink(); } + /** + * 乗車状態の変更 + */ + public void changeIsInCar() { + //共有プリファレンス全体の準備 + SharedPreferences sharedPreferences = MainActivity.this.getSharedPreferences("app_situation", MODE_PRIVATE); + //共有プリファレンス 書き込みの準備 + SharedPreferences.Editor E = sharedPreferences.edit(); + SharedPreferences.Editor E2 = sharedPreferences.edit(); + String IdPref = sharedPreferences.getString("ID", null);//アプリに記録されているIDの取得 + Log.d("MainActivity", "changeIsInCar: ID= " + IdPref); + boolean change = sharedPreferences.getBoolean("change", false); + Log.d("MainActivity", "changeIsInCar: " + change); + db = FirebaseFirestore.getInstance();//Firebaseとの紐づけ + DocumentReference isReported = db.collection("status").document(IdPref);//更新するドキュメントとの紐づけ + Map DEFAULT_ITEM = new HashMap<>();//mapの宣言 + if (!change) { + //isInCarをtrueに更新 + Log.d("MainActivity", "change:"+change); + E.putBoolean("change", true); + E.apply(); + Log.d("MainActivity", "change:"+sharedPreferences.getBoolean("change",false)); + } else { + Log.d("MainActivity", "change:"+change); + E.putBoolean("change", false); + E.apply(); + Log.d("MainActivity", "change:"+sharedPreferences.getBoolean("change",false)); + } + Log.d("MainActivity", "changeIsInCar: "+sharedPreferences.getBoolean("change",false)); + isReported.update("isInCar", sharedPreferences.getBoolean("change",false)).addOnSuccessListener(unused -> Log.d(TAG, "DocumentSnapshot successfully updated!!")).addOnFailureListener(e -> Log.w(TAG, "Error updating document", e)); + E2.putBoolean("isInCarPref", sharedPreferences.getBoolean("change",false)); + E2.apply(); + } - private void initNotification(DocumentReference mDocRef) {//サイト上で押されたボタンの管理 + private void updateIsInCarPref(DocumentReference mDocRef) {//サイト上で押されたボタンの管理 // 共有プリファレンス全体の準備 SharedPreferences sharedPreferences = getSharedPreferences("app_situation", MODE_PRIVATE); + Log.d("MainActivity", "updateIsInCarPref: called"); mDocRef.addSnapshotListener(this, (documentSnapshot, e) -> { @@ -157,31 +196,31 @@ public class MainActivity extends AppCompatActivity { SharedPreferences.Editor E = sharedPreferences.edit(); //車の乗り降りを管理するtrue=乗車、false=降車 if (documentSnapshot.exists()) {//exists()でdocumentSnapshotの中のファイルの存在の確認 - Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragmentContainerView); - Boolean isInCar = sharedPreferences.getBoolean("isInCarPref", false);//現在の乗降状態を保存する共有プリファレンス - E.putBoolean("isInCarPref", documentSnapshot.getBoolean("isInCar"));//乗降状態の判定 +// Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragmentContainerView); +// Boolean isInCar = sharedPreferences.getBoolean("isInCarPref", false);//現在の乗降状態を保存する共有プリファレンス + E.putBoolean("isInCarPref", documentSnapshot.getBoolean("isInCar"));//乗降状態の更新 E.apply();//確定処理 Log.d("nt", "レスポンスを検知しました1"); //FireBaseで更新された情報の判定 - if (!documentSnapshot.getBoolean("isReported")) {//isReportedがfalseのとき=サイト上で保護者ボタンが押されたとき - if (fragment instanceof HomeFragment) {//fragmentがHomeFragmentのインスタンスかの判定 -// changes-situation();// changes-situation()メソッドを処理→アプリ側の乗降状態を変化 - ((HomeFragment) fragment).onEvent(!isInCar); - } - } else if (isInCar) {//第三者ボタンが押されたときにisInCarがtrueのとき=乗車状態のとき→いたずら防止 - int importance = NotificationManager.IMPORTANCE_DEFAULT; - NotificationChannel channel = new NotificationChannel("CHANNEL_ID", "通報通知", importance); - channel.setDescription("第3者からの通報を検知しました"); - NotificationManager notificationManager = getSystemService(NotificationManager.class); - notificationManager.createNotificationChannel(channel); - Log.d("nt", "レスポンスを検知しました2"); - NotificationSetting();//通知に関する設定のメソッド - Notification(getApplicationContext());//通知を行うメソッド - ResetReported();// ResetReported();メソッドを処理→FireBaseのisReportedをfalseにする - } else {//第三者ボタンが押されたときにisInCarがfalseのとき=降車状態のとき - ResetReported();// ResetReported();を処理→FireBaseのisReportedをfalseにする - Log.d("nt", "何もなし"); - } +// if (!documentSnapshot.getBoolean("isReported")) {//isReportedがfalseのとき=サイト上で保護者ボタンが押されたとき +// if (fragment instanceof HomeFragment) {//fragmentがHomeFragmentのインスタンスかの判定 +//// changes-situation();// changes-situation()メソッドを処理→アプリ側の乗降状態を変化 +//// ((HomeFragment) fragment).onEvent(!isInCar); +// } +// } else if (isInCar) {//第三者ボタンが押されたときにisInCarがtrueのとき=乗車状態のとき→いたずら防止 +// int importance = NotificationManager.IMPORTANCE_DEFAULT; +// NotificationChannel channel = new NotificationChannel("CHANNEL_ID", "通報通知", importance); +// channel.setDescription("第3者からの通報を検知しました"); +// NotificationManager notificationManager = getSystemService(NotificationManager.class); +// notificationManager.createNotificationChannel(channel); +// Log.d("nt", "レスポンスを検知しました2"); +// NotificationSetting();//通知に関する設定のメソッド +// Notification(getApplicationContext());//通知を行うメソッド +// ResetReported();// ResetReported();メソッドを処理→FireBaseのisReportedをfalseにする +// } else {//第三者ボタンが押されたときにisInCarがfalseのとき=降車状態のとき +// ResetReported();// ResetReported();を処理→FireBaseのisReportedをfalseにする +// Log.d("nt", "何もなし"); +// } } }); } @@ -229,115 +268,95 @@ public class MainActivity extends AppCompatActivity { * FireBaseのIDの取得 */ public void firebaseLink() {//Firebaseのドキュメントの取得 + Log.d("MainActivity", "firebaseLink: called"); //共有プリファレンス全体の準備 SharedPreferences sharedPreferences = getSharedPreferences("app_situation", MODE_PRIVATE); String IdPref = sharedPreferences.getString("ID", null);//アプリに記録されているIDの取得 - if (IdPref == null) {//FireBaseのIDがアプリに登録されているとき + if (IdPref == null) { Log.d("onResume", "ID not initialized."); } else { mDocRef = FirebaseFirestore.getInstance().document("status/" + IdPref);//現在の位置を取得 - initNotification(mDocRef);//現在の位置を引数に initNotification()を処理 + //updateIsInCarPref(mDocRef);//現在の位置を引数に initNotification()を処理 } } /** * FireBaseのisReportedをfalseに初期化するメソッド */ - public void ResetReported() { - //共有プリファレンス全体の準備 - SharedPreferences sharedPreferences = MainActivity.this.getSharedPreferences("app_situation", MODE_PRIVATE); - String IdPref = sharedPreferences.getString("ID", null);//アプリに記録されているIDの取得 - db = FirebaseFirestore.getInstance();//Firebaseとの紐づけ - DocumentReference isReported = db.collection("status").document(IdPref);//更新するドキュメントとの紐づけ - Map DEFAULT_ITEM = new HashMap<>();//mapの宣言 - //isReportedをfalseに更新 - isReported.update("isReported", false).addOnSuccessListener(unused -> Log.d(TAG, "DocumentSnapshot successfully updated!")).addOnFailureListener(e -> Log.w(TAG, "Error updating document", e)); - } +// public void ResetReported() { +// //共有プリファレンス全体の準備 +// SharedPreferences sharedPreferences = MainActivity.this.getSharedPreferences("app_situation", MODE_PRIVATE); +// String IdPref = sharedPreferences.getString("ID", null);//アプリに記録されているIDの取得 +// db = FirebaseFirestore.getInstance();//Firebaseとの紐づけ +// DocumentReference isReported = db.collection("status").document(IdPref);//更新するドキュメントとの紐づけ +// Map DEFAULT_ITEM = new HashMap<>();//mapの宣言 +// //isReportedをfalseに更新 +// isReported.update("isReported", false).addOnSuccessListener(unused -> Log.d(TAG, "DocumentSnapshot successfully updated!")).addOnFailureListener(e -> Log.w(TAG, "Error updating document", e)); +// } + - /** - * 乗車状態の変更 - */ - public void changeIsInCar() { - //共有プリファレンス全体の準備 - SharedPreferences sharedPreferences = MainActivity.this.getSharedPreferences("app_situation", MODE_PRIVATE); - //共有プリファレンス 書き込みの準備 - SharedPreferences.Editor E = sharedPreferences.edit(); - String IdPref = sharedPreferences.getString("ID", null);//アプリに記録されているIDの取得 - Boolean change = sharedPreferences.getBoolean("change", false); - db = FirebaseFirestore.getInstance();//Firebaseとの紐づけ - DocumentReference isReported = db.collection("status").document(IdPref);//更新するドキュメントとの紐づけ - Map DEFAULT_ITEM = new HashMap<>();//mapの宣言 - if (!change) { - //isInCarをtrueに更新 - E.putBoolean("change", true); - } else { - E.putBoolean("change", false); - } - isReported.update("isInCar", change).addOnSuccessListener(unused -> Log.d(TAG, "DocumentSnapshot successfully updated!")).addOnFailureListener(e -> Log.w(TAG, "Error updating document", e)); - E.apply(); - } /** * 第三者通知に関する設定のメソッド */ - public void NotificationSetting() {//通知に関する設定の処理を行うメソッド - int importance = NotificationManager.IMPORTANCE_DEFAULT; - //通知チャネルの実装 - NotificationChannel channel = new NotificationChannel("CHANNEL_ID", "通知", importance); - channel.setDescription("第三者により置き去りの通報が行われたときに通知します。"); - - NotificationManager notificationManager = getSystemService(NotificationManager.class); - notificationManager.createNotificationChannel(channel); - } +// public void NotificationSetting() {//通知に関する設定の処理を行うメソッド +// int importance = NotificationManager.IMPORTANCE_DEFAULT; +// //通知チャネルの実装 +// NotificationChannel channel = new NotificationChannel("CHANNEL_ID", "通知", importance); +// channel.setDescription("第三者により置き去りの通報が行われたときに通知します。"); +// +// NotificationManager notificationManager = getSystemService(NotificationManager.class); +// notificationManager.createNotificationChannel(channel); +// } /** * 第三者通知を行うメソッド */ - public void Notification(Context context) {//実際に通知を行うメソッド - final String CHANNEL_ID = "my_channel_id"; - // 通知がクリックされたときに送信されるIntent - Intent intent = new Intent(context, MainActivity.class); - intent.setAction("OPEN_ACTIVITY"); - // PendingIntentの作成 - int requestCode = 100; - int flags = 0; - PendingIntent pendingIntent = PendingIntent.getActivity(context, requestCode, intent, flags | PendingIntent.FLAG_IMMUTABLE); - - ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).vibrate(2000);//バイブレーション - - @SuppressLint("NotificationTrampoline") NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "CHANNEL_ID") - .setSmallIcon(android.R.drawable.ic_menu_info_details) - .setContentTitle("子供の置き去りをしていませんか?")//通知のタイトル - .setContentText("第三者からの通報が行われました。")//通知の本文 - .setContentIntent(pendingIntent)//通知をタップするとActivityへ移動する - .setAutoCancel(true)//通知をタップすると削除する - .setPriority(NotificationCompat.PRIORITY_HIGH) // プライオリティを高く設定 - .setVisibility(NotificationCompat.VISIBILITY_PUBLIC); // ロック画面に表示する - - // NotificationChannelの作成(Android 8.0以降) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - NotificationManager notificationManager = context.getSystemService(NotificationManager.class); - if (notificationManager != null) { - NotificationChannel channel = new NotificationChannel( - CHANNEL_ID, - "Channel Name", - NotificationManager.IMPORTANCE_HIGH - ); - - channel.setDescription("Channel Description"); - channel.enableLights(true); - channel.setLightColor(Color.RED); - channel.enableVibration(true); - notificationManager.createNotificationChannel(channel); - } - } - - - NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); - if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { - return; - } - notificationManager.notify(R.string.app_name, builder.build());//通知の表示 - } +// public void Notification(Context context) {//実際に通知を行うメソッド +// final String CHANNEL_ID = "my_channel_id"; +// // 通知がクリックされたときに送信されるIntent +// Intent intent = new Intent(context, MainActivity.class); +// intent.setAction("OPEN_ACTIVITY"); +// // PendingIntentの作成 +// int requestCode = 100; +// int flags = 0; +// PendingIntent pendingIntent = PendingIntent.getActivity(context, requestCode, intent, flags | PendingIntent.FLAG_IMMUTABLE); +// +// ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).vibrate(2000);//バイブレーション +// +// @SuppressLint("NotificationTrampoline") NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "CHANNEL_ID") +// .setSmallIcon(android.R.drawable.ic_menu_info_details) +// .setContentTitle("子供の置き去りをしていませんか?")//通知のタイトル +// .setContentText("第三者からの通報が行われました。")//通知の本文 +// .setContentIntent(pendingIntent)//通知をタップするとActivityへ移動する +// .setAutoCancel(true)//通知をタップすると削除する +// .setPriority(NotificationCompat.PRIORITY_HIGH) // プライオリティを高く設定 +// .setVisibility(NotificationCompat.VISIBILITY_PUBLIC); // ロック画面に表示する +// +// // NotificationChannelの作成(Android 8.0以降) +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { +// NotificationManager notificationManager = context.getSystemService(NotificationManager.class); +// if (notificationManager != null) { +// NotificationChannel channel = new NotificationChannel( +// CHANNEL_ID, +// "Channel Name", +// NotificationManager.IMPORTANCE_HIGH +// ); +// +// channel.setDescription("Channel Description"); +// channel.enableLights(true); +// channel.setLightColor(Color.RED); +// channel.enableVibration(true); +// notificationManager.createNotificationChannel(channel); +// } +// } +// +// +// NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); +// if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { +// return; +// } +// notificationManager.notify(R.string.app_name, builder.build());//通知の表示 +// } // public void NotificationBluetooth(Context context) {//実際に通知を行うメソッド // final String CHANNEL_ID = "my_channel_id"; @@ -433,6 +452,13 @@ public class MainActivity extends AppCompatActivity { Log.d("BT_Judge", "登録済み"); changeBluetooth(true); e.putBoolean("connection_status", true); + if(homeFragment == null ){ + Log.d("bluetooth", "homeFragment: null"); + } + + if(homeFragment != null && homeFragment.isVisible()){ + homeFragment.updateBluetoothSituation(true); + } } else { //登録していないデバイスだったときの処理 @@ -444,6 +470,10 @@ public class MainActivity extends AppCompatActivity { }else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) { //bluetoothデバイスが切断されたときの処理 changeBluetooth(false); + Log.d("bluetooth", "homeFragment: "+homeFragment); + if(homeFragment != null && homeFragment.isVisible()){ + homeFragment.updateBluetoothSituation(false); + } } } }; diff --git a/app/src/main/java/com/example/childguard/SurveillanceService.java b/app/src/main/java/com/example/childguard/SurveillanceService.java index db1b96c..5508906 100644 --- a/app/src/main/java/com/example/childguard/SurveillanceService.java +++ b/app/src/main/java/com/example/childguard/SurveillanceService.java @@ -220,8 +220,9 @@ public class SurveillanceService extends Service { editor.apply(); Log.d("nt", "レスポンスを検知しました1"); + Log.d("SurveillanceService", "Bluetooth: "+sharedPreferences.getBoolean("BluetoothStatusLocal", false)); - if (isInCar) { + if (isInCar&&!sharedPreferences.getBoolean("BluetoothStatusLocal", false)) { if (Boolean.TRUE.equals(documentSnapshot.getBoolean("isReported"))) { resetReported(); sendNotification(getApplicationContext(), REPORTED_NOTIFICATION); @@ -316,27 +317,32 @@ public class SurveillanceService extends Service { Log.d("BT_Judge", "Not registered device"); return; } - boolean isInCar = !getSharedPreferences("app_situation", MODE_PRIVATE).getBoolean("change", false); - if (!isInCar) { - Log.d("BT_Judge", "Not in car"); - return; - } + boolean isInCar = getSharedPreferences("app_situation", MODE_PRIVATE).getBoolean("change", false); +// if (!isInCar) { +// Log.d("BT_Judge", "Not in car"); +// return; +// } // ----------------------------------------------------- // debug log Log.d("BT", "Bluetooth device found: " + deviceHardwareAddress); Log.d("BT", "Registered device: " + registeredId); Log.d("BT", "Is in car: " + isInCar); - + SharedPreferences sharedPreferences = SurveillanceService.this.getSharedPreferences("app_situation", MODE_PRIVATE); + SharedPreferences.Editor E = sharedPreferences.edit(); String action = intent.getAction(); // may need to chain this to a recognizing function if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) { + E.putBoolean("BluetoothStatusLocal", false); // bluetoothが切断されたときに乗車状態のとき - notificationRunnable = () -> { - // 5分経過した時点でも車に乗っていない場合 - sendNotification(context, BLUETOOTH_NOTIFICATION); - }; + if (isInCar) { + notificationRunnable = () -> { + // 5分経過した時点でも車に乗っていない場合 + sendNotification(context, BLUETOOTH_NOTIFICATION); + }; + } handler.postDelayed(notificationRunnable, NOTIFICATION_DELAY); } else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) { + E.putBoolean("BluetoothStatusLocal", true); // 再接続された場合、通知をキャンセルする if (notificationRunnable != null) { handler.removeCallbacks(notificationRunnable); @@ -344,6 +350,8 @@ public class SurveillanceService extends Service { Log.d("BT", "Notification canceled due to reconnection"); } } + E.apply(); + Log.d("SurveillanceService:BT", "Bluetooth status: " + sharedPreferences.getBoolean("BluetoothStatusLocal", false)); } }; -- 2.45.1