From 1186fd7757643b07f193bc5d586c2db9335aab57 Mon Sep 17 00:00:00 2001 From: Asura146 Date: Thu, 11 Jan 2024 14:27:35 +0900 Subject: [PATCH 1/5] WIP --- .idea/kotlinc.xml | 6 + .idea/misc.xml | 2 +- app/build.gradle | 29 ++++ app/src/main/AndroidManifest.xml | 11 ++ .../com/example/childguard/First_Start.java | 14 ++ .../com/example/childguard/HomeFragment.java | 30 +++- .../com/example/childguard/MainActivity.java | 14 ++ .../example/childguard/RecyclerAdapter.java | 88 +++++++++++ .../childguard/bluetooth_setupFragment.java | 147 ++++++++++++++++++ app/src/main/res/layout/activity_main.xml | 1 + app/src/main/res/layout/first_start.xml | 17 ++ .../res/layout/fragment_bluetooth_setup.xml | 26 ++++ app/src/main/res/layout/fragment_home.xml | 81 ++++++---- app/src/main/res/layout/fragment_qr.xml | 1 + app/src/main/res/layout/recycler_row.xml | 11 ++ app/src/main/res/values/strings.xml | 1 + build.gradle | 1 + 17 files changed, 449 insertions(+), 31 deletions(-) create mode 100644 .idea/kotlinc.xml create mode 100644 app/src/main/java/com/example/childguard/First_Start.java create mode 100644 app/src/main/java/com/example/childguard/RecyclerAdapter.java create mode 100644 app/src/main/java/com/example/childguard/bluetooth_setupFragment.java create mode 100644 app/src/main/res/layout/first_start.xml create mode 100644 app/src/main/res/layout/fragment_bluetooth_setup.xml create mode 100644 app/src/main/res/layout/recycler_row.xml diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..e1eea1d --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 8978d23..773fe0f 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 8332260..25058ad 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,5 +1,6 @@ plugins { id 'com.android.application' + id 'org.jetbrains.kotlin.android' } android { @@ -14,6 +15,9 @@ android { versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables { + useSupportLibrary true + } } buildTypes { @@ -26,6 +30,20 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = '1.8' + } + buildFeatures { + compose true + } + composeOptions { + kotlinCompilerExtensionVersion '1.3.2' + } + packagingOptions { + resources { + excludes += '/META-INF/{AL2.0,LGPL2.1}' + } + } } dependencies { @@ -33,9 +51,20 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.5.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1' + implementation 'androidx.activity:activity-compose:1.5.1' + implementation platform('androidx.compose:compose-bom:2022.10.00') + implementation 'androidx.compose.ui:ui' + implementation 'androidx.compose.ui:ui-graphics' + implementation 'androidx.compose.ui:ui-tooling-preview' + implementation 'androidx.compose.material3:material3' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + androidTestImplementation platform('androidx.compose:compose-bom:2022.10.00') + androidTestImplementation 'androidx.compose.ui:ui-test-junit4' + debugImplementation 'androidx.compose.ui:ui-tooling' + debugImplementation 'androidx.compose.ui:ui-test-manifest' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 300cbda..cbdd641 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,12 @@ + + + + + + + diff --git a/app/src/main/java/com/example/childguard/First_Start.java b/app/src/main/java/com/example/childguard/First_Start.java new file mode 100644 index 0000000..77e6104 --- /dev/null +++ b/app/src/main/java/com/example/childguard/First_Start.java @@ -0,0 +1,14 @@ +package com.example.childguard; + +import android.os.Bundle; + +import androidx.appcompat.app.AppCompatActivity; + +public class First_Start extends AppCompatActivity { + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.first_start); + + } + +} diff --git a/app/src/main/java/com/example/childguard/HomeFragment.java b/app/src/main/java/com/example/childguard/HomeFragment.java index 09f6885..82a8f9c 100644 --- a/app/src/main/java/com/example/childguard/HomeFragment.java +++ b/app/src/main/java/com/example/childguard/HomeFragment.java @@ -7,11 +7,14 @@ import android.os.Bundle; import androidx.core.content.res.ResourcesCompat; 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.FrameLayout; import android.widget.TextView; @@ -66,7 +69,18 @@ public class HomeFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_home, container, false); + //bluetooth設定ボタンの処理 + View view=inflater.inflate(R.layout.fragment_home,container,false); + MainActivity activity = (MainActivity) getActivity(); + + Button bt1=view.findViewById(R.id.Bluetooth_setup); + bt1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + replaceFragment(new bluetooth_setupFragment()); + } + }); + return view; } @Override @@ -89,5 +103,19 @@ public class HomeFragment extends Fragment { situationTextView.setText("\n乗車状態"); situation_bg.setBackground(ResourcesCompat.getDrawable(getResources(), R.drawable.frame_style_orange, null)); } + + } + //画面遷移メソッド + 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/MainActivity.java b/app/src/main/java/com/example/childguard/MainActivity.java index 0d0697f..9c79486 100644 --- a/app/src/main/java/com/example/childguard/MainActivity.java +++ b/app/src/main/java/com/example/childguard/MainActivity.java @@ -1,5 +1,6 @@ package com.example.childguard; +import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.app.NotificationCompat; @@ -7,6 +8,8 @@ import androidx.core.app.NotificationManagerCompat; import android.app.NotificationChannel; import android.app.NotificationManager; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothManager; import android.content.Context; import android.content.pm.PackageManager; import android.os.Bundle; @@ -15,6 +18,10 @@ import android.os.Vibrator; import com.google.android.material.bottomnavigation.BottomNavigationView; public class MainActivity extends AppCompatActivity { + + BluetoothManager bluetoothManager; + BluetoothAdapter bluetoothAdapter; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -76,5 +83,12 @@ public class MainActivity extends AppCompatActivity { return; } notificationManager.notify(R.string.app_name, builder.build()); + + + } + //Bluetooth_setupの戻るボタン + public void setupBackButton(boolean enableBackButton){ + ActionBar actionBar = getSupportActionBar(); + actionBar.setDisplayHomeAsUpEnabled(enableBackButton); } } \ No newline at end of file diff --git a/app/src/main/java/com/example/childguard/RecyclerAdapter.java b/app/src/main/java/com/example/childguard/RecyclerAdapter.java new file mode 100644 index 0000000..2e3b719 --- /dev/null +++ b/app/src/main/java/com/example/childguard/RecyclerAdapter.java @@ -0,0 +1,88 @@ +package com.example.childguard; + +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.ArrayList; + +public class RecyclerAdapter extends RecyclerView.Adapter { + + ArrayList arrayListDN=new ArrayList<>(); + ArrayList arrayListDA=new ArrayList<>(); + //RecyclerAdapterのコンストラクタ + public RecyclerAdapter(ArrayList arrayList) { + for (String[] deviceInfo:arrayList) { + this.arrayListDN.add(deviceInfo[0]); + Log.d("c",deviceInfo[0]); + } + for (String[] deviceInfo:arrayList) { + this.arrayListDA.add(deviceInfo[1]); + Log.d("c",deviceInfo[1]); + } + } + + //新しいViewHolderを生成すると呼び出される + @NonNull + @Override + public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + + + + //recycler_row.xmlをactivity_main.xmlの部品にする + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.recycler_row, parent, false); + + //新しいViewHolderを作成 + //ItemViewHolderクラスを呼び出す + ItemViewHolder holder = new ItemViewHolder(view); + + //クリックイベントを登録 + holder.itemView.setOnClickListener(v -> { + + int position = holder.getAdapterPosition(); + Toast.makeText(v.getContext(),arrayListDA.get(position),Toast.LENGTH_SHORT).show(); + + + }); + + //生成したViewHolderを戻す + return holder; + } + + //1行分のレイアウトの詳細設定 + @Override + public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { + //指定された位置の値を取得 + holder.getTextView().setText(arrayListDN.get(position)); + } + + //ArrayListのデータ件数を取得 + @Override + public int getItemCount() { + return arrayListDN.size(); + } +} + +//RecyclerView.ViewHolderクラスを継承 +class ItemViewHolder extends RecyclerView.ViewHolder { + private final TextView textView; + + //ItemViewHolderのコンストラクタ + public ItemViewHolder(View view) { + super(view); + //ViewHolderのビューにテキストを定義する + textView = view.findViewById(R.id.textView1); + } + + //テキストの値を取得 + public TextView getTextView() { + return textView; + } +} diff --git a/app/src/main/java/com/example/childguard/bluetooth_setupFragment.java b/app/src/main/java/com/example/childguard/bluetooth_setupFragment.java new file mode 100644 index 0000000..e6459d8 --- /dev/null +++ b/app/src/main/java/com/example/childguard/bluetooth_setupFragment.java @@ -0,0 +1,147 @@ +package com.example.childguard; + +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothManager; +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.Bundle; + +import androidx.core.app.ActivityCompat; +import androidx.core.app.NotificationCompat; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import java.util.ArrayList; +import java.util.Objects; +import java.util.Set; + +/** + * A simple {@link Fragment} subclass. + * Use the {@link bluetooth_setupFragment#newInstance} factory method to + * create an instance of this fragment. + */ +public class bluetooth_setupFragment 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 bluetooth_setupFragment() { + // 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 bluetooth_setupFragment. + */ + // TODO: Rename and change types and number of parameters + public static bluetooth_setupFragment newInstance(String param1, String param2) { + bluetooth_setupFragment fragment = new bluetooth_setupFragment(); + 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) { + View view = inflater.inflate(R.layout.fragment_bluetooth_setup, container, false); + + // init + BluetoothManager bluetoothManager = requireActivity().getSystemService(BluetoothManager.class); + BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter(); + + if (bluetoothAdapter == null) { + // Device doesn't support Bluetooth + } + + + if (ActivityCompat.checkSelfPermission(requireActivity().getApplicationContext(), android.Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { + // TODO: Consider calling + // ActivityCompat#requestPermissions + // here to request the missing permissions, and then overriding + // public void onRequestPermissionsResult(int requestCode, String[] permissions, + // int[] grantResults) + // to handle the case where the user grants the permission. See the documentation + // for ActivityCompat#requestPermissions for more details. + return view; + } + Set pairedDevices = bluetoothAdapter.getBondedDevices(); + + RecyclerView recyclerView = view.findViewById(R.id.recyclerView1); + //RecyclerViewのサイズを固定 + recyclerView.setHasFixedSize(true); + + //RecyclerViewに区切り線を入れる +// RecyclerView.ItemDecoration itemDecoration = +// new DividerItemDecoration(getContext() ,DividerItemDecoration.VERTICAL); +// recyclerView.addItemDecoration(itemDecoration); + + //レイアウトマネージャを設 + RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext()); + recyclerView.setLayoutManager(layoutManager); + + //①リスト構造(String型の可変長の配列)を宣言 + ArrayList arrayList = new ArrayList<>(); + + if (pairedDevices.size() > 0) { + + // There are paired devices. Get the name and address of each paired device. + for (BluetoothDevice device : pairedDevices) { + + + + String[] deviceInfo = new String[2]; + deviceInfo[0] = device.getName(); + deviceInfo[1] = device.getAddress(); // MAC address + + Log.d("a", deviceInfo[0]); + arrayList.add(deviceInfo); + } + for (String[] s : arrayList) { + Log.d("b", s[0]); + } + Log.d(" ", String.valueOf(arrayList.size())z); + RecyclerAdapter adapter = new RecyclerAdapter(arrayList); + + //④RecyclerViewとAdapterの結び付け + recyclerView.setAdapter(adapter); + } + + return view; + + } + +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 3151f24..f7e6c7d 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -3,6 +3,7 @@ + + + + diff --git a/app/src/main/res/layout/fragment_bluetooth_setup.xml b/app/src/main/res/layout/fragment_bluetooth_setup.xml new file mode 100644 index 0000000..84e47b3 --- /dev/null +++ b/app/src/main/res/layout/fragment_bluetooth_setup.xml @@ -0,0 +1,26 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 21d6c78..338a0d3 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -7,90 +7,113 @@ android:layout_height="match_parent" android:orientation="vertical" tools:context=".HomeFragment"> + + android:background="@drawable/frame_style"> + android:textSize="25dp" /> + + android:textColor="@color/black" + android:textSize="55dp" /> + + android:background="@drawable/frame_style"> + android:textSize="30dp" /> + + android:textAlignment="center" /> + + android:textAlignment="center" /> + + + +