Compare commits
	
		
			No commits in common. "main" and "rca/fix_ui" have entirely different histories.
		
	
	
		
			main
			...
			rca/fix_ui
		
	
		
|  | @ -6,7 +6,7 @@ | ||||||
|       <GradleProjectSettings> |       <GradleProjectSettings> | ||||||
|         <option name="testRunner" value="GRADLE" /> |         <option name="testRunner" value="GRADLE" /> | ||||||
|         <option name="externalProjectPath" value="$PROJECT_DIR$" /> |         <option name="externalProjectPath" value="$PROJECT_DIR$" /> | ||||||
|         <option name="gradleJvm" value="jbr-17" /> |         <option name="gradleJvm" value="Embedded JDK" /> | ||||||
|         <option name="modules"> |         <option name="modules"> | ||||||
|           <set> |           <set> | ||||||
|             <option value="$PROJECT_DIR$" /> |             <option value="$PROJECT_DIR$" /> | ||||||
|  |  | ||||||
										
											Binary file not shown.
										
									
								
							|  | @ -1,20 +0,0 @@ | ||||||
| { |  | ||||||
|   "version": 3, |  | ||||||
|   "artifactType": { |  | ||||||
|     "type": "APK", |  | ||||||
|     "kind": "Directory" |  | ||||||
|   }, |  | ||||||
|   "applicationId": "com.example.childguard", |  | ||||||
|   "variantName": "release", |  | ||||||
|   "elements": [ |  | ||||||
|     { |  | ||||||
|       "type": "SINGLE", |  | ||||||
|       "filters": [], |  | ||||||
|       "attributes": [], |  | ||||||
|       "versionCode": 1, |  | ||||||
|       "versionName": "1.0", |  | ||||||
|       "outputFile": "app-release.apk" |  | ||||||
|     } |  | ||||||
|   ], |  | ||||||
|   "elementType": "File" |  | ||||||
| } |  | ||||||
|  | @ -8,10 +8,8 @@ | ||||||
|     <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> |     <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> | ||||||
|     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> |     <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_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.POST_NOTIFICATIONS" /> | ||||||
|     <uses-permission android:name="android.permission.VIBRATE" /> |     <uses-permission android:name="android.permission.VIBRATE" /> | ||||||
|     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> |  | ||||||
|     <application |     <application | ||||||
|         android:allowBackup="true" |         android:allowBackup="true" | ||||||
|         android:dataExtractionRules="@xml/data_extraction_rules" |         android:dataExtractionRules="@xml/data_extraction_rules" | ||||||
|  | @ -36,7 +34,6 @@ | ||||||
|                 <category android:name="android.intent.category.LAUNCHER" /> |                 <category android:name="android.intent.category.LAUNCHER" /> | ||||||
|             </intent-filter> |             </intent-filter> | ||||||
|         </activity> |         </activity> | ||||||
|         <service android:name=".SurveillanceService" /> |  | ||||||
|     </application> |     </application> | ||||||
| 
 | 
 | ||||||
| </manifest> | </manifest> | ||||||
|  | @ -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"); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -1,18 +1,14 @@ | ||||||
| package com.example.childguard; | package com.example.childguard; | ||||||
| 
 | 
 | ||||||
| import android.annotation.SuppressLint; |  | ||||||
| import android.os.Bundle; | import android.os.Bundle; | ||||||
| 
 | 
 | ||||||
| import androidx.appcompat.app.AppCompatActivity; | import androidx.appcompat.app.AppCompatActivity; | ||||||
| 
 | 
 | ||||||
