Project

General

Profile

« Previous | Next » 

Revision 1f6d1786

Added by Leszek Koltunski almost 2 years ago

Lots of progress with the main screen

View differences:

distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanActivity.java
28 28
import android.view.View;
29 29
import android.view.ViewGroup;
30 30
import android.view.WindowManager;
31
import android.widget.AdapterView;
31 32
import android.widget.LinearLayout;
33
import android.widget.SimpleAdapter;
32 34
import android.widget.TextView;
33 35

  
36
import java.util.ArrayList;
37
import java.util.HashMap;
38
import java.util.List;
39
import java.util.Map;
40

  
34 41
import helpers.TransparentImageButton;
35 42

  
36 43
///////////////////////////////////////////////////////////////////////////////////////////////////
37 44

  
38 45
public class SokobanActivity extends ListActivity
39 46
  {
40
  private static final String ITEM_IMAGE    = "item_image";
41
  private static final String ITEM_TITLE    = "item_title";
42
  private static final String ITEM_SUBTITLE = "item_subtitle"; 
47
  private static final String L_NUMBER = "lNumber";
48
  private static final String L_RECORD = "lRecord";
49
  private static final String L_IMAGE  = "lImage";
50
  private static final String R_NUMBER = "rNumber";
51
  private static final String R_RECORD = "rRecord";
52
  private static final String R_IMAGE  = "rImage";
43 53

  
44 54
  private static final float RATIO_BAR    = 0.10f;
45 55
  private static final float RATIO_INSET  = 0.09f;
......
78 88

  
79 89
    LinearLayout upper = findViewById(R.id.upper_layout);
80 90
    createUpperLayout(upper);
81

  
82
/*
83
    final List<Map<String, Object>> data = new ArrayList<>();
84
    final SparseArray<Class<? extends Activity>> activityMapping = new SparseArray<>();
85

  
86
    int index=0;
87

  
88
    for( Application app : Application.values() )
89
      {
90
      final Map<String, Object> item = new HashMap<>();
91
      item.put(ITEM_IMAGE, app.icon);
92
      item.put(ITEM_TITLE, (index+1)+". "+getText(app.title));
93
      item.put(ITEM_SUBTITLE, getText(app.subtitle));
94
      data.add(item);
95
      activityMapping.put(index++, app.activity);
96
      }
97

  
98
    final SimpleAdapter dataAdapter = new SimpleAdapter( this,
99
                                                         data,
100
                                                         R.layout.toc_item,
101
                                                         new String[] {ITEM_IMAGE, ITEM_TITLE, ITEM_SUBTITLE},
102
                                                         new int[] {R.id.Image, R.id.Title, R.id.SubTitle}  );
103
    setListAdapter(dataAdapter);
104
      
105
    getListView().setOnItemClickListener(new OnItemClickListener()
106
      {
107
      @Override
108
      public void onItemClick(AdapterView<?> parent, View view, int position, long id)
109
        {
110
        final Class<? extends Activity> activityToLaunch = activityMapping.get(position);
111
            
112
        if (activityToLaunch != null)
113
          {
114
          final Intent launchIntent = new Intent(SokobanActivity.this, activityToLaunch);
115
          startActivity(launchIntent);
116
          }
117
        }
118
      });
119

  
120
 */
121 91
    }
122 92

  
123 93
///////////////////////////////////////////////////////////////////////////////////////////////////
......
152 122
      }
153 123
    }
154 124

  
125
///////////////////////////////////////////////////////////////////////////////////////////////////
126

  
127
  @Override
128
  public void onResume()
129
    {
130
    super.onResume();
131
    createListOfLevels();
132
    }
133

  
134
///////////////////////////////////////////////////////////////////////////////////////////////////
135

  
136
  @Override
137
  public void onPause()
138
    {
139
    super.onPause();
140
    }
141

  
155 142
///////////////////////////////////////////////////////////////////////////////////////////////////
156 143

  
157 144
  private void createUpperLayout(LinearLayout upper)
......
305 292
      default: return huge;
306 293
      }
307 294
    }
295

  
296
///////////////////////////////////////////////////////////////////////////////////////////////////
297

  
298
  private void createListOfLevels()
299
    {
300
    /*
301
    final List<Map<String, Object>> data = new ArrayList<>();
302

  
303
    int index=0;
304

  
305
    for( Application app : Application.values() )
306
      {
307
      final Map<String, Object> item = new HashMap<>();
308
      item.put(ITEM_IMAGE, app.icon);
309
      item.put(ITEM_TITLE, (index+1)+". "+getText(app.title));
310
      item.put(ITEM_SUBTITLE, getText(app.subtitle));
311
      data.add(item);
312
      }
313

  
314
    final SimpleAdapter dataAdapter = new SimpleAdapter( this,
315
                                                         data,
316
                                                         R.layout.toc_item,
317
                                                         new String[] {L_NUMBER, L_RECORD, L_IMAGE, R_NUMBER, R_RECORD, R_IMAGE},
318
                                                         new int[] {R.id.leftNumber , R.id.leftRecord , R.id.leftImage ,
319
                                                                    R.id.rightNumber, R.id.rightRecord, R.id.rightImage,}  );
320
    setListAdapter(dataAdapter);
321

  
322
    getListView().setOnItemClickListener(new AdapterView.OnItemClickListener()
323
      {
324
      @Override
325
      public void onItemClick(AdapterView<?> parent, View view, int position, long id)
326
        {
327
        android.util.Log.e("D","id="+id+" position="+position+" clicked!!");
328
        }
329
      });
330

  
331
     */
332
    }
