mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-12-13 04:07:50 +01:00
Initial support for cyanogenmod/lineage weather provider
TODO: - also reconstruct json for Pebble background js fake replies - find a better location for settings - interatively display candidates when looking up location - grey out setting on non-cm/los devices
This commit is contained in:
parent
b7b96b5ab5
commit
f0ac296492
@ -83,6 +83,7 @@ dependencies {
|
|||||||
// version contains way too much and our custom patches are in the generator only.
|
// version contains way too much and our custom patches are in the generator only.
|
||||||
compile 'org.greenrobot:greendao:2.2.1'
|
compile 'org.greenrobot:greendao:2.2.1'
|
||||||
compile 'org.apache.commons:commons-lang3:3.5'
|
compile 'org.apache.commons:commons-lang3:3.5'
|
||||||
|
compile 'org.cyanogenmod:platform.sdk:6.0'
|
||||||
|
|
||||||
// compile project(":DaoCore")
|
// compile project(":DaoCore")
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,9 @@
|
|||||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
||||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||||
|
|
||||||
|
<uses-permission android:name="cyanogenmod.permission.ACCESS_WEATHER_MANAGER" />
|
||||||
|
<uses-permission android:name="cyanogenmod.permission.READ_WEATHER" />
|
||||||
|
|
||||||
<uses-feature
|
<uses-feature
|
||||||
android:name="android.hardware.bluetooth"
|
android:name="android.hardware.bluetooth"
|
||||||
android:required="true" />
|
android:required="true" />
|
||||||
|
@ -47,6 +47,7 @@ import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.R;
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.DeviceManager;
|
import nodomain.freeyourgadget.gadgetbridge.devices.DeviceManager;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandPreferencesActivity;
|
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandPreferencesActivity;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.externalevents.CMWeatherReceiver;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.CannedMessagesSpec;
|
import nodomain.freeyourgadget.gadgetbridge.model.CannedMessagesSpec;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.FileUtils;
|
import nodomain.freeyourgadget.gadgetbridge.util.FileUtils;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||||
@ -259,6 +260,21 @@ public class SettingsActivity extends AbstractSettingsActivity {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
pref = findPreference("weather_city");
|
||||||
|
pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onPreferenceChange(Preference preference, Object newVal) {
|
||||||
|
// reset city id and force a new lookup
|
||||||
|
GBApplication.getPrefs().getPreferences().edit().putString("weather_cityid",null).apply();
|
||||||
|
preference.setSummary(newVal.toString());
|
||||||
|
Intent intent = new Intent("GB_UPDATE_WEATHER");
|
||||||
|
intent.setPackage(CMWeatherReceiver.class.getCanonicalName());
|
||||||
|
sendBroadcast(intent);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
// Get all receivers of Media Buttons
|
// Get all receivers of Media Buttons
|
||||||
Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
|
Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
|
||||||
|
|
||||||
@ -338,6 +354,7 @@ public class SettingsActivity extends AbstractSettingsActivity {
|
|||||||
PREF_USER_WEIGHT_KG,
|
PREF_USER_WEIGHT_KG,
|
||||||
PREF_USER_SLEEP_DURATION,
|
PREF_USER_SLEEP_DURATION,
|
||||||
PREF_USER_STEPS_GOAL,
|
PREF_USER_STEPS_GOAL,
|
||||||
|
"weather_city",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -229,4 +229,9 @@ public interface DeviceCoordinator {
|
|||||||
*/
|
*/
|
||||||
boolean supportsRealtimeData();
|
boolean supportsRealtimeData();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates whether the device supports current weather and/or weather
|
||||||
|
* forecast display.
|
||||||
|
*/
|
||||||
|
boolean supportsWeather();
|
||||||
}
|
}
|
||||||
|
@ -176,4 +176,9 @@ public class UnknownDeviceCoordinator extends AbstractDeviceCoordinator {
|
|||||||
public boolean supportsRealtimeData() {
|
public boolean supportsRealtimeData() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsWeather() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -98,6 +98,11 @@ public class HPlusCoordinator extends AbstractDeviceCoordinator {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsWeather() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DeviceType getDeviceType() {
|
public DeviceType getDeviceType() {
|
||||||
return DeviceType.HPLUS;
|
return DeviceType.HPLUS;
|
||||||
|
@ -63,4 +63,9 @@ public class AmazfitBipCoordinator extends HuamiCoordinator {
|
|||||||
public boolean supportsHeartRateMeasurement(GBDevice device) {
|
public boolean supportsHeartRateMeasurement(GBDevice device) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsWeather() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -63,4 +63,9 @@ public class AmazfitCorCoordinator extends HuamiCoordinator {
|
|||||||
public boolean supportsHeartRateMeasurement(GBDevice device) {
|
public boolean supportsHeartRateMeasurement(GBDevice device) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsWeather() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,4 +73,9 @@ public class MiBand2Coordinator extends HuamiCoordinator {
|
|||||||
public boolean supportsHeartRateMeasurement(GBDevice device) {
|
public boolean supportsHeartRateMeasurement(GBDevice device) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsWeather() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -68,4 +68,9 @@ public class MiBand2HRXCoordinator extends HuamiCoordinator {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsWeather() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -84,6 +84,11 @@ public class TeclastH30Coordinator extends AbstractDeviceCoordinator {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsWeather() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DeviceType getDeviceType() {
|
public DeviceType getDeviceType() {
|
||||||
return DeviceType.TECLASTH30;
|
return DeviceType.TECLASTH30;
|
||||||
|
@ -23,7 +23,6 @@ import android.net.Uri;
|
|||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GBException;
|
import nodomain.freeyourgadget.gadgetbridge.GBException;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.R;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.AbstractDeviceCoordinator;
|
import nodomain.freeyourgadget.gadgetbridge.devices.AbstractDeviceCoordinator;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
|
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider;
|
import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider;
|
||||||
@ -35,6 +34,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
|
import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
|
||||||
|
|
||||||
public class LiveviewCoordinator extends AbstractDeviceCoordinator {
|
public class LiveviewCoordinator extends AbstractDeviceCoordinator {
|
||||||
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public DeviceType getSupportedType(GBDeviceCandidate candidate) {
|
public DeviceType getSupportedType(GBDeviceCandidate candidate) {
|
||||||
String name = candidate.getDevice().getName();
|
String name = candidate.getDevice().getName();
|
||||||
@ -119,6 +119,11 @@ public class LiveviewCoordinator extends AbstractDeviceCoordinator {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsWeather() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) throws GBException {
|
protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) throws GBException {
|
||||||
// nothing to delete, yet
|
// nothing to delete, yet
|
||||||
|
@ -171,6 +171,11 @@ public class MiBandCoordinator extends AbstractDeviceCoordinator {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsWeather() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean hasValidUserInfo() {
|
public static boolean hasValidUserInfo() {
|
||||||
String dummyMacAddress = MiBandService.MAC_ADDRESS_FILTER_1_1A + ":00:00:00";
|
String dummyMacAddress = MiBandService.MAC_ADDRESS_FILTER_1_1A + ":00:00:00";
|
||||||
try {
|
try {
|
||||||
|
@ -147,6 +147,11 @@ public class No1F1Coordinator extends AbstractDeviceCoordinator {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsWeather() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) throws GBException {
|
protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) throws GBException {
|
||||||
Long deviceId = device.getId();
|
Long deviceId = device.getId();
|
||||||
|
@ -155,4 +155,9 @@ public class PebbleCoordinator extends AbstractDeviceCoordinator {
|
|||||||
public boolean supportsRealtimeData() {
|
public boolean supportsRealtimeData() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsWeather() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -120,6 +120,11 @@ public class VibratissimoCoordinator extends AbstractDeviceCoordinator {
|
|||||||
return false; // hmmm well, it has a temperature sensor :D
|
return false; // hmmm well, it has a temperature sensor :D
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsWeather() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) throws GBException {
|
protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) throws GBException {
|
||||||
// nothing to delete, yet
|
// nothing to delete, yet
|
||||||
|
@ -0,0 +1,194 @@
|
|||||||
|
package nodomain.freeyourgadget.gadgetbridge.externalevents;
|
||||||
|
|
||||||
|
import android.app.AlarmManager;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import cyanogenmod.weather.CMWeatherManager;
|
||||||
|
import cyanogenmod.weather.WeatherInfo;
|
||||||
|
import cyanogenmod.weather.WeatherLocation;
|
||||||
|
import cyanogenmod.weather.util.WeatherUtils;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.model.Weather;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
|
||||||
|
|
||||||
|
import static cyanogenmod.providers.WeatherContract.WeatherColumns.TempUnit.FAHRENHEIT;
|
||||||
|
import static cyanogenmod.providers.WeatherContract.WeatherColumns.WeatherCode.ISOLATED_THUNDERSHOWERS;
|
||||||
|
import static cyanogenmod.providers.WeatherContract.WeatherColumns.WeatherCode.NOT_AVAILABLE;
|
||||||
|
import static cyanogenmod.providers.WeatherContract.WeatherColumns.WeatherCode.SCATTERED_SNOW_SHOWERS;
|
||||||
|
import static cyanogenmod.providers.WeatherContract.WeatherColumns.WeatherCode.SCATTERED_THUNDERSTORMS;
|
||||||
|
import static cyanogenmod.providers.WeatherContract.WeatherColumns.WeatherCode.SHOWERS;
|
||||||
|
|
||||||
|
public class CMWeatherReceiver extends BroadcastReceiver implements CMWeatherManager.WeatherUpdateRequestListener, CMWeatherManager.LookupCityRequestListener {
|
||||||
|
|
||||||
|
private static final Logger LOG = LoggerFactory.getLogger(CMWeatherReceiver.class);
|
||||||
|
|
||||||
|
private WeatherLocation weatherLocation = null;
|
||||||
|
private Context mContext;
|
||||||
|
private PendingIntent mPendingIntent = null;
|
||||||
|
|
||||||
|
public CMWeatherReceiver() {
|
||||||
|
mContext = GBApplication.getContext();
|
||||||
|
final CMWeatherManager weatherManager = CMWeatherManager.getInstance(mContext);
|
||||||
|
if (weatherManager == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Prefs prefs = GBApplication.getPrefs();
|
||||||
|
|
||||||
|
String city = prefs.getString("weather_city", null);
|
||||||
|
String cityId = prefs.getString("weather_cityid", null);
|
||||||
|
|
||||||
|
if ((cityId == null || cityId.equals("")) && city != null && !city.equals("")) {
|
||||||
|
lookupCity(city);
|
||||||
|
} else if (city != null && cityId != null) {
|
||||||
|
weatherLocation = new WeatherLocation.Builder(cityId, city).build();
|
||||||
|
enablePeriodicAlarm(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void lookupCity(String city) {
|
||||||
|
final CMWeatherManager weatherManager = CMWeatherManager.getInstance(mContext);
|
||||||
|
if (weatherManager == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (city != null && !city.equals("")) {
|
||||||
|
if (weatherManager.getActiveWeatherServiceProviderLabel() != null) {
|
||||||
|
weatherManager.lookupCity(city, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void enablePeriodicAlarm(boolean enable) {
|
||||||
|
if ((mPendingIntent != null && enable) || (mPendingIntent == null && !enable)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AlarmManager am = (AlarmManager) (mContext.getSystemService(Context.ALARM_SERVICE));
|
||||||
|
if (am == null) {
|
||||||
|
LOG.warn("could not get alarm manager!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (enable) {
|
||||||
|
mPendingIntent = PendingIntent.getBroadcast(mContext, 0, new Intent("GB_UPDATE_WEATHER"), 0);
|
||||||
|
am.setInexactRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis() + 10000, AlarmManager.INTERVAL_HOUR, mPendingIntent);
|
||||||
|
} else {
|
||||||
|
am.cancel(mPendingIntent);
|
||||||
|
mPendingIntent = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
Prefs prefs = GBApplication.getPrefs();
|
||||||
|
|
||||||
|
String city = prefs.getString("weather_city", null);
|
||||||
|
String cityId = prefs.getString("weather_cityid", null);
|
||||||
|
|
||||||
|
if (city != null && !city.equals("") && cityId == null) {
|
||||||
|
lookupCity(city);
|
||||||
|
} else {
|
||||||
|
requestWeather();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void requestWeather() {
|
||||||
|
final CMWeatherManager weatherManager = CMWeatherManager.getInstance(GBApplication.getContext());
|
||||||
|
if (weatherManager.getActiveWeatherServiceProviderLabel() != null && weatherLocation != null) {
|
||||||
|
weatherManager.requestWeatherUpdate(weatherLocation, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onWeatherRequestCompleted(int status, WeatherInfo weatherInfo) {
|
||||||
|
if (weatherInfo != null) {
|
||||||
|
LOG.info("weather: " + weatherInfo.toString());
|
||||||
|
WeatherSpec weatherSpec = new WeatherSpec();
|
||||||
|
weatherSpec.timestamp = (int) (weatherInfo.getTimestamp() / 1000);
|
||||||
|
weatherSpec.location = weatherInfo.getCity();
|
||||||
|
|
||||||
|
if (weatherInfo.getTemperatureUnit() == FAHRENHEIT) {
|
||||||
|
weatherSpec.currentTemp = (int) WeatherUtils.fahrenheitToCelsius(weatherInfo.getTemperature()) + 273;
|
||||||
|
weatherSpec.todayMaxTemp = (int) WeatherUtils.fahrenheitToCelsius(weatherInfo.getTodaysHigh()) + 273;
|
||||||
|
weatherSpec.todayMinTemp = (int) WeatherUtils.fahrenheitToCelsius(weatherInfo.getTodaysLow()) + 273;
|
||||||
|
} else {
|
||||||
|
weatherSpec.currentTemp = (int) weatherInfo.getTemperature() + 273;
|
||||||
|
weatherSpec.todayMaxTemp = (int) weatherInfo.getTodaysHigh() + 273;
|
||||||
|
weatherSpec.todayMinTemp = (int) weatherInfo.getTodaysLow() + 273;
|
||||||
|
}
|
||||||
|
|
||||||
|
weatherSpec.currentConditionCode = Weather.mapToOpenWeatherMapCondition(CMtoYahooCondintion(weatherInfo.getConditionCode()));
|
||||||
|
weatherSpec.currentCondition = Weather.getConditionString(weatherSpec.currentConditionCode);
|
||||||
|
|
||||||
|
weatherSpec.forecasts = new ArrayList<>();
|
||||||
|
List<WeatherInfo.DayForecast> forecasts = weatherInfo.getForecasts();
|
||||||
|
for (int i = 1; i < forecasts.size(); i++) {
|
||||||
|
WeatherInfo.DayForecast cmForecast = forecasts.get(i);
|
||||||
|
WeatherSpec.Forecast gbForecast = new WeatherSpec.Forecast();
|
||||||
|
if (weatherInfo.getTemperatureUnit() == FAHRENHEIT) {
|
||||||
|
gbForecast.maxTemp = (int) WeatherUtils.fahrenheitToCelsius(cmForecast.getHigh()) + 273;
|
||||||
|
gbForecast.minTemp = (int) WeatherUtils.fahrenheitToCelsius(cmForecast.getLow()) + 273;
|
||||||
|
} else {
|
||||||
|
gbForecast.maxTemp = (int) cmForecast.getHigh() + 273;
|
||||||
|
gbForecast.minTemp = (int) cmForecast.getLow() + 273;
|
||||||
|
}
|
||||||
|
gbForecast.conditionCode = Weather.mapToOpenWeatherMapCondition(CMtoYahooCondintion(cmForecast.getConditionCode()));
|
||||||
|
weatherSpec.forecasts.add(gbForecast);
|
||||||
|
}
|
||||||
|
Weather.getInstance().setWeatherSpec(weatherSpec);
|
||||||
|
GBApplication.deviceService().onSendWeather(weatherSpec);
|
||||||
|
} else {
|
||||||
|
LOG.info("request has returned null for WeatherInfo");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param cmCondition
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private int CMtoYahooCondintion(int cmCondition) {
|
||||||
|
int yahooCondition;
|
||||||
|
if (cmCondition <= SHOWERS) {
|
||||||
|
yahooCondition = cmCondition;
|
||||||
|
} else if (cmCondition <= SCATTERED_THUNDERSTORMS) {
|
||||||
|
yahooCondition = cmCondition + 1;
|
||||||
|
} else if (cmCondition <= SCATTERED_SNOW_SHOWERS) {
|
||||||
|
yahooCondition = cmCondition + 2;
|
||||||
|
} else if (cmCondition <= ISOLATED_THUNDERSHOWERS) {
|
||||||
|
yahooCondition = cmCondition + 3;
|
||||||
|
} else {
|
||||||
|
yahooCondition = NOT_AVAILABLE;
|
||||||
|
}
|
||||||
|
return yahooCondition;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLookupCityRequestCompleted(int result, List<WeatherLocation> list) {
|
||||||
|
if (list != null) {
|
||||||
|
weatherLocation = list.get(0);
|
||||||
|
String cityId = weatherLocation.getCityId();
|
||||||
|
String city = weatherLocation.getCity();
|
||||||
|
|
||||||
|
SharedPreferences.Editor editor = GBApplication.getPrefs().getPreferences().edit();
|
||||||
|
editor.putString("weather_city", city).apply();
|
||||||
|
editor.putString("weather_cityid", cityId).apply();
|
||||||
|
enablePeriodicAlarm(true);
|
||||||
|
requestWeather();
|
||||||
|
} else {
|
||||||
|
enablePeriodicAlarm(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -50,7 +50,7 @@ import nodomain.freeyourgadget.gadgetbridge.externalevents.AlarmClockReceiver;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.externalevents.AlarmReceiver;
|
import nodomain.freeyourgadget.gadgetbridge.externalevents.AlarmReceiver;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.externalevents.BluetoothConnectReceiver;
|
import nodomain.freeyourgadget.gadgetbridge.externalevents.BluetoothConnectReceiver;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.externalevents.BluetoothPairingRequestReceiver;
|
import nodomain.freeyourgadget.gadgetbridge.externalevents.BluetoothPairingRequestReceiver;
|
||||||
//import nodomain.freeyourgadget.gadgetbridge.externalevents.CMWeatherReceiver;
|
import nodomain.freeyourgadget.gadgetbridge.externalevents.CMWeatherReceiver;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.externalevents.CalendarReceiver;
|
import nodomain.freeyourgadget.gadgetbridge.externalevents.CalendarReceiver;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.externalevents.MusicPlaybackReceiver;
|
import nodomain.freeyourgadget.gadgetbridge.externalevents.MusicPlaybackReceiver;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.externalevents.PebbleReceiver;
|
import nodomain.freeyourgadget.gadgetbridge.externalevents.PebbleReceiver;
|
||||||
@ -174,7 +174,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
|
|||||||
|
|
||||||
private AlarmReceiver mAlarmReceiver = null;
|
private AlarmReceiver mAlarmReceiver = null;
|
||||||
private CalendarReceiver mCalendarReceiver = null;
|
private CalendarReceiver mCalendarReceiver = null;
|
||||||
//private CMWeatherReceiver mCMWeatherReceiver = null;
|
private CMWeatherReceiver mCMWeatherReceiver = null;
|
||||||
private Random mRandom = new Random();
|
private Random mRandom = new Random();
|
||||||
|
|
||||||
private final String[] mMusicActions = {
|
private final String[] mMusicActions = {
|
||||||
@ -659,12 +659,10 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
|
|||||||
filter.addAction(AlarmClockReceiver.ALARM_DONE_ACTION);
|
filter.addAction(AlarmClockReceiver.ALARM_DONE_ACTION);
|
||||||
registerReceiver(mAlarmClockReceiver, filter);
|
registerReceiver(mAlarmClockReceiver, filter);
|
||||||
}
|
}
|
||||||
/*
|
if (mCMWeatherReceiver == null && coordinator != null && coordinator.supportsWeather()) {
|
||||||
if (mCMWeatherReceiver == null) {
|
|
||||||
mCMWeatherReceiver = new CMWeatherReceiver();
|
mCMWeatherReceiver = new CMWeatherReceiver();
|
||||||
registerReceiver(mCMWeatherReceiver, new IntentFilter("HOURLY_ALARM"));
|
registerReceiver(mCMWeatherReceiver, new IntentFilter("GB_UPDATE_WEATHER"));
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
} else {
|
} else {
|
||||||
if (mPhoneCallReceiver != null) {
|
if (mPhoneCallReceiver != null) {
|
||||||
unregisterReceiver(mPhoneCallReceiver);
|
unregisterReceiver(mPhoneCallReceiver);
|
||||||
@ -699,12 +697,10 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
|
|||||||
unregisterReceiver(mAlarmClockReceiver);
|
unregisterReceiver(mAlarmClockReceiver);
|
||||||
mAlarmClockReceiver = null;
|
mAlarmClockReceiver = null;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
if (mCMWeatherReceiver != null) {
|
if (mCMWeatherReceiver != null) {
|
||||||
unregisterReceiver(mCMWeatherReceiver);
|
unregisterReceiver(mCMWeatherReceiver);
|
||||||
mCMWeatherReceiver = null;
|
mCMWeatherReceiver = null;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ public class ParcelableWeather2 implements Parcelable {
|
|||||||
if (version != 2) {
|
if (version != 2) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Bundle bundle = in.readBundle();
|
Bundle bundle = in.readBundle(getClass().getClassLoader());
|
||||||
|
|
||||||
weatherSpec.location = bundle.getString("weather_location");
|
weatherSpec.location = bundle.getString("weather_location");
|
||||||
long time = bundle.getLong("weather_time");
|
long time = bundle.getLong("weather_time");
|
||||||
@ -52,7 +52,7 @@ public class ParcelableWeather2 implements Parcelable {
|
|||||||
bundle.getString("weather_forecast_url");
|
bundle.getString("weather_forecast_url");
|
||||||
int conditions = bundle.getInt("weather_conditions");
|
int conditions = bundle.getInt("weather_conditions");
|
||||||
if (conditions > 0) {
|
if (conditions > 0) {
|
||||||
Bundle conditionBundle = in.readBundle();
|
Bundle conditionBundle = in.readBundle(getClass().getClassLoader());
|
||||||
reconstructedOWMWeather = new JSONObject();
|
reconstructedOWMWeather = new JSONObject();
|
||||||
JSONArray weather = new JSONArray();
|
JSONArray weather = new JSONArray();
|
||||||
JSONObject condition = new JSONObject();
|
JSONObject condition = new JSONObject();
|
||||||
@ -63,7 +63,9 @@ public class ParcelableWeather2 implements Parcelable {
|
|||||||
weatherSpec.currentTemp = conditionBundle.getInt("weather_current_temp");
|
weatherSpec.currentTemp = conditionBundle.getInt("weather_current_temp");
|
||||||
|
|
||||||
String[] currentConditionType = conditionBundle.getStringArray("weather_condition_types");
|
String[] currentConditionType = conditionBundle.getStringArray("weather_condition_types");
|
||||||
weatherSpec.currentConditionCode = weatherConditionTypesToOpenWeatherMapIds(currentConditionType[0]);
|
if (currentConditionType != null) {
|
||||||
|
weatherSpec.currentConditionCode = weatherConditionTypesToOpenWeatherMapIds(currentConditionType[0]);
|
||||||
|
}
|
||||||
weatherSpec.todayMinTemp = conditionBundle.getInt("weather_low_temp");
|
weatherSpec.todayMinTemp = conditionBundle.getInt("weather_low_temp");
|
||||||
weatherSpec.todayMaxTemp = conditionBundle.getInt("weather_high_temp");
|
weatherSpec.todayMaxTemp = conditionBundle.getInt("weather_high_temp");
|
||||||
try {
|
try {
|
||||||
@ -96,9 +98,12 @@ public class ParcelableWeather2 implements Parcelable {
|
|||||||
condition = new JSONObject();
|
condition = new JSONObject();
|
||||||
main = new JSONObject();
|
main = new JSONObject();
|
||||||
weather = new JSONArray();
|
weather = new JSONArray();
|
||||||
Bundle forecastBundle = in.readBundle();
|
Bundle forecastBundle = in.readBundle(getClass().getClassLoader());
|
||||||
String[] forecastConditionType = forecastBundle.getStringArray("weather_condition_types");
|
String[] forecastConditionType = forecastBundle.getStringArray("weather_condition_types");
|
||||||
int forecastConditionCode = weatherConditionTypesToOpenWeatherMapIds(forecastConditionType[0]);
|
int forecastConditionCode = 0;
|
||||||
|
if (forecastConditionType != null) {
|
||||||
|
forecastConditionCode = weatherConditionTypesToOpenWeatherMapIds(forecastConditionType[0]);
|
||||||
|
}
|
||||||
int forecastLowTemp = forecastBundle.getInt("weather_low_temp");
|
int forecastLowTemp = forecastBundle.getInt("weather_low_temp");
|
||||||
int forecastHighTemp = forecastBundle.getInt("weather_high_temp");
|
int forecastHighTemp = forecastBundle.getInt("weather_high_temp");
|
||||||
weatherSpec.forecasts.add(new WeatherSpec.Forecast(forecastLowTemp, forecastHighTemp, forecastConditionCode));
|
weatherSpec.forecasts.add(new WeatherSpec.Forecast(forecastLowTemp, forecastHighTemp, forecastConditionCode));
|
||||||
|
@ -110,6 +110,7 @@
|
|||||||
<string name="pref_call_privacy_mode_number">Hide number but display name</string>
|
<string name="pref_call_privacy_mode_number">Hide number but display name</string>
|
||||||
<string name="pref_call_privacy_mode_complete">Hide name and number</string>
|
<string name="pref_call_privacy_mode_complete">Hide name and number</string>
|
||||||
|
|
||||||
|
<string name="pref_title_weather_location">Weather location</string>
|
||||||
|
|
||||||
<string name="pref_blacklist">Blacklist Apps</string>
|
<string name="pref_blacklist">Blacklist Apps</string>
|
||||||
<string name="pref_blacklist_calendars">Blacklist Calendars</string>
|
<string name="pref_blacklist_calendars">Blacklist Calendars</string>
|
||||||
|
@ -41,6 +41,9 @@
|
|||||||
android:key="measurement_system"
|
android:key="measurement_system"
|
||||||
android:summary="%s"
|
android:summary="%s"
|
||||||
android:title="@string/pref_title_unit_system" />
|
android:title="@string/pref_title_unit_system" />
|
||||||
|
<EditTextPreference
|
||||||
|
android:key="weather_city"
|
||||||
|
android:title="@string/pref_title_weather_location" />
|
||||||
<CheckBoxPreference
|
<CheckBoxPreference
|
||||||
android:defaultValue="false"
|
android:defaultValue="false"
|
||||||
android:key="minimize_priority"
|
android:key="minimize_priority"
|
||||||
|
Loading…
Reference in New Issue
Block a user