diff --git a/.idea/misc.xml b/.idea/misc.xml index 5bd1665..ea2ccf2 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -13,9 +13,12 @@ + - - + + + + diff --git a/app/build.gradle b/app/build.gradle index 2570292..a9e99ad 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,4 +55,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 24039df..aab75db 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,11 +1,12 @@ + package="com.example.nemophila"> + + tools:targetApi="31" + android:usesCleartextTraffic="true"> + tools:targetApi="31"> + android:label="@string/title_activity_gps"> - - + + - - + + + + android:label="@string/title_activity_sign_up"> - - + + - - + + + + android:label="@string/title_activity_login" > + + @@ -86,35 +94,33 @@ + android:label="@string/title_activity_maps"> + + - - - - - - + + + + android:label="@string/title_activity_test"> + + - - - - - - + + + + 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/MainActivity.java b/app/src/main/java/com/example/nemophila/MainActivity.java index d5c1cff..d287f6a 100644 --- a/app/src/main/java/com/example/nemophila/MainActivity.java +++ b/app/src/main/java/com/example/nemophila/MainActivity.java @@ -301,6 +301,9 @@ public void onLocationChanged(Location location) { //現在地が変更されるたびに現在地アイコンを移動 + /* + テスト用。現在座標を画面に表示 + */ // 緯度の表示 TextView textView1 = findViewById(R.id.text_view1); String str1 = "Latitude:"+location.getLatitude(); @@ -310,10 +313,9 @@ TextView textView2 = findViewById(R.id.text_view2); String str2 = "Longitude:"+location.getLongitude(); textView2.setText(str2); -// -// //GoogleMapに送って表示 -// moveToGMap(location); - setIcon(location.getLatitude(),location.getLongitude()); + + //現在地アイコンを表示 + setIcon(location.getLatitude(),location.getLongitude()); } @Override diff --git a/app/src/main/java/com/example/nemophila/ShopActivity.java b/app/src/main/java/com/example/nemophila/ShopActivity.java index e8fdb1c..fe69e34 100644 --- a/app/src/main/java/com/example/nemophila/ShopActivity.java +++ b/app/src/main/java/com/example/nemophila/ShopActivity.java @@ -14,6 +14,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 +22,9 @@ startActivity(intent); } }); + + ////RecycleView + //super.onCreate(savedInstanceState); + } } \ 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..47b2da1 --- /dev/null +++ b/app/src/main/java/com/example/nemophila/ShopActivityAdapter.java @@ -0,0 +1,26 @@ +package com.example.nemophila; + +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +public class ShopActivityAdapter extends RecyclerView.Adapter { + + + @NonNull + @Override + public ShopActivityViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return null; + } + + @Override + public void onBindViewHolder(@NonNull ShopActivityViewHolder holder, int position) { + + } + + @Override + public int getItemCount() { + return 0; + } +} diff --git a/app/src/main/java/com/example/nemophila/ShopActivityViewHolder.java b/app/src/main/java/com/example/nemophila/ShopActivityViewHolder.java new file mode 100644 index 0000000..5ca11ed --- /dev/null +++ b/app/src/main/java/com/example/nemophila/ShopActivityViewHolder.java @@ -0,0 +1,13 @@ +package com.example.nemophila; + +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +public class ShopActivityViewHolder extends RecyclerView.ViewHolder { + + public ShopActivityViewHolder(@NonNull View itemView) { + super(itemView); + } +} diff --git a/app/src/main/java/com/example/nemophila/TestActivity.java b/app/src/main/java/com/example/nemophila/TestActivity.java index a8ed66a..3b2af0b 100644 --- a/app/src/main/java/com/example/nemophila/TestActivity.java +++ b/app/src/main/java/com/example/nemophila/TestActivity.java @@ -6,30 +6,67 @@ import android.os.Bundle; import android.view.View; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemSelectedListener; +import android.widget.ArrayAdapter; import android.widget.Button; -import android.widget.Toast; +import android.widget.Spinner; -import com.example.nemophila.entities.Shop; +import com.example.nemophila.viewmodels.AccountViewModel; +import com.example.nemophila.viewmodels.PostsViewModel; import com.example.nemophila.viewmodels.ShopsViewModel; -import java.util.Collection; - public class TestActivity extends AppCompatActivity { + int position; //テスト用 + @Override protected void onCreate(Bundle savedInstanceState) { 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); + AccountViewModel accountViewModel = new ViewModelProvider(this).get(AccountViewModel.class); + PostsViewModel postsViewModel = new ViewModelProvider(this).get(PostsViewModel.class); + //テスト用のspinner + Spinner spinner = findViewById(R.id.testspinner); + String[] spinnerItems = {"ShopsViewModel", "AccountViewModel", "PostsViewModel"}; //ここに名前を追加 + ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, spinnerItems); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinner.setAdapter(adapter); + spinner.setOnItemSelectedListener(new OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + position = i; + } + @Override + public void onNothingSelected(AdapterView adapterView) { + + } + }); // setViewModelのテスト用 Button setViewModelButton = (Button)findViewById(R.id.setViewModel); setViewModelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - shopsViewModel.setViewArea(20.0, 40.0, 10.0, 30.0); + switch (position){ + //ここにテストしたい処理を追加する( 0はShopsViewModel、1はAccountViewModel、2はPostsViewModel) + case 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"); + break; + } } }); } 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 8169350..fc17f1d 100644 --- a/app/src/main/java/com/example/nemophila/entities/Post.java +++ b/app/src/main/java/com/example/nemophila/entities/Post.java @@ -1,4 +1,64 @@ package com.example.nemophila.entities; public class Post { + private String id; + private String genre; + private String image1; + private String image2; + private String image3; + private int rate; + private String comment; + private Account owner; + + //Getter + public String getId() { + return id; + } + 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 Account getOwner() { + return owner; + } + + //Setter + public void setId(String id) { + this.id = id; + } + 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(Account 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 5f0f243..81e0aa5 100644 --- a/app/src/main/java/com/example/nemophila/resources/AccountsRest.java +++ b/app/src/main/java/com/example/nemophila/resources/AccountsRest.java @@ -59,7 +59,7 @@ @PUT("accounts/{uid}/name") Call changeName( @Path("uid") String uid, - @Field("name") String oldPw, + @Field("name") String name, @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 1791bd4..da76051 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 fc670fa..b8d13de 100644 --- a/app/src/main/java/com/example/nemophila/viewmodels/AccountViewModel.java +++ b/app/src/main/java/com/example/nemophila/viewmodels/AccountViewModel.java @@ -16,7 +16,6 @@ // フィールド private final Retrofit retrofit; private final AccountsRest accountsRest; - // ライブデータ private final MutableLiveData accountLiveData; @@ -30,7 +29,7 @@ this.accountsRest = retrofit.create(AccountsRest.class); } - // ライブデータの取得 + // ライブデータの取得(ゲッター) public MutableLiveData getAccountLiveData() { return accountLiveData; } @@ -55,6 +54,46 @@ }); } + // アカウント情報の削除 + public void deleteAccount(String uid) { + Call call = accountsRest.deleteAccount(uid); + + 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"); + } + }); + } + + // アカウントパスワードの変更 + public void changePw(String uid, String oldPw, String newPw, String token) { + 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("successful"); + } else { + System.out.println("response error"); + } + } + @Override + public void onFailure(Call call, Throwable t) { + System.out.println("correspondence error"); + } + }); + } + // アカウント名の変更 public void changeName(String uid, String name, String token) { Call call = accountsRest.changeName(uid, name, token); 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 5e32ce2..887769c 100644 --- a/app/src/main/java/com/example/nemophila/viewmodels/PostsViewModel.java +++ b/app/src/main/java/com/example/nemophila/viewmodels/PostsViewModel.java @@ -23,12 +23,24 @@ final private Retrofit retrofit; final private PostsRest postsRest; private String pid; - private ArrayList postJsons = new ArrayList<>(); //LiveData final private MutableLiveData> accountPostsLiveData; final private MutableLiveData> shopPostsLiveData; + //テスト用のリスト + private ArrayList testPostsList; + //テスト用のメソッド + private void createSamplePost() { + Post post1 = new Post(); + Post post2 = new Post(); + + post1.setId("ID1"); + post2.setId("ID2"); + + testPostsList.add(post1); + testPostsList.add(post2); + } //コンストラクタ public PostsViewModel() { @@ -40,6 +52,8 @@ .build(); this.postsRest = retrofit.create(PostsRest.class); this.pid = null; + this.testPostsList = new ArrayList<>(); + createSamplePost(); } //getter @@ -67,6 +81,7 @@ }); } + //投稿作成 public String createPost(String uid, String token, String sid, String rate, String genre, String comment, String image1, String image2, String image3) { @@ -90,29 +105,22 @@ return pid; } - private void getShopPostJsons(String sid) { - Call> call = postsRest.getShopPosts(sid); - call.enqueue(new Callback>() { + public 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()) { - postJsons = response.body(); + shopPostsLiveData.setValue(response.body()); } else { //レスポンスエラー } } @Override - public void onFailure(Call> call, Throwable t) { + public void onFailure(Call> call, Throwable t) { //通信エラー } }); } - - public void getShopPosts(String sid) { - getAccountPosts(sid); - for(PostJson pj: this.postJsons) { - - } - } } 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/layout/activity_shop.xml b/app/src/main/res/layout/activity_shop.xml index 108efca..ae997d6 100644 --- a/app/src/main/res/layout/activity_shop.xml +++ b/app/src/main/res/layout/activity_shop.xml @@ -34,6 +34,7 @@ app:layout_constraintVertical_bias="0.032" /> + +