From 3af4a6d24a1a818c2071348c4dd194b1196d6aee Mon Sep 17 00:00:00 2001 From: Senad Uka Date: Fri, 18 Nov 2016 08:33:46 +0100 Subject: [PATCH] android client almost ready --- android/FarmAlarm/app/build.gradle | 1 + .../app/src/main/AndroidManifest.xml | 12 +- .../zoblak/farmalarm/AlarmNotification.java | 15 +-- .../zoblak/farmalarm/AlarmPingResponse.java | 94 ++++++++++++- .../zoblak/farmalarm/AlarmPollingService.java | 21 ++- .../farmalarm/AlarmResponseHandler.java | 31 +++++ .../java/com/zoblak/farmalarm/MainScreen.java | 37 ++++++ .../zoblak/farmalarm/MainScreenFragment.java | 1 + .../farmalarm/PeriodicalPingReceiver.java | 7 +- .../zoblak/farmalarm/SettingsActivity.java | 1 - .../zoblak/farmalarm/SoundPlayingService.java | 73 +++++++++++ .../com/zoblak/farmalarm/ZoblakClient.java | 123 ++++++++++++++++++ .../res/drawable-hdpi-v11/ic_stat_zoblak.png | Bin 0 -> 644 bytes .../main/res/drawable-hdpi/ic_stat_zoblak.png | Bin 0 -> 644 bytes .../res/drawable-mdpi-v11/ic_stat_zoblak.png | Bin 0 -> 417 bytes .../main/res/drawable-mdpi/ic_stat_zoblak.png | Bin 0 -> 425 bytes .../res/drawable-xhdpi-v11/ic_stat_zoblak.png | Bin 0 -> 913 bytes .../res/drawable-xhdpi/ic_stat_zoblak.png | Bin 0 -> 911 bytes .../drawable-xxhdpi-v11/ic_stat_zoblak.png | Bin 0 -> 1423 bytes .../res/drawable-xxhdpi/ic_stat_zoblak.png | Bin 0 -> 1469 bytes .../drawable-xxxhdpi-v11/ic_stat_zoblak.png | Bin 0 -> 2055 bytes .../res/drawable-xxxhdpi/ic_stat_zoblak.png | Bin 0 -> 2004 bytes .../main/res/layout/fragment_main_screen.xml | 1 - .../app/src/main/res/values/strings.xml | 2 +- .../app/src/main/res/xml/pref_general.xml | 1 + android/FarmAlarm/build.gradle | 6 + 26 files changed, 409 insertions(+), 17 deletions(-) create mode 100644 android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/SoundPlayingService.java create mode 100644 android/FarmAlarm/app/src/main/res/drawable-hdpi-v11/ic_stat_zoblak.png create mode 100644 android/FarmAlarm/app/src/main/res/drawable-hdpi/ic_stat_zoblak.png create mode 100644 android/FarmAlarm/app/src/main/res/drawable-mdpi-v11/ic_stat_zoblak.png create mode 100644 android/FarmAlarm/app/src/main/res/drawable-mdpi/ic_stat_zoblak.png create mode 100644 android/FarmAlarm/app/src/main/res/drawable-xhdpi-v11/ic_stat_zoblak.png create mode 100644 android/FarmAlarm/app/src/main/res/drawable-xhdpi/ic_stat_zoblak.png create mode 100644 android/FarmAlarm/app/src/main/res/drawable-xxhdpi-v11/ic_stat_zoblak.png create mode 100644 android/FarmAlarm/app/src/main/res/drawable-xxhdpi/ic_stat_zoblak.png create mode 100644 android/FarmAlarm/app/src/main/res/drawable-xxxhdpi-v11/ic_stat_zoblak.png create mode 100644 android/FarmAlarm/app/src/main/res/drawable-xxxhdpi/ic_stat_zoblak.png diff --git a/android/FarmAlarm/app/build.gradle b/android/FarmAlarm/app/build.gradle index f4a9233..3509e1e 100644 --- a/android/FarmAlarm/app/build.gradle +++ b/android/FarmAlarm/app/build.gradle @@ -30,4 +30,5 @@ dependencies { compile 'com.android.support:support-v4:24.2.1' compile 'com.android.support:support-vector-drawable:24.2.1' testCompile 'junit:junit:4.12' + compile 'com.android.volley:volley:1.0.0' } diff --git a/android/FarmAlarm/app/src/main/AndroidManifest.xml b/android/FarmAlarm/app/src/main/AndroidManifest.xml index da2a3f7..5ebd91d 100644 --- a/android/FarmAlarm/app/src/main/AndroidManifest.xml +++ b/android/FarmAlarm/app/src/main/AndroidManifest.xml @@ -4,6 +4,7 @@ + - + + @@ -32,12 +35,17 @@ android:name=".AlarmPollingService" android:exported="false" /> + + diff --git a/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/AlarmNotification.java b/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/AlarmNotification.java index 28c8de1..0daee78 100644 --- a/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/AlarmNotification.java +++ b/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/AlarmNotification.java @@ -42,19 +42,18 @@ public class AlarmNotification { * @see #cancel(Context) */ public static void notify(final Context context, - final String exampleString, final int number) { + final String message, final int number) { final Resources res = context.getResources(); // This image is used as the notification's large icon (thumbnail). // TODO: Remove this if your notification has no relevant thumbnail. - final Bitmap picture = BitmapFactory.decodeResource(res, R.drawable.example_picture); + final Bitmap picture = BitmapFactory.decodeResource(res, R.drawable.ic_stat_zoblak); - final String ticker = exampleString; + final String ticker = message; final String title = res.getString( - R.string.alarm_notification_title_template, exampleString); - final String text = res.getString( - R.string.alarm_notification_placeholder_text_template, exampleString); + R.string.alarm_notification_title_template, message); + final String text = message; final NotificationCompat.Builder builder = new NotificationCompat.Builder(context) @@ -64,7 +63,7 @@ public class AlarmNotification { // Set required fields, including the small icon, the // notification title, and text. - .setSmallIcon(R.drawable.ic_stat_alarm) + .setSmallIcon(R.drawable.ic_stat_zoblak) .setContentTitle(title) .setContentText(text) @@ -100,7 +99,7 @@ public class AlarmNotification { PendingIntent.getActivity( context, 0, - new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com")), + new Intent(context, MainScreen.class), PendingIntent.FLAG_UPDATE_CURRENT)) // Automatically dismiss the notification when it is touched. .setAutoCancel(true); diff --git a/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/AlarmPingResponse.java b/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/AlarmPingResponse.java index f7a0ac3..88dac4d 100644 --- a/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/AlarmPingResponse.java +++ b/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/AlarmPingResponse.java @@ -5,4 +5,96 @@ package com.zoblak.farmalarm; */ public class AlarmPingResponse { -} + + private String controller; + + public AlarmPingResponse(String controller) { + this.controller = controller; + } + + private Boolean alarmTriggered = false; + private Boolean tooHot = false; + private Boolean tooCold = false; + private Boolean boxSilent = false; + private Boolean phoneSilent = false; + private Boolean serverError = false; + + public Boolean getAlarmTriggered() { + return alarmTriggered; + } + + public void setAlarmTriggered(Boolean alarmTriggered) { + this.alarmTriggered = alarmTriggered; + } + + public Boolean getTooHot() { + return tooHot; + } + + public void setTooHot(Boolean tooHot) { + this.tooHot = tooHot; + } + + public Boolean getTooCold() { + return tooCold; + } + + public void setTooCold(Boolean tooCold) { + this.tooCold = tooCold; + } + + public Boolean getBoxSilent() { + return boxSilent; + } + + public void setBoxSilent(Boolean boxSilent) { + this.boxSilent = boxSilent; + } + + public Boolean getPhoneSilent() { + return phoneSilent; + } + + public void setPhoneSilent(Boolean phoneSilent) { + this.phoneSilent = phoneSilent; + } + + public Boolean getServerError() { + return serverError; + } + + public void setServerError(Boolean serverError) { + this.serverError = serverError; + } + + public String toNotificationMessage() { + String message = "Sve je OK!"; + if(getAlarmTriggered()) { + if (getAlarmTriggered()) { + message = "Alarm pokrenut! "; + } + + if (getTooHot()) { + message += "Temperatura previsoka!"; + } + + if (getTooCold()) { + message += "Temperatura preniska!"; + } + + if (getBoxSilent()) { + message += "Zoblak kutija se nije javila na vrijeme!"; + } + + if (getPhoneSilent()) { + message += "Ni jedan telefon se nije javio na vrijeme! "; + } + + if (getServerError()) { + message += "Ne radi internet na telefonu! "; + } + + } + return message; + } +} \ No newline at end of file diff --git a/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/AlarmPollingService.java b/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/AlarmPollingService.java index 6636052..613cceb 100644 --- a/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/AlarmPollingService.java +++ b/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/AlarmPollingService.java @@ -3,6 +3,12 @@ package com.zoblak.farmalarm; import android.app.IntentService; import android.content.Intent; import android.content.Context; +import android.media.Ringtone; +import android.media.RingtoneManager; +import android.net.Uri; +import android.os.PowerManager; +import android.util.Log; +import android.widget.Toast; /** * An {@link IntentService} subclass for handling asynchronous task requests in @@ -15,10 +21,13 @@ public class AlarmPollingService extends IntentService { // TODO: Rename actions, choose action names that describe tasks that this // IntentService can perform, e.g. ACTION_FETCH_NEW_ITEMS private static final String ACTION_PING = "com.zoblak.farmalarm.action.PING"; + private static final String ACTION_STOP_ALARM = "com.zoblak.farmalarm.action.STOP_ALARM"; // TODO: Rename parameters private static final String CONTROLLERS = "com.zoblak.farmalarm.extra.CONTROLLLERS"; + private AlarmResponseHandler handler; + public AlarmPollingService() { super("AlarmPollingService"); @@ -30,7 +39,6 @@ public class AlarmPollingService extends IntentService { * * @see IntentService */ - // TODO: Customize helper method public static void startActionPing(Context context, String controllers) { Intent intent = new Intent(context, AlarmPollingService.class); intent.setAction(ACTION_PING); @@ -55,7 +63,16 @@ public class AlarmPollingService extends IntentService { * parameters. */ private void handleActionPing(String controllers) { - // do something + + PowerManager powerManager = (PowerManager) this.getSystemService(POWER_SERVICE); + PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, + "AlarmPingerWakeLock"); + wakeLock.acquire(); + ZoblakClient zc = new ZoblakClient(controllers); + handler = new AlarmResponseHandler(this,zc.PingServer()); + handler.handle(); + + wakeLock.release(); } diff --git a/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/AlarmResponseHandler.java b/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/AlarmResponseHandler.java index 38fc06b..8f98751 100644 --- a/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/AlarmResponseHandler.java +++ b/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/AlarmResponseHandler.java @@ -1,8 +1,39 @@ package com.zoblak.farmalarm; +import android.annotation.TargetApi; +import android.content.Context; +import android.media.AudioAttributes; +import android.media.AudioManager; +import android.media.Ringtone; +import android.media.RingtoneManager; +import android.net.Uri; +import android.os.Build; +import android.util.Log; + /** * Created by senadu on 11/15/16. */ public class AlarmResponseHandler { + + AlarmPingResponse response; + Context context; + + + public AlarmResponseHandler(Context context, AlarmPingResponse response) { + this.response = response; + this.context = context; + } + + public void handle() { + + if (response.getAlarmTriggered()) { + AlarmNotification.notify(context, response.toNotificationMessage(), 1); + SoundPlayingService.startPlayingAlarm(context); + } + + } + + + } diff --git a/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/MainScreen.java b/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/MainScreen.java index 352c703..5bbef2b 100644 --- a/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/MainScreen.java +++ b/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/MainScreen.java @@ -1,5 +1,12 @@ package com.zoblak.farmalarm; +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.media.Ringtone; +import android.media.RingtoneManager; +import android.net.Uri; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; @@ -9,8 +16,13 @@ import android.view.View; import android.view.Menu; import android.view.MenuItem; +import java.lang.System; + public class MainScreen extends AppCompatActivity { + private AlarmManager alarmMgr; + private PendingIntent alarmIntent; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -26,6 +38,27 @@ public class MainScreen extends AppCompatActivity { .setAction("Action", null).show(); } }); + + Intent intent = new Intent(this, PeriodicalPingReceiver.class); + + alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0); + + + int PERIOD_IN_MS = 5 * 60 * 1000; // 5 minutes + + alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE); + // Hopefully your alarm will have a lower frequency than this! + alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, + System.currentTimeMillis(), + PERIOD_IN_MS, alarmIntent); + + } + + + @Override + protected void onResume() { + super.onResume(); + SoundPlayingService.stopPlayingAlarm(this); } @Override @@ -44,9 +77,13 @@ public class MainScreen extends AppCompatActivity { //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { + Intent intent = new Intent(this, SettingsActivity.class); + startActivity(intent); return true; } return super.onOptionsItemSelected(item); } + + } diff --git a/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/MainScreenFragment.java b/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/MainScreenFragment.java index 98b9453..5aa84d7 100644 --- a/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/MainScreenFragment.java +++ b/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/MainScreenFragment.java @@ -27,6 +27,7 @@ public class MainScreenFragment extends Fragment { WebView webView = (WebView)view.findViewById(R.id.main_web_view); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); + webSettings.setDomStorageEnabled(true); webView.loadUrl("http://agrar.zoblak.com/alarm"); return view; diff --git a/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/PeriodicalPingReceiver.java b/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/PeriodicalPingReceiver.java index 64e82d9..4649802 100644 --- a/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/PeriodicalPingReceiver.java +++ b/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/PeriodicalPingReceiver.java @@ -4,14 +4,19 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.os.PowerManager; import android.preference.PreferenceManager; +import android.util.Log; +import android.widget.Toast; + +import static android.content.Context.POWER_SERVICE; public class PeriodicalPingReceiver extends BroadcastReceiver { public PeriodicalPingReceiver() { } @Override - public void onReceive(Context context, Intent intent) { + public void onReceive(Context context, Intent intent) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); String controllers = prefs.getString("controllers", null); diff --git a/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/SettingsActivity.java b/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/SettingsActivity.java index a65d68e..49b265c 100644 --- a/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/SettingsActivity.java +++ b/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/SettingsActivity.java @@ -188,7 +188,6 @@ public class SettingsActivity extends AppCompatPreferenceActivity { // to their values. When their values change, their summaries are // updated to reflect the new value, per the Android Design // guidelines. - bindPreferenceSummaryToValue(findPreference("alarm_set")); bindPreferenceSummaryToValue(findPreference("controllers")); bindPreferenceSummaryToValue(findPreference("period_minutes")); } diff --git a/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/SoundPlayingService.java b/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/SoundPlayingService.java new file mode 100644 index 0000000..9428c59 --- /dev/null +++ b/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/SoundPlayingService.java @@ -0,0 +1,73 @@ +package com.zoblak.farmalarm; + +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.media.AudioAttributes; +import android.media.AudioManager; +import android.media.Ringtone; +import android.media.RingtoneManager; +import android.net.Uri; +import android.os.Build; +import android.os.IBinder; + +/** + * Created by senadu on 11/18/16. + */ + +public class SoundPlayingService extends Service +{ + private Ringtone ringtone; + + @Override + public IBinder onBind(Intent intent) + { + return null; + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) + { + startTheAlarm(); + + return START_NOT_STICKY; + } + + @Override + public void onDestroy() + { + stopTheAlarm(); + } + + public static void startPlayingAlarm(Context context) { + Intent startIntent = new Intent(context, SoundPlayingService.class); + context.startService(startIntent); + } + + public static void stopPlayingAlarm(Context context) { + Intent startIntent = new Intent(context, SoundPlayingService.class); + context.stopService(startIntent); + } + + @SuppressWarnings("deprecation") + private void startTheAlarm() { + Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); + ringtone = RingtoneManager.getRingtone(this, notification); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + AudioAttributes attributes = new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_GAME) + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .build(); + ringtone.setAudioAttributes(attributes); + } else { + ringtone.setStreamType(AudioManager.STREAM_ALARM); + } + ringtone.play(); + } + + public void stopTheAlarm() { + if(ringtone != null && ringtone.isPlaying()) { + ringtone.stop(); + } + } +} \ No newline at end of file diff --git a/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/ZoblakClient.java b/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/ZoblakClient.java index 31d5bc6..3128bd8 100644 --- a/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/ZoblakClient.java +++ b/android/FarmAlarm/app/src/main/java/com/zoblak/farmalarm/ZoblakClient.java @@ -1,8 +1,131 @@ package com.zoblak.farmalarm; + +import android.util.JsonReader; +import android.util.JsonToken; +import android.util.Log; +import java.io.BufferedInputStream; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.StringReader; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; + + /** * Created by senadu on 11/14/16. */ public class ZoblakClient { + private String controllers; + + public ZoblakClient(String controllers) { + this.controllers = controllers; + + + } + + public AlarmPingResponse PingServer() { + HttpURLConnection urlConnection = null; + AlarmPingResponse result = new AlarmPingResponse(controllers); + + URL url = null; + try { + url = new URL("http://agrar.zoblak.com/api/v1.0/alarm/" + controllers + "/phonePing"); + + urlConnection = (HttpURLConnection) url.openConnection(); + urlConnection.setReadTimeout(10000); + urlConnection.setConnectTimeout(15000); + urlConnection.setRequestMethod("POST"); + urlConnection.setDoInput(true); + urlConnection.setDoOutput(true); + urlConnection.setRequestProperty("Content-Type", "application/json"); + + OutputStream os = urlConnection.getOutputStream(); + BufferedWriter writer = new BufferedWriter( + new OutputStreamWriter(os, "UTF-8")); + writer.write("{}"); + writer.flush(); + writer.close(); + os.close(); + + urlConnection.connect(); + + InputStream in = urlConnection.getInputStream(); + String jsonString = convertStreamToString(in); + Log.e("JsonString", jsonString); + JsonReader jr = new JsonReader(new StringReader(jsonString)); + result = readResponse(jr); + + } catch (MalformedURLException e) { + Log.e("zoblakClient", "malformed: " + e.getLocalizedMessage()); + } catch (IOException e) { + Log.e("zoblakClient", "ioexception: " + e.getLocalizedMessage()); + result.setAlarmTriggered(true); + result.setServerError(true); + } + + if (urlConnection != null) urlConnection.disconnect(); + + return result; // if no response then + } + + private AlarmPingResponse readResponse(JsonReader reader) { + AlarmPingResponse result = new AlarmPingResponse(controllers); + + + try { + reader.beginObject(); + while (reader.hasNext()) { + String name = reader.nextName(); + if (name.equals("alarmTriggered") && reader.peek() != JsonToken.NULL) { + result.setAlarmTriggered(reader.nextBoolean()); + } else if (name.equals("tooHot") && reader.peek() != JsonToken.NULL) { + result.setTooHot(reader.nextBoolean()); + } else if (name.equals("tooCold") && reader.peek() != JsonToken.NULL) { + result.setTooCold(reader.nextBoolean()); + } else if (name.equals("boxSilent") && reader.peek() != JsonToken.NULL) { + result.setBoxSilent(reader.nextBoolean()); + } else { + reader.skipValue(); + } + } + } catch (IOException e) { + Log.e("zoblakClient", "reading result: " + e.getLocalizedMessage()); + } + + return result; + + + } + + + private static String convertStreamToString(InputStream is) { + + BufferedReader reader = new BufferedReader(new InputStreamReader(is)); + StringBuilder sb = new StringBuilder(); + + String line = null; + try { + while ((line = reader.readLine()) != null) { + sb.append(line + "\n"); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return sb.toString(); + } + } diff --git a/android/FarmAlarm/app/src/main/res/drawable-hdpi-v11/ic_stat_zoblak.png b/android/FarmAlarm/app/src/main/res/drawable-hdpi-v11/ic_stat_zoblak.png new file mode 100644 index 0000000000000000000000000000000000000000..31e7539b0b08393f52496d34e1f33463a3789bf3 GIT binary patch literal 644 zcmV-~0(p1GY{Q_g>L7VpRXz0dpnpZAJMR+?ly)Ig~lsTHafN-2;U z|9?DWdls+(m;tim+inR2eRD@+$uQi51?1l{UWGJ zfox9&J^;(xsPG+FE$LI|zI9>JLruzrYR7=t znRg}%kvIP_a6rzuQ|vMg7^z*W|eq+O+eY)8so2R;Lrv+k-Arm@#bNztXn zNo_m2>uwlV(iz)f;&a`g0S-xugXaU;o(J3mE=sx?6K$UWPIU?Bu%xTGK(=QBL%@Kf z`2H!|dorN;z>S0obslZMmkl9qAdt zI0EbgdVoj3An;n!nC)o${w&4g??tB-ss0SuFX>AW(DtmW;x&$UDIz`={!_Ns0MV)u z2aOcZ`~FS%#?5E*;}IT{^s{yEWDeyW-*#LblD>8-Ptm%LfU1UQ-meBqsaq>lE0j_o eHC}rtrOsEZ=vAP5%ZL`{<>eeWkJt+cgLd(c71TOJ`_-shLkH-rFL@q!hfPa?oV z!;zv$(Lw_Y1JPTwIz{bv`wC-h3jj1J<(}txw@Rhbr&;2GI_Pvd+d&ZQ1VJ!7k1<9# z=lcL~Hk-{ppM=Z>AR;uI%{9iDP6&BhC=|YTI-S!}%Cr#T5hCvP`~AZJKoF6P_gF0U zLD%*5OeQ17kRiabESgLvFHlN12q8y=5ML4T{a`Totg7mHLdbn7J|b-w{IY<#M^30DymVP^;ArB@&6dp67iLLgYfn z%dC+mq9{rspU=0a0F6dtP1Cg7y1C#$%u-5UmdoYz5D-qzIlmq%Nu^SLx7$7GIL$ChRNT=pr#{DD3d%YY)lLR*odNYO$A e3j_cETl5PYFB>+$;I2jh0000KyrF0Z8|KmIyJJ#X4ewys}AugaZh6EM-O|KFlt(%xMe6Me@i00000 LNkvXXu0mjfW0}BT literal 0 HcmV?d00001 diff --git a/android/FarmAlarm/app/src/main/res/drawable-mdpi/ic_stat_zoblak.png b/android/FarmAlarm/app/src/main/res/drawable-mdpi/ic_stat_zoblak.png new file mode 100644 index 0000000000000000000000000000000000000000..5372f6c7dddf1f5689e8d1bb477efb24ae2b5f3c GIT binary patch literal 425 zcmV;a0apHrP)X1^@s6IQ*`u0004SNklLg_t{~FrP(&n-30B$N01<(64yI{t zyRLhmKze{mrE*L}%W)jPDy5z{=Ld+msFXTP`rU4KB(RociF`hPH30Oxp6AWjwq24^ z?!|GuptYVOqTbHKYbKMq!iVw&p=OkG T|9&IM00000NkvXXu0mjf8U(%I literal 0 HcmV?d00001 diff --git a/android/FarmAlarm/app/src/main/res/drawable-xhdpi-v11/ic_stat_zoblak.png b/android/FarmAlarm/app/src/main/res/drawable-xhdpi-v11/ic_stat_zoblak.png new file mode 100644 index 0000000000000000000000000000000000000000..704633c0b64cd9768e09fc4bfbf16e08f3953f7e GIT binary patch literal 913 zcmV;C18)3@P)<oEVF+T0)Lhv z@CYzM(og+4+YWWQf%kx~lG0h2g)Ha(caomXvdwh{QnDV0G3q?BeGZrijLLdg!TmV& zp?s9>K}o4f6eeIh`gmM8agd|UO(+PgjQM$BzND+I&V>lreky5;H-SsQsxoLw`o!HZ zqg9FA1Z+PC98S8-7U26hWF^6rbz3Is{buJ}1Z=+w?2mRSsmpd`es@_E75olM>T{cC z60p4#*aa+?6oVMH-vw4y08-ZVqNGW=6|lVqh&y4Sq^}!}wm$^kDvP3m-vvoiauKk- z7T5^9);gyrwgGb`#dzDhY(EY}kk^5Sn_B6ZvZxC9EtV8> zRqwj%4A_nV>eFNbfFi3=+ln^nZs8Bu&t(FCYWNx=$Al@ zzaIcU1B;^mlYuQRuQJ{5ZkkWI1^ieznezsKG{lQ{x53N_r~u=*oIGx@G-JnO9S38P9rcCcpCUT zZTd`0lkJyc7Ls(}J}A&{$jp17(}0RTuO?75W9_!D6=-)xi^i)JD4MZ$+t&)TJEKM8 n)e02NSi9|O1=^j_qVfI%_4(v69>C3%00000NkvXXu0mjf&xVn< literal 0 HcmV?d00001 diff --git a/android/FarmAlarm/app/src/main/res/drawable-xhdpi/ic_stat_zoblak.png b/android/FarmAlarm/app/src/main/res/drawable-xhdpi/ic_stat_zoblak.png new file mode 100644 index 0000000000000000000000000000000000000000..34ad6572004183e36ce5ac97e93129b45ed1be84 GIT binary patch literal 911 zcmV;A191F_P)q3a_HNiw8@fIO;eraiGoH3?8WaOh5@I3ER(=->#<#MkU0RV(Cu3jz6 zLWW^n8yp-wjWLEs6Pq?rC=_;3N_#Sy%tEnP%$G_frzYBXH4HHzep`o9P#o{jrp|b#h2_X+EmC80D#GdstZ#0oiCjU&Q z(_c3=5Cp+j7-L2VIVh!kCWN@Fl)AUFvho*Wtfa+!-+z=yB+f-qbcb_Z9g7fBMXk?P z2O;FO>$-hS4S1gSg%DyN#`vD=y06z4GRC_4`uct=l}b-++m6cR@`X)&O)m@&4-d3$ zL1V$x)YO1s7?;8@G$^IJ0H9mXz7_5dWdURSva74>4*mP$>L>5c-Ky`cw!pySlo1L+^f#VVanjm{dyLCWNdgrSvuoN~!u5sDJBwwfAbz zD5U@ZL@6aX=g-%VT_vECKRG%1$;imazpWBHK0bb6baeD_Cn@i=X4C(MoeH$8iw(pC lVgfONm_SS*Ca~oM{sZnl9Z@`AVN?JB002ovPDHLkV1g@psICA2 literal 0 HcmV?d00001 diff --git a/android/FarmAlarm/app/src/main/res/drawable-xxhdpi-v11/ic_stat_zoblak.png b/android/FarmAlarm/app/src/main/res/drawable-xxhdpi-v11/ic_stat_zoblak.png new file mode 100644 index 0000000000000000000000000000000000000000..9ec96ec18bdd0091b2bc1987cb08e7e5bfdbac81 GIT binary patch literal 1423 zcmV;A1#tR_P)Vv9+{znS3Jv*=susN_C zFemU8@Fwsm@SLQ-+9CPx=%G1cws!)i6)>F`yaSvITrKI3L4X`Y4aWXEWKsjNy)y7p@ik5M`BQwBq^Ft;&X~y# z=oVm)rkg9{J_gp5^mP+ElLCy$8+xW%Yj2W^i7`}jcxngP?!EYOS-FHdp!fPy(+L7uwKqI z5C4tpHpF{2*x)+dBhy^t;%W{ZEy2M!z;D1Y~<3;8bA6 zF~;8m9t3iYJ|^kgPLtb?A9)T~Ske^R(}7+3U2Mz#=Sw=eUmLvudZ8SlT$zsp4+M;) zw|kkaqz6|5`vXTwy1;f+wpK6W2iWIyNvHK|uNOeMO_l~;8@XY6oy7KH!1cfualDeI z6*WBpY}l)v0rlHM(rx|Pnh;RG21okaPC|JtuwY3Oa-(fu{8y69nc05Ht=c3O8aSYG zq)rA-0KNcTDcSd2Gn2@ex&8!l)qe&gs=iXv)4i-`pnz;I4%`fEnj=|mu-tZ&tvQf@ z!z3k6>(~Yc$oA^M-M})yH6>uoF`LXSanWv)qOft>Kmgg^8o0Hj3&#VQ@chY4X4KmL zxmjlzAlnB5mjQ8v`z0mLvX+-g+A=sN_`^HZX6h(a#LMWlFjFVdz zfE`LDF=J1Sih7;QgU4c_^sqXDW&dRzH739 z8964G%G6E|ja}m)+j*so^!AmM9P2;Lb}EZI0y)2_G^TnuUW;G4DB%FG%8cA?pSF{e z?JDWcPUAWPvYngi$z{uapH$3TXL(KvIhMo9W%ktp#lS(7h!- zN;Pq2ms`gI_#8-u@zRM9cLS6He2!3#NBl`zUK>&&yk1h?ta@&?^8gs=dHu+(m_q+7 z#XzK1GhWxv`xiI;W%@%b{tFv-zRfVatV9KobD0 zfGVJNXRIoyDyS-`9f7K#cKoUjstT$KYDb_ds2#uRgQ|k6g4z+N3Tnr%`k<xX{!JL002ovPDHLkV1lnqvg-f< literal 0 HcmV?d00001 diff --git a/android/FarmAlarm/app/src/main/res/drawable-xxhdpi/ic_stat_zoblak.png b/android/FarmAlarm/app/src/main/res/drawable-xxhdpi/ic_stat_zoblak.png new file mode 100644 index 0000000000000000000000000000000000000000..9e518c5473e6a5efbae193895ad84c19097e6b08 GIT binary patch literal 1469 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 NfIfyj`t%6l%0G2Y(-8mw literal 0 HcmV?d00001 diff --git a/android/FarmAlarm/app/src/main/res/drawable-xxxhdpi/ic_stat_zoblak.png b/android/FarmAlarm/app/src/main/res/drawable-xxxhdpi/ic_stat_zoblak.png new file mode 100644 index 0000000000000000000000000000000000000000..09178e1611b2dd30be0819efae16ef4fa34385e7 GIT binary patch literal 2004 zcmV;_2P^oAP)xei`v`Rr#fj&gRC823rsV$W#6se_Y%ZE@>36%nk=$fT#dmq7o zF2y!^__5xHkSkS$lBj%WL8PS+P}2}76vRV~f&yxl1`0~#3aZp4_uiR1bI?R~%93qbDzIt6qJv^W8s z0xMYn;9Mt|x>@L_9+X`Lht>C#h8G=i9bz6H8gcic~1Dc^lN?FVz5m z#N%-V;|L;tCY??zbu6l_C;;Vh*)j~{CD(N~s%VF8hG7uPvQ9F_KAz2HPlg?*`mHDc zwOZ}#p65L(<>J+>)L`58--HlbGMUUj2<`gpeyJrSC?>c0vdxg#3#T@|@>+-|Ft}{*Q8`R;#_A5b`4- z#MLv4TPzk+CH`xOxY2dp`6 z+rl`#P@h;Vb~KyK-nvk~d5d7RTD<`P9-@?fOiKA46){zqgb)ED{$5IX*f5MElarIb za~$XGxh5JK8hRKJYw>uzlT!K--}h_EMidcVC_N~pulDrxTv-T@%LM zoHbz2o;|8iwIkw-g+k#t0EFI@%jNQ&l+q_$*Hwp-Pv&yD*Gi>QjWPCc7>Al^%v+WO{ph zD-8oMJUo1rZQI}XegAsK*smz13CprJt26vm?Py5u&)5ZCF-`LgLdY>he6p*n>*#zi zmaKqUt@Z#SmR;915b?JFa0>v$RsCpG#AnZ=E=#JZ3zIq~o2Gg2?Afyq%vHbY2B3=N zx^?UJ1VPa4dEV;)u%A*|lv2`#s&u2jS3nYp#LJVDleZKKg~^#}s0)BPwsv%M9N?Va z!#O_+0ADdp^LftsnlO2{9DNi7+qU<0b#;AiNdR{5-hEjznS93cyblW@9&=sy%WKxG zDY>rurR7-IV&*hWQ&37fv)Sy0WAdUDFgiNA(KO8;d!Bchs`kZVacpE{#74x^oO5-y zulo$&sI;(cdoYv9^i6{c4M6Sh0C2!{T{U)lKA(S1{ZTHLZ+Bhy&|)I7oPA@l*x~N( z?%Ngxpjxdy7zDw0eBVD!DczdO<&I4oD3wZC-}grv6~U#>Ln(bFm&;uh8bGyLEpW~U z8DoD4g5aLMzP{5lBUmbxzUg`1H=05IQ*VkV^ZESyLIJ2$D*c@EKE{|TdfVr^_zVpV z6@wu7_HxR4F>_N&U(Dz8H!ldFTCEN+#=goJ+t=RS{?LvcJNR4^jf{-k%NYCNVw_mc zzLe6jd_MokB>_|_l|IgSKVwYY;vTuwlk@24=xX2hA0>pWB7`K=+dUyf-2g+~#+Cub zO~qpIH}e8ePg6k<>|>0T3WY+??3*AWLa9{R6pO_^K?u1S5jQc$*3Wq8kW$JcQp%SI zA)hCNq?Tck^G*5FVzGF~ya%DNv9T+qlz;Ml|EWTu@Zj{~$H&KGp698Xow{P)G4)9D zwh-cvob%(9(ti>{CJ|97V3T1OTPdY+&iN1_BntrVSZei-VEkzSxUpC){^L>ro^)Ne z)APK|>TPfJ>ecFQe=h*sE`;b1LcAe_c$#zm)T&jhex1o={JBsM3=FI{3}b&R7Q2oy z_ADXf{$<`J{z@tRRH0D#zlYL`4nlkP?mZ=?JZszbDFFCr5Cm;O5V)N4XDFrnJHhxy%MHUgWtwJ@bN(&>V4x^WHT4KMRWB}>nbcvptQ$?!JeJGlCYIvJ@bK`57-NIJ@84DLKQ5Otf7r31?*d^B zHd{XppxGi8wZB>cQ4?)8ds+d_7O|-P)e4B3XtUYV3TU>7MeVOvK-5H=&7M|3vqdaw zf3*UlCfaQFv;vwfVp0366%aMiX0xXi&} diff --git a/android/FarmAlarm/app/src/main/res/values/strings.xml b/android/FarmAlarm/app/src/main/res/values/strings.xml index b1dce71..d6c66e2 100644 --- a/android/FarmAlarm/app/src/main/res/values/strings.xml +++ b/android/FarmAlarm/app/src/main/res/values/strings.xml @@ -1,6 +1,6 @@ Farm Alarm - Settings + Podešavanje Podešavanje diff --git a/android/FarmAlarm/app/src/main/res/xml/pref_general.xml b/android/FarmAlarm/app/src/main/res/xml/pref_general.xml index 07c3663..e7562ff 100644 --- a/android/FarmAlarm/app/src/main/res/xml/pref_general.xml +++ b/android/FarmAlarm/app/src/main/res/xml/pref_general.xml @@ -6,6 +6,7 @@ android:defaultValue="false" android:title="Uključiti alram" android:key="alarm_set" /> +