Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Major Changes to weather widget #10

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open

Conversation

cshariq
Copy link

@cshariq cshariq commented Jun 30, 2023

I have done some major changes to the weather widget to enhance it. These are the following changes:

  • Using weather.com api to avoid Unknown Information error

  • Uses bing maps api to get users location for more accurate weather and location

  • Adds a new option to adjust update frequency

  • Can now display neighbourhood, city or address thanks to bing maps api

  • You can now see 10 day forecast by swiping on the widget

  • You can open the weather app on mac os 13 and over by tapping the weather widget

  • New icons and options to switch between Illustrated, default, outlined and filled icons

  • There's now an icon only mode

When looking at the files changed section you can filter .png and .json files as they're all the new icons/assets and don't require any checking.

I have done some major changes to the weather api to enhance it. These are the following changes:

- Using weather.com api to avoid Unknown Information error

- Uses bing maps api to get users location for more accurate weather and location

- Adds a new option to adjust update frequency

- Can now display neighbourhood, city or address thanks to bing maps api

- You can now see 10 day forecast by swiping on the widget

- You can open the weather app on mac os 13 and over by tapping the weather widget

- There's now an icon only mode
@pigigaldi
Copy link
Contributor

Thank you for you hard work!
I'll try to review this asap :)

Just a quick tip for the future, you should avoid putting all changes into a single commit. Next time you could try split changes across multiple commits, with meaningful commit message (see other commits for message structure). This would make the review process much easier! :)

@cshariq
Copy link
Author

cshariq commented Jun 30, 2023

Ok thanks for the feedback, i've just started using GitHub, in fact this is my 2nd pull request. I'll try to keep your tips in mind for future commits.

NotificationCenter.default.addObserver(self, selector: #selector(updateCurrentCondition), name: .didChangeWidgetPreferences, object: nil)
timer = Timer.scheduledTimer(withTimeInterval: 3600, repeats: true, block: { [weak self] _ in
if Preferences[.UpdateFrequency] == "Fifteen"{timers = 900} else if Preferences[.UpdateFrequency] == "Thirty"{timers = 1800} else{timers = 3600}
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Modify update frequency based on user settings.

super.didLoad()
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
NotificationCenter.default.post(name: .didChangeWidgetPreferences, object: nil)
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Update info when pock loads.

super.didLoad()
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
NotificationCenter.default.post(name: .didChangeWidgetPreferences, object: nil)
}
}
override func didTapHandler() {
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Double tap, triple tap and single tap detection. Opens weather app when taped once. In the future double and triple tap will show info like UV Index, Feels Like and more.

return

}
override func didSwipeRightHandler() {
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Goes back a day when viewing 10 day forecast.

}
}
}
override func didSwipeLeftHandler() {
Copy link
Author

@cshariq cshariq Jun 30, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shows 10 day forecast when swiped left.

} else if let systemIcon = NSImage(named: data.weather.icon) {
view.set(image: systemIcon)
let locality = data.weather.name
if Preferences[.ShowIconOnly] == false || !(Day == 0){
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shows icon only based on user settings. Intentionally shows information if not viewing current forecast.

let url_for_maps = URL(string: "https://dev.virtualearth.net/REST/v1/Locations/\(latitude),\(longitude)?includeNeighborhood=1&include=ciso2&o=json&key=Amn3nivKYow4ej0mliZVLFonh7W6ZBOlQz8FVrH0AJbK6_wViio1P8mrDODAgs6U")!
let url_for_weaather = URL(string: "https://api.weather.com/v1/geocode/\(latitude)/\(longitude)/aggregate.json?apiKey=e45ff1b7c7bda231216c7ab7c33509b8&products=conditionsshort,fcstdaily10short,fcsthourly24short,nowlinks")!
let MapRequest = URLRequest(url: url_for_maps, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 20)
let GetMaps = URLSession.shared.dataTask(with: MapRequest) { Mapdata, response, error in
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Get's city, neighbourhood, address and other info based on coordinates using bing maps api.

return
}
// f
let decoder = JSONDecoder()
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Decode response received from bing maps and extract the info.

var neighborhood = address.neighborhood
var postalCode = address.postalCode
var countryRegionIso2 = address.countryRegionIso2
if Day == 0{
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checks user settings and provides the right info to display.

}

let request2 = URLRequest(url: url_for_weaather, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 20)
let GetWeather = URLSession.shared.dataTask( with: request2) { Wdata, response, error in
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Get's the weather using weather.com api.

let weather = try? decoder.decode(WeatherResponse.self, from: Wdata)
let observation = weather?.conditionsshort?.observation
let FutureForcast = weather?.fcstdaily10short?.forecasts?[Day]
if !(Day == 0){
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checks what day needs to be displayed.

if Preferences[.show_description]{
switch units {
case "celsius":
if description.count > 19{
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adjust title and description formatting based on the length of the info.

// } catch {
// print("Error: \(error.localizedDescription)")
// }
let decoder = JSONDecoder()
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Decodes response received from weather.com api.

}else if Preferences[.IconStyle] == "Filled"{
Icon = "2-" + String(DisplayIcon!)
}else if Preferences[.IconStyle] == "Default"{
if DisplayIcon == 011 || DisplayIcon == 012 || DisplayIcon == 013 || DisplayIcon == 014 || DisplayIcon == 016 || DisplayIcon == 019 || DisplayIcon == 020 || DisplayIcon == 021 || DisplayIcon == 022 || DisplayIcon == 026 || DisplayIcon == 027 || DisplayIcon == 028 || DisplayIcon == 029 || DisplayIcon == 030 || DisplayIcon == 031 || DisplayIcon == 032 || DisplayIcon == 036 || DisplayIcon == 037 || DisplayIcon == 038 || DisplayIcon == 039 || DisplayIcon == 040 || DisplayIcon == 047{
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checks if icon is available in default icon pack, if not it displays outlined icon pack.

}
print(String(DisplayIcon!))
if Preferences[.IconStyle] == "Outlined"{
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checks user preferences and sets the icon accordingly.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since the location is taken using the device's coordinates and bing maps api this is no longer needed.

cshariq added 2 commits August 1, 2023 19:22
Fixes a glitch where the view isn't automatically reset to the current weather/conditions after 10 seconds when swiped more than once.
- New icon and temp mode
- New only temp mode
- See more info about the selected day's weather by double tapping the widget
- Bug Fixes
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants