diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 7866781..7859c16 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -12,6 +12,6 @@ - + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index b5b4d93..891d4fc 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,20 +3,23 @@ diff --git a/app/build.gradle b/app/build.gradle index 2570292..6c37ec9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -41,6 +41,7 @@ implementation 'com.google.android.material:material:1.6.1' implementation 'com.google.android.gms:play-services-maps:17.0.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + implementation 'com.google.firebase:firebase-firestore:23.0.2' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' @@ -55,4 +56,7 @@ //google用 implementation 'com.google.maps:google-maps-services:0.2.5' implementation 'org.slf4j:slf4j-nop:1.7.25' + + //RecycleView用 + implementation 'androidx.recyclerview:recyclerview:1.2.1' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8f005ce..bc3d70f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -20,7 +20,11 @@ tools:targetApi="31" android:usesCleartextTraffic="true"> - tools:targetApi="31"> + + - - - - - + + + android:name=".ChangePwActivity" + android:exported="true" - - + + - - + + + android:label="@string/title_activity_post"> + + android:label="@string/title_activity_shop"> + \ No newline at end of file diff --git a/app/src/main/java/com/example/nemophila/ChangePwActivity.java b/app/src/main/java/com/example/nemophila/ChangePwActivity.java new file mode 100644 index 0000000..6dea40f --- /dev/null +++ b/app/src/main/java/com/example/nemophila/ChangePwActivity.java @@ -0,0 +1,75 @@ +package com.example.nemophila; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.EditText; + +import com.example.nemophila.entities.Account; +import com.example.nemophila.resources.AccountsRest; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.converter.jackson.JacksonConverterFactory; + +public class ChangePwActivity extends AppCompatActivity { + + private Retrofit retrofit; + private AccountsRest AccountsRest; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_change_pw); + //通信の初期化 + this.retrofit = new Retrofit.Builder() + .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/nemophila/") + .addConverterFactory(JacksonConverterFactory.create()) + .build(); + this.AccountsRest = retrofit.create(AccountsRest.class); + + + findViewById(R.id.ChangePassword).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + EditText edituid = (EditText) findViewById(R.id.editTextUserid); + String uid = edituid.getText().toString(); + EditText editoldtpw = (EditText) findViewById(R.id.editTextTextOldPassword); + String oldPw = editoldtpw.getText().toString(); + EditText editnewpw = (EditText) findViewById(R.id.editTextTextNewPassword); + String newPw = editnewpw.getText().toString(); + Nemophila nemophila = new Nemophila(); + String token = nemophila.getToken(); + + // 通信 + Call call = AccountsRest.changePw(uid,oldPw,newPw,token); + + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + System.out.println("通信成功:changeBelongsAndMaster"); + Intent intent = new Intent(ChangePwActivity.this, LoginActivity.class); + startActivity(intent); + } else { + System.out.println("通信可能:changeBelongsAndMaster: " + response.code()); +// if (response.code() == 500){ +// ((TextView) findViewById(R.id.textView)).setText("The UserName you gave is already in use."); +// }else if (response.code() == 404){ +// ((TextView) findViewById(R.id.textView)).setText("SignUp failed. Please enter the correct credentials."); +// } + } + } + @Override + public void onFailure(Call call, Throwable t) { + System.out.println("通信失敗:changeBelongsAndMaster"); + } + }); + } + }); + } +} diff --git a/app/src/main/java/com/example/nemophila/LoginActivity.java b/app/src/main/java/com/example/nemophila/LoginActivity.java index bf945c6..f8310d6 100644 --- a/app/src/main/java/com/example/nemophila/LoginActivity.java +++ b/app/src/main/java/com/example/nemophila/LoginActivity.java @@ -6,11 +6,11 @@ import android.os.Bundle; import android.view.View; import android.widget.EditText; +import android.widget.TextView; +import com.example.nemophila.entities.Account; import com.example.nemophila.resources.AccountsRest; -import java.util.HashMap; - import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; @@ -43,22 +43,27 @@ String pw = editpw.getText().toString(); // 通信 - Call call = AccountsRest.getAccounts(); + Call call = AccountsRest.getAccounts(uid,pw); - call.enqueue (new Callback() { + call.enqueue (new Callback() { @Override - public void onResponse(Call call, Response response) { + public void onResponse(Call call, Response response) { if (response.isSuccessful()) { System.out.println("通信成功:changeBelongsAndMaster"); Intent intent = new Intent(LoginActivity.this,MainActivity.class); startActivity(intent); } else { System.out.println("通信可能:changeBelongsAndMaster: " + response.code()); + if (response.code() == 500){ + ((TextView) findViewById(R.id.textView)).setText("Invalid UserID or Password"); + }else if (response.code() == 404){ + ((TextView) findViewById(R.id.textView)).setText("Login failed. Please enter the correct credentials."); + } } } @Override - public void onFailure(Call call, Throwable t) { + public void onFailure(Call call, Throwable t) { System.out.println("通信失敗:changeBelongsAndMaster"); } }); @@ -71,5 +76,12 @@ startActivity(intent); } }); + findViewById(R.id.ForgotPW).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(LoginActivity.this, ChangePwActivity.class); + startActivity(intent); + } + }); } } diff --git a/app/src/main/java/com/example/nemophila/MainActivity.java b/app/src/main/java/com/example/nemophila/MainActivity.java index d287f6a..70765a3 100644 --- a/app/src/main/java/com/example/nemophila/MainActivity.java +++ b/app/src/main/java/com/example/nemophila/MainActivity.java @@ -1,22 +1,21 @@ package com.example.nemophila; -import androidx.annotation.NonNull; import androidx.core.content.res.ResourcesCompat; import androidx.fragment.app.FragmentActivity; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; -import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; -import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Point; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.widget.Toast; import android.annotation.SuppressLint; -import android.net.Uri; -import android.os.Bundle; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationListener; @@ -25,16 +24,16 @@ import android.content.Intent; import android.provider.Settings; import android.util.Log; -import android.widget.Toast; import android.Manifest; -import com.google.android.gms.maps.CameraUpdate; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.MapView; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.SupportMapFragment; import com.google.android.gms.maps.model.BitmapDescriptor; import com.google.android.gms.maps.model.BitmapDescriptorFactory; +import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.GroundOverlay; import com.google.android.gms.maps.model.GroundOverlayOptions; import com.google.android.gms.maps.model.LatLng; @@ -42,8 +41,9 @@ import com.google.android.gms.maps.model.Marker; import com.google.android.gms.maps.model.MarkerOptions; import com.example.nemophila.databinding.ActivityMainBinding; +import com.google.firebase.firestore.GeoPoint; -import java.util.Locale; +import java.util.Map; public class MainActivity extends FragmentActivity implements OnMapReadyCallback,LocationListener { @@ -51,15 +51,15 @@ private ActivityMainBinding binding; private LatLng latlng; private LatLng latlng2; - private LatLng location; - + + private GroundOverlay current_overlay; LocationManager locationManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //現在地アイコンの取得 - Drawable ic_current = ResourcesCompat.getDrawable(getResources(),R.drawable.ic_current_location,null); + //Drawable ic_current = ResourcesCompat.getDrawable(getResources(),R.drawable.ic_current_location,null); binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); @@ -80,28 +80,10 @@ .findFragmentById(R.id.map); assert mapFragment != null; mapFragment.getMapAsync(this); + + } - /* - ここからマップに関する操作 - */ - /* - @Override - public void onMapReady(GoogleMap googleMap) { - mMap = googleMap; - - //マーカー(ピン)の登録・表示方法(例) - LatLng ntlab = new LatLng(34.73, 135.26); - mMap.addMarker(new MarkerOptions().position(ntlab).title("Marker in ntlab")); - mMap.moveCamera(CameraUpdateFactory.newLatLng(ntlab)); - - //カメラの移動処理方法(例) - CameraUpdate cUpdate = CameraUpdateFactory.newLatLngZoom( - new LatLng(34.73, 135.26), 15); - mMap.moveCamera(cUpdate); - } - */ - @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; @@ -110,14 +92,14 @@ double latitude = 34.7308032; double longitude = 135.2630272; - latlng = new LatLng(latitude, longitude); //テスト用 + latlng = new LatLng(latitude, longitude); latlng2 = new LatLng(34.74, 135.26); - // 標準のマーカー + //標準のマーカー(店用のピン) setMarker(latitude, longitude); - // アイコン画像をマーカーに設定 + //アイコン画像をマーカーに設定 //画像関連がわかっていないのでパス //setIcon(latitude, longitude); @@ -148,6 +130,7 @@ //投稿が完了した場合 //ピンをその座標に立て、緯度経度をタイトルに設定 //タイトルはnullにする予定 + //↓返り値でMarkerを返すので、Nemophilaに渡す予定 mMap.addMarker(new MarkerOptions().position(newlocation).title(""+longpushLocation.latitude+" :"+ longpushLocation.longitude)); //ピンを立てた位置にカメラを移動 mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(newlocation, 18)); @@ -168,9 +151,8 @@ } - //ピンの設定 + //ピンの初期設定。完成時不要 private void setMarker(double latitude, double longitude){ - MarkerOptions markerOptions = new MarkerOptions(); MarkerOptions markerOptions2 = new MarkerOptions(); @@ -214,38 +196,42 @@ } private void setIcon(double latitude, double longitude){ - Drawable ic_current = ResourcesCompat.getDrawable(getResources(),R.drawable.icon,null); + //Drawable ic_current = ResourcesCompat.getDrawable(getResources(),R.drawable.icon_current,null); + //更新前の現在地アイコンを消去 + if(current_overlay != null) { + current_overlay.remove(); + } - //LatLng current_location = new LatLng(34.73080,135.2630272); LatLng current_location = new LatLng(latitude,longitude); - //mMap.addMarker(new MarkerOptions().position(current_location).icon(BitmapDescriptorFactory.fromResource(R.drawable.icon))); + // マップに貼り付ける BitmapDescriptor生成 - // 画像は自分で適当に用意します。ここではmipmapから持ってきましたが - BitmapDescriptor descriptor = BitmapDescriptorFactory.fromResource(R.drawable.icon); + BitmapDescriptor descriptor = BitmapDescriptorFactory.fromResource(R.drawable.icon_current); //Drawable ic_current = ResourcesCompat.getDrawable(getResources(),R.drawable.ic_current_location,null); // 貼り付設定 GroundOverlayOptions overlayOptions = new GroundOverlayOptions(); overlayOptions.image(descriptor); - // public GroundOverlayOptions anchor (float u, float v) + //public GroundOverlayOptions anchor (float u, float v) // (0,0):top-left, (0,1):bottom-left, (1,0):top-right, (1,1):bottom-right overlayOptions.anchor(0.5f, 0.5f); // 張り付け画像の大きさ メートル単位 // public GroundOverlayOptions position(LatLng location, float width, float height) - overlayOptions.position(current_location, 300f, 300f); + overlayOptions.position(current_location, 200f, 200f); // マップに貼り付け・アルファを設定 - GroundOverlay overlay = mMap.addGroundOverlay(overlayOptions); - // ズーム + current_overlay = mMap.addGroundOverlay(overlayOptions); + + // カメラを移動 zoomMap(latitude, longitude); // 透明度 - assert overlay != null; - overlay.setTransparency(0.0F); + assert current_overlay != null; + current_overlay.setTransparency(0.8F); } + private final ActivityResultLauncher requestPermissionLauncher = registerForActivityResult( new ActivityResultContracts.RequestPermission(), @@ -260,6 +246,7 @@ } }); + //現在地の取得 @SuppressLint("MissingPermission") private void locationStart(){ Log.d("debug","locationStart()"); @@ -292,6 +279,7 @@ //解決しているはずの問題にエラーが起きています //実行はできます + //勝手に治りました locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 50, this); @@ -300,6 +288,8 @@ @Override public void onLocationChanged(Location location) { //現在地が変更されるたびに現在地アイコンを移動 + //LatLng型で一応受け取っておく + latlng = new LatLng(location.getLatitude(), location.getLongitude()); /* テスト用。現在座標を画面に表示 @@ -314,7 +304,7 @@ String str2 = "Longitude:"+location.getLongitude(); textView2.setText(str2); - //現在地アイコンを表示 + //現在地アイコンを表示.このsetIcon内にzoomMap処理もあるので注意 setIcon(location.getLatitude(),location.getLongitude()); } diff --git a/app/src/main/java/com/example/nemophila/Nemophila.java b/app/src/main/java/com/example/nemophila/Nemophila.java index 70e79e0..1069e4e 100644 --- a/app/src/main/java/com/example/nemophila/Nemophila.java +++ b/app/src/main/java/com/example/nemophila/Nemophila.java @@ -2,9 +2,14 @@ import android.app.Application; +import com.example.nemophila.entities.Shop; + public class Nemophila extends Application { private String uid; private String token; + private Shop currentShop; + private double currentLongitude; + private double currentLatitude; //Getter public String getUid() { @@ -13,6 +18,15 @@ public String getToken() { return token; } + public Shop getCurrentShop() { + return currentShop; + } + public double getCurrentLongitude() { + return currentLongitude; + } + public double getCurrentLatitude() { + return currentLatitude; + } //Setter public void setUid(String uid) { @@ -21,4 +35,13 @@ public void setToken(String token) { this.token = token; } + public void setCurrentShop(Shop currentShop) { + this.currentShop = currentShop; + } + public void setCurrentLongitude(double currentLongitude) { + this.currentLongitude = currentLongitude; + } + public void setCurrentLatitude(double currentLatitude) { + this.currentLatitude = currentLatitude; + } } diff --git a/app/src/main/java/com/example/nemophila/PostDataModel.java b/app/src/main/java/com/example/nemophila/PostDataModel.java new file mode 100644 index 0000000..0d9f577 --- /dev/null +++ b/app/src/main/java/com/example/nemophila/PostDataModel.java @@ -0,0 +1,43 @@ +package com.example.nemophila; + +public class PostDataModel { + private String name; + private String date; + private String rate; + private String genre; + private String comment; + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + public String getDate() { + return date;} + public void setDate(String date) { + this.date = date; + } + + public String getRate() { + return rate; + } + public void setRate(String rate) { + this.rate = rate; + } + + public String getGenre() { + return genre; + } + public void setGenre(String genre) { + this.genre = genre; + } + + public String getComment() { + return comment; + } + public void setComment(String comment) { + this.comment = comment; + } +} diff --git a/app/src/main/java/com/example/nemophila/PostsViewHolder.java b/app/src/main/java/com/example/nemophila/PostsViewHolder.java new file mode 100644 index 0000000..c1d19fd --- /dev/null +++ b/app/src/main/java/com/example/nemophila/PostsViewHolder.java @@ -0,0 +1,24 @@ +package com.example.nemophila; + +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +public class PostsViewHolder extends RecyclerView.ViewHolder { + public TextView nameView; + public TextView dateView; + public TextView rateView; + public TextView genreView; + public TextView commentView; + + public PostsViewHolder(@NonNull View itemView) { + super(itemView); + nameView = (TextView) itemView.findViewById(R.id.userName); + dateView = (TextView) itemView.findViewById(R.id.date); + rateView = (TextView) itemView.findViewById(R.id.rate); + genreView = (TextView) itemView.findViewById(R.id.genre); + commentView = (TextView) itemView.findViewById(R.id.comment); + } +} diff --git a/app/src/main/java/com/example/nemophila/ShopActivity.java b/app/src/main/java/com/example/nemophila/ShopActivity.java index e8fdb1c..b1d0143 100644 --- a/app/src/main/java/com/example/nemophila/ShopActivity.java +++ b/app/src/main/java/com/example/nemophila/ShopActivity.java @@ -1,12 +1,20 @@ package com.example.nemophila; +import static android.app.PendingIntent.getActivity; + import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; +import java.util.ArrayList; +import java.util.List; + public class ShopActivity extends AppCompatActivity { @Override @@ -14,6 +22,7 @@ super.onCreate(savedInstanceState); setContentView(R.layout.activity_shop); + //右上のボタンで投稿画面へ遷移 Button postButton = (Button)findViewById(R.id.postButton); postButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ @@ -21,5 +30,40 @@ startActivity(intent); } }); + + //RecyclerView + RecyclerView rv = (RecyclerView) findViewById(R.id.postsList); + ShopActivityAdapter adapter = new ShopActivityAdapter(this.createDataset()); + + LinearLayoutManager llm = new LinearLayoutManager(this); + + + RecyclerView.ItemDecoration itemDecoration = + new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); + rv.addItemDecoration(itemDecoration); + + rv.setHasFixedSize(true); + rv.setLayoutManager(llm); + rv.setAdapter(adapter); + + + + } + + private List createDataset() { + + //RecyclerViewの中身の仮データ + List dataset = new ArrayList<>(); + for (int i = 0; i < 50; i++) { + PostDataModel data = new PostDataModel(); + data.setName("ネモフィラ 太郎" + i + "号"); + data.setDate("yyyy/mm/dd"); + data.setRate("★★★★★"); + data.setGenre("ラーメン, 中華, おいしい, 安い"); + data.setComment("おいしかった。"); + + dataset.add(data); + } + return dataset; } } \ No newline at end of file diff --git a/app/src/main/java/com/example/nemophila/ShopActivityAdapter.java b/app/src/main/java/com/example/nemophila/ShopActivityAdapter.java new file mode 100644 index 0000000..8c3b5ce --- /dev/null +++ b/app/src/main/java/com/example/nemophila/ShopActivityAdapter.java @@ -0,0 +1,42 @@ +package com.example.nemophila; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.List; + +public class ShopActivityAdapter extends RecyclerView.Adapter { + + public List list; + + public ShopActivityAdapter(List list) { + this.list =list; + } + + @NonNull + @Override + public PostsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + + View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_shop_activity_posts, parent,false); + PostsViewHolder vh = new PostsViewHolder(inflate); + return vh; + } + + @Override + public void onBindViewHolder(@NonNull PostsViewHolder holder, int position) { + holder.nameView.setText(list.get(position).getName()); + holder.dateView.setText(list.get(position).getDate()); + holder.rateView.setText(list.get(position).getRate()); + holder.genreView.setText(list.get(position).getGenre()); + holder.commentView.setText(list.get(position).getComment()); + } + + @Override + public int getItemCount() { + return list.size(); + } +} diff --git a/app/src/main/java/com/example/nemophila/ShopCreateActivity.java b/app/src/main/java/com/example/nemophila/ShopCreateActivity.java new file mode 100644 index 0000000..811ddd9 --- /dev/null +++ b/app/src/main/java/com/example/nemophila/ShopCreateActivity.java @@ -0,0 +1,14 @@ +package com.example.nemophila; + +import androidx.appcompat.app.AppCompatActivity; + +import android.os.Bundle; + +public class ShopCreateActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_shop_create); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/nemophila/SignUpActivity.java b/app/src/main/java/com/example/nemophila/SignUpActivity.java index cc01b38..bccc61a 100644 --- a/app/src/main/java/com/example/nemophila/SignUpActivity.java +++ b/app/src/main/java/com/example/nemophila/SignUpActivity.java @@ -2,15 +2,15 @@ import androidx.appcompat.app.AppCompatActivity; +import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.EditText; +import android.widget.TextView; import com.example.nemophila.entities.Account; import com.example.nemophila.resources.AccountsRest; -import java.util.HashMap; - import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; @@ -50,8 +50,15 @@ public void onResponse(Call call, Response response) { if (response.isSuccessful()) { System.out.println("通信成功:changeBelongsAndMaster"); + Intent intent = new Intent(SignUpActivity.this,MainActivity.class); + startActivity(intent); } else { System.out.println("通信可能:changeBelongsAndMaster: " + response.code()); + if (response.code() == 500){ + ((TextView) findViewById(R.id.textView)).setText("The UserName you gave is already in use."); + }else if (response.code() == 404){ + ((TextView) findViewById(R.id.textView)).setText("SignUp failed. Please enter the correct credentials."); + } } } diff --git a/app/src/main/java/com/example/nemophila/TestActivity.java b/app/src/main/java/com/example/nemophila/TestActivity.java index c2571c8..bd60023 100644 --- a/app/src/main/java/com/example/nemophila/TestActivity.java +++ b/app/src/main/java/com/example/nemophila/TestActivity.java @@ -24,6 +24,8 @@ super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); + Nemophila nemophila = (Nemophila) this.getApplication(); + //テスト用ViewModel(ViewModelが増えた場合はここで準備。spinnerItemに名前も追加すること) //RoomViewModelへのアクセス ShopsViewModel shopsViewModel = new ViewModelProvider(this).get(ShopsViewModel.class); @@ -55,13 +57,14 @@ switch (position){ //ここにテストしたい処理を追加する( 0はShopsViewModel、1はAccountViewModel、2はPostsViewModel) case 0: - shopsViewModel.setViewArea(20.0, 40.0, 10.0, 30.0); + // shopsViewModel.setViewArea(20.0, 40.0, 10.0, 30.0); + shopsViewModel.start(500, nemophila); break; case 1: //accountViewModel.getAccount("1111"); break; case 2: - //postsViewModel.fetchPosts("1"); + postsViewModel.getShopPosts("2637a768-da49-40f9-bd48-a4f3aea64e28"); break; } } diff --git a/app/src/main/java/com/example/nemophila/entities/Account.java b/app/src/main/java/com/example/nemophila/entities/Account.java index 2664fa0..9ebbf12 100644 --- a/app/src/main/java/com/example/nemophila/entities/Account.java +++ b/app/src/main/java/com/example/nemophila/entities/Account.java @@ -1,4 +1,46 @@ package com.example.nemophila.entities; +import java.util.HashMap; + public class Account { + private String name; + private String id; + private String pw; + private String token; + private HashMap posts = new HashMap<>(); + + + //Getter + + public String getName() { + return name; + } + public String getId() { + return id; + } + public String getPw() { + return pw; + } + public String getToken() { + return token; + } + public HashMap getPosts() { + return posts; + } + //Setter + public void setName(String name) { + this.name = name; + } + public void setId(String id) { + this.id = id; + } + public void setPw(String pw) { + this.pw = pw; + } + public void setToken(String token) { + this.token = token; + } + public void setPosts(HashMap posts) { + this.posts = posts; + } } diff --git a/app/src/main/java/com/example/nemophila/entities/AccountJson.java b/app/src/main/java/com/example/nemophila/entities/AccountJson.java new file mode 100644 index 0000000..012ae18 --- /dev/null +++ b/app/src/main/java/com/example/nemophila/entities/AccountJson.java @@ -0,0 +1,25 @@ +package com.example.nemophila.entities; + +public class AccountJson { + private int postsCount; + private String name; + private String id; + private String token; + + //Getter + public int getPostsCount() { + return postsCount; + } + public String getId() {return id;} + public String getName() {return name;} + public String getToken() {return token;} + + //Setter + public void setPostsCount(int postsCount) { + this.postsCount = postsCount; + } + public void setName(String name) {this.name = name;} + public void setId(String id) {this.id = id;} + public void setToken(String token) {this.token = token;} + +} diff --git a/app/src/main/java/com/example/nemophila/entities/Post.java b/app/src/main/java/com/example/nemophila/entities/Post.java index fc17f1d..5c65deb 100644 --- a/app/src/main/java/com/example/nemophila/entities/Post.java +++ b/app/src/main/java/com/example/nemophila/entities/Post.java @@ -1,30 +1,29 @@ package com.example.nemophila.entities; public class Post { - private String id; + private String pid; + private String uid; + private String name; private String genre; - private String image1; - private String image2; - private String image3; + private String date; private int rate; private String comment; - private Account owner; //Getter - public String getId() { - return id; + public String getPid() { + return pid; + } + public String getUid() { + return uid; + } + public String getName() { + return name; } public String getGenre() { return genre; } - public String getImage1() { - return image1; - } - public String getImage2() { - return image2; - } - public String getImage3() { - return image3; + public String getDate() { + return date; } public int getRate() { return rate; @@ -32,25 +31,22 @@ public String getComment() { return comment; } - public Account getOwner() { - return owner; - } //Setter - public void setId(String id) { - this.id = id; + public void setPid(String pid) { + this.pid = pid; + } + public void setUid(String uid) { + this.uid = uid; + } + public void setName(String name) { + this.name = name; } public void setGenre(String genre) { this.genre = genre; } - public void setImage1(String image1) { - this.image1 = image1; - } - public void setImage2(String image2) { - this.image2 = image2; - } - public void setImage3(String image3) { - this.image3 = image3; + public void setDate(String date) { + this.date = date; } public void setRate(int rate) { this.rate = rate; @@ -58,7 +54,15 @@ public void setComment(String comment) { this.comment = comment; } - public void setOwner(Account owner) { - this.owner = owner; + + //コンストラクタ(PostJsonからPostを作成) + public Post(PostJson pj) { + this.pid = pj.getId(); + this.uid = pj.getOwner().getId(); + this.name = pj.getOwner().getName(); + this.genre = this.getGenre(); + this.date = "2001/12/12"; //サンプル + this.rate = pj.getRate(); + this.comment = pj.getComment(); } } diff --git a/app/src/main/java/com/example/nemophila/entities/PostJson.java b/app/src/main/java/com/example/nemophila/entities/PostJson.java index 1a3573b..11fea40 100644 --- a/app/src/main/java/com/example/nemophila/entities/PostJson.java +++ b/app/src/main/java/com/example/nemophila/entities/PostJson.java @@ -1,22 +1,64 @@ package com.example.nemophila.entities; public class PostJson { - private String uid; - private String pid; + private String id; + private String genre; + private String image1; + private String image2; + private String image3; + private int rate; + private String comment; + private AccountJson owner; - //setter - public void setUid(String uid) { - this.uid = uid; + //Getter + public String getId() { + return id; } - public void setPid(String pid) { - this.pid = pid; + public String getGenre() { + return genre; + } + public String getImage1() { + return image1; + } + public String getImage2() { + return image2; + } + public String getImage3() { + return image3; + } + public int getRate() { + return rate; + } + public String getComment() { + return comment; + } + public AccountJson getOwner() { + return owner; } - //getter - public String getUid() { - return uid; + //Setter + public void setId(String id) { + this.id = id; } - public String getPid() { - return pid; + public void setGenre(String genre) { + this.genre = genre; + } + public void setImage1(String image1) { + this.image1 = image1; + } + public void setImage2(String image2) { + this.image2 = image2; + } + public void setImage3(String image3) { + this.image3 = image3; + } + public void setRate(int rate) { + this.rate = rate; + } + public void setComment(String comment) { + this.comment = comment; + } + public void setOwner(AccountJson owner) { + this.owner = owner; } } diff --git a/app/src/main/java/com/example/nemophila/resources/AccountsRest.java b/app/src/main/java/com/example/nemophila/resources/AccountsRest.java index 81e0aa5..3d57bc1 100644 --- a/app/src/main/java/com/example/nemophila/resources/AccountsRest.java +++ b/app/src/main/java/com/example/nemophila/resources/AccountsRest.java @@ -62,5 +62,17 @@ @Field("name") String name, @Field("token") String token ); - + + @GET("accounts/{uid}/posts") + Call> getAccountPosts( + @Path("uid") String uid + ); + + @DELETE("shops/{sid}/posts/{uid}/{pid}") + Call deletePost( + @Path("sid") String sid, + @Path("uid") String uid, + @Path("pid") String pid, + @Field("token") String token + ); } diff --git a/app/src/main/java/com/example/nemophila/resources/PostsRest.java b/app/src/main/java/com/example/nemophila/resources/PostsRest.java index da76051..1791bd4 100644 --- a/app/src/main/java/com/example/nemophila/resources/PostsRest.java +++ b/app/src/main/java/com/example/nemophila/resources/PostsRest.java @@ -34,7 +34,7 @@ ); @GET("shops/{sid}/posts") - Call> getShopPosts( + Call> getShopPosts( @Path("sid") String sid ); } diff --git a/app/src/main/java/com/example/nemophila/viewmodels/AccountViewModel.java b/app/src/main/java/com/example/nemophila/viewmodels/AccountViewModel.java index b8d13de..42479b7 100644 --- a/app/src/main/java/com/example/nemophila/viewmodels/AccountViewModel.java +++ b/app/src/main/java/com/example/nemophila/viewmodels/AccountViewModel.java @@ -1,11 +1,14 @@ package com.example.nemophila.viewmodels; import com.example.nemophila.entities.Account; +import com.example.nemophila.entities.Post; import com.example.nemophila.resources.AccountsRest; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; +import java.util.Collection; + import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; @@ -18,23 +21,26 @@ private final AccountsRest accountsRest; // ライブデータ private final MutableLiveData accountLiveData; + private final MutableLiveData> accountPostsLiveData; // コンストラクタ public AccountViewModel() { - this.accountLiveData = new MutableLiveData<>(); this.retrofit = new Retrofit.Builder() .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/nemophila/") .addConverterFactory(JacksonConverterFactory.create()) .build(); this.accountsRest = retrofit.create(AccountsRest.class); + this.accountLiveData = new MutableLiveData<>(); + this.accountPostsLiveData = new MutableLiveData<>(); } // ライブデータの取得(ゲッター) public MutableLiveData getAccountLiveData() { return accountLiveData; } + public MutableLiveData> getAccountPostsLiveData() { return accountPostsLiveData; } - // アカウント情報の取得 + // 対象のアカウント情報の取得 public void getAccount(String uid) { Call call = accountsRest.getAccount(uid); @@ -54,7 +60,7 @@ }); } - // アカウント情報の削除 + // 対象のアカウント情報の削除 public void deleteAccount(String uid) { Call call = accountsRest.deleteAccount(uid); @@ -74,7 +80,7 @@ }); } - // アカウントパスワードの変更 + // 対象のアカウントパスワードの変更 public void changePw(String uid, String oldPw, String newPw, String token) { Call call = accountsRest.changePw(uid, oldPw, newPw, token); @@ -94,7 +100,7 @@ }); } - // アカウント名の変更 + // 対象のアカウント名の変更 public void changeName(String uid, String name, String token) { Call call = accountsRest.changeName(uid, name, token); @@ -113,4 +119,44 @@ } }); } + + // 対象のアカウントがした投稿の全取得 + public void getAccountPosts(String uid) { + Call> call = accountsRest.getAccountPosts(uid); + + call.enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + if (response.isSuccessful()) { + accountPostsLiveData.setValue(response.body()); + } else { + System.out.println("response error"); + } + } + @Override + public void onFailure(Call> call, Throwable t) { + System.out.println("correspondence error"); + } + }); + } + + // 対象のアカウントがした投稿の削除 + public void deleteAccountPost(String sid, String uid, String pid, String token) { + Call call = accountsRest.deletePost(sid, uid, pid, token); + + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + System.out.println("successful"); + } else { + System.out.println("response error"); + } + } + @Override + public void onFailure(Call call, Throwable t) { + System.out.println("correspondence error"); + } + }); + } } diff --git a/app/src/main/java/com/example/nemophila/viewmodels/PostsViewModel.java b/app/src/main/java/com/example/nemophila/viewmodels/PostsViewModel.java index c783810..30199fe 100644 --- a/app/src/main/java/com/example/nemophila/viewmodels/PostsViewModel.java +++ b/app/src/main/java/com/example/nemophila/viewmodels/PostsViewModel.java @@ -23,23 +23,23 @@ final private Retrofit retrofit; final private PostsRest postsRest; private String pid; -// private ArrayList postJson = new ArrayList<>(); + private ArrayList postJson; //LiveData final private MutableLiveData> accountPostsLiveData; final private MutableLiveData> shopPostsLiveData; - //コンストラクタ public PostsViewModel() { this.accountPostsLiveData = new MutableLiveData<>(); this.shopPostsLiveData = new MutableLiveData<>(); this.retrofit = new Retrofit.Builder() - .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/Nemophila/") + .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/nemophila/") .addConverterFactory(JacksonConverterFactory.create()) .build(); this.postsRest = retrofit.create(PostsRest.class); this.pid = null; + this.postJson = new ArrayList<>(); } //getter @@ -91,20 +91,39 @@ return pid; } - public void getShopPostJson(String sid) { - Call> call = postsRest.getShopPosts(sid); - call.enqueue(new Callback>() { + //PostJsonからPostを作成し,それをLiveDataにセット + public void getShopPosts(String sid) { + System.out.println("通信前" + postJson.get(0)); + ArrayList posts = new ArrayList<>(); + getShopPostJson(sid); + System.out.println("通信after" + postJson); + for(PostJson pj: postJson) { + Post post = new Post(pj); + posts.add(post); + } + shopPostsLiveData.setValue(posts); + System.out.println("完了しました"); + } + + //PostJsonを取得 + private void getShopPostJson(String sid) { + Call> call = postsRest.getShopPosts(sid); + call.enqueue(new Callback>() { @Override - public void onResponse(Call> call, Response> response) { + public void onResponse(Call> call, Response> response) { if (response.isSuccessful()) { - shopPostsLiveData.setValue(response.body()); + System.out.println("responseGood"); + postJson = response.body(); } else { + System.out.println("responseError"); //レスポンスエラー } } @Override - public void onFailure(Call> call, Throwable t) { + public void onFailure(Call> call, Throwable t) { + System.out.println("networkError"); + System.out.println(t); //通信エラー } }); diff --git a/app/src/main/java/com/example/nemophila/viewmodels/ShopsViewModel.java b/app/src/main/java/com/example/nemophila/viewmodels/ShopsViewModel.java index addd584..4f0d8d3 100644 --- a/app/src/main/java/com/example/nemophila/viewmodels/ShopsViewModel.java +++ b/app/src/main/java/com/example/nemophila/viewmodels/ShopsViewModel.java @@ -15,10 +15,14 @@ import retrofit2.Retrofit; import retrofit2.converter.jackson.JacksonConverterFactory; -public class ShopsViewModel extends ViewModel { +public class ShopsViewModel extends TimerViewModel { // フィールド final private ShopsRest shopsRest; final private Retrofit retrofit; + private double ux; + private double uy; + private double lx; + private double ly; // ライブデータ final private MutableLiveData> shopsLiveData; @@ -33,12 +37,27 @@ this.shopsRest = retrofit.create(ShopsRest.class); } - public LiveData> getMembersLiveData() { + public LiveData> getShopsLiveData() { return this.shopsLiveData; } + @Override + public void update() { + updateShops(); + // System.out.println("hogehoge"); + } + // 画面を動かす, 又はGPSが移動する度に呼び出される public void setViewArea(double ux, double uy, double lx, double ly) { + this.ux = ux; + this.uy = uy; + this.lx = lx; + this.ly = ly; + + updateShops(); + } + + public void updateShops() { // 画面内に収まる範囲の店舗を取得する Call> call = shopsRest.getShops(ux, uy, lx, ly); diff --git a/app/src/main/java/com/example/nemophila/viewmodels/TimerViewModel.java b/app/src/main/java/com/example/nemophila/viewmodels/TimerViewModel.java new file mode 100644 index 0000000..3ec5dd4 --- /dev/null +++ b/app/src/main/java/com/example/nemophila/viewmodels/TimerViewModel.java @@ -0,0 +1,38 @@ +package com.example.nemophila.viewmodels; + +import com.example.nemophila.Nemophila; + +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import androidx.lifecycle.ViewModel; + +abstract class TimerViewModel extends ViewModel implements Runnable { + private ScheduledThreadPoolExecutor thread = null; + protected Nemophila nemophila; + + + //----------------------------------------------------------------- + // 一定間隔で呼び出す + @Override + public void run() { + update(); + } + + public abstract void update(); + + //----------------------------------------------------------------- + //何ミリ秒ごとにrun()を実行するかを決める + public void start(int interval, Nemophila nemophila) { + this.nemophila = nemophila; + thread = new ScheduledThreadPoolExecutor(1); + thread.scheduleWithFixedDelay(this, interval, 1000L, TimeUnit.MILLISECONDS); + } + + //----------------------------------------------------------------- + // + public void stop() { + thread.shutdown(); + } + //----------------------------------------------------------------- +} diff --git a/app/src/main/res/drawable/icon.jpg b/app/src/main/res/drawable/icon.jpg deleted file mode 100644 index 6f2e35a..0000000 --- a/app/src/main/res/drawable/icon.jpg +++ /dev/null Binary files differ diff --git a/app/src/main/res/drawable/icon_current.jpg b/app/src/main/res/drawable/icon_current.jpg new file mode 100644 index 0000000..6f2e35a --- /dev/null +++ b/app/src/main/res/drawable/icon_current.jpg Binary files differ diff --git a/app/src/main/res/layout/activity_change_pw.xml b/app/src/main/res/layout/activity_change_pw.xml new file mode 100644 index 0000000..761857f --- /dev/null +++ b/app/src/main/res/layout/activity_change_pw.xml @@ -0,0 +1,58 @@ + + + + + + + + + +