Compare commits
	
		
			No commits in common. "main" and "hotfix-isInCar" have entirely different histories.
		
	
	
		
			main
			...
			hotfix-isI
		
	
		
| @ -8,7 +8,6 @@ | ||||
|     <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> | ||||
|     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> | ||||
|     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> | ||||
|     <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> | ||||
|     <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> | ||||
|     <uses-permission android:name="android.permission.VIBRATE" /> | ||||
|     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> | ||||
|  | ||||
| @ -99,6 +99,20 @@ public class HomeFragment extends Fragment  { | ||||
|         return isInCar; | ||||
|     } | ||||
| 
 | ||||
|     //画面遷移メソッド | ||||
|     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(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 乗車状態の画面を切り替える | ||||
|      */ | ||||
| @ -171,5 +185,12 @@ public class HomeFragment extends Fragment  { | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
| //    @Override | ||||
| //    public boolean onEvent(boolean isInCar) {//乗車状態と降車状態の変更を受け取ってupdateUiState()に渡す | ||||
| //        Log.d("HomeFragment", "onEvent: called"); | ||||
| // | ||||
| //        return updateUiState(isInCar); | ||||
| //    } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -32,6 +32,7 @@ import com.google.firebase.firestore.FirebaseFirestore; | ||||
| import com.journeyapps.barcodescanner.ScanContract; | ||||
| import com.journeyapps.barcodescanner.ScanOptions; | ||||
| 
 | ||||
| // Manifest | ||||
| import android.Manifest; | ||||
| 
 | ||||
| import java.util.HashMap; | ||||
| @ -40,12 +41,15 @@ import java.util.Map; | ||||
| public class MainActivity extends AppCompatActivity { | ||||
| 
 | ||||
|     FirebaseFirestore db; | ||||
| 
 | ||||
| 
 | ||||
|     DocumentReference mDocRef; | ||||
| 
 | ||||
|     private HomeFragment homeFragment = HomeFragment.newInstance("test", "test"); | ||||
|     private HomeFragment homeFragment = HomeFragment.newInstance("test", "test");; | ||||
| 
 | ||||
|     public static final String TAG = "InspirationQuote"; | ||||
| 
 | ||||
| 
 | ||||
|     private final ActivityResultLauncher<ScanOptions> QrLauncher = registerForActivityResult( | ||||
|             new ScanContract(), | ||||
|             result -> { | ||||
| @ -67,13 +71,13 @@ public class MainActivity extends AppCompatActivity { | ||||
|     protected void onCreate(Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|         setContentView(R.layout.activity_main); | ||||
|         Log.d(TAG, "onCreate: called"); | ||||
| 
 | ||||
|         //Bluetooth接続判定用 | ||||
|         SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); | ||||
|         SharedPreferences.Editor e = pref.edit(); | ||||
|         e.putBoolean("connection_status", false); | ||||
| 
 | ||||
|         // Check permissions | ||||
| 
 | ||||
|         if (!hasPermissions()) { | ||||
|             requestPermissions(); | ||||
|         } | ||||
| @ -81,14 +85,15 @@ public class MainActivity extends AppCompatActivity { | ||||
|         BottomNavigationView bottomNavigationView = findViewById(R.id.nav_view); | ||||
| 
 | ||||
|         this.homeFragment = HomeFragment.newInstance("test", "test"); | ||||
|         if (savedInstanceState == null) { | ||||
|         if(savedInstanceState == null){ | ||||
|             getSupportFragmentManager().beginTransaction() | ||||
|                     .replace(findViewById(R.id.fragmentContainerView).getId(), this.homeFragment) | ||||
|                     .addToBackStack(null) | ||||
|                     .commit(); | ||||
|         } | ||||
| 
 | ||||
|         bottomNavigationView.setOnNavigationItemSelectedListener(v -> { | ||||
|         bottomNavigationView.setOnNavigationItemSelectedListener(v -> | ||||
|         { | ||||
|             if (v.getItemId() == findViewById(R.id.navigation_home).getId()) { | ||||
|                 Log.d("MainActivity", "navigation_home: called"); | ||||
|                 findViewById(R.id.fab_scan_qr_code).setVisibility(FrameLayout.VISIBLE); | ||||
| @ -96,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_settings).getId()) { | ||||
|                 Log.d("MainActivity", "navigation_settings: called"); | ||||
|                 findViewById(R.id.fab_scan_qr_code).setVisibility(FrameLayout.GONE); | ||||
| @ -123,18 +130,16 @@ public class MainActivity extends AppCompatActivity { | ||||
|         intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); | ||||
| 
 | ||||
|         db = FirebaseFirestore.getInstance();//Firebaseとの紐づけ | ||||
| 
 | ||||
|         String btPermission = getBluetoothConnectPermission(); | ||||
|         if (ActivityCompat.checkSelfPermission(this, btPermission) != PackageManager.PERMISSION_GRANTED) { | ||||
|         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); | ||||
| 
 | ||||
|             startForegroundService(new Intent(this, SurveillanceService.class)); | ||||
|         } | ||||
|         registerReceiver(receiver, intentFilter); | ||||
| 
 | ||||
|         startForegroundService(new Intent(this, SurveillanceService.class)); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
| @ -142,21 +147,16 @@ public class MainActivity extends AppCompatActivity { | ||||
|     protected void onResume() { | ||||
|         super.onResume(); | ||||
|         Log.d("MainActivity onResume", "called"); | ||||
| //        Log.d("MainActivity onResume", "mDocRef is null"); | ||||
|         firebaseLink(); | ||||
|     } | ||||
| 
 | ||||
|     // 権限チェック用ヘルパーメソッドを追加 | ||||
|     private String getBluetoothConnectPermission() { | ||||
|         return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) ? | ||||
|                 Manifest.permission.BLUETOOTH_CONNECT : | ||||
|                 Manifest.permission.BLUETOOTH; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 乗車状態の変更 | ||||
|      */ | ||||
|     public void changeIsInCar() { | ||||
|         //共有プリファレンス全体の準備 | ||||
|         SharedPreferences sharedPreferences = MainActivity.this.getSharedPreferences("app_situation", MODE_PRIVATE); | ||||
|         //共有プリファレンス 書き込みの準備 | ||||
|         SharedPreferences.Editor E = sharedPreferences.edit(); | ||||
|         SharedPreferences.Editor E2 = sharedPreferences.edit(); | ||||
|         String IdPref = sharedPreferences.getString("ID", null);//アプリに記録されているIDの取得 | ||||
| @ -168,104 +168,93 @@ public class MainActivity extends AppCompatActivity { | ||||
|         Map<String, Boolean> DEFAULT_ITEM = new HashMap<>();//mapの宣言 | ||||
|         if (!change) { | ||||
|             //isInCarをtrueに更新 | ||||
|             Log.d("MainActivity", "change:" + change); | ||||
|             Log.d("MainActivity", "change:"+change); | ||||
|             E.putBoolean("change", true); | ||||
|             E.apply(); | ||||
|             Log.d("MainActivity", "change:" + sharedPreferences.getBoolean("change", false)); | ||||
|             Log.d("MainActivity", "change:"+sharedPreferences.getBoolean("change",false)); | ||||
|         } else { | ||||
|             Log.d("MainActivity", "change:" + change); | ||||
|             Log.d("MainActivity", "change:"+change); | ||||
|             E.putBoolean("change", false); | ||||
|             E.apply(); | ||||
|             Log.d("MainActivity", "change:" + sharedPreferences.getBoolean("change", false)); | ||||
|             Log.d("MainActivity", "change:"+sharedPreferences.getBoolean("change",false)); | ||||
|         } | ||||
|         Log.d("MainActivity", "changeIsInCar: " + sharedPreferences.getBoolean("change", false)); | ||||
|         isReported.update("isInCar", sharedPreferences.getBoolean("change", false)) | ||||
|                 .addOnSuccessListener(unused -> Log.d(TAG, "DocumentSnapshot successfully updated!!")) | ||||
|                 .addOnFailureListener(e -> Log.w(TAG, "Error updating document", e)); | ||||
|         E2.putBoolean("isInCarPref", sharedPreferences.getBoolean("change", false)); | ||||
|         Log.d("MainActivity", "changeIsInCar: "+sharedPreferences.getBoolean("change",false)); | ||||
|         isReported.update("isInCar", sharedPreferences.getBoolean("change",false)).addOnSuccessListener(unused -> Log.d(TAG, "DocumentSnapshot successfully updated!!")).addOnFailureListener(e -> Log.w(TAG, "Error updating document", e)); | ||||
|         E2.putBoolean("isInCarPref", sharedPreferences.getBoolean("change",false)); | ||||
|         E2.apply(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 権限の保有を確認する | ||||
|      * @return | ||||
|      */ | ||||
|     private boolean hasPermissions() { | ||||
|         boolean allGranted = true; | ||||
|     private void updateIsInCarPref(DocumentReference mDocRef) {//サイト上で押されたボタンの管理 | ||||
|         // 共有プリファレンス全体の準備 | ||||
|         SharedPreferences sharedPreferences = getSharedPreferences("app_situation", MODE_PRIVATE); | ||||
|         Log.d("MainActivity", "updateIsInCarPref: called"); | ||||
| 
 | ||||
|         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { | ||||
|             // <= Android 11 (API 30) | ||||
|             allGranted &= (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH) | ||||
|                     == PackageManager.PERMISSION_GRANTED); | ||||
|             allGranted &= (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_ADMIN) | ||||
|                     == PackageManager.PERMISSION_GRANTED); | ||||
|         } else { | ||||
|             // >= Android 12 (API 31) | ||||
|             allGranted &= (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_SCAN) | ||||
|                     == PackageManager.PERMISSION_GRANTED); | ||||
|             allGranted &= (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) | ||||
|                     == PackageManager.PERMISSION_GRANTED); | ||||
|         } | ||||
|         mDocRef.addSnapshotListener(this, (documentSnapshot, e) -> { | ||||
| 
 | ||||
|         // Location | ||||
|         allGranted &= (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) | ||||
|                 == PackageManager.PERMISSION_GRANTED); | ||||
|         allGranted &= (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) | ||||
|                 == PackageManager.PERMISSION_GRANTED); | ||||
| 
 | ||||
|         // >= Android 13 (API 32) | ||||
|         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { | ||||
|             allGranted &= (ActivityCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) | ||||
|                     == PackageManager.PERMISSION_GRANTED); | ||||
|         } | ||||
| 
 | ||||
|         // Others | ||||
|         allGranted &= (ActivityCompat.checkSelfPermission(this, Manifest.permission.VIBRATE) | ||||
|                 == PackageManager.PERMISSION_GRANTED); | ||||
|         allGranted &= (ActivityCompat.checkSelfPermission(this, Manifest.permission.FOREGROUND_SERVICE) | ||||
|                 == PackageManager.PERMISSION_GRANTED); | ||||
| 
 | ||||
|         return allGranted; | ||||
|             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")) {//isReportedがfalseのとき=サイト上で保護者ボタンが押されたとき | ||||
| //                    if (fragment instanceof HomeFragment) {//fragmentがHomeFragmentのインスタンスかの判定 | ||||
| ////                        changes-situation();//  changes-situation()メソッドを処理→アプリ側の乗降状態を変化 | ||||
| ////                        ((HomeFragment) fragment).onEvent(!isInCar); | ||||
| //                    } | ||||
| //                } else if (isInCar) {//第三者ボタンが押されたときにisInCarがtrueのとき=乗車状態のとき→いたずら防止 | ||||
| //                    int importance = NotificationManager.IMPORTANCE_DEFAULT; | ||||
| //                    NotificationChannel channel = new NotificationChannel("CHANNEL_ID", "通報通知", importance); | ||||
| //                    channel.setDescription("第3者からの通報を検知しました"); | ||||
| //                    NotificationManager notificationManager = getSystemService(NotificationManager.class); | ||||
| //                    notificationManager.createNotificationChannel(channel); | ||||
| //                    Log.d("nt", "レスポンスを検知しました2"); | ||||
| //                    NotificationSetting();//通知に関する設定のメソッド | ||||
| //                    Notification(getApplicationContext());//通知を行うメソッド | ||||
| //                    ResetReported();// ResetReported();メソッドを処理→FireBaseのisReportedをfalseにする | ||||
| //                } else {//第三者ボタンが押されたときにisInCarがfalseのとき=降車状態のとき | ||||
| //                    ResetReported();// ResetReported();を処理→FireBaseのisReportedをfalseにする | ||||
| //                    Log.d("nt", "何もなし"); | ||||
| //                } | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     private boolean hasPermissions() { | ||||
|         return ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH) == PackageManager.PERMISSION_GRANTED && | ||||
|                 ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_ADMIN) == PackageManager.PERMISSION_GRANTED && | ||||
|                 ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_SCAN) == PackageManager.PERMISSION_GRANTED && | ||||
|                 ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED && | ||||
|                 ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && | ||||
|                 ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED && | ||||
|                 ActivityCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED && | ||||
|                 ActivityCompat.checkSelfPermission(this, Manifest.permission.VIBRATE) == PackageManager.PERMISSION_GRANTED && | ||||
|                 ActivityCompat.checkSelfPermission(this, Manifest.permission.FOREGROUND_SERVICE) == PackageManager.PERMISSION_GRANTED; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 権限のリクエストを行う | ||||
|      */ | ||||
|     private void requestPermissions() { | ||||
|         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { | ||||
|             // <= Android 11 (API 30) | ||||
|             ActivityCompat.requestPermissions(this, | ||||
|                     new String[]{ | ||||
|                             Manifest.permission.BLUETOOTH, | ||||
|                             Manifest.permission.BLUETOOTH_ADMIN, | ||||
|                             Manifest.permission.ACCESS_FINE_LOCATION, | ||||
|                             Manifest.permission.ACCESS_COARSE_LOCATION, | ||||
|                             Manifest.permission.VIBRATE, | ||||
|                             Manifest.permission.FOREGROUND_SERVICE, | ||||
|                     }, | ||||
|                     2 | ||||
|             ); | ||||
|         } else { | ||||
|             // >= Android 12 (API 31) | ||||
|             ActivityCompat.requestPermissions(this, | ||||
|                     new String[]{ | ||||
|                             Manifest.permission.BLUETOOTH_SCAN, | ||||
|                             Manifest.permission.BLUETOOTH_CONNECT, | ||||
|                             Manifest.permission.ACCESS_FINE_LOCATION, | ||||
|                             Manifest.permission.ACCESS_COARSE_LOCATION, | ||||
|                             Manifest.permission.POST_NOTIFICATIONS, | ||||
|                             Manifest.permission.VIBRATE, | ||||
|                             Manifest.permission.FOREGROUND_SERVICE | ||||
|                     }, | ||||
|                     2 | ||||
|             ); | ||||
|         } | ||||
|         ActivityCompat.requestPermissions(this, | ||||
|                 new String[]{ | ||||
|                         Manifest.permission.BLUETOOTH, | ||||
|                         Manifest.permission.BLUETOOTH_ADMIN, | ||||
|                         Manifest.permission.BLUETOOTH_SCAN, | ||||
|                         Manifest.permission.BLUETOOTH_CONNECT, | ||||
|                         Manifest.permission.ACCESS_FINE_LOCATION, | ||||
|                         Manifest.permission.ACCESS_COARSE_LOCATION, | ||||
|                         Manifest.permission.POST_NOTIFICATIONS, | ||||
|                         Manifest.permission.VIBRATE, | ||||
|                         Manifest.permission.FOREGROUND_SERVICE | ||||
|                 }, | ||||
|                 2); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void onRequestPermissionsResult(int requestCode, | ||||
|                                            @NonNull String[] permissions, | ||||
|                                            @NonNull int[] grantResults) { | ||||
|     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { | ||||
|         super.onRequestPermissionsResult(requestCode, permissions, grantResults); | ||||
|         if (requestCode == 2) { | ||||
|             if (!hasPermissions()) { | ||||
| @ -274,27 +263,155 @@ public class MainActivity extends AppCompatActivity { | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * FireBaseのIDの取得 | ||||
|      */ | ||||
|     public void firebaseLink() {//Firebaseのドキュメントの取得 | ||||
|         Log.d("MainActivity", "firebaseLink: called"); | ||||
|         //共有プリファレンス全体の準備 | ||||
|         SharedPreferences sharedPreferences = getSharedPreferences("app_situation", MODE_PRIVATE); | ||||
|         String IdPref = sharedPreferences.getString("ID", null);//アプリに記録されているIDの取得 | ||||
|         if (IdPref == null) { | ||||
|             Log.d("onResume", "ID not initialized."); | ||||
|         } else { | ||||
|             mDocRef = FirebaseFirestore.getInstance().document("status/" + IdPref);//現在の位置を取得 | ||||
|             //updateIsInCarPref(mDocRef);//現在の位置を引数に initNotification()を処理 | ||||
|         } | ||||
|     } | ||||
|     /** | ||||
|      * FireBaseのisReportedをfalseに初期化するメソッド | ||||
|      */ | ||||
| //    public void ResetReported() { | ||||
| //        //共有プリファレンス全体の準備 | ||||
| //        SharedPreferences sharedPreferences = MainActivity.this.getSharedPreferences("app_situation", MODE_PRIVATE); | ||||
| //        String IdPref = sharedPreferences.getString("ID", null);//アプリに記録されているIDの取得 | ||||
| //        db = FirebaseFirestore.getInstance();//Firebaseとの紐づけ | ||||
| //        DocumentReference isReported = db.collection("status").document(IdPref);//更新するドキュメントとの紐づけ | ||||
| //        Map<String, Boolean> DEFAULT_ITEM = new HashMap<>();//mapの宣言 | ||||
| //        //isReportedをfalseに更新 | ||||
| //        isReported.update("isReported", false).addOnSuccessListener(unused -> Log.d(TAG, "DocumentSnapshot successfully updated!")).addOnFailureListener(e -> Log.w(TAG, "Error updating document", e)); | ||||
| //    } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * 第三者通知に関する設定のメソッド | ||||
|      */ | ||||
| //    public void 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 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("Bluetoothと車の切断から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 void Bluetooth_status() { | ||||
|         IntentFilter intentFilter = new IntentFilter(); | ||||
|         intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); | ||||
|         intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); | ||||
| 
 | ||||
|         String btPermission = getBluetoothConnectPermission(); | ||||
|         if (ActivityCompat.checkSelfPermission(this, btPermission) != PackageManager.PERMISSION_GRANTED) { | ||||
|         if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { | ||||
|             Log.d("BT", "No permission to connect bluetooth devices"); | ||||
|             return; | ||||
|         } else { | ||||
| @ -303,23 +420,26 @@ public class MainActivity extends AppCompatActivity { | ||||
|         registerReceiver(receiver, intentFilter); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     private final BroadcastReceiver receiver = new BroadcastReceiver() { | ||||
| 
 | ||||
| 
 | ||||
|         //PreferenceManager.getDefaultSharedPreferences("myPreferences",Context.MODE_PRIVATE); | ||||
| 
 | ||||
|         @Override | ||||
|         public void onReceive(Context context, Intent intent) { | ||||
|             SharedPreferences pref = getSharedPreferences("Bluetooth_situation", MODE_PRIVATE); | ||||
|             SharedPreferences.Editor e = pref.edit(); | ||||
|             String action = intent.getAction(); | ||||
|             String action = intent.getAction(); // may need to chain this to a recognizing function | ||||
|             BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); | ||||
|             boolean isInCar = pref.getBoolean("isInCarPref", false); | ||||
|             String btPermission = getBluetoothConnectPermission(); | ||||
|             if (ActivityCompat.checkSelfPermission(context, btPermission) != PackageManager.PERMISSION_GRANTED) { | ||||
|             Boolean isInCar = pref.getBoolean("isInCarPref", false); | ||||
|             if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { | ||||
|                 Log.d("BT", "No permission to connect bluetooth devices"); | ||||
|                 return; | ||||
|             } | ||||
|             String deviceHardwareAddress = device.getAddress(); // MAC address | ||||
| 
 | ||||
|             String registeredId = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()) | ||||
|                     .getString("bluetooth_device_id", "none"); | ||||
|             String registeredId = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getString("bluetooth_device_id", "none"); | ||||
| 
 | ||||
|             if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) { | ||||
|                 //Bluetoothデバイスが接続されたときの処理 | ||||
| @ -332,9 +452,14 @@ public class MainActivity extends AppCompatActivity { | ||||
|                     Log.d("BT_Judge", "登録済み"); | ||||
|                     changeBluetooth(true); | ||||
|                     e.putBoolean("connection_status", true); | ||||
|                     if (homeFragment != null && homeFragment.isVisible()) { | ||||
|                     if(homeFragment == null ){ | ||||
|                         Log.d("bluetooth", "homeFragment: null"); | ||||
|                     } | ||||
| 
 | ||||
|                     if(homeFragment != null && homeFragment.isVisible()){ | ||||
|                         homeFragment.updateBluetoothSituation(true); | ||||
|                     } | ||||
| 
 | ||||
|                 } else { | ||||
|                     //登録していないデバイスだったときの処理 | ||||
|                     Log.d("BT_Judge", "未登録"); | ||||
| @ -342,10 +467,11 @@ public class MainActivity extends AppCompatActivity { | ||||
|                 } | ||||
|                 e.apply(); | ||||
| 
 | ||||
|             } else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) { | ||||
|             }else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) { | ||||
|                 //bluetoothデバイスが切断されたときの処理 | ||||
|                 changeBluetooth(false); | ||||
|                 if (homeFragment != null && homeFragment.isVisible()) { | ||||
|                 Log.d("bluetooth", "homeFragment: "+homeFragment); | ||||
|                 if(homeFragment != null && homeFragment.isVisible()){ | ||||
|                     homeFragment.updateBluetoothSituation(false); | ||||
|                 } | ||||
|             } | ||||
| @ -356,9 +482,7 @@ public class MainActivity extends AppCompatActivity { | ||||
|      * Bluetoothの接続状態を変更するメソッド | ||||
|      */ | ||||
|     public void changeBluetooth(boolean actual) { | ||||
|         getSharedPreferences("Bluetooth_situation", MODE_PRIVATE) | ||||
|                 .edit() | ||||
|                 .putBoolean("status", actual) | ||||
|                 .apply(); | ||||
|         getSharedPreferences("Bluetooth_situation", MODE_PRIVATE).edit().putBoolean("status", actual).apply(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -53,15 +53,15 @@ public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ItemVi | ||||
|                     .setMessage("このデバイスを登録しますか?") | ||||
|                     .setPositiveButton(android.R.string.ok, (dialog, which) -> { | ||||
|                         // OK button pressed | ||||
| //                        Toast.makeText(v.getContext(), "OK button clicked", Toast.LENGTH_SHORT).show(); | ||||
|                         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(); | ||||
|                         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", "登録されていません")); | ||||
|                         textView.setText(PreferenceManager.getDefaultSharedPreferences(this.applicationContext).getString("bluetooth_device_name", "none")); | ||||
| 
 | ||||
| 
 | ||||
|                     }) | ||||
|  | ||||
| @ -1,6 +1,5 @@ | ||||
| package com.example.childguard; | ||||
| 
 | ||||
| import android.Manifest; | ||||
| import android.app.Notification; | ||||
| import android.app.NotificationChannel; | ||||
| import android.app.NotificationManager; | ||||
| @ -13,7 +12,6 @@ import android.content.Intent; | ||||
| import android.content.IntentFilter; | ||||
| import android.content.SharedPreferences; | ||||
| import android.content.pm.PackageManager; | ||||
| import android.os.Build; | ||||
| import android.os.Handler; | ||||
| import android.os.IBinder; | ||||
| import android.os.VibrationEffect; | ||||
| @ -69,9 +67,9 @@ public class SurveillanceService extends Service { | ||||
|     private static final String REPORTED_CHANNEL_ID = "child_guard_reported"; | ||||
|     private static final String BACKGROUND_CHANNEL_ID = "child_guard_background"; | ||||
|     private static final int REQUEST_CODE = 100; | ||||
|     private static final int NOTIFICATION_DELAY = 5 * 60 * 1000; // 5 minutes | ||||
| 
 | ||||
| 
 | ||||
| //    private static final int NOTIFICATION_DELAY = 5 * 60 * 1000; // 5 minutes | ||||
|     // DEBUG | ||||
|     private static final int NOTIFICATION_DELAY = 5 * 1000; // 15 seconds | ||||
|     private static final NotificationContent REPORTED_NOTIFICATION = | ||||
|             new NotificationContent("子供の置き去りをしていませんか?", "第三者からの通報が行われました。", REPORTED_CHANNEL_ID, 2); | ||||
|     private static final NotificationContent BLUETOOTH_NOTIFICATION = | ||||
| @ -171,8 +169,7 @@ public class SurveillanceService extends Service { | ||||
|      * @return Bluetoothの権限の有無 true: 許可されていない false: 許可されている | ||||
|      */ | ||||
|     private boolean isNotBluetoothGranted() { | ||||
|         String btPermission = getBluetoothConnectPermission(); | ||||
|         if (ActivityCompat.checkSelfPermission(this, btPermission) != PackageManager.PERMISSION_GRANTED) { | ||||
|         if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { | ||||
|             Log.d(TAG, "Bluetoothの権限が許可されていません"); | ||||
|             return true; | ||||
|         } else { | ||||
| @ -193,16 +190,6 @@ public class SurveillanceService extends Service { | ||||
|         registerReceiver(receiver, intentFilter); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Bluetoothの接続権限を取得 | ||||
|      * @return Bluetoothの接続権限 | ||||
|      */ | ||||
|     private String getBluetoothConnectPermission() { | ||||
|         return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) ? | ||||
|                 android.Manifest.permission.BLUETOOTH_CONNECT : | ||||
|                 Manifest.permission.BLUETOOTH; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Firestoreのスナップショットリスナーを設定 | ||||
|      * @param mDocRef Firestoreのドキュメントリファレンス | ||||
|  | ||||
| @ -7,7 +7,6 @@ import android.bluetooth.BluetoothDevice; | ||||
| import android.bluetooth.BluetoothManager; | ||||
| import android.content.Context; | ||||
| import android.content.pm.PackageManager; | ||||
| import android.os.Build; | ||||
| import android.os.Bundle; | ||||
| 
 | ||||
| import androidx.core.app.ActivityCompat; | ||||
| @ -24,7 +23,6 @@ import android.view.MenuItem; | ||||
| import android.view.View; | ||||
| import android.view.ViewGroup; | ||||
| import android.widget.TextView; | ||||
| import android.widget.Toast; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.Objects; | ||||
| @ -93,36 +91,15 @@ public class bluetooth_setupFragment extends Fragment { | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
| //        if (ActivityCompat.checkSelfPermission(requireActivity().getApplicationContext(), android.Manifest.permission.BLUETOOTH_CONNECT) != 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 view; | ||||
| //        } | ||||
| 
 | ||||
|         // >= Android 12 | ||||
|         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { | ||||
|             if (ActivityCompat.checkSelfPermission(requireActivity().getApplicationContext(), android.Manifest.permission.BLUETOOTH) != PackageManager.PERMISSION_GRANTED) { | ||||
|                 Log.w("Bluetooth", "Permission not granted(Android 12-)"); | ||||
|                 // show toast then force close the app (Workaround) | ||||
|                 Toast.makeText(requireActivity().getApplicationContext(), "Bluetoothの権限が必須です!", Toast.LENGTH_SHORT).show(); | ||||
|                 requireActivity().finish(); | ||||
|             } else { | ||||
|                 Log.w("Bluetooth", "Permission granted(Android 12-)"); | ||||
|             } | ||||
|         } else { | ||||
|             if (ActivityCompat.checkSelfPermission(requireActivity().getApplicationContext(), android.Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { | ||||
|                 Log.w("Bluetooth", "Permission not granted(Android 12+)"); | ||||
|                 // show toast then force close the app (Workaround) | ||||
|                 Toast.makeText(requireActivity().getApplicationContext(), "Bluetoothの権限が必須です!", Toast.LENGTH_SHORT).show(); | ||||
|                 requireActivity().finish(); | ||||
|             } else { | ||||
|                 Log.w("Bluetooth", "Permission granted(Android 12+)"); | ||||
|             } | ||||
|         if (ActivityCompat.checkSelfPermission(requireActivity().getApplicationContext(), android.Manifest.permission.BLUETOOTH_CONNECT) != 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 view; | ||||
|         } | ||||
|         Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices(); | ||||
| 
 | ||||
|  | ||||
| @ -1,74 +1,56 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:tools="http://schemas.android.com/tools" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="match_parent" | ||||
|     android:orientation="vertical" | ||||
|     android:padding="16dp" | ||||
|     tools:context=".SettingFragment"> | ||||
|     tools:context=".SettingFragment" | ||||
|     android:padding="16dp"> | ||||
| 
 | ||||
| 
 | ||||
|     <ImageView | ||||
|         android:src="@drawable/bluetooth_and_qr2" | ||||
|         android:layout_gravity="center_horizontal" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="200dp" | ||||
|         android:layout_marginTop="150dp" | ||||
|         /> | ||||
|     <TextView | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:textColor="@color/black" | ||||
|         android:text="QRコード印刷とBluetooth設定" | ||||
|         android:layout_gravity="center_horizontal" | ||||
|         android:textStyle="bold" | ||||
|         android:textSize="18dp" | ||||
|         android:layout_marginTop="20dp" | ||||
|         /> | ||||
| 
 | ||||
|     <Button | ||||
|         android:id="@+id/button_bluetooth_setting" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:text="Bluetooth設定" | ||||
|         android:layout_marginTop="120dp" | ||||
|         android:layout_marginBottom="20dp"/> | ||||
| 
 | ||||
|     <Button | ||||
|         android:id="@+id/button_print_qr" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:text="QRコード印刷"/> | ||||
| 
 | ||||
| 
 | ||||
|     <LinearLayout | ||||
|         android:id="@+id/linearLayout" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:orientation="vertical" | ||||
|         app:layout_constraintBottom_toBottomOf="parent" | ||||
|         app:layout_constraintEnd_toEndOf="parent" | ||||
|         app:layout_constraintStart_toStartOf="parent" | ||||
|         app:layout_constraintTop_toTopOf="parent"> | ||||
| 
 | ||||
|         <ImageView | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="200dp" | ||||
|             android:layout_gravity="center_horizontal" | ||||
|             android:src="@drawable/bluetooth_and_qr2" /> | ||||
|         android:layout_height="match_parent" | ||||
|         android:gravity="bottom"> | ||||
| 
 | ||||
|         <TextView | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_gravity="center_horizontal" | ||||
|             android:layout_marginTop="20dp" | ||||
|             android:text="QRコード印刷とBluetooth設定" | ||||
|             android:textColor="@color/black" | ||||
|             android:textSize="18dp" | ||||
|             android:textStyle="bold" /> | ||||
| 
 | ||||
|         <Button | ||||
|             android:id="@+id/button_bluetooth_setting" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:layout_marginTop="120dp" | ||||
|             android:layout_marginBottom="20dp" | ||||
|             android:text="Bluetooth設定" /> | ||||
| 
 | ||||
|         <Button | ||||
|             android:id="@+id/button_print_qr" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:text="QRコード印刷" /> | ||||
| 
 | ||||
|             android:text="QRコードは株式会社デンソーウェーブの登録商標です" | ||||
|             android:textColor="@color/black" /> | ||||
|     </LinearLayout> | ||||
| 
 | ||||
|     <LinearLayout | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:gravity="bottom" | ||||
|         app:layout_constraintBottom_toTopOf="@+id/linearLayout" | ||||
|         tools:layout_editor_absoluteX="16dp"> | ||||
| 
 | ||||
|     </LinearLayout> | ||||
| 
 | ||||
|     <TextView | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:text="QRコードは株式会社デンソーウェーブの登録商標です" | ||||
|         android:textColor="@color/black" | ||||
|         android:textSize="12sp" | ||||
|         app:layout_constraintBottom_toBottomOf="parent" | ||||
|         app:layout_constraintEnd_toEndOf="parent" | ||||
|         app:layout_constraintStart_toStartOf="parent" /> | ||||
| 
 | ||||
| 
 | ||||
| </androidx.constraintlayout.widget.ConstraintLayout> | ||||
| </LinearLayout> | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user