package net.sf.dvstar.uacodecheck.codec;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.util.Log;
import net.sf.dvstar.uacodecheck.R;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
/**
* Created by dstarzhynskyi on 28.04.2015.
*/
public class EANCodec implements ICodec {
private static final String TAG = "EANCodec";
private final Activity mParent;
private final String mCheckValue;
private final EANCountriesList mEANCountriesList;
public EANCodec(Activity parent, EANCountriesList vEANCountriesList, String vCheckValue){
this.mParent = parent;
this.mCheckValue = vCheckValue;
this.mEANCountriesList = vEANCountriesList;
}
@Override
public String getCheckSum() {
String ret;
int sum =0;
int sum_c = 0;
int sum_n = 0;
int osta = 0;
for( int pos=0; pos < 12; pos++) {
int cur = Integer.parseInt(""+mCheckValue.charAt(pos));
if( pos % 2 == 0 ){
sum_n += cur;
} else {
sum_c += cur;
}
osta = (sum_c*3+sum_n) % 10;
if (osta !=0)
sum = 10 - osta;
}
//Log.v(TAG,"c["+sum_c+"]n["+sum_n+"]o["+osta+"]");
ret = ""+sum;
return ret;
}
@Override
public String getValue() {
return mCheckValue.substring(0,13-1)+getCheckSum();
}
@Override
public int getMinLen() {
return 13;
}
@Override
public int getMaxLen() {
return 13;
}
@Override
public Spannable getSpannable() {
Spannable ret = new SpannableString(getValue());
ret.setSpan(new ForegroundColorSpan(Color.GREEN), 0, 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ret.setSpan(new ForegroundColorSpan(Color.GRAY), 3, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ret.setSpan(new ForegroundColorSpan(Color.YELLOW), 8, 12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ret.setSpan(new ForegroundColorSpan(Color.RED), 12, 13, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return ret;
}
public String getCountryName(){
String code = mCheckValue.substring(0,3);
String ret = mEANCountriesList.getCountryName(code);
return ret;
}
public EANCountriesItem getCountryItem() {
String code = mCheckValue.substring(0, 3);
EANCountriesItem ret = mEANCountriesList.getEANCountriesItem(code);
return ret;
}
public EANCountriesItem getDefaultItem() {
return new EANCountriesItem(mParent);
}
public static class EANCountriesList {
private final String[] mCountriesList;
private Map<EANCountriesItem, EANCountriesItem> eanCountriesItemMap;
private final Activity mParent;
public EANCountriesList(Activity aParent, String[] aCountriesList){
mCountriesList = aCountriesList;
mParent = aParent;
loadCountryList();
}
private void loadCountryList() {
eanCountriesItemMap = new HashMap<>();
for(int i=0;i<mCountriesList.length;i++) {
EANCountriesItem eanCountriesItem = new EANCountriesItem( mParent, mCountriesList[i]);
Log.v(TAG, "loadCountryList"+eanCountriesItem);
eanCountriesItemMap.put(eanCountriesItem, eanCountriesItem);
}
}
public String getCountryName(String code){
String ret = mParent.getResources().getString(R.string.text_country_unknown);
EANCountriesItem find = new EANCountriesItem(mParent, code+"|");
EANCountriesItem foun = eanCountriesItemMap.get(find);
if(foun != null){
ret = foun.mISOCountry;
}
return ret;
}
public EANCountriesItem getEANCountriesItem(String code) {
EANCountriesItem find = new EANCountriesItem(null, code+"|");
EANCountriesItem foun = eanCountriesItemMap.get(find);
return foun;
}
}
public static class EANCountriesItem {
public static final int MODE_SINGLE = 1;
public static final int MODE_DOUBLE = 2;
public static final int MODE_MULTIP = 3;
private final Activity mParent;
int mMode;
int mCodeFr;
int mCodeTo;
String mISOCode;
String mISOCountry;
String mEANCountry;
private Drawable mCountryFlagDraw;
private Bitmap mCountryFlagBitm;
public EANCountriesItem(Activity aParent) {
mCodeFr=000;
mCodeTo=000;
mParent = aParent;
mISOCode = "zz";
mISOCountry = mParent.getResources().getString(R.string.text_country_unknown);
mEANCountry = mParent.getResources().getString(R.string.text_country_unknown);
if(mParent!=null)
loadCountryFlag();
}
public EANCountriesItem(Activity aParent, String item) {
mParent = aParent;
int tokenPos = 1;
String tokenItem;
StringTokenizer token = new StringTokenizer(item, "|");
while (token.hasMoreTokens()){
//93|au|Австралия|EAN Australia
tokenItem = token.nextToken();
switch(tokenPos){
case 1:
int posDelimM;
if((posDelimM=tokenItem.indexOf('+'))>0){
mMode = MODE_DOUBLE;
mCodeFr = Integer.parseInt(tokenItem.substring(0, posDelimM));
mCodeTo = Integer.parseInt(tokenItem.substring(posDelimM+1));
} else
if((posDelimM=tokenItem.indexOf('-'))>0){
mMode = MODE_MULTIP;
mCodeFr = Integer.parseInt(tokenItem.substring(0, posDelimM));
mCodeTo = Integer.parseInt(tokenItem.substring(posDelimM+1));
} else {
mMode = MODE_SINGLE;
mCodeFr = Integer.parseInt(tokenItem);
mCodeTo = mCodeFr;
}
break;
case 2:
mISOCode = tokenItem;
break;
case 3:
mISOCountry = tokenItem;
break;
case 4:
mEANCountry = tokenItem;
break;
}
tokenPos++;
}
/*
int posDelim = item.indexOf('|');
if(posDelim>0)
{
String codes = item.substring(0, posDelim);
String names = item.substring(posDelim + 1);
mISOCountry = names;
int posDelimM;
if((posDelimM=codes.indexOf('+'))>0){
mMode = MODE_DOUBLE;
mCodeFr = Integer.parseInt(codes.substring(0, posDelimM));
mCodeTo = Integer.parseInt(codes.substring(posDelimM+1));
} else
if((posDelimM=codes.indexOf('-'))>0){
mMode = MODE_MULTIP;
mCodeFr = Integer.parseInt(codes.substring(0, posDelimM));
mCodeTo = Integer.parseInt(codes.substring(posDelimM+1));
} else {
mMode = MODE_SINGLE;
mCodeFr = Integer.parseInt(codes);
mCodeTo = mCodeFr;
}
}
*/
if(mParent!=null)
loadCountryFlag();
}
private void loadCountryFlag(){
mCountryFlagDraw = null;
mCountryFlagBitm = null;
try {
InputStream is = mParent.getAssets().open("flags/" + mISOCode + ".png");
if (is != null)
mCountryFlagDraw = Drawable.createFromStream(is, null);
is.reset();
mCountryFlagBitm = BitmapFactory.decodeStream(is);
} catch (IOException e) {
e.printStackTrace();
}
if (mCountryFlagDraw == null) {
mCountryFlagDraw = mParent.getResources().getDrawable(R.drawable.pirates_jolly_roger_64);
}
//Bitmap icon = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.index);
if (mCountryFlagBitm == null) {
mCountryFlagBitm = BitmapFactory.decodeResource(mParent.getResources(), R.drawable.pirates_jolly_roger_64);
}
/*
if (mCountryFlagBitm == null) {
mCountryFlagBitm = Bitmap.createBitmap(mCountryFlagDraw.getBounds().width(), mCountryFlagDraw.getBounds().height(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(mCountryFlagBitm);
mCountryFlagDraw.setBounds(0, 0, mCountryFlagDraw.getBounds().width(), mCountryFlagDraw.getBounds().height());
mCountryFlagDraw.draw(canvas);
}
*/
}
public Drawable getCountryFlagDrawable(){
Log.v(TAG, "getCountryFlag("+mISOCode
+") d["
+ mCountryFlagDraw.getBounds()
+ " m["
+mCountryFlagBitm.getHeight()
+"x"
+mCountryFlagBitm.getWidth()
+"]");
return mCountryFlagDraw;
}
public Bitmap getCountryFlagBitmap(){
Log.v(TAG, "getCountryFlag("+mISOCode
+") d["
+ mCountryFlagDraw.getBounds()
+ " m["
+mCountryFlagBitm.getHeight()
+"x"
+mCountryFlagBitm.getWidth()
+"]");
return mCountryFlagBitm;
}
@Override
public String toString(){
return "["+mMode+"]["+mCodeFr+"]["+mCodeTo+"]["+ mISOCountry +"]";
}
@Override
public int hashCode() {
return 0;
}
@Override
public boolean equals(Object another) {
if((another == null) || (another.getClass() != this.getClass())) {
return false;
}
boolean ret = false;
EANCountriesItem fromObject = (EANCountriesItem)another;
switch(fromObject.mMode){
case MODE_SINGLE:
if(this.mCodeFr == fromObject.mCodeFr) ret = true;
break;
case MODE_DOUBLE:
if(this.mCodeFr == fromObject.mCodeFr || this.mCodeFr == fromObject.mCodeTo) ret = true;
break;
case MODE_MULTIP:
if(this.mCodeFr >= fromObject.mCodeFr && this.mCodeFr <= fromObject.mCodeTo) ret = true;
break;
}
//Log.v(TAG, "equals ["+ret+"] this = ["+this.toString()+"] from ["+fromObject.toString()+"]");
return ret;
}
public String getCountryName() {
return mISOCountry +" ("+mISOCode+")";
}
}
}