From a87a2d150a291312218b30908498ff2e0d21312f Mon Sep 17 00:00:00 2001 From: it232115 Date: Fri, 19 Jan 2024 00:57:33 +0900 Subject: [PATCH 1/9] =?UTF-8?q?=E3=83=90=E3=83=83=E3=82=AF=E3=82=B0?= =?UTF-8?q?=E3=83=A9=E3=82=A6=E3=83=B3=E3=83=89=E4=B8=AD=E3=81=AE=E7=AC=AC?= =?UTF-8?q?=E4=B8=89=E8=80=85=E9=80=9A=E5=A0=B1=E3=81=AB=E3=82=88=E3=82=8A?= =?UTF-8?q?=E3=83=90=E3=82=A4=E3=83=96=E3=83=AC=E3=83=BC=E3=82=B7=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E3=82=92=E3=81=AA=E3=82=89=E3=81=9B=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 1 - .../com/example/childguard/HomeFragment.java | 13 +- .../com/example/childguard/MainActivity.java | 152 ++++++++--------- .../main/java/com/example/childguard/QR.java | 33 ---- .../com/example/childguard/QRFragment.java | 125 -------------- .../example/childguard/QrPrintFragment.java | 156 ------------------ .../example/childguard/SettingFragment.java | 13 +- .../com/example/childguard/TestService.java | 112 ++++++++++--- 8 files changed, 175 insertions(+), 430 deletions(-) delete mode 100644 app/src/main/java/com/example/childguard/QR.java delete mode 100644 app/src/main/java/com/example/childguard/QRFragment.java delete mode 100644 app/src/main/java/com/example/childguard/QrPrintFragment.java diff --git a/.idea/misc.xml b/.idea/misc.xml index 0ad17cb..8978d23 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/app/src/main/java/com/example/childguard/HomeFragment.java b/app/src/main/java/com/example/childguard/HomeFragment.java index a9358b0..59efc75 100644 --- a/app/src/main/java/com/example/childguard/HomeFragment.java +++ b/app/src/main/java/com/example/childguard/HomeFragment.java @@ -110,7 +110,7 @@ public class HomeFragment extends Fragment implements OnEventListener{ transaction.commit(); } - private boolean updateUiState(boolean state) { + private boolean updateUiState(boolean isInCar) { Log.d("HomeFragment", "updateUiState: called"); // Init TextView tv; @@ -123,13 +123,13 @@ public class HomeFragment extends Fragment implements OnEventListener{ return false; } catch (IllegalStateException e) { Log.d("HomeFragment", "updateUiState: view is not attached"); -// getParentFragmentManager().beginTransaction().replace(R.id.fragmentContainerView, HomeFragment.newInstance("test", "test")).commit(); -// updateUiState(state); + getParentFragmentManager().beginTransaction().replace(R.id.fragmentContainerView, HomeFragment.newInstance("test", "test")).commit(); + updateUiState(isInCar); return false; } String get_on = "\n乗車状態"; String get_off = "\n降車状態"; - if (state) { + if (!isInCar) { //乗車状態にする fl.setBackground(ResourcesCompat.getDrawable(getResources(), R.drawable.frame_style_orange, null)); tv.setText(get_on); @@ -143,9 +143,10 @@ public class HomeFragment extends Fragment implements OnEventListener{ } @Override - public boolean onEvent(boolean state) { + public boolean onEvent(boolean isInCar) { Log.d("HomeFragment", "onEvent: called"); - return updateUiState(state); + + 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 797253a..3379dbd 100644 --- a/app/src/main/java/com/example/childguard/MainActivity.java +++ b/app/src/main/java/com/example/childguard/MainActivity.java @@ -1,15 +1,5 @@ package com.example.childguard; -import static java.security.AccessController.getContext; - -import androidx.activity.result.ActivityResultLauncher; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AppCompatActivity; -import androidx.browser.customtabs.CustomTabsIntent; -import androidx.core.app.ActivityCompat; -import androidx.core.app.NotificationCompat; -import androidx.core.app.NotificationManagerCompat; - import android.annotation.SuppressLint; import android.app.NotificationChannel; import android.app.NotificationManager; @@ -18,50 +8,49 @@ import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothManager; import android.content.BroadcastReceiver; import android.content.Context; -import android.content.SharedPreferences; import android.content.Intent; import android.content.IntentFilter; +import android.content.SharedPreferences; import android.content.pm.PackageManager; -import android.graphics.Color; -import android.graphics.Paint; import android.net.Uri; import android.os.Bundle; import android.os.Vibrator; - -import com.google.android.material.bottomnavigation.BottomNavigationView; - -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Random; -import java.util.UUID; - import android.preference.PreferenceManager; import android.util.Log; import android.widget.FrameLayout; -import android.widget.TextView; import android.widget.Toast; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; -import androidx.core.content.res.ResourcesCompat; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; +import androidx.browser.customtabs.CustomTabsIntent; +import androidx.core.app.ActivityCompat; +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationManagerCompat; import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; +import com.google.android.gms.tasks.OnFailureListener; +import com.google.android.gms.tasks.OnSuccessListener; +import com.google.android.material.bottomnavigation.BottomNavigationView; import com.google.firebase.firestore.DocumentReference; import com.google.firebase.firestore.DocumentSnapshot; import com.google.firebase.firestore.EventListener; import com.google.firebase.firestore.FirebaseFirestore; import com.google.firebase.firestore.FirebaseFirestoreException; -import com.google.zxing.integration.android.IntentIntegrator; -import com.google.zxing.integration.android.IntentResult; import com.journeyapps.barcodescanner.ScanContract; import com.journeyapps.barcodescanner.ScanOptions; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.Future; + public class MainActivity extends AppCompatActivity { + FirebaseFirestore db; BluetoothManager bluetoothManager; BluetoothAdapter bluetoothAdapter; @@ -71,14 +60,8 @@ public class MainActivity extends AppCompatActivity { public static final String TAG = "InspirationQuote"; - boolean flg = false; - //↓日付を取得するやつ - public static String getNowDate() { - @SuppressLint("SimpleDateFormat") final DateFormat df = new SimpleDateFormat("yyy/MM/dd HH:mm:ss"); - final Date date = new Date(System.currentTimeMillis()); - return df.format(date); - } + private final ActivityResultLauncher QrLauncher = registerForActivityResult( new ScanContract(), @@ -105,7 +88,7 @@ public class MainActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); -// super.onStart(); + db = FirebaseFirestore.getInstance();//Firebaseとの紐づけ BottomNavigationView bottomNavigationView = findViewById(R.id.nav_view); @@ -170,55 +153,50 @@ public class MainActivity extends AppCompatActivity { if (IdPref == null) { Log.d("onResume", "ID not initialized."); } else { - mDocRef = FirebaseFirestore.getInstance().document("users/" + IdPref);//現在の位置を取得 - this.flg = false; + mDocRef = FirebaseFirestore.getInstance().document("status/" + IdPref);//現在の位置を取得 initNotification(mDocRef); } } private void initNotification(DocumentReference mDocRef) { - // Init pref SharedPreferences sharedPreferences = getSharedPreferences("app_situation",MODE_PRIVATE); mDocRef.addSnapshotListener(this, new EventListener() { @Override public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) { + Log.d("nt", "イベント開始"); //共有プリファレンス 書き込みの準備 - SharedPreferences.Editor E=sharedPreferences.edit(); + SharedPreferences.Editor E = sharedPreferences.edit(); //車の乗り降りを管理するtrue=乗車、false=降車 - boolean isInCar = sharedPreferences.getBoolean("car", false); - if (flg && documentSnapshot != null && documentSnapshot.exists()) { - - String parent = documentSnapshot.getString("parent"); + if (documentSnapshot.exists()) { + 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"); - - assert parent != null; - if (parent.equals("s")) {//FireBaseの更新情報が"S"のとき=サイト上で第三者ボタンが押されたとき - if (isInCar) { - 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"); - notifyMain(); - } - } else { - E.putBoolean("car", !isInCar); - E.apply(); - // SupportFragmentManagerが現在表示しているFragmentを取得 - Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragmentContainerView); + if (documentSnapshot.getBoolean("isReported")==false ) { if (fragment instanceof HomeFragment) { - ((HomeFragment) fragment).onEvent(!isInCar); - } else { - Log.d("nt", "HomeFragment is not visible"); + ((HomeFragment) fragment).onEvent(isInCar); } + }else if(isInCar){ + ResetReported(); + 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"); + notifyMain(); + } else{ + ResetReported(); + Log.d("nt", "何もなし" ); } - } - flg = true; - } + } + + } + }); } @@ -231,7 +209,7 @@ public class MainActivity extends AppCompatActivity { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); // may need to chain this to a recognizing function BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); - HomeFragment homeFragment=new HomeFragment(); +// HomeFragment homeFragment=new HomeFragment(); if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { Log.d("BT", "No permission to connect bluetooth devices"); @@ -289,17 +267,31 @@ public class MainActivity extends AppCompatActivity { } -// @Override -// public void onStop() { -// super.onStop(); -// Intent intent = new Intent(getApplication(), TestService.class); -// startService(intent); -// } + public void ResetReported(){ - //Bluetooth_setupの戻るボタン - public void setupBackButton(boolean enableBackButton) { - ActionBar actionBar = getSupportActionBar(); - actionBar.setDisplayHomeAsUpEnabled(enableBackButton); + SharedPreferences sharedPreferences = MainActivity.this.getSharedPreferences("app_situation", MODE_PRIVATE); + String IdPref = sharedPreferences.getString("ID", null); + db = FirebaseFirestore.getInstance();//Firebaseとの紐づけ + DocumentReference isReported = db.collection("status").document(IdPref); + Map DEFAULT_ITEM = new HashMap<>();//mapの宣言 + DEFAULT_ITEM.put("isReported", false); + isReported.update("isReported",false).addOnSuccessListener(new OnSuccessListener() { + @Override + public void onSuccess(Void unused) { + Log.d(TAG, "DocumentSnapshot successfully updated!"); + } + }).addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception e) { + Log.w(TAG, "Error updating document", e); + } + }); + } + @Override + public void onStop() { + super.onStop(); + Intent intent = new Intent(getApplication(), TestService.class); + startService(intent); } } diff --git a/app/src/main/java/com/example/childguard/QR.java b/app/src/main/java/com/example/childguard/QR.java deleted file mode 100644 index 1c9c094..0000000 --- a/app/src/main/java/com/example/childguard/QR.java +++ /dev/null @@ -1,33 +0,0 @@ -//package com.example.childguard; -// -//import android.graphics.Color; -//import android.graphics.drawable.Drawable; -//import android.os.Bundle; -//import android.widget.TextView; -// -//import androidx.appcompat.app.AppCompatActivity; -// -//public class QR extends AppCompatActivity { -// String get_on="乗車状態"; -// String get_off ="降車状態"; -// TextView tv=findViewById(R.id.situation); -// @Override -// protected void onCreate(Bundle savedInstanceState){ -// super.onCreate(savedInstanceState); -// setContentView(R.layout.fragment_qr); -// //多分いらないコード -// findViewById(R.id.camera).setOnClickListener( -// v -> { -// if(get_on.equals(tv.getText().toString())){ -// tv.setText(get_off); -// findViewById(R.id.situation_bg).setBackgroundColor(Color.parseColor("#dcdcdc")); -// } -// else { -// tv.setText(get_on); -// findViewById(R.id.situation_bg).setBackgroundColor(Color.parseColor("#ff4500")); -// } -// } -// ); -// } -// -//} diff --git a/app/src/main/java/com/example/childguard/QRFragment.java b/app/src/main/java/com/example/childguard/QRFragment.java deleted file mode 100644 index 5870462..0000000 --- a/app/src/main/java/com/example/childguard/QRFragment.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.example.childguard; - -import android.content.Intent; -import android.content.SharedPreferences; -import android.net.Uri; -import android.os.Bundle; - -import androidx.activity.result.ActivityResultLauncher; -import androidx.activity.result.contract.ActivityResultContracts; -import androidx.browser.customtabs.CustomTabsIntent; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentTransaction; - -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.Toast; - -import com.google.zxing.integration.android.IntentIntegrator; -import com.google.zxing.integration.android.IntentResult; -import com.journeyapps.barcodescanner.ScanContract; -import com.journeyapps.barcodescanner.ScanOptions; - -import java.util.Objects; - -/** - * A simple {@link Fragment} subclass. - * Use the {@link QRFragment#newInstance} factory method to - * create an instance of this fragment. - */ -public class QRFragment extends Fragment { - //QRコードから受け取ったURLの受け渡しの宣言 -// OnDataPass dataPass; - // TODO: Rename parameter arguments, choose names that match - // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER - private static final String ARG_PARAM1 = "param1"; - private static final String ARG_PARAM2 = "param2"; - - // TODO: Rename and change types of parameters - private String mParam1; - private String mParam2; - - public QRFragment() { - // Required empty public constructor - } - - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment QRFragment. - */ - // TODO: Rename and change types and number of parameters - public static QRFragment newInstance(String param1, String param2) { - QRFragment fragment = new QRFragment(); - Bundle args = new Bundle(); - args.putString(ARG_PARAM1, param1); - args.putString(ARG_PARAM2, param2); - fragment.setArguments(args); - return fragment; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (getArguments() != null) { - mParam1 = getArguments().getString(ARG_PARAM1); - mParam2 = getArguments().getString(ARG_PARAM2); - } - - - } - - private final ActivityResultLauncher fragmentLauncher = registerForActivityResult(new ScanContract(), - result -> { - String contents = result.getContents(); - if (contents == null) { - Toast.makeText(getContext(), "QRコードが読み取れませんでした", Toast.LENGTH_LONG).show(); - } else if (!contents.contains("https://practicefirestore1-8808c.web.app/")) { - Toast.makeText(getContext(), "Chiled Guardに対応するQRコードではありません", Toast.LENGTH_LONG).show(); - } else { - //URLの表示 - Toast.makeText(getContext(), contents, Toast.LENGTH_SHORT).show(); - //ブラウザを起動し、URL先のサイトを開く - CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); - CustomTabsIntent customTabsIntent = builder.build(); - customTabsIntent.launchUrl(requireContext(), Uri.parse(contents)); - } - - getParentFragmentManager().popBackStack(); - }); - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - // Inflate the layout for this fragment - View view = inflater.inflate(R.layout.fragment_qr, container, false); - - - Log.d("QRFragment", "onClick: called"); - //QRリーダ起動 - fragmentLauncher.launch(new ScanOptions()); - - return view; - } - //画面遷移メソッド - private void replaceFragment(Fragment fragment) { - // フラグメントマネージャーの取得 - FragmentManager manager = getParentFragmentManager(); // アクティビティではgetSupportFragmentManager()? - // フラグメントトランザクションの開始 - FragmentTransaction transaction = manager.beginTransaction(); - // レイアウトをfragmentに置き換え(追加) - transaction.replace(R.id.fragmentContainerView, fragment); - // 置き換えのトランザクションをバックスタックに保存する - transaction.addToBackStack(null); - // フラグメントトランザクションをコミット - transaction.commit(); - } -} - diff --git a/app/src/main/java/com/example/childguard/QrPrintFragment.java b/app/src/main/java/com/example/childguard/QrPrintFragment.java deleted file mode 100644 index 88ac807..0000000 --- a/app/src/main/java/com/example/childguard/QrPrintFragment.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.example.childguard; - -import static android.content.Context.MODE_PRIVATE; - -import android.content.SharedPreferences; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.drawable.BitmapDrawable; -import android.os.Bundle; - -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentTransaction; -import androidx.print.PrintHelper; - -import android.preference.PreferenceManager; -import android.util.AndroidRuntimeException; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.WriterException; -import com.journeyapps.barcodescanner.BarcodeEncoder; - -/** - * A simple {@link Fragment} subclass. - * Use the {@link QrPrintFragment#newInstance} factory method to - * create an instance of this fragment. - */ -public class QrPrintFragment extends Fragment { - - // TODO: Rename parameter arguments, choose names that match - // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER - private static final String ARG_PARAM1 = "param1"; - private static final String ARG_PARAM2 = "param2"; - - // TODO: Rename and change types of parameters - private String mParam1; - private String mParam2; - - public QrPrintFragment() { - // Required empty public constructor - } - - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment QrPrintFragment. - */ - // TODO: Rename and change types and number of parameters - public static QrPrintFragment newInstance(String param1, String param2) { - QrPrintFragment fragment = new QrPrintFragment(); - Bundle args = new Bundle(); - args.putString(ARG_PARAM1, param1); - args.putString(ARG_PARAM2, param2); - fragment.setArguments(args); - return fragment; - } - - @Override - public void onCreate (Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (getArguments() != null) { - mParam1 = getArguments().getString(ARG_PARAM1); - mParam2 = getArguments().getString(ARG_PARAM2); - - } - } - - // @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - //共有プリファレンス全体の準備 - SharedPreferences sharedPreferences = getActivity().getSharedPreferences("app_situation", MODE_PRIVATE); - //User毎のドメインを保存する - String IdPref=sharedPreferences.getString("ID",null); - // Inflate the layout for this fragment - View view=inflater.inflate(R.layout.fragment_qr_print, container, false);; - //固定のドメイン - String KoteiURL = "https://practicefirestore1-8808c.web.app/?id="; - //すべてのドメイン - String AllURL; - //IdPrefにの値が初期値の場合 - if(IdPref==null) { - //User毎のドメイン - String userURL = getArguments().getString("STR_KEY"); - //キー"ID"の値をuserURLの値にする - SharedPreferences.Editor e = sharedPreferences.edit(); - e.putString("ID", userURL); - //確定処理 - e.apply(); - //二つのドメインを合成する - AllURL=KoteiURL+userURL; - }else{ - //二つのドメインを合成する - AllURL=KoteiURL+IdPref; - } - - int size = 2500; - ImageView imageViewQrCode; - Bitmap QRGazou; - try { - //QRコード生成 - BarcodeEncoder barcodeEncoder = new BarcodeEncoder(); - Bitmap bitmapqr = barcodeEncoder.encodeBitmap(AllURL, BarcodeFormat.QR_CODE, size, size); - imageViewQrCode = (ImageView) view.findViewById(R.id.qr_view); - imageViewQrCode.setTranslationX(1000); - imageViewQrCode.setTranslationY(1000); - imageViewQrCode.setImageBitmap(bitmapqr); - } catch (WriterException e) { - throw new AndroidRuntimeException("Barcode Error.", e); - } - // 画像合成の準備 - // ここのエラーは直すと何故か動かなくなる。このままで動くので放置 - Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a_group_qr_sos); - Bitmap bitmap1 = ((BitmapDrawable) imageViewQrCode.getDrawable()).getBitmap(); - int width = bitmap.getWidth(); // 元ファイルの幅取得 - int height = bitmap.getHeight(); // 元ファイルの高さ取得 - QRGazou = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - //Canvasの準備 - Canvas canvas = new Canvas(QRGazou); - //画像のサイズの調整 - int disWidth = (width - bitmap1.getWidth()) / 2; - int disHeight = (int) ((height - bitmap1.getHeight()) / 1.3); - canvas.drawBitmap(bitmap, 0, 0, (Paint) null); // image, x座標, y座標, Paintインスタンス - canvas.drawBitmap(bitmap1, disWidth, disHeight, (Paint) null); // 画像合成 - //Androidからプリンターへ印刷指示を出すサポートライブラリ - PrintHelper printHelper = new PrintHelper(getActivity()); - printHelper.setColorMode(PrintHelper.COLOR_MODE_COLOR); - printHelper.setScaleMode(PrintHelper.SCALE_MODE_FIT); - printHelper.printBitmap("job_name", QRGazou); - HomeFragment homeFragment=new HomeFragment(); -// replaceFragment(homeFragment); - return view; - } - //画面遷移メソッド - private void replaceFragment(Fragment fragment) { - // フラグメントマネージャーの取得 - FragmentManager manager = getParentFragmentManager(); // アクティビティではgetSupportFragmentManager()? - // フラグメントトランザクションの開始 - FragmentTransaction transaction = manager.beginTransaction(); - // レイアウトをfragmentに置き換え(追加) - transaction.replace(R.id.fragmentContainerView, fragment); - // 置き換えのトランザクションをバックスタックに保存する - transaction.addToBackStack(null); - // フラグメントトランザクションをコミット - transaction.commit(); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/example/childguard/SettingFragment.java b/app/src/main/java/com/example/childguard/SettingFragment.java index 6fd9aa9..712e05e 100644 --- a/app/src/main/java/com/example/childguard/SettingFragment.java +++ b/app/src/main/java/com/example/childguard/SettingFragment.java @@ -76,18 +76,16 @@ public class SettingFragment extends Fragment { Toast.makeText(getActivity(), "再印刷", Toast.LENGTH_SHORT).show(); getParentFragmentManager().beginTransaction().addToBackStack(null).replace(R.id.fragmentContainerView, GenerateQrFragment.newInstance(sharedPreferences.getString("ID", "none"))).commit(); } else { - String valueParent = "placeholder"; - String valueBorn = "placeholder"; - Map user = new HashMap<>();//mapの宣言 + Map DEFAULT_ITEM = new HashMap<>();//mapの宣言 Log.d("HomeFragment", "onClick is called"); //mapに入れる - user.put("parent", valueParent); - user.put("born", valueBorn); + DEFAULT_ITEM.put("isInCar", false); + DEFAULT_ITEM.put("isReported", false); //新しいドキュメントにIDを作って追加 - db.collection("users") - .add(user) + db.collection("status") + .add(DEFAULT_ITEM) .addOnSuccessListener(documentReference -> { //成功したら //documentReference.getId()でID取得 @@ -95,6 +93,7 @@ public class SettingFragment extends Fragment { SharedPreferences.Editor e = sharedPreferences.edit(); // キー"alreadySaved"の値をtrueにする e.putBoolean("alreadySaved", true); + //確定処理 e.apply(); //画面遷移&ID受け渡し diff --git a/app/src/main/java/com/example/childguard/TestService.java b/app/src/main/java/com/example/childguard/TestService.java index 00c9c31..004db02 100644 --- a/app/src/main/java/com/example/childguard/TestService.java +++ b/app/src/main/java/com/example/childguard/TestService.java @@ -5,50 +5,101 @@ import android.app.NotificationManager; import android.app.Service; import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.IBinder; import android.os.Vibrator; import android.util.Log; +import android.widget.Toast; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.app.ActivityCompat; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; +import androidx.fragment.app.Fragment; + +import com.google.android.gms.tasks.OnFailureListener; +import com.google.android.gms.tasks.OnSuccessListener; +import com.google.firebase.firestore.DocumentReference; +import com.google.firebase.firestore.DocumentSnapshot; +import com.google.firebase.firestore.EventListener; +import com.google.firebase.firestore.FirebaseFirestore; +import com.google.firebase.firestore.FirebaseFirestoreException; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.Executor; public class TestService extends Service { + FirebaseFirestore db; + DocumentReference mDocRef; + public static final String TAG = "InspirationQuote"; + + + @Override public int onStartCommand(Intent intent, int flags, int startId) { - - - audioStart(); - - return START_NOT_STICKY; - + SharedPreferences sharedPreferences = getSharedPreferences("app_situation", MODE_PRIVATE); + String IdPref = sharedPreferences.getString("ID", null); + if (IdPref == null) { + Log.d("onResume", "ID not initialized."); + } else { + mDocRef = FirebaseFirestore.getInstance().document("status/" + IdPref);//現在の位置を取得 + initNotification(mDocRef); + } + return flags; } - private void audioStart(){ + private void initNotification(DocumentReference mDocRef) { + + // Init pref + SharedPreferences sharedPreferences = getSharedPreferences("app_situation",MODE_PRIVATE); + + mDocRef.addSnapshotListener( new EventListener() { + @Override + public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) { + + Log.d("nt", "イベント開始"); + //共有プリファレンス 書き込みの準備 + SharedPreferences.Editor E = sharedPreferences.edit(); + //車の乗り降りを管理するtrue=乗車、false=降車 + if (documentSnapshot.exists()) { + Boolean isInCar = sharedPreferences.getBoolean("isInCarPref", false);//現在の乗降状態を保存する共有プリファレンス + E.putBoolean("isInCarPref", documentSnapshot.getBoolean("isInCar"));//乗降状態の判定 + E.apply();//確定処理 + Log.d("nt", "レスポンスを検知しました1"); + if (documentSnapshot.getBoolean("isReported")==true && isInCar==true) { + ResetReported(); + 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"); + notifyMain(); + } else{ + ResetReported(); + Log.d("nt", "何もなし" ); + } + } + + } + + }); + } + public void notifyMain() { //↓通知をする際に起動するバイブレーション ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).vibrate(1000); - //通知のやつ↓ - 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"); //↓通知の詳細設定的な奴 NotificationCompat.Builder builder = new NotificationCompat - .Builder(this, "CHANNEL_ID") .setSmallIcon(android.R.drawable.ic_menu_info_details) .setContentTitle("通報検知") .setContentText("子供の置き去りを検知しました。") .setPriority(NotificationCompat.PRIORITY_DEFAULT); + NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling @@ -61,14 +112,31 @@ public class TestService extends Service { return; } notificationManager.notify(R.string.app_name, builder.build()); - } + public void ResetReported(){ + + SharedPreferences sharedPreferences =getSharedPreferences("app_situation", MODE_PRIVATE); + String IdPref = sharedPreferences.getString("ID", null); + db = FirebaseFirestore.getInstance();//Firebaseとの紐づけ + DocumentReference isReported = db.collection("status").document(IdPref); + Map DEFAULT_ITEM = new HashMap<>();//mapの宣言 + DEFAULT_ITEM.put("isReported", false); + isReported.update("isReported",false).addOnSuccessListener(new OnSuccessListener() { + @Override + public void onSuccess(Void unused) { + Log.d(TAG, "DocumentSnapshot successfully updated!"); + } + }).addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception e) { + Log.w(TAG, "Error updating document", e); + } + }); + } @Nullable @Override public IBinder onBind(Intent intent) { - - return null; } } \ No newline at end of file -- 2.45.1 From c196399c2403466bfccaea831195507fe6505318 Mon Sep 17 00:00:00 2001 From: it232115 Date: Fri, 19 Jan 2024 01:46:33 +0900 Subject: [PATCH 2/9] =?UTF-8?q?=E4=B9=97=E8=BB=8A=E7=8A=B6=E6=85=8B?= =?UTF-8?q?=E3=81=AE=E3=81=A8=E3=81=8D=E3=81=AB=E7=AC=AC=E4=B8=89=E8=80=85?= =?UTF-8?q?=E9=80=9A=E5=A0=B1=E3=82=92=E8=A1=8C=E3=81=86=E3=81=A8=E3=80=81?= =?UTF-8?q?FireBase=E3=81=A8=E3=81=AE=E5=90=8C=E6=9C=9F=E3=81=8C=E3=82=BA?= =?UTF-8?q?=E3=83=AC=E3=82=8B=E3=83=90=E3=82=B0=E3=82=92=E8=A7=A3=E6=B6=88?= =?UTF-8?q?=E3=81=97=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/childguard/MainActivity.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/example/childguard/MainActivity.java b/app/src/main/java/com/example/childguard/MainActivity.java index 3379dbd..4e358f3 100644 --- a/app/src/main/java/com/example/childguard/MainActivity.java +++ b/app/src/main/java/com/example/childguard/MainActivity.java @@ -146,6 +146,7 @@ public class MainActivity extends AppCompatActivity { @Override protected void onResume() { super.onResume(); + changessituation(); Log.d("onResume", "called"); Log.d("onResume", "mDocRef is null"); SharedPreferences sharedPreferences = getSharedPreferences("app_situation", MODE_PRIVATE); @@ -178,10 +179,9 @@ public class MainActivity extends AppCompatActivity { Log.d("nt", "レスポンスを検知しました1"); if (documentSnapshot.getBoolean("isReported")==false ) { if (fragment instanceof HomeFragment) { - ((HomeFragment) fragment).onEvent(isInCar); + changessituation(); } }else if(isInCar){ - ResetReported(); int importance = NotificationManager.IMPORTANCE_DEFAULT; NotificationChannel channel = new NotificationChannel("CHANNEL_ID", "通報通知", importance); channel.setDescription("第3者からの通報を検知しました"); @@ -189,6 +189,7 @@ public class MainActivity extends AppCompatActivity { notificationManager.createNotificationChannel(channel); Log.d("nt", "レスポンスを検知しました2"); notifyMain(); + ResetReported(); } else{ ResetReported(); Log.d("nt", "何もなし" ); @@ -274,7 +275,6 @@ public class MainActivity extends AppCompatActivity { db = FirebaseFirestore.getInstance();//Firebaseとの紐づけ DocumentReference isReported = db.collection("status").document(IdPref); Map DEFAULT_ITEM = new HashMap<>();//mapの宣言 - DEFAULT_ITEM.put("isReported", false); isReported.update("isReported",false).addOnSuccessListener(new OnSuccessListener() { @Override public void onSuccess(Void unused) { @@ -287,11 +287,22 @@ public class MainActivity extends AppCompatActivity { } }); } + + + public void changessituation(){ + SharedPreferences sharedPreferences = getSharedPreferences("app_situation",MODE_PRIVATE); + //共有プリファレンス 書き込みの準備 + SharedPreferences.Editor E = sharedPreferences.edit(); + Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragmentContainerView); + Boolean isInCar = sharedPreferences.getBoolean("isInCarPref", false);//現在の乗降状態を保存する共有プリファレンス + ((HomeFragment) fragment).onEvent(!isInCar); + } @Override public void onStop() { super.onStop(); Intent intent = new Intent(getApplication(), TestService.class); startService(intent); + } } -- 2.45.1 From 25bf332fa952e6ff991bb5be337278360a806c60 Mon Sep 17 00:00:00 2001 From: it232115 Date: Fri, 19 Jan 2024 02:33:56 +0900 Subject: [PATCH 3/9] =?UTF-8?q?=E5=90=84=E7=A8=AE=E3=82=B3=E3=83=A1?= =?UTF-8?q?=E3=83=B3=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0=20=E7=8F=BE?= =?UTF-8?q?=E6=99=82=E7=82=B9=E3=81=A7=E6=8A=8A=E6=8F=A1=E3=81=97=E3=81=A6?= =?UTF-8?q?=E3=81=84=E3=82=8B=E3=83=90=E3=82=B0=20=E3=83=BB=E9=99=8D?= =?UTF-8?q?=E8=BB=8A=E7=8A=B6=E6=85=8B=E3=81=AE=E3=81=A8=E3=81=8D=E3=81=AB?= =?UTF-8?q?QR=E3=83=AA=E3=83=BC=E3=83=80=E3=82=92=E8=B5=B7=E5=8B=95?= =?UTF-8?q?=E3=81=97=E6=88=BB=E3=82=8B=E3=81=A8=E3=82=A2=E3=83=97=E3=83=AA?= =?UTF-8?q?=E3=81=AE=E8=A1=A8=E7=A4=BA=E3=81=8C=E4=B9=97=E8=BB=8A=E7=8A=B6?= =?UTF-8?q?=E6=85=8B=E3=81=AB=E3=81=AA=E3=82=8B=20=E3=83=BB=E4=B9=97?= =?UTF-8?q?=E8=BB=8A=E7=8A=B6=E6=85=8B=E3=81=AE=E3=81=A8=E3=81=8D=E3=81=AB?= =?UTF-8?q?settings=E3=81=B8=E7=A7=BB=E5=8B=95=E3=81=97=E6=88=BB=E3=82=8B?= =?UTF-8?q?=E3=81=A8=E3=82=A2=E3=83=97=E3=83=AA=E3=81=AE=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E3=81=8C=E9=99=8D=E8=BB=8A=E7=8A=B6=E6=85=8B=E3=81=AB=E3=81=AA?= =?UTF-8?q?=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/childguard/MainActivity.java | 47 ++++++++++--------- .../com/example/childguard/TestService.java | 37 ++++++++------- 2 files changed, 44 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/com/example/childguard/MainActivity.java b/app/src/main/java/com/example/childguard/MainActivity.java index 4e358f3..eef2b67 100644 --- a/app/src/main/java/com/example/childguard/MainActivity.java +++ b/app/src/main/java/com/example/childguard/MainActivity.java @@ -149,18 +149,19 @@ public class MainActivity extends AppCompatActivity { changessituation(); Log.d("onResume", "called"); Log.d("onResume", "mDocRef is null"); + //共有プリファレンス全体の準備 SharedPreferences sharedPreferences = getSharedPreferences("app_situation", MODE_PRIVATE); - String IdPref = sharedPreferences.getString("ID", null); - if (IdPref == null) { + String IdPref = sharedPreferences.getString("ID", null);////アプリに記録されているIDの取得 + if (IdPref == null) {//FireBaseのIDがアプリに登録されているとき Log.d("onResume", "ID not initialized."); } else { mDocRef = FirebaseFirestore.getInstance().document("status/" + IdPref);//現在の位置を取得 - initNotification(mDocRef); + initNotification(mDocRef);//現在の位置を引数に initNotification()を処理 } } - private void initNotification(DocumentReference mDocRef) { - // Init pref + private void initNotification(DocumentReference mDocRef) {//サイト上で押されたボタンの管理 + // 共有プリファレンス全体の準備 SharedPreferences sharedPreferences = getSharedPreferences("app_situation",MODE_PRIVATE); mDocRef.addSnapshotListener(this, new EventListener() { @@ -171,27 +172,28 @@ public class MainActivity extends AppCompatActivity { //共有プリファレンス 書き込みの準備 SharedPreferences.Editor E = sharedPreferences.edit(); //車の乗り降りを管理するtrue=乗車、false=降車 - if (documentSnapshot.exists()) { + if (documentSnapshot.exists()) {//exists()でdocumentSnapshotの中のファイルの存在の確認 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"); - if (documentSnapshot.getBoolean("isReported")==false ) { - if (fragment instanceof HomeFragment) { - changessituation(); + //FireBaseで更新された情報の判定 + if (documentSnapshot.getBoolean("isReported")==false ) {//isReportedがfalseのとき=サイト上で保護者ボタンが押されたとき + if (fragment instanceof HomeFragment) {//fragementがHomeFragmentのインスタンスかの判定 + changessituation();// changessituation()メソッドを処理→アプリ側の乗降状態を変化 } - }else if(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"); - notifyMain(); - ResetReported(); - } else{ - ResetReported(); + notifyMain();// notifyMain()メソッドを処理→通知のメソッド + ResetReported();// ResetReported();メソッドを処理→FireBaseのisReportedをfalseにする + } else{//第三者ボタンが押されたときにisInCarがfalseのとき=降車状態のとき + ResetReported();// ResetReported();を処理→FireBaseのisReportedをfalseにする Log.d("nt", "何もなし" ); } } @@ -268,14 +270,14 @@ public class MainActivity extends AppCompatActivity { } - public void ResetReported(){ - + public void ResetReported(){//FireBaseのisReportedをfalseに初期化するメソッド + //共有プリファレンス全体の準備 SharedPreferences sharedPreferences = MainActivity.this.getSharedPreferences("app_situation", MODE_PRIVATE); - String IdPref = sharedPreferences.getString("ID", null); + String IdPref = sharedPreferences.getString("ID", null);//アプリに記録されているIDの取得 db = FirebaseFirestore.getInstance();//Firebaseとの紐づけ - DocumentReference isReported = db.collection("status").document(IdPref); + DocumentReference isReported = db.collection("status").document(IdPref);//更新するドキュメントとの紐づけ Map DEFAULT_ITEM = new HashMap<>();//mapの宣言 - isReported.update("isReported",false).addOnSuccessListener(new OnSuccessListener() { + isReported.update("isReported",false).addOnSuccessListener(new OnSuccessListener() {//isReportedをfalseに更新 @Override public void onSuccess(Void unused) { Log.d(TAG, "DocumentSnapshot successfully updated!"); @@ -289,7 +291,8 @@ public class MainActivity extends AppCompatActivity { } - public void changessituation(){ + public void changessituation(){//乗降状態の管理をするためにHomeFramgentを呼び出すメソッド + SharedPreferences sharedPreferences = getSharedPreferences("app_situation",MODE_PRIVATE); //共有プリファレンス 書き込みの準備 SharedPreferences.Editor E = sharedPreferences.edit(); @@ -298,10 +301,10 @@ public class MainActivity extends AppCompatActivity { ((HomeFragment) fragment).onEvent(!isInCar); } @Override - public void onStop() { + public void onStop() {//アプリをバックグラウンドにした時のメソッド super.onStop(); Intent intent = new Intent(getApplication(), TestService.class); - startService(intent); + startService(intent);//TestServiceを起動 } diff --git a/app/src/main/java/com/example/childguard/TestService.java b/app/src/main/java/com/example/childguard/TestService.java index 004db02..edbad14 100644 --- a/app/src/main/java/com/example/childguard/TestService.java +++ b/app/src/main/java/com/example/childguard/TestService.java @@ -40,23 +40,24 @@ public class TestService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { + //共有プリファレンス全体の準備 SharedPreferences sharedPreferences = getSharedPreferences("app_situation", MODE_PRIVATE); - String IdPref = sharedPreferences.getString("ID", null); - if (IdPref == null) { + String IdPref = sharedPreferences.getString("ID", null);//アプリに記録されているIDの取得 + if (IdPref == null) {//FireBaseのIDがアプリに登録されているとき Log.d("onResume", "ID not initialized."); } else { mDocRef = FirebaseFirestore.getInstance().document("status/" + IdPref);//現在の位置を取得 - initNotification(mDocRef); + initNotification(mDocRef);//現在の位置を引数に initNotification()を処理 } return flags; } - private void initNotification(DocumentReference mDocRef) { + private void initNotification(DocumentReference mDocRef) {//サイト上で押されたボタンの管理 - // Init pref + // 共有プリファレンス全体の準備 SharedPreferences sharedPreferences = getSharedPreferences("app_situation",MODE_PRIVATE); - - mDocRef.addSnapshotListener( new EventListener() { + //車の乗り降りを管理するtrue=乗車、false=降車 + mDocRef.addSnapshotListener( new EventListener() {//exists()でdocumentSnapshotの中のファイルの存在の確認 @Override public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) { @@ -64,22 +65,22 @@ public class TestService extends Service { //共有プリファレンス 書き込みの準備 SharedPreferences.Editor E = sharedPreferences.edit(); //車の乗り降りを管理するtrue=乗車、false=降車 - if (documentSnapshot.exists()) { + if (documentSnapshot.exists()) {//exists()でdocumentSnapshotの中のファイルの存在の確認 Boolean isInCar = sharedPreferences.getBoolean("isInCarPref", false);//現在の乗降状態を保存する共有プリファレンス E.putBoolean("isInCarPref", documentSnapshot.getBoolean("isInCar"));//乗降状態の判定 E.apply();//確定処理 Log.d("nt", "レスポンスを検知しました1"); - if (documentSnapshot.getBoolean("isReported")==true && isInCar==true) { - ResetReported(); + if (documentSnapshot.getBoolean("isReported")==true && isInCar==true) {//isReportedがtrueかつisInCarがtrueのとき=サイト上で第三者ボタンが押されたときに乗車状態のとき + ResetReported();// ResetReported();を処理→FireBaseのisReportedをfalseにする 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"); - notifyMain(); - } else{ - ResetReported(); + notifyMain();// notifyMain()メソッドを処理→通知のメソッド + } else{//それ以外のとき + ResetReported();//ResetReported();を処理→FireBaseのisReportedをfalseにする Log.d("nt", "何もなし" ); } } @@ -114,15 +115,15 @@ public class TestService extends Service { notificationManager.notify(R.string.app_name, builder.build()); } - public void ResetReported(){ - + public void ResetReported(){//FireBaseのisReportedをfalseに初期化するメソッド + //共有プリファレンス全体の準備 SharedPreferences sharedPreferences =getSharedPreferences("app_situation", MODE_PRIVATE); - String IdPref = sharedPreferences.getString("ID", null); + String IdPref = sharedPreferences.getString("ID", null);//アプリに記録されているIDの取得 db = FirebaseFirestore.getInstance();//Firebaseとの紐づけ - DocumentReference isReported = db.collection("status").document(IdPref); + DocumentReference isReported = db.collection("status").document(IdPref);//更新するドキュメントとの紐づけ Map DEFAULT_ITEM = new HashMap<>();//mapの宣言 DEFAULT_ITEM.put("isReported", false); - isReported.update("isReported",false).addOnSuccessListener(new OnSuccessListener() { + isReported.update("isReported",false).addOnSuccessListener(new OnSuccessListener() {//isReportedをfalseに更新 @Override public void onSuccess(Void unused) { Log.d(TAG, "DocumentSnapshot successfully updated!"); -- 2.45.1 From 0c8c7c3d771726798c83a11c774c842ebf372023 Mon Sep 17 00:00:00 2001 From: it232115 Date: Fri, 19 Jan 2024 04:28:17 +0900 Subject: [PATCH 4/9] =?UTF-8?q?=E3=83=90=E3=83=8A=E3=83=BC=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E3=82=92=E3=82=BF=E3=83=83=E3=83=97=E3=81=97=E3=81=9F?= =?UTF-8?q?=E6=99=82=E3=81=ABMainActivity=E3=82=92=E9=96=8B=E3=81=8F?= =?UTF-8?q?=E3=82=B3=E3=83=BC=E3=83=89=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=97?= =?UTF-8?q?=E3=81=BE=E3=81=97=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../childguard/NotificationReceiver.java | 16 ++++ .../com/example/childguard/TestService.java | 88 ++++++++++++------- 2 files changed, 70 insertions(+), 34 deletions(-) create mode 100644 app/src/main/java/com/example/childguard/NotificationReceiver.java diff --git a/app/src/main/java/com/example/childguard/NotificationReceiver.java b/app/src/main/java/com/example/childguard/NotificationReceiver.java new file mode 100644 index 0000000..8a5a2c9 --- /dev/null +++ b/app/src/main/java/com/example/childguard/NotificationReceiver.java @@ -0,0 +1,16 @@ +package com.example.childguard; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +public class NotificationReceiver extends BroadcastReceiver {//通知をクリックしたときにアプリを起動する処理 + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction() != null && intent.getAction().equals("OPEN_ACTIVITY")) {// 通知がクリックされたときの処理 + Intent openIntent = new Intent(context, MainActivity.class); // MainActivityを起動 + openIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(openIntent); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/childguard/TestService.java b/app/src/main/java/com/example/childguard/TestService.java index edbad14..1b962ec 100644 --- a/app/src/main/java/com/example/childguard/TestService.java +++ b/app/src/main/java/com/example/childguard/TestService.java @@ -1,17 +1,22 @@ package com.example.childguard; +import android.annotation.SuppressLint; import android.app.NotificationChannel; import android.app.NotificationManager; +import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; +import android.os.Build; import android.os.IBinder; import android.os.Vibrator; import android.util.Log; import android.widget.Toast; - +import android.content.Context; +import android.content.Intent; +import android.content.BroadcastReceiver; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.app.ActivityCompat; @@ -31,7 +36,7 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.Executor; -public class TestService extends Service { +public class TestService extends Service { FirebaseFirestore db; DocumentReference mDocRef; @@ -55,9 +60,9 @@ public class TestService extends Service { private void initNotification(DocumentReference mDocRef) {//サイト上で押されたボタンの管理 // 共有プリファレンス全体の準備 - SharedPreferences sharedPreferences = getSharedPreferences("app_situation",MODE_PRIVATE); + SharedPreferences sharedPreferences = getSharedPreferences("app_situation", MODE_PRIVATE); //車の乗り降りを管理するtrue=乗車、false=降車 - mDocRef.addSnapshotListener( new EventListener() {//exists()でdocumentSnapshotの中のファイルの存在の確認 + mDocRef.addSnapshotListener(new EventListener() {//exists()でdocumentSnapshotの中のファイルの存在の確認 @Override public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) { @@ -70,7 +75,7 @@ public class TestService extends Service { E.putBoolean("isInCarPref", documentSnapshot.getBoolean("isInCar"));//乗降状態の判定 E.apply();//確定処理 Log.d("nt", "レスポンスを検知しました1"); - if (documentSnapshot.getBoolean("isReported")==true && isInCar==true) {//isReportedがtrueかつisInCarがtrueのとき=サイト上で第三者ボタンが押されたときに乗車状態のとき + if (documentSnapshot.getBoolean("isReported") == true && isInCar == true) {//isReportedがtrueかつisInCarがtrueのとき=サイト上で第三者ボタンが押されたときに乗車状態のとき ResetReported();// ResetReported();を処理→FireBaseのisReportedをfalseにする int importance = NotificationManager.IMPORTANCE_DEFAULT; NotificationChannel channel = new NotificationChannel("CHANNEL_ID", "通報通知", importance); @@ -78,10 +83,11 @@ public class TestService extends Service { NotificationManager notificationManager = getSystemService(NotificationManager.class); notificationManager.createNotificationChannel(channel); Log.d("nt", "レスポンスを検知しました2"); - notifyMain();// notifyMain()メソッドを処理→通知のメソッド - } else{//それ以外のとき + NotificationSetting();//通知に関する設定のメソッド→Android8.0以降のバックグラウンド処理に関する設定など + Notification(getApplicationContext());//バイブレーション、音、バナーによる通知を行うメソッド + } else {//それ以外のとき ResetReported();//ResetReported();を処理→FireBaseのisReportedをfalseにする - Log.d("nt", "何もなし" ); + Log.d("nt", "何もなし"); } } @@ -89,41 +95,18 @@ public class TestService extends Service { }); } - public void notifyMain() { - //↓通知をする際に起動するバイブレーション - ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).vibrate(1000); - //↓通知の詳細設定的な奴 - NotificationCompat.Builder builder = new NotificationCompat - .Builder(this, "CHANNEL_ID") - .setSmallIcon(android.R.drawable.ic_menu_info_details) - .setContentTitle("通報検知") - .setContentText("子供の置き去りを検知しました。") - .setPriority(NotificationCompat.PRIORITY_DEFAULT); - NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); - if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { - // TODO: Consider calling - // ActivityCompat#requestPermissions - // here to request the missing permissions, and then overriding - // public void onRequestPermissionsResult(int requestCode, String[] permissions, - // int[] grantResults) - // to handle the case where the user grants the permission. See the documentation - // for ActivityCompat#requestPermissions for more details. - return; - } - notificationManager.notify(R.string.app_name, builder.build()); - } - public void ResetReported(){//FireBaseのisReportedをfalseに初期化するメソッド + public void ResetReported() {//FireBaseのisReportedをfalseに初期化するメソッド //共有プリファレンス全体の準備 - SharedPreferences sharedPreferences =getSharedPreferences("app_situation", MODE_PRIVATE); + SharedPreferences sharedPreferences = 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の宣言 DEFAULT_ITEM.put("isReported", false); - isReported.update("isReported",false).addOnSuccessListener(new OnSuccessListener() {//isReportedをfalseに更新 + isReported.update("isReported", false).addOnSuccessListener(new OnSuccessListener() {//isReportedをfalseに更新 @Override public void onSuccess(Void unused) { Log.d(TAG, "DocumentSnapshot successfully updated!"); @@ -135,6 +118,43 @@ public class TestService extends Service { } }); } + + public void NotificationSetting() {//通知に関する設定の処理を行うメソッド + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//Android 8.0以降であることを確認する + 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) {//実際に通知を行うメソッド + // 通知がクリックされたときに送信される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(this, "CHANNEL_ID") + .setSmallIcon(android.R.drawable.ic_menu_info_details) + .setContentTitle("子供の置き去りをしていませんか?")//通知のタイトル + .setContentText("第三者からの通報が行われました。")//通知の本文 + .setContentIntent(pendingIntent) + .setAutoCancel(true) + .setPriority(NotificationCompat.PRIORITY_DEFAULT); + + 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());//通知の表示 + } @Nullable @Override public IBinder onBind(Intent intent) { -- 2.45.1 From 844d7f43e5915e0be6df7d409fb2a18907f72584 Mon Sep 17 00:00:00 2001 From: it232115 Date: Fri, 19 Jan 2024 04:42:53 +0900 Subject: [PATCH 5/9] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E8=80=85=E9=80=9A?= =?UTF-8?q?=E5=A0=B1=E3=81=AE=E9=80=9A=E7=9F=A5=E3=82=92=E3=83=AD=E3=83=83?= =?UTF-8?q?=E3=82=AF=E7=94=BB=E9=9D=A2=E3=81=AB=E8=A1=A8=E7=A4=BA=E3=81=97?= =?UTF-8?q?=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../childguard/NotificationReceiver.java | 4 +-- .../com/example/childguard/TestService.java | 36 +++++++++++++++---- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/example/childguard/NotificationReceiver.java b/app/src/main/java/com/example/childguard/NotificationReceiver.java index 8a5a2c9..4fb3f5f 100644 --- a/app/src/main/java/com/example/childguard/NotificationReceiver.java +++ b/app/src/main/java/com/example/childguard/NotificationReceiver.java @@ -4,10 +4,10 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -public class NotificationReceiver extends BroadcastReceiver {//通知をクリックしたときにアプリを起動する処理 +public class NotificationReceiver extends BroadcastReceiver {//通知をタップしたときにアプリを起動する処理 @Override public void onReceive(Context context, Intent intent) { - if (intent.getAction() != null && intent.getAction().equals("OPEN_ACTIVITY")) {// 通知がクリックされたときの処理 + if (intent.getAction() != null && intent.getAction().equals("OPEN_ACTIVITY")) {// 通知がタップされたときの処理 Intent openIntent = new Intent(context, MainActivity.class); // MainActivityを起動 openIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(openIntent); diff --git a/app/src/main/java/com/example/childguard/TestService.java b/app/src/main/java/com/example/childguard/TestService.java index 1b962ec..b25a3f1 100644 --- a/app/src/main/java/com/example/childguard/TestService.java +++ b/app/src/main/java/com/example/childguard/TestService.java @@ -9,6 +9,7 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; +import android.graphics.Color; import android.os.Build; import android.os.IBinder; import android.os.Vibrator; @@ -83,7 +84,7 @@ public class TestService extends Service { NotificationManager notificationManager = getSystemService(NotificationManager.class); notificationManager.createNotificationChannel(channel); Log.d("nt", "レスポンスを検知しました2"); - NotificationSetting();//通知に関する設定のメソッド→Android8.0以降のバックグラウンド処理に関する設定など + NotificationSetting();//通知に関する設定のメソッド Notification(getApplicationContext());//バイブレーション、音、バナーによる通知を行うメソッド } else {//それ以外のとき ResetReported();//ResetReported();を処理→FireBaseのisReportedをfalseにする @@ -120,7 +121,6 @@ public class TestService extends Service { } public void NotificationSetting() {//通知に関する設定の処理を行うメソッド - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//Android 8.0以降であることを確認する int importance = NotificationManager.IMPORTANCE_DEFAULT; //通知チャネルの実装 NotificationChannel channel = new NotificationChannel("CHANNEL_ID", "通知", importance); @@ -128,10 +128,11 @@ public class TestService extends Service { 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"); @@ -141,13 +142,34 @@ public class TestService extends Service { 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(this, "CHANNEL_ID") + + @SuppressLint("NotificationTrampoline") NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "CHANNEL_ID") .setSmallIcon(android.R.drawable.ic_menu_info_details) .setContentTitle("子供の置き去りをしていませんか?")//通知のタイトル .setContentText("第三者からの通報が行われました。")//通知の本文 - .setContentIntent(pendingIntent) - .setAutoCancel(true) - .setPriority(NotificationCompat.PRIORITY_DEFAULT); + .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) { -- 2.45.1 From 0bdbc555188b09d6662dd427baf3971783dbe363 Mon Sep 17 00:00:00 2001 From: it232115 Date: Fri, 19 Jan 2024 05:35:11 +0900 Subject: [PATCH 6/9] =?UTF-8?q?Bluetooth=E5=88=87=E6=96=AD=E5=BE=8C?= =?UTF-8?q?=E3=81=AE5=E5=88=86=E6=AF=8E=E3=81=AE=E3=83=AB=E3=83=BC?= =?UTF-8?q?=E3=83=97=E3=81=AB=E3=82=88=E3=82=8B=E9=80=9A=E7=9F=A5=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=81=97=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/childguard/MainActivity.java | 96 ++++++++++------ .../com/example/childguard/TestService.java | 107 ++++++++++++++++-- 2 files changed, 156 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/com/example/childguard/MainActivity.java b/app/src/main/java/com/example/childguard/MainActivity.java index eef2b67..7ca75f1 100644 --- a/app/src/main/java/com/example/childguard/MainActivity.java +++ b/app/src/main/java/com/example/childguard/MainActivity.java @@ -3,6 +3,7 @@ package com.example.childguard; import android.annotation.SuppressLint; import android.app.NotificationChannel; import android.app.NotificationManager; +import android.app.PendingIntent; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothManager; @@ -12,7 +13,9 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.pm.PackageManager; +import android.graphics.Color; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.os.Vibrator; import android.preference.PreferenceManager; @@ -27,7 +30,6 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.browser.customtabs.CustomTabsIntent; import androidx.core.app.ActivityCompat; import androidx.core.app.NotificationCompat; -import androidx.core.app.NotificationManagerCompat; import androidx.fragment.app.Fragment; import com.google.android.gms.tasks.OnFailureListener; @@ -41,12 +43,8 @@ import com.google.firebase.firestore.FirebaseFirestoreException; import com.journeyapps.barcodescanner.ScanContract; import com.journeyapps.barcodescanner.ScanOptions; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Date; import java.util.HashMap; import java.util.Map; -import java.util.concurrent.Future; public class MainActivity extends AppCompatActivity { @@ -190,7 +188,8 @@ public class MainActivity extends AppCompatActivity { NotificationManager notificationManager = getSystemService(NotificationManager.class); notificationManager.createNotificationChannel(channel); Log.d("nt", "レスポンスを検知しました2"); - notifyMain();// notifyMain()メソッドを処理→通知のメソッド + NotificationSetting();//通知に関する設定のメソッド + Notification(getApplicationContext());//通知を行うメソッド ResetReported();// ResetReported();メソッドを処理→FireBaseのisReportedをfalseにする } else{//第三者ボタンが押されたときにisInCarがfalseのとき=降車状態のとき ResetReported();// ResetReported();を処理→FireBaseのisReportedをfalseにする @@ -241,35 +240,6 @@ public class MainActivity extends AppCompatActivity { } }; - //↓通知のやつ - public void notifyMain() { - //↓通知をする際に起動するバイブレーション - ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).vibrate(1000); - //↓通知の詳細設定的な奴 - NotificationCompat.Builder builder = new NotificationCompat - .Builder(this, "CHANNEL_ID") - .setSmallIcon(android.R.drawable.ic_menu_info_details) - .setContentTitle("通報検知") - .setContentText("子供の置き去りを検知しました。") - .setPriority(NotificationCompat.PRIORITY_DEFAULT); - - NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); - - if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { - // TODO: Consider calling - // ActivityCompat#requestPermissions - // here to request the missing permissions, and then overriding - // public void onRequestPermissionsResult(int requestCode, String[] permissions, - // int[] grantResults) - // to handle the case where the user grants the permission. See the documentation - // for ActivityCompat#requestPermissions for more details. - return; - } - notificationManager.notify(R.string.app_name, builder.build()); - - - } - public void ResetReported(){//FireBaseのisReportedをfalseに初期化するメソッド //共有プリファレンス全体の準備 SharedPreferences sharedPreferences = MainActivity.this.getSharedPreferences("app_situation", MODE_PRIVATE); @@ -289,6 +259,62 @@ public class MainActivity extends AppCompatActivity { } }); } + 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 changessituation(){//乗降状態の管理をするためにHomeFramgentを呼び出すメソッド diff --git a/app/src/main/java/com/example/childguard/TestService.java b/app/src/main/java/com/example/childguard/TestService.java index b25a3f1..f897f58 100644 --- a/app/src/main/java/com/example/childguard/TestService.java +++ b/app/src/main/java/com/example/childguard/TestService.java @@ -11,19 +11,16 @@ import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.graphics.Color; import android.os.Build; +import android.os.Handler; import android.os.IBinder; +import android.os.Looper; import android.os.Vibrator; import android.util.Log; -import android.widget.Toast; -import android.content.Context; -import android.content.Intent; -import android.content.BroadcastReceiver; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.app.ActivityCompat; import androidx.core.app.NotificationCompat; -import androidx.core.app.NotificationManagerCompat; -import androidx.fragment.app.Fragment; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; @@ -35,7 +32,6 @@ import com.google.firebase.firestore.FirebaseFirestoreException; import java.util.HashMap; import java.util.Map; -import java.util.concurrent.Executor; public class TestService extends Service { FirebaseFirestore db; @@ -43,6 +39,8 @@ public class TestService extends Service { public static final String TAG = "InspirationQuote"; + public PeriodicTaskManager periodicTaskManager; + @Override public int onStartCommand(Intent intent, int flags, int startId) { @@ -59,11 +57,13 @@ public class TestService extends Service { } private void initNotification(DocumentReference mDocRef) {//サイト上で押されたボタンの管理 - + // PeriodicTaskManagerのインスタンス化 + periodicTaskManager = new PeriodicTaskManager(); // 共有プリファレンス全体の準備 SharedPreferences sharedPreferences = getSharedPreferences("app_situation", MODE_PRIVATE); //車の乗り降りを管理するtrue=乗車、false=降車 mDocRef.addSnapshotListener(new EventListener() {//exists()でdocumentSnapshotの中のファイルの存在の確認 + @Override public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) { @@ -85,10 +85,13 @@ public class TestService extends Service { notificationManager.createNotificationChannel(channel); Log.d("nt", "レスポンスを検知しました2"); NotificationSetting();//通知に関する設定のメソッド - Notification(getApplicationContext());//バイブレーション、音、バナーによる通知を行うメソッド - } else {//それ以外のとき + Notification(getApplicationContext());//通知を行うメソッド + } else if(!isInCar){//Bluetoothの切断後5分以上乗車状態のままのとき→QRコード読み取りを忘れているとき→置き去り発生 ResetReported();//ResetReported();を処理→FireBaseのisReportedをfalseにする - Log.d("nt", "何もなし"); + periodicTaskManager.stopPeriodicTask();//通知のループをストップする + }else { + ResetReported();//ResetReported();を処理→FireBaseのisReportedをfalseにする + periodicTaskManager.startPeriodicTask();//5分毎に通知を行う } } @@ -98,7 +101,6 @@ public class TestService extends Service { } - public void ResetReported() {//FireBaseのisReportedをfalseに初期化するメソッド //共有プリファレンス全体の準備 SharedPreferences sharedPreferences = getSharedPreferences("app_situation", MODE_PRIVATE); @@ -177,6 +179,87 @@ public class TestService extends Service { } notificationManager.notify(R.string.app_name, builder.build());//通知の表示 } + public void NotificationBluetooth(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("Bluetootと車の切断から5分が経過しました")//通知の本文 + .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 class PeriodicTaskManager {//Bluetoothの切断後に乗車状態にならなかった場合に5分毎に通知を送るメソッド + + private static final long INTERVAL = 5 *60* 1000; //300秒 + private final Handler handler; + private final Runnable periodicTask; + + public PeriodicTaskManager() { + + handler = new Handler(Looper.getMainLooper()); + periodicTask = new Runnable() { + + public void run() { + + //共有プリファレンス全体の準備 + SharedPreferences sharedPreferences = getSharedPreferences("app_situation", MODE_PRIVATE); + Boolean isInCar = sharedPreferences.getBoolean("isInCarPref", false);//現在の乗降状態を保存する共有プリファレンス + // 5分毎に実行される処理 + NotificationBluetooth(getApplicationContext()); + Log.d("PeriodicTask", "5分後に処理を実行します"); + + handler.postDelayed(this, INTERVAL); + } + }; + } + + public void startPeriodicTask() { + // 最初の実行 + handler.postDelayed(periodicTask,INTERVAL);//一回目は5分後に行う + } + + public void stopPeriodicTask() { + // 定期的な処理の停止 + handler.removeCallbacks(periodicTask); + } + } @Nullable @Override public IBinder onBind(Intent intent) { -- 2.45.1 From 19a4765bf064a48374367ffc76804bc877706d7e Mon Sep 17 00:00:00 2001 From: it232115 Date: Fri, 19 Jan 2024 06:19:04 +0900 Subject: [PATCH 7/9] =?UTF-8?q?=E7=94=BB=E9=9D=A2=E9=81=B7=E7=A7=BB?= =?UTF-8?q?=E3=82=92=E5=8E=9F=E5=9B=A0=E3=81=A8=E3=81=99=E3=82=8BFirebase?= =?UTF-8?q?=E3=81=A8=E3=81=AE=E5=90=8C=E6=9C=9F=E3=82=BA=E3=83=AC=E3=82=92?= =?UTF-8?q?=E6=94=B9=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/childguard/HomeFragment.java | 2 ++ .../com/example/childguard/MainActivity.java | 28 ++++++++++++------- .../com/example/childguard/TestService.java | 2 ++ 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/example/childguard/HomeFragment.java b/app/src/main/java/com/example/childguard/HomeFragment.java index 59efc75..1a35983 100644 --- a/app/src/main/java/com/example/childguard/HomeFragment.java +++ b/app/src/main/java/com/example/childguard/HomeFragment.java @@ -75,10 +75,12 @@ public class HomeFragment extends Fragment implements OnEventListener{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (getArguments() != null) { // mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2); } + } @Override diff --git a/app/src/main/java/com/example/childguard/MainActivity.java b/app/src/main/java/com/example/childguard/MainActivity.java index 7ca75f1..606f74a 100644 --- a/app/src/main/java/com/example/childguard/MainActivity.java +++ b/app/src/main/java/com/example/childguard/MainActivity.java @@ -101,6 +101,8 @@ public class MainActivity extends AppCompatActivity { .replace(findViewById(R.id.fragmentContainerView).getId(), this.homeFragment) .addToBackStack(null) .commit(); + firebaselink(); + } else if (v.getItemId() == findViewById(R.id.navigation_notification).getId()) { findViewById(R.id.fab_scan_qr_code).setVisibility(FrameLayout.VISIBLE); getSupportFragmentManager().beginTransaction() @@ -123,6 +125,7 @@ public class MainActivity extends AppCompatActivity { ScanOptions options = new ScanOptions(); options.setPrompt("QRコードを読み取ってください"); QrLauncher.launch(options); + }); //Bluetooth検知機能 @@ -138,7 +141,7 @@ public class MainActivity extends AppCompatActivity { Log.d("BT", "Permission to connect bluetooth devices granted"); } registerReceiver(receiver, intentFilter); - + changessituation(); } @Override @@ -147,15 +150,7 @@ public class MainActivity extends AppCompatActivity { changessituation(); Log.d("onResume", "called"); Log.d("onResume", "mDocRef is null"); - //共有プリファレンス全体の準備 - SharedPreferences sharedPreferences = getSharedPreferences("app_situation", MODE_PRIVATE); - String IdPref = sharedPreferences.getString("ID", null);////アプリに記録されているIDの取得 - if (IdPref == null) {//FireBaseのIDがアプリに登録されているとき - Log.d("onResume", "ID not initialized."); - } else { - mDocRef = FirebaseFirestore.getInstance().document("status/" + IdPref);//現在の位置を取得 - initNotification(mDocRef);//現在の位置を引数に initNotification()を処理 - } + firebaselink(); } private void initNotification(DocumentReference mDocRef) {//サイト上で押されたボタンの管理 @@ -240,6 +235,19 @@ public class MainActivity extends AppCompatActivity { } }; + + public void firebaselink(){//Firebaseのドキュメントの取得 + //共有プリファレンス全体の準備 + SharedPreferences sharedPreferences = getSharedPreferences("app_situation", MODE_PRIVATE); + String IdPref = sharedPreferences.getString("ID", null);////アプリに記録されているIDの取得 + if (IdPref == null) {//FireBaseのIDがアプリに登録されているとき + Log.d("onResume", "ID not initialized."); + } else { + mDocRef = FirebaseFirestore.getInstance().document("status/" + IdPref);//現在の位置を取得 + initNotification(mDocRef);//現在の位置を引数に initNotification()を処理 + + } + } public void ResetReported(){//FireBaseのisReportedをfalseに初期化するメソッド //共有プリファレンス全体の準備 SharedPreferences sharedPreferences = MainActivity.this.getSharedPreferences("app_situation", MODE_PRIVATE); diff --git a/app/src/main/java/com/example/childguard/TestService.java b/app/src/main/java/com/example/childguard/TestService.java index f897f58..5838fc1 100644 --- a/app/src/main/java/com/example/childguard/TestService.java +++ b/app/src/main/java/com/example/childguard/TestService.java @@ -101,6 +101,7 @@ public class TestService extends Service { } + public void ResetReported() {//FireBaseのisReportedをfalseに初期化するメソッド //共有プリファレンス全体の準備 SharedPreferences sharedPreferences = getSharedPreferences("app_situation", MODE_PRIVATE); @@ -122,6 +123,7 @@ public class TestService extends Service { }); } + public void NotificationSetting() {//通知に関する設定の処理を行うメソッド int importance = NotificationManager.IMPORTANCE_DEFAULT; //通知チャネルの実装 -- 2.45.1 From 85d596f610e64c2accc0d8ac9adb6ed7b0fe7139 Mon Sep 17 00:00:00 2001 From: it232115 Date: Fri, 19 Jan 2024 06:35:32 +0900 Subject: [PATCH 8/9] =?UTF-8?q?=E3=83=87=E3=83=90=E3=82=A4=E3=82=B9?= =?UTF-8?q?=E3=81=AB=E3=82=88=E3=81=A3=E3=81=A6QR=E7=94=BB=E5=83=8F?= =?UTF-8?q?=E3=81=AE=E3=82=B5=E3=82=A4=E3=82=BA=E3=81=8C=E5=A4=A7=E3=81=8D?= =?UTF-8?q?=E3=81=8F=E9=81=95=E3=81=86=E3=83=90=E3=82=B0=E3=81=AE=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3(=E3=83=86=E3=82=B9=E3=83=88=E3=81=AF=E3=81=97?= =?UTF-8?q?=E3=81=A6=E3=81=84=E3=81=AA=E3=81=84=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/childguard/QrUtils.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/example/childguard/QrUtils.java b/app/src/main/java/com/example/childguard/QrUtils.java index dc4f493..48b6460 100644 --- a/app/src/main/java/com/example/childguard/QrUtils.java +++ b/app/src/main/java/com/example/childguard/QrUtils.java @@ -8,7 +8,9 @@ import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.drawable.BitmapDrawable; import android.util.AndroidRuntimeException; +import android.util.DisplayMetrics; import android.util.Log; +import android.view.WindowManager; import android.widget.ImageView; import androidx.print.PrintHelper; @@ -35,6 +37,7 @@ public class QrUtils { AllURL=KoteiURL+key; int size = 1500; + int qrCodeSize = calculateQRCodeSize(); // 画面密度に応じてサイズを計算 Bitmap QRGazou; Bitmap bitmapqr; try { @@ -55,10 +58,21 @@ public class QrUtils { // 画像のサイズの調整 int disWidth = (width - bitmapqr.getWidth()) / 2; - int disHeight = (int) ((height - bitmapqr.getHeight()) / 1.3); + int disHeight = (int) ((height - bitmapqr.getHeight()) / 1.4); canvas.drawBitmap(bitmap, 0, 0, (Paint) null); canvas.drawBitmap(bitmapqr, disWidth, disHeight, (Paint) null); // 画像合成 //Androidからプリンターへ印刷指示を出すサポートライブラリ return QRGazou; } + private int calculateQRCodeSize() { + // 画面解像度を取得 + DisplayMetrics metrics = new DisplayMetrics(); + WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + windowManager.getDefaultDisplay().getMetrics(metrics); + + // 画面密度に基づいてQRコードのサイズを計算 + float density = context.getResources().getDisplayMetrics().density; + return (int) (1500 * density); + } + } -- 2.45.1 From 1f1570c98267c1f5f514c4fa6a868ca708cfa55a Mon Sep 17 00:00:00 2001 From: it232115 Date: Fri, 19 Jan 2024 10:24:05 +0900 Subject: [PATCH 9/9] =?UTF-8?q?=E4=B8=8D=E8=A6=81=E3=81=AA=E3=82=B3?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=81=AE=E5=89=8A=E9=99=A4=20=E3=82=BF?= =?UTF-8?q?=E3=82=A4=E3=83=9E=E9=96=8B=E5=A7=8B=E5=BE=8C=E3=81=AE=E6=99=82?= =?UTF-8?q?=E9=96=93=E7=B5=8C=E9=81=8E=E3=81=A7=E9=80=9A=E7=9F=A5=E3=81=AE?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E3=82=92=E5=A4=89=E6=9B=B4=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=82=B3=E3=83=BC=E3=83=89=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=97?= =?UTF-8?q?=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/childguard/HomeFragment.java | 32 +---- .../com/example/childguard/MainActivity.java | 121 ++++++++---------- .../example/childguard/RecyclerAdapter.java | 2 - .../example/childguard/SettingFragment.java | 11 +- .../com/example/childguard/TestService.java | 96 +++++++------- 5 files changed, 102 insertions(+), 160 deletions(-) diff --git a/app/src/main/java/com/example/childguard/HomeFragment.java b/app/src/main/java/com/example/childguard/HomeFragment.java index 1a35983..5e852ba 100644 --- a/app/src/main/java/com/example/childguard/HomeFragment.java +++ b/app/src/main/java/com/example/childguard/HomeFragment.java @@ -1,37 +1,17 @@ package com.example.childguard; -import static android.content.ContentValues.TAG; -import static android.content.Context.MODE_PRIVATE; - -import android.content.SharedPreferences; import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.TextView; import androidx.core.content.res.ResourcesCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; -import androidx.print.PrintHelper; - -import android.preference.PreferenceManager; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.FrameLayout; -import android.widget.TextView; -import android.widget.Toast; - -import androidx.annotation.NonNull; - -import com.google.android.gms.tasks.OnFailureListener; -import com.google.android.gms.tasks.OnSuccessListener; -import com.google.firebase.firestore.DocumentReference; -import com.google.firebase.firestore.FirebaseFirestore; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; /** * A simple {@link Fragment} subclass. diff --git a/app/src/main/java/com/example/childguard/MainActivity.java b/app/src/main/java/com/example/childguard/MainActivity.java index 606f74a..3911dcd 100644 --- a/app/src/main/java/com/example/childguard/MainActivity.java +++ b/app/src/main/java/com/example/childguard/MainActivity.java @@ -24,22 +24,15 @@ import android.widget.FrameLayout; import android.widget.Toast; import androidx.activity.result.ActivityResultLauncher; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.browser.customtabs.CustomTabsIntent; import androidx.core.app.ActivityCompat; import androidx.core.app.NotificationCompat; import androidx.fragment.app.Fragment; -import com.google.android.gms.tasks.OnFailureListener; -import com.google.android.gms.tasks.OnSuccessListener; import com.google.android.material.bottomnavigation.BottomNavigationView; import com.google.firebase.firestore.DocumentReference; -import com.google.firebase.firestore.DocumentSnapshot; -import com.google.firebase.firestore.EventListener; import com.google.firebase.firestore.FirebaseFirestore; -import com.google.firebase.firestore.FirebaseFirestoreException; import com.journeyapps.barcodescanner.ScanContract; import com.journeyapps.barcodescanner.ScanOptions; @@ -59,8 +52,6 @@ public class MainActivity extends AppCompatActivity { public static final String TAG = "InspirationQuote"; - - private final ActivityResultLauncher QrLauncher = registerForActivityResult( new ScanContract(), result -> { @@ -136,8 +127,7 @@ public class MainActivity extends AppCompatActivity { if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { Log.d("BT", "No permission to connect bluetooth devices"); return; - } - else { + } else { Log.d("BT", "Permission to connect bluetooth devices granted"); } registerReceiver(receiver, intentFilter); @@ -150,50 +140,45 @@ public class MainActivity extends AppCompatActivity { changessituation(); Log.d("onResume", "called"); Log.d("onResume", "mDocRef is null"); - firebaselink(); + firebaselink(); } private void initNotification(DocumentReference mDocRef) {//サイト上で押されたボタンの管理 // 共有プリファレンス全体の準備 - SharedPreferences sharedPreferences = getSharedPreferences("app_situation",MODE_PRIVATE); + SharedPreferences sharedPreferences = getSharedPreferences("app_situation", MODE_PRIVATE); - mDocRef.addSnapshotListener(this, new EventListener() { - @Override - public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) { + mDocRef.addSnapshotListener(this, (documentSnapshot, e) -> { - Log.d("nt", "イベント開始"); - //共有プリファレンス 書き込みの準備 - 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"));//乗降状態の判定 - E.apply();//確定処理 - Log.d("nt", "レスポンスを検知しました1"); - //FireBaseで更新された情報の判定 - if (documentSnapshot.getBoolean("isReported")==false ) {//isReportedがfalseのとき=サイト上で保護者ボタンが押されたとき - if (fragment instanceof HomeFragment) {//fragementがHomeFragmentのインスタンスかの判定 - changessituation();// changessituation()メソッドを処理→アプリ側の乗降状態を変化 - } - }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", "何もなし" ); + Log.d("nt", "イベント開始"); + //共有プリファレンス 書き込みの準備 + 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"));//乗降状態の判定 + E.apply();//確定処理 + Log.d("nt", "レスポンスを検知しました1"); + //FireBaseで更新された情報の判定 + if (documentSnapshot.getBoolean("isReported") == false) {//isReportedがfalseのとき=サイト上で保護者ボタンが押されたとき + if (fragment instanceof HomeFragment) {//fragementがHomeFragmentのインスタンスかの判定 + changessituation();// changessituation()メソッドを処理→アプリ側の乗降状態を変化 } - } - - } - + } 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", "何もなし"); + } + } }); } @@ -212,7 +197,6 @@ public class MainActivity extends AppCompatActivity { Log.d("BT", "No permission to connect bluetooth devices"); return; } - String deviceName = device.getName(); String deviceHardwareAddress = device.getAddress(); // MAC address if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) { @@ -236,7 +220,7 @@ public class MainActivity extends AppCompatActivity { }; - public void firebaselink(){//Firebaseのドキュメントの取得 + public void firebaselink() {//Firebaseのドキュメントの取得 //共有プリファレンス全体の準備 SharedPreferences sharedPreferences = getSharedPreferences("app_situation", MODE_PRIVATE); String IdPref = sharedPreferences.getString("ID", null);////アプリに記録されているIDの取得 @@ -248,25 +232,18 @@ public class MainActivity extends AppCompatActivity { } } - public void ResetReported(){//FireBaseのisReportedをfalseに初期化するメソッド + + public void ResetReported() {//FireBaseのisReportedをfalseに初期化するメソッド //共有プリファレンス全体の準備 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.update("isReported",false).addOnSuccessListener(new OnSuccessListener() {//isReportedをfalseに更新 - @Override - public void onSuccess(Void unused) { - Log.d(TAG, "DocumentSnapshot successfully updated!"); - } - }).addOnFailureListener(new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - Log.w(TAG, "Error updating document", e); - } - }); + //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 NotificationSetting() {//通知に関する設定の処理を行うメソッド int importance = NotificationManager.IMPORTANCE_DEFAULT; //通知チャネルの実装 @@ -277,6 +254,7 @@ public class MainActivity extends AppCompatActivity { notificationManager.createNotificationChannel(channel); } + public void Notification(Context context) {//実際に通知を行うメソッド final String CHANNEL_ID = "my_channel_id"; // 通知がクリックされたときに送信されるIntent @@ -317,7 +295,7 @@ public class MainActivity extends AppCompatActivity { } - NotificationManager notificationManager = (NotificationManager)context.getSystemService(context.NOTIFICATION_SERVICE); + NotificationManager notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { return; } @@ -325,16 +303,17 @@ public class MainActivity extends AppCompatActivity { } - public void changessituation(){//乗降状態の管理をするためにHomeFramgentを呼び出すメソッド + public void changessituation() {//乗降状態の管理をするためにHomeFramgentを呼び出すメソッド - SharedPreferences sharedPreferences = getSharedPreferences("app_situation",MODE_PRIVATE); - //共有プリファレンス 書き込みの準備 - SharedPreferences.Editor E = sharedPreferences.edit(); - Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragmentContainerView); - Boolean isInCar = sharedPreferences.getBoolean("isInCarPref", false);//現在の乗降状態を保存する共有プリファレンス - ((HomeFragment) fragment).onEvent(!isInCar); + SharedPreferences sharedPreferences = getSharedPreferences("app_situation", MODE_PRIVATE); + //共有プリファレンス 書き込みの準備 + SharedPreferences.Editor E = sharedPreferences.edit(); + Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragmentContainerView); + Boolean isInCar = sharedPreferences.getBoolean("isInCarPref", false);//現在の乗降状態を保存する共有プリファレンス + ((HomeFragment) fragment).onEvent(!isInCar); } - @Override + + @Override public void onStop() {//アプリをバックグラウンドにした時のメソッド super.onStop(); Intent intent = new Intent(getApplication(), TestService.class); diff --git a/app/src/main/java/com/example/childguard/RecyclerAdapter.java b/app/src/main/java/com/example/childguard/RecyclerAdapter.java index 3aeb1fc..2a184f5 100644 --- a/app/src/main/java/com/example/childguard/RecyclerAdapter.java +++ b/app/src/main/java/com/example/childguard/RecyclerAdapter.java @@ -1,6 +1,5 @@ package com.example.childguard; -import android.bluetooth.BluetoothAdapter; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; @@ -16,7 +15,6 @@ import androidx.appcompat.app.AlertDialog; import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList; -import java.util.function.Predicate; public class RecyclerAdapter extends RecyclerView.Adapter { diff --git a/app/src/main/java/com/example/childguard/SettingFragment.java b/app/src/main/java/com/example/childguard/SettingFragment.java index 712e05e..46e7b79 100644 --- a/app/src/main/java/com/example/childguard/SettingFragment.java +++ b/app/src/main/java/com/example/childguard/SettingFragment.java @@ -5,21 +5,14 @@ import static android.content.Context.MODE_PRIVATE; import android.content.SharedPreferences; import android.os.Bundle; - -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.print.PrintHelper; - import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Button; import android.widget.Toast; -import com.google.android.gms.tasks.OnFailureListener; -import com.google.android.gms.tasks.OnSuccessListener; -import com.google.firebase.firestore.DocumentReference; +import androidx.fragment.app.Fragment; + import com.google.firebase.firestore.FirebaseFirestore; import java.util.HashMap; diff --git a/app/src/main/java/com/example/childguard/TestService.java b/app/src/main/java/com/example/childguard/TestService.java index 5838fc1..281734f 100644 --- a/app/src/main/java/com/example/childguard/TestService.java +++ b/app/src/main/java/com/example/childguard/TestService.java @@ -17,18 +17,12 @@ import android.os.Looper; import android.os.Vibrator; import android.util.Log; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.app.ActivityCompat; import androidx.core.app.NotificationCompat; -import com.google.android.gms.tasks.OnFailureListener; -import com.google.android.gms.tasks.OnSuccessListener; import com.google.firebase.firestore.DocumentReference; -import com.google.firebase.firestore.DocumentSnapshot; -import com.google.firebase.firestore.EventListener; import com.google.firebase.firestore.FirebaseFirestore; -import com.google.firebase.firestore.FirebaseFirestoreException; import java.util.HashMap; import java.util.Map; @@ -62,39 +56,35 @@ public class TestService extends Service { // 共有プリファレンス全体の準備 SharedPreferences sharedPreferences = getSharedPreferences("app_situation", MODE_PRIVATE); //車の乗り降りを管理するtrue=乗車、false=降車 - mDocRef.addSnapshotListener(new EventListener() {//exists()でdocumentSnapshotの中のファイルの存在の確認 + //exists()でdocumentSnapshotの中のファイルの存在の確認 + mDocRef.addSnapshotListener((documentSnapshot, e) -> { - @Override - public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) { - - Log.d("nt", "イベント開始"); - //共有プリファレンス 書き込みの準備 - SharedPreferences.Editor E = sharedPreferences.edit(); - //車の乗り降りを管理するtrue=乗車、false=降車 - if (documentSnapshot.exists()) {//exists()でdocumentSnapshotの中のファイルの存在の確認 - Boolean isInCar = sharedPreferences.getBoolean("isInCarPref", false);//現在の乗降状態を保存する共有プリファレンス - E.putBoolean("isInCarPref", documentSnapshot.getBoolean("isInCar"));//乗降状態の判定 - E.apply();//確定処理 - Log.d("nt", "レスポンスを検知しました1"); - if (documentSnapshot.getBoolean("isReported") == true && isInCar == true) {//isReportedがtrueかつisInCarがtrueのとき=サイト上で第三者ボタンが押されたときに乗車状態のとき - ResetReported();// ResetReported();を処理→FireBaseのisReportedをfalseにする - 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());//通知を行うメソッド - } else if(!isInCar){//Bluetoothの切断後5分以上乗車状態のままのとき→QRコード読み取りを忘れているとき→置き去り発生 - ResetReported();//ResetReported();を処理→FireBaseのisReportedをfalseにする - periodicTaskManager.stopPeriodicTask();//通知のループをストップする - }else { - ResetReported();//ResetReported();を処理→FireBaseのisReportedをfalseにする - periodicTaskManager.startPeriodicTask();//5分毎に通知を行う - } + Log.d("nt", "イベント開始"); + //共有プリファレンス 書き込みの準備 + SharedPreferences.Editor E = sharedPreferences.edit(); + //車の乗り降りを管理するtrue=乗車、false=降車 + if (documentSnapshot.exists()) {//exists()でdocumentSnapshotの中のファイルの存在の確認 + Boolean isInCar = sharedPreferences.getBoolean("isInCarPref", false);//現在の乗降状態を保存する共有プリファレンス + E.putBoolean("isInCarPref", documentSnapshot.getBoolean("isInCar"));//乗降状態の判定 + E.apply();//確定処理 + Log.d("nt", "レスポンスを検知しました1"); + if (documentSnapshot.getBoolean("isReported") == true && isInCar) {//isReportedがtrueかつisInCarがtrueのとき=サイト上で第三者ボタンが押されたときに乗車状態のとき + ResetReported();// ResetReported();を処理→FireBaseのisReportedをfalseにする + 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());//通知を行うメソッド + } else if(isInCar){//Bluetoothの切断後5分以上乗車状態のままのとき→QRコード読み取りを忘れているとき→置き去り発生 + ResetReported();//ResetReported();を処理→FireBaseのisReportedをfalseにする + periodicTaskManager.startPeriodicTask();//通知のループをストップする + }else { + ResetReported();//ResetReported();を処理→FireBaseのisReportedをfalseにする + periodicTaskManager.stopPeriodicTask();//5分毎に通知を行う } - } }); @@ -110,17 +100,8 @@ public class TestService extends Service { DocumentReference isReported = db.collection("status").document(IdPref);//更新するドキュメントとの紐づけ Map DEFAULT_ITEM = new HashMap<>();//mapの宣言 DEFAULT_ITEM.put("isReported", false); - isReported.update("isReported", false).addOnSuccessListener(new OnSuccessListener() {//isReportedをfalseに更新 - @Override - public void onSuccess(Void unused) { - Log.d(TAG, "DocumentSnapshot successfully updated!"); - } - }).addOnFailureListener(new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - Log.w(TAG, "Error updating document", e); - } - }); + //isReportedをfalseに更新 + isReported.update("isReported", false).addOnSuccessListener(unused -> Log.d(TAG, "DocumentSnapshot successfully updated!")).addOnFailureListener(e -> Log.w(TAG, "Error updating document", e)); } @@ -181,7 +162,7 @@ public class TestService extends Service { } notificationManager.notify(R.string.app_name, builder.build());//通知の表示 } - public void NotificationBluetooth(Context context) {//実際に通知を行うメソッド + public void NotificationBluetooth(Context context, int time) {//実際に通知を行うメソッド final String CHANNEL_ID = "my_channel_id"; // 通知がクリックされたときに送信されるIntent Intent intent = new Intent(context, MainActivity.class); @@ -196,7 +177,7 @@ public class TestService extends Service { @SuppressLint("NotificationTrampoline") NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "CHANNEL_ID") .setSmallIcon(android.R.drawable.ic_menu_info_details) .setContentTitle("子供の置き去りをしていませんか?")//通知のタイトル - .setContentText("Bluetootと車の切断から5分が経過しました")//通知の本文 + .setContentText("Bluetootと車の切断から"+time+"分が経過しました")//通知の本文 .setContentIntent(pendingIntent)//通知をタップするとActivityへ移動する .setAutoCancel(true)//通知をタップすると削除する .setPriority(NotificationCompat.PRIORITY_HIGH) // プライオリティを高く設定 @@ -242,9 +223,20 @@ public class TestService extends Service { //共有プリファレンス全体の準備 SharedPreferences sharedPreferences = getSharedPreferences("app_situation", MODE_PRIVATE); - Boolean isInCar = sharedPreferences.getBoolean("isInCarPref", false);//現在の乗降状態を保存する共有プリファレンス + + int time=sharedPreferences.getInt("time",0); + //共有プリファレンス 書き込みの準備 + SharedPreferences.Editor E = sharedPreferences.edit(); + if(time==0) {//Bluetoot切断からの時間経過(5分刻み) + E.putInt("time",5); + E.apply();; + }else { + E.putInt("time",time*2); + E.apply(); + } + // 5分毎に実行される処理 - NotificationBluetooth(getApplicationContext()); + NotificationBluetooth(getApplicationContext(),time); Log.d("PeriodicTask", "5分後に処理を実行します"); handler.postDelayed(this, INTERVAL); -- 2.45.1