News download finished, but multilanguage news still pending.

This commit is contained in:
jens 2021-02-20 13:52:15 +01:00
parent e11aaa0ad8
commit fecfc9c810
6 changed files with 215 additions and 21 deletions

View File

@ -22,10 +22,14 @@ import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import android.widget.ToggleButton; import android.widget.ToggleButton;
import androidx.core.text.HtmlCompat;
import com.jens.automation2.AutomationService.serviceCommands; import com.jens.automation2.AutomationService.serviceCommands;
import com.jens.automation2.Trigger.Trigger_Enum; import com.jens.automation2.Trigger.Trigger_Enum;
import com.jens.automation2.location.LocationProvider; import com.jens.automation2.location.LocationProvider;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
@SuppressLint("NewApi") @SuppressLint("NewApi")
@ -36,7 +40,7 @@ public class ActivityMainScreen extends ActivityGeneric
private static ActivityMainScreen activityMainScreenInstance = null; private static ActivityMainScreen activityMainScreenInstance = null;
private ToggleButton toggleService, tbLockSound; private ToggleButton toggleService, tbLockSound;
private Button bShowHelp, bPrivacy, bSettingsErase, bSettingsSetToDefault, bVolumeTest, bAddSoundLockTIme; private Button bShowHelp, bPrivacy, bSettingsErase, bSettingsSetToDefault, bVolumeTest, bAddSoundLockTIme;
private TextView tvActivePoi, tvClosestPoi, tvLastRule, tvMainScreenNote, tvMainScreenNote2, tvlockSoundDuration; private TextView tvActivePoi, tvClosestPoi, tvLastRule, tvMainScreenNote1, tvMainScreenNote2, tvMainScreenNote3, tvlockSoundDuration;
private ListView lvRuleHistory; private ListView lvRuleHistory;
private ArrayAdapter<Rule> ruleHistoryListViewAdapter; private ArrayAdapter<Rule> ruleHistoryListViewAdapter;
@ -65,8 +69,9 @@ public class ActivityMainScreen extends ActivityGeneric
tvClosestPoi = (TextView) findViewById(R.id.tvClosestPoi); tvClosestPoi = (TextView) findViewById(R.id.tvClosestPoi);
lvRuleHistory = (ListView) findViewById(R.id.lvRuleHistory); lvRuleHistory = (ListView) findViewById(R.id.lvRuleHistory);
tvLastRule = (TextView) findViewById(R.id.tvTimeFrameHelpText); tvLastRule = (TextView) findViewById(R.id.tvTimeFrameHelpText);
tvMainScreenNote = (TextView) findViewById(R.id.tvMainScreenNote); tvMainScreenNote1 = (TextView) findViewById(R.id.tvMainScreenNote1);
tvMainScreenNote2 = (TextView) findViewById(R.id.tvMainScreenNote2); tvMainScreenNote2 = (TextView) findViewById(R.id.tvMainScreenNote2);
tvMainScreenNote3 = (TextView) findViewById(R.id.tvMainScreenNote3);
tvlockSoundDuration = (TextView)findViewById(R.id.tvlockSoundDuration); tvlockSoundDuration = (TextView)findViewById(R.id.tvlockSoundDuration);
tbLockSound = (ToggleButton) findViewById(R.id.tbLockSound); tbLockSound = (ToggleButton) findViewById(R.id.tbLockSound);
toggleService = (ToggleButton) findViewById(R.id.tbArmMastListener); toggleService = (ToggleButton) findViewById(R.id.tbArmMastListener);
@ -89,7 +94,7 @@ public class ActivityMainScreen extends ActivityGeneric
} }
}); });
tvMainScreenNote.setOnClickListener(new OnClickListener() tvMainScreenNote1.setOnClickListener(new OnClickListener()
{ {
@Override @Override
public void onClick(View v) public void onClick(View v)
@ -285,13 +290,13 @@ public class ActivityMainScreen extends ActivityGeneric
{ {
if(ActivityPermissions.needMorePermissions(activityMainScreenInstance)) if(ActivityPermissions.needMorePermissions(activityMainScreenInstance))
{ {
activityMainScreenInstance.tvMainScreenNote.setText(R.string.mainScreenPermissionNote); activityMainScreenInstance.tvMainScreenNote1.setText(R.string.mainScreenPermissionNote);
activityMainScreenInstance.tvMainScreenNote.setVisibility(View.VISIBLE); activityMainScreenInstance.tvMainScreenNote1.setVisibility(View.VISIBLE);
} }
else else
{ {
activityMainScreenInstance.tvMainScreenNote.setText(""); activityMainScreenInstance.tvMainScreenNote1.setText("");
activityMainScreenInstance.tvMainScreenNote.setVisibility(View.GONE); activityMainScreenInstance.tvMainScreenNote1.setVisibility(View.GONE);
} }
if(Miscellaneous.restrictedFeaturesConfigured()) if(Miscellaneous.restrictedFeaturesConfigured())
@ -411,7 +416,8 @@ public class ActivityMainScreen extends ActivityGeneric
else else
Miscellaneous.logEvent("i", "ActivityMainScreen", "Activity not running. No need to update.", 5); Miscellaneous.logEvent("i", "ActivityMainScreen", "Activity not running. No need to update.", 5);
// activityMainScreenInstance.checkForNews(); if(activityMainScreenInstance != null)
activityMainScreenInstance.checkForNews();
} }
@Override @Override
@ -563,11 +569,49 @@ public class ActivityMainScreen extends ActivityGeneric
Miscellaneous.messageBox(title, text, ActivityMainScreen.getActivityMainScreenInstance()); Miscellaneous.messageBox(title, text, ActivityMainScreen.getActivityMainScreenInstance());
} }
void checkForNews() synchronized void checkForNews()
{ {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); News.AsyncTaskDownloadNews dnTask = new News.AsyncTaskDownloadNews();
dnTask.execute(ActivityMainScreen.this);
StrictMode.setThreadPolicy(policy); // StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
News.downloadNews(); // StrictMode.setThreadPolicy(policy);
// Calendar now = Calendar.getInstance();
// if (true || Settings.lastNewsPolltime == -1 || now.getTimeInMillis() >= Settings.lastNewsPolltime + (long)(Settings.pollNewsEveryXDays * 24 * 60 * 60 * 1000))
// {
// ArrayList<News> newsToDisplay;
//
//// if(Settings.lastNewsPolltime == -1)
// newsToDisplay = News.downloadNews(ActivityMainScreen.this);
//// else
//// newsToDisplay = News.downloadNews(ActivityMainScreen.this, Miscellaneous.calendarFromLong(Settings.lastNewsPolltime));
//
// if (newsToDisplay.size() > 0)
// {
// activityMainScreenInstance.tvMainScreenNote3.setText(newsToDisplay.get(0).toString());
// activityMainScreenInstance.tvMainScreenNote3.setVisibility(View.VISIBLE);
// }
// else
// {
// activityMainScreenInstance.tvMainScreenNote3.setText("");
// activityMainScreenInstance.tvMainScreenNote3.setVisibility(View.GONE);
// }
// }
}
public void processNewsResult(ArrayList<News> newsToDisplay)
{
if (newsToDisplay.size() > 0)
{
activityMainScreenInstance.tvMainScreenNote3.setText(HtmlCompat.fromHtml(newsToDisplay.get(0).toStringHtml(), 0));
activityMainScreenInstance.tvMainScreenNote3.setVisibility(View.VISIBLE);
}
else
{
activityMainScreenInstance.tvMainScreenNote3.setText("");
activityMainScreenInstance.tvMainScreenNote3.setVisibility(View.GONE);
}
} }
} }

