Skip to content

Commit c2591f2

Browse files
authored
Merge pull request #336 from Manuito83/develop
Merge for v3.9.0
2 parents cfee34f + 6f55180 commit c2591f2

File tree

127 files changed

+15526
-6747
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

127 files changed

+15526
-6747
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ firebase.json
6060
**/android/local.properties
6161
**/android/**/GeneratedPluginRegistrant.java
6262
**/android/app/.cxx/
63+
**/android/build/
6364

6465
# iOS/XCode related
6566
**/ios/**/*.mode1v3

.metadata

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# This file should be version controlled and should not be manually edited.
55

66
version:
7-
revision: "2663184aa79047d0a33a14a3b607954f8fdd8730"
7+
revision: "d7b523b356d15fb81e7d340bbe52b47f93937323"
88
channel: "stable"
99

1010
project_type: app
@@ -13,11 +13,11 @@ project_type: app
1313
migration:
1414
platforms:
1515
- platform: root
16-
create_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
17-
base_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
18-
- platform: windows
19-
create_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
20-
base_revision: 2663184aa79047d0a33a14a3b607954f8fdd8730
16+
create_revision: d7b523b356d15fb81e7d340bbe52b47f93937323
17+
base_revision: d7b523b356d15fb81e7d340bbe52b47f93937323
18+
- platform: android
19+
create_revision: d7b523b356d15fb81e7d340bbe52b47f93937323
20+
base_revision: d7b523b356d15fb81e7d340bbe52b47f93937323
2121

2222
# User provided section
2323