308 333
  }
distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanDatabase.java
14 14
public class SokobanDatabase 
15 15
{ 
16 16
	private static final String TAG_DB = "SokobanDatabase";
17
	private static final String PREFS_NAME = "sokobanPrefsFile";	
18
	
17
	private static final String PREFS_NAME = "sokobanPrefsFile";
19 18
	public static final int BEGIN_LEVELS = 1000;
20 19
	public static final int INVALID = 1000000;
21 20

  
22
	private static int numrunnings;
23
	private static int numplayings;
24
	private static int hash;
25
	private static String username;
26
	private static String veriname;
27
	private static int uniqueid;
28
	private static int scrollpos;
29
	private static boolean finishedBootup = false;
30
	private static String iso = null;
31
	 
32
	private static SokobanLevels mLevels;
33
	private static SokobanDatabase mThis =null;
21
  private static SokobanDatabase mThis =null;
22

  
23
	private int mNumRunnings;
24
	private int mNumPlayings;
25
	private String mUsername;
26
	private String mVeriname;
27
	private int mUniqueid;
28
	private int mScrollpos;
29
	private final boolean mFinishedBootup;
30
	private String mISO = null;
34 31
	private final WeakReference<Context> mContext;
35
	
36 32

  
37 33
	private static final String[] bl = new String[]
38 34
	  {
......
633 629
	{
634 630
	    mContext = new WeakReference<>(co);
635 631
	    
636
	    mLevels = SokobanLevels.getInstance();
637
	    numrunnings = 0;
638
	    numplayings = 0;
639
	    uniqueid    = 0;
640
	    username    ="";
641
	    veriname    ="";
642
	    scrollpos   = 0;
632
	    SokobanLevels levels = SokobanLevels.getInstance();
633
	    mNumRunnings = 0;
634
	    mNumPlayings = 0;
635
	    mUniqueid    = 0;
636
	    mUsername    ="";
637
	    mVeriname    ="";
638
	    mScrollpos   = 0;
643 639
	    
644 640
	    for(int i=0; i<BUILTIN_LEVELS; i++)
645 641
	      {
646 642
	      int xlen = Integer.parseInt(bl[2*i]);
647 643
	      SokobanLevel sl = new SokobanLevel( null, null, INVALID, INVALID, null, false,xlen, bl[2*i+1]);
648
	      mLevels.addLevel(sl,i);
644
	      levels.addLevel(sl,i);
649 645
	      }
650 646

  
651
	    hash = computeHash();
652
	    
653 647
	    try
654 648
		  {
655 649
		  SharedPreferences settings = co.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
......
660 654
		  Log.e( TAG_DB, "Failed to retrieve preferences: "+ex.toString());
661 655
		  }
662 656
	    
663
	    if( veriname==null ) veriname="";
664
	    if( username==null ) username="";  
665
	    if( uniqueid==0 ) uniqueid = getDeviceID();
666

  
667
	    mLevels.setScroll(scrollpos);
668
	    mLevels.updateMyRecords(username);
657
	    if( mVeriname==null ) mVeriname="";
658
	    if( mUsername==null ) mUsername="";
659
	    if( mUniqueid==0 ) mUniqueid = getDeviceID();
669 660

  
670
	    if( numrunnings==0 ) SokobanCanvas.setState(SokobanCanvas.STATE_HELP);
661
	    levels.setScroll(mScrollpos);
662
	    levels.updateMyRecords(mUsername);
671 663

  
672
	    if( hash != computeHash() )  // someone has been messing with RMS !
673
	      {
674
	    Log.e(TAG_DB, "messing in DB");	
675
	    	
676
	      SokobanLevel sl;
677
	      veriname = "";
678

  
679
	      for(int i=0; ; i++)
680
	        {
681
	        sl = SokobanLevels.getLevel(i);
682
	        if( sl==null ) break;
683
	        sl.resetPrivate();
684
	        }
685
	      }
686

  
687
	    finishedBootup = true;
664
	    mFinishedBootup = true;
688 665
	    SokobanCanvas.setRepaint();
689 666
	}
690 667

  
......
705 682
            
706 683
            	try
707 684
            	{
708
            		num = Integer.valueOf(key).intValue();
685
            		num = Integer.parseInt(key);
709 686
            		sett= String.valueOf(val);
710 687
            		
711 688
            		switch(num)
712 689
            		{
713
            		case 1 : username    = sett; break;
714
            		case 2 : veriname    = sett; break;
715
            		case 3 : hash        = Integer.valueOf(sett).intValue(); break;
716
            		case 4 : numrunnings = Integer.valueOf(sett).intValue(); break;
717
            		case 5 : numplayings = Integer.valueOf(sett).intValue(); break;
718
            		case 6 : uniqueid    = Integer.valueOf(sett).intValue(); break;
719
            		case 7 : scrollpos   = Integer.valueOf(sett).intValue(); break;
720
            		default: recoverLevel(num,sett); break;
690
            		case 1 : mUsername    = sett; break;
691
            		case 2 : mVeriname    = sett; break;
692
            		case 3 : mNumRunnings = Integer.parseInt(sett); break;
693
            		case 4 : mNumPlayings = Integer.parseInt(sett); break;
694
            		case 5 : mUniqueid    = Integer.parseInt(sett); break;
695
            		case 6 : mScrollpos   = Integer.parseInt(sett); break;
721 696
            		}
722 697
            	}
723 698
            	catch( Exception ex )
724 699
            	{
725
            		Log.e(TAG_DB, "error retrieving preference "+String.valueOf(val)+" :"+ex.toString());
700
            		Log.e(TAG_DB, "error retrieving preference "+val+" :"+ex.toString());
726 701
            	}                     	     
727 702
            }   
728 703
        }
