Project

General

Profile

« Previous | Next » 

Revision 46be3ddf

Added by Leszek Koltunski almost 3 years ago

progress with the Updates: download the jsons.

View differences:

src/main/java/org/distorted/dialogs/RubikDialogScoresPagerAdapter.java
38 38

  
39 39
///////////////////////////////////////////////////////////////////////////////////////////////////
40 40

  
41
class RubikDialogScoresPagerAdapter extends PagerAdapter implements RubikNetwork.Receiver
41
class RubikDialogScoresPagerAdapter extends PagerAdapter implements RubikNetwork.ScoresReceiver
42 42
  {
43 43
  private final FragmentActivity mAct;
44 44
  private final RubikDialogScores mDialog;
......
157 157

  
158 158
    switch(errorNumber)
159 159
      {
160
      case '1': message("Network error");
160
      case '1': message(mAct.getString(R.string.networkError));
161 161
                break;
162 162
      case '2': RubikScores scores = RubikScores.getInstance();
163 163
                Bundle bundle = new Bundle();
src/main/java/org/distorted/dialogs/RubikDialogUpdateView.java
21 21

  
22 22
import android.app.Activity;
23 23
import android.graphics.Bitmap;
24
import android.graphics.Color;
24 25
import android.util.TypedValue;
25 26
import android.view.View;
26 27
import android.widget.Button;
......
30 31
import android.widget.TextView;
31 32

  
32 33
import org.distorted.main.R;
34
import org.distorted.network.RubikNetwork;
33 35
import org.distorted.network.RubikUpdates;
34 36

  
37
import java.io.InputStream;
38

  
35 39
import static android.view.View.GONE;
40
import static android.view.View.VISIBLE;
36 41

  
37 42
///////////////////////////////////////////////////////////////////////////////////////////////////
38 43

  
39
public class RubikDialogUpdateView
44
public class RubikDialogUpdateView implements RubikNetwork.Downloadee
40 45
  {
41 46
  private ImageView mIcon;
47
  private RubikUpdates.UpdateInfo mInfo;
48
  private ProgressBar mBar;
49
  private Button mButton;
50
  private TextView mDescription;
42 51

  
43 52
///////////////////////////////////////////////////////////////////////////////////////////////////
44 53

  
45 54
  public View createView(Activity act, RubikUpdates.UpdateInfo info, int fontSize, int padding,
46 55
                         LinearLayout.LayoutParams pView, LinearLayout.LayoutParams pText, LinearLayout.LayoutParams pButt )
47 56
    {
57
    mInfo = info;
58
    final RubikNetwork.Downloadee downloadee = this;
48 59
    View view = act.getLayoutInflater().inflate(R.layout.dialog_updates_pane, null);
49 60
    TextView title = view.findViewById(R.id.updates_pane_title);
50 61
    title.setText(info.mObjectLongName);
51
    TextView description = view.findViewById(R.id.updates_pane_description);
52
    description.setText(info.mDescription);
62
    mDescription = view.findViewById(R.id.updates_pane_description);
63
    mDescription.setText(info.mDescription);
53 64

  
54 65
    mIcon = view.findViewById(R.id.updates_pane_image);
55 66
    mIcon.setImageResource(R.drawable.unknown_icon);
......
57 68
    view.setLayoutParams(pView);
58 69

  
59 70
    title.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize);
60
    description.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize);
71
    mDescription.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize);
61 72

  
62 73
    title.setLayoutParams(pText);
63
    description.setLayoutParams(pText);
74
    mDescription.setLayoutParams(pText);
64 75

  
65 76
    view.setPadding(padding,padding,padding,padding);
66 77

  
67
    ProgressBar bar = view.findViewById(R.id.updates_pane_bar);
68
    Button button   = view.findViewById(R.id.updates_pane_button);
78
    mBar    = view.findViewById(R.id.updates_pane_bar);
79
    mButton = view.findViewById(R.id.updates_pane_button);
69 80

  
70 81
    if( info.mPercent>=100 )
71 82
      {
72
      bar.setVisibility(GONE);
73
      button.setOnClickListener( new View.OnClickListener()
83
      mBar.setVisibility(GONE);
84
      mButton.setOnClickListener( new View.OnClickListener()
74 85
        {
75 86
        @Override
76 87
        public void onClick(View v)
77 88
          {
78
          android.util.Log.e("D", "INSTALL pressed");
89
          startDownload();
90
          RubikNetwork network = RubikNetwork.getInstance();
91
          network.downloadJSON(info,downloadee);
79 92
          }
80 93
        });
81 94

  
82
      button.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize);
83
      button.setLayoutParams(pButt);
95
      mButton.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize);
96
      mButton.setLayoutParams(pButt);
97
      mBar.setLayoutParams(pButt);
84 98
      }
