diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 300967e..679b1a3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,44 +1,65 @@ + + + + - + + + + + + - - - - - - - + + + - - - - - + android:theme="@style/AppTheme.NoActionBar" /> + + - - - + android:theme="@style/AppTheme.NoActionBar" /> \ No newline at end of file diff --git a/app/src/main/java/com/example/cosmosclient/views/ForgotPasswordActivity.java b/app/src/main/java/com/example/cosmosclient/views/ForgotPasswordActivity.java new file mode 100644 index 0000000..651439d --- /dev/null +++ b/app/src/main/java/com/example/cosmosclient/views/ForgotPasswordActivity.java @@ -0,0 +1,57 @@ +package com.example.cosmosclient.views; + +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; + +import com.example.cosmosclient.R; + +public class ForgotPasswordActivity extends AppCompatActivity { + //public class ForgotPasswordActivity extends AppCompatActivity implements TextWatcher{ + String EMailPattern = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$"; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_forgot_password); + + //idの取得 + final EditText EmailAddressText = findViewById(R.id.NameText); + Button SendButton = findViewById(R.id.SendButton); + + //EmailAddressText.addTextChangedListener(this); + + //送信ボタン処理 + SendButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String MailAddress = EmailAddressText.getText().toString(); + + //メールアドレスをサーバに送信する処理の予定 + Toast.makeText(ForgotPasswordActivity.this, + "入力されたアドレスにメールを送信しました", Toast.LENGTH_SHORT).show(); + finish(); + } + }); + } //@Override +// public void beforeTextChanged(CharSequence s, int start, int count,int after) { +// //ignore +// } +// +// @Override +// public void onTextChanged(CharSequence s, int start, int before, int count) { +// //ignore +// } +// +// @Override +// public void afterTextChanged(Editable s) { +//    //操作後のEtidTextの状態を取得する +// String inputStr = s.toString(); +// +// } + +} diff --git a/app/src/main/java/com/example/cosmosclient/views/GroupList.java b/app/src/main/java/com/example/cosmosclient/views/GroupList.java index b512f02..a905987 100644 --- a/app/src/main/java/com/example/cosmosclient/views/GroupList.java +++ b/app/src/main/java/com/example/cosmosclient/views/GroupList.java @@ -28,7 +28,7 @@ Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - /*とりあえずの画面遷移なので変更するかも*/ + /* とりあえずの画面遷移なので変更するかも */ TextView group1 = findViewById(R.id.group1); group1.setOnClickListener(new View.OnClickListener() { @Override @@ -38,6 +38,7 @@ } }); + DrawerLayout drawer = findViewById(R.id.drawer_layout); NavigationView navigationView = findViewById(R.id.nav_view); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( @@ -82,10 +83,18 @@ @SuppressWarnings("StatementWithEmptyBody") @Override public boolean onNavigationItemSelected(MenuItem item) { + + // Handle navigation view item clicks here. int id = item.getItemId(); if ( id == R.id.createNewGroupButton){ + } else if (id == R.id.joinGroupButton){ + Intent intent=new Intent(GroupList.this, com.example.cosmosclient.views.JoinGroupActionsActivity.class); + startActivity(intent); + } else if (id == R.id.signOutButton){ + Intent intent=new Intent(GroupList.this, com.example.cosmosclient.views.SigninActivity.class); + startActivity(intent); } /* if (id == R.id.nav_home) { diff --git a/app/src/main/java/com/example/cosmosclient/views/JoinGroupActionsActivity.java b/app/src/main/java/com/example/cosmosclient/views/JoinGroupActionsActivity.java new file mode 100644 index 0000000..321bf48 --- /dev/null +++ b/app/src/main/java/com/example/cosmosclient/views/JoinGroupActionsActivity.java @@ -0,0 +1,68 @@ +package com.example.cosmosclient.views; + +import android.content.Intent; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.view.View; +import android.widget.AdapterView; +import android.widget.BaseAdapter; +import android.widget.ListView; + +import com.example.cosmosclient.R; + +public class JoinGroupActionsActivity extends AppCompatActivity implements AdapterView.OnItemClickListener{ + + private static final String[] scenes = { + "QRコードでグループに入る", + "IDでグループに入る", + "メールでグループに入る" + }; + + // ちょっと冗長的ですが分かり易くするために + private static final int[] photos = { + R.drawable.camera_image, + R.drawable.search_image, + R.drawable.mail_image, + + }; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_join_group_actions); + + // ListViewのインスタンスを生成 + ListView listView = findViewById(R.id.list_view_join); + + // BaseAdapter を継承したadapterのインスタンスを生成 + // レイアウトファイル list.xml を activity_main.xml に + // inflate するためにadapterに引数として渡す + BaseAdapter adapter = new ListViewAdapter(this.getApplicationContext(), + R.layout.list, scenes, photos); + + // ListViewにadapterをセット + listView.setAdapter(adapter); + + // クリックリスナーをセット + listView.setOnItemClickListener(this); + } + @Override + public void onItemClick(AdapterView parent, View v, + int position, long id) { + + + Intent intent = null; + // clickされたpositionのtextとphotoのID + String selectedText = scenes[position]; + if(selectedText.contains("QR")==true){ + intent = new Intent(this.getApplicationContext(), QRcodeReadingActivity.class); + }else if(selectedText.contains("ID")==true){ + intent = new Intent(this.getApplicationContext(), JoinGroupByIDActivity.class); + }else{ + intent = new Intent(this.getApplicationContext(), QRcodeReadingActivity.class); + } + +// Intent intent = new Intent(this.getApplicationContext(), DisplayQRActivity.class); + // SubActivityへ遷移 + startActivity(intent); + } +} diff --git a/app/src/main/java/com/example/cosmosclient/views/JoinGroupByIDActivity.java b/app/src/main/java/com/example/cosmosclient/views/JoinGroupByIDActivity.java new file mode 100644 index 0000000..b861a8e --- /dev/null +++ b/app/src/main/java/com/example/cosmosclient/views/JoinGroupByIDActivity.java @@ -0,0 +1,32 @@ +package com.example.cosmosclient.views; + +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; + +import com.example.cosmosclient.R; + +public class JoinGroupByIDActivity extends AppCompatActivity { + private String GroupID=null; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_join_group_by_id); + //テストでグループIDを出力 + final TextView result = (TextView)findViewById(R.id.IDresult); + //buttonを取得 + Button btn = (Button)findViewById(R.id.button); + btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + //ボタンを押されると入力されたグループIDを取得 + EditText inputGroupID = (EditText)findViewById(R.id.inputGroupID); + GroupID = inputGroupID.getText().toString(); + result.setText(GroupID); + } + }); + } +} diff --git a/app/src/main/java/com/example/cosmosclient/views/QRcodeReadingActivity.java b/app/src/main/java/com/example/cosmosclient/views/QRcodeReadingActivity.java new file mode 100644 index 0000000..af17d80 --- /dev/null +++ b/app/src/main/java/com/example/cosmosclient/views/QRcodeReadingActivity.java @@ -0,0 +1,45 @@ +package com.example.cosmosclient.views; + +import android.content.Intent; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.TextView; + +import com.example.cosmosclient.R; +import com.google.zxing.integration.android.IntentIntegrator; +import com.google.zxing.integration.android.IntentResult; +import com.journeyapps.barcodescanner.CaptureActivity; + +public class QRcodeReadingActivity extends CaptureActivity { + public String QRcodeData = null; + TextView QRcodeResult; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_qrcode_reading); + QRcodeResult = findViewById(R.id.QRcodeResult); + + //ここでQRコードリーダーオブジェクト生成 + IntentIntegrator integrator = new IntentIntegrator(this); +// new IntentIntegrator(QRcodeReadingActivity.this).initiateScan(); + // スキャン画面の回転の制御 + integrator.setOrientationLocked(false); + //バーコードリーダーの起動 + integrator.initiateScan(); + + } + + //QRコードから読み取った結果の取得 + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); + if(result != null) { + QRcodeData = (String)result.getContents(); + QRcodeResult.setText(QRcodeData); + } else { + super.onActivityResult(requestCode, resultCode, data); + } + } +} diff --git a/app/src/main/java/com/example/cosmosclient/views/SigninActivity.java b/app/src/main/java/com/example/cosmosclient/views/SigninActivity.java index 2fed0e0..d95f002 100644 --- a/app/src/main/java/com/example/cosmosclient/views/SigninActivity.java +++ b/app/src/main/java/com/example/cosmosclient/views/SigninActivity.java @@ -3,13 +3,25 @@ import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; import android.view.View; import android.widget.Button; import android.widget.EditText; +import android.widget.Toast; import com.example.cosmosclient.R; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.converter.jackson.JacksonConverterFactory; + public class SigninActivity extends AppCompatActivity { + private boolean uIdEnable; + private boolean pwEnable; + Button SigninButton; @Override protected void onCreate(Bundle savedInstanceState) { @@ -17,19 +29,65 @@ setContentView(R.layout.activity_signin); //各種IDを取得 - Button SigninButton = findViewById(R.id.SigninButton); + SigninButton = findViewById(R.id.SigninButton); Button SignupButton = findViewById(R.id.SignupButton); - EditText EmailAddressText = findViewById(R.id.EMailAddressText); - EditText PasswordText = findViewById(R.id.PasswordText); + final EditText NameText = findViewById(R.id.NameText); + final EditText PasswordText = findViewById(R.id.PasswordText); Button ForgotPasswordButton = findViewById(R.id.ForgotPasswordButton); + //ボタン無効化 + SigninButton.setEnabled(false); + + //TextWatcherで入力監視 + NameText.addTextChangedListener(new SigninActivity.GenericTextWatcher(NameText)); + PasswordText.addTextChangedListener(new SigninActivity.GenericTextWatcher(PasswordText)); + + //retrofitの処理 + final Retrofit retrofit = new Retrofit.Builder() + .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/cosmos/") + .addConverterFactory(JacksonConverterFactory.create()) + .build(); + //interfaceから実装を取得 + final SigninService signinService = retrofit.create(SigninService.class); + //Sign inボタンの処理 SigninButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - Intent intent = new Intent(getApplication(), GroupList.class); - startActivity(intent); - finish(); + //APIに値を送信 + Call call = signinService.loginList(NameText.getText().toString(), PasswordText.getText().toString()); + + //サーバからのレスポンス + call.enqueue(new Callback() { + //成功時 + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + SigninResponse result = response.body(); + Intent intent = new Intent(getApplication(), GroupList.class); + //intent.putExtra("UserInfomation",result); + Toast.makeText(SigninActivity.this, + "ログインしました", Toast.LENGTH_SHORT).show(); + + startActivity(intent); + finish(); + + }else{ + //onFailureでキャッチできないエラーの処理 + Toast.makeText(SigninActivity.this, + "通信エラー",Toast.LENGTH_SHORT).show(); + } + } + + //失敗時 + @Override + public void onFailure(Call call, Throwable t) { + //t.printStackTrace(); + Toast.makeText(SigninActivity.this, + "ユーザIDもしくはパスワードが間違っています",Toast.LENGTH_SHORT).show(); + } + + }); } }); @@ -42,5 +100,53 @@ finish(); } }); + + //パスワード再登録画面への遷移処理 + ForgotPasswordButton.setOnClickListener(new View.OnClickListener(){ + @Override + public void onClick(View v){ + Intent intent = new Intent(getApplication(), ForgotPasswordActivity.class); + startActivity(intent); + //finish(); + } + }); + } + private class GenericTextWatcher implements TextWatcher{ + private View view; + + private GenericTextWatcher(View view){ + this.view = view; + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count,int after){/*記述不要*/}; + @Override + public void onTextChanged(CharSequence s, int start, int before, int count){/*記述不要*/}; + + @Override + public void afterTextChanged(Editable s){ + switch(view.getId()) { + case R.id.NameText: + if (s.length() > 0) { + uIdEnable = true; + } else { + uIdEnable = false; + } + break; + case R.id.PasswordText: + if(s.length()>0){ + pwEnable=true; + }else{ + pwEnable=false; + } + break; + } + //ボタン有効&無効 + if(uIdEnable && pwEnable ){ + SigninButton.setEnabled(true); + }else{ + SigninButton.setEnabled(false); + } + } } } diff --git a/app/src/main/java/com/example/cosmosclient/views/SigninResponse.java b/app/src/main/java/com/example/cosmosclient/views/SigninResponse.java new file mode 100644 index 0000000..c47556d --- /dev/null +++ b/app/src/main/java/com/example/cosmosclient/views/SigninResponse.java @@ -0,0 +1,5 @@ +package com.example.cosmosclient.views; + +public class SigninResponse { + public String token; +} diff --git a/app/src/main/java/com/example/cosmosclient/views/SigninService.java b/app/src/main/java/com/example/cosmosclient/views/SigninService.java new file mode 100644 index 0000000..84dcb18 --- /dev/null +++ b/app/src/main/java/com/example/cosmosclient/views/SigninService.java @@ -0,0 +1,11 @@ +package com.example.cosmosclient.views; + +import retrofit2.Call; +import retrofit2.http.POST; +import retrofit2.http.Path; +import retrofit2.http.Query; + +public interface SigninService { + @POST("users/{uId}/login") + Call loginList(@Path("uId") String uId, @Query("pw") String pw); +} diff --git a/app/src/main/java/com/example/cosmosclient/views/SignupActivity.java b/app/src/main/java/com/example/cosmosclient/views/SignupActivity.java index c738fa8..b3cffe2 100644 --- a/app/src/main/java/com/example/cosmosclient/views/SignupActivity.java +++ b/app/src/main/java/com/example/cosmosclient/views/SignupActivity.java @@ -3,33 +3,111 @@ import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; import android.view.View; import android.widget.Button; import android.widget.EditText; +import android.widget.Toast; import com.example.cosmosclient.R; -public class SignupActivity extends AppCompatActivity { + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.converter.jackson.JacksonConverterFactory; + +public class SignupActivity extends AppCompatActivity{ +// public static final String UserInfomation="com.example.cosmosclient.views"; + private boolean nameEnable; + private boolean pwEnable; + private boolean cpwEnable; + private Button MakeAccountButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_signup); + //retrofitの処理 + final Retrofit retrofit = new Retrofit.Builder() + .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/cosmos/") + .addConverterFactory(JacksonConverterFactory.create()) + .build(); + //interfaceから実装を取得 + final SignupService signupService = retrofit.create(SignupService.class); + //各種idを取得 Button LoginButton = findViewById(R.id.LoginButton); - Button MakeAccountButton = findViewById(R.id.MakeAccountButton); - EditText EmailAddressText = findViewById(R.id.EMailAddressText); - EditText PasswordText = findViewById(R.id.PasswordText); - EditText ConfirmPasswordText = findViewById(R.id.ConfirmPasswordText); + MakeAccountButton = findViewById(R.id.MakeAccountButton); + final EditText NameText = findViewById(R.id.NameText); + final EditText PasswordText = findViewById(R.id.PasswordText); + final EditText ConfirmPasswordText = findViewById(R.id.ConfirmPasswordText); + + //入力欄監視 + NameText.addTextChangedListener(new GenericTextWatcher(NameText)); + PasswordText.addTextChangedListener(new GenericTextWatcher(PasswordText)); + ConfirmPasswordText.addTextChangedListener(new GenericTextWatcher(ConfirmPasswordText)); + + //アカウント登録ボタン無効化 + MakeAccountButton.setEnabled(false); //Make Accountボタンの処理 MakeAccountButton.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ - Intent intent = new Intent(getApplication(), GroupList.class); - startActivity(intent); - finish(); + String pw = PasswordText.getText().toString(); + String confirmPw = ConfirmPasswordText.getText().toString(); + + //パスワードと確認パスワードが一致していない際の処理 + if(!pw.equals(confirmPw)){ + PasswordText.setError("入力されたパスワードが一致しません"); + ConfirmPasswordText.setError("入力されたパスワードが一致しません"); + return; + } + + //API呼び出しのための値入力 + Call call = signupService.createUser(NameText.getText().toString(), + PasswordText.getText().toString(),"https://yumenavi.info/live/2018/photo/k/s015980019.jpg"); + + //サーバからデータ受け取り + call.enqueue(new Callback() { + //成功時 + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + SignupResponse result = response.body(); + Intent intent = new Intent(getApplication(), GroupList.class); + //intent.putExtra("UserInfomation",result); + + //test + System.out.println(result.uId); + System.out.println(result.name); + System.out.println(result.uri); + System.out.println(result.token); + System.out.println(result.iconUri); + System.out.println(result.pw); + + startActivity(intent); + finish(); + + }else{ + //onFailureでキャッチできないエラー用 + Toast.makeText(SignupActivity.this, + "アカウント作成失敗",Toast.LENGTH_SHORT); + } + } + + //失敗時 + @Override + public void onFailure(Call call, Throwable t) { + t.printStackTrace(); + Toast.makeText(SignupActivity.this, + "アカウント作成失敗",Toast.LENGTH_SHORT); + } + }); } }); @@ -42,6 +120,53 @@ finish(); } }); - } + + //入力欄監視処理内容 + private class GenericTextWatcher implements TextWatcher{ + private View view; + + private GenericTextWatcher(View view){ + this.view = view; + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count,int after){/*記述不要*/}; + @Override + public void onTextChanged(CharSequence s, int start, int before, int count){/*記述不要*/}; + + @Override + public void afterTextChanged(Editable s){ + switch(view.getId()) { + case R.id.NameText: + if (s.length() > 0) { + nameEnable = true; + } else { + nameEnable = false; + } + break; + case R.id.PasswordText: + if(s.length()>0){ + pwEnable=true; + }else{ + pwEnable=false; + } + break; + case R.id.ConfirmPasswordText: + if(s.length()>0){ + cpwEnable=true; + }else{ + cpwEnable=false; + } + break; + } + //ボタン有効&無効 + if(nameEnable && pwEnable && cpwEnable){ + MakeAccountButton.setEnabled(true); + }else{ + MakeAccountButton.setEnabled(false); + } + } + } + } diff --git a/app/src/main/java/com/example/cosmosclient/views/SignupResponse.java b/app/src/main/java/com/example/cosmosclient/views/SignupResponse.java new file mode 100644 index 0000000..963dfce --- /dev/null +++ b/app/src/main/java/com/example/cosmosclient/views/SignupResponse.java @@ -0,0 +1,15 @@ +package com.example.cosmosclient.views; + +import java.util.List; + +public class SignupResponse { + public String uId; + public String name; + public String pw; + public String uri; + public List token; + public String iconUri; + public boolean login; + + +} diff --git a/app/src/main/java/com/example/cosmosclient/views/SignupService.java b/app/src/main/java/com/example/cosmosclient/views/SignupService.java new file mode 100644 index 0000000..2ac3075 --- /dev/null +++ b/app/src/main/java/com/example/cosmosclient/views/SignupService.java @@ -0,0 +1,12 @@ +package com.example.cosmosclient.views; + +import retrofit2.Call; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; + +public interface SignupService { + @POST("users") + @FormUrlEncoded + Call createUser(@Field("name") String name, @Field("pw") String pw, @Field("icon-image") String icon_image); +} diff --git a/app/src/main/res/drawable/ic_arrow_back_black_24dp.xml b/app/src/main/res/drawable/ic_arrow_back_black_24dp.xml new file mode 100644 index 0000000..beafea3 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_back_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_group_add_black_24dp.xml b/app/src/main/res/drawable/ic_group_add_black_24dp.xml new file mode 100644 index 0000000..b3a2fb3 --- /dev/null +++ b/app/src/main/res/drawable/ic_group_add_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_group_black_24dp.xml b/app/src/main/res/drawable/ic_group_black_24dp.xml new file mode 100644 index 0000000..4cfd869 --- /dev/null +++ b/app/src/main/res/drawable/ic_group_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/white.png b/app/src/main/res/drawable/white.png deleted file mode 100644 index 15f8d06..0000000 --- a/app/src/main/res/drawable/white.png +++ /dev/null Binary files differ diff --git a/app/src/main/res/layout/activity_add_member.xml b/app/src/main/res/layout/activity_add_member.xml index 44839a0..7274a61 100644 --- a/app/src/main/res/layout/activity_add_member.xml +++ b/app/src/main/res/layout/activity_add_member.xml @@ -7,17 +7,6 @@ tools:context=".views.AddMemberActivity"> - - - - + app:layout_constraintVertical_bias="0.405" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_forgot_password.xml b/app/src/main/res/layout/activity_forgot_password.xml new file mode 100644 index 0000000..e5b5ac9 --- /dev/null +++ b/app/src/main/res/layout/activity_forgot_password.xml @@ -0,0 +1,53 @@ + + + + + + + + + +