android/app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ android {
3636
defaultConfig {
3737
applicationId "com.manuito.tornpda"
3838
minSdkVersion 23
39-
targetSdkVersion 36
39+
targetSdkVersion 36 // See android/build.gradle when updating as well, for packages bug fix (if still needed)
4040
multiDexEnabled true
4141
versionCode flutterVersionCode.toInteger()
4242
versionName flutterVersionName

android/app/src/main/AndroidManifest.xml

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121
<application android:name="${applicationName}"
2222
android:label="Torn PDA"
2323
android:icon="@mipmap/ic_launcher"
24-
android:allowBackup="false"
25-
android:fullBackupOnly="false"
2624
android:networkSecurityConfig="@xml/network_security_config"
2725
android:usesCleartextTraffic="true"
2826
android:largeHeap="true">
@@ -105,16 +103,27 @@
105103
android:resource="@xml/provider_paths" />
106104
</provider>
107105

108-
<!-- Widget -->
106+
<!-- Widgets -->
109107
<receiver android:name="HomeWidgetTornPda"
110-
android:exported="false">
108+
android:exported="false"
109+
android:label="@string/home_widget_label">
111110
<intent-filter>
112111
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
113112
</intent-filter>
114113
<meta-data android:name="android.appwidget.provider"
115114
android:resource="@xml/home_widget" />
116115
</receiver>
117116

117+
<receiver android:name=".HomeWidgetRankedWar"
118+
android:exported="false"
119+
android:label="@string/ranked_war_widget_label">
120+
<intent-filter>
121+
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
122+
</intent-filter>
123+
<meta-data android:name="android.appwidget.provider"
124+
android:resource="@xml/ranked_war_widget_info" />
125+
</receiver>
126+
118127
<!-- Widget Background Work -->
119128
<receiver android:name="es.antonborri.home_widget.HomeWidgetBackgroundReceiver"
120129
android:exported="true">
Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
package com.manuito.tornpda;
2+
3+
import android.app.PendingIntent;
4+
import android.appwidget.AppWidgetManager;
5+
import android.content.Context;
6+
import android.content.Intent;
7+
import android.content.SharedPreferences;
8+
import android.graphics.Color;
9+
import android.net.Uri;
10+
import android.os.Build;
11+
import android.text.Html;
12+
import android.view.View;
13+
import android.widget.RemoteViews;
14+
import androidx.annotation.NonNull;
15+
import es.antonborri.home_widget.HomeWidgetBackgroundIntent;
16+
import es.antonborri.home_widget.HomeWidgetProvider;
17+
18+
public class HomeWidgetRankedWar extends HomeWidgetProvider {
19+
20+
@Override
21+
public void onUpdate(@NonNull Context context, @NonNull AppWidgetManager appWidgetManager, int[] appWidgetIds, @NonNull SharedPreferences widgetData) {
22+
for (int widgetId : appWidgetIds) {
23+
try {
24+
boolean isDarkMode = widgetData.getBoolean("darkMode", false);
25+
int layoutId = isDarkMode ? R.layout.ranked_war_layout_large_dark : R.layout.ranked_war_layout_large;
26+
RemoteViews view = new RemoteViews(context.getPackageName(), layoutId);
27+
loadRankedWarData(view, context, widgetData, isDarkMode);
28+
appWidgetManager.updateAppWidget(widgetId, view);
29+
} catch (Exception e) {
30+
e.printStackTrace();
31+
}
32+
}
33+
}
34+
35+
private void loadRankedWarData(RemoteViews view, Context context, SharedPreferences prefs, boolean isDarkMode) {
36+
setupHeader(view, context, prefs, isDarkMode);
37+
setupClickListeners(view, context);
38+
boolean widgetVisible = prefs.getBoolean("rw_widget_visibility", false);
39+
view.setViewVisibility(R.id.rw_upcoming_layout, View.GONE);
40+
view.setViewVisibility(R.id.rw_active_layout, View.GONE);
41+
view.setViewVisibility(R.id.rw_finished_layout, View.GONE);
42+
view.setViewVisibility(R.id.rw_no_war_layout, View.GONE);
43+
if (!widgetVisible) {
44+
setupNoWarLayout(view, "No ranked war data");
45+
return;
46+
}
47+
String state = prefs.getString("rw_state", "none");
48+
switch (state) {
49+
case "upcoming":
50+
setupUpcomingWarLayout(view, prefs);
51+
break;
52+
case "active":
53+
setupActiveWarLayout(view, prefs);
54+
break;
55+
case "finished":
56+
setupFinishedWarLayout(view, prefs);
57+
break;
58+
default:
59+
setupNoWarLayout(view, "No ranked war data");
60+
break;
61+
}
62+
}
63+
64+
// setupHeader y setupClickListeners sin cambios
65+
private void setupHeader(RemoteViews view, Context context, SharedPreferences prefs, boolean isDarkMode) {
66+
String lastUpdated = prefs.getString("last_updated", "Updating...");
67+
view.setTextViewText(R.id.rw_last_updated, "Updating...".equals(lastUpdated) ? "" : lastUpdated);
68+
boolean reloadingNow = prefs.getBoolean("reloading", false);
69+
view.setViewVisibility(R.id.rw_icon_reload_active, reloadingNow ? View.VISIBLE : View.GONE);
70+
view.setViewVisibility(R.id.rw_icon_reload, reloadingNow ? View.GONE : View.VISIBLE);
71+
int reloadIconColor = isDarkMode ? Color.parseColor("#9E9E9E") : Color.parseColor("#888888");
72+
view.setInt(R.id.rw_icon_reload, "setColorFilter", reloadIconColor);
73+
74+
int playerChain = prefs.getInt("rw_player_chain", 0);
75+
view.setTextViewText(R.id.rw_header_center_text, "CHAINING");
76+
view.setTextColor(R.id.rw_header_center_text, Color.parseColor("#F44336"));
77+
view.setInt(R.id.rw_chaining_indicator, "setBackgroundResource", R.drawable.chaining_indicator_background);
78+
79+
view.setViewVisibility(R.id.rw_chaining_indicator, playerChain >= 10 ? View.VISIBLE : View.GONE);
80+
}
81+
82+
private void setupClickListeners(RemoteViews view, Context context) {
83+
PendingIntent reloadIntent = HomeWidgetBackgroundIntent.INSTANCE.getBroadcast(context, Uri.parse("pdaWidget://reload_clicked"), "Reloading...");
84+
view.setOnClickPendingIntent(R.id.rw_reload_box, reloadIntent);
85+
Intent openAppIntent = new Intent(context, MainActivity.class);
86+
openAppIntent.setData(Uri.parse("pdaWidget://open:app"));
87+
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, openAppIntent, PendingIntent.FLAG_UPDATE_CURRENT | getImmutableFlag());
88+
view.setOnClickPendingIntent(R.id.rw_widget_container, pendingIntent);
89+
}
90+
91+
private void setupUpcomingWarLayout(RemoteViews view, SharedPreferences prefs) {
92+
view.setViewVisibility(R.id.rw_upcoming_layout, View.VISIBLE);
93+
String countdown = prefs.getString("rw_countdown_string", "Loading...");
94+
String date = prefs.getString("rw_date_string", "");
95+
String playerTag = decodeHtml(prefs.getString("rw_player_faction_tag", ""));
96+
String enemyName = decodeHtml(prefs.getString("rw_enemy_faction_name", ""));
97+
boolean upcomingSoon = prefs.getBoolean("rw_upcoming_soon", false);
98+
99+
view.setInt(R.id.rw_upcoming_icon, "setColorFilter", Color.parseColor("#FFA500"));
100+
view.setTextViewText(R.id.rw_upcoming_countdown, countdown);
101+
view.setTextViewText(R.id.rw_upcoming_date, date);
102+
view.setTextViewText(R.id.rw_upcoming_player_tag, playerTag);
103+
view.setTextViewText(R.id.rw_upcoming_enemy_name, enemyName);
104+
105+
if (upcomingSoon) {
106+
view.setTextColor(R.id.rw_upcoming_countdown, Color.parseColor("#FFA500"));
107+
view.setInt(R.id.rw_upcoming_border_box, "setBackgroundColor", Color.parseColor("#FFA500"));
108+
} else {
109+
view.setInt(R.id.rw_upcoming_border_box, "setBackgroundColor", Color.TRANSPARENT);
110+
view.setTextColor(R.id.rw_upcoming_countdown, Color.parseColor("#000000"));
111+
}
112+
}
113+
114+
private void setupActiveWarLayout(RemoteViews view, SharedPreferences prefs) {
115+
view.setViewVisibility(R.id.rw_active_layout, View.VISIBLE);
116+
int playerScore = prefs.getInt("rw_player_score", 0);
117+
int enemyScore = prefs.getInt("rw_enemy_score", 0);
118+
int targetScore = prefs.getInt("rw_target_score", 1);
119+
String playerTag = decodeHtml(prefs.getString("rw_player_faction_tag", ""));
120+
String enemyName = decodeHtml(prefs.getString("rw_enemy_faction_name", ""));
121+
int progress = Math.abs(playerScore - enemyScore);
122+
double percentageValue = (targetScore > 0) ? ((double) progress * 100.0) / targetScore : 0.0;
123+
String percentageText = String.format("%.1f%%", percentageValue);
124+
view.setTextViewText(R.id.rw_active_player_tag, playerTag);
125+
view.setTextViewText(R.id.rw_active_enemy_name, enemyName);
126+
view.setTextViewText(R.id.rw_active_player_score, String.format("%,d", playerScore));
127+
view.setTextViewText(R.id.rw_active_enemy_score, String.format("%,d", enemyScore));
128+
view.setTextViewText(R.id.rw_active_progress_text, String.format("%d / %d", progress, targetScore));
129+
view.setTextViewText(R.id.rw_active_percentage, percentageText);
130+
int greenColor = Color.parseColor("#4CAF50");
131+
int redColor = Color.parseColor("#F44336");
132+
view.setTextColor(R.id.rw_active_player_score, playerScore >= enemyScore ? greenColor : redColor);
133+
view.setTextColor(R.id.rw_active_enemy_score, enemyScore > playerScore ? greenColor : redColor);
134+
view.setProgressBar(R.id.rw_active_progress_bar, targetScore, progress, false);
135+
}
136+
137+
private void setupFinishedWarLayout(RemoteViews view, SharedPreferences prefs) {
138+
view.setViewVisibility(R.id.rw_finished_layout, View.VISIBLE);
139+
140+
int playerScore = prefs.getInt("rw_player_score", 0);
141+
int enemyScore = prefs.getInt("rw_enemy_score", 0);
142+
String playerTag = decodeHtml(prefs.getString("rw_player_faction_tag", ""));
143+
String enemyName = decodeHtml(prefs.getString("rw_enemy_faction_name", ""));
144+
String endDate = prefs.getString("rw_end_date_string", "");
145+
boolean playerWon = playerScore >= enemyScore;
146+
int resultColor = playerWon ? Color.parseColor("#4CAF50") : Color.parseColor("#F44336");
147+
148+
String resultText = playerWon ? "Won" : "Lost";
149+
String finalDisplayText = resultText + " " + endDate;
150+
151+
view.setInt(R.id.rw_finished_border_box, "setBackgroundColor", resultColor);
152+
153+
view.setTextViewText(R.id.rw_finished_winner_name, finalDisplayText);
154+
view.setTextColor(R.id.rw_finished_winner_name, resultColor);
155+
156+
view.setImageViewResource(R.id.rw_finished_icon, R.drawable.trophy);
157+
view.setInt(R.id.rw_finished_icon, "setColorFilter", resultColor);
158+
159+
view.setTextViewText(R.id.rw_finished_player_tag, playerTag);
160+
view.setTextColor(R.id.rw_finished_player_tag, Color.parseColor("#0D47A1"));
161+
162+
view.setTextViewText(R.id.rw_finished_enemy_name, enemyName);
163+
view.setTextColor(R.id.rw_finished_enemy_name, Color.parseColor("#B71C1C"));
164+
165+
view.setTextViewText(R.id.rw_finished_player_score, String.format("%,d", playerScore));
166+
view.setTextColor(R.id.rw_finished_player_score, playerWon ? resultColor : Color.parseColor("#666666"));
167+
168+
view.setTextViewText(R.id.rw_finished_enemy_score, String.format("%,d", enemyScore));
169+
view.setTextColor(R.id.rw_finished_enemy_score, !playerWon ? resultColor : Color.parseColor("#666666"));
170+
}
171+
172+
private void setupNoWarLayout(RemoteViews view, String message) {
173+
view.setViewVisibility(R.id.rw_no_war_layout, View.VISIBLE);
174+
view.setTextViewText(R.id.rw_no_war_text, message);
175+
}
176+
177+
private int getImmutableFlag() {
178+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
179+
return PendingIntent.FLAG_IMMUTABLE;
180+
} else {
181+
return 0;
182+
}
183+
}
184+
185+
private String decodeHtml(String source) {
186+
if (source == null || source.isEmpty()) return "";
187+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
188+
return Html.fromHtml(source, Html.FROM_HTML_MODE_LEGACY).toString();
189+
} else {
190+
return Html.fromHtml(source).toString();
191+
}
192+
}
193+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<shape xmlns:android="http://schemas.android.com/apk/res/android">
3+
<solid android:color="#00FFFFFF" />
4+
<corners android:radius="4dp" />
5+
<stroke android:width="1dp"
6+
android:color="#F44336" />
7+
</shape>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<!-- Modify this file to customize your launch splash screen -->
3+
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
4+
<item android:drawable="@android:color/white" />
5+
6+
<!-- You can insert your own image assets here -->
7+
<!-- <item>
8+
<bitmap
9+
android:gravity="center"
10+
android:src="@mipmap/launch_image" />
11+
</item> -->
12+
</layer-list>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
3+
<item android:id="@android:id/background">
4+
<shape>
5+
<corners android:radius="5dp" />
6+
<solid android:color="#E0E0E0" />
7+
</shape>
8+
</item>
9+
<item android:id="@android:id/progress">
10+
<clip>
11+
<shape>
12+
<corners android:radius="5dp" />
13+
<solid android:color="#2196F3" />
14+
</shape>
15+
</clip>
16+
</item>
17+
</layer-list>
4.19 KB
Loading
1.1 KB
Loading

0 commit comments

Comments
 (0)