| public class First_Start extends AppCompatActivity { | public class First_Start extends AppCompatActivity { | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     protected void onCreate(Bundle savedInstanceState) { |     protected void onCreate(Bundle savedInstanceState) { | ||||||
|         super.onCreate(savedInstanceState); |         super.onCreate(savedInstanceState); | ||||||
|         setContentView(R.layout.first_start); |         setContentView(R.layout.first_start); | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -23,7 +23,6 @@ public class GenerateQrFragment extends Fragment { | ||||||
|     public GenerateQrFragment() { |     public GenerateQrFragment() { | ||||||
|         // Required empty public constructor |         // Required empty public constructor | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
|     public static GenerateQrFragment newInstance(String key) { |     public static GenerateQrFragment newInstance(String key) { | ||||||
|         GenerateQrFragment fragment = new GenerateQrFragment(); |         GenerateQrFragment fragment = new GenerateQrFragment(); | ||||||
|         Bundle args = new Bundle(); |         Bundle args = new Bundle(); | ||||||
|  | @ -55,7 +54,7 @@ public class GenerateQrFragment extends Fragment { | ||||||
|         ImageView imageView = view.findViewById(R.id.result_bitmap_image_view); |         ImageView imageView = view.findViewById(R.id.result_bitmap_image_view); | ||||||
|         imageView.setImageBitmap(result); |         imageView.setImageBitmap(result); | ||||||
| 
 | 
 | ||||||
|         view.findViewById(R.id.button_print).setOnClickListener(v -> { |         view.findViewById(R.id.button_print).setOnClickListener( v -> { | ||||||
|             PrintHelper photoPrinter = new PrintHelper(requireContext()); |             PrintHelper photoPrinter = new PrintHelper(requireContext()); | ||||||
|             photoPrinter.setScaleMode(PrintHelper.SCALE_MODE_FIT); |             photoPrinter.setScaleMode(PrintHelper.SCALE_MODE_FIT); | ||||||
|             photoPrinter.printBitmap("placeholder", result, () -> { |             photoPrinter.printBitmap("placeholder", result, () -> { | ||||||
|  | @ -63,7 +62,7 @@ public class GenerateQrFragment extends Fragment { | ||||||
|             }); |             }); | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
|         view.findViewById(R.id.button_cancel).setOnClickListener(v -> { |         view.findViewById(R.id.button_cancel).setOnClickListener( v -> { | ||||||
|             getParentFragmentManager().popBackStack(); |             getParentFragmentManager().popBackStack(); | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -1,26 +1,44 @@ | ||||||
| package com.example.childguard; | package com.example.childguard; | ||||||
| 
 | 
 | ||||||
|  | import static android.content.ContentValues.TAG; | ||||||
|  | import static android.content.Context.MODE_PRIVATE; | ||||||
|  | 
 | ||||||
| import android.content.SharedPreferences; | import android.content.SharedPreferences; | ||||||
| import android.os.Bundle; | import android.os.Bundle; | ||||||
| import android.util.Log; |  | ||||||
| import android.view.LayoutInflater; |  | ||||||
| import android.view.View; |  | ||||||
| import android.view.ViewGroup; |  | ||||||
| import android.widget.FrameLayout; |  | ||||||
| import android.widget.ImageView; |  | ||||||
| import android.widget.TextView; |  | ||||||
| 
 | 
 | ||||||
| import androidx.core.content.res.ResourcesCompat; | import androidx.core.content.res.ResourcesCompat; | ||||||
| import androidx.fragment.app.Fragment; | import androidx.fragment.app.Fragment; | ||||||
| import androidx.fragment.app.FragmentManager; | import androidx.fragment.app.FragmentManager; | ||||||
| import androidx.fragment.app.FragmentTransaction; | import androidx.fragment.app.FragmentTransaction; | ||||||
|  | import androidx.print.PrintHelper; | ||||||
|  | 
 | ||||||
|  | import android.preference.PreferenceManager; | ||||||
|  | import android.util.Log; | ||||||
|  | import android.view.LayoutInflater; | ||||||
|  | import android.view.View; | ||||||
|  | import android.view.ViewGroup; | ||||||
|  | import android.widget.Button; | ||||||
|  | import android.widget.FrameLayout; | ||||||
|  | import android.widget.TextView; | ||||||
|  | import android.widget.Toast; | ||||||
|  | 
 | ||||||
|  | import androidx.annotation.NonNull; | ||||||
|  | 
 | ||||||
|  | import com.google.android.gms.tasks.OnFailureListener; | ||||||
|  | import com.google.android.gms.tasks.OnSuccessListener; | ||||||
|  | import com.google.firebase.firestore.DocumentReference; | ||||||
|  | import com.google.firebase.firestore.FirebaseFirestore; | ||||||
|  | 
 | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.Map; | ||||||
|  | import java.util.Objects; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * A simple {@link Fragment} subclass. |  * A simple {@link Fragment} subclass. | ||||||
|  * Use the {@link HomeFragment#newInstance} factory method to |  * Use the {@link HomeFragment#newInstance} factory method to | ||||||
|  * create an instance of this fragment. |  * 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 |     // TODO: Rename parameter arguments, choose names that match | ||||||
|     // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER |     // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER | ||||||
|  | @ -31,9 +49,6 @@ public class HomeFragment extends Fragment  { | ||||||
|     private String str_key; |     private String str_key; | ||||||
|     private String mParam2; |     private String mParam2; | ||||||
| 
 | 
 | ||||||
|     final String GET_ON = "\n乗車状態"; |  | ||||||
|     final String GET_OFF = "\n降車状態"; |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
|     public HomeFragment() { |     public HomeFragment() { | ||||||
|         // Required empty public constructor |         // Required empty public constructor | ||||||
|  | @ -60,13 +75,10 @@ public class HomeFragment extends Fragment  { | ||||||
|     @Override |     @Override | ||||||
|     public void onCreate(Bundle savedInstanceState) { |     public void onCreate(Bundle savedInstanceState) { | ||||||
|         super.onCreate(savedInstanceState); |         super.onCreate(savedInstanceState); | ||||||
| 
 |  | ||||||
|         if (getArguments() != null) { |         if (getArguments() != null) { | ||||||
|             // mParam1 = getArguments().getString(ARG_PARAM1); |             // mParam1 = getArguments().getString(ARG_PARAM1); | ||||||
|             mParam2 = getArguments().getString(ARG_PARAM2); |             mParam2 = getArguments().getString(ARG_PARAM2); | ||||||
|         } |         } | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|  | @ -82,94 +94,58 @@ public class HomeFragment extends Fragment  { | ||||||
|     public void onResume() { |     public void onResume() { | ||||||
|         super.onResume(); |         super.onResume(); | ||||||
|         Log.d("HomeFragment", "onResume: called"); |         Log.d("HomeFragment", "onResume: called"); | ||||||
|         Log.d("isIncar", "onResume: " + getIsInCarLocal()); |  | ||||||
|         this.updateUiState(getIsInCarLocal()); |  | ||||||
|         this.updateBluetoothSituation(isBluetoothConnected()); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private boolean isBluetoothConnected() { |     //画面遷移メソッド | ||||||
|         SharedPreferences pref = requireActivity().getSharedPreferences("Bluetooth_situation", requireActivity().MODE_PRIVATE); |     private void replaceFragment(Fragment fragment) { | ||||||
|         return pref.getBoolean("status", false); |         // フラグメントマネージャーの取得 | ||||||
|  |         FragmentManager manager = getParentFragmentManager(); // アクティビティではgetSupportFragmentManager()? | ||||||
|  |         // フラグメントトランザクションの開始 | ||||||
|  |         FragmentTransaction transaction = manager.beginTransaction(); | ||||||
|  |         // レイアウトをfragmentに置き換え(追加) | ||||||
|  |         transaction.replace(R.id.fragmentContainerView, fragment); | ||||||
|  |         // 置き換えのトランザクションをバックスタックに保存する | ||||||
|  |         transaction.addToBackStack(null); | ||||||
|  |         // フラグメントトランザクションをコミット | ||||||
|  |         transaction.commit(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private boolean getIsInCarLocal() { |     private boolean updateUiState(boolean state) { | ||||||
|         SharedPreferences pref = requireActivity().getSharedPreferences("app_situation", requireActivity().MODE_PRIVATE); |  | ||||||
|         Boolean isInCar = pref.getBoolean("isInCarPref", false); |  | ||||||
|         Log.d("isInCarPref","isInCar"+ isInCar); |  | ||||||
|         return isInCar; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * 乗車状態の画面を切り替える |  | ||||||
|      */ |  | ||||||
|     private boolean updateUiState(boolean isInCar) { |  | ||||||
|         Log.d("HomeFragment", "updateUiState: called"); |         Log.d("HomeFragment", "updateUiState: called"); | ||||||
|         Log.d("HomeFragment", "updateUiState:"+isInCar); |  | ||||||
|         // Init |         // Init | ||||||
|         TextView tv; |         TextView tv; | ||||||
|         FrameLayout fl; |         FrameLayout fl; | ||||||
|         try { |         try { | ||||||
|             tv = requireView().findViewById(R.id.car_situation); |             tv = requireView().findViewById(R.id.situation); | ||||||
|             fl = requireView().findViewById(R.id.car_situation_bg); |             fl = requireView().findViewById(R.id.situation_bg); | ||||||
|         } catch (NullPointerException e) { |         } catch (NullPointerException e) { | ||||||
|             Log.d("HomeFragment", "updateUiState: view is null"); |             Log.d("HomeFragment", "updateUiState: view is null"); | ||||||
|             return false; |             return false; | ||||||
|         } catch (IllegalStateException e) { |         } catch (IllegalStateException e) { | ||||||
|             Log.d("HomeFragment", "updateUiState: view is not attached"); |             Log.d("HomeFragment", "updateUiState: view is not attached"); | ||||||
|             getParentFragmentManager().beginTransaction().replace(R.id.fragmentContainerView, HomeFragment.newInstance("test", "test")).commit(); | //            getParentFragmentManager().beginTransaction().replace(R.id.fragmentContainerView, HomeFragment.newInstance("test", "test")).commit(); | ||||||
|             updateUiState(isInCar); | //            updateUiState(state); | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
| 
 |         String get_on = "\n乗車状態"; | ||||||
|         if (isInCar) { |         String get_off = "\n降車状態"; | ||||||
|  |         if (state) { | ||||||
|             //乗車状態にする |             //乗車状態にする | ||||||
|             fl.setBackground(ResourcesCompat.getDrawable(getResources(), R.drawable.frame_style_orange, null)); |             fl.setBackground(ResourcesCompat.getDrawable(getResources(), R.drawable.frame_style_orange, null)); | ||||||
|             tv.setText(GET_ON); |             tv.setText(get_on); | ||||||
|         } else { |         } else { | ||||||
|             //降車状態にする |             //降車状態にする | ||||||
|             fl.setBackground(ResourcesCompat.getDrawable(getResources(), R.drawable.frame_style, null)); |             fl.setBackground(ResourcesCompat.getDrawable(getResources(), R.drawable.frame_style, null)); | ||||||
|             tv.setText(GET_OFF); |             tv.setText(get_off); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     @Override | ||||||
|      * Bluetoothの接続状態の画面を切り替える |     public boolean onEvent(boolean state) { | ||||||
|      */ |         Log.d("HomeFragment", "onEvent: called"); | ||||||
|     boolean updateBluetoothSituation(Boolean BluetoothConnect) { |         return updateUiState(state); | ||||||
|         FrameLayout frameLayout; |  | ||||||
|         TextView textView; |  | ||||||
|         ImageView imageView; |  | ||||||
|         try { |  | ||||||
|             frameLayout = requireView().findViewById(R.id.situation_bg_bluetooth); |  | ||||||
|             textView = requireView().findViewById(R.id.BluetoothSituation); |  | ||||||
|             imageView = requireView().findViewById(R.id.BluetoothSituationImage); |  | ||||||
|         } 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(); |  | ||||||
|             updateBluetoothSituation(BluetoothConnect); |  | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
|         final String CONNECT = "接続中"; |  | ||||||
|         final String DISCONNECT = "切断中"; |  | ||||||
|         if (BluetoothConnect) { |  | ||||||
|             //接続状態にする |  | ||||||
|             frameLayout.setBackground(ResourcesCompat.getDrawable(getResources(), R.drawable.frame_style_orange, null)); |  | ||||||
|             textView.setText(CONNECT); |  | ||||||
|             imageView.setVisibility(View.GONE); |  | ||||||
|         } else { |  | ||||||
|             //切断状態にする |  | ||||||
|             frameLayout.setBackground(ResourcesCompat.getDrawable(getResources(), R.drawable.frame_style, null)); |  | ||||||
|             textView.setText(DISCONNECT); |  | ||||||
|             imageView.setVisibility(View.VISIBLE); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         return true; |  | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,116 +1,140 @@ | ||||||
| package com.example.childguard; | package com.example.childguard; | ||||||
| 
 | 
 | ||||||
|  | import static java.security.AccessController.getContext; | ||||||
|  | 
 | ||||||
|  | import androidx.activity.result.ActivityResultLauncher; | ||||||
|  | import androidx.appcompat.app.ActionBar; | ||||||
|  | import androidx.appcompat.app.AppCompatActivity; | ||||||
|  | import androidx.browser.customtabs.CustomTabsIntent; | ||||||
|  | import androidx.core.app.ActivityCompat; | ||||||
|  | import androidx.core.app.NotificationCompat; | ||||||
|  | import androidx.core.app.NotificationManagerCompat; | ||||||
|  | 
 | ||||||
| import android.annotation.SuppressLint; | import android.annotation.SuppressLint; | ||||||
| import android.app.NotificationChannel; | import android.app.NotificationChannel; | ||||||
| import android.app.NotificationManager; | import android.app.NotificationManager; | ||||||
| import android.app.PendingIntent; | import android.bluetooth.BluetoothAdapter; | ||||||
| import android.bluetooth.BluetoothDevice; | import android.bluetooth.BluetoothDevice; | ||||||
|  | import android.bluetooth.BluetoothManager; | ||||||
| import android.content.BroadcastReceiver; | import android.content.BroadcastReceiver; | ||||||
| import android.content.Context; | import android.content.Context; | ||||||
|  | import android.content.SharedPreferences; | ||||||
| import android.content.Intent; | import android.content.Intent; | ||||||
| import android.content.IntentFilter; | import android.content.IntentFilter; | ||||||
| import android.content.SharedPreferences; |  | ||||||
| import android.content.pm.PackageManager; | import android.content.pm.PackageManager; | ||||||
| import android.graphics.Color; | import android.graphics.Color; | ||||||
| import android.os.Build; | import android.net.Uri; | ||||||
| import android.os.Bundle; | import android.os.Bundle; | ||||||
| import android.os.Vibrator; | import android.os.Vibrator; | ||||||
|  | 
 | ||||||
|  | import com.google.android.material.bottomnavigation.BottomNavigationView; | ||||||
|  | 
 | ||||||
|  | import java.text.DateFormat; | ||||||
|  | import java.text.SimpleDateFormat; | ||||||
|  | import java.util.Date; | ||||||
|  | import java.util.Random; | ||||||
|  | import java.util.UUID; | ||||||
|  | 
 | ||||||
| import android.preference.PreferenceManager; | import android.preference.PreferenceManager; | ||||||
| import android.util.Log; | import android.util.Log; | ||||||
| import android.widget.FrameLayout; | import android.widget.FrameLayout; | ||||||
|  | import android.widget.TextView; | ||||||
| import android.widget.Toast; | import android.widget.Toast; | ||||||
| 
 | import androidx.annotation.Nullable; | ||||||
| import androidx.activity.result.ActivityResultLauncher; |  | ||||||
| import androidx.annotation.NonNull; |  | ||||||
| import androidx.appcompat.app.AppCompatActivity; | import androidx.appcompat.app.AppCompatActivity; | ||||||
| import androidx.core.app.ActivityCompat; | import androidx.core.content.res.ResourcesCompat; | ||||||
| import androidx.core.app.NotificationCompat; | 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.android.material.bottomnavigation.BottomNavigationView; |  | ||||||
| import com.google.firebase.firestore.DocumentReference; | 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.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.ScanContract; | ||||||
| import com.journeyapps.barcodescanner.ScanOptions; | import com.journeyapps.barcodescanner.ScanOptions; | ||||||
| 
 | 
 | ||||||
| import android.Manifest; |  | ||||||
| 
 |  | ||||||
| import java.util.HashMap; |  | ||||||
| import java.util.Map; |  | ||||||
| 
 |  | ||||||
| public class MainActivity extends AppCompatActivity { | public class MainActivity extends AppCompatActivity { | ||||||
| 
 | 
 | ||||||
|     FirebaseFirestore db; |     BluetoothManager bluetoothManager; | ||||||
|  |     BluetoothAdapter bluetoothAdapter; | ||||||
|  | 
 | ||||||
|     DocumentReference mDocRef; |     DocumentReference mDocRef; | ||||||
| 
 | 
 | ||||||
|     private HomeFragment homeFragment = HomeFragment.newInstance("test", "test"); |     private HomeFragment homeFragment; | ||||||
| 
 | 
 | ||||||
|     public static final String TAG = "InspirationQuote"; |     public static final String TAG = "InspirationQuote"; | ||||||
| 
 | 
 | ||||||
|  |     boolean flg = false; | ||||||
|  | 
 | ||||||
|  |     //↓日付を取得するやつ | ||||||
|  |     public static String getNowDate() { | ||||||
|  |         @SuppressLint("SimpleDateFormat") final DateFormat df = new SimpleDateFormat("yyy/MM/dd HH:mm:ss"); | ||||||
|  |         final Date date = new Date(System.currentTimeMillis()); | ||||||
|  |         return df.format(date); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     private final ActivityResultLauncher<ScanOptions> QrLauncher = registerForActivityResult( |     private final ActivityResultLauncher<ScanOptions> QrLauncher = registerForActivityResult( | ||||||
|             new ScanContract(), |             new ScanContract(), | ||||||
|             result -> { |             result -> { | ||||||
|                 String contents = result.getContents(); |                 String contents = result.getContents(); | ||||||
|                 if (contents == null) { |                 if (contents == null) { | ||||||
|                     Toast.makeText(this, "QRコードが読み取れませんでした", Toast.LENGTH_LONG).show(); |                     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 { |                 } else { | ||||||
|                     if (!contents.contains("https://practicefirestore1-8808c.web.app/")) { |                     //URLの表示 | ||||||
|                         Toast.makeText(this, "Child Guardに対応するQRコードではありません", Toast.LENGTH_LONG).show(); |                     Toast.makeText(this, contents, Toast.LENGTH_SHORT).show(); | ||||||
|                     } else { |                     //ブラウザを起動し、URL先のサイトを開く | ||||||
|                         changeIsInCar(); |                     CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); | ||||||
|                     } |                     CustomTabsIntent customTabsIntent = builder.build(); | ||||||
|  |                     customTabsIntent.launchUrl(this, Uri.parse(contents)); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|     ); |     ); | ||||||
| 
 | 
 | ||||||
|     @SuppressLint("MissingInflatedId") |  | ||||||
|     @Override |     @Override | ||||||
|     protected void onCreate(Bundle savedInstanceState) { |     protected void onCreate(Bundle savedInstanceState) { | ||||||
|         super.onCreate(savedInstanceState); |         super.onCreate(savedInstanceState); | ||||||
|         setContentView(R.layout.activity_main); |         setContentView(R.layout.activity_main); | ||||||
|         Log.d(TAG, "onCreate: called"); | //        super.onStart(); | ||||||
|         //Bluetooth接続判定用 |  | ||||||
|         SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); |  | ||||||
|         SharedPreferences.Editor e = pref.edit(); |  | ||||||
|         e.putBoolean("connection_status", false); |  | ||||||
| 
 |  | ||||||
|         // Check permissions |  | ||||||
|         if (!hasPermissions()) { |  | ||||||
|             requestPermissions(); |  | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         BottomNavigationView bottomNavigationView = findViewById(R.id.nav_view); |         BottomNavigationView bottomNavigationView = findViewById(R.id.nav_view); | ||||||
| 
 | 
 | ||||||
|         this.homeFragment = HomeFragment.newInstance("test", "test"); |         this.homeFragment = HomeFragment.newInstance("test", "tset"); | ||||||
|         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()) { |             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); |                 findViewById(R.id.fab_scan_qr_code).setVisibility(FrameLayout.VISIBLE); | ||||||
|                 getSupportFragmentManager().beginTransaction() |                 getSupportFragmentManager().beginTransaction() | ||||||
|                         .replace(findViewById(R.id.fragmentContainerView).getId(), this.homeFragment) |                         .replace(findViewById(R.id.fragmentContainerView).getId(), this.homeFragment) | ||||||
|                         .addToBackStack(null) |                         .addToBackStack(null) | ||||||
|                         .commit(); |                         .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()) { |             } 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); |                 findViewById(R.id.fab_scan_qr_code).setVisibility(FrameLayout.GONE); | ||||||
|                 getSupportFragmentManager().beginTransaction() |                 getSupportFragmentManager().beginTransaction() | ||||||
|                         .replace(findViewById(R.id.fragmentContainerView).getId(), SettingFragment.newInstance()) |                         .replace(findViewById(R.id.fragmentContainerView).getId(), SettingFragment.newInstance()) | ||||||
|                         .addToBackStack(null) |                         .addToBackStack(null) | ||||||
|                         .commit(); |                         .commit(); | ||||||
|             } |             } | ||||||
|             firebaseLink(); |  | ||||||
|             Bluetooth_status(); |  | ||||||
|             return true; |             return true; | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
|         findViewById(R.id.fab_scan_qr_code).setOnClickListener(v -> { |         findViewById(R.id.fab_scan_qr_code).setOnClickListener(v -> { | ||||||
|             Log.d("MainActivity/Fab", "onClick: called"); |             Log.d("QRFragment", "onClick: called"); | ||||||
|             //QRリーダ起動 |             //QRリーダ起動 | ||||||
|             ScanOptions options = new ScanOptions(); |             ScanOptions options = new ScanOptions(); | ||||||
|             options.setPrompt("QRコードを読み取ってください"); |             options.setPrompt("QRコードを読み取ってください"); | ||||||
|  | @ -122,243 +146,156 @@ public class MainActivity extends AppCompatActivity { | ||||||
|         intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); |         intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); | ||||||
|         intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); |         intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); | ||||||
| 
 | 
 | ||||||
|         db = FirebaseFirestore.getInstance();//Firebaseとの紐づけ |         if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { | ||||||
| 
 |  | ||||||
|         String btPermission = getBluetoothConnectPermission(); |  | ||||||
|         if (ActivityCompat.checkSelfPermission(this, btPermission) != PackageManager.PERMISSION_GRANTED) { |  | ||||||
|             Log.d("BT", "No permission to connect bluetooth devices"); |             Log.d("BT", "No permission to connect bluetooth devices"); | ||||||
|             return; |             return; | ||||||
|         } else { |  | ||||||
|             Log.d("BT", "Permission to connect bluetooth devices granted"); |  | ||||||
| 
 |  | ||||||
|             registerReceiver(receiver, intentFilter); |  | ||||||
| 
 |  | ||||||
|             startForegroundService(new Intent(this, SurveillanceService.class)); |  | ||||||
|         } |         } | ||||||
|     } |         else { | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     @Override |  | ||||||
|     protected void onResume() { |  | ||||||
|         super.onResume(); |  | ||||||
|         Log.d("MainActivity onResume", "called"); |  | ||||||
|         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の取得 |  | ||||||
|         Log.d("MainActivity", "changeIsInCar: ID= " + IdPref); |  | ||||||
|         boolean change = sharedPreferences.getBoolean("change", false); |  | ||||||
|         Log.d("MainActivity", "changeIsInCar: " + change); |  | ||||||
|         db = FirebaseFirestore.getInstance();//Firebaseとの紐づけ |  | ||||||
|         DocumentReference isReported = db.collection("status").document(IdPref);//更新するドキュメントとの紐づけ |  | ||||||
|         Map<String, Boolean> DEFAULT_ITEM = new HashMap<>();//mapの宣言 |  | ||||||
|         if (!change) { |  | ||||||
|             //isInCarをtrueに更新 |  | ||||||
|             Log.d("MainActivity", "change:" + change); |  | ||||||
|             E.putBoolean("change", true); |  | ||||||
|             E.apply(); |  | ||||||
|             Log.d("MainActivity", "change:" + sharedPreferences.getBoolean("change", false)); |  | ||||||
|         } else { |  | ||||||
|             Log.d("MainActivity", "change:" + change); |  | ||||||
|             E.putBoolean("change", false); |  | ||||||
|             E.apply(); |  | ||||||
|             Log.d("MainActivity", "change:" + sharedPreferences.getBoolean("change", false)); |  | ||||||
|         } |  | ||||||
|         Log.d("MainActivity", "changeIsInCar: " + sharedPreferences.getBoolean("change", false)); |  | ||||||
|         isReported.update("isInCar", sharedPreferences.getBoolean("change", false)) |  | ||||||
|                 .addOnSuccessListener(unused -> Log.d(TAG, "DocumentSnapshot successfully updated!!")) |  | ||||||
|                 .addOnFailureListener(e -> Log.w(TAG, "Error updating document", e)); |  | ||||||
|         E2.putBoolean("isInCarPref", sharedPreferences.getBoolean("change", false)); |  | ||||||
|         E2.apply(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * 権限の保有を確認する |  | ||||||
|      * @return |  | ||||||
|      */ |  | ||||||
|     private boolean hasPermissions() { |  | ||||||
|         boolean allGranted = true; |  | ||||||
| 
 |  | ||||||
|         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); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // 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; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * 権限のリクエストを行う |  | ||||||
|      */ |  | ||||||
|     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 |  | ||||||
|             ); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Override |  | ||||||
|     public void onRequestPermissionsResult(int requestCode, |  | ||||||
|                                            @NonNull String[] permissions, |  | ||||||
|                                            @NonNull int[] grantResults) { |  | ||||||
|         super.onRequestPermissionsResult(requestCode, permissions, grantResults); |  | ||||||
|         if (requestCode == 2) { |  | ||||||
|             if (!hasPermissions()) { |  | ||||||
|                 Toast.makeText(this, "Permissions not granted.", Toast.LENGTH_SHORT).show(); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * 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);//現在の位置を取得 |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     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) { |  | ||||||
|             Log.d("BT", "No permission to connect bluetooth devices"); |  | ||||||
|             return; |  | ||||||
|         } else { |  | ||||||
|             Log.d("BT", "Permission to connect bluetooth devices granted"); |             Log.d("BT", "Permission to connect bluetooth devices granted"); | ||||||
|         } |         } | ||||||
|         registerReceiver(receiver, intentFilter); |         registerReceiver(receiver, intentFilter); | ||||||
|  | 
 | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     @Override | ||||||
|  |     protected void 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."); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         mDocRef = FirebaseFirestore.getInstance().document("users/" + IdPref);//現在の位置を取得 | ||||||
|  |         this.flg = false; | ||||||
|  |         initNotification(mDocRef); | ||||||
|  | 
 | ||||||
|  |         super.onResume(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private void initNotification(DocumentReference mDocRef) { | ||||||
|  | 
 | ||||||
|  |         // Init pref | ||||||
|  |         SharedPreferences sharedPreferences = getSharedPreferences("app_situation",MODE_PRIVATE); | ||||||
|  | 
 | ||||||
|  |         mDocRef.addSnapshotListener(this, new EventListener<DocumentSnapshot>() { | ||||||
|  |             @Override | ||||||
|  |             public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) { | ||||||
|  |                 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")) {//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 { | ||||||
|  |                         if (isInCar) { | ||||||
|  |                             E.putBoolean("car", false); | ||||||
|  |                             E.apply(); | ||||||
|  |                         } else { | ||||||
|  |                             E.putBoolean("car", true); | ||||||
|  |                             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() { |     private final BroadcastReceiver receiver = new BroadcastReceiver() { | ||||||
|  | 
 | ||||||
|         @Override |         @Override | ||||||
|         public void onReceive(Context context, Intent intent) { |         public void onReceive(Context context, Intent intent) { | ||||||
|             SharedPreferences pref = getSharedPreferences("Bluetooth_situation", MODE_PRIVATE); |             String action = intent.getAction(); // may need to chain this to a recognizing function | ||||||
|             SharedPreferences.Editor e = pref.edit(); |  | ||||||
|             String action = intent.getAction(); |  | ||||||
|             BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); |             BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); | ||||||
|             boolean isInCar = pref.getBoolean("isInCarPref", false); |             HomeFragment homeFragment=new HomeFragment(); | ||||||
|             String btPermission = getBluetoothConnectPermission(); | 
 | ||||||
|             if (ActivityCompat.checkSelfPermission(context, btPermission) != PackageManager.PERMISSION_GRANTED) { |             if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { | ||||||
|                 Log.d("BT", "No permission to connect bluetooth devices"); |                 Log.d("BT", "No permission to connect bluetooth devices"); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|  |             String deviceName = device.getName(); | ||||||
|             String deviceHardwareAddress = device.getAddress(); // MAC address |             String deviceHardwareAddress = device.getAddress(); // MAC address | ||||||
| 
 | 
 | ||||||
|             String registeredId = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()) |  | ||||||
|                     .getString("bluetooth_device_id", "none"); |  | ||||||
| 
 |  | ||||||
|             if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) { |             if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) { | ||||||
|                 //Bluetoothデバイスが接続されたときの処理 |                 //Do something if connected | ||||||
|                 Log.d("BT", "Device connected"); |                 Log.d("BT", "Device connected"); | ||||||
| 
 | 
 | ||||||
|  |                 String registeredId = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getString("bluetooth_device_id", "none"); | ||||||
|  | 
 | ||||||
|                 Log.d("BT_Judge", "Registered: " + registeredId); |                 Log.d("BT_Judge", "Registered: " + registeredId); | ||||||
| 
 | 
 | ||||||
|                 if (deviceHardwareAddress.equals(registeredId)) { |                 if (deviceHardwareAddress.equals(registeredId)) { | ||||||
|                     //登録済みのデバイスだったときの処理 |  | ||||||
|                     Log.d("BT_Judge", "登録済み"); |                     Log.d("BT_Judge", "登録済み"); | ||||||
|                     changeBluetooth(true); |                 } else Log.d("BT_Judge", "未登録"); | ||||||
|                     e.putBoolean("connection_status", true); |  | ||||||
|                     if (homeFragment != null && homeFragment.isVisible()) { |  | ||||||
|                         homeFragment.updateBluetoothSituation(true); |  | ||||||
|                     } |  | ||||||
|                 } else { |  | ||||||
|                     //登録していないデバイスだったときの処理 |  | ||||||
|                     Log.d("BT_Judge", "未登録"); |  | ||||||
|                     e.putBoolean("connection_status", false); |  | ||||||
|                 } |  | ||||||
|                 e.apply(); |  | ||||||
| 
 | 
 | ||||||
|             } else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) { |             } else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) { | ||||||
|                 //bluetoothデバイスが切断されたときの処理 |                 //Do something if disconnected | ||||||
|                 changeBluetooth(false); |                 Log.d("BT", "Device disconnected"); | ||||||
|                 if (homeFragment != null && homeFragment.isVisible()) { | 
 | ||||||
|                     homeFragment.updateBluetoothSituation(false); |  | ||||||
|                 } |  | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     /** |     //↓通知のやつ | ||||||
|      * Bluetoothの接続状態を変更するメソッド |     public void notifyMain() { | ||||||
|      */ |         //↓通知をする際に起動するバイブレーション | ||||||
|     public void changeBluetooth(boolean actual) { |         ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).vibrate(1000); | ||||||
|         getSharedPreferences("Bluetooth_situation", MODE_PRIVATE) |         //↓通知の詳細設定的な奴 | ||||||
|                 .edit() |         NotificationCompat.Builder builder = new NotificationCompat | ||||||
|                 .putBoolean("status", actual) |                 .Builder(this, "CHANNEL_ID") | ||||||
|                 .apply(); |                 .setSmallIcon(android.R.drawable.ic_menu_info_details) | ||||||
|  |                 .setContentTitle("通報検知") | ||||||
|  |                 .setContentText("子供の置き去りを検知しました。") | ||||||
|  |                 .setPriority(NotificationCompat.PRIORITY_DEFAULT); | ||||||
|  | 
 | ||||||
|  |         NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); | ||||||
|  | 
 | ||||||
|  |         if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { | ||||||
|  |             // TODO: Consider calling | ||||||
|  |             //    ActivityCompat#requestPermissions | ||||||
|  |             // here to request the missing permissions, and then overriding | ||||||
|  |             //   public void onRequestPermissionsResult(int requestCode, String[] permissions, | ||||||
|  |             //                                          int[] grantResults) | ||||||
|  |             // to handle the case where the user grants the permission. See the documentation | ||||||
|  |             // for ActivityCompat#requestPermissions for more details. | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         notificationManager.notify(R.string.app_name, builder.build()); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     //Bluetooth_setupの戻るボタン | ||||||
|  |     public void setupBackButton(boolean enableBackButton) { | ||||||
|  |         ActionBar actionBar = getSupportActionBar(); | ||||||
|  |         actionBar.setDisplayHomeAsUpEnabled(enableBackButton); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,64 @@ | ||||||
|  | package com.example.childguard; | ||||||
|  | 
 | ||||||
|  | import android.os.Bundle; | ||||||
|  | 
 | ||||||
|  | import androidx.fragment.app.Fragment; | ||||||
|  | 
 | ||||||
|  | import android.view.LayoutInflater; | ||||||
|  | import android.view.View; | ||||||
|  | import android.view.ViewGroup; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * A simple {@link Fragment} subclass. | ||||||
|  |  * Use the {@link NotificationFragment#newInstance} factory method to | ||||||
|  |  * create an instance of this fragment. | ||||||
|  |  */ | ||||||
|  | public class NotificationFragment extends Fragment { | ||||||
|  | 
 | ||||||
|  |     // TODO: Rename parameter arguments, choose names that match | ||||||
|  |     // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER | ||||||
|  |     private static final String ARG_PARAM1 = "param1"; | ||||||
|  |     private static final String ARG_PARAM2 = "param2"; | ||||||
|  | 
 | ||||||
|  |     // TODO: Rename and change types of parameters | ||||||
|  |     private String mParam1; | ||||||
|  |     private String mParam2; | ||||||
|  | 
 | ||||||
|  |     public NotificationFragment() { | ||||||
|  |         // Required empty public constructor | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Use this factory method to create a new instance of | ||||||
|  |      * this fragment using the provided parameters. | ||||||
|  |      * | ||||||
|  |      * @param param1 Parameter 1. | ||||||
|  |      * @param param2 Parameter 2. | ||||||
|  |      * @return A new instance of fragment NotificationFragment. | ||||||
|  |      */ | ||||||
|  |     // TODO: Rename and change types and number of parameters | ||||||
|  |     public static NotificationFragment newInstance(String param1, String param2) { | ||||||
|  |         NotificationFragment fragment = new NotificationFragment(); | ||||||
|  |         Bundle args = new Bundle(); | ||||||
|  |         args.putString(ARG_PARAM1, param1); | ||||||
|  |         args.putString(ARG_PARAM2, param2); | ||||||
|  |         fragment.setArguments(args); | ||||||
|  |         return fragment; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public void onCreate(Bundle savedInstanceState) { | ||||||
|  |         super.onCreate(savedInstanceState); | ||||||
|  |         if (getArguments() != null) { | ||||||
|  |             mParam1 = getArguments().getString(ARG_PARAM1); | ||||||
|  |             mParam2 = getArguments().getString(ARG_PARAM2); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public View onCreateView(LayoutInflater inflater, ViewGroup container, | ||||||
|  |                              Bundle savedInstanceState) { | ||||||
|  |         // Inflate the layout for this fragment | ||||||
|  |         return inflater.inflate(R.layout.fragment_notification, container, false); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -1,17 +0,0 @@ | ||||||
| package com.example.childguard; |  | ||||||
| 
 |  | ||||||
| import android.content.BroadcastReceiver; |  | ||||||
| import android.content.Context; |  | ||||||
| import android.content.Intent; |  | ||||||
| 
 |  | ||||||
| public class NotificationReceiver extends BroadcastReceiver {//通知をタップしたときにアプリを起動する処理 |  | ||||||
| 
 |  | ||||||
|     @Override |  | ||||||
|     public void onReceive(Context context, Intent intent) { |  | ||||||
|         if (intent.getAction() != null && intent.getAction().equals("OPEN_ACTIVITY")) {// 通知がタップされたときの処理 |  | ||||||
|             Intent openIntent = new Intent(context, MainActivity.class);   // MainActivityを起動 |  | ||||||
|             openIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); |  | ||||||
|             context.startActivity(openIntent); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
							
								
								
									
										33
									
								
								app/src/main/java/com/example/childguard/QR.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								app/src/main/java/com/example/childguard/QR.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +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")); | ||||||
|  | //                    } | ||||||
|  | //                } | ||||||
|  | //        ); | ||||||
|  | //    } | ||||||
|  | // | ||||||
|  | //} | ||||||
							
								
								
									
										125
									
								
								app/src/main/java/com/example/childguard/QRFragment.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								app/src/main/java/com/example/childguard/QRFragment.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,125 @@ | ||||||
|  | package com.example.childguard; | ||||||
|  | 
 | ||||||
|  | import android.content.Intent; | ||||||
|  | import android.content.SharedPreferences; | ||||||
|  | import android.net.Uri; | ||||||
|  | import android.os.Bundle; | ||||||
|  | 
 | ||||||
|  | import androidx.activity.result.ActivityResultLauncher; | ||||||
|  | import androidx.activity.result.contract.ActivityResultContracts; | ||||||
|  | import androidx.browser.customtabs.CustomTabsIntent; | ||||||
|  | import androidx.fragment.app.Fragment; | ||||||
|  | import androidx.fragment.app.FragmentManager; | ||||||
|  | import androidx.fragment.app.FragmentTransaction; | ||||||
|  | 
 | ||||||
|  | import android.util.Log; | ||||||
|  | import android.view.LayoutInflater; | ||||||
|  | import android.view.View; | ||||||
|  | import android.view.ViewGroup; | ||||||
|  | import android.widget.Button; | ||||||
|  | import android.widget.Toast; | ||||||
|  | 
 | ||||||
|  | import com.google.zxing.integration.android.IntentIntegrator; | ||||||
|  | import com.google.zxing.integration.android.IntentResult; | ||||||
|  | import com.journeyapps.barcodescanner.ScanContract; | ||||||
|  | import com.journeyapps.barcodescanner.ScanOptions; | ||||||
|  | 
 | ||||||
|  | import java.util.Objects; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * A simple {@link Fragment} subclass. | ||||||
|  |  * Use the {@link QRFragment#newInstance} factory method to | ||||||
|  |  * create an instance of this fragment. | ||||||
|  |  */ | ||||||
|  | public class QRFragment extends Fragment { | ||||||
|  |     //QRコードから受け取ったURLの受け渡しの宣言 | ||||||
|  | //   OnDataPass dataPass; | ||||||
|  |     // TODO: Rename parameter arguments, choose names that match | ||||||
|  |     // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER | ||||||
|  |     private static final String ARG_PARAM1 = "param1"; | ||||||
|  |     private static final String ARG_PARAM2 = "param2"; | ||||||
|  | 
 | ||||||
|  |     // TODO: Rename and change types of parameters | ||||||
|  |     private String mParam1; | ||||||
|  |     private String mParam2; | ||||||
|  | 
 | ||||||
|  |     public QRFragment() { | ||||||
|  |         // Required empty public constructor | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Use this factory method to create a new instance of | ||||||
|  |      * this fragment using the provided parameters. | ||||||
|  |      * | ||||||
|  |      * @param param1 Parameter 1. | ||||||
|  |      * @param param2 Parameter 2. | ||||||
|  |      * @return A new instance of fragment QRFragment. | ||||||
|  |      */ | ||||||
|  |     // TODO: Rename and change types and number of parameters | ||||||
|  |     public static QRFragment newInstance(String param1, String param2) { | ||||||
|  |         QRFragment fragment = new QRFragment(); | ||||||
|  |         Bundle args = new Bundle(); | ||||||
|  |         args.putString(ARG_PARAM1, param1); | ||||||
|  |         args.putString(ARG_PARAM2, param2); | ||||||
|  |         fragment.setArguments(args); | ||||||
|  |         return fragment; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public void onCreate(Bundle savedInstanceState) { | ||||||
|  |         super.onCreate(savedInstanceState); | ||||||
|  |         if (getArguments() != null) { | ||||||
|  |             mParam1 = getArguments().getString(ARG_PARAM1); | ||||||
|  |             mParam2 = getArguments().getString(ARG_PARAM2); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private final ActivityResultLauncher<ScanOptions> fragmentLauncher = registerForActivityResult(new ScanContract(), | ||||||
|  |             result -> { | ||||||
|  |                 String contents = result.getContents(); | ||||||
|  |                 if (contents == null) { | ||||||
|  |                     Toast.makeText(getContext(), "QRコードが読み取れませんでした", Toast.LENGTH_LONG).show(); | ||||||
|  |                 } else if (!contents.contains("https://practicefirestore1-8808c.web.app/")) { | ||||||
|  |                     Toast.makeText(getContext(), "Chiled Guardに対応するQRコードではありません", Toast.LENGTH_LONG).show(); | ||||||
|  |                 } else { | ||||||
|  |                     //URLの表示 | ||||||
|  |                     Toast.makeText(getContext(), contents, Toast.LENGTH_SHORT).show(); | ||||||
|  |                     //ブラウザを起動し、URL先のサイトを開く | ||||||
|  |                     CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); | ||||||
|  |                     CustomTabsIntent customTabsIntent = builder.build(); | ||||||
|  |                     customTabsIntent.launchUrl(requireContext(), Uri.parse(contents)); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 getParentFragmentManager().popBackStack(); | ||||||
|  |             }); | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public View onCreateView(LayoutInflater inflater, ViewGroup container, | ||||||
|  |                              Bundle savedInstanceState) { | ||||||
|  |         // Inflate the layout for this fragment | ||||||
|  |         View view = inflater.inflate(R.layout.fragment_qr, container, false); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         Log.d("QRFragment", "onClick: called"); | ||||||
|  |         //QRリーダ起動 | ||||||
|  |         fragmentLauncher.launch(new ScanOptions()); | ||||||
|  | 
 | ||||||
|  |         return view; | ||||||
|  |     } | ||||||
|  |     //画面遷移メソッド | ||||||
|  |     private void replaceFragment(Fragment fragment) { | ||||||
|  |         // フラグメントマネージャーの取得 | ||||||
|  |         FragmentManager manager = getParentFragmentManager(); // アクティビティではgetSupportFragmentManager()? | ||||||
|  |         // フラグメントトランザクションの開始 | ||||||
|  |         FragmentTransaction transaction = manager.beginTransaction(); | ||||||
|  |         // レイアウトをfragmentに置き換え(追加) | ||||||
|  |         transaction.replace(R.id.fragmentContainerView, fragment); | ||||||
|  |         // 置き換えのトランザクションをバックスタックに保存する | ||||||
|  |         transaction.addToBackStack(null); | ||||||
|  |         // フラグメントトランザクションをコミット | ||||||
|  |         transaction.commit(); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
							
								
								
									
										156
									
								
								app/src/main/java/com/example/childguard/QrPrintFragment.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										156
									
								
								app/src/main/java/com/example/childguard/QrPrintFragment.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,156 @@ | ||||||
|  | package com.example.childguard; | ||||||
|  | 
 | ||||||
|  | import static android.content.Context.MODE_PRIVATE; | ||||||
|  | 
 | ||||||
|  | import android.content.SharedPreferences; | ||||||
|  | import android.graphics.Bitmap; | ||||||
|  | import android.graphics.BitmapFactory; | ||||||
|  | import android.graphics.Canvas; | ||||||
|  | import android.graphics.Paint; | ||||||
|  | import android.graphics.drawable.BitmapDrawable; | ||||||
|  | import android.os.Bundle; | ||||||
|  | 
 | ||||||
|  | import androidx.fragment.app.Fragment; | ||||||
|  | import androidx.fragment.app.FragmentManager; | ||||||
|  | import androidx.fragment.app.FragmentTransaction; | ||||||
|  | import androidx.print.PrintHelper; | ||||||
|  | 
 | ||||||
|  | import android.preference.PreferenceManager; | ||||||
|  | import android.util.AndroidRuntimeException; | ||||||
|  | import android.view.LayoutInflater; | ||||||
|  | import android.view.View; | ||||||
|  | import android.view.ViewGroup; | ||||||
|  | import android.widget.ImageView; | ||||||
|  | 
 | ||||||
|  | import com.google.zxing.BarcodeFormat; | ||||||
|  | import com.google.zxing.WriterException; | ||||||
|  | import com.journeyapps.barcodescanner.BarcodeEncoder; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * A simple {@link Fragment} subclass. | ||||||
|  |  * Use the {@link QrPrintFragment#newInstance} factory method to | ||||||
|  |  * create an instance of this fragment. | ||||||
|  |  */ | ||||||
|  | public class QrPrintFragment extends Fragment { | ||||||
|  | 
 | ||||||
|  |     // TODO: Rename parameter arguments, choose names that match | ||||||
|  |     // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER | ||||||
|  |     private static final String ARG_PARAM1 = "param1"; | ||||||
|  |     private static final String ARG_PARAM2 = "param2"; | ||||||
|  | 
 | ||||||
|  |     // TODO: Rename and change types of parameters | ||||||
|  |     private String mParam1; | ||||||
|  |     private String mParam2; | ||||||
|  | 
 | ||||||
|  |     public QrPrintFragment() { | ||||||
|  |         // Required empty public constructor | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Use this factory method to create a new instance of | ||||||
|  |      * this fragment using the provided parameters. | ||||||
|  |      * | ||||||
|  |      * @param param1 Parameter 1. | ||||||
|  |      * @param param2 Parameter 2. | ||||||
|  |      * @return A new instance of fragment QrPrintFragment. | ||||||
|  |      */ | ||||||
|  |     // TODO: Rename and change types and number of parameters | ||||||
|  |     public static QrPrintFragment newInstance(String param1, String param2) { | ||||||
|  |         QrPrintFragment fragment = new QrPrintFragment(); | ||||||
|  |         Bundle args = new Bundle(); | ||||||
|  |         args.putString(ARG_PARAM1, param1); | ||||||
|  |         args.putString(ARG_PARAM2, param2); | ||||||
|  |         fragment.setArguments(args); | ||||||
|  |         return fragment; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public void onCreate (Bundle savedInstanceState) { | ||||||
|  |         super.onCreate(savedInstanceState); | ||||||
|  |         if (getArguments() != null) { | ||||||
|  |             mParam1 = getArguments().getString(ARG_PARAM1); | ||||||
|  |             mParam2 = getArguments().getString(ARG_PARAM2); | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |    // @Override | ||||||
|  |     public View onCreateView(LayoutInflater inflater, ViewGroup container, | ||||||
|  |                              Bundle savedInstanceState) { | ||||||
|  |         //共有プリファレンス全体の準備 | ||||||
|  |         SharedPreferences sharedPreferences = getActivity().getSharedPreferences("app_situation", MODE_PRIVATE); | ||||||
|  |         //User毎のドメインを保存する | ||||||
|  |         String IdPref=sharedPreferences.getString("ID",null); | ||||||
|  |         // Inflate the layout for this fragment | ||||||
|  |         View view=inflater.inflate(R.layout.fragment_qr_print, container, false);; | ||||||
|  |         //固定のドメイン | ||||||
|  |         String KoteiURL = "https://practicefirestore1-8808c.web.app/?id="; | ||||||
|  |         //すべてのドメイン | ||||||
|  |         String AllURL; | ||||||
|  |         //IdPrefにの値が初期値の場合 | ||||||
|  |         if(IdPref==null) { | ||||||
|  |             //User毎のドメイン | ||||||
|  |             String userURL = getArguments().getString("STR_KEY"); | ||||||
|  |             //キー"ID"の値をuserURLの値にする | ||||||
|  |             SharedPreferences.Editor e = sharedPreferences.edit(); | ||||||
|  |             e.putString("ID", userURL); | ||||||
|  |             //確定処理 | ||||||
|  |             e.apply(); | ||||||
|  |             //二つのドメインを合成する | ||||||
|  |             AllURL=KoteiURL+userURL; | ||||||
|  |         }else{ | ||||||
|  |             //二つのドメインを合成する | ||||||
|  |             AllURL=KoteiURL+IdPref; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         int size = 2500; | ||||||
|  |         ImageView imageViewQrCode; | ||||||
|  |         Bitmap QRGazou; | ||||||
|  |         try { | ||||||
|  |             //QRコード生成 | ||||||
|  |             BarcodeEncoder barcodeEncoder = new BarcodeEncoder(); | ||||||
|  |             Bitmap bitmapqr = barcodeEncoder.encodeBitmap(AllURL, BarcodeFormat.QR_CODE, size, size); | ||||||
|  |             imageViewQrCode = (ImageView) view.findViewById(R.id.qr_view); | ||||||
|  |             imageViewQrCode.setTranslationX(1000); | ||||||
|  |             imageViewQrCode.setTranslationY(1000); | ||||||
|  |             imageViewQrCode.setImageBitmap(bitmapqr); | ||||||
|  |         } catch (WriterException e) { | ||||||
|  |             throw new AndroidRuntimeException("Barcode Error.", e); | ||||||
|  |         } | ||||||
|  |         //    画像合成の準備 | ||||||
|  |         //    ここのエラーは直すと何故か動かなくなる。このままで動くので放置 | ||||||
|  |         Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a_group_qr_sos); | ||||||
|  |         Bitmap bitmap1 = ((BitmapDrawable) imageViewQrCode.getDrawable()).getBitmap(); | ||||||
|  |         int width = bitmap.getWidth(); // 元ファイルの幅取得 | ||||||
|  |         int height = bitmap.getHeight(); // 元ファイルの高さ取得 | ||||||
|  |         QRGazou = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); | ||||||
|  |         //Canvasの準備 | ||||||
|  |         Canvas canvas = new Canvas(QRGazou); | ||||||
|  |         //画像のサイズの調整 | ||||||
|  |         int disWidth = (width - bitmap1.getWidth()) / 2; | ||||||
|  |         int disHeight = (int) ((height - bitmap1.getHeight()) / 1.3); | ||||||
|  |         canvas.drawBitmap(bitmap, 0, 0, (Paint) null); // image, x座標, y座標, Paintインスタンス | ||||||
|  |         canvas.drawBitmap(bitmap1, disWidth, disHeight, (Paint) null); // 画像合成 | ||||||
|  |         //Androidからプリンターへ印刷指示を出すサポートライブラリ | ||||||
|  |         PrintHelper printHelper = new PrintHelper(getActivity()); | ||||||
|  |         printHelper.setColorMode(PrintHelper.COLOR_MODE_COLOR); | ||||||
|  |         printHelper.setScaleMode(PrintHelper.SCALE_MODE_FIT); | ||||||
|  |         printHelper.printBitmap("job_name", QRGazou); | ||||||
|  |         HomeFragment homeFragment=new HomeFragment(); | ||||||
|  | //        replaceFragment(homeFragment); | ||||||
|  |         return view; | ||||||
|  |     } | ||||||
|  |       //画面遷移メソッド | ||||||
|  |     private void replaceFragment(Fragment fragment) { | ||||||
|  |         // フラグメントマネージャーの取得 | ||||||
|  |         FragmentManager manager = getParentFragmentManager(); // アクティビティではgetSupportFragmentManager()? | ||||||
|  |         // フラグメントトランザクションの開始 | ||||||
|  |         FragmentTransaction transaction = manager.beginTransaction(); | ||||||
|  |         // レイアウトをfragmentに置き換え(追加) | ||||||
|  |         transaction.replace(R.id.fragmentContainerView, fragment); | ||||||
|  |         // 置き換えのトランザクションをバックスタックに保存する | ||||||
|  |         transaction.addToBackStack(null); | ||||||
|  |         // フラグメントトランザクションをコミット | ||||||
|  |         transaction.commit(); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -1,14 +1,17 @@ | ||||||
| package com.example.childguard; | package com.example.childguard; | ||||||
| 
 | 
 | ||||||
| import android.content.Context; | import android.content.Context; | ||||||
|  | import android.content.SharedPreferences; | ||||||
| import android.graphics.Bitmap; | import android.graphics.Bitmap; | ||||||
| import android.graphics.BitmapFactory; | import android.graphics.BitmapFactory; | ||||||
| import android.graphics.Canvas; | import android.graphics.Canvas; | ||||||
| import android.graphics.Paint; | import android.graphics.Paint; | ||||||
|  | import android.graphics.drawable.BitmapDrawable; | ||||||
| import android.util.AndroidRuntimeException; | import android.util.AndroidRuntimeException; | ||||||
| import android.util.DisplayMetrics; |  | ||||||
| import android.util.Log; | import android.util.Log; | ||||||
| import android.view.WindowManager; | import android.widget.ImageView; | ||||||
|  | 
 | ||||||
|  | import androidx.print.PrintHelper; | ||||||
| 
 | 
 | ||||||
| import com.google.zxing.BarcodeFormat; | import com.google.zxing.BarcodeFormat; | ||||||
| import com.google.zxing.WriterException; | import com.google.zxing.WriterException; | ||||||
|  | @ -25,50 +28,37 @@ public class QrUtils { | ||||||
| 
 | 
 | ||||||
|     public Bitmap getBitmap(String key) { |     public Bitmap getBitmap(String key) { | ||||||
|         Log.d("getBitmap", "getBitmap: " + key); |         Log.d("getBitmap", "getBitmap: " + key); | ||||||
|         String fixationURL = "https://practicefirestore1-8808c.web.app/?id="; |         String KoteiURL = "https://practicefirestore1-8808c.web.app/?id="; | ||||||
|         //すべてのドメイン |         //すべてのドメイン | ||||||
|         String AllURL; |         String AllURL; | ||||||
|         //IdPrefにの値が初期値の場合 |         //IdPrefにの値が初期値の場合 | ||||||
|         AllURL = fixationURL + key; |         AllURL=KoteiURL+key; | ||||||
| 
 | 
 | ||||||
| 
 |         int size = 1500; | ||||||
|         int qrCodeSize = calculateQRCodeSize(); // 画面密度に応じてサイズを計算 |         Bitmap QRGazou; | ||||||
|         Bitmap QRImage; |         Bitmap bitmapqr; | ||||||
|         Bitmap bitmapQR; |  | ||||||
|         try { |         try { | ||||||
|             //QRコード生成 |             //QRコード生成 | ||||||
|             BarcodeEncoder barcodeEncoder = new BarcodeEncoder(); |             BarcodeEncoder barcodeEncoder = new BarcodeEncoder(); | ||||||
|             bitmapQR = barcodeEncoder.encodeBitmap(AllURL, BarcodeFormat.QR_CODE, qrCodeSize, qrCodeSize); |             bitmapqr = barcodeEncoder.encodeBitmap(AllURL, BarcodeFormat.QR_CODE, size, size); | ||||||
|         } catch (WriterException e) { |         } catch (WriterException e) { | ||||||
|             throw new AndroidRuntimeException("Barcode Error.", e); |             throw new AndroidRuntimeException("Barcode Error.", e); | ||||||
|         } |         } | ||||||
|         // 画像合成の準備 |         // 画像合成の準備 | ||||||
|         Bitmap bitmap = BitmapFactory.decodeResource(this.context.getResources(), R.drawable.a_group_qr_sos_2); |         Bitmap bitmap = BitmapFactory.decodeResource(this.context.getResources(), R.drawable.a_group_qr_sos); | ||||||
|         int width = bitmap.getWidth(); |         int width = bitmap.getWidth(); | ||||||
|         int height = bitmap.getHeight(); |         int height = bitmap.getHeight(); | ||||||
|         QRImage = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); |         QRGazou = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); | ||||||
| 
 | 
 | ||||||
|         // Canvasの準備 |         // Canvasの準備 | ||||||
|         Canvas canvas = new Canvas(QRImage); |         Canvas canvas = new Canvas(QRGazou); | ||||||
| 
 | 
 | ||||||
|         // 画像のサイズの調整 |         // 画像のサイズの調整 | ||||||
|         int disWidth = (width - bitmapQR.getWidth()) / 2; |         int disWidth = (width - bitmapqr.getWidth()) / 2; | ||||||
|         int disHeight = (int) ((height - bitmapQR.getHeight()) / 1.5); |         int disHeight = (int) ((height - bitmapqr.getHeight()) / 1.3); | ||||||
|         canvas.drawBitmap(bitmap, 0, 0, (Paint) null); |         canvas.drawBitmap(bitmap, 0, 0, (Paint) null); | ||||||
|         canvas.drawBitmap(bitmapQR, disWidth, disHeight, (Paint) null); // 画像合成 |         canvas.drawBitmap(bitmapqr, disWidth, disHeight, (Paint) null); // 画像合成 | ||||||
|         //Androidからプリンターへ印刷指示を出すサポートライブラリ |         //Androidからプリンターへ印刷指示を出すサポートライブラリ | ||||||
|         return QRImage; |         return QRGazou; | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
|     private int calculateQRCodeSize() { |  | ||||||
|         // 画面解像度を取得 |  | ||||||
|         DisplayMetrics metrics = new DisplayMetrics(); |  | ||||||
|         WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); |  | ||||||
|         windowManager.getDefaultDisplay().getMetrics(metrics); |  | ||||||
| 
 |  | ||||||
|         // 画面密度に基づいてQRコードのサイズを計算 |  | ||||||
|         float density = context.getResources().getDisplayMetrics().density; |  | ||||||
|         return (int) (700 * density); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,5 +1,6 @@ | ||||||
| package com.example.childguard; | package com.example.childguard; | ||||||
| 
 | 
 | ||||||
|  | import android.bluetooth.BluetoothAdapter; | ||||||
| import android.content.Context; | import android.content.Context; | ||||||
| import android.content.SharedPreferences; | import android.content.SharedPreferences; | ||||||
| import android.preference.PreferenceManager; | import android.preference.PreferenceManager; | ||||||
|  | @ -15,6 +16,7 @@ import androidx.appcompat.app.AlertDialog; | ||||||
| import androidx.recyclerview.widget.RecyclerView; | import androidx.recyclerview.widget.RecyclerView; | ||||||
| 
 | 
 | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
|  | import java.util.function.Predicate; | ||||||
| 
 | 
 | ||||||
| public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ItemViewHolder> { | public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ItemViewHolder> { | ||||||
| 
 | 
 | ||||||
|  | @ -23,7 +25,6 @@ public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ItemVi | ||||||
|     Context applicationContext; |     Context applicationContext; | ||||||
|     View parentView; |     View parentView; | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|     // Constructor |     // Constructor | ||||||
|     public RecyclerAdapter(ArrayList<String[]> deviceList, Context applicationContext, View parentView) { |     public RecyclerAdapter(ArrayList<String[]> deviceList, Context applicationContext, View parentView) { | ||||||
|         // Init |         // Init | ||||||
|  | @ -31,7 +32,6 @@ public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ItemVi | ||||||
|         this.deviceList = deviceList; |         this.deviceList = deviceList; | ||||||
|         this.applicationContext = applicationContext; |         this.applicationContext = applicationContext; | ||||||
|         this.parentView = parentView; |         this.parentView = parentView; | ||||||
| 
 |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @NonNull |     @NonNull | ||||||
|  | @ -45,7 +45,7 @@ public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ItemVi | ||||||
|     @Override |     @Override | ||||||
|     public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { |     public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { | ||||||
|         holder.textView.setText(deviceList.get(position)[0]); |         holder.textView.setText(deviceList.get(position)[0]); | ||||||
|         holder.textView.setOnClickListener(v -> { |         holder.textView.setOnClickListener( v -> { | ||||||
| 
 | 
 | ||||||
|             // アラートダイアログを表示 |             // アラートダイアログを表示 | ||||||
|             new AlertDialog.Builder(v.getContext()) |             new AlertDialog.Builder(v.getContext()) | ||||||
|  | @ -53,15 +53,16 @@ public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ItemVi | ||||||
|                     .setMessage("このデバイスを登録しますか?") |                     .setMessage("このデバイスを登録しますか?") | ||||||
|                     .setPositiveButton(android.R.string.ok, (dialog, which) -> { |                     .setPositiveButton(android.R.string.ok, (dialog, which) -> { | ||||||
|                         // OK button pressed |                         // 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 sharedPreferences=PreferenceManager.getDefaultSharedPreferences(this.applicationContext); | ||||||
|                         sharedPreferences.edit().putString("bluetooth_device_id", deviceList.get(position)[1]).apply(); |                         sharedPreferences.edit().putString("bluetooth_device_id", deviceList.get(position)[1]).apply(); | ||||||
|                         sharedPreferences.edit().putString("bluetooth_device_name", deviceList.get(position)[0]).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 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")); | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|                     }) |                     }) | ||||||
|  |  | ||||||
|  | @ -3,18 +3,23 @@ package com.example.childguard; | ||||||
| import static android.content.ContentValues.TAG; | import static android.content.ContentValues.TAG; | ||||||
| import static android.content.Context.MODE_PRIVATE; | import static android.content.Context.MODE_PRIVATE; | ||||||
| 
 | 
 | ||||||
| import android.content.Context; |  | ||||||
| import android.content.Intent; |  | ||||||
| import android.content.SharedPreferences; | import android.content.SharedPreferences; | ||||||
| import android.os.Bundle; | import android.os.Bundle; | ||||||
|  | 
 | ||||||
|  | import androidx.annotation.NonNull; | ||||||
|  | import androidx.fragment.app.Fragment; | ||||||
|  | import androidx.print.PrintHelper; | ||||||
|  | 
 | ||||||
| import android.util.Log; | import android.util.Log; | ||||||
| import android.view.LayoutInflater; | import android.view.LayoutInflater; | ||||||
| import android.view.View; | import android.view.View; | ||||||
| import android.view.ViewGroup; | import android.view.ViewGroup; | ||||||
|  | import android.widget.Button; | ||||||
| import android.widget.Toast; | import android.widget.Toast; | ||||||
| 
 | 
 | ||||||
| import androidx.fragment.app.Fragment; | import com.google.android.gms.tasks.OnFailureListener; | ||||||
| 
 | import com.google.android.gms.tasks.OnSuccessListener; | ||||||
|  | import com.google.firebase.firestore.DocumentReference; | ||||||
| import com.google.firebase.firestore.FirebaseFirestore; | import com.google.firebase.firestore.FirebaseFirestore; | ||||||
| 
 | 
 | ||||||
| import java.util.HashMap; | import java.util.HashMap; | ||||||
|  | @ -28,7 +33,6 @@ import java.util.Map; | ||||||
| public class SettingFragment extends Fragment { | public class SettingFragment extends Fragment { | ||||||
| 
 | 
 | ||||||
|     FirebaseFirestore db; |     FirebaseFirestore db; | ||||||
| 
 |  | ||||||
|     public SettingFragment() { |     public SettingFragment() { | ||||||
|         // Required empty public constructor |         // Required empty public constructor | ||||||
|     } |     } | ||||||
|  | @ -58,11 +62,11 @@ public class SettingFragment extends Fragment { | ||||||
| 
 | 
 | ||||||
|         db = FirebaseFirestore.getInstance();//Firebaseとの紐づけ |         db = FirebaseFirestore.getInstance();//Firebaseとの紐づけ | ||||||
| 
 | 
 | ||||||
|         view.findViewById(R.id.button_bluetooth_setting).setOnClickListener(v -> { |         view.findViewById(R.id.button_bluetooth_setting).setOnClickListener( v -> { | ||||||
|             getParentFragmentManager().beginTransaction().replace(R.id.fragmentContainerView, bluetooth_setupFragment.newInstance("test", "test")).addToBackStack(null).commit(); |             getParentFragmentManager().beginTransaction().replace(R.id.fragmentContainerView, bluetooth_setupFragment.newInstance("test", "test")).addToBackStack(null).commit(); | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
|         view.findViewById(R.id.button_print_qr).setOnClickListener(v -> { |         view.findViewById(R.id.button_print_qr).setOnClickListener( v -> { | ||||||
|             SharedPreferences sharedPreferences = getActivity().getSharedPreferences("app_situation", MODE_PRIVATE); |             SharedPreferences sharedPreferences = getActivity().getSharedPreferences("app_situation", MODE_PRIVATE); | ||||||
|             boolean alreadySaved = sharedPreferences.getBoolean("alreadySaved", false); |             boolean alreadySaved = sharedPreferences.getBoolean("alreadySaved", false); | ||||||
|             //falseのときにFirebaseへの登録 |             //falseのときにFirebaseへの登録 | ||||||
|  | @ -72,16 +76,18 @@ public class SettingFragment extends Fragment { | ||||||
|                 Toast.makeText(getActivity(), "再印刷", Toast.LENGTH_SHORT).show(); |                 Toast.makeText(getActivity(), "再印刷", Toast.LENGTH_SHORT).show(); | ||||||
|                 getParentFragmentManager().beginTransaction().addToBackStack(null).replace(R.id.fragmentContainerView, GenerateQrFragment.newInstance(sharedPreferences.getString("ID", "none"))).commit(); |                 getParentFragmentManager().beginTransaction().addToBackStack(null).replace(R.id.fragmentContainerView, GenerateQrFragment.newInstance(sharedPreferences.getString("ID", "none"))).commit(); | ||||||
|             } else { |             } else { | ||||||
|                 Map<String, Boolean> DEFAULT_ITEM = new HashMap<>();//mapの宣言 |                 String valueParent = "placeholder"; | ||||||
|  |                 String valueBorn = "placeholder"; | ||||||
|  |                 Map<String, String> user = new HashMap<>();//mapの宣言 | ||||||
| 
 | 
 | ||||||
|                 Log.d("HomeFragment", "onClick is called"); |                 Log.d("HomeFragment", "onClick is called"); | ||||||
| 
 | 
 | ||||||
|                 //mapに入れる |                 //mapに入れる | ||||||
|                 DEFAULT_ITEM.put("isInCar", false); |                 user.put("parent", valueParent); | ||||||
|                 DEFAULT_ITEM.put("isReported", false); |                 user.put("born", valueBorn); | ||||||
|                 //新しいドキュメントにIDを作って追加 |                 //新しいドキュメントにIDを作って追加 | ||||||
|                 db.collection("status") |                 db.collection("users") | ||||||
|                         .add(DEFAULT_ITEM) |                         .add(user) | ||||||
|                         .addOnSuccessListener(documentReference -> { |                         .addOnSuccessListener(documentReference -> { | ||||||
|                             //成功したら |                             //成功したら | ||||||
|                             //documentReference.getId()でID取得 |                             //documentReference.getId()でID取得 | ||||||
|  | @ -89,7 +95,6 @@ public class SettingFragment extends Fragment { | ||||||
|                             SharedPreferences.Editor e = sharedPreferences.edit(); |                             SharedPreferences.Editor e = sharedPreferences.edit(); | ||||||
|                             // キー"alreadySaved"の値をtrueにする |                             // キー"alreadySaved"の値をtrueにする | ||||||
|                             e.putBoolean("alreadySaved", true); |                             e.putBoolean("alreadySaved", true); | ||||||
| 
 |  | ||||||
|                             //確定処理 |                             //確定処理 | ||||||
|                             e.apply(); |                             e.apply(); | ||||||
|                             //画面遷移&ID受け渡し |                             //画面遷移&ID受け渡し | ||||||
|  | @ -97,7 +102,6 @@ public class SettingFragment extends Fragment { | ||||||
|                             SharedPreferences.Editor editor = sharedPreferences1.edit(); |                             SharedPreferences.Editor editor = sharedPreferences1.edit(); | ||||||
|                             editor.putString("ID", documentReference.getId()); |                             editor.putString("ID", documentReference.getId()); | ||||||
|                             editor.apply(); |                             editor.apply(); | ||||||
|                             startTestService(); |  | ||||||
| 
 | 
 | ||||||
|                             Toast.makeText(getActivity(), "初回登録", Toast.LENGTH_SHORT).show(); |                             Toast.makeText(getActivity(), "初回登録", Toast.LENGTH_SHORT).show(); | ||||||
|                             getParentFragmentManager().beginTransaction().addToBackStack(null).replace(R.id.fragmentContainerView, GenerateQrFragment.newInstance(documentReference.getId())).commit(); |                             getParentFragmentManager().beginTransaction().addToBackStack(null).replace(R.id.fragmentContainerView, GenerateQrFragment.newInstance(documentReference.getId())).commit(); | ||||||
|  | @ -109,11 +113,4 @@ public class SettingFragment extends Fragment { | ||||||
|             } |             } | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|     private void startTestService() { |  | ||||||
|         Context context = getContext(); |  | ||||||
|         if (context != null) { |  | ||||||
|             Intent serviceIntent = new Intent(context, SurveillanceService.class); |  | ||||||
|             context.startForegroundService(serviceIntent); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  | @ -1,376 +0,0 @@ | ||||||
| package com.example.childguard; |  | ||||||
| 
 |  | ||||||
| import android.Manifest; |  | ||||||
| import android.app.Notification; |  | ||||||
| import android.app.NotificationChannel; |  | ||||||
| import android.app.NotificationManager; |  | ||||||
| import android.app.PendingIntent; |  | ||||||
| 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.SharedPreferences; |  | ||||||
| import android.content.pm.PackageManager; |  | ||||||
| import android.os.Build; |  | ||||||
| import android.os.Handler; |  | ||||||
| import android.os.IBinder; |  | ||||||
| import android.os.VibrationEffect; |  | ||||||
| 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; |  | ||||||
| 
 |  | ||||||
| import com.google.firebase.firestore.DocumentReference; |  | ||||||
| import com.google.firebase.firestore.FirebaseFirestore; |  | ||||||
| 
 |  | ||||||
| public class SurveillanceService extends Service { |  | ||||||
| 
 |  | ||||||
|     private final Handler handler = new Handler(); |  | ||||||
|     private Runnable notificationRunnable; |  | ||||||
| 
 |  | ||||||
|     public static class NotificationContent { |  | ||||||
|         private final String title; |  | ||||||
|         private final String description; |  | ||||||
|         private final String channelId; |  | ||||||
|         private final int notificationId; |  | ||||||
| 
 |  | ||||||
|         public NotificationContent(String title, String description, String channelId, int notificationId) { |  | ||||||
|             this.title = title; |  | ||||||
|             this.description = description; |  | ||||||
|             this.channelId = channelId; |  | ||||||
|             this.notificationId = notificationId; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         public String getTitle() { |  | ||||||
|             return title; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         public String getDescription() { |  | ||||||
|             return description; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         public String getChannelId() { |  | ||||||
|             return channelId; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         public int getNotificationId() { |  | ||||||
|             return notificationId; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public static final String TAG = "InspirationQuote"; |  | ||||||
|     private static final String BT_ALERT_CHANNEL_ID = "child_guard_bt_alert"; |  | ||||||
|     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 NotificationContent REPORTED_NOTIFICATION = |  | ||||||
|             new NotificationContent("子供の置き去りをしていませんか?", "第三者からの通報が行われました。", REPORTED_CHANNEL_ID, 2); |  | ||||||
|     private static final NotificationContent BLUETOOTH_NOTIFICATION = |  | ||||||
|             new NotificationContent("子供の置き去りをしていませんか?🐈", "Bluetoothと車の切断から5分が経過しました", BT_ALERT_CHANNEL_ID, 3); |  | ||||||
| 
 |  | ||||||
|     private String userId = null; |  | ||||||
| 
 |  | ||||||
|     @Override |  | ||||||
|     public int onStartCommand(Intent intent, int flags, int startId) { |  | ||||||
|         Log.d(TAG, "onStartCommand: "); |  | ||||||
|         this.userId = getSharedPreferences("app_situation", MODE_PRIVATE).getString("ID", null); |  | ||||||
|         if (this.userId == null) { |  | ||||||
|             Log.d("onResume", "ID not initialized."); |  | ||||||
|             return flags; // IDが初期化されていない場合は何もしない |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         if (isNotificationChannelCreated(BACKGROUND_CHANNEL_ID)) { |  | ||||||
|             createRunningNotificationChannel(); |  | ||||||
|         } |  | ||||||
|         Intent notificationIntent = new Intent(this, MainActivity.class); |  | ||||||
|         PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_IMMUTABLE); |  | ||||||
|         Notification notification = new NotificationCompat.Builder(this, BACKGROUND_CHANNEL_ID) |  | ||||||
|                 .setContentTitle("ChildGuardバックグラウンドサービス") |  | ||||||
|                 .setContentText("接続/通報監視サービスがバックグラウンドで実行されています") |  | ||||||
|                 .setSmallIcon(android.R.drawable.ic_menu_info_details) |  | ||||||
|                 .setContentIntent(pendingIntent) |  | ||||||
|                 .build(); |  | ||||||
|         startForeground(1, notification); |  | ||||||
| 
 |  | ||||||
|         setSnapshotListener(FirebaseFirestore.getInstance().document("status/" + this.userId)); |  | ||||||
| 
 |  | ||||||
|         if (isNotBluetoothGranted()) return flags; |  | ||||||
| 
 |  | ||||||
|         registerReceiver(receiver); |  | ||||||
|         return START_STICKY; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Override |  | ||||||
|     public void onCreate() { |  | ||||||
|         super.onCreate(); |  | ||||||
|         if (isNotificationChannelCreated(BT_ALERT_CHANNEL_ID)) createAlertNotificationChannel(BT_ALERT_CHANNEL_ID); |  | ||||||
|         if (isNotificationChannelCreated(REPORTED_CHANNEL_ID)) createAlertNotificationChannel(REPORTED_CHANNEL_ID); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * 通知チャネルが作成されているか確認 |  | ||||||
|      * @return 通知チャンネルの有無 true: 作成済み false: 未作成 |  | ||||||
|      */ |  | ||||||
|     private boolean isNotificationChannelCreated(String channelId) { |  | ||||||
|         NotificationManager notificationManager = getSystemService(NotificationManager.class); |  | ||||||
|         return notificationManager.getNotificationChannel(channelId) == null; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * 通知チャネルの作成 |  | ||||||
|      */ |  | ||||||
|     private void createAlertNotificationChannel(String channelId) { |  | ||||||
|         int importance = NotificationManager.IMPORTANCE_DEFAULT; |  | ||||||
|         NotificationChannel channel = new NotificationChannel(channelId, "通知", importance); |  | ||||||
|         channel.setDescription("第三者により置き去りの通報が行われたときに通知します。"); |  | ||||||
|         NotificationManager notificationManager = getSystemService(NotificationManager.class); |  | ||||||
|         notificationManager.createNotificationChannel(channel); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * バックグラウンドで実行中の通知チャネルを作成 |  | ||||||
|      */ |  | ||||||
|     private void createRunningNotificationChannel() { |  | ||||||
|         NotificationChannel serviceChannel = new NotificationChannel( |  | ||||||
|                 BACKGROUND_CHANNEL_ID, |  | ||||||
|                 "Foreground Service Channel", |  | ||||||
|                 NotificationManager.IMPORTANCE_NONE |  | ||||||
|         ); |  | ||||||
|         NotificationManager manager = getSystemService(NotificationManager.class); |  | ||||||
|         if (manager != null) { |  | ||||||
|             manager.createNotificationChannel(serviceChannel); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * 通知が許可がされているかどうかを確認 |  | ||||||
|      * @return 通知の許可の有無 true: 許可されていない false: 許可されている |  | ||||||
|      */ |  | ||||||
|     private boolean isNotNotificationEnabled() { |  | ||||||
|         NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(this); |  | ||||||
|         if (!notificationManagerCompat.areNotificationsEnabled()) { |  | ||||||
|             Log.d(TAG, "通知が許可されていません"); |  | ||||||
|             return true; |  | ||||||
|         } else { |  | ||||||
|             Log.d(TAG, "通知が許可されています"); |  | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * Bluetoothの権限が許可されているかどうかを確認 |  | ||||||
|      * @return Bluetoothの権限の有無 true: 許可されていない false: 許可されている |  | ||||||
|      */ |  | ||||||
|     private boolean isNotBluetoothGranted() { |  | ||||||
|         String btPermission = getBluetoothConnectPermission(); |  | ||||||
|         if (ActivityCompat.checkSelfPermission(this, btPermission) != PackageManager.PERMISSION_GRANTED) { |  | ||||||
|             Log.d(TAG, "Bluetoothの権限が許可されていません"); |  | ||||||
|             return true; |  | ||||||
|         } else { |  | ||||||
|             Log.d(TAG, "Bluetoothの権限が許可されています"); |  | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * ブロードキャストレシーバーを登録 |  | ||||||
|      * @param receiver ブロードキャストレシーバー |  | ||||||
|      */ |  | ||||||
|     private void registerReceiver(BroadcastReceiver receiver) { |  | ||||||
|         IntentFilter intentFilter = new IntentFilter(); |  | ||||||
|         intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); |  | ||||||
|         intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); |  | ||||||
| 
 |  | ||||||
|         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のドキュメントリファレンス |  | ||||||
|      */ |  | ||||||
|     private void setSnapshotListener(DocumentReference mDocRef) { |  | ||||||
|         // Initialize the PeriodicTaskManager |  | ||||||
|         // (Assuming it's done elsewhere as it's not shown in the original code) |  | ||||||
| 
 |  | ||||||
|         // Prepare SharedPreferences |  | ||||||
|         SharedPreferences sharedPreferences = getSharedPreferences("app_situation", MODE_PRIVATE); |  | ||||||
| 
 |  | ||||||
|         // Add a snapshot listener to the document reference |  | ||||||
|         mDocRef.addSnapshotListener((documentSnapshot, e) -> { |  | ||||||
|             if (e != null) { |  | ||||||
|                 Log.w("nt", "Listen failed.", e); |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             if (documentSnapshot != null && documentSnapshot.exists()) { |  | ||||||
|                 Log.d("nt", "イベント開始"); |  | ||||||
| 
 |  | ||||||
|                 // Handle document snapshot |  | ||||||
|                 SharedPreferences.Editor editor = sharedPreferences.edit(); |  | ||||||
|                 boolean isInCar = sharedPreferences.getBoolean("isInCarPref", false); |  | ||||||
|                 boolean newIsInCarState = Boolean.TRUE.equals(documentSnapshot.getBoolean("isInCar")); |  | ||||||
| 
 |  | ||||||
|                 editor.putBoolean("isInCarPref", newIsInCarState); |  | ||||||
|                 editor.apply(); |  | ||||||
| 
 |  | ||||||
|                 Log.d("nt", "レスポンスを検知しました1"); |  | ||||||
|                 Log.d("SurveillanceService", "Bluetooth: "+sharedPreferences.getBoolean("BluetoothStatusLocal", false)); |  | ||||||
| 
 |  | ||||||
|                 if (isInCar&&!sharedPreferences.getBoolean("BluetoothStatusLocal", false)) { |  | ||||||
|                     if (Boolean.TRUE.equals(documentSnapshot.getBoolean("isReported"))) { |  | ||||||
|                         resetReported(); |  | ||||||
|                         sendNotification(getApplicationContext(), REPORTED_NOTIFICATION); |  | ||||||
|                     } |  | ||||||
|                 } else { |  | ||||||
|                     resetReported(); |  | ||||||
|                 } |  | ||||||
|             } else { |  | ||||||
|                 Log.d("nt", "Current data: null"); |  | ||||||
|             } |  | ||||||
|         }); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * 通報フラグをリセットする |  | ||||||
|      */ |  | ||||||
|     private void resetReported() { |  | ||||||
|         FirebaseFirestore db = FirebaseFirestore.getInstance();//Firebaseとの紐づけ |  | ||||||
|         DocumentReference isReported = db.collection("status").document(this.userId); |  | ||||||
|         //isReportedをfalseに更新 |  | ||||||
|         isReported.update("isReported", false).addOnSuccessListener(unused -> |  | ||||||
|                 Log.d(TAG, "DocumentSnapshot successfully updated!")).addOnFailureListener(e -> Log.w(TAG, "Error updating document", e)); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * 通知をタップしたときにアプリを起動するPendingIntentを取得 |  | ||||||
|      * |  | ||||||
|      * @param context コンテキスト |  | ||||||
|      * @return PendingIntent |  | ||||||
|      */ |  | ||||||
|     private PendingIntent getPendingIntent(Context context) { |  | ||||||
|         Intent intent = new Intent(context, MainActivity.class); |  | ||||||
|         intent.setAction("OPEN_ACTIVITY"); |  | ||||||
|         return PendingIntent.getActivity(context, SurveillanceService.REQUEST_CODE, intent, PendingIntent.FLAG_IMMUTABLE); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * デバイスをバイブレーションさせる |  | ||||||
|      */ |  | ||||||
|     private void vibrateDevice() { |  | ||||||
|         Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); |  | ||||||
|         if (vibrator.hasVibrator()) { |  | ||||||
|             vibrator.vibrate(VibrationEffect.createOneShot(2000, VibrationEffect.DEFAULT_AMPLITUDE)); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * 通知を送信する |  | ||||||
|      * @param context コンテキスト |  | ||||||
|      * @param content NotificationContent 通知内容 |  | ||||||
|      */ |  | ||||||
|     private void sendNotification(Context context, NotificationContent content) {//通知を行うメソッド |  | ||||||
|         // 権限の保有を確認 |  | ||||||
|         if (isNotNotificationEnabled()) return; |  | ||||||
| 
 |  | ||||||
|         vibrateDevice(); |  | ||||||
| 
 |  | ||||||
|         NotificationCompat.Builder builder = new NotificationCompat.Builder(context, content.getChannelId()) |  | ||||||
|                 .setSmallIcon(android.R.drawable.ic_menu_info_details) |  | ||||||
|                 .setContentTitle(content.getTitle())//通知のタイトル |  | ||||||
|                 .setContentText(content.getDescription())//通知の内容 |  | ||||||
|                 .setContentIntent(getPendingIntent(context))//通知をタップするとActivityへ移動する |  | ||||||
|                 .setAutoCancel(true)//通知をタップすると削除する |  | ||||||
|                 .setPriority(NotificationCompat.PRIORITY_HIGH) // プライオリティを高く設定 |  | ||||||
|                 .setVisibility(NotificationCompat.VISIBILITY_PUBLIC); // ロック画面に表示する |  | ||||||
| 
 |  | ||||||
|         NotificationManager notificationManager = context.getSystemService(NotificationManager.class); |  | ||||||
| 
 |  | ||||||
|         notificationManager.notify(content.getNotificationId(), builder.build()); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     private final BroadcastReceiver receiver = new BroadcastReceiver() { |  | ||||||
|         @Override |  | ||||||
|         public void onReceive(Context context, Intent intent) { |  | ||||||
|             // 処理対象か確認 ---------------------------------------- |  | ||||||
|             BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); |  | ||||||
|             if (device == null) { |  | ||||||
|                 Log.d("BT", "No device found"); |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|             String deviceHardwareAddress = device.getAddress(); // MAC address |  | ||||||
|             if (deviceHardwareAddress == null) { |  | ||||||
|                 Log.d("BT", "No device address found"); |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|             String registeredId = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getString("bluetooth_device_id", null); |  | ||||||
|             if (registeredId == null) { |  | ||||||
|                 Log.d("BT_Judge", "No registered device"); |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|             if (!registeredId.equals(deviceHardwareAddress)) { |  | ||||||
|                 Log.d("BT_Judge", "Not registered device"); |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|             boolean isInCar = getSharedPreferences("app_situation", MODE_PRIVATE).getBoolean("change", false); |  | ||||||
| //            if (!isInCar) { |  | ||||||
| //                Log.d("BT_Judge", "Not in car"); |  | ||||||
| //                return; |  | ||||||
| //            } |  | ||||||
|             // ----------------------------------------------------- |  | ||||||
| 
 |  | ||||||
|             // debug log |  | ||||||
|             Log.d("BT", "Bluetooth device found: " + deviceHardwareAddress); |  | ||||||
|             Log.d("BT", "Registered device: " + registeredId); |  | ||||||
|             Log.d("BT", "Is in car: " + isInCar); |  | ||||||
|             SharedPreferences sharedPreferences = SurveillanceService.this.getSharedPreferences("app_situation", MODE_PRIVATE); |  | ||||||
|             SharedPreferences.Editor E = sharedPreferences.edit(); |  | ||||||
|             String action = intent.getAction(); // may need to chain this to a recognizing function |  | ||||||
|             if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) { |  | ||||||
|                 E.putBoolean("BluetoothStatusLocal", false); |  | ||||||
|                 // bluetoothが切断されたときに乗車状態のとき |  | ||||||
|                 if (isInCar) { |  | ||||||
|                     notificationRunnable = () -> { |  | ||||||
|                         // 5分経過した時点でも車に乗っていない場合 |  | ||||||
|                         sendNotification(context, BLUETOOTH_NOTIFICATION); |  | ||||||
|                     }; |  | ||||||
|                 } |  | ||||||
|                 handler.postDelayed(notificationRunnable, NOTIFICATION_DELAY); |  | ||||||
|             } else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) { |  | ||||||
|                 E.putBoolean("BluetoothStatusLocal", true); |  | ||||||
|                 // 再接続された場合、通知をキャンセルする |  | ||||||
|                 if (notificationRunnable != null) { |  | ||||||
|                     handler.removeCallbacks(notificationRunnable); |  | ||||||
|                     notificationRunnable = null; |  | ||||||
|                     Log.d("BT", "Notification canceled due to reconnection"); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             E.apply(); |  | ||||||
|             Log.d("SurveillanceService:BT", "Bluetooth status: " + sharedPreferences.getBoolean("BluetoothStatusLocal", false)); |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
| 
 |  | ||||||
|     @Nullable |  | ||||||
|     @Override |  | ||||||
|     public IBinder onBind(Intent intent) { |  | ||||||
|         return null; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -7,7 +7,6 @@ import android.bluetooth.BluetoothDevice; | ||||||
| import android.bluetooth.BluetoothManager; | import android.bluetooth.BluetoothManager; | ||||||
| import android.content.Context; | import android.content.Context; | ||||||
| import android.content.pm.PackageManager; | import android.content.pm.PackageManager; | ||||||
| import android.os.Build; |  | ||||||
| import android.os.Bundle; | import android.os.Bundle; | ||||||
| 
 | 
 | ||||||
| import androidx.core.app.ActivityCompat; | import androidx.core.app.ActivityCompat; | ||||||
|  | @ -24,7 +23,6 @@ import android.view.MenuItem; | ||||||
| import android.view.View; | import android.view.View; | ||||||
| import android.view.ViewGroup; | import android.view.ViewGroup; | ||||||
| import android.widget.TextView; | import android.widget.TextView; | ||||||
| import android.widget.Toast; |  | ||||||
| 
 | 
 | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.Objects; | 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) { |         if (ActivityCompat.checkSelfPermission(requireActivity().getApplicationContext(), android.Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { | ||||||
| //            // TODO: Consider calling |             // TODO: Consider calling | ||||||
| //            //    ActivityCompat#requestPermissions |             //    ActivityCompat#requestPermissions | ||||||
| //            // here to request the missing permissions, and then overriding |             // here to request the missing permissions, and then overriding | ||||||
| //            //   public void onRequestPermissionsResult(int requestCode, String[] permissions, |             //   public void onRequestPermissionsResult(int requestCode, String[] permissions, | ||||||
| //            //                                          int[] grantResults) |             //                                          int[] grantResults) | ||||||
| //            // to handle the case where the user grants the permission. See the documentation |             // to handle the case where the user grants the permission. See the documentation | ||||||
| //            // for ActivityCompat#requestPermissions for more details. |             // for ActivityCompat#requestPermissions for more details. | ||||||
| //            return view; |             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+)"); |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|         Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices(); |         Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices(); | ||||||
| 
 | 
 | ||||||
|  | @ -149,6 +126,7 @@ public class bluetooth_setupFragment extends Fragment { | ||||||
|             for (BluetoothDevice device : pairedDevices) { |             for (BluetoothDevice device : pairedDevices) { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|                 String[] deviceInfo = new String[2]; |                 String[] deviceInfo = new String[2]; | ||||||
|                 deviceInfo[0] = device.getName(); |                 deviceInfo[0] = device.getName(); | ||||||
|                 deviceInfo[1] = device.getAddress(); // MAC address |                 deviceInfo[1] = device.getAddress(); // MAC address | ||||||
|  | @ -165,8 +143,9 @@ public class bluetooth_setupFragment extends Fragment { | ||||||
| 
 | 
 | ||||||
|             //④RecyclerViewとAdapterの結び付け |             //④RecyclerViewとAdapterの結び付け | ||||||
|             recyclerView1.setAdapter(adapter); |             recyclerView1.setAdapter(adapter); | ||||||
|             TextView textView = view.findViewById(R.id.registered_device); |             TextView textView=view.findViewById(R.id.registered_device); | ||||||
|             textView.setText(PreferenceManager.getDefaultSharedPreferences(requireActivity().getApplicationContext()).getString("bluetooth_device_name", "none")); |             textView.setText(PreferenceManager.getDefaultSharedPreferences(requireActivity().getApplicationContext()).getString("bluetooth_device_name","none")); | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|         } |         } | ||||||
|  |  | ||||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 50 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 2.9 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 16 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 22 KiB | 
|  | @ -19,7 +19,7 @@ | ||||||
|         app:layout_constraintTop_toTopOf="parent"> |         app:layout_constraintTop_toTopOf="parent"> | ||||||
| 
 | 
 | ||||||
|         <FrameLayout |         <FrameLayout | ||||||
|             android:id="@+id/car_situation_bg" |             android:id="@+id/situation_bg" | ||||||
|             android:layout_width="match_parent" |             android:layout_width="match_parent" | ||||||
|             android:layout_height="wrap_content" |             android:layout_height="wrap_content" | ||||||
|             android:layout_marginLeft="20dp" |             android:layout_marginLeft="20dp" | ||||||
|  | @ -37,7 +37,7 @@ | ||||||
|                 android:textSize="25dp" /> |                 android:textSize="25dp" /> | ||||||
| 
 | 
 | ||||||
|             <TextView |             <TextView | ||||||
|                 android:id="@+id/car_situation" |                 android:id="@+id/situation" | ||||||
|                 android:layout_width="match_parent" |                 android:layout_width="match_parent" | ||||||
|                 android:layout_height="200dp" |                 android:layout_height="200dp" | ||||||
|                 android:layout_marginTop="10dp" |                 android:layout_marginTop="10dp" | ||||||
|  | @ -49,7 +49,6 @@ | ||||||
|         </FrameLayout> |         </FrameLayout> | ||||||
| 
 | 
 | ||||||
|         <FrameLayout |         <FrameLayout | ||||||
|             android:id="@+id/situation_bg_bluetooth" |  | ||||||
|             android:layout_width="match_parent" |             android:layout_width="match_parent" | ||||||
|             android:layout_height="wrap_content" |             android:layout_height="wrap_content" | ||||||
|             android:layout_marginLeft="20dp" |             android:layout_marginLeft="20dp" | ||||||
|  | @ -58,7 +57,6 @@ | ||||||
|             android:background="@drawable/frame_style"> |             android:background="@drawable/frame_style"> | ||||||
| 
 | 
 | ||||||
|             <TextView |             <TextView | ||||||
|                 android:id="@+id/BluetoothSituation" |  | ||||||
|                 android:layout_width="match_parent" |                 android:layout_width="match_parent" | ||||||
|                 android:layout_height="wrap_content" |                 android:layout_height="wrap_content" | ||||||
|                 android:layout_marginTop="5dp" |                 android:layout_marginTop="5dp" | ||||||
|  | @ -75,7 +73,6 @@ | ||||||
|                 android:textAlignment="center" /> |                 android:textAlignment="center" /> | ||||||
| 
 | 
 | ||||||
|             <ImageView |             <ImageView | ||||||
|                 android:id="@+id/BluetoothSituationImage" |  | ||||||
|                 android:layout_width="match_parent" |                 android:layout_width="match_parent" | ||||||
|                 android:layout_height="100dp" |                 android:layout_height="100dp" | ||||||
|                 android:layout_marginTop="50dp" |                 android:layout_marginTop="50dp" | ||||||
|  |  | ||||||
							
								
								
									
										23
									
								
								app/src/main/res/layout/fragment_notification.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								app/src/main/res/layout/fragment_notification.xml
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,23 @@ | ||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <FrameLayout 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" | ||||||
|  |     tools:context=".NotificationFragment"> | ||||||
|  | 
 | ||||||
|  |     <!-- TODO: Update blank fragment layout --> | ||||||
|  |     <LinearLayout | ||||||
|  |         android:layout_width="match_parent" | ||||||
|  |         android:layout_height="wrap_content" | ||||||
|  |         android:layout_weight="9" | ||||||
|  |         > | ||||||
|  | 
 | ||||||
|  |         <androidx.recyclerview.widget.RecyclerView | ||||||
|  |             android:id="@+id/recyclerView1" | ||||||
|  |             android:layout_width="match_parent" | ||||||
|  |             android:layout_height="match_parent" | ||||||
|  |             android:scrollbars="vertical"/> | ||||||
|  | 
 | ||||||
|  |     </LinearLayout> | ||||||
|  | 
 | ||||||
|  | </FrameLayout> | ||||||
|  | @ -1,74 +1,24 @@ | ||||||
| <?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||||
| <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" | <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" |  | ||||||
|     xmlns:tools="http://schemas.android.com/tools" |     xmlns:tools="http://schemas.android.com/tools" | ||||||
|     android:layout_width="match_parent" |     android:layout_width="match_parent" | ||||||
|     android:layout_height="match_parent" |     android:layout_height="match_parent" | ||||||
|     android:orientation="vertical" |     android:orientation="vertical" | ||||||
|     android:padding="16dp" |     tools:context=".SettingFragment" | ||||||
|     tools:context=".SettingFragment"> |     android:padding="16dp"> | ||||||
| 
 | 
 | ||||||
| 
 |     <Button | ||||||
|     <LinearLayout |         android:id="@+id/button_print_qr" | ||||||
|         android:id="@+id/linearLayout" |  | ||||||
|         android:layout_width="match_parent" |         android:layout_width="match_parent" | ||||||
|         android:layout_height="wrap_content" |         android:layout_height="wrap_content" | ||||||
|         android:orientation="vertical" |         android:text="QRコード印刷" | ||||||
|         app:layout_constraintBottom_toBottomOf="parent" |         android:layout_marginVertical="8dp"/> | ||||||
|         app:layout_constraintEnd_toEndOf="parent" |  | ||||||
|         app:layout_constraintStart_toStartOf="parent" |  | ||||||
|         app:layout_constraintTop_toTopOf="parent"> |  | ||||||
| 
 | 
 | ||||||
|         <ImageView |     <Button | ||||||
|             android:layout_width="wrap_content" |         android:id="@+id/button_bluetooth_setting" | ||||||
|             android:layout_height="200dp" |  | ||||||
|             android:layout_gravity="center_horizontal" |  | ||||||
|             android:src="@drawable/bluetooth_and_qr2" /> |  | ||||||
| 
 |  | ||||||
|         <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コード印刷" /> |  | ||||||
| 
 |  | ||||||
|     </LinearLayout> |  | ||||||
| 
 |  | ||||||
|     <LinearLayout |  | ||||||
|         android:layout_width="match_parent" |         android:layout_width="match_parent" | ||||||
|         android:layout_height="wrap_content" |         android:layout_height="wrap_content" | ||||||
|         android:gravity="bottom" |         android:text="Bluetooth設定" | ||||||
|         app:layout_constraintBottom_toTopOf="@+id/linearLayout" |         android:layout_marginVertical="8dp"/> | ||||||
|         tools:layout_editor_absoluteX="16dp"> |  | ||||||
| 
 | 
 | ||||||
|     </LinearLayout> | </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> |  | ||||||
|  | @ -4,7 +4,10 @@ | ||||||
|         android:id="@+id/navigation_home" |         android:id="@+id/navigation_home" | ||||||
|         android:icon="@drawable/ic_home_black_24dp" |         android:icon="@drawable/ic_home_black_24dp" | ||||||
|         android:title="home"/> |         android:title="home"/> | ||||||
| 
 |     <item | ||||||
|  |         android:id="@+id/navigation_notification" | ||||||
|  |         android:icon="@drawable/notifications_fill0_wght400_grad0_opsz24" | ||||||
|  |         android:title="notification"/> | ||||||
|     <item |     <item | ||||||
|         android:id="@+id/navigation_settings" |         android:id="@+id/navigation_settings" | ||||||
|         android:icon="@drawable/baseline_app_settings_alt_24" |         android:icon="@drawable/baseline_app_settings_alt_24" | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user