Project

General

Profile

Download (6.85 KB) Statistics
| Branch: | Tag: | Revision:

magiccube / src / main / java / org / distorted / dialogs / RubikDialogScoresPagerAdapter.java @ 7bb30586

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is proprietary software licensed under an EULA which you should have received      //
7
// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
8
///////////////////////////////////////////////////////////////////////////////////////////////////
9

    
10
package org.distorted.dialogs;
11

    
12
import android.os.Bundle;
13
import androidx.annotation.NonNull;
14
import androidx.fragment.app.FragmentActivity;
15
import androidx.viewpager.widget.PagerAdapter;
16
import androidx.viewpager.widget.ViewPager;
17

    
18
import android.util.DisplayMetrics;
19
import android.view.View;
20
import android.view.ViewGroup;
21

    
22
import org.distorted.main.R;
23
import org.distorted.external.RubikScores;
24
import org.distorted.external.RubikNetwork;
25
import org.distorted.objects.RubikObject;
26
import org.distorted.objects.RubikObjectList;
27
import static org.distorted.external.RubikScores.LEVELS_SHOWN;
28

    
29
///////////////////////////////////////////////////////////////////////////////////////////////////
30

    
31
class RubikDialogScoresPagerAdapter extends PagerAdapter implements RubikNetwork.ScoresReceiver
32
  {
33
  private static final int NETWORK_NOT_READY = 0;
34
  private static final int NETWORK_SUCCESS   = 1;
35
  private static final int NETWORK_FAILURE   = 2;
36

    
37
  private final FragmentActivity mAct;
38
  private final RubikDialogScores mDialog;
39
  private final RubikDialogScoresView[] mViews;
40
  private final ViewPager mViewPager;
41
  private final int mNumTabs;
42
  private final boolean mIsSubmitting;
43
  private final int[] mNumLevels;
44
  private String[][][] mCountry, mName;
45
  private int[][][] mTime;
46
  private String mMessage;
47
  private int mNetworkState;
48
  private final Object mObj;
49

    
50
///////////////////////////////////////////////////////////////////////////////////////////////////
51

    
52
  public void receive(final String[][][] country, final String[][][] name, final int[][][] time)
53
    {
54
    synchronized(mObj)
55
      {
56
      RubikDialogScoresThread thr = RubikDialogScoresThread.getInstance();
57
      thr.equip(mAct,mViewPager);
58

    
59
      mNetworkState = NETWORK_SUCCESS;
60
      mCountry = country;
61
      mName = name;
62
      mTime = time;
63

    
64
      for(int t=0; t<mNumTabs; t++)
65
        if( mViews[t]!=null )
66
          {
67
          int num = mNumLevels[t];
68
          String[][] c = country[t];
69
          String[][] n = name[t];
70
          int[][] tm = time[t];
71
          for(int l=0; l<=num; l++)  thr.newWork(t, l, num, mViews[t], c[l], n[l], tm[l]);
72
          }
73
      }
74
    }
75

    
76
///////////////////////////////////////////////////////////////////////////////////////////////////
77

    
78
  public void message(final String mess)
79
    {
80
    mNetworkState = NETWORK_FAILURE;
81
    mMessage = mess;
82

    
83
    mAct.runOnUiThread(new Runnable()
84
      {
85
      @Override
86
      public void run()
87
        {
88
        for(int i=0; i<mNumTabs; i++)
89
          if( mViews[i]!=null ) mViews[i].message(mess);
90
        }
91
      });
92
    }
93

    
94
///////////////////////////////////////////////////////////////////////////////////////////////////
95

    
96
  public void error(final String error)
97
    {
98
    char errorNumber = error.charAt(0);
99

    
100
    switch(errorNumber)
101
      {
102
      case '1': message(mAct.getString(R.string.networkError));
103
                break;
104
      case '2': RubikScores scores = RubikScores.getInstance();
105
                Bundle bundle = new Bundle();
106
                bundle.putString("argument", scores.getName() );
107

    
108
                RubikDialogSetName nameDiag = new RubikDialogSetName();
109
                nameDiag.setArguments(bundle);
110
                nameDiag.show(mAct.getSupportFragmentManager(), null);
111

    
112
                mDialog.dismiss();
113

    
114
                break;
115
      case '3': message("Server error");
116
                break;
117
      default : message("Unexpected error");
118
      }
119
    }
120

    
121
///////////////////////////////////////////////////////////////////////////////////////////////////
122

    
123
  RubikDialogScoresPagerAdapter(FragmentActivity act, ViewPager viewPager, boolean isSubmitting, RubikDialogScores diag)
124
    {
125
    mObj = new Object();
126
    mAct = act;
127
    mDialog = diag;
128
    mNumTabs = RubikObjectList.getNumObjects();
129
    mViews = new RubikDialogScoresView[mNumTabs];
130
    mViewPager = viewPager;
131
    mIsSubmitting = isSubmitting;
132
    mNetworkState = NETWORK_NOT_READY;
133

    
134
    mNumLevels = new int[mNumTabs];
135

    
136
    for(int i=0; i<mNumTabs; i++)
137
      {
138
      RubikObject object = RubikObjectList.getObject(i);
139
      int numScramble = object==null ? 1 : object.getNumScramble();
140
      mNumLevels[i] = Math.min(numScramble-1,LEVELS_SHOWN);
141
      }
142

    
143
    viewPager.setAdapter(this);
144
    viewPager.setOffscreenPageLimit(1);
145

    
146
    RubikNetwork network = RubikNetwork.getInstance();
147

    
148
    if( mIsSubmitting )  network.submit  ( this, mAct );
149
    else                 network.download( this, mAct );
150
    }
151

    
152
///////////////////////////////////////////////////////////////////////////////////////////////////
153

    
154
  @Override
155
  @NonNull
156
  public Object instantiateItem(@NonNull ViewGroup collection, int position)
157
    {
158
    RubikDialogScoresView view;
159
    DisplayMetrics metrics = mAct.getResources().getDisplayMetrics();
160

    
161
    synchronized(mObj)
162
      {
163
      view = new RubikDialogScoresView(mAct, metrics.heightPixels, mIsSubmitting, mNetworkState==NETWORK_SUCCESS );
164
      collection.addView(view);
165

    
166
      if( mNetworkState==NETWORK_SUCCESS )
167
        {
168
        int num = mNumLevels[position];
169
        String[][] c = mCountry[position];
170
        String[][] n = mName[position];
171
        int[][] tm = mTime[position];
172

    
173
        RubikDialogScoresThread thr = RubikDialogScoresThread.getInstance();
174
        thr.equip(mAct,mViewPager);
175

    
176
        for(int l=0; l<=num; l++)  thr.newWork(position, l, num, view, c[l], n[l], tm[l]);
177
        }
178
      else if( mNetworkState==NETWORK_FAILURE )
179
        {
180
        view.message(mMessage);
181
        }
182
      }
183

    
184
    mViews[position] = view;
185

    
186
    return view;
187
    }
188

    
189
///////////////////////////////////////////////////////////////////////////////////////////////////
190

    
191
  @Override
192
  public void destroyItem(ViewGroup collection, int position, @NonNull Object view)
193
    {
194
    collection.removeView((View) view);
195
    mViews[position] = null;
196
    }
197

    
198
///////////////////////////////////////////////////////////////////////////////////////////////////
199

    
200
  @Override
201
  public int getCount()
202
    {
203
    return mNumTabs;
204
    }
205

    
206
///////////////////////////////////////////////////////////////////////////////////////////////////
207

    
208
  @Override
209
  public boolean isViewFromObject(@NonNull View view, @NonNull Object object)
210
    {
211
    return view == object;
212
    }
213
  }
(14-14/24)