729 704
	}
730 705

  
731
///////////////////////////////////////////////////////////////////
732
	  
733
	private void recoverLevel(int id, String value)
734
	{
735
		int begin=0,end=0,lvlNum;
736
		String tmp;
737

  
738
		//Log.d(TAG_DB, "recovering level "+id+" :"+value);
739
		
740
		end = value.indexOf(" ", begin+1);
741

  
742
		if( end<0 )
743
		{
744
			Log.e(TAG_DB, "error recovering level! value: "+value);
745
			return;
746
		}
747

  
748
		tmp = value.substring(begin,end);
749
		lvlNum = Integer.valueOf(tmp).intValue();
750
		
751
		recoverLevelData(id,lvlNum,end,value);
752
	}
753

  
754
///////////////////////////////////////////////////////////////////
755

  
756
	private void recoverLevelData(int id, int num, int begin, String value)
757
	{
758
		int end;
759
		String tmp;
760
		SokobanLevel sl;
761
		int intrinsic   = INVALID;
762
		int mytime      = INVALID;
763
		int mymoves     = INVALID;
764
		int worldtime   = INVALID;
765
		int worldmoves  = INVALID;
766
		String worldname   = "";
767
		String worldcountry= "";
768
		boolean submitted  = false;
769

  
770
		// recover intrinsic num
771
		end = value.indexOf(" ", begin+1);
772

  
773
		if( end<0 )
774
		{
775
			Log.e(TAG_DB, "1 error recovering builtin level, value: "+value);
776
			return;
777
		}
778

  
779
		try
780
		{
781
			tmp = value.substring( begin+1,end);
782
			intrinsic = Integer.valueOf(tmp).intValue();
783
		}
784
		catch(Exception ex1 ) {Log.e(TAG_DB, "1: "+ex1.toString()); }
785

  
786
		begin = end;
787

  
788
		// recover mytime
789
		end = value.indexOf(" ", begin+1);
790

  
791
		if( end<0 )
792
		{
793
			Log.e(TAG_DB, "1 error recovering builtin level, value: "+value);
794
			return;
795
		}
796

  
797
		try
798
		{
799
			tmp = value.substring( begin+1,end);
800
			mytime = Integer.valueOf(tmp).intValue();
801
		}
802
		catch(Exception ex1 ) {Log.e(TAG_DB, "1: "+ex1.toString()); }
803

  
804
		begin = end;
805

  
806
		// recover mymoves
807
		end = value.indexOf(" ", begin+1);
808

  
809
		if( end<0 )
810
		{
811
			Log.e(TAG_DB, "2 error recovering builtin level, value: "+value);
812
			return;
813
		}
814

  
815
		try
816
		{
817
			tmp = value.substring( begin+1,end);
818
			mymoves = Integer.valueOf(tmp).intValue();
819
		}
820
		catch(Exception ex1 ) {Log.e(TAG_DB, "2: "+ex1.toString()); }
821

  
822
		begin = end;
823

  
824
		// recover worldtime
825
		end = value.indexOf(" ", begin+1);
826

  
827
		if( end<0 )
828
		{
829
			Log.e(TAG_DB, "3 error recovering builtin level, value: "+value);
830
			return;
831
		}
832

  
833
		try
834
		{
835
			tmp = value.substring( begin+1,end);
836
			worldtime = Integer.valueOf(tmp).intValue();
837
		}
838
		catch(Exception ex1 ) {Log.e(TAG_DB, "3: "+ex1.toString()); }
839

  
840
		begin = end;
841

  
842
		// recover worldmoves
843
		end = value.indexOf(" ", begin+1);
844

  
845
		if( end<0 )
846
		{
847
			Log.e(TAG_DB, "4 error recovering builtin level, value: "+value);
848
			return;
849
		}
850

  
851
		try
852
		{
853
			tmp = value.substring( begin+1,end);
854
			worldmoves = Integer.valueOf(tmp).intValue();
855
		}
856
		catch(Exception ex1 ) {Log.e(TAG_DB, "4: "+ex1.toString()); }
857

  
858
		begin = end;
859

  
860
		// 	recover worldname
861
		end = value.indexOf(" ", begin+1);
862

  
863
		if( end<0 )
864
		{
865
			Log.e(TAG_DB, "5 error recovering builtin level, value: "+value);
866
			return;
867
		}
868

  
869
		try
870
		{
871
			worldname = value.substring( begin+1,end);
872
		}
873
		catch(Exception ex1 ) {Log.e(TAG_DB, "5: "+ex1.toString()); }
874

  
875
		begin = end;
876

  
877
		// recover worldcountry
878
		end = value.indexOf(" ", begin+1);
879

  
880
		if( end<0 )
881
		{
882
			Log.e(TAG_DB, "6 error recovering builtin level, value: "+value);
883
			return;
884
		}
885

  
886
		try
887
		{
888
			worldcountry = value.substring( begin+1,end);
889
		}
890
		catch(Exception ex1 ) {Log.e(TAG_DB,"6: "+ex1.toString()); }
891

  
892
		begin = end;
893

  
894
		// recover submitted
895
		end = value.indexOf(" ", begin+1);
896

  
897
		if( end<0 )
898
		{
899
			Log.e(TAG_DB, "7 error recovering builtin level, value: "+value);
900
			return;
901
		}
902

  
903
		try
904
		{
905
			tmp = value.substring( begin+1,end);
906
			submitted = (Integer.valueOf(tmp).intValue()==1 ? true:false);
907
		}
908
		catch(Exception ex1 ) {Log.e(TAG_DB, "7: "+ex1.toString()); }
909

  
910
		begin = end;
911

  
912
		if( num<BUILTIN_LEVELS )
913
		{
914
			sl = SokobanLevels.getLevel(num);
915

  
916
			if( sl==null ) { Log.e(TAG_DB, "Error recovering builtin level "+num); return; }
917

  
918
		//	Log.d(TAG_DB, "setting my info: "+mymoves+" "+mytime+" "+username+" "+getCountry() );
919
			
920
			sl.setMyInfo(mymoves,mytime, username, getCountry() );
921
			sl.addRecordInfo(worldmoves,worldtime,0,worldname,worldcountry);
922
			sl.setSubmitted(submitted);
923
			sl.setRecordId(id);
924
		}
925
		else
926
		{
927
			String author="", coun="", position="";
928
			int cols=0;
929

  
930
			// recover author
931
			end = value.indexOf(" ", begin+1);
932

  
933
			if( end<0 )
934
			{
935
				Log.e(TAG_DB, "8 error recovering builtin level, value: "+value);
936
				return;
937
			}
938

  
939
			try
940
			{
941
				author = value.substring( begin+1,end);
942
			}
943
			catch(Exception ex1 ) {Log.e(TAG_DB, "8: "+ex1.toString()); }
944

  
945
			begin = end;
946

  
947
			// recover country
948
			end = value.indexOf(" ", begin+1);
949

  
950
			if( end<0 )
951
			{
952
				Log.e(TAG_DB, "9 error recovering builtin level, value: "+value);
953
				return;
954
			}
955

  
956
			try
957
			{
958
				coun = value.substring( begin+1,end);
959
			}
960
			catch(Exception ex1 ) {Log.e(TAG_DB, "9: "+ex1.toString()); }
961

  
962
			begin = end;
963

  
964
			// recover cols
965
			end = value.indexOf(" ", begin+1);
966

  
967
			if( end<0 )
968
			{
969
				Log.e(TAG_DB, "10 error recovering builtin level, value: "+value);
970
				return;
971
			}
972

  
973
			try
974
			{
975
				tmp = value.substring( begin+1,end);
976
				cols = Integer.valueOf(tmp).intValue();
977
			}
978
			catch(Exception ex1 ) {Log.e(TAG_DB, "10: "+ex1.toString()); }
979

  
980
			begin = end;
981

  
982
			// recover position
983
			end = value.indexOf(" ", begin+1);
984

  
985
			if( end<0 )
986
			{
987
				Log.e(TAG_DB, "11 error recovering builtin level, value: "+value);
988
				return;
989
			}
990

  
991
			try
992
			{
993
				position = value.substring( begin+1,end);
994
			}
995
			catch(Exception ex1 ) {Log.e(TAG_DB, "11: "+ex1.toString()); }
996

  
997
			begin = end;
998

  
999
	//		Log.d(TAG_DB, "loading created level: "+author+" "+coun+" "+mymoves+" "+mytime);
1000
			
1001
			SokobanRecordInfo sri = new SokobanRecordInfo(worldmoves,worldtime,worldname,worldcountry);
1002
			sl = new SokobanLevel(author,coun,mymoves,mytime,sri,submitted,cols,position);
1003
			mLevels.insertLevel(sl,num,intrinsic,id);
1004
		}	
1005
}
1006

  
1007 706
///////////////////////////////////////////////////////////////////
1008 707
	
