diff --git a/app/build.gradle b/app/build.gradle index 6150f78..0e3b833 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,7 @@ plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' + id 'com.google.gms.google-services' } android { @@ -58,7 +59,14 @@ dependencies { implementation 'androidx.compose.ui:ui-graphics' implementation 'androidx.compose.ui:ui-tooling-preview' implementation 'androidx.compose.material3:material3' + implementation 'com.google.firebase:firebase-firestore:24.4.1' + // Import the BoM for the Firebase platform + implementation(platform("com.google.firebase:firebase-bom:32.7.0")) + + // Declare the dependency for the Cloud Firestore library + // When using the BoM, you don't specify versions in Firebase library dependencies + implementation("com.google.firebase:firebase-firestore") testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..d3d7537 --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,67 @@ +{ + "project_info": { + "project_number": "814788024795", + "project_id": "practicefirestore1-8808c", + "storage_bucket": "practicefirestore1-8808c.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:814788024795:android:79602ef613cc9860c76ffe", + "android_client_info": { + "package_name": "com.example.childguard" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAVpoftIYGZwiPRpuI56hoV8ifA2rbZGb4" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:814788024795:android:7c572a838331bba1c76ffe", + "android_client_info": { + "package_name": "com.example.connecttointernet" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAVpoftIYGZwiPRpuI56hoV8ifA2rbZGb4" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:814788024795:android:67c86939b6350f02c76ffe", + "android_client_info": { + "package_name": "com.example.practicefirestore1" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAVpoftIYGZwiPRpuI56hoV8ifA2rbZGb4" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/main/java/com/example/childguard/HomeFragment.java b/app/src/main/java/com/example/childguard/HomeFragment.java index bb753c3..5b0e050 100644 --- a/app/src/main/java/com/example/childguard/HomeFragment.java +++ b/app/src/main/java/com/example/childguard/HomeFragment.java @@ -1,15 +1,10 @@ package com.example.childguard; +import static android.content.ContentValues.TAG; + import android.content.SharedPreferences; import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; import android.os.Bundle; - import androidx.core.content.res.ResourcesCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; @@ -29,9 +24,19 @@ import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; -import com.google.zxing.BarcodeFormat; -import com.google.zxing.WriterException; -import com.journeyapps.barcodescanner.BarcodeEncoder; +import androidx.annotation.NonNull; +import androidx.core.content.res.ResourcesCompat; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; + +import com.google.android.gms.tasks.OnFailureListener; +import com.google.android.gms.tasks.OnSuccessListener; +import com.google.firebase.firestore.DocumentReference; +import com.google.firebase.firestore.FirebaseFirestore; + +import java.util.HashMap; +import java.util.Map; /** * A simple {@link Fragment} subclass. @@ -39,6 +44,7 @@ import com.journeyapps.barcodescanner.BarcodeEncoder; * create an instance of this fragment. */ public class HomeFragment extends Fragment { + FirebaseFirestore db = FirebaseFirestore.getInstance();//Firebaseとの紐づけ // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER @@ -46,7 +52,7 @@ public class HomeFragment extends Fragment { private static final String ARG_PARAM2 = "param2"; // TODO: Rename and change types of parameters - private String mParam1; + private String str_key; private String mParam2; public HomeFragment() { @@ -75,7 +81,7 @@ public class HomeFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { - mParam1 = getArguments().getString(ARG_PARAM1); + // mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2); } } @@ -83,20 +89,80 @@ public class HomeFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + // Log.d("HomeFlagment_cnt", "aaaaa"); // Inflate the layout for this fragment - View view=inflater.inflate(R.layout.fragment_home,container,false); + View view = inflater.inflate(R.layout.fragment_home, container, false); MainActivity activity = (MainActivity) getActivity(); + //共有プリファレンス 全体の準備 + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); //QRコード印刷の処理 - Button bt1=view.findViewById(R.id.QRprinting); + Button bt1 = view.findViewById(R.id.QRprinting); bt1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - replaceFragment(new QrPrintFragment()); + //初回起動かを保存する変数 + boolean alreadySaved = preferences.getBoolean("alreadySaved", false); + //ボタン変数の宣言 + Button parent = view.findViewById(R.id.QRprinting); + Button born = view.findViewById(R.id.QRprinting); + //falseのときにFirebaseへの登録 + if (alreadySaved) { + Log.d("HomeFragment", "already printed"); + //画面遷移&ID受け渡し + Toast.makeText(getActivity(),"再印刷",Toast.LENGTH_SHORT).show(); + QrPrintFragment qrPrintFragment = new QrPrintFragment(); + replaceFragment(qrPrintFragment); + return; + } else Log.d("HomeFragment", "not printed yet"); // debug - } + String valueParent = parent.getText().toString();//変数に文字列を代入 + String valueBorn = born.getText().toString();//変数に文字列を代入 + Map user = new HashMap<>();//mapの宣言 + + Log.d("HomeFragment", "onClick is called"); + + //mapに入れる + user.put("parent", valueParent); + user.put("born", valueBorn); + //新しいドキュメントにIDを作って追加 + db.collection("users") + .add(user) + .addOnSuccessListener(new OnSuccessListener() { + @Override + public void onSuccess(DocumentReference documentReference) { + //成功したら + //documentReference.getId()でID取得 + Log.d(TAG, "DocumentSnapshot added with ID: " + documentReference.getId()); + SharedPreferences.Editor e = preferences.edit(); + // キー"alreadySaved"の値をtrueにする + e.putBoolean("alreadySaved", true); + //確定処理 + e.apply(); + //画面遷移&ID受け渡し + str_key = "" + documentReference.getId(); + Toast.makeText(getActivity(),"初回登録",Toast.LENGTH_SHORT).show(); + QrPrintFragment qrPrintFragment = new QrPrintFragment(); + Bundle bundle = new Bundle(); + bundle.putString("STR_KEY",str_key); + //値を書き込む + qrPrintFragment.setArguments(bundle); + replaceFragment(qrPrintFragment); + + } + }) + .addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(@NonNull Exception e) { + //失敗したら + Log.w(TAG, "Error adding document", e); + } + }); + + + } }); //bluetooth設定ボタンの処理 - Button bt2=view.findViewById(R.id.Bluetooth_setup); + Button bt2 = view.findViewById(R.id.Bluetooth_setup); bt2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -116,11 +182,10 @@ public class HomeFragment extends Fragment { super.onResume(); Log.d("HomeFragment", "onResume: called"); TextView situationTextView = getView().findViewById(R.id.situation); - FrameLayout situation_bg=getView().findViewById(R.id.situation_bg); - updateInCarStatus(situationTextView,situation_bg); + FrameLayout situation_bg = getView().findViewById(R.id.situation_bg); + updateInCarStatus(situationTextView, situation_bg); } - - public void updateInCarStatus(TextView situationTextView,FrameLayout situation_bg) { + public void updateInCarStatus(TextView situationTextView, FrameLayout situation_bg) { SharedPreferences sharedPreferences = getActivity().getSharedPreferences("default", 0); Log.d("HomeFragment", "updateInCarStatus: " + sharedPreferences.getBoolean("inCar", false)); @@ -133,8 +198,9 @@ public class HomeFragment extends Fragment { } } + //画面遷移メソッド - private void replaceFragment(Fragment fragment){ + private void replaceFragment(Fragment fragment) { // フラグメントマネージャーの取得 FragmentManager manager = getParentFragmentManager(); // アクティビティではgetSupportFragmentManager()? // フラグメントトランザクションの開始 diff --git a/app/src/main/java/com/example/childguard/MainActivity.java b/app/src/main/java/com/example/childguard/MainActivity.java index e6a222c..9d01fb7 100644 --- a/app/src/main/java/com/example/childguard/MainActivity.java +++ b/app/src/main/java/com/example/childguard/MainActivity.java @@ -6,6 +6,7 @@ import androidx.core.app.ActivityCompat; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; +import android.annotation.SuppressLint; import android.app.NotificationChannel; import android.app.NotificationManager; import android.bluetooth.BluetoothAdapter; @@ -17,35 +18,49 @@ 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.util.Log; +import android.widget.Toast; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import com.google.firebase.firestore.DocumentReference; +import com.google.firebase.firestore.DocumentSnapshot; +import com.google.firebase.firestore.EventListener; +import com.google.firebase.firestore.FirebaseFirestore; +import com.google.firebase.firestore.FirebaseFirestoreException; + public class MainActivity extends AppCompatActivity { BluetoothManager bluetoothManager; BluetoothAdapter bluetoothAdapter; + public static final String TAG = "InspirationQuote"; + private DocumentReference mDocRef = FirebaseFirestore.getInstance().document("users/q6t702C8nsXyehckByrr");//現在の位置を取得 + 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); + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - - - //通知のやつ↓ - int importance = NotificationManager.IMPORTANCE_DEFAULT; - - NotificationChannel channel = new NotificationChannel("CHANNEL_ID", "通報通知", importance); - //説明・説明 ここに通知の説明を書くことができる↓ - channel.setDescription("第3者からの通報を検知しました"); - - NotificationManager notificationManager = getSystemService(NotificationManager.class); - notificationManager.createNotificationChannel(channel); - //通知のやつ↑ - + super.onStart(); BottomNavigationView bottomNavigationView = findViewById(R.id.nav_view); - bottomNavigationView.setOnNavigationItemSelectedListener(v -> { + bottomNavigationView.setOnNavigationItemSelectedListener(v -> + + { if (v.getItemId() == findViewById(R.id.navigation_home).getId()) { getSupportFragmentManager().beginTransaction() .replace(findViewById(R.id.fragmentContainerView).getId(), HomeFragment.newInstance("test", "tset")) @@ -62,12 +77,47 @@ public class MainActivity extends AppCompatActivity { return true; + + }); + mDocRef.addSnapshotListener(this, new EventListener() { + @Override + public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) { + Log.d("nt","イベント開始"); + if (flg && documentSnapshot != null && documentSnapshot.exists()) { + + String parent = documentSnapshot.getString("parent"); + Log.d("nt","レスポンスを検知しました1"); + if (parent.equals("s")) { + + //通知のやつ↓ + int importance = NotificationManager.IMPORTANCE_DEFAULT; + + NotificationChannel channel = new NotificationChannel("CHANNEL_ID", "通報通知", importance); + //説明・説明 ここに通知の説明を書くことができる↓ + channel.setDescription("第3者からの通報を検知しました"); + + NotificationManager notificationManager = getSystemService(NotificationManager.class); + notificationManager.createNotificationChannel(channel); + //通知のやつ↑ + Log.d("nt","レスポンスを検知しました2"); + + + notifyMain(); + } else if (e != null) { + Log.w(TAG, "Got an exceptiion!", e); + } + + } + flg = true; + } }); } //↓通知のやつ public void notifyMain() { + //↓通知をする際に起動するバイブレーション ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).vibrate(1000); + //↓通知の詳細設定的な奴 NotificationCompat.Builder builder = new NotificationCompat .Builder(this, "CHANNEL_ID") .setSmallIcon(android.R.drawable.ic_menu_info_details) @@ -97,4 +147,4 @@ public class MainActivity extends AppCompatActivity { ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayHomeAsUpEnabled(enableBackButton); } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/example/childguard/QR.java b/app/src/main/java/com/example/childguard/QR.java index ebdf156..1d4e862 100644 --- a/app/src/main/java/com/example/childguard/QR.java +++ b/app/src/main/java/com/example/childguard/QR.java @@ -15,19 +15,19 @@ public class QR extends AppCompatActivity { 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")); - } - } - ); + //多分いらないコード +// findViewById(R.id.camera).setOnClickListener( +// v -> { +// if(get_on.equals(tv.getText().toString())){ +// tv.setText(get_off); +// findViewById(R.id.situation_bg).setBackgroundColor(Color.parseColor("#dcdcdc")); +// } +// else { +// tv.setText(get_on); +// findViewById(R.id.situation_bg).setBackgroundColor(Color.parseColor("#ff4500")); +// } +// } +// ); } } diff --git a/app/src/main/java/com/example/childguard/QRFragment.java b/app/src/main/java/com/example/childguard/QRFragment.java index 5eda4a8..0d694ae 100644 --- a/app/src/main/java/com/example/childguard/QRFragment.java +++ b/app/src/main/java/com/example/childguard/QRFragment.java @@ -9,6 +9,8 @@ import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.browser.customtabs.CustomTabsIntent; import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; import android.util.Log; import android.view.LayoutInflater; @@ -98,15 +100,26 @@ public class QRFragment extends Fragment { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_qr, container, false); - Button cameraButton = view.findViewById(R.id.camera); - cameraButton.setOnClickListener(v -> { Log.d("QRFragment", "onClick: called"); //QRリーダ起動 fragmentLauncher.launch(new ScanOptions()); - }); - + 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(); + } } diff --git a/app/src/main/java/com/example/childguard/QrPrintFragment.java b/app/src/main/java/com/example/childguard/QrPrintFragment.java index d31ac6e..fb8e755 100644 --- a/app/src/main/java/com/example/childguard/QrPrintFragment.java +++ b/app/src/main/java/com/example/childguard/QrPrintFragment.java @@ -1,5 +1,6 @@ package com.example.childguard; +import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; @@ -8,8 +9,11 @@ import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; import androidx.print.PrintHelper; +import android.preference.PreferenceManager; import android.util.AndroidRuntimeException; import android.view.LayoutInflater; import android.view.View; @@ -59,7 +63,7 @@ public class QrPrintFragment extends Fragment { } @Override - public void onCreate(Bundle savedInstanceState) { + public void onCreate (Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mParam1 = getArguments().getString(ARG_PARAM1); @@ -68,18 +72,34 @@ public class QrPrintFragment extends Fragment { } } - @Override + // @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + //共有プリファレンス 全体の準備 + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); + //User毎のドメインを保存する + String IdPref=preferences.getString("ID",null); // Inflate the layout for this fragment - View view=inflater.inflate(R.layout.fragment_qr_print, container, false); - + View view=inflater.inflate(R.layout.fragment_qr_print, container, false);; //固定のドメイン String KoteiURL = "https://practicefirestore1-8808c.web.app/?id="; - //User毎のドメイン - String userURL="YKjFsZgJBlZmcyvdZ3Ap"; - //二つのドメインを合成する - String AllURL=KoteiURL+userURL; + //すべてのドメイン + String AllURL; + //IdPrefにの値が初期値の場合 + if(IdPref==null) { + //User毎のドメイン + String userURL = getArguments().getString("STR_KEY"); + //キー"ID"の値をuserURLの値にする + SharedPreferences.Editor e = preferences.edit(); + e.putString("ID", userURL); + //確定処理 + e.apply(); + //二つのドメインを合成する + AllURL=KoteiURL+userURL; + }else{ + //二つのドメインを合成する + AllURL=KoteiURL+IdPref; + } int size = 2500; ImageView imageViewQrCode; @@ -96,6 +116,7 @@ public class QrPrintFragment extends Fragment { throw new AndroidRuntimeException("Barcode Error.", e); } // 画像合成の準備 + // ここのエラーは直すと何故か動かなくなる。このままで動くので放置 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a_group_qr_sos); Bitmap bitmap1 = ((BitmapDrawable) imageViewQrCode.getDrawable()).getBitmap(); int width = bitmap.getWidth(); // 元ファイルの幅取得 @@ -113,7 +134,21 @@ public class QrPrintFragment extends Fragment { printHelper.setColorMode(PrintHelper.COLOR_MODE_COLOR); printHelper.setScaleMode(PrintHelper.SCALE_MODE_FIT); printHelper.printBitmap("job_name", QRGazou); - + HomeFragment homeFragment=new HomeFragment(); + replaceFragment(homeFragment); return view; } + //画面遷移メソッド + private void replaceFragment(Fragment fragment) { + // フラグメントマネージャーの取得 + FragmentManager manager = getParentFragmentManager(); // アクティビティではgetSupportFragmentManager()? + // フラグメントトランザクションの開始 + FragmentTransaction transaction = manager.beginTransaction(); + // レイアウトをfragmentに置き換え(追加) + transaction.replace(R.id.fragmentContainerView, fragment); + // 置き換えのトランザクションをバックスタックに保存する + transaction.addToBackStack(null); + // フラグメントトランザクションをコミット + transaction.commit(); + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/childguard/UrlPageActivity.java b/app/src/main/java/com/example/childguard/UrlPageActivity.java deleted file mode 100644 index 45b59c0..0000000 --- a/app/src/main/java/com/example/childguard/UrlPageActivity.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.example.childguard; - -import androidx.appcompat.app.AppCompatActivity; - -import android.content.SharedPreferences; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.webkit.WebView; - -public class UrlPageActivity extends AppCompatActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_url_page); - } -} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_url_page.xml b/app/src/main/res/layout/activity_url_page.xml deleted file mode 100644 index 61bc31b..0000000 --- a/app/src/main/res/layout/activity_url_page.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_qr.xml b/app/src/main/res/layout/fragment_qr.xml index b66b029..1509787 100644 --- a/app/src/main/res/layout/fragment_qr.xml +++ b/app/src/main/res/layout/fragment_qr.xml @@ -5,13 +5,6 @@ android:layout_height="match_parent" tools:context=".QRFragment"> - -