diff --git a/Classes/JcWallet.cpp b/Classes/JcWallet.cpp index f6bf7f9..771dc53 100644 --- a/Classes/JcWallet.cpp +++ b/Classes/JcWallet.cpp @@ -244,6 +244,10 @@ NS_CC_BEGIN }); return result == 0 ? 1 : 0; } + JNIEXPORT jint JNICALL JNI_JCFW(sha512)(JNIEnv *env, jclass clazz, jstring jcontent) { + std::string content = JniHelper::jstring2string(jcontent); + // TODO: + } #endif } diff --git a/app/src/com/cege/games/release/Constants.java b/app/src/com/cege/games/release/Constants.java index 8d489f7..e6b1322 100644 --- a/app/src/com/cege/games/release/Constants.java +++ b/app/src/com/cege/games/release/Constants.java @@ -9,4 +9,6 @@ public class Constants { public static final String APPLE_AUTH_URL = "https://appleid.apple.com/auth/authorize"; + public static final String API_HOST = "https://wallet.cebggame.com"; + } diff --git a/app/src/com/cege/games/release/MainActivity.java b/app/src/com/cege/games/release/MainActivity.java index beab4d8..19826cd 100644 --- a/app/src/com/cege/games/release/MainActivity.java +++ b/app/src/com/cege/games/release/MainActivity.java @@ -997,4 +997,19 @@ public class MainActivity extends UnityPlayerActivity startActivityForResult(intent, FILE_SELECTOR_CODE); } + public void sendMail() { + Intent i=new Intent(Intent.ACTION_SENDTO); + i.setType("message/rfc822"); + i.setData(Uri.parse("mailto:")); + i.putExtra(Intent.EXTRA_EMAIL , new String[]{"recipient@example.com"}); + i.putExtra(Intent.EXTRA_SUBJECT, "subject of email"); + i.putExtra(Intent.EXTRA_TEXT , "body of email"); + + try { + startActivity(Intent.createChooser(i, "Send mail...")); + } catch (android.content.ActivityNotFoundException ex) { + Toast.makeText(MainActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show(); + } + } + } \ No newline at end of file diff --git a/app/src/com/cege/games/release/dialog/EmailLoginDialog.java b/app/src/com/cege/games/release/dialog/EmailLoginDialog.java new file mode 100644 index 0000000..752beb6 --- /dev/null +++ b/app/src/com/cege/games/release/dialog/EmailLoginDialog.java @@ -0,0 +1,46 @@ +package com.cege.games.release.dialog; + +import android.content.Context; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; + +import com.cege.games.release.R; +import com.cege.games.release.net.RequestData; +import com.google.android.material.textfield.TextInputLayout; + +public class EmailLoginDialog extends BaseDialog { + + private RequestData request; + + public EmailLoginDialog(Context context) { + super(context); + request = new RequestData(context); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.email_regist); + setCancelable(false); + + TextInputLayout emailLayout = findViewById(R.id.emailLayout); + TextInputLayout passLayout = findViewById(R.id.passwordLayout); + TextInputLayout codeLayout = findViewById(R.id.verifyCodeLayout); + passLayout.setVisibility(View.GONE); + codeLayout.setVisibility(View.GONE); + + Button nextButton = findViewById(R.id.next_button); + Button preButton = findViewById(R.id.pre_button); + preButton.setVisibility(View.GONE); + nextButton.setOnClickListener(v -> { +// String email = emailInput.getText().toString(); +// String code = codeInput.getText().toString(); + codeLayout.setVisibility(View.VISIBLE); + preButton.setVisibility(View.VISIBLE); + }); + preButton.setOnClickListener(v -> { + preButton.setVisibility(View.GONE); + }); + } +} diff --git a/app/src/com/cege/games/release/dialog/EmailRegistDialog.java b/app/src/com/cege/games/release/dialog/EmailRegistDialog.java index 0b34196..7694102 100644 --- a/app/src/com/cege/games/release/dialog/EmailRegistDialog.java +++ b/app/src/com/cege/games/release/dialog/EmailRegistDialog.java @@ -1,21 +1,25 @@ package com.cege.games.release.dialog; - import android.content.Context; import android.os.Bundle; -import android.text.InputType; +import android.util.Log; import android.view.View; import android.widget.Button; -import android.widget.EditText; -import android.widget.TextView; import com.cege.games.release.R; +import com.cege.games.release.net.RequestData; +import com.google.android.material.textfield.TextInputEditText; import com.google.android.material.textfield.TextInputLayout; +import java.util.Objects; + public class EmailRegistDialog extends BaseDialog { + private final RequestData request; + private static final String TAG = EmailRegistDialog.class.getSimpleName(); public EmailRegistDialog(Context context) { super(context); + request = new RequestData(context); } @Override @@ -27,6 +31,11 @@ public class EmailRegistDialog extends BaseDialog { TextInputLayout emailLayout = findViewById(R.id.emailLayout); TextInputLayout passLayout = findViewById(R.id.passwordLayout); TextInputLayout codeLayout = findViewById(R.id.verifyCodeLayout); + + TextInputEditText emailInput = findViewById(R.id.email); + TextInputEditText passwordInput = findViewById(R.id.password); + TextInputEditText codeInput = findViewById(R.id.verifyCode); + passLayout.setVisibility(View.GONE); codeLayout.setVisibility(View.GONE); @@ -34,13 +43,33 @@ public class EmailRegistDialog extends BaseDialog { Button preButton = findViewById(R.id.pre_button); preButton.setVisibility(View.GONE); nextButton.setOnClickListener(v -> { -// String email = emailInput.getText().toString(); -// String code = codeInput.getText().toString(); + String email = emailInput.getText().toString(); + if ("".equals(email)) { + showError(emailLayout, "Email can't be null"); + return; + } + + String password = passwordInput.getText().toString(); + String code = codeInput.getText().toString(); codeLayout.setVisibility(View.VISIBLE); preButton.setVisibility(View.VISIBLE); + request.checkMail(email, data -> { + Log.i(TAG, data.toString()); + }); }); preButton.setOnClickListener(v -> { preButton.setVisibility(View.GONE); }); } + + /** + * show error with textInputLayout + * + */ + private void showError(TextInputLayout textInputLayout, String error) { + textInputLayout.setError(error); + Objects.requireNonNull(textInputLayout.getEditText()).setFocusable(true); + textInputLayout.getEditText().setFocusableInTouchMode(true); + textInputLayout.getEditText().requestFocus(); + } } diff --git a/app/src/com/cege/games/release/dialog/PasswordLoginDialog.java b/app/src/com/cege/games/release/dialog/PasswordLoginDialog.java new file mode 100644 index 0000000..2605fab --- /dev/null +++ b/app/src/com/cege/games/release/dialog/PasswordLoginDialog.java @@ -0,0 +1,44 @@ +package com.cege.games.release.dialog; + +import android.content.Context; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; + +import com.cege.games.release.R; +import com.google.android.material.textfield.TextInputLayout; + +/** + * + */ +public class PasswordLoginDialog extends BaseDialog { + + public PasswordLoginDialog(Context context) { + super(context); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.email_regist); + setCancelable(false); + + TextInputLayout passLayout = findViewById(R.id.passwordLayout); + TextInputLayout codeLayout = findViewById(R.id.verifyCodeLayout); + passLayout.setVisibility(View.GONE); + codeLayout.setVisibility(View.GONE); + + Button nextButton = findViewById(R.id.next_button); + Button preButton = findViewById(R.id.pre_button); + preButton.setVisibility(View.GONE); + nextButton.setOnClickListener(v -> { +// String email = emailInput.getText().toString(); +// String code = codeInput.getText().toString(); + codeLayout.setVisibility(View.VISIBLE); + preButton.setVisibility(View.VISIBLE); + }); + preButton.setOnClickListener(v -> { + preButton.setVisibility(View.GONE); + }); + } +} diff --git a/app/src/com/cege/games/release/dialog/PasswordRegistDialog.java b/app/src/com/cege/games/release/dialog/PasswordRegistDialog.java new file mode 100644 index 0000000..0b2451e --- /dev/null +++ b/app/src/com/cege/games/release/dialog/PasswordRegistDialog.java @@ -0,0 +1,43 @@ +package com.cege.games.release.dialog; + +import android.content.Context; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; + +import com.cege.games.release.R; +import com.google.android.material.textfield.TextInputLayout; + + +public class PasswordRegistDialog extends BaseDialog { + + public PasswordRegistDialog(Context context) { + super(context); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.email_regist); + setCancelable(false); + + TextInputLayout emailLayout = findViewById(R.id.emailLayout); + TextInputLayout passLayout = findViewById(R.id.passwordLayout); + TextInputLayout codeLayout = findViewById(R.id.verifyCodeLayout); + passLayout.setVisibility(View.GONE); + codeLayout.setVisibility(View.GONE); + + Button nextButton = findViewById(R.id.next_button); + Button preButton = findViewById(R.id.pre_button); + preButton.setVisibility(View.GONE); + nextButton.setOnClickListener(v -> { +// String email = emailInput.getText().toString(); +// String code = codeInput.getText().toString(); + codeLayout.setVisibility(View.VISIBLE); + preButton.setVisibility(View.VISIBLE); + }); + preButton.setOnClickListener(v -> { + preButton.setVisibility(View.GONE); + }); + } +} diff --git a/app/src/com/cege/games/release/net/AppRequest.java b/app/src/com/cege/games/release/net/AppRequest.java new file mode 100644 index 0000000..cb35cbc --- /dev/null +++ b/app/src/com/cege/games/release/net/AppRequest.java @@ -0,0 +1,78 @@ +package com.cege.games.release.net; + +import com.android.volley.AuthFailureError; +import com.android.volley.NetworkResponse; +import com.android.volley.Request; +import com.android.volley.Response; +import com.android.volley.toolbox.HttpHeaderParser; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +public class AppRequest extends Request { + private final RequestListener requestListener; + private final Map map; + + public AppRequest(int method, String url, Map map, RequestListener requestListener, + Response.ErrorListener listener) { + super(method, url, listener); + this.requestListener = requestListener; + this.map = map; + } + + @Override + public String getBodyContentType() { + return "application/json; charset=utf-8"; + } + + @Override + public Map getHeaders() { + Map head_map = new HashMap<>(); + head_map.put("Content-Type", "application/json"); + return head_map; + } + + @Override + public byte[] getBody() throws AuthFailureError { + try { + JSONObject jsonBody = new JSONObject(); + if (null != map && map.size() > 0) { + for (Map.Entry entry : map.entrySet()) { + jsonBody.put(entry.getKey(), entry.getValue()); + } + } + String mRequestBody = jsonBody.toString(); + return mRequestBody.getBytes(StandardCharsets.UTF_8); + } catch (JSONException e) { + e.printStackTrace(); + return null; + } + } + + protected void deliverResponse(String response) { + try { + JSONObject jo = new JSONObject(response); + if (requestListener != null) + requestListener.response(jo); + } catch (JSONException | NullPointerException e) { + e.printStackTrace(); + } + + } + + @Override + protected Response parseNetworkResponse(NetworkResponse response) { + String parsed; + try { + parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); + } catch (UnsupportedEncodingException var4) { + parsed = new String(response.data); + } + return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response)); + } +} diff --git a/app/src/com/cege/games/release/net/AppRequestUtil.java b/app/src/com/cege/games/release/net/AppRequestUtil.java new file mode 100644 index 0000000..06cf5ef --- /dev/null +++ b/app/src/com/cege/games/release/net/AppRequestUtil.java @@ -0,0 +1,49 @@ +package com.cege.games.release.net; + +import android.content.Context; +import android.util.Log; + +import com.android.volley.DefaultRetryPolicy; +import com.android.volley.Request; +import com.android.volley.Response; + +import org.greenrobot.eventbus.EventBus; + +import java.util.Map; + +public class AppRequestUtil { + private static final AppRequestUtil app_request_util = new AppRequestUtil(); + + private AppRequestUtil() {} + + public static AppRequestUtil getInstance(){ + return app_request_util; + } + + private final Response.ErrorListener errorListener = volleyError -> { + RequestErrorEvent event = new RequestErrorEvent(); + event.setType(1); + event.setErrorMessage(volleyError.getMessage()); + Log.e("AppRequestUtil", volleyError.getMessage()); + EventBus.getDefault().post(event); + }; + + //post请求 + public void postRequest(Context context, String typeUrl, Map map, RequestListener listener){ + AppRequest request = new AppRequest(Request.Method.POST,typeUrl,map,listener, errorListener); + request.setTag(context); + request.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 1, 1.0f)); + request.setShouldCache(true); + VolleyUtil.getQueue(context).add(request); + + } + + //get请求 + public void getRequest(Context context,String typeUrl,RequestListener listener){ + AppRequest request = new AppRequest(Request.Method.GET,typeUrl,null,listener, errorListener); + request.setTag(context); + request.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 1, 1.0f)); + request.setShouldCache(true); + VolleyUtil.getQueue(context).add(request); + } +} diff --git a/app/src/com/cege/games/release/net/RequestData.java b/app/src/com/cege/games/release/net/RequestData.java new file mode 100644 index 0000000..e2c6a96 --- /dev/null +++ b/app/src/com/cege/games/release/net/RequestData.java @@ -0,0 +1,43 @@ +package com.cege.games.release.net; + +import android.content.Context; + +import com.cege.games.release.Constants; +import org.json.JSONObject; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Consumer; + +public class RequestData { + private final Context context; + + private final String DEFAULT_ERROR_MSG = "服务器君开小差了!"; + + public RequestData(Context context) { + this.context = context; + } + + private void httpGet(String url, Consumer func) { + AppRequestUtil.getInstance().getRequest(context, url, func::accept); + } + + private void httpPost(String url, Map map, Consumer func) { + AppRequestUtil.getInstance().postRequest(context, url, map, func::accept); + } + + public void sendCode(String mail, Consumer func) { + String url = Constants.API_HOST + "/email/send_code"; + Map map = new HashMap<>(); + map.put("email", mail); + map.put("type", "1"); + httpPost(url, map, func); + } + + public void checkMail(String mail, Consumer func) { + String url = Constants.API_HOST + "/email/check"; + Map map = new HashMap<>(); + map.put("email", mail); + httpPost(url, map, func); + } +} diff --git a/app/src/com/cege/games/release/net/RequestErrorEvent.java b/app/src/com/cege/games/release/net/RequestErrorEvent.java new file mode 100644 index 0000000..9452fb9 --- /dev/null +++ b/app/src/com/cege/games/release/net/RequestErrorEvent.java @@ -0,0 +1,22 @@ +package com.cege.games.release.net; + +public class RequestErrorEvent { + private int type; + private String errorMessage; + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } +} diff --git a/app/src/com/cege/games/release/net/RequestListener.java b/app/src/com/cege/games/release/net/RequestListener.java new file mode 100644 index 0000000..492ef0a --- /dev/null +++ b/app/src/com/cege/games/release/net/RequestListener.java @@ -0,0 +1,7 @@ +package com.cege.games.release.net; + +import org.json.JSONObject; + +public interface RequestListener { + void response(JSONObject jsonObject); +} diff --git a/app/src/com/cege/games/release/net/VolleyUtil.java b/app/src/com/cege/games/release/net/VolleyUtil.java new file mode 100644 index 0000000..837718c --- /dev/null +++ b/app/src/com/cege/games/release/net/VolleyUtil.java @@ -0,0 +1,21 @@ +package com.cege.games.release.net; + +import android.content.Context; + +import com.android.volley.RequestQueue; +import com.android.volley.toolbox.Volley; + +public class VolleyUtil { + private volatile static RequestQueue requestQueue; + + public static RequestQueue getQueue(Context ctx){ + if(requestQueue == null){ + synchronized (VolleyUtil.class){ + if(requestQueue == null){ + requestQueue = Volley.newRequestQueue(ctx.getApplicationContext()); + } + } + } + return requestQueue; + } +} diff --git a/app/src/com/cege/games/release/net/models/BaseMode.java b/app/src/com/cege/games/release/net/models/BaseMode.java new file mode 100644 index 0000000..226d182 --- /dev/null +++ b/app/src/com/cege/games/release/net/models/BaseMode.java @@ -0,0 +1,33 @@ +package com.cege.games.release.net.models; + +import org.json.JSONObject; + +public class BaseMode { + private int errcode; + private String errmsg; + private JSONObject data; + + public int getErrcode() { + return errcode; + } + + public void setErrcode(int errcode) { + this.errcode = errcode; + } + + public String getErrmsg() { + return errmsg; + } + + public void setErrmsg(String errmsg) { + this.errmsg = errmsg; + } + + public JSONObject getData() { + return data; + } + + public void setData(JSONObject data) { + this.data = data; + } +} diff --git a/app/src/com/jc/jcfw/JcSDK.java b/app/src/com/jc/jcfw/JcSDK.java index be5f595..84a2be1 100644 --- a/app/src/com/jc/jcfw/JcSDK.java +++ b/app/src/com/jc/jcfw/JcSDK.java @@ -15,6 +15,7 @@ public class JcSDK { private static final String TAG = JcSDK.class.getSimpleName(); private static UnityCallback commonCB; private static native int runJS(final String funId, final String methodName, final String params); + private static native int sha512(final String content); public static void initCommonCB(UnityCallback callBack) { Log.i(TAG, "call init common callback from unity"); @@ -129,4 +130,8 @@ public class JcSDK { JcSDK.runJS(funId, "jniCallback", result.toString()); } + + public static void hashPass(String pass) { + JcSDK.sha512(pass); + } } diff --git a/app/src/main/res/layout/email_login.xml b/app/src/main/res/layout/email_login.xml index e81c40c..2d374d8 100644 --- a/app/src/main/res/layout/email_login.xml +++ b/app/src/main/res/layout/email_login.xml @@ -1,8 +1,110 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/email_regist.xml b/app/src/main/res/layout/email_regist.xml index 0d0da33..a1dc27f 100644 --- a/app/src/main/res/layout/email_regist.xml +++ b/app/src/main/res/layout/email_regist.xml @@ -9,12 +9,12 @@ android:layout_width="276dp" android:layout_height="wrap_content" android:layout_marginTop="20dp" - android:autoSizeTextType="uniform" - android:autoSizeMinTextSize="12sp" android:autoSizeMaxTextSize="30sp" + android:autoSizeMinTextSize="12sp" android:autoSizeStepGranularity="2sp" + android:autoSizeTextType="uniform" + android:text="@string/email_register_title" android:textColor="@color/colorPrimary" - android:text="What's your email?" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -26,10 +26,11 @@ android:layout_marginStart="10dp" android:layout_marginTop="20dp" android:layout_marginEnd="10dp" - android:text="Enter the email where you can be contacted." + android:text="@string/email_register_sub_title" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/title_label" /> + + app:layout_constraintTop_toBottomOf="@+id/desc_label"> + android:hint="@string/email_register_email_input" + android:inputType="textEmailAddress" /> + + app:layout_constraintTop_toBottomOf="@+id/emailLayout"> + + + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/verifyCodeLayout"> + @@ -97,7 +99,7 @@ android:layout_marginTop="20dp" android:layout_marginEnd="10dp" android:layout_marginBottom="10dp" - android:text="Next" + android:text="@string/email_register_btn_next" android:textColor="@android:color/white" app:backgroundTint="@color/buttonBlue" app:hintAnimationEnabled="false" @@ -105,7 +107,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/passwordLayout" - app:theme="@style/Theme.MaterialComponents" /> + android:theme="@style/Theme.MaterialComponents" /> + android:theme="@style/Theme.MaterialComponents" /> diff --git a/app/src/main/res/layout/password_input.xml b/app/src/main/res/layout/password_input.xml new file mode 100644 index 0000000..51a5df0 --- /dev/null +++ b/app/src/main/res/layout/password_input.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..b149e95 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,13 @@ + + + What\'s your email? + Biometric login for Wallet + Login using your biometric credential + Confirm biometric to continue + Enter the email where you can be contacted. + Email + Confirmation Code + Password + Next + Previous + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index d569bc9..26a1dc6 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -9,7 +9,4 @@ 1204701000119770 fb1204701000119770 3e29f2606ae15a99bb3824d2ef1a9d0b - Biometric login for Wallet - Login using your biometric credential - Confirm biometric to continue \ No newline at end of file