package com.fcar.settings.ui;
import android.app.AlertDialog;
import android.app.Fragment;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.fcar.framework.jnilib.ActiveCodeChecker;
import com.fcar.frameworks.utils.L;
import com.fcar.settings.R;
import com.fcar.settings.VerInfo;
import com.fcar.settings.utils.HttpClientUtil;
import com.fcar.settings.utils.QRcode;
import com.fcar.settings.utils.SimpleCrypto;
import com.fcar.settings.utils.Utils;
import com.google.zxing.WriterException;
import com.loopj.android.http.AsyncHttpResponseHandler;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
/**
* Created by xuti on 2016/5/23.
*/
public class FragmentActivate extends Fragment {
public static String TAG = "FragmentActivate";
public static final String SP_KEY_ACTIVE = "active";//sp名
public static final String SP_VALUE_ACTIVATED = "Activated";//已激活sp值
public static final String SP_VALUE_INACTIVE = "Inactive";//未激活sp值
public static final String SEED = "fdsfhdshfhfdsjfsfs";
String state;
private static final int SIGNATURE = 0;
private View rootView;
private TextView tv_state;
private TextView tv_sn;
private TextView tv_signature;
private EditText et_activate;
private Button btn_activate;
private Bitmap mBitmap;
private ImageView iv_qr;
private String sn;
String host = "http://www.szfcar.com";
// String host = "http://192.168.3.176";
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case SIGNATURE:
break;
}
}
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.activate, container, false);
initViews();
initData();
return rootView;
}
void initViews() {
tv_state = (TextView) rootView.findViewById(R.id.tv_state);
tv_sn = (TextView) rootView.findViewById(R.id.tv_sn);
tv_signature = (TextView) rootView.findViewById(R.id.tv_feature);
et_activate = (EditText) rootView.findViewById(R.id.et_activate);
btn_activate = (Button) rootView.findViewById(R.id.btn_activate);
btn_activate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
activateMachine();
}
});
iv_qr = (ImageView) rootView.findViewById(R.id.iv_qr);
}
void initData() {
state = getState();
showState();
String sn_show = VerInfo.get(getActivity().getPackageManager()).getSN();
tv_sn.setText(sn_show);
sn = sn_show.trim().replace(" ", "");
tv_signature.setText(getFeatureCode());
initBitmap();
buildQR();
/*checkSn(getActivity(), new TextHttpResponseHandler() {
@Override
public void onFailure(int i, Header[] headers, String s, Throwable throwable) {
}
@Override
public void onSuccess(int i, Header[] headers, String s) {
if (s.equals("1") || s.equals(sn)) {
L.i("验证成功");
}
}
});*/
}
private void saveState(String state){
this.state = state;
try {
Utils.setSp(getActivity(), SimpleCrypto.encrypt(SEED, SP_KEY_ACTIVE), SimpleCrypto.encrypt(SEED, state));
} catch (Exception e) {
e.printStackTrace();
}
}
private void showState(){
if(TextUtils.equals(state,SP_VALUE_INACTIVE)){
tv_state.setText("未激活");
}else if(TextUtils.equals(state,SP_VALUE_ACTIVATED)){
tv_state.setText("已激活");
}
}
private String getState(){
String encrypt = null;
String decrypt = null;
try {
encrypt = Utils.getSp(getActivity(), SimpleCrypto.encrypt(SEED, SP_KEY_ACTIVE), SimpleCrypto.encrypt(SEED, SP_VALUE_INACTIVE));
decrypt = SimpleCrypto.decrypt(SEED,encrypt);
} catch (Exception e) {
e.printStackTrace();
}
L.i("encrypt:"+encrypt);
L.i("decrypt:"+decrypt);
return decrypt;
}
public String getImx6Uid() {
try {
byte[] uuid = new byte[16];
File file = new File("/sys/fsl_otp/HW_OCOTP_CFG0");
FileInputStream filow = new FileInputStream(file);
DataInputStream dilow = new DataInputStream(filow);
byte[] buflow = new byte[10];
int len = dilow.read(buflow);
dilow.close();
filow.close();
FileInputStream fihigh = new FileInputStream(new File("/sys/fsl_otp/HW_OCOTP_CFG1"));
DataInputStream dihigh = new DataInputStream(fihigh);
byte[] bufhigh = new byte[10];
int length = dihigh.read(bufhigh);
dihigh.close();
fihigh.close();
System.arraycopy(buflow, 2, uuid, 0, len - 2);
System.arraycopy(bufhigh, 2, uuid, len - 2, length - 2);
L.i("new String(uuid):" + new String(uuid));
return new String(uuid);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
String getFeatureCode() {
byte[] bytes = getImx6Uid().getBytes();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 4; i++) {
int in = bytes[i] & 0xFF;
int random = (int) (Math.random() * 256);
String s = Integer.toHexString(in ^ random);
sb.append(in ^ random);
}
String str = sb.toString().substring(0, 8);
L.i("random:" + str);
return str;
}
void initBitmap() {
mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher1);//(BitmapDrawable)).getBitmap();
// 缩放图片
Matrix m = new Matrix();
float sx = (float) 2 * 50 / mBitmap.getWidth();
float sy = (float) 2 * 50 / mBitmap.getHeight();
m.setScale(sx, sy);
// 重新构造一个40*40的图片
mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(),
mBitmap.getHeight(), m, false);
}
void buildQR() {
String url = host + "/wap/active?sn="
+ sn + "&pn=" + tv_signature.getText().toString().trim();
L.i("url:" + url);
try {
iv_qr.setImageBitmap(QRcode.cretaeBitmap(url, mBitmap,
50, 800));
} catch (WriterException e) {
e.printStackTrace();
}
}
public int[] getSnArr() {
int[] arr = new int[8];
String substr = sn.substring(8);
for (int i = 0; i < substr.length(); i++) {
arr[i] = substr.charAt(i);
L.i("getSnArr_arr["+i+"]:" + arr[i]);
}
return arr;
}
private int[] getSignatureArr() {
String trim = tv_signature.getText().toString().trim().replace(" ", "");
int[] arr = new int[trim.length()];
for (int i = 0; i < trim.length(); i++) {
arr[i] = trim.charAt(i);
L.i("getSignatureArr_arr["+i+"]:" + arr[i]);
}
return arr;
}
private int[] getActiveArr(String str) {
int[] arr = new int[8];
List<String> strs = new ArrayList<String>();
for (int i = 0; i < str.length(); i = i + 2) {
strs.add(str.substring(i, i + 2));
}
L.i("str:" + str);
L.i("strs:" + strs);
for (int i = 0; i < strs.size(); i++) {
arr[i] = Integer.parseInt(strs.get(i), 16);
L.i("getActiveArr_arr["+i+"]:" + arr[i]);
}
return arr;
}
private int[] getFeatureCodeArr() {
String featureStr = tv_signature.getText().toString().trim().replace(" ", "");
return null;
}
private void showDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage("1.您是否将激活码输入错误\r\n2.您是否连接了一个不与平板电脑配套的下位机盒");
builder.setTitle("激活失败,可能是由如下原因导致");
builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
private void activateMachine() {
final int[] serialNumber = getSnArr();
final int[] signatureNumber = getSignatureArr();//8的整数倍
String activateCode = et_activate.getText().toString().trim().replace(" ", "");
if(activateCode.length()!=16){
Toast.makeText(getActivity(),"激活码输入错误",Toast.LENGTH_SHORT).show();
return;
}
final int[] activeCode = getActiveArr(activateCode);
new Thread(new Runnable() {
@Override
public void run() {
if (ActiveCodeChecker.getInstance().isActiveCodeValid(serialNumber, signatureNumber, activeCode)) {
L.i(TAG, "activation by times success!");
saveState(SP_VALUE_ACTIVATED);
showState("激活成功");
} else {
L.i(TAG, "activation by times fail!");
if (ActiveCodeChecker.getInstance().isActiveCodeForeverValid(serialNumber, signatureNumber, activeCode)) {
L.i(TAG, "activation by forever success!");
saveState(SP_VALUE_ACTIVATED);
showState("激活成功");
} else {
L.i(TAG, "activation by forever fail!");
saveState(SP_VALUE_INACTIVE);
showState("激活失败");
}
}
}
}).start();
}
public void showState(final String str){
mHandler.post(new Runnable() {
@Override
public void run() {
showState();
Toast.makeText(getActivity(), str, Toast.LENGTH_SHORT).show();
}
});
}
public void checkSn(Context context, AsyncHttpResponseHandler handler) {
String sn = tv_sn.getText().toString().trim().replace(" ", "");
String authSnUrl = host + "/online" + "/auth?key=" + Utils.encodeSn(sn);
L.i(TAG, "authSnUrl:" + authSnUrl);
HttpClientUtil.get(authSnUrl, handler);
}
}
package com.fcar.settings.ui;
import android.app.Fragment;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import com.fcar.settings.R;
import com.fcar.settings.utils.Utils;
/**
* Created by fengjl on 2015/12/9.
*
*/
public class FragmentLang extends Fragment {
private static final String SP_KEY_LANGUAGE = "language";
private static final String SP_VALUE_EN = "en";//英文
private static final String SP_VALUE_CN_SIMPLE = "cn_simple";//中文简体
private static final String SP_VALUE_CN_COMPLEX = "cn_complex";//中文繁体
private String language;
private View rootView;
private ImageView iv_en,iv_cn_simple,iv_cn_complex;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.lang, container, false);
initViews();
return rootView;
}
private void initViews() {
rootView.findViewById(R.id.ll_en).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
language = SP_VALUE_EN;
select();
}
});
rootView.findViewById(R.id.ll_cn_simple).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
language = SP_VALUE_CN_SIMPLE;
select();
}
});
rootView.findViewById(R.id.ll_cn_complex).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
language = SP_VALUE_CN_COMPLEX;
select();
}
});
iv_en = (ImageView) rootView.findViewById(R.id.iv_en);
iv_cn_simple = (ImageView) rootView.findViewById(R.id.iv_cn_simple);
iv_cn_complex = (ImageView) rootView.findViewById(R.id.iv_cn_complex);
language = Utils.getSp(getActivity(), SP_KEY_LANGUAGE, SP_VALUE_EN);
select();
}
private void select() {
iv_en.setVisibility(View.INVISIBLE);
iv_cn_simple.setVisibility(View.INVISIBLE);
iv_cn_complex.setVisibility(View.INVISIBLE);
if(TextUtils.equals(language, SP_VALUE_EN)){
iv_en.setVisibility(View.VISIBLE);
Utils.setSp(getActivity(), SP_KEY_LANGUAGE, SP_VALUE_EN);
}else if(TextUtils.equals(language, SP_VALUE_CN_SIMPLE)){
iv_cn_simple.setVisibility(View.VISIBLE);
Utils.setSp(getActivity(), SP_KEY_LANGUAGE, SP_VALUE_CN_SIMPLE);
}else if(TextUtils.equals(language, SP_VALUE_CN_COMPLEX)){
iv_cn_complex.setVisibility(View.VISIBLE);
Utils.setSp(getActivity(), SP_KEY_LANGUAGE, SP_VALUE_CN_COMPLEX);
}
}
}