/
DrawingItems.java
172 lines (144 loc) · 4.93 KB
/
DrawingItems.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
package ch.epfl.sweng.SDP.game.drawing;
import android.content.Context;
import android.graphics.Color;
import android.graphics.LightingColorFilter;
import android.os.CountDownTimer;
import android.support.annotation.VisibleForTesting;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import ch.epfl.sweng.SDP.R;
import ch.epfl.sweng.SDP.game.drawing.items.BumpingItem;
import ch.epfl.sweng.SDP.game.drawing.items.Item;
import ch.epfl.sweng.SDP.game.drawing.items.Items;
import ch.epfl.sweng.SDP.game.drawing.items.RandomItemGenerator;
/**
* Utility class containing methods related to the special items mode.
*/
final class DrawingItems {
private static final int INTERVAL = 10000;
private final Context context;
private RelativeLayout paintViewHolder;
private PaintView paintView;
private Map<Item, ImageView> displayedItems;
private final Random random;
private CountDownTimer offlineModeTimer = new CountDownTimer(INTERVAL, INTERVAL) {
public void onTick(long millisUntilFinished) {
// Does nothing
}
public void onFinish() {
convertAndAddItemToLayout(RandomItemGenerator.generateItemForOfflineMode(paintView));
generateItemsForOfflineMode();
}
};
DrawingItems(Context context, RelativeLayout paintViewHolder, PaintView paintView,
Map<Item, ImageView> displayedItems, Random random) {
this.context = context;
this.paintViewHolder = paintViewHolder;
this.paintView = paintView;
this.displayedItems = new HashMap<>(displayedItems);
this.random = random;
}
RelativeLayout getPaintViewHolder() {
return paintViewHolder;
}
Map<Item, ImageView> getDisplayedItems() {
return displayedItems;
}
@VisibleForTesting
PaintView getPaintView() {
return paintView;
}
/**
* Returns the feedback {@link TextView} of the given item.
*
* @param item the given item
* @return the associated feedback TextView
*/
TextView getTextFeedback(Item item) {
return FeedbackTextView.itemTextFeedback(item, paintViewHolder, context);
}
/**
* Checks if the paintViews' circle collided with an item.
*
* @return item that collided, or null.
*/
Item findCollidingElement() {
for (Item item : displayedItems.keySet()) {
if (item.collision(paintView)) {
return item;
}
}
return null;
}
/**
* Generates a random item every INTERVAL seconds.
*/
void generateItems() {
new CountDownTimer(INTERVAL, INTERVAL) {
public void onTick(long millisUntilFinished) {
// Does nothing
}
public void onFinish() {
convertAndAddItemToLayout(RandomItemGenerator.generateItem(paintView));
generateItems();
}
}.start();
}
/**
* Generates a random item ({@link Items#ADD_STARS} excluded) every INTERVAL seconds.
*/
void generateItemsForOfflineMode() {
offlineModeTimer.start();
}
/**
* Stops the timer and the item generation.
*/
void stopOfflineModeItemGeneration() {
offlineModeTimer.cancel();
for (ImageView item : displayedItems.values()) {
paintViewHolder.removeView(item);
}
displayedItems.clear();
}
private void convertAndAddItemToLayout(Item item) {
ImageView imageView = itemToImageView(item);
paintViewHolder.addView(imageView);
displayedItems.put(item, imageView);
}
/**
* Converts an item into an {@link ImageView} to be displayed on the activity.
*
* @param item to be converted
* @return ImageView of the item
*/
private ImageView itemToImageView(Item item) {
ImageView view = new ImageView(context);
view.setX(item.getX() - item.getRadius());
view.setY(item.getY() - item.getRadius());
view.setLayoutParams(new RelativeLayout.LayoutParams(
2 * item.getRadius(),
2 * item.getRadius()));
view.setImageResource(R.drawable.mystery_box);
int color = Color.rgb(getRandomByte(), getRandomByte(), getRandomByte());
view.setColorFilter(new LightingColorFilter(Color.WHITE, color));
if (item instanceof BumpingItem) {
((BumpingItem) item).setImageView(view);
}
return view;
}
private int getRandomByte() {
return random.nextInt(155) + 100;
}
@VisibleForTesting
void addRandomItemForOfflineMode() {
convertAndAddItemToLayout(RandomItemGenerator.generateItemForOfflineMode(paintView));
}
@VisibleForTesting
void addRandomItem() {
convertAndAddItemToLayout(RandomItemGenerator.generateItem(paintView));
}
}