85 99
    else
86 100
      {
87
      button.setVisibility(GONE);
88
      bar.setLayoutParams(pButt);
89
      bar.setProgress(info.mPercent);
101
      mButton.setVisibility(GONE);
102
      mBar.setLayoutParams(pButt);
103
      mBar.setProgress(info.mPercent);
90 104
      }
91 105

  
92 106
    return view;
......
98 112
    {
99 113
    mIcon.setImageBitmap(icon);
100 114
    }
115

  
116
///////////////////////////////////////////////////////////////////////////////////////////////////
117

  
118
  private void startDownload()
119
    {
120
    mDescription.setText(R.string.downloading);
121
    mBar.setProgress(20);
122
    mButton.setVisibility(GONE);
123
    mBar.setVisibility(VISIBLE);
124
    }
125

  
126
///////////////////////////////////////////////////////////////////////////////////////////////////
127

  
128
  public void jsonDownloaded()
129
    {
130
    if( mInfo.mUpdateObject && mInfo.mObjectStream==null )
131
      {
132
      mDescription.setTextColor(Color.parseColor("#ff0000"));
133
      mDescription.setText(R.string.networkError);
134
      }
135
    else
136
      {
137
      mBar.setProgress(50);
138
      mDescription.setText(R.string.installing);
139
      }
140
    }
101 141
  }
