From 888e7fa2292ef37092172685e5f5926ef9d6fc42 Mon Sep 17 00:00:00 2001 From: Daniele Gobbetti Date: Sun, 17 Dec 2017 22:35:17 +0100 Subject: [PATCH] Add support for Omnirom Omnijaws weather service. This uses a contentobserver and doesn't do anything if it's not available. Should be feature equivalent to the LineageOS weather receiver. --- app/src/main/AndroidManifest.xml | 1 + .../externalevents/OmniJawsObserver.java | 163 ++++++++++++++++++ .../service/DeviceCommunicationService.java | 18 +- 3 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/OmniJawsObserver.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c7e41ddc4..02e22788f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,6 +21,7 @@ + (); + + int count = c.getCount(); + if (count > 0) { + for (int i = 0; i < count; i++) { + c.moveToPosition(i); + if (i == 0) { + + weatherSpec.location = c.getString(0); + weatherSpec.currentConditionCode = Weather.mapToOpenWeatherMapCondition(c.getInt(2)); + weatherSpec.currentCondition = Weather.getConditionString(weatherSpec.currentConditionCode); + //alternatively the following would also be possible + //weatherSpec.currentCondition = c.getString(1); + + weatherSpec.currentTemp = toKelvin(c.getFloat(3)); + weatherSpec.currentHumidity = (int) c.getFloat(4); + weatherSpec.todayMinTemp = toKelvin(c.getFloat(5)); + weatherSpec.todayMaxTemp = toKelvin(c.getFloat(6)); + weatherSpec.timestamp = (int) (Long.valueOf(c.getString(9)) / 1000); + } else { + + WeatherSpec.Forecast gbForecast = new WeatherSpec.Forecast(); + gbForecast.minTemp = toKelvin(c.getFloat(5)); + gbForecast.maxTemp = toKelvin(c.getFloat(6)); + gbForecast.conditionCode = Weather.mapToOpenWeatherMapCondition(c.getInt(8)); + weatherSpec.forecasts.add(gbForecast); + } + } + } + + Weather.getInstance().setWeatherSpec(weatherSpec); + GBApplication.deviceService().onSendWeather(weatherSpec); + + } finally { + c.close(); + } + } + + } + + private void updateWeather() { + Intent updateIntent = new Intent(Intent.ACTION_MAIN) + .setClassName(SERVICE_PACKAGE, SERVICE_PACKAGE + ".WeatherService"); + updateIntent.setAction(SERVICE_PACKAGE + ".ACTION_UPDATE"); + mContext.startService(updateIntent); + } + + private boolean isOmniJawsServiceAvailable() throws NameNotFoundException { + final PackageManager pm = mContext.getPackageManager(); + pm.getPackageInfo("org.omnirom.omnijaws", 0); + return true; + } + + private void checkSettings() { + if (!mInstalled) { + return; + } + final Cursor c = mContext.getContentResolver().query(SETTINGS_URI, SETTINGS_PROJECTION, + null, null, null); + if (c != null) { + int count = c.getCount(); + if (count == 1) { + c.moveToPosition(0); + mEnabled = c.getInt(0) == 1 ? true : false; + mMetric = c.getInt(1) == 0 ? true : false; + } + } + } + + private int toKelvin(double temperature) { + if (mMetric) { + return (int) (temperature + 273.15); + } + return (int) ((temperature - 32) * 0.5555555555555556D + 273.15); + } + +} \ No newline at end of file diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java index 3b6c00799..0215568d0 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java @@ -30,6 +30,7 @@ import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.net.Uri; +import android.os.Handler; import android.os.IBinder; import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; @@ -53,6 +54,7 @@ import nodomain.freeyourgadget.gadgetbridge.externalevents.BluetoothPairingReque import nodomain.freeyourgadget.gadgetbridge.externalevents.CMWeatherReceiver; import nodomain.freeyourgadget.gadgetbridge.externalevents.CalendarReceiver; import nodomain.freeyourgadget.gadgetbridge.externalevents.MusicPlaybackReceiver; +import nodomain.freeyourgadget.gadgetbridge.externalevents.OmniJawsObserver; import nodomain.freeyourgadget.gadgetbridge.externalevents.PebbleReceiver; import nodomain.freeyourgadget.gadgetbridge.externalevents.PhoneCallReceiver; import nodomain.freeyourgadget.gadgetbridge.externalevents.SMSReceiver; @@ -175,6 +177,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere private AlarmReceiver mAlarmReceiver = null; private CalendarReceiver mCalendarReceiver = null; private CMWeatherReceiver mCMWeatherReceiver = null; + private OmniJawsObserver mOmniJawsObserver = null; private Random mRandom = new Random(); private final String[] mMusicActions = { @@ -588,7 +591,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere LOG.info("Setting broadcast receivers to: " + enable); if (enable && initialized && coordinator != null && coordinator.supportsCalendarEvents()) { - if (mCalendarReceiver == null && getPrefs().getBoolean("enable_calendar_sync", true)) { + if (mCalendarReceiver == null && getPrefs().getBoolean("enable_calendar_sync", true)) { if (!(GBApplication.isRunningMarshmallowOrLater() && ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) == PackageManager.PERMISSION_DENIED)) { IntentFilter calendarIntentFilter = new IntentFilter(); calendarIntentFilter.addAction("android.intent.action.PROVIDER_CHANGED"); @@ -632,7 +635,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere if (mMusicPlaybackReceiver == null) { mMusicPlaybackReceiver = new MusicPlaybackReceiver(); IntentFilter filter = new IntentFilter(); - for (String action : mMusicActions){ + for (String action : mMusicActions) { filter.addAction(action); } registerReceiver(mMusicPlaybackReceiver, filter); @@ -663,6 +666,14 @@ public class DeviceCommunicationService extends Service implements SharedPrefere mCMWeatherReceiver = new CMWeatherReceiver(); registerReceiver(mCMWeatherReceiver, new IntentFilter("GB_UPDATE_WEATHER")); } + if (mOmniJawsObserver == null && coordinator != null && coordinator.supportsWeather()) { + try { + mOmniJawsObserver = new OmniJawsObserver(new Handler()); + getContentResolver().registerContentObserver(mOmniJawsObserver.WEATHER_URI, true, mOmniJawsObserver); + } catch (PackageManager.NameNotFoundException e) { + //Nothing wrong, it just means we're not running on omnirom. + } + } } else { if (mPhoneCallReceiver != null) { unregisterReceiver(mPhoneCallReceiver); @@ -701,6 +712,9 @@ public class DeviceCommunicationService extends Service implements SharedPrefere unregisterReceiver(mCMWeatherReceiver); mCMWeatherReceiver = null; } + if (mOmniJawsObserver != null) { + getContentResolver().unregisterContentObserver(mOmniJawsObserver); + } } }