1009 708
	private int getDeviceID()
......
1029 728
	
1030 729
	public boolean saveValues()
1031 730
	    {
1032
		//Log.e(TAG_DB, "saveValues: "+finishedBootup);
1033
		
1034
	    if( !finishedBootup ) return false;
731
	    if( !mFinishedBootup ) return false;
1035 732

  
1036 733
	    boolean ret = false;
1037 734
	   
1038
	    numrunnings++;
1039
	    hash = computeHash();
1040
	    scrollpos = SokobanLevels.getScroll();
735
	    mNumRunnings++;
736
	    mScrollpos = SokobanLevels.getScroll();
1041 737
	    
1042 738
	    try
1043 739
	      {
1044
	        Context co = mContext.get();
1045
          SharedPreferences settings = co.getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE);
1046
          SharedPreferences.Editor editor = settings.edit();
740
	      Context co = mContext.get();
741
        SharedPreferences settings = co.getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE);
742
        SharedPreferences.Editor editor = settings.edit();
1047 743
	      
1048
          editor.putString("1", username);
1049
          editor.putString("2", veriname);
1050
          editor.putInt("3", hash);
1051
          editor.putInt("4", numrunnings);
1052
          editor.putInt("5", numplayings);
1053
          editor.putInt("6", uniqueid);
1054
          editor.putInt("7", scrollpos);
1055
        
1056
         // Log.d(TAG_DB, "saving: username="+username+" veriname="+veriname+" hash="+hash+" numrunnings="+numrunnings+" numplayings="+numplayings+" uniqueid="+uniqueid+" scrollpos="+scrollpos);
