diff --git a/.idea/misc.xml b/.idea/misc.xml index 773fe0f..8978d23 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 71a9f46..0e3b833 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -61,6 +61,12 @@ dependencies { implementation 'androidx.compose.material3:material3' implementation 'com.google.firebase:firebase-firestore:24.4.1' + // Import the BoM for the Firebase platform + implementation(platform("com.google.firebase:firebase-bom:32.7.0")) + + // Declare the dependency for the Cloud Firestore library + // When using the BoM, you don't specify versions in Firebase library dependencies + implementation("com.google.firebase:firebase-firestore") testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..d3d7537 --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,67 @@ +{ + "project_info": { + "project_number": "814788024795", + "project_id": "practicefirestore1-8808c", + "storage_bucket": "practicefirestore1-8808c.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:814788024795:android:79602ef613cc9860c76ffe", + "android_client_info": { + "package_name": "com.example.childguard" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAVpoftIYGZwiPRpuI56hoV8ifA2rbZGb4" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:814788024795:android:7c572a838331bba1c76ffe", + "android_client_info": { + "package_name": "com.example.connecttointernet" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAVpoftIYGZwiPRpuI56hoV8ifA2rbZGb4" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:814788024795:android:67c86939b6350f02c76ffe", + "android_client_info": { + "package_name": "com.example.practicefirestore1" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAVpoftIYGZwiPRpuI56hoV8ifA2rbZGb4" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/example/childguard/Bluetooth_device_save.java b/app/src/androidTest/java/com/example/childguard/Bluetooth_device_save.java deleted file mode 100644 index de0df1c..0000000 --- a/app/src/androidTest/java/com/example/childguard/Bluetooth_device_save.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.example.childguard; - -import android.content.Context; -import android.content.SharedPreferences; -import android.preference.PreferenceManager; - -import androidx.appcompat.app.AppCompatActivity; - -public class Bluetooth_device_save extends AppCompatActivity { - final SharedPreferences pref= PreferenceManager.getDefaultSharedPreferences(this); - public Bluetooth_device_save() { - } - public void device_save(String deviceAddress){ - SharedPreferences.Editor e=pref.edit(); - e.putString("bluetooth_device1",deviceAddress); - e.apply(); - } - public String device_info(){ - return pref.getString("bluetooth_device1","not_device"); - } -} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cbdd641..a13ea4a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/example/childguard/Bluetooth_device_save.java b/app/src/main/java/com/example/childguard/Bluetooth_device_save.java new file mode 100644 index 0000000..5673005 --- /dev/null +++ b/app/src/main/java/com/example/childguard/Bluetooth_device_save.java @@ -0,0 +1,22 @@ +package com.example.childguard; + +import android.content.Context; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.PreferenceManager; + +import androidx.appcompat.app.AppCompatActivity; + +public class Bluetooth_device_save { + SharedPreferences pref; + +// public void device_save(String deviceAddress){ +// pref = PreferenceManager.getDefaultSharedPreferencesName() +// SharedPreferences.Editor e=pref.edit(); +// e.putString("bluetooth_device1",deviceAddress); +// e.apply(); +// } + public String device_info(){ + return pref.getString("bluetooth_device1","not_device"); + } +} diff --git a/app/src/main/java/com/example/childguard/GenerateQrFragment.java b/app/src/main/java/com/example/childguard/GenerateQrFragment.java new file mode 100644 index 0000000..ed71a65 --- /dev/null +++ b/app/src/main/java/com/example/childguard/GenerateQrFragment.java @@ -0,0 +1,69 @@ +package com.example.childguard; + +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.os.Bundle; + +import androidx.fragment.app.Fragment; +import androidx.print.PrintHelper; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.Toast; + +/** + * A simple {@link Fragment} subclass. + * Use the {@link GenerateQrFragment#newInstance} factory method to + * create an instance of this fragment. + */ +public class GenerateQrFragment extends Fragment { + + public GenerateQrFragment() { + // Required empty public constructor + } + public static GenerateQrFragment newInstance(String key) { + GenerateQrFragment fragment = new GenerateQrFragment(); + Bundle args = new Bundle(); + args.putString("key", key); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_generate_qr, container, false); + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + + QrUtils qrUtils = new QrUtils(); + + assert getArguments() != null; + Bitmap result = qrUtils.setContext(getContext()).getBitmap(getArguments().getString("key")); + + ImageView imageView = view.findViewById(R.id.result_bitmap_image_view); + imageView.setImageBitmap(result); + + view.findViewById(R.id.button_print).setOnClickListener( v -> { + PrintHelper photoPrinter = new PrintHelper(requireContext()); + photoPrinter.setScaleMode(PrintHelper.SCALE_MODE_FIT); + photoPrinter.printBitmap("placeholder", result, () -> { + Toast.makeText(getContext(), "印刷完了", Toast.LENGTH_SHORT).show(); + }); + }); + + view.findViewById(R.id.button_cancel).setOnClickListener( v -> { + getParentFragmentManager().popBackStack(); + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/childguard/HomeFragment.java b/app/src/main/java/com/example/childguard/HomeFragment.java index a5ad221..a9358b0 100644 --- a/app/src/main/java/com/example/childguard/HomeFragment.java +++ b/app/src/main/java/com/example/childguard/HomeFragment.java @@ -1,13 +1,9 @@ package com.example.childguard; +import static android.content.ContentValues.TAG; +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.Color; -import android.graphics.Paint; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; import android.os.Bundle; import androidx.core.content.res.ResourcesCompat; @@ -16,26 +12,33 @@ import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import androidx.print.PrintHelper; -import android.util.AndroidRuntimeException; +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.ImageView; import android.widget.TextView; +import android.widget.Toast; -import com.google.zxing.BarcodeFormat; -import com.google.zxing.WriterException; -import com.journeyapps.barcodescanner.BarcodeEncoder; +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. * Use the {@link HomeFragment#newInstance} factory method to * create an instance of this fragment. */ -public class HomeFragment extends Fragment { +public class HomeFragment extends Fragment implements OnEventListener{ // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER @@ -43,9 +46,10 @@ public class HomeFragment extends Fragment { private static final String ARG_PARAM2 = "param2"; // TODO: Rename and change types of parameters - private String mParam1; + private String str_key; private String mParam2; + public HomeFragment() { // Required empty public constructor } @@ -72,7 +76,7 @@ public class HomeFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { - mParam1 = getArguments().getString(ARG_PARAM1); + // mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2); } } @@ -80,53 +84,20 @@ public class HomeFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - // Inflate the layout for this fragment - View view=inflater.inflate(R.layout.fragment_home,container,false); - MainActivity activity = (MainActivity) getActivity(); - //QRコード印刷の処理 - Button bt1=view.findViewById(R.id.QRprinting); - bt1.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - replaceFragment(new QrPrintFragment()); + View view = inflater.inflate(R.layout.fragment_home, container, false); - } - }); - //bluetooth設定ボタンの処理 - Button bt2=view.findViewById(R.id.Bluetooth_setup); - bt2.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - replaceFragment(new bluetooth_setupFragment()); - } - }); return view; } + @Override public void onResume() { super.onResume(); Log.d("HomeFragment", "onResume: called"); - TextView situationTextView = getView().findViewById(R.id.situation); - FrameLayout situation_bg=getView().findViewById(R.id.situation_bg); - updateInCarStatus(situationTextView,situation_bg); } - public void updateInCarStatus(TextView situationTextView,FrameLayout situation_bg) { - SharedPreferences sharedPreferences = getActivity().getSharedPreferences("default", 0); - - Log.d("HomeFragment", "updateInCarStatus: " + sharedPreferences.getBoolean("inCar", false)); - if (sharedPreferences.getBoolean("inCar", false)) { - situationTextView.setText("\n降車状態"); - situation_bg.setBackground(ResourcesCompat.getDrawable(getResources(), R.drawable.frame_style, null)); - } else { - situationTextView.setText("\n乗車状態"); - situation_bg.setBackground(ResourcesCompat.getDrawable(getResources(), R.drawable.frame_style_orange, null)); - } - - } //画面遷移メソッド - private void replaceFragment(Fragment fragment){ + private void replaceFragment(Fragment fragment) { // フラグメントマネージャーの取得 FragmentManager manager = getParentFragmentManager(); // アクティビティではgetSupportFragmentManager()? // フラグメントトランザクションの開始 @@ -138,4 +109,43 @@ public class HomeFragment extends Fragment { // フラグメントトランザクションをコミット transaction.commit(); } -} \ No newline at end of file + + private boolean updateUiState(boolean state) { + Log.d("HomeFragment", "updateUiState: called"); + // Init + TextView tv; + FrameLayout fl; + try { + tv = requireView().findViewById(R.id.situation); + fl = requireView().findViewById(R.id.situation_bg); + } catch (NullPointerException e) { + Log.d("HomeFragment", "updateUiState: view is null"); + 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); + return false; + } + String get_on = "\n乗車状態"; + String get_off = "\n降車状態"; + if (state) { + //乗車状態にする + fl.setBackground(ResourcesCompat.getDrawable(getResources(), R.drawable.frame_style_orange, null)); + tv.setText(get_on); + } else { + //降車状態にする + fl.setBackground(ResourcesCompat.getDrawable(getResources(), R.drawable.frame_style, null)); + tv.setText(get_off); + } + + return true; + } + + @Override + public boolean onEvent(boolean state) { + Log.d("HomeFragment", "onEvent: called"); + return updateUiState(state); + } +} + diff --git a/app/src/main/java/com/example/childguard/MainActivity.java b/app/src/main/java/com/example/childguard/MainActivity.java index 50dc31a..e89413c 100644 --- a/app/src/main/java/com/example/childguard/MainActivity.java +++ b/app/src/main/java/com/example/childguard/MainActivity.java @@ -1,7 +1,11 @@ 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; @@ -10,9 +14,17 @@ import android.annotation.SuppressLint; import android.app.NotificationChannel; import android.app.NotificationManager; import android.bluetooth.BluetoothAdapter; +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.pm.PackageManager; +import android.graphics.Color; +import android.graphics.Paint; +import android.net.Uri; import android.os.Bundle; import android.os.Vibrator; @@ -24,23 +36,41 @@ 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.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.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; + 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; public class MainActivity extends AppCompatActivity { BluetoothManager bluetoothManager; BluetoothAdapter bluetoothAdapter; + DocumentReference mDocRef; + + private HomeFragment homeFragment; + public static final String TAG = "InspirationQuote"; - private DocumentReference mDocRef = FirebaseFirestore.getInstance().document("users/rrVGKi77MAemxvPZrktm");//現在の位置を取得 + boolean flg = false; //↓日付を取得するやつ @@ -50,69 +80,188 @@ public class MainActivity extends AppCompatActivity { return df.format(date); } + private final ActivityResultLauncher QrLauncher = registerForActivityResult( + new ScanContract(), + result -> { + String contents = result.getContents(); + if (contents == null) { + Toast.makeText(this, "QRコードが読み取れませんでした", Toast.LENGTH_LONG).show(); + } else { + if (!contents.contains("https://practicefirestore1-8808c.web.app/")) { + Toast.makeText(this, "Chiled Guardに対応するQRコードではありません", Toast.LENGTH_LONG).show(); + } else { + //URLの表示 + Toast.makeText(this, contents, Toast.LENGTH_SHORT).show(); + //ブラウザを起動し、URL先のサイトを開く + CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); + CustomTabsIntent customTabsIntent = builder.build(); + customTabsIntent.launchUrl(this, Uri.parse(contents)); + } + } + } + ); + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - super.onStart(); +// super.onStart(); BottomNavigationView bottomNavigationView = findViewById(R.id.nav_view); + this.homeFragment = HomeFragment.newInstance("test", "tset"); + bottomNavigationView.setOnNavigationItemSelectedListener(v -> { if (v.getItemId() == findViewById(R.id.navigation_home).getId()) { + findViewById(R.id.fab_scan_qr_code).setVisibility(FrameLayout.VISIBLE); getSupportFragmentManager().beginTransaction() - .replace(findViewById(R.id.fragmentContainerView).getId(), HomeFragment.newInstance("test", "tset")) - .commit(); - } else if (v.getItemId() == findViewById(R.id.navigation_QR).getId()) { - getSupportFragmentManager().beginTransaction() - .replace(findViewById(R.id.fragmentContainerView).getId(), QRFragment.newInstance("test", "tset")) + .replace(findViewById(R.id.fragmentContainerView).getId(), this.homeFragment) + .addToBackStack(null) .commit(); } else if (v.getItemId() == findViewById(R.id.navigation_notification).getId()) { + findViewById(R.id.fab_scan_qr_code).setVisibility(FrameLayout.VISIBLE); getSupportFragmentManager().beginTransaction() .replace(findViewById(R.id.fragmentContainerView).getId(), NotificationFragment.newInstance("test", "test")) + .addToBackStack(null) + .commit(); + } else if (v.getItemId() == findViewById(R.id.navigation_settings).getId()) { + findViewById(R.id.fab_scan_qr_code).setVisibility(FrameLayout.GONE); + getSupportFragmentManager().beginTransaction() + .replace(findViewById(R.id.fragmentContainerView).getId(), SettingFragment.newInstance()) + .addToBackStack(null) .commit(); } - return true; - - }); + + findViewById(R.id.fab_scan_qr_code).setOnClickListener(v -> { + Log.d("MainActivity/Fab", "onClick: called"); + //QRリーダ起動 + ScanOptions options = new ScanOptions(); + options.setPrompt("QRコードを読み取ってください"); + QrLauncher.launch(options); + }); + + //Bluetooth検知機能 + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); + intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); + + if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { + Log.d("BT", "No permission to connect bluetooth devices"); + return; + } + else { + Log.d("BT", "Permission to connect bluetooth devices granted"); + } + registerReceiver(receiver, intentFilter); + + } + + @Override + protected void onResume() { + super.onResume(); + 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) { + Log.d("onResume", "ID not initialized."); + } else { + mDocRef = FirebaseFirestore.getInstance().document("users/" + IdPref);//現在の位置を取得 + this.flg = false; + 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","イベント開始"); + Log.d("nt", "イベント開始"); + //共有プリファレンス 書き込みの準備 + SharedPreferences.Editor E=sharedPreferences.edit(); + //車の乗り降りを管理するtrue=乗車、false=降車 + boolean isInCar = sharedPreferences.getBoolean("car", false); if (flg && documentSnapshot != null && documentSnapshot.exists()) { String parent = documentSnapshot.getString("parent"); - Log.d("nt","レスポンスを検知しました1"); - if (parent.equals("s")) { + Log.d("nt", "レスポンスを検知しました1"); - //通知のやつ↓ - 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 if (e != null) { - Log.w(TAG, "Got an exceptiion!", e); + 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 (fragment instanceof HomeFragment) { + ((HomeFragment) fragment).onEvent(!isInCar); + } else { + Log.d("nt", "HomeFragment is not visible"); + } } - } flg = true; } }); + } + + //Bluetoothの検知機能 + private final BroadcastReceiver receiver = new BroadcastReceiver() { + + @Override + 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(); + + if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { + 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)) { + //Do something if connected + Log.d("BT", "Device connected"); + + String registeredId = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getString("bluetooth_device_id", "none"); + + Log.d("BT_Judge", "Registered: " + registeredId); + + if (deviceHardwareAddress.equals(registeredId)) { + Log.d("BT_Judge", "登録済み"); + } else Log.d("BT_Judge", "未登録"); + + } else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) { + //Do something if disconnected + Log.d("BT", "Device disconnected"); + + } + } + }; + //↓通知のやつ public void notifyMain() { //↓通知をする際に起動するバイブレーション @@ -142,9 +291,18 @@ public class MainActivity extends AppCompatActivity { } + @Override + public void onStop() { + super.onStop(); + Intent intent = new Intent(getApplication(), TestService.class); + startService(intent); + } + //Bluetooth_setupの戻るボタン public void setupBackButton(boolean enableBackButton) { ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayHomeAsUpEnabled(enableBackButton); } + } + diff --git a/app/src/main/java/com/example/childguard/OnEventListener.java b/app/src/main/java/com/example/childguard/OnEventListener.java new file mode 100644 index 0000000..8bf8757 --- /dev/null +++ b/app/src/main/java/com/example/childguard/OnEventListener.java @@ -0,0 +1,6 @@ +package com.example.childguard; + +public interface OnEventListener { + + boolean onEvent(boolean state); +} diff --git a/app/src/main/java/com/example/childguard/QR.java b/app/src/main/java/com/example/childguard/QR.java index ebdf156..1c9c094 100644 --- a/app/src/main/java/com/example/childguard/QR.java +++ b/app/src/main/java/com/example/childguard/QR.java @@ -1,33 +1,33 @@ -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")); - } - } - ); - } - -} +//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 index fc0e0a8..5870462 100644 --- a/app/src/main/java/com/example/childguard/QRFragment.java +++ b/app/src/main/java/com/example/childguard/QRFragment.java @@ -9,6 +9,8 @@ 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; @@ -76,19 +78,21 @@ public class QRFragment extends Fragment { private final ActivityResultLauncher fragmentLauncher = registerForActivityResult(new ScanContract(), result -> { - //result.getContents()でURLを入手 - //読み取ったQRコードがChiled Guard用サイトのドメインを含むかの判定 - if(!((result.getContents()).contains("https://practicefirestore1-8808c.web.app/"))) { + 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(), result.getContents(), Toast.LENGTH_SHORT).show(); + Toast.makeText(getContext(), contents, Toast.LENGTH_SHORT).show(); //ブラウザを起動し、URL先のサイトを開く CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); CustomTabsIntent customTabsIntent = builder.build(); - customTabsIntent.launchUrl(requireContext(), Uri.parse(result.getContents())); + customTabsIntent.launchUrl(requireContext(), Uri.parse(contents)); } + getParentFragmentManager().popBackStack(); }); @Override @@ -97,15 +101,25 @@ public class QRFragment extends Fragment { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_qr, container, false); - Button cameraButton = view.findViewById(R.id.camera); - cameraButton.setOnClickListener(v -> { - Log.d("QRFragment", "onClick: called"); - //QRリーダ起動 - fragmentLauncher.launch(new ScanOptions()); - }); + 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 index d31ac6e..88ac807 100644 --- a/app/src/main/java/com/example/childguard/QrPrintFragment.java +++ b/app/src/main/java/com/example/childguard/QrPrintFragment.java @@ -1,5 +1,8 @@ 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; @@ -8,8 +11,11 @@ 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; @@ -59,7 +65,7 @@ public class QrPrintFragment extends Fragment { } @Override - public void onCreate(Bundle savedInstanceState) { + public void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mParam1 = getArguments().getString(ARG_PARAM1); @@ -68,18 +74,34 @@ public class QrPrintFragment extends Fragment { } } - @Override + // @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); - + View view=inflater.inflate(R.layout.fragment_qr_print, container, false);; //固定のドメイン String KoteiURL = "https://practicefirestore1-8808c.web.app/?id="; - //User毎のドメイン - String userURL="YKjFsZgJBlZmcyvdZ3Ap"; - //二つのドメインを合成する - String AllURL=KoteiURL+userURL; + //すべてのドメイン + 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; @@ -96,6 +118,7 @@ public class QrPrintFragment extends Fragment { 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(); // 元ファイルの幅取得 @@ -113,7 +136,21 @@ public class QrPrintFragment extends Fragment { 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/QrUtils.java b/app/src/main/java/com/example/childguard/QrUtils.java new file mode 100644 index 0000000..dc4f493 --- /dev/null +++ b/app/src/main/java/com/example/childguard/QrUtils.java @@ -0,0 +1,64 @@ +package com.example.childguard; + +import android.content.Context; +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.util.AndroidRuntimeException; +import android.util.Log; +import android.widget.ImageView; + +import androidx.print.PrintHelper; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.WriterException; +import com.journeyapps.barcodescanner.BarcodeEncoder; + +public class QrUtils { + + private Context context; + + public QrUtils setContext(Context context) { + this.context = context; + return this; + } + + public Bitmap getBitmap(String key) { + Log.d("getBitmap", "getBitmap: " + key); + String KoteiURL = "https://practicefirestore1-8808c.web.app/?id="; + //すべてのドメイン + String AllURL; + //IdPrefにの値が初期値の場合 + AllURL=KoteiURL+key; + + int size = 1500; + Bitmap QRGazou; + Bitmap bitmapqr; + try { + //QRコード生成 + BarcodeEncoder barcodeEncoder = new BarcodeEncoder(); + bitmapqr = barcodeEncoder.encodeBitmap(AllURL, BarcodeFormat.QR_CODE, size, size); + } catch (WriterException e) { + throw new AndroidRuntimeException("Barcode Error.", e); + } + // 画像合成の準備 + Bitmap bitmap = BitmapFactory.decodeResource(this.context.getResources(), R.drawable.a_group_qr_sos); + 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 - bitmapqr.getWidth()) / 2; + int disHeight = (int) ((height - bitmapqr.getHeight()) / 1.3); + canvas.drawBitmap(bitmap, 0, 0, (Paint) null); + canvas.drawBitmap(bitmapqr, disWidth, disHeight, (Paint) null); // 画像合成 + //Androidからプリンターへ印刷指示を出すサポートライブラリ + return QRGazou; + } +} diff --git a/app/src/main/java/com/example/childguard/RecyclerAdapter.java b/app/src/main/java/com/example/childguard/RecyclerAdapter.java index ea0eea1..3aeb1fc 100644 --- a/app/src/main/java/com/example/childguard/RecyclerAdapter.java +++ b/app/src/main/java/com/example/childguard/RecyclerAdapter.java @@ -1,5 +1,9 @@ package com.example.childguard; +import android.bluetooth.BluetoothAdapter; +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -8,19 +12,26 @@ import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; +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 { ArrayList deviceList; + Context applicationContext; + View parentView; + // Constructor - public RecyclerAdapter(ArrayList deviceList) { + public RecyclerAdapter(ArrayList deviceList, Context applicationContext, View parentView) { // Init Log.d("RecyclerAdapter", "Constructor called"); this.deviceList = deviceList; + this.applicationContext = applicationContext; + this.parentView = parentView; } @NonNull @@ -35,7 +46,28 @@ public class RecyclerAdapter extends RecyclerView.Adapter { - Toast.makeText(v.getContext(), deviceList.get(position)[1], Toast.LENGTH_SHORT).show(); + + // アラートダイアログを表示 + new AlertDialog.Builder(v.getContext()) + .setTitle("登録") + .setMessage("このデバイスを登録しますか?") + .setPositiveButton(android.R.string.ok, (dialog, which) -> { + // OK button pressed + Toast.makeText(v.getContext(), "OK button clicked", Toast.LENGTH_SHORT).show(); + //共有プリファレンスに保存 + SharedPreferences sharedPreferences=PreferenceManager.getDefaultSharedPreferences(this.applicationContext); + sharedPreferences.edit().putString("bluetooth_device_id", deviceList.get(position)[1]).apply(); + sharedPreferences.edit().putString("bluetooth_device_name",deviceList.get(position)[0]).apply(); + Toast.makeText(v.getContext(),PreferenceManager.getDefaultSharedPreferences(this.applicationContext).getString("bluetooth_device_id","none"), Toast.LENGTH_SHORT).show(); + + TextView textView = this.parentView.findViewById(R.id.registered_device); + textView.setText(PreferenceManager.getDefaultSharedPreferences(this.applicationContext).getString("bluetooth_device_name","none")); + + + + }) + .setNegativeButton(android.R.string.cancel, null) + .show(); }); } diff --git a/app/src/main/java/com/example/childguard/RecyclerAdapter2.java b/app/src/main/java/com/example/childguard/RecyclerAdapter2.java new file mode 100644 index 0000000..c2e2606 --- /dev/null +++ b/app/src/main/java/com/example/childguard/RecyclerAdapter2.java @@ -0,0 +1,86 @@ +package com.example.childguard; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.ArrayList; + +//RecyclerView.Adapterクラスを継承 +public class RecyclerAdapter2 extends RecyclerView.Adapter { + + ArrayList arrayList; + + //RecyclerAdapterのコンストラクタ + public RecyclerAdapter2(ArrayList arrayList, Context applicationContext) { + this.arrayList = arrayList; + } + + //新しいViewHolderを生成すると呼び出される + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + + //recycler_row.xmlをactivity_main.xmlの部品にする + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.recycler_row, parent, false); + + //新しいViewHolderを作成 + //ItemViewHolderクラスを呼び出す + ItemViewHolder holder = new ItemViewHolder(view); + + //クリックイベントを登録 + holder.itemView.setOnClickListener(v -> { + //クリックされた行を取得 + int position = holder.getAdapterPosition(); + + //クリックされた文字をトースト表示 + Toast.makeText(v.getContext(), arrayList.get(position), Toast.LENGTH_SHORT).show(); + + //クリックされた行を削除 + arrayList.remove(position); + + //行が削除されたことを画面に通知 + notifyItemRemoved(position); + }); + + //生成したViewHolderを戻す + return holder; + } + + //1行分のレイアウトの詳細設定 + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + //指定された位置の値を取得 + holder.getTextView().setText(arrayList.get(position)); + } + + //ArrayListのデータ件数を取得 + @Override + public int getItemCount() { + return arrayList.size(); + } +} + +//RecyclerView.ViewHolderクラスを継承 +class ItemViewHolder extends RecyclerView.ViewHolder { + private final TextView textView; + + //ItemViewHolderのコンストラクタ + public ItemViewHolder(View view) { + super(view); + //ViewHolderのビューにテキストを定義する + textView = view.findViewById(R.id.textView1); + } + + //テキストの値を取得 + public TextView getTextView() { + return textView; + } +} diff --git a/app/src/main/java/com/example/childguard/SettingFragment.java b/app/src/main/java/com/example/childguard/SettingFragment.java new file mode 100644 index 0000000..6fd9aa9 --- /dev/null +++ b/app/src/main/java/com/example/childguard/SettingFragment.java @@ -0,0 +1,116 @@ +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 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 com.google.firebase.firestore.FirebaseFirestore; + +import java.util.HashMap; +import java.util.Map; + +/** + * A simple {@link Fragment} subclass. + * Use the {@link SettingFragment#newInstance} factory method to + * create an instance of this fragment. + */ +public class SettingFragment extends Fragment { + + FirebaseFirestore db; + public SettingFragment() { + // Required empty public constructor + } + + public static SettingFragment newInstance() { + SettingFragment fragment = new SettingFragment(); + Bundle args = new Bundle(); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_setting, container, false); + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + db = FirebaseFirestore.getInstance();//Firebaseとの紐づけ + + view.findViewById(R.id.button_bluetooth_setting).setOnClickListener( v -> { + getParentFragmentManager().beginTransaction().replace(R.id.fragmentContainerView, bluetooth_setupFragment.newInstance("test", "test")).addToBackStack(null).commit(); + }); + + view.findViewById(R.id.button_print_qr).setOnClickListener( v -> { + SharedPreferences sharedPreferences = getActivity().getSharedPreferences("app_situation", MODE_PRIVATE); + boolean alreadySaved = sharedPreferences.getBoolean("alreadySaved", false); + //falseのときにFirebaseへの登録 + if (alreadySaved) { + Log.d("HomeFragment", "already printed"); + //画面遷移&ID受け渡し + 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の宣言 + + Log.d("HomeFragment", "onClick is called"); + + //mapに入れる + user.put("parent", valueParent); + user.put("born", valueBorn); + //新しいドキュメントにIDを作って追加 + db.collection("users") + .add(user) + .addOnSuccessListener(documentReference -> { + //成功したら + //documentReference.getId()でID取得 + Log.d(TAG, "DocumentSnapshot added with ID: " + documentReference.getId()); + SharedPreferences.Editor e = sharedPreferences.edit(); + // キー"alreadySaved"の値をtrueにする + e.putBoolean("alreadySaved", true); + //確定処理 + e.apply(); + //画面遷移&ID受け渡し + SharedPreferences sharedPreferences1 = getActivity().getSharedPreferences("app_situation", MODE_PRIVATE); + SharedPreferences.Editor editor = sharedPreferences1.edit(); + editor.putString("ID", documentReference.getId()); + editor.apply(); + + Toast.makeText(getActivity(), "初回登録", Toast.LENGTH_SHORT).show(); + getParentFragmentManager().beginTransaction().addToBackStack(null).replace(R.id.fragmentContainerView, GenerateQrFragment.newInstance(documentReference.getId())).commit(); + }) + .addOnFailureListener(e -> { + //失敗したら + Log.w(TAG, "Error adding document", e); + }); + } + }); + } +} \ 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 new file mode 100644 index 0000000..4547978 --- /dev/null +++ b/app/src/main/java/com/example/childguard/TestService.java @@ -0,0 +1,128 @@ +package com.example.childguard; + +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.Service; +import android.bluetooth.BluetoothDevice; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.os.IBinder; +import android.os.Vibrator; +import android.preference.PreferenceManager; +import android.util.Log; + +import androidx.annotation.Nullable; +import androidx.core.app.ActivityCompat; +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationManagerCompat; + +public class TestService extends Service { + + public int onStartCommand(Intent intent, int flags, int startId) { + + //Bluetooth検知機能 + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); + intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); + + if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { + Log.d("BT", "No permission to connect bluetooth devices"); + + } + else { + Log.d("BT", "Permission to connect bluetooth devices granted"); + } + + + registerReceiver(receiver, intentFilter); + //audioStart(); + + return START_NOT_STICKY; + + + } + + private final BroadcastReceiver receiver = new BroadcastReceiver() { + + @Override + 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(); + + if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { + 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)) { + //Do something if connected + Log.d("BT", "Device connected"); + + String registeredId = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getString("bluetooth_device_id", "none"); + + Log.d("BT_Judge", "Registered: " + registeredId); + + if (deviceHardwareAddress.equals(registeredId)) { + Log.d("BT_Judge", "登録済み"); + } else Log.d("BT_Judge", "未登録"); + + } else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) { + //Do something if disconnected + Log.d("BT", "Device disconnected"); + + } + } + }; + + private void audioStart(){ + //↓通知をする際に起動するバイブレーション + ((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); + + + 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()); + + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + + + return null; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/childguard/UrlPageActivity.java b/app/src/main/java/com/example/childguard/UrlPageActivity.java deleted file mode 100644 index 45b59c0..0000000 --- a/app/src/main/java/com/example/childguard/UrlPageActivity.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.example.childguard; - -import androidx.appcompat.app.AppCompatActivity; - -import android.content.SharedPreferences; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.webkit.WebView; - -public class UrlPageActivity extends AppCompatActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_url_page); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/example/childguard/bluetooth_setupFragment.java b/app/src/main/java/com/example/childguard/bluetooth_setupFragment.java index 2507185..14d4044 100644 --- a/app/src/main/java/com/example/childguard/bluetooth_setupFragment.java +++ b/app/src/main/java/com/example/childguard/bluetooth_setupFragment.java @@ -1,5 +1,6 @@ package com.example.childguard; +import android.annotation.SuppressLint; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; @@ -15,11 +16,13 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import android.preference.PreferenceManager; import android.util.Log; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.TextView; import java.util.ArrayList; import java.util.Objects; @@ -100,9 +103,9 @@ public class bluetooth_setupFragment extends Fragment { } Set pairedDevices = bluetoothAdapter.getBondedDevices(); - RecyclerView recyclerView = view.findViewById(R.id.recyclerView1); + RecyclerView recyclerView1 = view.findViewById(R.id.recyclerView1); //RecyclerViewのサイズを固定 - recyclerView.setHasFixedSize(true); + recyclerView1.setHasFixedSize(true); //RecyclerViewに区切り線を入れる // RecyclerView.ItemDecoration itemDecoration = @@ -111,7 +114,8 @@ public class bluetooth_setupFragment extends Fragment { //レイアウトマネージャを設 RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext()); - recyclerView.setLayoutManager(layoutManager); + recyclerView1.setLayoutManager(layoutManager); + //recyclerView2.setLayoutManager(layoutManager); //①リスト構造(String型の可変長の配列)を宣言 ArrayList arrayList = new ArrayList<>(); @@ -134,14 +138,21 @@ public class bluetooth_setupFragment extends Fragment { Log.d("b", s[0]); } Log.d(" ", String.valueOf(arrayList.size())); - RecyclerAdapter adapter = new RecyclerAdapter(arrayList); + RecyclerAdapter adapter = new RecyclerAdapter(arrayList, requireActivity().getApplicationContext(), view); + //④RecyclerViewとAdapterの結び付け - recyclerView.setAdapter(adapter); + recyclerView1.setAdapter(adapter); + TextView textView=view.findViewById(R.id.registered_device); + textView.setText(PreferenceManager.getDefaultSharedPreferences(requireActivity().getApplicationContext()).getString("bluetooth_device_name","none")); + + + } return view; } + } \ No newline at end of file diff --git a/app/src/main/res/drawable/baseline_app_settings_alt_24.xml b/app/src/main/res/drawable/baseline_app_settings_alt_24.xml new file mode 100644 index 0000000..875e221 --- /dev/null +++ b/app/src/main/res/drawable/baseline_app_settings_alt_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 5377215..90b2a97 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -8,7 +8,8 @@ android:layout_height="match_parent" android:orientation="vertical" android:background="@color/white" - tools:context=".MainActivity"> + tools:context=".MainActivity" + > + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_url_page.xml b/app/src/main/res/layout/activity_url_page.xml deleted file mode 100644 index 61bc31b..0000000 --- a/app/src/main/res/layout/activity_url_page.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_bluetooth_setup.xml b/app/src/main/res/layout/fragment_bluetooth_setup.xml index 84e47b3..df088f3 100644 --- a/app/src/main/res/layout/fragment_bluetooth_setup.xml +++ b/app/src/main/res/layout/fragment_bluetooth_setup.xml @@ -6,21 +6,53 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" + android:background="@color/white" tools:context=".bluetooth_setupFragment"> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_generate_qr.xml b/app/src/main/res/layout/fragment_generate_qr.xml new file mode 100644 index 0000000..27933f9 --- /dev/null +++ b/app/src/main/res/layout/fragment_generate_qr.xml @@ -0,0 +1,46 @@ + + + + + + + +