View File

@ -47,6 +47,7 @@ import org.xml.sax.SAXException;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.BufferedWriter; import java.io.BufferedWriter;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@ -68,6 +69,7 @@ import java.sql.Time;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.Scanner;
import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.HttpsURLConnection;
@ -989,4 +991,50 @@ public class Miscellaneous extends Service
root.getChildNodes(); root.getChildNodes();
*/ */
} }
public static Calendar calendarFromLong(long input)
{
Calendar returnValue = Calendar.getInstance();
returnValue.setTimeInMillis(input);
return returnValue;
}
public static boolean writeStringToFile(String filename, String input)
{
try
{
FileWriter myWriter = new FileWriter(filename);
myWriter.write(input);
myWriter.close();
return true;
}
catch (IOException e)
{
Miscellaneous.logEvent("e", "Error writing to file", Log.getStackTraceString(e), 3);
return false;
}
}
public static String readFileToString(String fileName)
{
try
{
StringBuilder result = new StringBuilder();
File myObj = new File(fileName);
Scanner myReader = new Scanner(myObj);
while (myReader.hasNextLine())
{
String data = myReader.nextLine();
result.append(data);
}
myReader.close();
return result.toString();
}
catch (FileNotFoundException e)
{
Miscellaneous.logEvent("e", "Error reading file " + fileName, Log.getStackTraceString(e), 3);
return null;
}
}
} }

View File