1057
  		
1058
	      if( saveLevels(editor)==false ) return false;
744
        editor.putString("1", mUsername);
745
        editor.putString("2", mVeriname);
746
        editor.putInt("3"   , mNumRunnings);
747
        editor.putInt("4"   , mNumPlayings);
748
        editor.putInt("5"   , mUniqueid);
749
        editor.putInt("6"   , mScrollpos);
1059 750

  
1060 751
	      editor.commit();
1061 752
	      ret = true;
......
1067 758

  
1068 759
	    return ret;
1069 760
	    }
1070
 
1071
///////////////////////////////////////////////////////////////////
1072

  
1073
	private static boolean saveLevels(SharedPreferences.Editor editor)
1074
	{
1075
		String tmp;
1076
		int sb;
1077
		SokobanLevel level;
1078
		SokobanRecordInfo wr;
1079

  
1080
		for(int i=0; ; i++)
1081
		{
1082
			level = SokobanLevels.getLevel(i);
1083
			if( level==null ) break;
1084 761

  
1085
			if( level.isDirty() )
1086
			{
1087
				wr = level.getRecordInfo(0);
1088
				sb = level.isSubmitted()==true?1:0;
1089

  
1090
				if( wr!=null )
1091
					tmp = i+" "+level.getIntrinsicNum()+" "+level.getMyTime()+" "+
1092
						  level.getMyMoves()+" "+wr.getTime()+" "+wr.getMove()+" "+
1093
						  wr.getName()+" "+wr.getCountry()+" "+sb+" ";
1094
				else
1095
					tmp = i+" "+level.getIntrinsicNum()+" "+level.getMyTime()+" "+
1096
						  level.getMyMoves()+" "+INVALID+" "+INVALID+" unk unk "+sb+" ";
1097

  
1098
				if( i>=BUILTIN_LEVELS )
1099
				{
1100
					tmp+=level.getAuthor()+" "+level.getCountry()+" "+level.getCols()+" "+level.encodeLevel()+" ";
1101
				}
1102

  
1103
				editor.putString(String.valueOf(level.getRecordId()), tmp);
1104
				
1105
				//Log.d(TAG_DB, "saving level "+i+" record id:"+level.getRecordId()+": "+tmp);
1106
				
1107
			}
1108
		}
1109

  
1110
		return true;
1111
	}
1112
	
1113 762
///////////////////////////////////////////////////////////////////
1114 763

  
1115 764
	public static void init(Activity act)
......
1119 768

  
1120 769
///////////////////////////////////////////////////////////////////
1121 770

  
1122
	private static int computeHash()
1123
	{
1124
		 
1125
		final int MODULO = 227;
1126
		int ret = 0;
1127
		SokobanLevel sl;
1128

  
1129
		for(int i=0; ; i++)
1130
		   {
1131
		   sl = SokobanLevels.getLevel(i);
1132
		   if( sl==null ) break;
1133

  
1134
		   ret +=   sl.getMyMoves();
1135
		   ret += 2*sl.getMyTime();
1136
		   }
1137

  
1138
		int length = veriname==null ? 0 : veriname.length();
1139

  
1140
		for(int i=0;i<length;i++)
1141
		   ret += i*veriname.charAt(i);
1142

  
1143
		return (ret%=MODULO);
1144
	}
1145
	
1146
///////////////////////////////////////////////////////////////////
1147

  
1148
	public static int getNumRunnings()
771
	public int getNumRunnings()
1149 772
	{
1150
		return numrunnings;
773
		return mNumRunnings;
1151 774
	}
1152 775

  
1153 776
///////////////////////////////////////////////////////////////////
1154 777

  
1155
	public static int getId()
778
	public int getId()
1156 779
	{
1157
	    return uniqueid;
780
	    return mUniqueid;
1158 781
	}
1159 782

  
1160 783
///////////////////////////////////////////////////////////////////
1161 784
	
1162
	public static int getNumPlayings()
785
	public int getNumPlayings()
1163 786
	{
1164
		return numplayings;
787
		return mNumPlayings;
1165 788
	}
1166 789

  
1167 790
///////////////////////////////////////////////////////////////////
1168 791

  
1169
	public static void incNumPlayings()
792
	public void incNumPlayings()
1170 793
	{
1171
		numplayings++;
794
		mNumPlayings++;
1172 795
	}
1173 796

  
1174 797
///////////////////////////////////////////////////////////////////
1175 798
	
1176
	public static void setName(String newname)
799
	public void setName(String newname)
1177 800
	{
1178
		username = newname;
801
		mUsername = newname;
1179 802
	}
1180 803

  
1181 804
///////////////////////////////////////////////////////////////////
1182 805
	
1183
	public static String getName()
806
	public String getName()
1184 807
	{
1185
		return username;
808
		return mUsername;
1186 809
	}
1187 810

  
1188 811
///////////////////////////////////////////////////////////////////
1189 812

  
1190
	public static void setVeri(String newveri)
813
	public void setVeri(String newveri)
1191 814
	{
1192
		veriname = newveri;
815
		mVeriname = newveri;
1193 816
	}
1194 817

  
1195 818
///////////////////////////////////////////////////////////////////
1196 819

  
1197
	public static String getVeri()
820
	public String getVeri()
1198 821
	{
1199
		return veriname;
822
		return mVeriname;
1200 823
	}
