Panagiotis Triantafyllou

deh part1

Showing 34 changed files with 2035 additions and 9 deletions
...@@ -2,12 +2,25 @@ package ly.warp.sdk.activities; ...@@ -2,12 +2,25 @@ package ly.warp.sdk.activities;
2 2
3 import android.app.Activity; 3 import android.app.Activity;
4 import android.os.Bundle; 4 import android.os.Bundle;
5 +import android.util.TypedValue;
5 import android.view.View; 6 import android.view.View;
6 import android.widget.ImageView; 7 import android.widget.ImageView;
8 +import android.widget.TextView;
9 +import android.widget.Toast;
10 +
11 +import androidx.recyclerview.widget.LinearLayoutManager;
12 +import androidx.recyclerview.widget.RecyclerView;
7 13
8 import ly.warp.sdk.R; 14 import ly.warp.sdk.R;
15 +import ly.warp.sdk.io.adapters.OfferAdapter;
16 +import ly.warp.sdk.io.models.DummyDataProvider;
17 +import ly.warp.sdk.io.models.OfferCategory;
18 +import ly.warp.sdk.io.models.OfferItem;
19 +import ly.warp.sdk.utils.WarplyManagerHelper;
20 +import ly.warp.sdk.utils.managers.WarplyManager;
21 +import ly.warp.sdk.views.HorizontalSpaceItemDecoration;
9 22
10 -public class HomeActivity extends Activity implements View.OnClickListener { 23 +public class HomeActivity extends Activity implements View.OnClickListener, OfferAdapter.OnOfferClickListener {
11 // =========================================================== 24 // ===========================================================
12 // Constants 25 // Constants
13 // =========================================================== 26 // ===========================================================
...@@ -17,6 +30,39 @@ public class HomeActivity extends Activity implements View.OnClickListener { ...@@ -17,6 +30,39 @@ public class HomeActivity extends Activity implements View.OnClickListener {
17 // =========================================================== 30 // ===========================================================
18 private ImageView mIvBanner; 31 private ImageView mIvBanner;
19 32
33 + // Category sections
34 + private TextView mTvCategoryTopOffers;
35 + private RecyclerView mRvTopOffers;
36 + private OfferAdapter mTopOffersAdapter;
37 +
38 + private TextView mTvCategoryFavorites;
39 + private RecyclerView mRvFavorites;
40 + private OfferAdapter mFavoritesAdapter;
41 +
42 + private TextView mTvCategoryViability;
43 + private RecyclerView mRvViability;
44 + private OfferAdapter mViabilityAdapter;
45 +
46 + private TextView mTvCategoryFamily;
47 + private RecyclerView mRvFamily;
48 + private OfferAdapter mFamilyAdapter;
49 +
50 + private TextView mTvCategoryFoodCoffee;
51 + private RecyclerView mRvFoodCoffee;
52 + private OfferAdapter mFoodCoffeeAdapter;
53 +
54 + private TextView mTvCategoryTravelling;
55 + private RecyclerView mRvTravelling;
56 + private OfferAdapter mTravellingAdapter;
57 +
58 + private TextView mTvCategoryKids;
59 + private RecyclerView mRvKids;
60 + private OfferAdapter mKidsAdapter;
61 +
62 + private TextView mTvCategoryPurchases;
63 + private RecyclerView mRvPurchases;
64 + private OfferAdapter mPurchasesAdapter;
65 +
20 // =========================================================== 66 // ===========================================================
21 // Methods for/from SuperClass/Interfaces 67 // Methods for/from SuperClass/Interfaces
22 // =========================================================== 68 // ===========================================================
...@@ -29,6 +75,16 @@ public class HomeActivity extends Activity implements View.OnClickListener { ...@@ -29,6 +75,16 @@ public class HomeActivity extends Activity implements View.OnClickListener {
29 mIvBanner = findViewById(R.id.banner_icon); 75 mIvBanner = findViewById(R.id.banner_icon);
30 76
31 initViews(); 77 initViews();
78 +
79 + // Setup all category sections
80 + setupTopOffersSection();
81 + setupFavoritesSection();
82 + setupViabilitySection();
83 + setupFamilySection();
84 + setupFoodCoffeeSection();
85 + setupTravellingSection();
86 + setupKidsSection();
87 + setupPurchasesSection();
32 } 88 }
33 89
34 @Override 90 @Override
...@@ -41,16 +97,267 @@ public class HomeActivity extends Activity implements View.OnClickListener { ...@@ -41,16 +97,267 @@ public class HomeActivity extends Activity implements View.OnClickListener {
41 // =========================================================== 97 // ===========================================================
42 98
43 private void initViews() { 99 private void initViews() {
100 + // Initialize banner
44 mIvBanner.setOnClickListener(this); 101 mIvBanner.setOnClickListener(this);
102 +
103 + // Initialize Top Offers section
104 + mTvCategoryTopOffers = findViewById(R.id.tv_recycler_category1);
105 + mRvTopOffers = findViewById(R.id.rl_recycler1);
106 +
107 + // Initialize Favorites section
108 + mTvCategoryFavorites = findViewById(R.id.tv_recycler_category2);
109 + mRvFavorites = findViewById(R.id.rl_recycler2);
110 +
111 + // Initialize Viability section
112 + mTvCategoryViability = findViewById(R.id.tv_recycler_category3);
113 + mRvViability = findViewById(R.id.rl_recycler3);
114 +
115 + // Initialize Family section
116 + mTvCategoryFamily = findViewById(R.id.tv_recycler_category4);
117 + mRvFamily = findViewById(R.id.rl_recycler4);
118 +
119 + // Initialize Food & Coffee section
120 + mTvCategoryFoodCoffee = findViewById(R.id.tv_recycler_category5);
121 + mRvFoodCoffee = findViewById(R.id.rl_recycler5);
122 +
123 + // Initialize Travelling section
124 + mTvCategoryTravelling = findViewById(R.id.tv_recycler_category6);
125 + mRvTravelling = findViewById(R.id.rl_recycler6);
126 +
127 + // Initialize Kids section
128 + mTvCategoryKids = findViewById(R.id.tv_recycler_category7);
129 + mRvKids = findViewById(R.id.rl_recycler7);
130 +
131 + // Initialize Purchases section
132 + mTvCategoryPurchases = findViewById(R.id.tv_recycler_category8);
133 + mRvPurchases = findViewById(R.id.rl_recycler8);
134 + }
135 +
136 + /**
137 + * Set up the Top Offers section with dummy data
138 + */
139 + private void setupTopOffersSection() {
140 + // Get Top Offers data
141 + OfferCategory topOffersCategory = DummyDataProvider.getTopOffers();
142 +
143 + // Set category title with item count
144 + String categoryTitle = topOffersCategory.getName() + " (" + topOffersCategory.getItems().size() + ")";
145 + mTvCategoryTopOffers.setText(categoryTitle);
146 +
147 + // Set up RecyclerView
148 + LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
149 + mRvTopOffers.setLayoutManager(layoutManager);
150 +
151 + // Add spacing between items
152 + int spacingInPixels = (int) TypedValue.applyDimension(
153 + TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics());
154 + mRvTopOffers.addItemDecoration(new HorizontalSpaceItemDecoration(spacingInPixels));
155 +
156 + // Create and set adapter
157 + mTopOffersAdapter = new OfferAdapter(this, topOffersCategory.getItems());
158 + mTopOffersAdapter.setOnOfferClickListener(this);
159 + mRvTopOffers.setAdapter(mTopOffersAdapter);
160 + }
161 +
162 + /**
163 + * Set up the Favorites section with dummy data
164 + */
165 + private void setupFavoritesSection() {
166 + // Get Favorites data
167 + OfferCategory favoritesCategory = DummyDataProvider.getFavorites();
168 +
169 + // Set category title with item count
170 + String categoryTitle = favoritesCategory.getName() + " (" + favoritesCategory.getItems().size() + ")";
171 + mTvCategoryFavorites.setText(categoryTitle);
172 +
173 + // Set up RecyclerView
174 + LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
175 + mRvFavorites.setLayoutManager(layoutManager);
176 +
177 + // Add spacing between items
178 + int spacingInPixels = (int) TypedValue.applyDimension(
179 + TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics());
180 + mRvFavorites.addItemDecoration(new HorizontalSpaceItemDecoration(spacingInPixels));
181 +
182 + // Create and set adapter
183 + mFavoritesAdapter = new OfferAdapter(this, favoritesCategory.getItems());
184 + mFavoritesAdapter.setOnOfferClickListener(this);
185 + mRvFavorites.setAdapter(mFavoritesAdapter);
186 + }
187 +
188 + /**
189 + * Set up the Viability section with dummy data
190 + */
191 + private void setupViabilitySection() {
192 + // Get Viability data
193 + OfferCategory viabilityCategory = DummyDataProvider.getViability();
194 +
195 + // Set category title with item count
196 + String categoryTitle = viabilityCategory.getName() + " (" + viabilityCategory.getItems().size() + ")";
197 + mTvCategoryViability.setText(categoryTitle);
198 +
199 + // Set up RecyclerView
200 + LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
201 + mRvViability.setLayoutManager(layoutManager);
202 +
203 + // Add spacing between items
204 + int spacingInPixels = (int) TypedValue.applyDimension(
205 + TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics());
206 + mRvViability.addItemDecoration(new HorizontalSpaceItemDecoration(spacingInPixels));
207 +
208 + // Create and set adapter
209 + mViabilityAdapter = new OfferAdapter(this, viabilityCategory.getItems());
210 + mViabilityAdapter.setOnOfferClickListener(this);
211 + mRvViability.setAdapter(mViabilityAdapter);
212 + }
213 +
214 + /**
215 + * Set up the Family section with dummy data
216 + */
217 + private void setupFamilySection() {
218 + // Get Family data
219 + OfferCategory familyCategory = DummyDataProvider.getFamily();
220 +
221 + // Set category title with item count
222 + String categoryTitle = familyCategory.getName() + " (" + familyCategory.getItems().size() + ")";
223 + mTvCategoryFamily.setText(categoryTitle);
224 +
225 + // Set up RecyclerView
226 + LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
227 + mRvFamily.setLayoutManager(layoutManager);
228 +
229 + // Add spacing between items
230 + int spacingInPixels = (int) TypedValue.applyDimension(
231 + TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics());
232 + mRvFamily.addItemDecoration(new HorizontalSpaceItemDecoration(spacingInPixels));
233 +
234 + // Create and set adapter
235 + mFamilyAdapter = new OfferAdapter(this, familyCategory.getItems());
236 + mFamilyAdapter.setOnOfferClickListener(this);
237 + mRvFamily.setAdapter(mFamilyAdapter);
238 + }
239 +
240 + /**
241 + * Set up the Food & Coffee section with dummy data
242 + */
243 + private void setupFoodCoffeeSection() {
244 + // Get Food & Coffee data
245 + OfferCategory foodCoffeeCategory = DummyDataProvider.getFoodAndCoffee();
246 +
247 + // Set category title with item count
248 + String categoryTitle = foodCoffeeCategory.getName() + " (" + foodCoffeeCategory.getItems().size() + ")";
249 + mTvCategoryFoodCoffee.setText(categoryTitle);
250 +
251 + // Set up RecyclerView
252 + LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
253 + mRvFoodCoffee.setLayoutManager(layoutManager);
254 +
255 + // Add spacing between items
256 + int spacingInPixels = (int) TypedValue.applyDimension(
257 + TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics());
258 + mRvFoodCoffee.addItemDecoration(new HorizontalSpaceItemDecoration(spacingInPixels));
259 +
260 + // Create and set adapter
261 + mFoodCoffeeAdapter = new OfferAdapter(this, foodCoffeeCategory.getItems());
262 + mFoodCoffeeAdapter.setOnOfferClickListener(this);
263 + mRvFoodCoffee.setAdapter(mFoodCoffeeAdapter);
264 + }
265 +
266 + /**
267 + * Set up the Travelling section with dummy data
268 + */
269 + private void setupTravellingSection() {
270 + // Get Travelling data
271 + OfferCategory travellingCategory = DummyDataProvider.getTravelling();
272 +
273 + // Set category title with item count
274 + String categoryTitle = travellingCategory.getName() + " (" + travellingCategory.getItems().size() + ")";
275 + mTvCategoryTravelling.setText(categoryTitle);
276 +
277 + // Set up RecyclerView
278 + LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
279 + mRvTravelling.setLayoutManager(layoutManager);
280 +
281 + // Add spacing between items
282 + int spacingInPixels = (int) TypedValue.applyDimension(
283 + TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics());
284 + mRvTravelling.addItemDecoration(new HorizontalSpaceItemDecoration(spacingInPixels));
285 +
286 + // Create and set adapter
287 + mTravellingAdapter = new OfferAdapter(this, travellingCategory.getItems());
288 + mTravellingAdapter.setOnOfferClickListener(this);
289 + mRvTravelling.setAdapter(mTravellingAdapter);
290 + }
291 +
292 + /**
293 + * Set up the Kids section with dummy data
294 + */
295 + private void setupKidsSection() {
296 + // Get Kids data
297 + OfferCategory kidsCategory = DummyDataProvider.getKids();
298 +
299 + // Set category title with item count
300 + String categoryTitle = kidsCategory.getName() + " (" + kidsCategory.getItems().size() + ")";
301 + mTvCategoryKids.setText(categoryTitle);
302 +
303 + // Set up RecyclerView
304 + LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
305 + mRvKids.setLayoutManager(layoutManager);
306 +
307 + // Add spacing between items
308 + int spacingInPixels = (int) TypedValue.applyDimension(
309 + TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics());
310 + mRvKids.addItemDecoration(new HorizontalSpaceItemDecoration(spacingInPixels));
311 +
312 + // Create and set adapter
313 + mKidsAdapter = new OfferAdapter(this, kidsCategory.getItems());
314 + mKidsAdapter.setOnOfferClickListener(this);
315 + mRvKids.setAdapter(mKidsAdapter);
316 + }
317 +
318 + /**
319 + * Set up the Purchases section with dummy data
320 + */
321 + private void setupPurchasesSection() {
322 + // Get Purchases data
323 + OfferCategory purchasesCategory = DummyDataProvider.getPurchases();
324 +
325 + // Set category title with item count
326 + String categoryTitle = purchasesCategory.getName() + " (" + purchasesCategory.getItems().size() + ")";
327 + mTvCategoryPurchases.setText(categoryTitle);
328 +
329 + // Set up RecyclerView
330 + LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
331 + mRvPurchases.setLayoutManager(layoutManager);
332 +
333 + // Add spacing between items
334 + int spacingInPixels = (int) TypedValue.applyDimension(
335 + TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics());
336 + mRvPurchases.addItemDecoration(new HorizontalSpaceItemDecoration(spacingInPixels));
337 +
338 + // Create and set adapter
339 + mPurchasesAdapter = new OfferAdapter(this, purchasesCategory.getItems());
340 + mPurchasesAdapter.setOnOfferClickListener(this);
341 + mRvPurchases.setAdapter(mPurchasesAdapter);
45 } 342 }
46 343
47 @Override 344 @Override
48 public void onClick(View v) { 345 public void onClick(View v) {
49 if (v.getId() == R.id.banner_icon) { 346 if (v.getId() == R.id.banner_icon) {
50 - 347 + WarplyManagerHelper.openContest(this);
51 } 348 }
52 } 349 }
53 350
351 + @Override
352 + public void onOfferClick(OfferItem offerItem, int position) {
353 +// Toast.makeText(this, "Offer clicked: " + offerItem.getTitle(), Toast.LENGTH_SHORT).show();
354 + }
355 +
356 + @Override
357 + public void onFavoriteClick(OfferItem offerItem, int position) {
358 +// Toast.makeText(this, "Favorite clicked for: " + offerItem.getTitle(), Toast.LENGTH_SHORT).show();
359 + }
360 +
54 // =========================================================== 361 // ===========================================================
55 // Inner and Anonymous Classes 362 // Inner and Anonymous Classes
56 // =========================================================== 363 // ===========================================================
......
1 +package ly.warp.sdk.io.adapters;
2 +
3 +import android.content.Context;
4 +import android.util.TypedValue;
5 +import android.view.LayoutInflater;
6 +import android.view.View;
7 +import android.view.ViewGroup;
8 +import android.widget.ImageView;
9 +import android.widget.TextView;
10 +
11 +import androidx.annotation.NonNull;
12 +import androidx.recyclerview.widget.RecyclerView;
13 +
14 +import com.bumptech.glide.Glide;
15 +import com.bumptech.glide.load.resource.bitmap.CenterCrop;
16 +
17 +import java.util.List;
18 +
19 +import ly.warp.sdk.R;
20 +import ly.warp.sdk.io.models.DummyDataProvider;
21 +import ly.warp.sdk.io.models.OfferItem;
22 +import ly.warp.sdk.utils.TopRoundedCornersTransformation;
23 +
24 +/**
25 + * Adapter for displaying offer items in a RecyclerView
26 + */
27 +public class OfferAdapter extends RecyclerView.Adapter<OfferAdapter.OfferViewHolder> {
28 +
29 + private final List<OfferItem> offerItems;
30 + private final Context context;
31 + private OnOfferClickListener listener;
32 +
33 + /**
34 + * Interface for handling offer item clicks
35 + */
36 + public interface OnOfferClickListener {
37 + void onOfferClick(OfferItem offerItem, int position);
38 + void onFavoriteClick(OfferItem offerItem, int position);
39 + }
40 +
41 + /**
42 + * Constructor
43 + *
44 + * @param context The context
45 + * @param offerItems List of offer items to display
46 + */
47 + public OfferAdapter(Context context, List<OfferItem> offerItems) {
48 + this.context = context;
49 + this.offerItems = offerItems;
50 + }
51 +
52 + /**
53 + * Set click listener for offer items
54 + *
55 + * @param listener The listener
56 + */
57 + public void setOnOfferClickListener(OnOfferClickListener listener) {
58 + this.listener = listener;
59 + }
60 +
61 + @NonNull
62 + @Override
63 + public OfferViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
64 + View view = LayoutInflater.from(context).inflate(R.layout.demo_item_offer, parent, false);
65 + return new OfferViewHolder(view);
66 + }
67 +
68 + @Override
69 + public void onBindViewHolder(@NonNull OfferViewHolder holder, int position) {
70 + OfferItem offerItem = offerItems.get(position);
71 + holder.bind(offerItem, position);
72 + }
73 +
74 + @Override
75 + public int getItemCount() {
76 + return offerItems.size();
77 + }
78 +
79 + /**
80 + * ViewHolder for offer items
81 + */
82 + class OfferViewHolder extends RecyclerView.ViewHolder {
83 + private final ImageView ivOfferImage;
84 + private final ImageView ivFavorite;
85 + private final ImageView ivLogo;
86 + private final TextView tvPrice;
87 + private final TextView tvTitle;
88 + private final TextView tvDescription;
89 + private final TextView tvValidity;
90 +
91 + OfferViewHolder(@NonNull View itemView) {
92 + super(itemView);
93 + ivOfferImage = itemView.findViewById(R.id.iv_offer_image);
94 + ivFavorite = itemView.findViewById(R.id.iv_favorite);
95 + ivLogo = itemView.findViewById(R.id.iv_logo);
96 + tvPrice = itemView.findViewById(R.id.tv_price);
97 + tvTitle = itemView.findViewById(R.id.tv_title);
98 + tvDescription = itemView.findViewById(R.id.tv_description);
99 + tvValidity = itemView.findViewById(R.id.tv_validity);
100 +
101 + // Set click listeners
102 +// itemView.setOnClickListener(v -> {
103 +// int position = getAdapterPosition();
104 +// if (listener != null && position != RecyclerView.NO_POSITION) {
105 +// listener.onOfferClick(offerItems.get(position), position);
106 +// }
107 +// });
108 +
109 +// ivFavorite.setOnClickListener(v -> {
110 +// int position = getAdapterPosition();
111 +// if (listener != null && position != RecyclerView.NO_POSITION) {
112 +// listener.onFavoriteClick(offerItems.get(position), position);
113 +// }
114 +// });
115 + }
116 +
117 + void bind(OfferItem offerItem, int position) {
118 + // Set offer data to views
119 + tvTitle.setText(offerItem.getTitle());
120 + tvDescription.setText(offerItem.getDescription());
121 + tvPrice.setText(offerItem.getValue());
122 + tvValidity.setText(offerItem.getEndDate());
123 +
124 + // Set heart icon based on category
125 + if (DummyDataProvider.CATEGORY_FAVORITES.equals(offerItem.getCategory())) {
126 + // Use pressed/filled heart for Favorites category
127 + ivFavorite.setImageResource(R.drawable.demo_heart_pressed);
128 + } else {
129 + // Use default/empty heart for other categories
130 + ivFavorite.setImageResource(R.drawable.demo_heart);
131 + }
132 +
133 + // Load images from resources
134 + loadOfferImage(offerItem.getImageUrl());
135 + loadLogoImage(offerItem.getLogoUrl());
136 + }
137 +
138 + /**
139 + * Load offer image with rounded top corners using Glide
140 + *
141 + * @param imageName The image resource name
142 + */
143 + private void loadOfferImage(String imageName) {
144 + try {
145 + // Remove file extension if present
146 + if (imageName.contains(".")) {
147 + imageName = imageName.substring(0, imageName.lastIndexOf('.'));
148 + }
149 +
150 + // Get resource ID by name
151 + int resourceId = context.getResources().getIdentifier(
152 + imageName, "drawable", context.getPackageName());
153 +
154 + if (resourceId != 0) {
155 + // Convert 9dp to pixels
156 + int radiusInPixels = (int) TypedValue.applyDimension(
157 + TypedValue.COMPLEX_UNIT_DIP, 9,
158 + context.getResources().getDisplayMetrics());
159 +
160 + // Load with Glide and apply transformations
161 + Glide.with(context)
162 + .load(resourceId)
163 + .transform(new CenterCrop(), new TopRoundedCornersTransformation(radiusInPixels))
164 + .into(ivOfferImage);
165 + }
166 + } catch (Exception e) {
167 + e.printStackTrace();
168 + }
169 + }
170 +
171 + /**
172 + * Load logo image without transformations
173 + *
174 + * @param imageName The image resource name
175 + */
176 + private void loadLogoImage(String imageName) {
177 + try {
178 + // Remove file extension if present
179 + if (imageName.contains(".")) {
180 + imageName = imageName.substring(0, imageName.lastIndexOf('.'));
181 + }
182 +
183 + // Get resource ID by name
184 + int resourceId = context.getResources().getIdentifier(
185 + imageName, "drawable", context.getPackageName());
186 +
187 + if (resourceId != 0) {
188 + // Load logo normally without transformations
189 + ivLogo.setImageResource(resourceId);
190 + }
191 + } catch (Exception e) {
192 + e.printStackTrace();
193 + }
194 + }
195 + }
196 +}
1 +package ly.warp.sdk.io.models;
2 +
3 +import java.util.ArrayList;
4 +import java.util.Arrays;
5 +import java.util.HashMap;
6 +import java.util.List;
7 +import java.util.Map;
8 +
9 +/**
10 + * Provider class for dummy data to be used in the home screen.
11 + * Contains methods to generate sample data for different offer categories.
12 + */
13 +public class DummyDataProvider {
14 +
15 + // Category IDs
16 + public static final String CATEGORY_TOP_OFFERS = "top_offers";
17 + public static final String CATEGORY_FAVORITES = "favorites";
18 + public static final String CATEGORY_VIABILITY = "viability";
19 + public static final String CATEGORY_FAMILY = "family";
20 + public static final String CATEGORY_FOOD_COFFEE = "food_coffee";
21 + public static final String CATEGORY_TRAVELLING = "travelling";
22 + public static final String CATEGORY_KIDS = "kids";
23 + public static final String CATEGORY_PURCHASES = "purchases";
24 +
25 + // Cache for categories
26 + private static Map<String, OfferCategory> categoryCache = new HashMap<>();
27 +
28 + /**
29 + * Get all categories with their items
30 + *
31 + * @return List of all offer categories with items
32 + */
33 + public static List<OfferCategory> getAllCategories() {
34 + List<OfferCategory> categories = new ArrayList<>();
35 + categories.add(getTopOffers());
36 + categories.add(getFavorites());
37 + categories.add(getViability());
38 + categories.add(getFamily());
39 + categories.add(getFoodAndCoffee());
40 + categories.add(getTravelling());
41 + categories.add(getKids());
42 + categories.add(getPurchases());
43 + return categories;
44 + }
45 +
46 + /**
47 + * Get a specific category by ID
48 + *
49 + * @param categoryId The category ID to retrieve
50 + * @return The requested category or null if not found
51 + */
52 + public static OfferCategory getCategoryById(String categoryId) {
53 + if (categoryCache.containsKey(categoryId)) {
54 + return categoryCache.get(categoryId);
55 + }
56 +
57 + OfferCategory category = null;
58 + switch (categoryId) {
59 + case CATEGORY_TOP_OFFERS:
60 + category = getTopOffers();
61 + break;
62 + case CATEGORY_FAVORITES:
63 + category = getFavorites();
64 + break;
65 + case CATEGORY_VIABILITY:
66 + category = getViability();
67 + break;
68 + case CATEGORY_FAMILY:
69 + category = getFamily();
70 + break;
71 + case CATEGORY_FOOD_COFFEE:
72 + category = getFoodAndCoffee();
73 + break;
74 + case CATEGORY_TRAVELLING:
75 + category = getTravelling();
76 + break;
77 + case CATEGORY_KIDS:
78 + category = getKids();
79 + break;
80 + case CATEGORY_PURCHASES:
81 + category = getPurchases();
82 + break;
83 + }
84 +
85 + if (category != null) {
86 + categoryCache.put(categoryId, category);
87 + }
88 + return category;
89 + }
90 +
91 + /**
92 + * Get Top Offers category with items
93 + *
94 + * @return Top Offers category
95 + */
96 + public static OfferCategory getTopOffers() {
97 + OfferCategory category = new OfferCategory(CATEGORY_TOP_OFFERS, "Top Offers");
98 +
99 + category.addItem(new OfferItem("to1", "50% Έκπτωση σε Πακέτα Κινητής",
100 + "Πάρτε τα πακέτα κινητής στη μισή τιμή μόνο αυτό το μήνα",
101 + "30/06/2025", "50%", "demo_image_dominos.png", "demo_dominos.png", CATEGORY_TOP_OFFERS));
102 +
103 + category.addItem(new OfferItem("to2", "Δωρεάν Εγκατάσταση Τηλεόρασης",
104 + "Επαγγελματική εγκατάσταση με κάθε αγορά νέας τηλεόρασης",
105 + "15/07/2025", "€0", "demo_image_dominos.png", "demo_dominos.png", CATEGORY_TOP_OFFERS));
106 +
107 + category.addItem(new OfferItem("to3", "Αγοράζεις 1 Παίρνεις 1 Δώρο",
108 + "Σε όλα τα είδη ρουχισμού της καλοκαιρινής μας συλλογής",
109 + "31/08/2025", "100%", "demo_image_dominos.png", "demo_dominos.png", CATEGORY_TOP_OFFERS));
110 +
111 + category.addItem(new OfferItem("to4", "30% Έκπτωση στα Τρόφιμα",
112 + "Έκπτωση στην πρώτη σας online παραγγελία τροφίμων",
113 + "10/06/2025", "30%", "demo_image_dominos.png", "demo_dominos.png", CATEGORY_TOP_OFFERS));
114 +
115 + category.addItem(new OfferItem("to5", "Κουπόνι Εστιατορίου €20",
116 + "Με ελάχιστη κατανάλωση €50 σε συνεργαζόμενα εστιατόρια",
117 + "31/07/2025", "€20", "demo_image_dominos.png", "demo_dominos.png", CATEGORY_TOP_OFFERS));
118 +
119 + category.addItem(new OfferItem("to6", "25% Έκπτωση σε Κρατήσεις Ξενοδοχείων",
120 + "Για διαμονές Σαββατοκύριακου κατά τους καλοκαιρινούς μήνες",
121 + "30/09/2025", "25%", "demo_image_dominos.png", "demo_dominos.png", CATEGORY_TOP_OFFERS));
122 +
123 + category.addItem(new OfferItem("to7", "Δωρεάν Παράδοση",
124 + "Σε όλες τις online παραγγελίες άνω των €30",
125 + "Ongoing", "€0", "demo_image_dominos.png", "demo_dominos.png", CATEGORY_TOP_OFFERS));
126 +
127 + category.addItem(new OfferItem("to8", "40% Έκπτωση σε Συνδρομή Γυμναστηρίου",
128 + "Πρώτοι 3 μήνες με μειωμένη τιμή για νέα μέλη",
129 + "31/08/2025", "40%", "demo_image_dominos.png", "demo_dominos.png", CATEGORY_TOP_OFFERS));
130 +
131 + category.addItem(new OfferItem("to9", "Εισιτήρια Κινηματογράφου €10",
132 + "Ειδική τιμή για όλες τις προβολές Δευτέρα έως Πέμπτη",
133 + "31/12/2025", "€10", "demo_image_dominos.png", "demo_dominos.png", CATEGORY_TOP_OFFERS));
134 +
135 + category.addItem(new OfferItem("to10", "75% Έκπτωση στο Δεύτερο Είδος",
136 + "Αγοράστε ένα είδος σε πλήρη τιμή, πάρτε το δεύτερο με 75% έκπτωση",
137 + "15/06/2025", "75%", "demo_image_dominos.png", "demo_dominos.png", CATEGORY_TOP_OFFERS));
138 +
139 + return category;
140 + }
141 +
142 + /**
143 + * Get Favorites category with items
144 + *
145 + * @return Favorites category
146 + */
147 + public static OfferCategory getFavorites() {
148 + OfferCategory category = new OfferCategory(CATEGORY_FAVORITES, "Αγαπημένα");
149 +
150 + category.addItem(new OfferItem("fav1", "Αγαπημένο Καφέ",
151 + "15% έκπτωση στον αγαπημένο σας καφέ κάθε μέρα",
152 + "Ongoing", "15%", "demo_image_avis.png", "demo_avis.png", CATEGORY_FAVORITES));
153 +
154 + category.addItem(new OfferItem("fav2", "Εβδομαδιαία Έκπτωση Σούπερ Μάρκετ",
155 + "10% έκπτωση στα εβδομαδιαία ψώνια σας",
156 + "Recurring", "10%", "demo_image_avis.png", "demo_avis.png", CATEGORY_FAVORITES));
157 +
158 + category.addItem(new OfferItem("fav3", "Αγαπημένο Εστιατόριο",
159 + "Δωρεάν επιδόρπιο με κάθε κυρίως πιάτο",
160 + "31/12/2025", "€0", "demo_image_avis.png", "demo_avis.png", CATEGORY_FAVORITES));
161 +
162 + category.addItem(new OfferItem("fav4", "Συνδρομή Βιβλιοπωλείου",
163 + "20% έκπτωση σε όλες τις αγορές με την κάρτα μέλους",
164 + "Ongoing", "20%", "demo_image_avis.png", "demo_avis.png", CATEGORY_FAVORITES));
165 +
166 + category.addItem(new OfferItem("fav5", "Συνδρομή Γυμναστηρίου",
167 + "€45 μηνιαίως για απεριόριστη πρόσβαση",
168 + "Auto-renews", "€45", "demo_image_avis.png", "demo_avis.png", CATEGORY_FAVORITES));
169 +
170 + // Only keeping 5 items for Favorites category
171 +
172 + return category;
173 + }
174 +
175 + /**
176 + * Get Viability category with items
177 + *
178 + * @return Viability category
179 + */
180 + public static OfferCategory getViability() {
181 + OfferCategory category = new OfferCategory(CATEGORY_VIABILITY, "Βιωσιμότητα");
182 +
183 + category.addItem(new OfferItem("via1", "Έκπτωση Ανανεώσιμης Ενέργειας",
184 + "20% έκπτωση όταν αλλάζετε σε πράσινα ενεργειακά προγράμματα",
185 + "31/12/2025", "20%", "demo_image_musa.png", "demo_musa.png", CATEGORY_VIABILITY));
186 +
187 + category.addItem(new OfferItem("via2", "Φόρτιση Ηλεκτρικών Οχημάτων",
188 + "50% έκπτωση στη φόρτιση σε συνεργαζόμενους σταθμούς",
189 + "30/06/2026", "50%", "demo_image_musa.png", "demo_musa.png", CATEGORY_VIABILITY));
190 +
191 + category.addItem(new OfferItem("via3", "Οικολογικά Προϊόντα",
192 + "Αγοράστε βιώσιμα προϊόντα και κερδίστε €10 έκπτωση",
193 + "Ongoing", "€10", "demo_image_musa.png", "demo_musa.png", CATEGORY_VIABILITY));
194 +
195 + category.addItem(new OfferItem("via4", "Κάρτα Μέσων Μαζικής Μεταφοράς",
196 + "Μηνιαία κάρτα σε μειωμένη τιμή €30",
197 + "Monthly", "€30", "demo_image_musa.png", "demo_musa.png", CATEGORY_VIABILITY));
198 +
199 + category.addItem(new OfferItem("via5", "Ανταμοιβές Ανακύκλωσης",
200 + "Κερδίστε πόντους για ανακύκλωση που μετατρέπονται σε εκπτώσεις",
201 + "Ongoing", "5%", "demo_image_musa.png", "demo_musa.png", CATEGORY_VIABILITY));
202 +
203 + category.addItem(new OfferItem("via6", "Συνδρομή Κοινόχρηστων Ποδηλάτων",
204 + "Ετήσια συνδρομή με 40% έκπτωση",
205 + "31/08/2025", "40%", "demo_image_musa.png", "demo_musa.png", CATEGORY_VIABILITY));
206 +
207 + category.addItem(new OfferItem("via7", "Ενεργειακά Αποδοτικές Συσκευές",
208 + "€50 επιστροφή χρημάτων σε συσκευές με βαθμολογία A+++",
209 + "31/07/2025", "€50", "demo_image_musa.png", "demo_musa.png", CATEGORY_VIABILITY));
210 +
211 + // Only keeping 7 items for Viability category
212 +
213 + return category;
214 + }
215 +
216 + /**
217 + * Get Family category with items
218 + *
219 + * @return Family category
220 + */
221 + public static OfferCategory getFamily() {
222 + OfferCategory category = new OfferCategory(CATEGORY_FAMILY, "Family");
223 +
224 + category.addItem(new OfferItem("fam1", "Οικογενειακό Πακέτο Κινητής",
225 + "Μοιραστείτε δεδομένα σε 4 γραμμές για €60/μήνα",
226 + "Ongoing", "€60", "demo_image_ranch.png", "demo_ranch.png", CATEGORY_FAMILY));
227 +
228 + category.addItem(new OfferItem("fam2", "Εισιτήρια Οικογενειακού Πάρκου",
229 + "30% έκπτωση όταν αγοράζετε 4+ εισιτήρια",
230 + "31/08/2025", "30%", "demo_image_ranch.png", "demo_ranch.png", CATEGORY_FAMILY));
231 +
232 + category.addItem(new OfferItem("fam3", "Παιδιά Τρώνε Δωρεάν",
233 + "Ένα δωρεάν παιδικό γεύμα με κάθε κυρίως πιάτο ενηλίκου",
234 + "Weekdays only", "€0", "demo_image_ranch.png", "demo_ranch.png", CATEGORY_FAMILY));
235 +
236 + category.addItem(new OfferItem("fam4", "Οικογενειακό Πακέτο Σινεμά",
237 + "4 εισιτήρια + ποπκόρν + αναψυκτικά για €35",
238 + "Weekends", "€35", "demo_image_ranch.png", "demo_ranch.png", CATEGORY_FAMILY));
239 +
240 + category.addItem(new OfferItem("fam5", "Οικογενειακή Συνδρομή Γυμναστηρίου",
241 + "50% έκπτωση για επιπλέον μέλη της οικογένειας",
242 + "Annual", "50%", "demo_image_ranch.png", "demo_ranch.png", CATEGORY_FAMILY));
243 +
244 + category.addItem(new OfferItem("fam6", "Οικογενειακή Φωτογράφιση",
245 + "Επαγγελματική φωτογράφιση για €75",
246 + "31/07/2025", "€75", "demo_image_ranch.png", "demo_ranch.png", CATEGORY_FAMILY));
247 +
248 + category.addItem(new OfferItem("fam7", "Οικογενειακό Πακέτο Ασφάλισης",
249 + "Εξοικονομήστε 25% συνδυάζοντας ασφάλεια σπιτιού και αυτοκινήτου",
250 + "31/12/2025", "25%", "demo_image_ranch.png", "demo_ranch.png", CATEGORY_FAMILY));
251 +
252 + category.addItem(new OfferItem("fam8", "Οικογενειακό Πακέτο Διακοπών",
253 + "All-inclusive διαμονή με δωρεάν διαμονή για παιδιά",
254 + "30/09/2025", "€0", "demo_image_ranch.png", "demo_ranch.png", CATEGORY_FAMILY));
255 +
256 + category.addItem(new OfferItem("fam9", "Οικογενειακό Πακέτο Streaming",
257 + "Πολλαπλές υπηρεσίες streaming για €20/μήνα",
258 + "12-month contract", "€20", "demo_image_ranch.png", "demo_ranch.png", CATEGORY_FAMILY));
259 +
260 + category.addItem(new OfferItem("fam10", "Πακέτο Επιστροφής στο Σχολείο",
261 + "40% έκπτωση σε σχολικά είδη με αγορές άνω των €100",
262 + "31/08/2025", "40%", "demo_image_ranch.png", "demo_ranch.png", CATEGORY_FAMILY));
263 +
264 + // Adding 2 more items for Family category (12 total)
265 + category.addItem(new OfferItem("fam11", "Οικογενειακό Οδοντιατρικό Πρόγραμμα",
266 + "Ετήσιοι έλεγχοι για όλη την οικογένεια με 30% έκπτωση",
267 + "31/12/2025", "30%", "demo_image_ranch.png", "demo_ranch.png", CATEGORY_FAMILY));
268 +
269 + category.addItem(new OfferItem("fam12", "Οικογενειακή Βραδιά Παιχνιδιών",
270 + "Αγοράστε 2 επιτραπέζια παιχνίδια και πάρτε 1 δωρεάν",
271 + "Weekend offer", "100%", "demo_image_ranch.png", "demo_ranch.png", CATEGORY_FAMILY));
272 +
273 + return category;
274 + }
275 +
276 + /**
277 + * Get Food and Coffee category with items
278 + *
279 + * @return Food and Coffee category
280 + */
281 + public static OfferCategory getFoodAndCoffee() {
282 + OfferCategory category = new OfferCategory(CATEGORY_FOOD_COFFEE, "Φαγητό και καφές");
283 +
284 + category.addItem(new OfferItem("fc1", "Συνδρομή Καφέ",
285 + "Καθημερινός καφές για €2 με μηνιαία συνδρομή",
286 + "Monthly", "€2", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
287 +
288 + category.addItem(new OfferItem("fc2", "Προσφορά Μεσημεριανού",
289 + "25% έκπτωση στο μενού μεσημεριανού μεταξύ 12-3μμ",
290 + "Weekdays", "25%", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
291 +
292 + category.addItem(new OfferItem("fc3", "Κάρτα Επιβράβευσης Φούρνου",
293 + "10ο γλυκό δωρεάν με την κάρτα επιβράβευσης",
294 + "Ongoing", "100%", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
295 +
296 + category.addItem(new OfferItem("fc4", "Δείπνο για Δύο",
297 + "Γεύμα 3 πιάτων με κρασί για €60",
298 + "31/07/2025", "€60", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
299 +
300 + category.addItem(new OfferItem("fc5", "Παράδοση Φαγητού",
301 + "Δωρεάν παράδοση για παραγγελίες άνω των €20",
302 + "Ongoing", "€0", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
303 +
304 + category.addItem(new OfferItem("fc6", "Εκλεκτοί Κόκκοι Καφέ",
305 + "20% έκπτωση σε premium κόκκους καφέ",
306 + "30/06/2025", "20%", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
307 +
308 + category.addItem(new OfferItem("fc7", "Προσφορά Πρωινού",
309 + "Καφές και γλυκό για €5",
310 + "Daily until 11am", "€5", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
311 +
312 + category.addItem(new OfferItem("fc8", "Gourmet Burger Γεύμα",
313 + "Burger, πατάτες και αναψυκτικό για €12",
314 + "Ongoing", "€12", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
315 +
316 + category.addItem(new OfferItem("fc9", "Γευσιγνωσία Κρασιού",
317 + "50% έκπτωση σε συνεδρίες γευσιγνωσίας κρασιού",
318 + "Thursdays", "50%", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
319 +
320 + category.addItem(new OfferItem("fc10", "Πακέτο Παγωτού",
321 + "Αγοράστε 2 μπάλες και πάρτε 1 δωρεάν",
322 + "Summer offer", "100%", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
323 +
324 + // Adding 14 more items for Food & Coffee category (24 total)
325 + category.addItem(new OfferItem("fc11", "Εστιατόριο Sushi",
326 + "Φάτε όσο sushi θέλετε για €25",
327 + "Tuesday & Thursday", "€25", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
328 +
329 + category.addItem(new OfferItem("fc12", "Χειροποίητο Ψωμί",
330 + "Αγοράστε ένα καρβέλι και πάρτε το δεύτερο στη μισή τιμή",
331 + "Weekends", "50%", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
332 +
333 + category.addItem(new OfferItem("fc13", "Κόκκοι Καφέ",
334 + "15% έκπτωση σε premium κόκκους μονής προέλευσης",
335 + "Limited stock", "15%", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
336 +
337 + category.addItem(new OfferItem("fc14", "Βραδιά Πίτσας",
338 + "Οικογενειακή πίτσα με 2 υλικά για €12",
339 + "Every Wednesday", "€12", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
340 +
341 + category.addItem(new OfferItem("fc15", "Μπαρ με Smoothies",
342 + "Αγοράστε ένα smoothie και πάρτε το δεύτερο στη μισή τιμή",
343 + "Morning hours", "50%", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
344 +
345 + category.addItem(new OfferItem("fc16", "Προσφορά Ζυμαρικών",
346 + "Όλα τα πιάτα ζυμαρικών €10 με δωρεάν ψωμί",
347 + "Monday-Thursday", "€10", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
348 +
349 + category.addItem(new OfferItem("fc17", "Πιατέλα Επιδορπίων",
350 + "Επιλογή από 5 επιδόρπια για μοίρασμα για €15",
351 + "After 8pm", "€15", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
352 +
353 + category.addItem(new OfferItem("fc18", "Μπουφές Πρωινού",
354 + "Πρωινό όσο θέλετε για €12.99",
355 + "7am-10am daily", "€12.99", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
356 +
357 + category.addItem(new OfferItem("fc19", "Εξειδικευμένα Τσάγια",
358 + "Αγοράστε οποιοδήποτε τσάι και πάρτε ένα γλυκό δωρεάν",
359 + "Afternoon tea time", "€0", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
360 +
361 + category.addItem(new OfferItem("fc20", "Χορτοφαγικό Μενού",
362 + "20% έκπτωση σε όλα τα χορτοφαγικά κυρίως πιάτα",
363 + "All week", "20%", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
364 +
365 + category.addItem(new OfferItem("fc21", "Γευσιγνωσία Μπύρας",
366 + "Δοκιμή 4 χειροποίητων μπυρών για €8",
367 + "Happy hour", "€8", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
368 +
369 + category.addItem(new OfferItem("fc22", "Πιατέλα Θαλασσινών",
370 + "Πιατέλα θαλασσινών για δύο με κρασί €45",
371 + "Friday & Saturday", "€45", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
372 +
373 + category.addItem(new OfferItem("fc23", "Προσφορά Brunch",
374 + "Brunch με mimosa για €18",
375 + "Weekends 11am-3pm", "€18", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
376 +
377 + category.addItem(new OfferItem("fc24", "Gourmet Σάντουιτς",
378 + "Gourmet σάντουιτς με συνδυασμό σούπας €9.50",
379 + "Lunch special", "€9.50", "demo_image_coffee.png", "demo_coffee.png", CATEGORY_FOOD_COFFEE));
380 +
381 + return category;
382 + }
383 +
384 + /**
385 + * Get Travelling category with items
386 + *
387 + * @return Travelling category
388 + */
389 + public static OfferCategory getTravelling() {
390 + OfferCategory category = new OfferCategory(CATEGORY_TRAVELLING, "Απόδραση");
391 +
392 + category.addItem(new OfferItem("tr1", "Έκπτωση Αεροπορικών",
393 + "15% έκπτωση σε διεθνείς πτήσεις",
394 + "31/08/2025", "15%", "demo_image_ninemia.png", "demo_ninemia.png", CATEGORY_TRAVELLING));
395 +
396 + category.addItem(new OfferItem("tr2", "Διαμονή σε Ξενοδοχείο",
397 + "3 νύχτες στην τιμή των 2 σε συνεργαζόμενα ξενοδοχεία",
398 + "30/09/2025", "33%", "demo_image_ninemia.png", "demo_ninemia.png", CATEGORY_TRAVELLING));
399 +
400 + category.addItem(new OfferItem("tr3", "Ενοικίαση Αυτοκινήτου",
401 + "€25 έκπτωση σε εβδομαδιαίες ενοικιάσεις αυτοκινήτων",
402 + "31/12/2025", "€25", "demo_image_ninemia.png", "demo_ninemia.png", CATEGORY_TRAVELLING));
403 +
404 + category.addItem(new OfferItem("tr4", "Ταξιδιωτική Ασφάλεια",
405 + "20% έκπτωση σε ετήσια ταξιδιωτική ασφάλεια",
406 + "30/06/2025", "20%", "demo_image_ninemia.png", "demo_ninemia.png", CATEGORY_TRAVELLING));
407 +
408 + category.addItem(new OfferItem("tr5", "Ξενάγηση Πόλης",
409 + "Αγοράστε ένα εισιτήριο και πάρτε ένα δωρεάν",
410 + "31/07/2025", "100%", "demo_image_ninemia.png", "demo_ninemia.png", CATEGORY_TRAVELLING));
411 +
412 + category.addItem(new OfferItem("tr6", "Πρόσβαση σε Lounge Αεροδρομίου",
413 + "€15 για πρόσβαση σε lounge ανεξαρτήτως κατηγορίας εισιτηρίου",
414 + "Ongoing", "€15", "demo_image_ninemia.png", "demo_ninemia.png", CATEGORY_TRAVELLING));
415 +
416 + category.addItem(new OfferItem("tr7", "Έκπτωση Κρουαζιέρας",
417 + "30% έκπτωση σε επιλεγμένα πακέτα κρουαζιέρας",
418 + "31/08/2025", "30%", "demo_image_ninemia.png", "demo_ninemia.png", CATEGORY_TRAVELLING));
419 +
420 + category.addItem(new OfferItem("tr8", "Αξεσουάρ Ταξιδιού",
421 + "Αγοράστε 2 και πάρτε 1 δωρεάν σε είδη ταξιδιού",
422 + "While stocks last", "100%", "demo_image_ninemia.png", "demo_ninemia.png", CATEGORY_TRAVELLING));
423 +
424 + category.addItem(new OfferItem("tr9", "Μεταφορά από/προς Αεροδρόμιο",
425 + "€10 έκπτωση σε ιδιωτικές μεταφορές από/προς αεροδρόμιο",
426 + "31/12/2025", "€10", "demo_image_ninemia.png", "demo_ninemia.png", CATEGORY_TRAVELLING));
427 +
428 + // Only keeping 9 items for Travelling category
429 +
430 + return category;
431 + }
432 +
433 + /**
434 + * Get Kids category with items
435 + *
436 + * @return Kids category
437 + */
438 + public static OfferCategory getKids() {
439 + OfferCategory category = new OfferCategory(CATEGORY_KIDS, "Παιδί");
440 +
441 + category.addItem(new OfferItem("kid1", "Έκπτωση σε Κατάστημα Παιχνιδιών",
442 + "25% έκπτωση σε όλα τα παιχνίδια αυτό το Σαββατοκύριακο",
443 + "Sunday", "25%", "demo_image_moustakas.png", "demo_moustakas.png", CATEGORY_KIDS));
444 +
445 + category.addItem(new OfferItem("kid2", "Παιδικά Ρούχα",
446 + "Αγοράστε 2 και πάρτε 1 δωρεάν σε παιδικά ρούχα",
447 + "31/07/2025", "100%", "demo_image_moustakas.png", "demo_moustakas.png", CATEGORY_KIDS));
448 +
449 + category.addItem(new OfferItem("kid3", "Εσωτερική Παιδική Χαρά",
450 + "€5 είσοδος για απεριόριστο παιχνίδι",
451 + "Weekdays", "€5", "demo_image_moustakas.png", "demo_moustakas.png", CATEGORY_KIDS));
452 +
453 + category.addItem(new OfferItem("kid4", "Παιδικά Βιβλία",
454 + "30% έκπτωση σε εκπαιδευτικά βιβλία",
455 + "30/06/2025", "30%", "demo_image_moustakas.png", "demo_moustakas.png", CATEGORY_KIDS));
456 +
457 + category.addItem(new OfferItem("kid5", "Μαθήματα Κολύμβησης",
458 + "Πρώτο μάθημα δωρεάν, μετά €10 ανά μάθημα",
459 + "Summer offer", "€0", "demo_image_moustakas.png", "demo_moustakas.png", CATEGORY_KIDS));
460 +
461 + category.addItem(new OfferItem("kid6", "Παιδικό Κούρεμα",
462 + "Ειδική τιμή €8 για παιδιά κάτω των 12 ετών",
463 + "Ongoing", "€8", "demo_image_moustakas.png", "demo_moustakas.png", CATEGORY_KIDS));
464 +
465 + category.addItem(new OfferItem("kid7", "Παιδικό Μουσείο",
466 + "Οικογενειακό εισιτήριο για €25 (έως 4 άτομα)",
467 + "31/12/2025", "€25", "demo_image_moustakas.png", "demo_moustakas.png", CATEGORY_KIDS));
468 +
469 + category.addItem(new OfferItem("kid8", "Παιδικό Κουτί Γεύματος",
470 + "20% έκπτωση σε συνδρομή υγιεινών γευμάτων",
471 + "First 3 months", "20%", "demo_image_moustakas.png", "demo_moustakas.png", CATEGORY_KIDS));
472 +
473 + category.addItem(new OfferItem("kid9", "Είδη Ζωγραφικής",
474 + "40% έκπτωση σε είδη τέχνης και χειροτεχνίας",
475 + "Back to school offer", "40%", "demo_image_moustakas.png", "demo_moustakas.png", CATEGORY_KIDS));
476 +
477 + category.addItem(new OfferItem("kid10", "Παιδικός Αθλητικός Εξοπλισμός",
478 + "Αγοράστε πλήρες σετ και εξοικονομήστε €15",
479 + "31/08/2025", "€15", "demo_image_moustakas.png", "demo_moustakas.png", CATEGORY_KIDS));
480 +
481 + // Adding 1 more item for Kids category (11 total)
482 + category.addItem(new OfferItem("kid11", "Μαθήματα Προγραμματισμού για Παιδιά",
483 + "Πρώτο μάθημα δωρεάν για παιδιά 8-12 ετών",
484 + "New enrollments", "€0", "demo_image_moustakas.png", "demo_moustakas.png", CATEGORY_KIDS));
485 +
486 + return category;
487 + }
488 +
489 + /**
490 + * Get Purchases category with items
491 + *
492 + * @return Purchases category
493 + */
494 + public static OfferCategory getPurchases() {
495 + OfferCategory category = new OfferCategory(CATEGORY_PURCHASES, "Αγορές");
496 +
497 + category.addItem(new OfferItem("pur1", "Κατάστημα Ηλεκτρονικών",
498 + "€50 έκπτωση σε αγορές άνω των €300",
499 + "30/06/2025", "€50", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
500 +
501 + category.addItem(new OfferItem("pur2", "Προσφορά Επίπλων",
502 + "Έως και 40% έκπτωση σε επιλεγμένα έπιπλα",
503 + "While stocks last", "40%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
504 +
505 + category.addItem(new OfferItem("pur3", "Online Αγορές",
506 + "15% έκπτωση στην πρώτη σας αγορά με κωδικό",
507 + "New customers", "15%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
508 +
509 + category.addItem(new OfferItem("pur4", "Αναβάθμιση Smartphone",
510 + "Ανταλλάξτε το παλιό σας τηλέφωνο και πάρτε €100 επιπλέον αξία",
511 + "31/07/2025", "€100", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
512 +
513 + category.addItem(new OfferItem("pur5", "Οικιακές Συσκευές",
514 + "Δωρεάν παράδοση και εγκατάσταση",
515 + "On purchases over €500", "€0", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
516 +
517 + category.addItem(new OfferItem("pur6", "Αθλητικά Ρούχα",
518 + "30% έκπτωση σε παπούτσια για τρέξιμο και ρούχα",
519 + "31/08/2025", "30%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
520 +
521 + category.addItem(new OfferItem("pur7", "Προϊόντα Ομορφιάς",
522 + "Αγοράστε 3 και πάρτε 1 δωρεάν στη σειρά περιποίησης δέρματος",
523 + "30/09/2025", "100%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
524 +
525 + category.addItem(new OfferItem("pur8", "Συσκευές Κουζίνας",
526 + "25% έκπτωση σε συσκευές κουζίνας",
527 + "Weekend sale", "25%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
528 +
529 + category.addItem(new OfferItem("pur9", "Έπιπλα Κήπου",
530 + "Εκκαθάριση τέλους σεζόν - 50% έκπτωση",
531 + "Until sold out", "50%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
532 +
533 + category.addItem(new OfferItem("pur10", "Αξεσουάρ Τεχνολογίας",
534 + "Αγοράστε 2 αξεσουάρ και εξοικονομήστε €10",
535 + "31/12/2025", "€10", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
536 +
537 + // Adding 22 more items for Purchases category (32 total)
538 + category.addItem(new OfferItem("pur11", "Γυαλιά Ηλίου Επώνυμων Οίκων",
539 + "30% έκπτωση σε γυαλιά ηλίου επώνυμων οίκων",
540 + "Summer sale", "30%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
541 +
542 + category.addItem(new OfferItem("pur12", "Αναβάθμιση Laptop",
543 + "Ανταλλάξτε το παλιό σας laptop και πάρτε €150 έκπτωση",
544 + "Back to school", "€150", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
545 +
546 + category.addItem(new OfferItem("pur13", "Σετ Κλινοσκεπασμάτων",
547 + "Αγοράστε ένα σετ κλινοσκεπασμάτων και πάρτε το δεύτερο στη μισή τιμή",
548 + "Home sale", "50%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
549 +
550 + category.addItem(new OfferItem("pur14", "Συσκευές Έξυπνου Σπιτιού",
551 + "20% έκπτωση σε όλα τα προϊόντα έξυπνου σπιτιού",
552 + "Tech week", "20%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
553 +
554 + category.addItem(new OfferItem("pur15", "Έπιπλα Εξωτερικού Χώρου",
555 + "Έως και 40% έκπτωση σε σετ επίπλων εξωτερικού χώρου",
556 + "Garden sale", "40%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
557 +
558 + category.addItem(new OfferItem("pur16", "Ρολόγια Επώνυμων Οίκων",
559 + "15% έκπτωση σε πολυτελή ρολόγια",
560 + "Limited time", "15%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
561 +
562 + category.addItem(new OfferItem("pur17", "Συσκευές Κουζίνας",
563 + "Αγοράστε 2 μικρές συσκευές και πάρτε 1 δωρεάν",
564 + "Kitchen sale", "100%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
565 +
566 + category.addItem(new OfferItem("pur18", "Εξοπλισμός Γυμναστικής",
567 + "25% έκπτωση σε εξοπλισμό γυμναστικής για το σπίτι",
568 + "Fitness sale", "25%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
569 +
570 + category.addItem(new OfferItem("pur19", "Πολυτελή Κλινοσκεπάσματα",
571 + "Σεντόνια από αιγυπτιακό βαμβάκι με 30% έκπτωση",
572 + "Bedroom essentials", "30%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
573 +
574 + category.addItem(new OfferItem("pur20", "Τσάντες Επώνυμων Οίκων",
575 + "Έως και 25% έκπτωση σε επιλεγμένες επώνυμες τσάντες",
576 + "Accessory sale", "25%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
577 +
578 + category.addItem(new OfferItem("pur21", "Έξυπνες Τηλεοράσεις",
579 + "€100 έκπτωση σε τηλεοράσεις 55\" και μεγαλύτερες",
580 + "Entertainment sale", "€100", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
581 +
582 + category.addItem(new OfferItem("pur22", "Χειμερινά Ρούχα",
583 + "Αγοράστε 3 χειμερινά είδη και πάρτε 1 δωρεάν",
584 + "Winter collection", "100%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
585 +
586 + category.addItem(new OfferItem("pur23", "Σετ Μαγειρικών Σκευών",
587 + "Επαγγελματικά σετ μαγειρικών σκευών με 40% έκπτωση",
588 + "Kitchen essentials", "40%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
589 +
590 + category.addItem(new OfferItem("pur24", "Ασύρματα Ακουστικά",
591 + "Premium ασύρματα ακουστικά με €30 έκπτωση",
592 + "Audio sale", "€30", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
593 +
594 + category.addItem(new OfferItem("pur25", "Πολυτελή Αρώματα",
595 + "25% έκπτωση σε αρώματα επώνυμων οίκων",
596 + "Beauty sale", "25%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
597 +
598 + category.addItem(new OfferItem("pur26", "Κονσόλες Παιχνιδιών",
599 + "Δωρεάν παιχνίδι με την αγορά κονσόλας",
600 + "Gaming sale", "€60", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
601 +
602 + category.addItem(new OfferItem("pur27", "Είδη Μπάνιου",
603 + "30% έκπτωση σε είδη ανακαίνισης μπάνιου",
604 + "Home improvement", "30%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
605 +
606 + category.addItem(new OfferItem("pur28", "Εξοπλισμός Κάμπινγκ",
607 + "Αγοράστε σκηνή και πάρτε υπνόσακο στη μισή τιμή",
608 + "Outdoor sale", "50%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
609 +
610 + category.addItem(new OfferItem("pur29", "Έπιπλα Γραφείου",
611 + "Εργονομικές καρέκλες γραφείου με 20% έκπτωση",
612 + "Work from home", "20%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
613 +
614 + category.addItem(new OfferItem("pur30", "Προσφορά Κοσμημάτων",
615 + "40% έκπτωση σε συλλογή ασημένιων κοσμημάτων",
616 + "Accessory sale", "40%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
617 +
618 + category.addItem(new OfferItem("pur31", "Έξυπνα Ρολόγια",
619 + "Τελευταία μοντέλα έξυπνων ρολογιών με €50 έκπτωση",
620 + "Tech sale", "€50", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
621 +
622 + category.addItem(new OfferItem("pur32", "Σετ Αποσκευών",
623 + "Premium σετ αποσκευών με 35% έκπτωση",
624 + "Travel essentials", "35%", "demo_image_migato.png", "demo_migato.png", CATEGORY_PURCHASES));
625 +
626 + return category;
627 + }
628 +}
1 +package ly.warp.sdk.io.models;
2 +
3 +import java.io.Serializable;
4 +import java.util.ArrayList;
5 +import java.util.List;
6 +
7 +/**
8 + * Model class representing a category of offers with its associated items.
9 + */
10 +public class OfferCategory implements Serializable {
11 + private String id;
12 + private String name;
13 + private List<OfferItem> items;
14 +
15 + /**
16 + * Default constructor
17 + */
18 + public OfferCategory() {
19 + this.items = new ArrayList<>();
20 + }
21 +
22 + /**
23 + * Constructor with id and name
24 + *
25 + * @param id Unique identifier for the category
26 + * @param name Display name of the category
27 + */
28 + public OfferCategory(String id, String name) {
29 + this.id = id;
30 + this.name = name;
31 + this.items = new ArrayList<>();
32 + }
33 +
34 + /**
35 + * Full constructor
36 + *
37 + * @param id Unique identifier for the category
38 + * @param name Display name of the category
39 + * @param items List of offer items in this category
40 + */
41 + public OfferCategory(String id, String name, List<OfferItem> items) {
42 + this.id = id;
43 + this.name = name;
44 + this.items = items != null ? items : new ArrayList<>();
45 + }
46 +
47 + // Getters and Setters
48 +
49 + public String getId() {
50 + return id;
51 + }
52 +
53 + public void setId(String id) {
54 + this.id = id;
55 + }
56 +
57 + public String getName() {
58 + return name;
59 + }
60 +
61 + public void setName(String name) {
62 + this.name = name;
63 + }
64 +
65 + public List<OfferItem> getItems() {
66 + return items;
67 + }
68 +
69 + public void setItems(List<OfferItem> items) {
70 + this.items = items != null ? items : new ArrayList<>();
71 + }
72 +
73 + /**
74 + * Add a single item to the category
75 + *
76 + * @param item The offer item to add
77 + */
78 + public void addItem(OfferItem item) {
79 + if (items == null) {
80 + items = new ArrayList<>();
81 + }
82 + items.add(item);
83 + }
84 +
85 + /**
86 + * Get the number of items in this category
87 + *
88 + * @return The count of items
89 + */
90 + public int getItemCount() {
91 + return items != null ? items.size() : 0;
92 + }
93 +
94 + /**
95 + * Get the formatted name with item count
96 + *
97 + * @return Category name with item count in parentheses
98 + */
99 + public String getFormattedName() {
100 + return name + " (" + getItemCount() + ")";
101 + }
102 +}
1 +package ly.warp.sdk.io.models;
2 +
3 +import java.io.Serializable;
4 +
5 +/**
6 + * Model class representing an offer item to be displayed in the home screen.
7 + */
8 +public class OfferItem implements Serializable {
9 + private String id;
10 + private String title;
11 + private String description;
12 + private String endDate;
13 + private String value;
14 + private String imageUrl;
15 + private String logoUrl;
16 + private String category;
17 +
18 + /**
19 + * Default constructor
20 + */
21 + public OfferItem() {
22 + }
23 +
24 + /**
25 + * Full constructor for creating an offer item
26 + *
27 + * @param id Unique identifier for the offer
28 + * @param title Title of the offer
29 + * @param description Description of the offer
30 + * @param endDate End date of the offer (formatted as string)
31 + * @param value Value of the offer (formatted as string, e.g., "50%", "€20")
32 + * @param imageUrl URL or resource name for the offer image
33 + * @param logoUrl URL or resource name for the merchant logo
34 + * @param category Category this offer belongs to
35 + */
36 + public OfferItem(String id, String title, String description, String endDate,
37 + String value, String imageUrl, String logoUrl, String category) {
38 + this.id = id;
39 + this.title = title;
40 + this.description = description;
41 + this.endDate = endDate;
42 + this.value = value;
43 + this.imageUrl = imageUrl;
44 + this.logoUrl = logoUrl;
45 + this.category = category;
46 + }
47 +
48 + // Getters and Setters
49 +
50 + public String getId() {
51 + return id;
52 + }
53 +
54 + public void setId(String id) {
55 + this.id = id;
56 + }
57 +
58 + public String getTitle() {
59 + return title;
60 + }
61 +
62 + public void setTitle(String title) {
63 + this.title = title;
64 + }
65 +
66 + public String getDescription() {
67 + return description;
68 + }
69 +
70 + public void setDescription(String description) {
71 + this.description = description;
72 + }
73 +
74 + public String getEndDate() {
75 + return endDate;
76 + }
77 +
78 + public void setEndDate(String endDate) {
79 + this.endDate = endDate;
80 + }
81 +
82 + public String getValue() {
83 + return value;
84 + }
85 +
86 + public void setValue(String value) {
87 + this.value = value;
88 + }
89 +
90 + public String getImageUrl() {
91 + return imageUrl;
92 + }
93 +
94 + public void setImageUrl(String imageUrl) {
95 + this.imageUrl = imageUrl;
96 + }
97 +
98 + public String getLogoUrl() {
99 + return logoUrl;
100 + }
101 +
102 + public void setLogoUrl(String logoUrl) {
103 + this.logoUrl = logoUrl;
104 + }
105 +
106 + public String getCategory() {
107 + return category;
108 + }
109 +
110 + public void setCategory(String category) {
111 + this.category = category;
112 + }
113 +
114 + /**
115 + * Returns the value (already formatted with % or € symbol)
116 + * @return Value string
117 + */
118 + public String getFormattedValue() {
119 + return value;
120 + }
121 +}
1 +package ly.warp.sdk.utils;
2 +
3 +import android.graphics.Bitmap;
4 +import android.graphics.BitmapShader;
5 +import android.graphics.Canvas;
6 +import android.graphics.Paint;
7 +import android.graphics.Path;
8 +import android.graphics.RectF;
9 +import android.graphics.Shader;
10 +
11 +import androidx.annotation.NonNull;
12 +
13 +import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
14 +import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
15 +
16 +import java.security.MessageDigest;
17 +
18 +/**
19 + * Glide transformation to round only the top corners of an image
20 + */
21 +public class TopRoundedCornersTransformation extends BitmapTransformation {
22 + private static final String ID = "ly.warp.sdk.utils.TopRoundedCornersTransformation";
23 + private final int radius;
24 +
25 + /**
26 + * Constructor
27 + *
28 + * @param radius Corner radius in pixels
29 + */
30 + public TopRoundedCornersTransformation(int radius) {
31 + this.radius = radius;
32 + }
33 +
34 + @Override
35 + protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {
36 + return roundTopCorners(pool, toTransform);
37 + }
38 +
39 + private Bitmap roundTopCorners(BitmapPool pool, Bitmap source) {
40 + if (source == null) return null;
41 +
42 + Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
43 + if (result == null) {
44 + result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
45 + }
46 +
47 + Canvas canvas = new Canvas(result);
48 + Paint paint = new Paint();
49 + paint.setAntiAlias(true);
50 + paint.setShader(new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
51 +
52 + // Create path with rounded top corners
53 + Path path = new Path();
54 + RectF rectF = new RectF(0, 0, source.getWidth(), source.getHeight());
55 + float[] radii = new float[]{
56 + radius, radius, // top-left
57 + radius, radius, // top-right
58 + 0, 0, // bottom-right
59 + 0, 0 // bottom-left
60 + };
61 + path.addRoundRect(rectF, radii, Path.Direction.CW);
62 +
63 + // Draw rounded rectangle
64 + canvas.drawPath(path, paint);
65 +
66 + return result;
67 + }
68 +
69 + @Override
70 + public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {
71 + messageDigest.update((ID + radius).getBytes());
72 + }
73 +
74 + @Override
75 + public boolean equals(Object o) {
76 + if (this == o) return true;
77 + if (o == null || getClass() != o.getClass()) return false;
78 + TopRoundedCornersTransformation that = (TopRoundedCornersTransformation) o;
79 + return radius == that.radius;
80 + }
81 +
82 + @Override
83 + public int hashCode() {
84 + return ID.hashCode() + radius;
85 + }
86 +}
...@@ -167,6 +167,30 @@ public class WarplyManagerHelper { ...@@ -167,6 +167,30 @@ public class WarplyManagerHelper {
167 context.startActivity(WarpViewActivity.createIntentFromURL(context, (WarplyProperty.getSupermarketsUrl(context) + WarpConstants.SUPERMARKETS_MAP))); 167 context.startActivity(WarpViewActivity.createIntentFromURL(context, (WarplyProperty.getSupermarketsUrl(context) + WarpConstants.SUPERMARKETS_MAP)));
168 } 168 }
169 169
170 + public static void openContest(Context context) {
171 + final String mContestUrl = "https://warply.s3.amazonaws.com/dei/campaigns/DehEasterContest_stage/index.html";
172 + JSONObject params = new JSONObject();
173 + try {
174 + params.putOpt("web_id", WarpUtils.getWebId(context));
175 + params.putOpt("app_uuid", WarplyProperty.getAppUuid(context));
176 + params.putOpt("api_key", WarpUtils.getApiKey(context));
177 + params.putOpt("session_uuid", "");
178 + params.putOpt("access_token", WarplyDBHelper.getInstance(context).getAuthValue("access_token"));
179 + params.putOpt("refresh_token", WarplyDBHelper.getInstance(context).getAuthValue("refresh_token"));
180 + params.putOpt("client_id", WarplyDBHelper.getInstance(context).getClientValue("client_id"));
181 + params.putOpt("client_secret", WarplyDBHelper.getInstance(context).getClientValue("client_secret"));
182 + params.putOpt("map", "true");
183 + params.putOpt("lan", WarpUtils.getApplicationLocale(context));
184 + params.putOpt("dark", String.valueOf(WarpUtils.getIsDarkModeEnabled(context)));
185 + } catch (JSONException e) {
186 + e.printStackTrace();
187 + }
188 +
189 + WarpUtils.setWebviewParams(context, params);
190 +
191 + context.startActivity(WarpViewActivity.createIntentFromURL(context, mContestUrl));
192 + }
193 +
170 // =========================================================== 194 // ===========================================================
171 // Inner and Anonymous Classes 195 // Inner and Anonymous Classes
172 // =========================================================== 196 // ===========================================================
......
1 +package ly.warp.sdk.views;
2 +
3 +import android.graphics.Rect;
4 +import android.view.View;
5 +
6 +import androidx.annotation.NonNull;
7 +import androidx.recyclerview.widget.RecyclerView;
8 +
9 +/**
10 + * ItemDecoration for adding horizontal spacing between RecyclerView items.
11 + * Adds spacing to the right of each item except the last one.
12 + */
13 +public class HorizontalSpaceItemDecoration extends RecyclerView.ItemDecoration {
14 + private final int spaceWidth;
15 +
16 + /**
17 + * Constructor
18 + *
19 + * @param spaceWidth Space width in pixels
20 + */
21 + public HorizontalSpaceItemDecoration(int spaceWidth) {
22 + this.spaceWidth = spaceWidth;
23 + }
24 +
25 + @Override
26 + public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
27 + // Add spacing to the right of each item except the last one
28 + int position = parent.getChildAdapterPosition(view);
29 + if (position != RecyclerView.NO_POSITION && position != parent.getAdapter().getItemCount() - 1) {
30 + outRect.right = spaceWidth;
31 + }
32 + }
33 +}
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<shape xmlns:android="http://schemas.android.com/apk/res/android"
3 + android:shape="oval">
4 + <corners android:radius="1000dp" />
5 +
6 + <solid android:color="@color/pink" />
7 +</shape>
...\ No newline at end of file ...\ No newline at end of file
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<shape xmlns:android="http://schemas.android.com/apk/res/android"
3 + android:shape="rectangle">
4 + <corners
5 + android:bottomLeftRadius="0dp"
6 + android:bottomRightRadius="0dp"
7 + android:topLeftRadius="9dp"
8 + android:topRightRadius="9dp" />
9 +
10 + <solid android:color="@android:color/transparent" />
11 +</shape>
...\ No newline at end of file ...\ No newline at end of file
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<shape xmlns:android="http://schemas.android.com/apk/res/android"
3 + android:shape="rectangle">
4 + <corners android:radius="4dp" />
5 +
6 + <solid android:color="@android:color/transparent" />
7 + <stroke
8 + android:width="1dp"
9 + android:color="@color/black2" />
10 +</shape>
...\ No newline at end of file ...\ No newline at end of file
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<shape xmlns:android="http://schemas.android.com/apk/res/android"
3 + android:shape="rectangle">
4 + <corners android:radius="9dp" />
5 +
6 + <solid android:color="@color/white" />
7 + <stroke
8 + android:width="1dp"
9 + android:color="@color/grey" />
10 +</shape>
...\ No newline at end of file ...\ No newline at end of file
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 + xmlns:tools="http://schemas.android.com/tools"
2 android:layout_width="match_parent" 3 android:layout_width="match_parent"
3 android:layout_height="match_parent" 4 android:layout_height="match_parent"
4 android:background="@color/cos_grey_light"> 5 android:background="@color/cos_grey_light">
...@@ -33,15 +34,15 @@ ...@@ -33,15 +34,15 @@
33 34
34 <ImageView 35 <ImageView
35 android:id="@+id/green_icon" 36 android:id="@+id/green_icon"
36 - android:layout_width="52dp" 37 + android:layout_width="58dp"
37 - android:layout_height="20dp" 38 + android:layout_height="22dp"
38 android:layout_marginEnd="8dp" 39 android:layout_marginEnd="8dp"
39 android:src="@drawable/demo_green" /> 40 android:src="@drawable/demo_green" />
40 41
41 <ImageView 42 <ImageView
42 android:id="@+id/family_icon" 43 android:id="@+id/family_icon"
43 - android:layout_width="52dp" 44 + android:layout_width="58dp"
44 - android:layout_height="20dp" 45 + android:layout_height="22dp"
45 android:src="@drawable/demo_family" /> 46 android:src="@drawable/demo_family" />
46 </LinearLayout> 47 </LinearLayout>
47 48
...@@ -49,7 +50,6 @@ ...@@ -49,7 +50,6 @@
49 android:id="@+id/profile_icon" 50 android:id="@+id/profile_icon"
50 android:layout_width="40dp" 51 android:layout_width="40dp"
51 android:layout_height="40dp" 52 android:layout_height="40dp"
52 - android:layout_gravity="center_vertical|end"
53 android:src="@drawable/demo_profile" /> 53 android:src="@drawable/demo_profile" />
54 </LinearLayout> 54 </LinearLayout>
55 55
...@@ -60,6 +60,382 @@ ...@@ -60,6 +60,382 @@
60 android:scaleType="fitXY" 60 android:scaleType="fitXY"
61 android:src="@drawable/demo_home_banner" /> 61 android:src="@drawable/demo_home_banner" />
62 62
63 + <!-- Top Offers Section -->
64 + <RelativeLayout
65 + android:layout_width="match_parent"
66 + android:layout_height="wrap_content"
67 + android:layout_marginTop="48dp">
68 +
69 + <LinearLayout
70 + android:id="@+id/ll_recycler1"
71 + android:layout_width="match_parent"
72 + android:layout_height="wrap_content"
73 + android:layout_gravity="center"
74 + android:paddingHorizontal="16dp"
75 + android:orientation="horizontal">
76 +
77 + <TextView
78 + android:id="@+id/tv_recycler_category1"
79 + android:layout_width="0dp"
80 + android:layout_height="wrap_content"
81 + android:layout_weight="1"
82 + android:textColor="@color/black2"
83 + android:textStyle="bold"
84 + android:textSize="16sp"
85 + tools:text="Top Offers (10)" />
86 +
87 + <TextView
88 + android:id="@+id/tv_recycler_all1"
89 + android:layout_width="wrap_content"
90 + android:layout_height="wrap_content"
91 + android:background="@drawable/demo_shape_transparent_border_black"
92 + android:paddingHorizontal="16dp"
93 + android:paddingVertical="6dp"
94 + android:text="@string/demo_all"
95 + android:textColor="@color/black3"
96 + android:textSize="14sp" />
97 + </LinearLayout>
98 +
99 + <androidx.recyclerview.widget.RecyclerView
100 + android:id="@+id/rl_recycler1"
101 + android:layout_width="match_parent"
102 + android:layout_height="wrap_content"
103 + android:layout_below="@+id/ll_recycler1"
104 + android:layout_marginTop="16dp"
105 + android:orientation="horizontal"
106 + android:paddingHorizontal="16dp"
107 + android:clipToPadding="false" />
108 + </RelativeLayout>
109 +
110 + <!-- Favorites Section -->
111 + <RelativeLayout
112 + android:layout_width="match_parent"
113 + android:layout_height="wrap_content"
114 + android:layout_marginTop="48dp">
115 +
116 + <LinearLayout
117 + android:id="@+id/ll_recycler2"
118 + android:layout_width="match_parent"
119 + android:layout_height="wrap_content"
120 + android:layout_gravity="center"
121 + android:paddingHorizontal="16dp"
122 + android:orientation="horizontal">
123 +
124 + <TextView
125 + android:id="@+id/tv_recycler_category2"
126 + android:layout_width="0dp"
127 + android:layout_height="wrap_content"
128 + android:layout_weight="1"
129 + android:textColor="@color/black2"
130 + android:textStyle="bold"
131 + android:textSize="16sp"
132 + tools:text="Favorites (10)" />
133 +
134 + <TextView
135 + android:id="@+id/tv_recycler_all2"
136 + android:layout_width="wrap_content"
137 + android:layout_height="wrap_content"
138 + android:background="@drawable/demo_shape_transparent_border_black"
139 + android:paddingHorizontal="16dp"
140 + android:paddingVertical="6dp"
141 + android:text="@string/demo_all"
142 + android:textColor="@color/black3"
143 + android:textSize="14sp" />
144 + </LinearLayout>
145 +
146 + <androidx.recyclerview.widget.RecyclerView
147 + android:id="@+id/rl_recycler2"
148 + android:layout_width="match_parent"
149 + android:layout_height="wrap_content"
150 + android:layout_below="@+id/ll_recycler2"
151 + android:layout_marginTop="16dp"
152 + android:orientation="horizontal"
153 + android:paddingHorizontal="16dp"
154 + android:clipToPadding="false" />
155 + </RelativeLayout>
156 +
157 + <!-- Viability Section -->
158 + <RelativeLayout
159 + android:layout_width="match_parent"
160 + android:layout_height="wrap_content"
161 + android:layout_marginTop="48dp">
162 +
163 + <LinearLayout
164 + android:id="@+id/ll_recycler3"
165 + android:layout_width="match_parent"
166 + android:layout_height="wrap_content"
167 + android:layout_gravity="center"
168 + android:paddingHorizontal="16dp"
169 + android:orientation="horizontal">
170 +
171 + <TextView
172 + android:id="@+id/tv_recycler_category3"
173 + android:layout_width="0dp"
174 + android:layout_height="wrap_content"
175 + android:layout_weight="1"
176 + android:textColor="@color/black2"
177 + android:textStyle="bold"
178 + android:textSize="16sp"
179 + tools:text="Viability (10)" />
180 +
181 + <TextView
182 + android:id="@+id/tv_recycler_all3"
183 + android:layout_width="wrap_content"
184 + android:layout_height="wrap_content"
185 + android:background="@drawable/demo_shape_transparent_border_black"
186 + android:paddingHorizontal="16dp"
187 + android:paddingVertical="6dp"
188 + android:text="@string/demo_all"
189 + android:textColor="@color/black3"
190 + android:textSize="14sp" />
191 + </LinearLayout>
192 +
193 + <androidx.recyclerview.widget.RecyclerView
194 + android:id="@+id/rl_recycler3"
195 + android:layout_width="match_parent"
196 + android:layout_height="wrap_content"
197 + android:layout_below="@+id/ll_recycler3"
198 + android:layout_marginTop="16dp"
199 + android:orientation="horizontal"
200 + android:paddingHorizontal="16dp"
201 + android:clipToPadding="false" />
202 + </RelativeLayout>
203 +
204 + <!-- Family Section -->
205 + <RelativeLayout
206 + android:layout_width="match_parent"
207 + android:layout_height="wrap_content"
208 + android:layout_marginTop="48dp">
209 +
210 + <LinearLayout
211 + android:id="@+id/ll_recycler4"
212 + android:layout_width="match_parent"
213 + android:layout_height="wrap_content"
214 + android:layout_gravity="center"
215 + android:paddingHorizontal="16dp"
216 + android:orientation="horizontal">
217 +
218 + <TextView
219 + android:id="@+id/tv_recycler_category4"
220 + android:layout_width="0dp"
221 + android:layout_height="wrap_content"
222 + android:layout_weight="1"
223 + android:textColor="@color/black2"
224 + android:textStyle="bold"
225 + android:textSize="16sp"
226 + tools:text="Family (10)" />
227 +
228 + <TextView
229 + android:id="@+id/tv_recycler_all4"
230 + android:layout_width="wrap_content"
231 + android:layout_height="wrap_content"
232 + android:background="@drawable/demo_shape_transparent_border_black"
233 + android:paddingHorizontal="16dp"
234 + android:paddingVertical="6dp"
235 + android:text="@string/demo_all"
236 + android:textColor="@color/black3"
237 + android:textSize="14sp" />
238 + </LinearLayout>
239 +
240 + <androidx.recyclerview.widget.RecyclerView
241 + android:id="@+id/rl_recycler4"
242 + android:layout_width="match_parent"
243 + android:layout_height="wrap_content"
244 + android:layout_below="@+id/ll_recycler4"
245 + android:layout_marginTop="16dp"
246 + android:orientation="horizontal"
247 + android:paddingHorizontal="16dp"
248 + android:clipToPadding="false" />
249 + </RelativeLayout>
250 +
251 + <!-- Food and Coffee Section -->
252 + <RelativeLayout
253 + android:layout_width="match_parent"
254 + android:layout_height="wrap_content"
255 + android:layout_marginTop="48dp">
256 +
257 + <LinearLayout
258 + android:id="@+id/ll_recycler5"
259 + android:layout_width="match_parent"
260 + android:layout_height="wrap_content"
261 + android:layout_gravity="center"
262 + android:paddingHorizontal="16dp"
263 + android:orientation="horizontal">
264 +
265 + <TextView
266 + android:id="@+id/tv_recycler_category5"
267 + android:layout_width="0dp"
268 + android:layout_height="wrap_content"
269 + android:layout_weight="1"
270 + android:textColor="@color/black2"
271 + android:textStyle="bold"
272 + android:textSize="16sp"
273 + tools:text="Food and Coffee (10)" />
274 +
275 + <TextView
276 + android:id="@+id/tv_recycler_all5"
277 + android:layout_width="wrap_content"
278 + android:layout_height="wrap_content"
279 + android:background="@drawable/demo_shape_transparent_border_black"
280 + android:paddingHorizontal="16dp"
281 + android:paddingVertical="6dp"
282 + android:text="@string/demo_all"
283 + android:textColor="@color/black3"
284 + android:textSize="14sp" />
285 + </LinearLayout>
286 +
287 + <androidx.recyclerview.widget.RecyclerView
288 + android:id="@+id/rl_recycler5"
289 + android:layout_width="match_parent"
290 + android:layout_height="wrap_content"
291 + android:layout_below="@+id/ll_recycler5"
292 + android:layout_marginTop="16dp"
293 + android:orientation="horizontal"
294 + android:paddingHorizontal="16dp"
295 + android:clipToPadding="false" />
296 + </RelativeLayout>
297 +
298 + <!-- Travelling Section -->
299 + <RelativeLayout
300 + android:layout_width="match_parent"
301 + android:layout_height="wrap_content"
302 + android:layout_marginTop="48dp">
303 +
304 + <LinearLayout
305 + android:id="@+id/ll_recycler6"
306 + android:layout_width="match_parent"
307 + android:layout_height="wrap_content"
308 + android:layout_gravity="center"
309 + android:paddingHorizontal="16dp"
310 + android:orientation="horizontal">
311 +
312 + <TextView
313 + android:id="@+id/tv_recycler_category6"
314 + android:layout_width="0dp"
315 + android:layout_height="wrap_content"
316 + android:layout_weight="1"
317 + android:textColor="@color/black2"
318 + android:textStyle="bold"
319 + android:textSize="16sp"
320 + tools:text="Travelling (10)" />
321 +
322 + <TextView
323 + android:id="@+id/tv_recycler_all6"
324 + android:layout_width="wrap_content"
325 + android:layout_height="wrap_content"
326 + android:background="@drawable/demo_shape_transparent_border_black"
327 + android:paddingHorizontal="16dp"
328 + android:paddingVertical="6dp"
329 + android:text="@string/demo_all"
330 + android:textColor="@color/black3"
331 + android:textSize="14sp" />
332 + </LinearLayout>
333 +
334 + <androidx.recyclerview.widget.RecyclerView
335 + android:id="@+id/rl_recycler6"
336 + android:layout_width="match_parent"
337 + android:layout_height="wrap_content"
338 + android:layout_below="@+id/ll_recycler6"
339 + android:layout_marginTop="16dp"
340 + android:orientation="horizontal"
341 + android:paddingHorizontal="16dp"
342 + android:clipToPadding="false" />
343 + </RelativeLayout>
344 +
345 + <!-- Kids Section -->
346 + <RelativeLayout
347 + android:layout_width="match_parent"
348 + android:layout_height="wrap_content"
349 + android:layout_marginTop="48dp">
350 +
351 + <LinearLayout
352 + android:id="@+id/ll_recycler7"
353 + android:layout_width="match_parent"
354 + android:layout_height="wrap_content"
355 + android:layout_gravity="center"
356 + android:paddingHorizontal="16dp"
357 + android:orientation="horizontal">
358 +
359 + <TextView
360 + android:id="@+id/tv_recycler_category7"
361 + android:layout_width="0dp"
362 + android:layout_height="wrap_content"
363 + android:layout_weight="1"
364 + android:textColor="@color/black2"
365 + android:textStyle="bold"
366 + android:textSize="16sp"
367 + tools:text="Kids (10)" />
368 +
369 + <TextView
370 + android:id="@+id/tv_recycler_all7"
371 + android:layout_width="wrap_content"
372 + android:layout_height="wrap_content"
373 + android:background="@drawable/demo_shape_transparent_border_black"
374 + android:paddingHorizontal="16dp"
375 + android:paddingVertical="6dp"
376 + android:text="@string/demo_all"
377 + android:textColor="@color/black3"
378 + android:textSize="14sp" />
379 + </LinearLayout>
380 +
381 + <androidx.recyclerview.widget.RecyclerView
382 + android:id="@+id/rl_recycler7"
383 + android:layout_width="match_parent"
384 + android:layout_height="wrap_content"
385 + android:layout_below="@+id/ll_recycler7"
386 + android:layout_marginTop="16dp"
387 + android:orientation="horizontal"
388 + android:paddingHorizontal="16dp"
389 + android:clipToPadding="false" />
390 + </RelativeLayout>
391 +
392 + <!-- Purchases Section -->
393 + <RelativeLayout
394 + android:layout_width="match_parent"
395 + android:layout_height="wrap_content"
396 + android:layout_marginTop="48dp"
397 + android:layout_marginBottom="48dp">
398 +
399 + <LinearLayout
400 + android:id="@+id/ll_recycler8"
401 + android:layout_width="match_parent"
402 + android:layout_height="wrap_content"
403 + android:layout_gravity="center"
404 + android:paddingHorizontal="16dp"
405 + android:orientation="horizontal">
406 +
407 + <TextView
408 + android:id="@+id/tv_recycler_category8"
409 + android:layout_width="0dp"
410 + android:layout_height="wrap_content"
411 + android:layout_weight="1"
412 + android:textColor="@color/black2"
413 + android:textStyle="bold"
414 + android:textSize="16sp"
415 + tools:text="Purchases (10)" />
416 +
417 + <TextView
418 + android:id="@+id/tv_recycler_all8"
419 + android:layout_width="wrap_content"
420 + android:layout_height="wrap_content"
421 + android:background="@drawable/demo_shape_transparent_border_black"
422 + android:paddingHorizontal="16dp"
423 + android:paddingVertical="6dp"
424 + android:text="@string/demo_all"
425 + android:textColor="@color/black3"
426 + android:textSize="14sp" />
427 + </LinearLayout>
428 +
429 + <androidx.recyclerview.widget.RecyclerView
430 + android:id="@+id/rl_recycler8"
431 + android:layout_width="match_parent"
432 + android:layout_height="wrap_content"
433 + android:layout_below="@+id/ll_recycler8"
434 + android:layout_marginTop="16dp"
435 + android:orientation="horizontal"
436 + android:paddingHorizontal="16dp"
437 + android:clipToPadding="false" />
438 + </RelativeLayout>
63 </LinearLayout> 439 </LinearLayout>
64 </androidx.core.widget.NestedScrollView> 440 </androidx.core.widget.NestedScrollView>
65 </RelativeLayout> 441 </RelativeLayout>
......
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 + xmlns:app="http://schemas.android.com/apk/res-auto"
4 + xmlns:tools="http://schemas.android.com/tools"
5 + android:layout_width="260dp"
6 + android:layout_height="250dp"
7 + android:background="@drawable/demo_shape_white_border_grey">
8 +
9 + <!-- Main Offer Image -->
10 + <ImageView
11 + android:id="@+id/iv_offer_image"
12 + android:layout_width="match_parent"
13 + android:layout_height="140dp"
14 + android:scaleType="centerCrop"
15 + tools:src="@drawable/demo_home_banner" />
16 +
17 + <!-- Heart Icon (Favorite) -->
18 + <ImageView
19 + android:id="@+id/iv_favorite"
20 + android:layout_width="32dp"
21 + android:layout_height="32dp"
22 + android:layout_margin="8dp"
23 + android:src="@drawable/demo_heart" />
24 +
25 + <!-- Price Badge -->
26 + <TextView
27 + android:id="@+id/tv_price"
28 + android:layout_width="68dp"
29 + android:layout_height="68dp"
30 + android:layout_alignParentEnd="true"
31 + android:layout_margin="8dp"
32 + android:background="@drawable/demo_shape_pink"
33 + android:gravity="center"
34 + android:textColor="@android:color/white"
35 + android:textSize="16sp"
36 + android:textStyle="bold"
37 + tools:text="17,95€" />
38 +
39 + <!-- Content Section -->
40 + <androidx.constraintlayout.widget.ConstraintLayout
41 + android:layout_width="match_parent"
42 + android:layout_height="match_parent"
43 + android:layout_below="@id/iv_offer_image"
44 + android:orientation="vertical"
45 + android:padding="12dp">
46 +
47 + <androidx.constraintlayout.widget.Guideline
48 + android:id="@+id/gl_vertical_70"
49 + android:layout_width="wrap_content"
50 + android:layout_height="wrap_content"
51 + android:orientation="vertical"
52 + app:layout_constraintGuide_percent="0.7" />
53 +
54 + <!-- Title -->
55 + <TextView
56 + android:id="@+id/tv_title"
57 + android:layout_width="0dp"
58 + android:layout_height="wrap_content"
59 + android:maxLines="1"
60 + android:textColor="@color/black2"
61 + android:textSize="16sp"
62 + android:textStyle="bold"
63 + app:layout_constraintEnd_toStartOf="@+id/gl_vertical_70"
64 + app:layout_constraintStart_toStartOf="parent"
65 + app:layout_constraintTop_toTopOf="parent"
66 + tools:text="Móvo 17,95" />
67 +
68 + <!-- Description -->
69 + <TextView
70 + android:id="@+id/tv_description"
71 + android:layout_width="0dp"
72 + android:layout_height="wrap_content"
73 + android:layout_marginTop="2dp"
74 + android:maxLines="2"
75 + android:textColor="@color/black3"
76 + android:textSize="13sp"
77 + app:layout_constraintEnd_toStartOf="@+id/gl_vertical_70"
78 + app:layout_constraintStart_toStartOf="parent"
79 + app:layout_constraintTop_toBottomOf="@+id/tv_title"
80 + tools:text="2 πίτσες &amp; Coca-COLA 1,5lt" />
81 +
82 + <!-- Validity Date -->
83 + <TextView
84 + android:id="@+id/tv_validity"
85 + android:layout_width="wrap_content"
86 + android:layout_height="wrap_content"
87 + android:layout_alignParentStart="true"
88 + android:layout_centerVertical="true"
89 + android:layout_marginTop="12dp"
90 + android:maxLines="1"
91 + android:textColor="#757575"
92 + android:textSize="12sp"
93 + app:layout_constraintStart_toStartOf="parent"
94 + app:layout_constraintTop_toBottomOf="@+id/tv_description"
95 + tools:text="έως 30-09" />
96 +
97 + <!-- Brand Logo -->
98 + <ImageView
99 + android:id="@+id/iv_logo"
100 + android:layout_width="60dp"
101 + android:layout_height="60dp"
102 + android:layout_alignParentEnd="true"
103 + android:layout_centerVertical="true"
104 + android:scaleType="centerInside"
105 + app:layout_constraintBottom_toBottomOf="parent"
106 + app:layout_constraintEnd_toEndOf="parent"
107 + app:layout_constraintTop_toTopOf="parent"
108 + tools:src="@drawable/demo_avis" />
109 + </androidx.constraintlayout.widget.ConstraintLayout>
110 +</RelativeLayout>
...@@ -13,6 +13,10 @@ ...@@ -13,6 +13,10 @@
13 <color name="blue_dark">#3A5266</color> 13 <color name="blue_dark">#3A5266</color>
14 <color name="white">#FFFFFF</color> 14 <color name="white">#FFFFFF</color>
15 <color name="cos_green5">#79BF14</color> 15 <color name="cos_green5">#79BF14</color>
16 + <color name="black2">#000F1E</color>
17 + <color name="black3">#00111B</color>
18 + <color name="grey">#CCCCCC</color>
19 + <color name="pink">#EE417D</color>
16 20
17 <!-- Used in styles --> 21 <!-- Used in styles -->
18 <color name="cos_light_blue">#00A5E3</color> 22 <color name="cos_light_blue">#00A5E3</color>
......
1 <resources> 1 <resources>
2 - <string name="lbl_cosmote_webview_permission_title">COSMOTE</string> 2 + <string name="lbl_cosmote_webview_permission_title">Demo App</string>
3 - <string name="lbl_cosmote_webview_permission_message">Το COSMOTE ζητάει πρόσβαση στην τοποθεσία σας.</string> 3 + <string name="lbl_cosmote_webview_permission_message">Το Demo App ζητάει πρόσβαση στην τοποθεσία σας.</string>
4 <string name="lbl_take_photo_accept">Οκ</string> 4 <string name="lbl_take_photo_accept">Οκ</string>
5 <string name="lbl_take_photo_decline">Άκυρο</string> 5 <string name="lbl_take_photo_decline">Άκυρο</string>
6 <string name="welcome_user">Γεια σου %1$s !</string> 6 <string name="welcome_user">Γεια σου %1$s !</string>
...@@ -10,4 +10,5 @@ ...@@ -10,4 +10,5 @@
10 <string name="menu_home">Αρχική</string> 10 <string name="menu_home">Αρχική</string>
11 <string name="demo_sm_flow">Open SM Flow</string> 11 <string name="demo_sm_flow">Open SM Flow</string>
12 <string name="demo_sm_map">Open SM Map</string> 12 <string name="demo_sm_map">Open SM Map</string>
13 + <string name="demo_all">Όλα</string>
13 </resources> 14 </resources>
......