@ -1,12 +1,20 @@
package com.jens.automation2; package com.jens.automation2;
import android.content.Context;
import android.os.AsyncTask;
import androidx.annotation.NonNull;
import org.w3c.dom.Element; import org.w3c.dom.Element;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.w3c.dom.NodeList; import org.w3c.dom.NodeList;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
import java.lang.reflect.Array;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date;
public class News public class News
{ {
@ -15,10 +23,28 @@ public class News
Calendar publishDate; Calendar publishDate;
String applicablePlattform; String applicablePlattform;
public static ArrayList<News> downloadNews() public static ArrayList<News> downloadNews(Context context)
{
Calendar now = Calendar.getInstance();
String newsContent;
if (Settings.lastNewsPolltime == -1 || now.getTimeInMillis() >= Settings.lastNewsPolltime + (long)(Settings.pollNewsEveryXDays * 24 * 60 * 60 * 1000))
{ {
String newsUrl = "https://server47.de/automation/appNews.php"; String newsUrl = "https://server47.de/automation/appNews.php";
String newsContent = Miscellaneous.downloadURL(newsUrl, null, null); newsContent = Miscellaneous.downloadURL(newsUrl, null, null);
// Cache content to local storage
if(Miscellaneous.writeStringToFile(context.getFilesDir() + "/appNews.xml", newsContent))
{
Settings.lastNewsPolltime = now.getTimeInMillis();
Settings.writeSettings(context);
}
}
else
{
// Just read local cache file
newsContent = Miscellaneous.readFileToString(context.getFilesDir() + "/appNews.xml");
}
ArrayList<News> returnList = new ArrayList<>(); ArrayList<News> returnList = new ArrayList<>();
@ -41,12 +67,11 @@ public class News
newsEntry.setText(neEl.getElementsByTagName("text").item(0).getTextContent()); newsEntry.setText(neEl.getElementsByTagName("text").item(0).getTextContent());
String publishDateString = neEl.getElementsByTagName("publishDate").item(0).getTextContent(); String publishDateString = neEl.getElementsByTagName("publishDate").item(0).getTextContent();
Calendar cal = Calendar.getInstance(); newsEntry.setPublishDate(Miscellaneous.calendarFromLong(Long.parseLong(publishDateString) * 1000));
cal.setTimeInMillis(Long.parseLong(publishDateString));
newsEntry.setPublishDate(cal);
newsEntry.setApplicablePlattform(neEl.getElementsByTagName("applicablePlattforms").item(0).getTextContent()); newsEntry.setApplicablePlattform(neEl.getElementsByTagName("applicablePlattforms").item(0).getTextContent());
if(newsEntry.getApplicablePlattform().equalsIgnoreCase("all") || newsEntry.getApplicablePlattform().equalsIgnoreCase(BuildConfig.FLAVOR))
returnList.add(newsEntry); returnList.add(newsEntry);
} }
} }
@ -59,6 +84,19 @@ public class News
return returnList; return returnList;
} }
public static ArrayList<News> downloadNews(Context context, Calendar ageLimit)
{
ArrayList<News> returnList = new ArrayList<>();
for(News newsEntry : downloadNews(context))
{
if (newsEntry.getPublishDate().getTimeInMillis() >= ageLimit.getTimeInMillis())
returnList.add(newsEntry);
}
return returnList;
}
public String getHeadline() public String getHeadline()
{ {
return headline; return headline;
@ -98,4 +136,41 @@ public class News
{ {
this.applicablePlattform = applicablePlattform; this.applicablePlattform = applicablePlattform;
} }
@NonNull
@Override
public String toString()
{
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");;
Calendar calendar = Calendar.getInstance();
Date now = this.getPublishDate().getTime();
String timestamp = sdf.format(now);
return this.getHeadline() + " published on " + timestamp + Miscellaneous.lineSeparator + this.getText();
}
public String toStringHtml()
{
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");;
Calendar calendar = Calendar.getInstance();
Date now = this.getPublishDate().getTime();
String timestamp = sdf.format(now);
return "<b><u><i>" + this.getHeadline() + "</i></u></b>" + " published on " + timestamp + "<br>" + this.getText();
}
public static class AsyncTaskDownloadNews extends AsyncTask<Context, Void, ArrayList>
{
@Override
protected ArrayList doInBackground(Context... contexts)
{
return downloadNews(contexts[0]);
}
@Override
protected void onPostExecute(ArrayList arrayList)
{
ActivityMainScreen.getActivityMainScreenInstance().processNewsResult(arrayList);
}
}
} }

View File