1201 824

  
1202 825
///////////////////////////////////////////////////////////////////
......
1208 831

  
1209 832
///////////////////////////////////////////////////////////////////
1210 833

  
1211
	public static String getCountry()
834
  public int getNumLevels()
835
		{
836
		return BUILTIN_LEVELS;
837
		}
838

  
839
///////////////////////////////////////////////////////////////////
840

  
841
	public String getCountry()
1212 842
	{
1213
		if( iso==null ) iso = SokobanCanvas.getIso();
843
		if( mISO==null ) mISO = SokobanCanvas.getIso();
1214 844
	
1215 845
		char digit1, digit2;
1216 846
		
1217 847
		try
1218 848
		  {
1219
		  digit1 = iso.charAt(0);
1220
		  digit2 = iso.charAt(1);
849
		  digit1 = mISO.charAt(0);
850
		  digit2 = mISO.charAt(1);
1221 851
		  }
1222 852
		catch( Exception ex )
1223 853
		  {
distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanLevel.java
70 70
      move  = (byte)m;
71 71
      }
72 72
    }
73
  private static Vector<Move> moves = new Vector<Move>();
73
  private static Vector<Move> moves = new Vector<>();
74 74

  
75 75
  private SokobanRecordInfo[] recordList;
76 76
  private SokobanRecordInfo recordMine;
......
109 109

  
110 110
      author = a;
111 111
      country= c;
112
      
113
      recordMine = new SokobanRecordInfo(mm,mt,SokobanDatabase.getName(),SokobanDatabase.getCountry());
112

  
113
      SokobanDatabase db = SokobanDatabase.getInstance();
114

  
115
      if( db!=null )
116
        {
117
        recordMine = new SokobanRecordInfo(mm,mt,db.getName(),db.getCountry());
118
        }
119
      else
120
        {
121
        recordMine = new SokobanRecordInfo(mm,mt,"","");
122
        }
114 123

  
115 124
      cutAuthor();
116 125

  
117 126
      cImg = (author==null ? null:SokobanLevels.getInstance().getFlag(c));
118
      
127

  
119 128
      recordList = new SokobanRecordInfo[mMaxRecords];
120 129
      for(int i=0; i<mMaxRecords; i++) recordList[i]=null;
121 130

  
......
145 154
    		  
146 155
      validateScratch = new byte[mRows][mCols]; 
147 156
      cells = new byte[mRows][mCols];
148
      
157

  
149 158
      recordList = new SokobanRecordInfo[mMaxRecords];
150 159
      for(int i=0; i<mMaxRecords; i++) recordList[i]=null;
151 160

  
......
175 184
  private void cutAuthor()
176 185
  {
177 186
    if( author!=null )
178
      {  
179
      mPaint.setTextSize(SokobanRecordInfo.getFontSize());	
180
    	
187
      {
188
      mPaint.setTextSize(SokobanRecordInfo.getFontSize());
189

  
181 190
      float len2 = mPaint.measureText(strAuthor);
182 191
      float len1 = mPaint.measureText(author);
183 192
      int len0 = SokobanLevels.levelInfoW-10-28;
184
      
193

  
185 194
      if( len1+len2>len0 )
186 195
        {
187 196
        int l = author.length();
......
193 202
          len1 = mPaint.measureText(author);
194 203
          }
195 204
        }
196
      }  
205
      }
197 206
  }
198 207

  
199 208
///////////////////////////////////////////////////////////////////////////////////////////////////
......
463 472
  {
464 473
     recordId = id;
465 474
  }
466
 
475

  
467 476
///////////////////////////////////////////////////////////////////////////////////////////////////
468
 
477

  
469 478
  public int getRecordId()
470 479
  {
471 480
     return recordId;
472 481
  }
473
 
482

  
474 483
///////////////////////////////////////////////////////////////////////////////////////////////////
475 484
 
476 485
  public void setDirty()  
477 486
  {
478 487
     mDirty = true;
479 488
  }
480
 
489

  
481 490
///////////////////////////////////////////////////////////////////////////////////////////////////
482
 
491

  
483 492
  public boolean isDirty()
484 493
  {
485 494
     return mDirty;
486 495
  }
487
 
496

  
488 497
///////////////////////////////////////////////////////////////////////////////////////////////////
489
 
498

  
490 499
  public void resetPrivate()
491
  {  
492
      recordMine.set(SokobanDatabase.INVALID, SokobanDatabase.INVALID, SokobanDatabase.getName(),SokobanDatabase.getCountry());
493
  }
500
    {
501
    SokobanDatabase db = SokobanDatabase.getInstance();
502
    recordMine.set(SokobanDatabase.INVALID, SokobanDatabase.INVALID, db.getName(), db.getCountry());
503
    }
