/*
* Copyright 2016 Hippo Seven
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.hippo.ehviewer.ui.scene;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.TextInputLayout;
import android.support.v7.app.AlertDialog;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
import com.hippo.ehviewer.EhApplication;
import com.hippo.ehviewer.R;
import com.hippo.ehviewer.client.EhCookieStore;
import com.hippo.ehviewer.client.EhUrl;
import com.hippo.ehviewer.client.EhUtils;
import com.hippo.yorozuya.ViewUtils;
import junit.framework.Assert;
import okhttp3.Cookie;
public class CookieSignInScene extends SolidScene implements EditText.OnEditorActionListener,
View.OnClickListener {
/*---------------
View life cycle
---------------*/
@Nullable
private TextInputLayout mIpbMemberIdLayout;
@Nullable
private TextInputLayout mIpbPassHashLayout;
@Nullable
private EditText mIpbMemberId;
@Nullable
private EditText mIpbPassHash;
@Nullable
private View mOk;
@Override
public boolean needShowLeftDrawer() {
return false;
}
@Nullable
@Override
public View onCreateView2(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.scene_cookie_sign_in, container, false);
mIpbMemberIdLayout = (TextInputLayout) ViewUtils.$$(view, R.id.ipb_member_id_layout);
mIpbMemberId = mIpbMemberIdLayout.getEditText();
Assert.assertNotNull(mIpbMemberId);
mIpbPassHashLayout = (TextInputLayout) ViewUtils.$$(view, R.id.ipb_pass_hash_layout);
mIpbPassHash = mIpbPassHashLayout.getEditText();
Assert.assertNotNull(mIpbPassHash);
mOk = ViewUtils.$$(view, R.id.ok);
mIpbPassHash.setOnEditorActionListener(this);
mOk.setOnClickListener(this);
// Try to get old version cookie info
Context context = getContext2();
Assert.assertNotNull(context);
SharedPreferences sharedPreferences = context.getSharedPreferences("eh_info", 0);
String ipbMemberId = sharedPreferences.getString("ipb_member_id", null);
String ipbPassHash = sharedPreferences.getString("ipb_pass_hash", null);
boolean getIt = false;
if (!TextUtils.isEmpty(ipbMemberId)) {
mIpbMemberId.setText(ipbMemberId);
getIt = true;
}
if (!TextUtils.isEmpty(ipbPassHash)) {
mIpbPassHash.setText(ipbPassHash);
getIt = true;
}
if (getIt) {
showTip(R.string.found_cookies, LENGTH_SHORT);
}
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
showSoftInput(mIpbMemberId);
}
@Override
public void onDestroyView() {
super.onDestroyView();
mIpbMemberIdLayout = null;
mIpbPassHashLayout = null;
mIpbMemberId = null;
mIpbPassHash = null;
}
@Override
public void onClick(View v) {
if (mOk == v) {
enter();
}
}
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (mIpbPassHash == v) {
enter();
}
return true;
}
// false for error
private static boolean checkIpbMemberId(String id) {
for (int i = 0, n = id.length(); i < n; i++) {
char ch = id.charAt(i);
if (!(ch >= '0' && ch <= '9')) {
return false;
}
}
return true;
}
private static boolean checkIpbPassHash(String hash) {
if (32 != hash.length()) {
return false;
}
for (int i = 0, n = hash.length(); i < n; i++) {
char ch = hash.charAt(i);
if (!(ch >= '0' && ch <= '9') && !(ch >= 'a' && ch <= 'z')) {
return false;
}
}
return true;
}
public void enter() {
Context context = getContext2();
if (null == context || null == mIpbMemberIdLayout || null == mIpbPassHashLayout ||
null == mIpbMemberId || null == mIpbPassHash) {
return;
}
final String ipbMemberId = mIpbMemberId.getText().toString().trim();
final String ipbPassHash = mIpbPassHash.getText().toString().trim();
if (TextUtils.isEmpty(ipbMemberId)) {
mIpbMemberIdLayout.setError(getString(R.string.text_is_empty));
return;
} else {
mIpbMemberIdLayout.setError(null);
}
if (TextUtils.isEmpty(ipbPassHash)) {
mIpbPassHashLayout.setError(getString(R.string.text_is_empty));
return;
} else {
mIpbPassHashLayout.setError(null);
}
hideSoftInput();
if (!checkIpbMemberId(ipbMemberId) || !(checkIpbPassHash(ipbPassHash))) {
new AlertDialog.Builder(context).setTitle(R.string.waring)
.setMessage(R.string.wrong_cookie_warning)
.setNegativeButton(R.string.i_dont_think_so, null)
.setPositiveButton(R.string.i_will_check_it, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
storeCookie(ipbMemberId, ipbPassHash);
setResult(RESULT_OK, null);
finish();
}
}).show();
} else {
storeCookie(ipbMemberId, ipbPassHash);
setResult(RESULT_OK, null);
finish();
}
}
private static Cookie newCookie(String name, String value, String domain) {
return new Cookie.Builder().name(name).value(value)
.domain(domain).expiresAt(Long.MAX_VALUE).build();
}
private void storeCookie(String id, String hash) {
Context context = getContext2();
if (null == context) {
return;
}
EhUtils.signOut(context);
EhCookieStore store = EhApplication.getEhCookieStore(context);
store.add(newCookie(EhCookieStore.KEY_IPD_MEMBER_ID, id, EhUrl.DOMAIN_E));
store.add(newCookie(EhCookieStore.KEY_IPD_MEMBER_ID, id, EhUrl.DOMAIN_EX));
store.add(newCookie(EhCookieStore.KEY_IPD_PASS_HASH, hash, EhUrl.DOMAIN_E));
store.add(newCookie(EhCookieStore.KEY_IPD_PASS_HASH, hash, EhUrl.DOMAIN_EX));
}
}