@ -11,6 +11,8 @@ import java.util.Set;
public class Settings implements SharedPreferences public class Settings implements SharedPreferences
{ {
public static final int rulesThatHaveBeenRanHistorySize = 10; public static final int rulesThatHaveBeenRanHistorySize = 10;
public final static int lockSoundChangesInterval = 15;
public static final int pollNewsEveryXDays = 7;
public static final String folderName = "Automation"; public static final String folderName = "Automation";
public static long minimumDistanceChangeForGpsUpdate; public static long minimumDistanceChangeForGpsUpdate;
@ -56,6 +58,7 @@ public class Settings implements SharedPreferences
public static boolean lockSoundChanges; public static boolean lockSoundChanges;
public static boolean noticeAndroid9MicrophoneShown; public static boolean noticeAndroid9MicrophoneShown;
public static boolean noticeAndroid10WifiShown; public static boolean noticeAndroid10WifiShown;
public static long lastNewsPolltime;
/* /*
Generic settings valid for all installations and not changable Generic settings valid for all installations and not changable
@ -103,7 +106,7 @@ public class Settings implements SharedPreferences
protected static final int default_startScreen = 0; protected static final int default_startScreen = 0;
protected static final boolean default_executeRulesAndProfilesWithSingleClick = false; protected static final boolean default_executeRulesAndProfilesWithSingleClick = false;
protected static final boolean default_lockSoundChanges = false; protected static final boolean default_lockSoundChanges = false;
public final static int lockSoundChangesInterval = 15; protected static final long default_lastNewsPolltime = -1;
@Override @Override
public boolean contains(String arg0) public boolean contains(String arg0)
@ -241,6 +244,8 @@ public class Settings implements SharedPreferences
lockSoundChanges = prefs.getBoolean("lockSoundChanges", default_lockSoundChanges); lockSoundChanges = prefs.getBoolean("lockSoundChanges", default_lockSoundChanges);
noticeAndroid9MicrophoneShown = prefs.getBoolean("noticeAndroid9MicrophoneShown", false); noticeAndroid9MicrophoneShown = prefs.getBoolean("noticeAndroid9MicrophoneShown", false);
noticeAndroid10WifiShown = prefs.getBoolean("noticeAndroid10WifiShown", false); noticeAndroid10WifiShown = prefs.getBoolean("noticeAndroid10WifiShown", false);
lastNewsPolltime = prefs.getLong("lastNewsPolltime", default_lastNewsPolltime);
} }
catch(Exception e) catch(Exception e)
{ {
@ -396,6 +401,9 @@ public class Settings implements SharedPreferences
if(!prefs.contains("noticeAndroid9MicrophoneShown") | force) if(!prefs.contains("noticeAndroid9MicrophoneShown") | force)
editor.putBoolean("noticeAndroid9MicrophoneShown", false); editor.putBoolean("noticeAndroid9MicrophoneShown", false);
if(!prefs.contains("lastNewsPolltime") | force)
editor.putLong("lastNewsPolltime", default_lastNewsPolltime);
editor.commit(); editor.commit();
return true; return true;
@ -462,6 +470,8 @@ public class Settings implements SharedPreferences
editor.putBoolean("noticeAndroid9MicrophoneShown", noticeAndroid9MicrophoneShown); editor.putBoolean("noticeAndroid9MicrophoneShown", noticeAndroid9MicrophoneShown);
editor.putBoolean("noticeAndroid10WifiShown", noticeAndroid10WifiShown); editor.putBoolean("noticeAndroid10WifiShown", noticeAndroid10WifiShown);
editor.putLong("lastNewsPolltime", lastNewsPolltime);
if(lastActivePoi == null) if(lastActivePoi == null)
editor.putString("lastActivePoi", "null"); editor.putString("lastActivePoi", "null");
else else

View File

@ -27,7 +27,7 @@
</LinearLayout> </LinearLayout>
<TextView <TextView
android:id="@+id/tvMainScreenNote" android:id="@+id/tvMainScreenNote1"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center" android:gravity="center"
@ -36,6 +36,7 @@
android:scrollHorizontally="false" android:scrollHorizontally="false"
android:textColor="@color/importantMessage" android:textColor="@color/importantMessage"
android:singleLine="false" android:singleLine="false"
android:visibility="gone"
android:textAppearance="?android:attr/textAppearanceMedium" /> android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView <TextView
@ -48,6 +49,21 @@
android:scrollHorizontally="false" android:scrollHorizontally="false"
android:textColor="@color/importantMessage" android:textColor="@color/importantMessage"
android:singleLine="false" android:singleLine="false"
android:visibility="gone"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/tvMainScreenNote3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:scrollHorizontally="false"
android:textColor="@color/newsMessage"
android:singleLine="false"
android:visibility="gone"
android:textAppearance="?android:attr/textAppearanceMedium" /> android:textAppearance="?android:attr/textAppearanceMedium" />
<TableLayout <TableLayout

View File

@ -2,6 +2,7 @@
<resources> <resources>
<color name="barBackgroundColor">#dddddd</color> <color name="barBackgroundColor">#dddddd</color>
<color name="importantMessage">#ff0000</color> <color name="importantMessage">#ff0000</color>
<color name="newsMessage">#00008B</color>
<color name="white">#FFFFFF</color> <color name="white">#FFFFFF</color>
<color name="purple_700">#800080</color> <color name="purple_700">#800080</color>
<color name="purple_500">#800080</color> <color name="purple_500">#800080</color>