494 504

  
495 505
///////////////////////////////////////////////////////////////////////////////////////////////////
496 506

  
distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanLevels.java
917 917
      {
918 918
      if( state==SokobanCanvas.STATE_MAIN && clickedLevel>=0 && dx*dx+dy*dy<=MIN_CLICK_DIST*MIN_CLICK_DIST)
919 919
        {
920
        SokobanDatabase.incNumPlayings();
920
        SokobanDatabase.getInstance().incNumPlayings();
921 921
        currLevel = clickedLevel;
922 922
        currMoves = 0;
923 923
        SokobanCanvas.getMenu().enterPlayState(currLevel);
......
1135 1135

  
1136 1136
        if( currMoves < m || (currMoves==m && currTime<sl.getMyTime() ) )
1137 1137
          {
1138
          sl.setMyInfo(currMoves,currTime,SokobanDatabase.getName(), SokobanDatabase.getCountry());
1138
          SokobanDatabase db = SokobanDatabase.getInstance();
1139
          sl.setMyInfo(currMoves,currTime,db.getName(),db.getCountry());
1139 1140
          sl.setDirty();
1140 1141
          SokobanLevelBuffer.invalidateAllR();
1141 1142
          SokobanCanvas.setState(SokobanCanvas.STATE_NEWR);
distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanMenu.java
482 482
                                       SokobanCanvas.setState(SokobanCanvas.STATE_NAME);
483 483
                                       }
484 484
                                     break;
485
      case SokobanCanvas.STATE_HELP: if( SokobanDatabase.getNumRunnings()==0 )
485
      case SokobanCanvas.STATE_HELP: if( SokobanDatabase.getInstance().getNumRunnings()==0 )
486 486
                                       SokobanCanvas.setState(SokobanCanvas.STATE_MAIN);
487 487
                                     else
488 488
                                       SokobanCanvas.setState(SokobanCanvas.STATE_MENU);
......
680 680
    mPaint.setColor(SokobanCanvas.COLOR_BLACK);
681 681
    mPaint.setTextSize(mFontH);
682 682
    mPaint.setTextAlign(Align.CENTER);
683
    
684
    c.drawText( "'"+SokobanDatabase.getName()+"'", scrWidth/2, scrHeight/2 -   mFontH/2, mPaint);
685
    c.drawText( strIAT                           , scrWidth/2, scrHeight/2 +   mFontH/2, mPaint);
686
    c.drawText( strTagain                        , scrWidth/2, scrHeight/2 + 3*mFontH/2, mPaint);
683

  
684
    SokobanDatabase db = SokobanDatabase.getInstance();
685

  
686
    c.drawText( "'"+db.getName()+"'", scrWidth/2, scrHeight/2 -   mFontH/2, mPaint);
687
    c.drawText( strIAT              , scrWidth/2, scrHeight/2 +   mFontH/2, mPaint);
688
    c.drawText( strTagain           , scrWidth/2, scrHeight/2 + 3*mFontH/2, mPaint);
687 689
    }
688 690

  
689 691
///////////////////////////////////////////////////////////////////////////////////////////////////
......
1228 1230
	  tkb.setMinSize(1);
1229 1231
	  }
1230 1232

  
1231
	tkb.setText(SokobanDatabase.getName());
1233

  
1234

  
1235
	tkb.setText(SokobanDatabase.getInstance().getName());
1232 1236
	mCanvas.getActivity().setContentView(tkb);
1233 1237
    }
1234 1238

  
......
1236 1240

  
1237 1241
  public void okPressed(String text)
1238 1242
    { 
1239
    SokobanDatabase.setName(text);
1243
    SokobanDatabase.getInstance().setName(text);
1240 1244
    SokobanLevels.getInstance().updateMyRecords(text);
1241 1245
    mCanvas.getActivity().setContentView(mCanvas);
1242 1246
    SokobanCanvas.setRepaint();
distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanRecordInfo.java
51 51
  country = c;
52 52
  movetime = move<SokobanDatabase.INVALID ? move+"m "+time+"s" : null;
53 53
  img = SokobanLevels.getInstance().getFlag(c);
54
  mine = SokobanDatabase.getName().equals(n);
54

  
55
  SokobanDatabase db = SokobanDatabase.getInstance();
56
  mine = (db!=null && db.getName().equals(n));
55 57

  
56 58
  setCut();
57 59
  }
......
71 73
public void set(String n)
72 74
  {
73 75
  name = n;
74
  mine = SokobanDatabase.getName().equals(n);
76
  mine = SokobanDatabase.getInstance().getName().equals(n);
75 77
  setCut();
76 78
  }
77 79

  
distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanRecords.java
111 111
		try