src/main/java/org/distorted/dialogs/RubikDialogUpdates.java
46 46

  
47 47
///////////////////////////////////////////////////////////////////////////////////////////////////
48 48

  
49
public class RubikDialogUpdates extends AppCompatDialogFragment implements RubikNetwork.Updatee
49
public class RubikDialogUpdates extends AppCompatDialogFragment implements RubikNetwork.IconReceiver, RubikNetwork.Updatee
50 50
  {
51 51
  private TextView mText;
52 52
  private LinearLayout mLayout;
......
218 218

  
219 219
  public void errorUpdate()
220 220
    {
221
    mText.setText("Network error");
221
    FragmentActivity act = getActivity();
222
    if( act!=null ) mText.setText(act.getString(R.string.networkError));
222 223
    }
223 224

  
224 225
///////////////////////////////////////////////////////////////////////////////////////////////////
src/main/java/org/distorted/network/RubikNetwork.java
46 46

  
47 47
public class RubikNetwork
48 48
  {
49
  public interface Receiver
49
  public interface ScoresReceiver
50 50
    {
51 51
    void receive(String[][][] country, String[][][] name, float[][][] time);
52 52
    void message(String mess);
53 53
    void error(String error);
54 54
    }
55 55

  
56
  public interface Updatee
56
  public interface IconReceiver
57 57
    {
58 58
    void iconDownloaded(int ordinal, Bitmap bitmap);
59
    }
60

  
61
  public interface Updatee
62
    {
59 63
    void receiveUpdate(RubikUpdates update);
60 64
    void errorUpdate();
61 65
    }
62 66

  
67
  public interface Downloadee
68
    {
69
    void jsonDownloaded();
70
    }
71

  
63 72
  public static final int MAX_PLACES = 10;
64 73

  
65 74
  private static final int REND_ADRENO= 0;
......
114 123
  private static RubikNetwork mThis;
115 124
  private static String mScores = "";
116 125
  private static boolean mRunning = false;
117
  private static Receiver mReceiver;
118 126
  private static Updatee mUpdatee;
119 127
  private static String mVersion;
120
  private static String mSuspicious;
121 128
  private static int mNumObjects;
122 129
  private static RubikUpdates mUpdates;
123 130
  private static int mDebugState;
......
168 175

  
169 176
///////////////////////////////////////////////////////////////////////////////////////////////////
170 177

  
171
  private boolean fillValuesNormal()
178
  private boolean fillValuesNormal(ScoresReceiver receiver)
172 179
    {
173 180
    int begin=-1 ,end, len = mScores.length();
174 181
    String row;
175 182

  
176 183
    if( len==0 )
177 184
      {
178
      if( mReceiver!=null ) mReceiver.error("1");
185
      receiver.error("1");
179 186
      return false;
180 187
      }
181 188
    else if( len<=2 )
182 189
      {
183
      if( mReceiver!=null ) mReceiver.error(mScores);
190
      receiver.error(mScores);
184 191
      return false;
185 192
      }
186 193

  
......
376 383

  
377 384
///////////////////////////////////////////////////////////////////////////////////////////////////
378 385

  
379
  private boolean network(String url)
386
  private boolean network(String url, ScoresReceiver receiver)
380 387
    {
381 388
    try
382 389
      {
......
400 407
        }
401 408

  
402 409
      mScores = total.toString();
410
      conn.disconnect();
403 411
      }
404 412
    catch( final UnknownHostException e )
405 413
      {
406
      if( mReceiver!=null ) mReceiver.message("No access to Internet");
414
      receiver.message("No access to Internet");
407 415
      return false;
408 416
      }
409 417
    catch( final SecurityException e )
410 418
      {
411
      if( mReceiver!=null ) mReceiver.message("Application not authorized to connect to the Internet");
419
      receiver.message("Application not authorized to connect to the Internet");
412 420
      return false;
413 421
      }
414 422
    catch( final Exception e )
415 423
      {
416
      if( mReceiver!=null ) mReceiver.message(e.getMessage());
424
      receiver.message(e.getMessage());
417 425
      return false;
418 426
      }
419 427

  
420 428
    if( mScores.length()==0 )
421 429
      {
422
      if( mReceiver!=null ) mReceiver.message("Failed to download scores");
430
      receiver.message("Failed to download scores");
423 431
      return false;
424 432
      }
425 433

  
......
428 436

  
429 437
///////////////////////////////////////////////////////////////////////////////////////////////////
430 438

  
431
  private String constructSuspiciousURL()
439
  private String constructSuspiciousURL(String suspURL)
432 440
    {
433 441
    RubikScores scores = RubikScores.getInstance();
434 442
    int deviceID= scores.getDeviceID();
435
    String suspicious = URLencode(mSuspicious);
443
    String suspicious = URLencode(suspURL);
436 444

  
437 445
    String url="https://distorted.org/magic/cgi-bin/suspicious.cgi";
438 446
    url += "?i="+deviceID+"&d="+suspicious;
......
534 542

  
535 543
///////////////////////////////////////////////////////////////////////////////////////////////////
536 544

  
537
  private void downloadThread()
545
  private void downloadThread(ScoresReceiver receiver)
538 546
    {
539 547
    try
540 548
      {
541 549
      if( gottaDownload() )
542 550
        {
543 551
        mRunning = true;
544
        boolean receiveValues = network(constructDownloadURL());
552
        boolean receiveValues = network(constructDownloadURL(),receiver);
545 553

  
546 554
        if( mRunning )
547 555
          {
548
          receiveValues = fillValuesNormal();
556
          receiveValues = fillValuesNormal(receiver);
549 557
          mRunning = false;
550 558
          }
551 559

  
552
        if( receiveValues && mReceiver!=null ) mReceiver.receive(mCountry, mName, mTime);
560
        if( receiveValues ) receiver.receive(mCountry, mName, mTime);
553 561
        }
554 562
      }
555 563
    catch( Exception e )
556 564
      {
557
      if( mReceiver!=null ) mReceiver.message("Exception downloading records: "+e.getMessage() );
565
      receiver.message("Exception downloading records: "+e.getMessage() );
558 566
      }
559 567
    }
560 568

  
561 569
///////////////////////////////////////////////////////////////////////////////////////////////////
562 570

  
563
  private void submitThread()
571
  private void submitThread(ScoresReceiver receiver)
564 572
    {
565 573
    try
566 574
      {
......
569 577

  
570 578
      if( scores.thereAreUnsubmittedRecords() )
571 579
        {
572
        boolean receiveValues = network(constructSubmitURL());
580
        boolean receiveValues = network(constructSubmitURL(),receiver);
573 581

  
574 582
        if( mRunning )
575 583
          {
576
          receiveValues = fillValuesNormal();
584
          receiveValues = fillValuesNormal(receiver);
577 585
          mRunning = false;
578 586
          }
579 587

  
580 588
        if( receiveValues )
581 589
          {
582 590
          RubikScores.getInstance().successfulSubmit();
583
          if( mReceiver!=null ) mReceiver.receive(mCountry, mName, mTime);
591
          receiver.receive(mCountry, mName, mTime);
584 592
          }
585 593
        }
586 594
      }
587 595
    catch( Exception e )
588 596
      {
589
      if( mReceiver!=null ) mReceiver.message("Exception submitting records: "+e.getMessage() );
597
      receiver.message("Exception submitting records: "+e.getMessage() );
590 598
      }
591 599
    }
592 600

  
......
621 629
        }
622 630

  
623 631
      String updates = answer.toString();
632
      conn.disconnect();
624 633
      mUpdates.parse(updates);
625 634

  
626 635
      if( mUpdatee!=null ) mUpdatee.receiveUpdate(mUpdates);
......
635 644

  
636 645
///////////////////////////////////////////////////////////////////////////////////////////////////
637 646

  
638
  private void suspiciousThread()
647
  private void suspiciousThread(String suspURL)
639 648
    {
640
    String url = constructSuspiciousURL();
649
    String url = constructSuspiciousURL(suspURL);
641 650

  
642 651
    try
643 652
      {
......
651 660
      conn.connect();
652 661
      conn.getOutputStream().flush();
653 662
      conn.getInputStream();
663
      conn.disconnect();
654 664
      }
655 665
    catch( final Exception e )
656 666
      {
......
664 674
    {
665 675
    try
666 676
      {
667
      android.util.Log.e("D", "downloading "+url);
668

  
669 677
      java.net.URL connectURL = new URL(url);
670 678
      HttpURLConnection conn = (HttpURLConnection) connectURL.openConnection();
671 679
      conn.setDoInput(true);
672 680
      conn.connect();
673 681
      InputStream input = conn.getInputStream();
674
      return BitmapFactory.decodeStream(input);
682
      Bitmap icon = BitmapFactory.decodeStream(input);
683
      conn.disconnect();
684
      return icon;
675 685
      }
676 686
    catch (IOException e)
677 687
      {
......
683 693

  
684 694
///////////////////////////////////////////////////////////////////////////////////////////////////
685 695

  
686
  private void iconThread()
696
  private void iconThread(IconReceiver receiver)
687 697
    {
688 698
    int numC = mUpdates.getCompletedNumber();
689 699
    int numS = mUpdates.getStartedNumber();
......
704 714
        if( icon!=null )
705 715
          {
706 716
          mUpdates.setCompletedIcon(c,icon);
707
          mUpdatee.iconDownloaded(c,icon);
717
          receiver.iconDownloaded(c,icon);
708 718
          }
709 719
        }
710 720
      }
......
725 735
        if( icon!=null )
726 736
          {
727 737
          mUpdates.setStartedIcon(s,icon);
728
          mUpdatee.iconDownloaded(numC+s,icon);
738
          receiver.iconDownloaded(numC+s,icon);
729 739
          }
730 740
        }
731 741
      }
732 742
    }
733 743

  
744
///////////////////////////////////////////////////////////////////////////////////////////////////
745

  
746
  private InputStream downloadJSON(String name)
747
    {
748
    String url = mUpdates.getURL() + name;
749

  
750
    try
751
      {
752
      java.net.URL connectURL = new URL(url);
753
      HttpURLConnection conn = (HttpURLConnection) connectURL.openConnection();
754
      conn.setDoInput(true);
755
      conn.connect();
756
      InputStream stream = conn.getInputStream();
757
      conn.disconnect();
758
      return stream;
759
      }
760
    catch (IOException e)
761
      {
762
      android.util.Log.e("D", "Failed to download "+url);
763
      android.util.Log.e("D", e.getMessage() );
764
      return null;
765
      }
766
    }
767

  
768
///////////////////////////////////////////////////////////////////////////////////////////////////
769

  
770
  private void jsonThread(final RubikUpdates.UpdateInfo info, Downloadee downloadee)
771
    {
772
    if(info.mUpdateObject) info.mObjectStream = downloadJSON(info.mObjectShortName+"_object.json");
773
    if(info.mUpdateExtras) info.mExtrasStream = downloadJSON(info.mObjectShortName+"_extras.json");
774

  
775
    downloadee.jsonDownloaded();
776
    }
777

  
734 778
///////////////////////////////////////////////////////////////////////////////////////////////////
735 779

  
736 780
  private RubikNetwork()
......
761 805

  
762 806
///////////////////////////////////////////////////////////////////////////////////////////////////
763 807

  
764
  public void download(Receiver receiver, FragmentActivity act)
808
  public void download(final ScoresReceiver receiver, final FragmentActivity act)
765 809
    {
766 810
    initializeStatics();
767
    mReceiver = receiver;
768 811
    figureOutVersion(act);
769 812

  
770 813
    Thread thread = new Thread()
771 814
      {
772 815
      public void run()
773 816
        {
774
        downloadThread();
817
        downloadThread(receiver);
775 818
        }
776 819
      };
777 820

  
......
780 823

  
781 824
///////////////////////////////////////////////////////////////////////////////////////////////////
782 825

  
783
  public void submit(Receiver receiver, FragmentActivity act)
826
  public void submit(ScoresReceiver receiver, final FragmentActivity act)
784 827
    {
785 828
    initializeStatics();
786
    mReceiver = receiver;
787 829
    figureOutVersion(act);
788 830

  
789 831
    Thread thread = new Thread()
790 832
      {
791 833
      public void run()
792 834
        {
793
        submitThread();
835
        submitThread(receiver);
794 836
        }
795 837
      };
796 838

  
......
817 859

  
818 860
///////////////////////////////////////////////////////////////////////////////////////////////////
819 861

  
820
  public void suspicious(String suspicious)
862
  public void suspicious(final String suspicious)
821 863
    {
822 864
    initializeStatics();
823
    mSuspicious = suspicious;
824 865

  
825 866
    Thread thread = new Thread()
826 867
      {
827 868
      public void run()
828 869
        {
829
        suspiciousThread();
870
        suspiciousThread(suspicious);
830 871
        }
831 872
      };
832 873

  
......
852 893

  
853 894
///////////////////////////////////////////////////////////////////////////////////////////////////
854 895

  
855
  public void downloadIcons(Updatee updatee)
896
  public void downloadIcons(final IconReceiver receiver)
897
    {
898
    initializeStatics();
899

  
900
    Thread thread = new Thread()
901
      {
902
      public void run()
903
        {
904
        iconThread(receiver);
905
        }
906
      };
907

  
908
    thread.start();
909
    }
910

  
911
///////////////////////////////////////////////////////////////////////////////////////////////////
912

  
913
  public void downloadJSON(final RubikUpdates.UpdateInfo info, final Downloadee downloadee)
856 914
    {
857 915
    initializeStatics();
858
    mUpdatee = updatee;
859 916

  
860 917
    Thread thread = new Thread()
861 918
      {
862 919
      public void run()
863 920
        {
864
        iconThread();
921
        jsonThread(info,downloadee);
865 922
        }
866 923
      };
867 924

  
src/main/java/org/distorted/network/RubikUpdates.java
19 19

  
20 20
package org.distorted.network;
21 21

  
22
import java.io.InputStream;
22 23
import java.util.ArrayList;
23 24
import android.graphics.Bitmap;
24 25
import org.distorted.objects.RubikObjectList;
......
39 40
    public final boolean mUpdateObject;
40 41
    public final boolean mUpdateExtras;
41 42
    public Bitmap mIcon;
43
    public InputStream mObjectStream;
44
    public InputStream mExtrasStream;
42 45

  
43 46
    public UpdateInfo(String shortName, String longName, String description, int objectMinor,
44 47
                      int extrasMinor, int percent, int iconPresent, boolean updateO, boolean updateE)
......
237 240
    return info!=null ? mUrl + info.mObjectShortName + ".png" : null;
238 241
    }
239 242

  
243
///////////////////////////////////////////////////////////////////////////////////////////////////
244

  
245
  public String getURL()
246
    {
247
    return mUrl;
248
    }
249

  
240 250
///////////////////////////////////////////////////////////////////////////////////////////////////
241 251

  
242 252
  public void setCompletedIcon(int ordinal, Bitmap icon)
src/main/java/org/distorted/screens/RubikScreenPlay.java
25 25
import android.content.Context;
26 26
import android.content.SharedPreferences;
27 27
import android.content.res.Resources;
28
import android.graphics.Bitmap;
29 28
import android.graphics.drawable.BitmapDrawable;
30 29
import android.os.Build;
31 30
import android.os.Bundle;
......
745 744
    {
746 745
    android.util.Log.e("D", "Screen: Error receiving update");
747 746
    }
748

  
749
///////////////////////////////////////////////////////////////////////////////////////////////////
750

  
751
  public void iconDownloaded(int ordinal, Bitmap bitmap)
752
    {
753
    // empty
754
    }
755 747
  }
src/main/res/values-de/strings.xml
30 30
    <string name="new_name_try_again">Der von Ihnen ausgewählte Name %s ist bereits vergeben. Versuchen Sie es noch einmal:</string>
31 31
    <string name="downloading">Wird heruntergeladen…</string>
32 32
    <string name="submitting">Einreichen…</string>
33
    <string name="installing">Installieren…</string>
34
    <string name="networkError">Netzwerkfehler</string>
33 35
    <string name="view">Sehen</string>
34 36
    <string name="level_full">Volles Scramble</string>
35 37

  
src/main/res/values-es/strings.xml
30 30
    <string name="new_name_try_again">El nombre que has elegido, %s, ya está en uso. Inténtalo de nuevo:</string>
31 31
    <string name="downloading">Descargando…</string>
32 32
    <string name="submitting">Enviando…</string>
33
    <string name="installing">Instalando…</string>
34
    <string name="networkError">Error de red</string>
33 35
    <string name="view">Ver</string>
34 36
    <string name="level_full">Revuelto Completo</string>
35 37

  
src/main/res/values-fr/strings.xml
30 30
    <string name="new_name_try_again">Le nom que vous avez choisi, %s, est déjà pris. Réessayez :</string>
31 31
    <string name="downloading">Téléchargement…</string>
32 32
    <string name="submitting">Soumission…</string>
33
    <string name="installing">Installation…</string>
34
    <string name="networkError">Erreur réseau</string>
33 35
    <string name="view">Regarder</string>
34 36
    <string name="level_full">Brouillage Complet</string>
35 37

  
src/main/res/values-ja/strings.xml
30 30
    <string name="new_name_try_again">選択した名前%sは既に使用されています。もう一度トライする:</string>
31 31
    <string name="downloading">ダウンロードしています…</string>
32 32
    <string name="submitting">送信しています…</string>
33
    <string name="installing">インストール…</string>
34
    <string name="networkError">ネットワークエラー</string>
33 35
    <string name="view">見る</string>
34 36
    <string name="level_full">フルスクランブル</string>
35 37

  
src/main/res/values-ko/strings.xml
30 30
    <string name="new_name_try_again">선택한 이름 %s이(가) 이미 사용되었습니다. 다시 시도하십시오:</string>
31 31
    <string name="downloading">다운로드 중…</string>
32 32
    <string name="submitting">제출 중…</string>
33
    <string name="installing">설치 중…</string>
34
    <string name="networkError">네트워크 오류</string>
33 35
    <string name="view">보다</string>
34 36
    <string name="level_full">풀 스크램블</string>
35 37

  
src/main/res/values-pl/strings.xml
30 30
    <string name="new_name_try_again">Imię które wybrałeś, %s, jest zajęte. Spróbuj jeszcze raz:</string>
31 31
    <string name="downloading">Ściąganie…</string>
32 32
    <string name="submitting">Przesyłanie…</string>
33
    <string name="installing">Instalowanie…</string>
34
    <string name="networkError">Błąd sieci</string>
33 35
    <string name="view">Zobacz</string>
34 36
    <string name="level_full">Pełne Pomieszanie</string>
35 37

  
src/main/res/values-ru/strings.xml
30 30
    <string name="new_name_try_again">Выбранное вами имя %s уже занято. Попробуй еще раз:</string>
31 31
    <string name="downloading">Загрузка…</string>
32 32
    <string name="submitting">Добавляю…</string>
33
    <string name="installing">Установка…</string>
34
    <string name="networkError">Ошибка сети</string>
33 35
    <string name="view">Смотри</string>
34 36
    <string name="level_full">Полная Схватка</string>
35 37

  
src/main/res/values-zh-rCN/strings.xml
30 30
    <string name="new_name_try_again">您选择的名称,%s,已被使用。请重试:</string>
31 31
    <string name="downloading">正在下载……</string>
32 32
    <string name="submitting">正在提交……</string>
33
    <string name="installing">安装…</string>
34
    <string name="networkError">網絡錯誤</string>
33 35
    <string name="view">看</string>
34 36
    <string name="level_full">级满</string>
35 37

  
src/main/res/values-zh-rTW/strings.xml
30 30
    <string name="new_name_try_again">您選擇的名稱,%s,已被使用。請重試:</string>
31 31
    <string name="downloading">正在下載……</string>
32 32
    <string name="submitting">正在傳送……</string>
33
    <string name="installing">安裝…</string>
34
    <string name="networkError">網絡錯誤</string>
33 35
    <string name="view">看</string>
34 36
    <string name="level_full">級滿</string>
35 37

  
src/main/res/values/strings.xml
31 31
    <string name="new_name_try_again">The name you have chosen, %s, is already taken. Try again:</string>
32 32
    <string name="downloading">Downloading…</string>
33 33
    <string name="submitting">Submitting…</string>
34
    <string name="installing">Installing…</string>
35
    <string name="networkError">Network Error</string>
34 36
    <string name="view">View</string>
35 37
    <string name="level_full">Full Scramble</string>
36 38

  

Also available in: Unified diff