112 112
		  {
113 113
		  String message="";
114
		  int run = SokobanDatabase.getNumRunnings();
114
		  SokobanDatabase db = SokobanDatabase.getInstance();
115
		  int run = db.getNumRunnings();
115 116

  
116 117
		  if(mode==SUBMITR)
117 118
		    {
......
125 126
		    message+=("&s="+URLencode(getSMSC()));
126 127
		    message+=("&h="+hash);
127 128
		    message+=("&r="+run);
128
		    message+=("&p="+SokobanDatabase.getNumPlayings());
129
		    message+=("&i="+SokobanDatabase.getId());
129
		    message+=("&p="+db.getNumPlayings());
130
		    message+=("&i="+db.getId());
130 131
		    message+=("&e="+SokobanCanvas.mVersionStr+"a");
131 132
		    }
132 133
		  else if(mode==DOWNLOADR)
......
243 244
        switch(responseNum)
244 245
          {
245 246
          case  0: SokobanCanvas.setState(SokobanCanvas.STATE_RECO);// success
246
                   SokobanDatabase.setVeri(name);
247
                   SokobanDatabase db = SokobanDatabase.getInstance();
248
                   db.setVeri(name);
247 249
                   submitLevelsList(lv);
248 250
                   break;
249 251
          case -2: SokobanMenu.setAction(SokobanMenu.ACTION_SUBR);
......
413 415
	  public void downloadLevels()
414 416
        {   
415 417
        mode = DOWNLOADL;
416
        name = SokobanDatabase.getName();
418
        SokobanDatabase db = SokobanDatabase.getInstance();
419
        name = db.getName();
417 420
        start();
418 421
        }
419 422

  
......
424 427
        if( mDirtyRecords )
425 428
          {
426 429
          mode = DOWNLOADR;
427
          name = SokobanDatabase.getName();
428
          veri = SokobanDatabase.getVeri();
430
          SokobanDatabase db = SokobanDatabase.getInstance();
431
          name = db.getName();
432
          veri = db.getVeri();
429 433
          start();
430 434
          }
431 435
        }
......
434 438

  
435 439
	  public boolean submitRecord(int lvl)
436 440
	    {
437
        name = SokobanDatabase.getName();
441
	      SokobanDatabase db = SokobanDatabase.getInstance();
442
        name = db.getName();
438 443
        if( name==null || name.length()==0 ) return false;
439
        veri = SokobanDatabase.getVeri();
444
        veri = db.getVeri();
440 445
        mode = SUBMITR;
441 446
        lv = lvl;
442 447

  
......
448 453

  
449 454
	  public boolean submitLevel(int cols, String level)
450 455
        {
451
        name = SokobanDatabase.getName();
456
        SokobanDatabase db = SokobanDatabase.getInstance();
457
        name = db.getName();
452 458
        if( name==null || name.length()==0 ) return false;
453
        veri = SokobanDatabase.getVeri();
459
        veri = db.getVeri();
454 460
        mode = SUBMITL;
455 461
        mCols = cols;
456 462
        mLevel= level;
distorted-sokoban/src/main/res/layout/toc_item.xml
3 3
	xmlns:android="http://schemas.android.com/apk/res/android"
4 4
	android:layout_width="match_parent"	
5 5
	android:layout_height="wrap_content"
6
	android:baselineAligned="false"
6 7
	android:orientation="horizontal"
7 8
	android:paddingTop="4dp"
8 9
	android:paddingBottom="4dp">
9 10

  
10
   	<ImageView
11
   		android:id="@+id/Image"
12
   		android:layout_width="wrap_content"
13
   		android:layout_height="wrap_content"
14
   		android:layout_margin="8dp"
15
   		android:background="@drawable/icon_border"/>
16

  
17 11
   	<LinearLayout
18 12
   		android:layout_width="0dp"
19 13
 		android:layout_height="wrap_content"
20 14
 		android:layout_weight="1"
21 15
 		android:orientation="vertical"
22 16
 		android:layout_gravity="center_vertical">
23
		<TextView 
24
    		android:id="@+id/Title" 
25
    		android:layout_width="match_parent" 
26
    		android:layout_height="wrap_content"
27
    		android:textStyle="bold"/>
28
   		<TextView 
29
    		android:id="@+id/SubTitle" 
30
    		android:layout_width="wrap_content" 
31
    		android:layout_height="wrap_content"/>	       
17

  
18
 		<LinearLayout
19
	        android:layout_width="match_parent"
20
	        android:layout_height="wrap_content"
21
	        android:orientation="horizontal"
22
	        android:paddingTop="4dp"
23
	        android:paddingBottom="4dp">
24

  
25
		    <TextView
26
    		    android:id="@+id/leftNumber"
27
    		    android:layout_width="match_parent"
28
    		    android:layout_height="wrap_content"
29
    		    android:textStyle="bold"/>
30
   		    <TextView
31
    		    android:id="@+id/leftRecord"
32
    		    android:layout_width="wrap_content"
33
    		    android:layout_height="wrap_content"/>
34
    	</LinearLayout>
35

  
36
   	    <ImageView
37
   		    android:id="@+id/leftImage"
38
   		    android:layout_width="wrap_content"
39
   		    android:layout_height="wrap_content"
40
   		    android:contentDescription="@string/level_image"
41
   		    android:layout_margin="8dp"
42
   		    android:background="@drawable/icon_border"/>
43
	</LinearLayout>
44
	<LinearLayout
45
   		android:layout_width="0dp"
46
 		android:layout_height="wrap_content"
47
 		android:layout_weight="1"
48
 		android:orientation="vertical"
49
 		android:layout_gravity="center_vertical">
50

  
51
 		<LinearLayout
52
	        android:layout_width="match_parent"
53
	        android:layout_height="wrap_content"
54
	        android:orientation="horizontal"
55
	        android:paddingTop="4dp"
56
	        android:paddingBottom="4dp">
57

  
58
		    <TextView
59
    		    android:id="@+id/rightNumber"
60
    		    android:layout_width="match_parent"
61
    		    android:layout_height="wrap_content"
62
    		    android:textStyle="bold"/>
63
   		    <TextView
64
    		    android:id="@+id/rightRecord"
65
    		    android:layout_width="wrap_content"
66
    		    android:layout_height="wrap_content"/>
67
    	</LinearLayout>
68

  
69
   	    <ImageView
70
   		    android:id="@+id/rightImage"
71
   		    android:layout_width="wrap_content"
72
   		    android:layout_height="wrap_content"
73
   		    android:contentDescription="@string/level_image"
74
   		    android:layout_margin="8dp"
75
   		    android:background="@drawable/icon_border"/>
32 76
 	</LinearLayout>    
33 77
</LinearLayout>
distorted-sokoban/src/main/res/values/strings.xml
66 66
    <string name="nocd">Number of crates does</string>     
67 67
    <string name="netn">not equal the number</string>     
68 68
    <string name="ods">of destination squares</string>
69

  
70
    <string name="level_image">Level Image</string>
69 71
</resources>

Also available in: Unified diff