diff --git a/app/build.gradle b/app/build.gradle index 7f09280..3945a56 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,7 +13,7 @@ android { applicationId "com.tommasoberlose.anotherwidget" minSdkVersion 19 targetSdkVersion 26 - versionCode 1 + versionCode 2 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } @@ -23,6 +23,9 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + dataBinding { + enabled = true + } } dependencies { @@ -33,9 +36,12 @@ dependencies { androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.1', { exclude group: 'com.android.support', module: 'support-annotations' }) - implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" compile 'com.survivingwithandroid:weatherlib:1.6.0' compile 'com.survivingwithandroid:weatherlib_volleyclient:1.6.0' compile 'com.mcxiaoke.volley:library:1.0.6@aar' compile 'com.android.support:customtabs:26.1.0' + compile 'com.android.support:cardview-v7:26.1.0' + compile 'com.heinrichreimersoftware:material-intro:1.6.2' + kapt 'com.android.databinding:compiler:2.3.3' } diff --git a/app/release/output.json b/app/release/output.json index 5d1fee2..1fdbf41 100644 --- a/app/release/output.json +++ b/app/release/output.json @@ -1 +1 @@ -[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1},"path":"app-release.apk","properties":{"packageId":"com.tommasoberlose.anotherwidget","split":"","minSdkVersion":"19"}}] \ No newline at end of file +[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":2},"path":"app-release.apk","properties":{"packageId":"com.tommasoberlose.anotherwidget","split":"","minSdkVersion":"19"}}] \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4d6ee20..370b8e5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,7 +16,9 @@ android:theme="@style/AppTheme"> + android:launchMode="singleInstance" + android:configChanges="keyboardHidden|orientation|screenSize" + android:screenOrientation="portrait"> @@ -60,6 +62,11 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/object/Constants.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/object/Constants.kt index 1b6e98f..b4efcc9 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/object/Constants.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/object/Constants.kt @@ -11,8 +11,10 @@ object Constants { val CALENDAR_REQUEST_CODE = 1 val LOCATION_REQUEST_CODE = 2 + val PREF_FIRST_STEP = "PREF_FIRST_STEP" val PREF_WEATHER_ICON = "PREF_WEATHER_ICON" val PREF_WEATHER_TEMP = "PREF_WEATHER_TEMP" + val PREF_WEATHER_TEMP_UNIT = "PREF_WEATHER_TEMP_UNIT" val dateFormat = SimpleDateFormat("EEEE, MMM d", Locale.getDefault()) val hourFormat = SimpleDateFormat("HH:mm", Locale.getDefault()) diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/MainActivity.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/MainActivity.kt index f9f3cac..f0779b6 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/MainActivity.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/MainActivity.kt @@ -1,14 +1,19 @@ package com.tommasoberlose.anotherwidget.ui.activity import android.Manifest +import android.annotation.SuppressLint +import android.app.PendingIntent import android.content.pm.PackageManager import android.support.v7.app.AppCompatActivity import android.os.Bundle import android.support.v4.app.ActivityCompat import android.appwidget.AppWidgetManager -import android.content.Intent -import android.content.ComponentName +import android.content.* +import android.preference.PreferenceManager +import android.provider.CalendarContract +import android.support.v4.content.ContextCompat import android.view.View +import android.widget.RemoteViews import android.widget.Toast import com.tommasoberlose.anotherwidget.`object`.Constants import com.tommasoberlose.anotherwidget.R @@ -17,15 +22,30 @@ import com.tommasoberlose.anotherwidget.ui.widget.TheWidget import com.tommasoberlose.anotherwidget.util.UpdatesReceiver import com.tommasoberlose.anotherwidget.util.WeatherReceiver import kotlinx.android.synthetic.main.activity_main.* +import kotlinx.android.synthetic.main.the_widget.* +import java.util.* +import java.util.concurrent.TimeUnit +import android.content.Intent +import android.content.BroadcastReceiver class MainActivity : AppCompatActivity() { + private val receiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + updateUI() + } + } + + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + receiver + + // TODO Util.showIntro(this) action_support.setOnClickListener(object: View.OnClickListener { override fun onClick(p0: View?) { @@ -33,31 +53,30 @@ class MainActivity : AppCompatActivity() { } }) - action_rate.setOnClickListener(object: View.OnClickListener { - override fun onClick(p0: View?) { - Util.openURI(this@MainActivity, "") - } - }) - action_share.setOnClickListener(object: View.OnClickListener { override fun onClick(p0: View?) { Util.share(this@MainActivity) } }) - action_github.setOnClickListener(object: View.OnClickListener { + action_project.setOnClickListener(object: View.OnClickListener { override fun onClick(p0: View?) { Util.openURI(this@MainActivity, "https://github.com/tommasoberlose/another-widget") } }) - - } override fun onResume() { super.onResume() + val filter = IntentFilter() + filter.addAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); + registerReceiver(receiver, filter); updateUI() - Util.updateWidget(this) + } + + override fun onPause() { + unregisterReceiver(receiver); + super.onPause(); } override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, @@ -80,6 +99,7 @@ class MainActivity : AppCompatActivity() { no_calendar_permission_container.visibility= View.GONE no_location_permission_container.visibility= View.GONE all_set_container.visibility = View.GONE + updateSettings() if (!Util.checkGrantedPermission(this, Manifest.permission.READ_CALENDAR)) { no_calendar_permission_container.visibility = View.VISIBLE @@ -100,7 +120,94 @@ class MainActivity : AppCompatActivity() { all_set_container.visibility = View.VISIBLE } } + updateAppWidget() + Util.updateWidget(this) } + internal fun updateAppWidget() { + widget_bg.setImageDrawable(Util.getCurrentWallpaper(this)) + updateCalendarView() + updateLocationView() + } + + fun updateCalendarView() { + val now = Calendar.getInstance() + val calendarLayout = Util.checkGrantedPermission(this, Manifest.permission.READ_CALENDAR) + + empty_layout.visibility = View.VISIBLE + calendar_layout.visibility = View.GONE + empty_date.text = String.format("%s%s", Constants.dateFormat.format(now.time)[0].toUpperCase(), Constants.dateFormat.format(now.time).substring(1)) + + if (calendarLayout) { + val eventList = Util.getNextEvent(this) + + if (eventList.isNotEmpty()) { + val difference = eventList[0].startDate - now.timeInMillis + + if (difference > 1000 * 60) { + var time = "" + val hour = TimeUnit.MILLISECONDS.toHours(difference) + if (hour > 0) { + time = hour.toString() + getString(R.string.h_code) + } + val minutes = TimeUnit.MILLISECONDS.toMinutes(difference - hour * 3600 * 1000) + if (minutes > 0) { + time += " " + minutes + getString(R.string.min_code) + } + + next_event.text = String.format("%s %s %s", eventList[0].title, getString(R.string.in_code), time) + } else { + next_event.text = String.format("%s", eventList[0].title) + } + next_event_date.text = String.format("%s - %s", Constants.hourFormat.format(eventList[0].startDate), Constants.hourFormat.format(eventList[0].endDate)) + + empty_layout.visibility = View.GONE + calendar_layout.visibility = View.VISIBLE + } + } + } + + fun updateLocationView() { + val locationLayout = Util.checkGrantedPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) + + val SP = PreferenceManager.getDefaultSharedPreferences(this) + if (locationLayout && SP.contains(Constants.PREF_WEATHER_TEMP) && SP.contains(Constants.PREF_WEATHER_ICON)) { + weather.visibility = View.VISIBLE + calendar_weather.visibility = View.VISIBLE + val currentTemp = String.format(Locale.getDefault(), "%.0f °%s", SP.getFloat(Constants.PREF_WEATHER_TEMP, 0f), SP.getString(Constants.PREF_WEATHER_TEMP_UNIT, "F")) + + + weather_icon.visibility = View.VISIBLE + empty_weather_icon.visibility = View.VISIBLE + val icon: String = SP.getString(Constants.PREF_WEATHER_ICON, "") + if (icon.equals("")) { + weather_icon.visibility = View.GONE + empty_weather_icon.visibility = View.GONE + } else { + weather_icon.setImageResource(Util.getWeatherIconResource(icon)) + empty_weather_icon.setImageResource(Util.getWeatherIconResource(icon)) + } + + temp.text = currentTemp + calendar_temp.text = currentTemp + } else { + weather.visibility = View.GONE + calendar_weather.visibility = View.GONE + } + } + + fun updateSettings() { + val SP = PreferenceManager.getDefaultSharedPreferences(this) + temp_unit.text = if (SP.getString(Constants.PREF_WEATHER_TEMP_UNIT, "F").equals("F")) getString(R.string.fahrenheit) else getString(R.string.celsius) + action_change_unit.setOnClickListener(object: View.OnClickListener { + @SuppressLint("ApplySharedPref") + override fun onClick(p0: View?) { + SP.edit().putString(Constants.PREF_WEATHER_TEMP_UNIT, if (SP.getString(Constants.PREF_WEATHER_TEMP_UNIT, "F").equals("F")) "C" else "F").commit() + Util.getWeather(this@MainActivity) + updateSettings() + } + }) + } + } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/SplashActivity.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/SplashActivity.kt new file mode 100644 index 0000000..ba4b70f --- /dev/null +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/SplashActivity.kt @@ -0,0 +1,41 @@ +package com.tommasoberlose.anotherwidget.ui.activity + +import android.Manifest +import android.os.Bundle +import com.tommasoberlose.anotherwidget.R +import com.heinrichreimersoftware.materialintro.app.IntroActivity +import com.heinrichreimersoftware.materialintro.slide.SimpleSlide + + +class SplashActivity : IntroActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + isButtonNextVisible = true + isButtonBackVisible = false + isButtonCtaVisible = false + buttonCtaTintMode = BUTTON_CTA_TINT_MODE_TEXT + + addSlide(SimpleSlide.Builder() + .title(R.string.app_name) + .background(R.color.colorPrimary) + .backgroundDark(R.color.colorPrimaryDark) + .build()) + + addSlide(SimpleSlide.Builder() + .title(R.string.title_permission_calendar) + .description(R.string.description_permission_calendar) + .background(R.color.colorPrimary) + .backgroundDark(R.color.colorPrimaryDark) + .permission(Manifest.permission.READ_CALENDAR) + .build()) + + addSlide(SimpleSlide.Builder() + .title(R.string.title_permission_location) + .description(R.string.description_permission_location) + .background(R.color.colorPrimary) + .backgroundDark(R.color.colorPrimaryDark) + .permission(Manifest.permission.ACCESS_COARSE_LOCATION) + .build()) + } +} diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widget/TheWidget.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widget/TheWidget.kt index 7acf060..2f99ab8 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widget/TheWidget.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widget/TheWidget.kt @@ -68,156 +68,86 @@ class TheWidget : AppWidgetProvider() { } fun updateCalendarView(context: Context, views: RemoteViews, widgetID: Int): RemoteViews { - val now = Calendar.getInstance() - val calendarLayout = Util.checkGrantedPermission(context, Manifest.permission.READ_CALENDAR) + val now = Calendar.getInstance() + val calendarLayout = Util.checkGrantedPermission(context, Manifest.permission.READ_CALENDAR) - views.setViewVisibility(R.id.empty_layout, View.VISIBLE) - views.setViewVisibility(R.id.calendar_layout, View.GONE) - views.setTextViewText(R.id.empty_date, Constants.dateFormat.format(now.time)) + views.setViewVisibility(R.id.empty_layout, View.VISIBLE) + views.setViewVisibility(R.id.calendar_layout, View.GONE) + views.setTextViewText(R.id.empty_date, Constants.dateFormat.format(now.time)) - val calIntent = Intent(Intent.ACTION_MAIN) - calIntent.addCategory(Intent.CATEGORY_APP_CALENDAR) - val calPIntent = PendingIntent.getActivity(context, widgetID, calIntent, 0) - views.setOnClickPendingIntent(R.id.main_layout, calPIntent) + val calIntent = Intent(Intent.ACTION_MAIN) + calIntent.addCategory(Intent.CATEGORY_APP_CALENDAR) + val calPIntent = PendingIntent.getActivity(context, widgetID, calIntent, 0) + views.setOnClickPendingIntent(R.id.main_layout, calPIntent) - if (calendarLayout) { - val eventList = Util.getNextEvent(context) + if (calendarLayout) { + val eventList = Util.getNextEvent(context) - if (eventList.isNotEmpty()) { - val difference = eventList[0].startDate - now.timeInMillis + if (eventList.isNotEmpty()) { + val difference = eventList[0].startDate - now.timeInMillis - if (difference > 1000 * 60) { - var time = "" - val hour = TimeUnit.MILLISECONDS.toHours(difference) - if (hour > 0) { - time = hour.toString() + "h" - } - val minutes = TimeUnit.MILLISECONDS.toMinutes(difference - hour * 3600 * 1000) - if (minutes > 0) { - time += " " + minutes + "min" + if (difference > 1000 * 60) { + var time = "" + val hour = TimeUnit.MILLISECONDS.toHours(difference) + if (hour > 0) { + time = hour.toString() + context.getString(R.string.h_code) + } + val minutes = TimeUnit.MILLISECONDS.toMinutes(difference - hour * 3600 * 1000) + if (minutes > 0) { + time += " " + minutes + context.getString(R.string.min_code) + } + + views.setTextViewText(R.id.next_event, String.format("%s %s %s", eventList[0].title, context.getString(R.string.in_code), time)) + } else { + views.setTextViewText(R.id.next_event, String.format("%s", eventList[0].title)) } + views.setTextViewText(R.id.next_event_date, String.format("%s - %s", Constants.hourFormat.format(eventList[0].startDate), Constants.hourFormat.format(eventList[0].endDate))) - views.setTextViewText(R.id.next_event, String.format("%s in %s", eventList[0].title, time)) - } else { - views.setTextViewText(R.id.next_event, String.format("%s", eventList[0].title)) + views.setViewVisibility(R.id.empty_layout, View.GONE) + views.setViewVisibility(R.id.calendar_layout, View.VISIBLE) + + val builder = CalendarContract.CONTENT_URI.buildUpon() + builder.appendPath("time") + ContentUris.appendId(builder, eventList[0].startDate) + val intent = Intent(Intent.ACTION_VIEW) + .setData(builder.build()) + val pIntent = PendingIntent.getActivity(context, widgetID, intent, 0) + views.setOnClickPendingIntent(R.id.main_layout, pIntent) } - views.setTextViewText(R.id.next_event_date, String.format("%s - %s", Constants.hourFormat.format(eventList[0].startDate), Constants.hourFormat.format(eventList[0].endDate))) - - views.setViewVisibility(R.id.empty_layout, View.GONE) - views.setViewVisibility(R.id.calendar_layout, View.VISIBLE) - - val builder = CalendarContract.CONTENT_URI.buildUpon() - builder.appendPath("time") - ContentUris.appendId(builder, eventList[0].startDate) - val intent = Intent(Intent.ACTION_VIEW) - .setData(builder.build()) - val pIntent = PendingIntent.getActivity(context, widgetID, intent, 0) - views.setOnClickPendingIntent(R.id.main_layout, pIntent) } + + return views } - return views - } + fun updateLocationView(context: Context, views: RemoteViews): RemoteViews { + val locationLayout = Util.checkGrantedPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) - fun updateLocationView(context: Context, views: RemoteViews): RemoteViews { - val locationLayout = Util.checkGrantedPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) - - val SP = PreferenceManager.getDefaultSharedPreferences(context) - if (locationLayout && SP.contains(Constants.PREF_WEATHER_TEMP) && SP.contains(Constants.PREF_WEATHER_ICON)) { - views.setViewVisibility(R.id.weather, View.VISIBLE) - views.setViewVisibility(R.id.calendar_weather, View.VISIBLE) - val temp = String.format(Locale.getDefault(), "%.0f °C", SP.getFloat(Constants.PREF_WEATHER_TEMP, 0f)) + val SP = PreferenceManager.getDefaultSharedPreferences(context) + if (locationLayout && SP.contains(Constants.PREF_WEATHER_TEMP) && SP.contains(Constants.PREF_WEATHER_ICON)) { + views.setViewVisibility(R.id.weather, View.VISIBLE) + views.setViewVisibility(R.id.calendar_weather, View.VISIBLE) + val temp = String.format(Locale.getDefault(), "%.0f °%s", SP.getFloat(Constants.PREF_WEATHER_TEMP, 0f), SP.getString(Constants.PREF_WEATHER_TEMP_UNIT, "F")) - views.setViewVisibility(R.id.weather_icon, View.VISIBLE) - views.setViewVisibility(R.id.empty_weather_icon, View.VISIBLE) - when (SP.getString(Constants.PREF_WEATHER_ICON, "")) { - "01d" -> { - views.setImageViewResource(R.id.weather_icon, R.drawable.clear_day) - views.setImageViewResource(R.id.empty_weather_icon, R.drawable.clear_day) - } - "02d" -> { - views.setImageViewResource(R.id.weather_icon, R.drawable.partly_cloudy) - views.setImageViewResource(R.id.empty_weather_icon, R.drawable.partly_cloudy) - } - "03d" -> { - views.setImageViewResource(R.id.weather_icon, R.drawable.mostly_cloudy) - views.setImageViewResource(R.id.empty_weather_icon, R.drawable.mostly_cloudy) - } - "04d" -> { - views.setImageViewResource(R.id.weather_icon, R.drawable.cloudy_weather) - views.setImageViewResource(R.id.empty_weather_icon, R.drawable.cloudy_weather) - } - "09d" -> { - views.setImageViewResource(R.id.weather_icon, R.drawable.storm_weather_day) - views.setImageViewResource(R.id.empty_weather_icon, R.drawable.storm_weather_day) - } - "10d" -> { - views.setImageViewResource(R.id.weather_icon, R.drawable.rainy_day) - views.setImageViewResource(R.id.empty_weather_icon, R.drawable.rainy_day) - } - "11d" -> { - views.setImageViewResource(R.id.weather_icon, R.drawable.thunder_day) - views.setImageViewResource(R.id.empty_weather_icon, R.drawable.thunder_day) - } - "13d" -> { - views.setImageViewResource(R.id.weather_icon, R.drawable.snow_day) - views.setImageViewResource(R.id.empty_weather_icon, R.drawable.snow_day) - } - "50d" -> { - views.setImageViewResource(R.id.weather_icon, R.drawable.haze_day) - views.setImageViewResource(R.id.empty_weather_icon, R.drawable.haze_day) - } - "01n" -> { - views.setImageViewResource(R.id.weather_icon, R.drawable.clear_night) - views.setImageViewResource(R.id.empty_weather_icon, R.drawable.clear_night) - } - "02n" -> { - views.setImageViewResource(R.id.weather_icon, R.drawable.partly_cloudy_night) - views.setImageViewResource(R.id.empty_weather_icon, R.drawable.partly_cloudy_night) - } - "03n" -> { - views.setImageViewResource(R.id.weather_icon, R.drawable.mostly_cloudy_night) - views.setImageViewResource(R.id.empty_weather_icon, R.drawable.mostly_cloudy_night) - } - "04n" -> { - views.setImageViewResource(R.id.weather_icon, R.drawable.cloudy_weather) - views.setImageViewResource(R.id.empty_weather_icon, R.drawable.cloudy_weather) - } - "09n" -> { - views.setImageViewResource(R.id.weather_icon, R.drawable.storm_weather_night) - views.setImageViewResource(R.id.empty_weather_icon, R.drawable.storm_weather_night) - } - "10n" -> { - views.setImageViewResource(R.id.weather_icon, R.drawable.rainy_night) - views.setImageViewResource(R.id.empty_weather_icon, R.drawable.rainy_night) - } - "11n" -> { - views.setImageViewResource(R.id.weather_icon, R.drawable.thunder_night) - views.setImageViewResource(R.id.empty_weather_icon, R.drawable.thunder_night) - } - "13n" -> { - views.setImageViewResource(R.id.weather_icon, R.drawable.snow_night) - views.setImageViewResource(R.id.empty_weather_icon, R.drawable.snow_night) - } - "50n" -> { - views.setImageViewResource(R.id.weather_icon, R.drawable.haze_night) - views.setImageViewResource(R.id.empty_weather_icon, R.drawable.haze_night) - } - else -> { + views.setViewVisibility(R.id.weather_icon, View.VISIBLE) + views.setViewVisibility(R.id.empty_weather_icon, View.VISIBLE) + val icon: String = SP.getString(Constants.PREF_WEATHER_ICON, "") + if (icon.equals("")) { views.setViewVisibility(R.id.weather_icon, View.GONE) views.setViewVisibility(R.id.empty_weather_icon, View.GONE) + } else { + views.setImageViewResource(R.id.weather_icon, Util.getWeatherIconResource(icon)) + views.setImageViewResource(R.id.empty_weather_icon, Util.getWeatherIconResource(icon)) } - } - views.setTextViewText(R.id.temp, temp) - views.setTextViewText(R.id.calendar_temp, temp) - } else { - views.setViewVisibility(R.id.weather, View.GONE) - views.setViewVisibility(R.id.calendar_weather, View.GONE) - } - return views + views.setTextViewText(R.id.temp, temp) + views.setTextViewText(R.id.calendar_temp, temp) + } else { + views.setViewVisibility(R.id.weather, View.GONE) + views.setViewVisibility(R.id.calendar_weather, View.GONE) + } + return views } } } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/util/Util.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/util/Util.kt index b8e469d..c8050a9 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/util/Util.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/util/Util.kt @@ -5,10 +5,11 @@ import android.annotation.SuppressLint import android.app.Notification import android.app.NotificationManager import android.app.PendingIntent +import android.app.WallpaperManager import android.appwidget.AppWidgetManager import android.content.* import android.content.pm.PackageManager -import android.database.Cursor +import android.graphics.drawable.Drawable import android.location.Location import android.location.LocationListener import android.location.LocationManager @@ -16,26 +17,23 @@ import android.net.Uri import android.os.Bundle import android.preference.PreferenceManager import android.provider.CalendarContract +import android.support.annotation.DrawableRes import android.support.customtabs.CustomTabsIntent import android.support.v4.app.NotificationCompat import android.support.v4.content.ContextCompat import android.util.Log import com.survivingwithandroid.weather.lib.WeatherClient import com.survivingwithandroid.weather.lib.WeatherConfig -import com.survivingwithandroid.weather.lib.exception.LocationProviderNotFoundException import com.survivingwithandroid.weather.lib.exception.WeatherLibException -import com.survivingwithandroid.weather.lib.model.City import com.survivingwithandroid.weather.lib.model.CurrentWeather -import com.survivingwithandroid.weather.lib.provider.forecastio.ForecastIOProviderType -import com.survivingwithandroid.weather.lib.provider.forecastio.ForecastIOWeatherProvider import com.survivingwithandroid.weather.lib.provider.openweathermap.OpenweathermapProviderType -import com.survivingwithandroid.weather.lib.provider.yahooweather.YahooProviderType import com.survivingwithandroid.weather.lib.request.WeatherRequest import com.tommasoberlose.anotherwidget.R import com.tommasoberlose.anotherwidget.`object`.Constants import com.tommasoberlose.anotherwidget.`object`.Event import com.tommasoberlose.anotherwidget.ui.activity.MainActivity +import com.tommasoberlose.anotherwidget.ui.activity.SplashActivity import com.tommasoberlose.anotherwidget.ui.widget.TheWidget import java.util.ArrayList @@ -80,7 +78,7 @@ object Util { for (j in 0 until eventCursor.count) { val e = Event(eventCursor, instanceCursor) - if (e.endDate - now.timeInMillis > 1000 * 60 * 60) { + if (e.endDate - now.timeInMillis > 1000 * 60 * 30) { eventList.add(e) } eventCursor.moveToNext() @@ -147,7 +145,7 @@ object Util { try { val config = WeatherConfig() - config.unitSystem = WeatherConfig.UNIT_SYSTEM.M + config.unitSystem = if (SP.getString(Constants.PREF_WEATHER_TEMP_UNIT, "F").equals("C")) WeatherConfig.UNIT_SYSTEM.M else WeatherConfig.UNIT_SYSTEM.I config.lang = "en" // If you want to use english config.maxResult = 1 // Max number of cities retrieved config.numDays = 1 // Max num of days in the forecast @@ -162,7 +160,6 @@ object Util { client.getCurrentCondition(WeatherRequest(location.longitude, location.latitude), object : WeatherClient.WeatherEventListener { @SuppressLint("ApplySharedPref") override fun onWeatherRetrieved(currentWeather: CurrentWeather) { - Log.d("AW", "TEMP:" + currentWeather.weather.currentCondition.icon); SP.edit() .putFloat(Constants.PREF_WEATHER_TEMP, currentWeather.weather.temperature.temp) .putString(Constants.PREF_WEATHER_ICON, currentWeather.weather.currentCondition.icon) @@ -235,4 +232,79 @@ object Util { sendIntent.setType("text/plain"); context.startActivity(Intent.createChooser(sendIntent, context.getString(R.string.action_share))); } + + fun showIntro(context: Context) { + val SP: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) + val firstTime: Boolean = SP.getBoolean(Constants.PREF_FIRST_STEP, true) + // TODO SP.edit().putBoolean(Constants.PREF_FIRST_STEP, false).apply() + if (firstTime) { + context.startActivity(Intent(context, SplashActivity::class.java)) + } + } + + fun getWeatherIconResource(icon: String): Int { + when (icon) { + "01d" -> { + return R.drawable.clear_day + } + "02d" -> { + return R.drawable.partly_cloudy + } + "03d" -> { + return R.drawable.mostly_cloudy + } + "04d" -> { + return R.drawable.cloudy_weather + } + "09d" -> { + return R.drawable.storm_weather_day + } + "10d" -> { + return R.drawable.rainy_day + } + "11d" -> { + return R.drawable.thunder_day + } + "13d" -> { + return R.drawable.snow_day + } + "50d" -> { + return R.drawable.haze_day + } + "01n" -> { + return R.drawable.clear_night + } + "02n" -> { + return R.drawable.partly_cloudy_night + } + "03n" -> { + return R.drawable.mostly_cloudy_night + } + "04n" -> { + return R.drawable.cloudy_weather + } + "09n" -> { + return R.drawable.storm_weather_night + } + "10n" -> { + return R.drawable.rainy_night + } + "11n" -> { + return R.drawable.thunder_night + } + "13n" -> { + return R.drawable.snow_night + } + "50n" -> { + return R.drawable.haze_night + } + else -> { + return -1 + } + } + } + + fun getCurrentWallpaper(context: Context): Drawable { + return WallpaperManager.getInstance(context).getDrawable(); + } } diff --git a/app/src/main/res/drawable-hdpi/ic_action_code.png b/app/src/main/res/drawable-hdpi/ic_action_code.png new file mode 100644 index 0000000..3811ff9 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_code.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_face.png b/app/src/main/res/drawable-hdpi/ic_action_face.png new file mode 100644 index 0000000..3b54f95 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_face.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_library.png b/app/src/main/res/drawable-hdpi/ic_action_library.png new file mode 100644 index 0000000..ae63300 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_library.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_sms.png b/app/src/main/res/drawable-hdpi/ic_action_sms.png new file mode 100644 index 0000000..cd1806c Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_sms.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_action_code.png b/app/src/main/res/drawable-mdpi/ic_action_code.png new file mode 100644 index 0000000..5dcd105 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_action_code.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_action_face.png b/app/src/main/res/drawable-mdpi/ic_action_face.png new file mode 100644 index 0000000..32efd39 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_action_face.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_action_library.png b/app/src/main/res/drawable-mdpi/ic_action_library.png new file mode 100644 index 0000000..06e6f7d Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_action_library.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_action_sms.png b/app/src/main/res/drawable-mdpi/ic_action_sms.png new file mode 100644 index 0000000..b9f96fc Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_action_sms.png differ diff --git a/app/src/main/res/drawable-nodpi/example_appwidget_preview.png b/app/src/main/res/drawable-nodpi/example_appwidget_preview.png deleted file mode 100644 index 894b069..0000000 Binary files a/app/src/main/res/drawable-nodpi/example_appwidget_preview.png and /dev/null differ diff --git a/app/src/main/res/drawable-nodpi/widget_preview.jpg b/app/src/main/res/drawable-nodpi/widget_preview.jpg new file mode 100644 index 0000000..09b7b43 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/widget_preview.jpg differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_code.png b/app/src/main/res/drawable-xhdpi/ic_action_code.png new file mode 100644 index 0000000..1d9ba40 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_code.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_face.png b/app/src/main/res/drawable-xhdpi/ic_action_face.png new file mode 100644 index 0000000..50ae8a8 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_face.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_library.png b/app/src/main/res/drawable-xhdpi/ic_action_library.png new file mode 100644 index 0000000..50e6f94 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_library.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_sms.png b/app/src/main/res/drawable-xhdpi/ic_action_sms.png new file mode 100644 index 0000000..225ac11 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_sms.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_code.png b/app/src/main/res/drawable-xxhdpi/ic_action_code.png new file mode 100644 index 0000000..fe1c16a Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_code.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_face.png b/app/src/main/res/drawable-xxhdpi/ic_action_face.png new file mode 100644 index 0000000..f4a3989 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_face.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_library.png b/app/src/main/res/drawable-xxhdpi/ic_action_library.png new file mode 100644 index 0000000..6fdd7f1 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_library.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_sms.png b/app/src/main/res/drawable-xxhdpi/ic_action_sms.png new file mode 100644 index 0000000..5863c6d Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_sms.png differ diff --git a/app/src/main/res/drawable/clear_day.png b/app/src/main/res/drawable/clear_day.png index 7668543..26a6137 100755 Binary files a/app/src/main/res/drawable/clear_day.png and b/app/src/main/res/drawable/clear_day.png differ diff --git a/app/src/main/res/drawable/clear_night.png b/app/src/main/res/drawable/clear_night.png index 3059ce9..ab9d246 100755 Binary files a/app/src/main/res/drawable/clear_night.png and b/app/src/main/res/drawable/clear_night.png differ diff --git a/app/src/main/res/drawable/cloudy_weather.png b/app/src/main/res/drawable/cloudy_weather.png index af10b10..add6383 100755 Binary files a/app/src/main/res/drawable/cloudy_weather.png and b/app/src/main/res/drawable/cloudy_weather.png differ diff --git a/app/src/main/res/drawable/haze_day.png b/app/src/main/res/drawable/haze_day.png index 8a58826..df9de56 100755 Binary files a/app/src/main/res/drawable/haze_day.png and b/app/src/main/res/drawable/haze_day.png differ diff --git a/app/src/main/res/drawable/haze_night.png b/app/src/main/res/drawable/haze_night.png index 94e645b..df33c58 100755 Binary files a/app/src/main/res/drawable/haze_night.png and b/app/src/main/res/drawable/haze_night.png differ diff --git a/app/src/main/res/drawable/haze_weather.png b/app/src/main/res/drawable/haze_weather.png index 193d352..805953e 100755 Binary files a/app/src/main/res/drawable/haze_weather.png and b/app/src/main/res/drawable/haze_weather.png differ diff --git a/app/src/main/res/drawable/mostly_cloudy.png b/app/src/main/res/drawable/mostly_cloudy.png index 016361f..0e64be7 100755 Binary files a/app/src/main/res/drawable/mostly_cloudy.png and b/app/src/main/res/drawable/mostly_cloudy.png differ diff --git a/app/src/main/res/drawable/mostly_cloudy_night.png b/app/src/main/res/drawable/mostly_cloudy_night.png index 37a0133..a38045c 100755 Binary files a/app/src/main/res/drawable/mostly_cloudy_night.png and b/app/src/main/res/drawable/mostly_cloudy_night.png differ diff --git a/app/src/main/res/drawable/partly_cloudy.png b/app/src/main/res/drawable/partly_cloudy.png index da7bba3..809cda5 100755 Binary files a/app/src/main/res/drawable/partly_cloudy.png and b/app/src/main/res/drawable/partly_cloudy.png differ diff --git a/app/src/main/res/drawable/partly_cloudy_night.png b/app/src/main/res/drawable/partly_cloudy_night.png index 4c40868..1cf8c12 100755 Binary files a/app/src/main/res/drawable/partly_cloudy_night.png and b/app/src/main/res/drawable/partly_cloudy_night.png differ diff --git a/app/src/main/res/drawable/rain_snow.png b/app/src/main/res/drawable/rain_snow.png index 8786304..eb3199b 100755 Binary files a/app/src/main/res/drawable/rain_snow.png and b/app/src/main/res/drawable/rain_snow.png differ diff --git a/app/src/main/res/drawable/rain_snow_day.png b/app/src/main/res/drawable/rain_snow_day.png index ffb7fcb..b401e1f 100755 Binary files a/app/src/main/res/drawable/rain_snow_day.png and b/app/src/main/res/drawable/rain_snow_day.png differ diff --git a/app/src/main/res/drawable/rain_snow_night.png b/app/src/main/res/drawable/rain_snow_night.png index 425ec46..12b27af 100755 Binary files a/app/src/main/res/drawable/rain_snow_night.png and b/app/src/main/res/drawable/rain_snow_night.png differ diff --git a/app/src/main/res/drawable/rainy_day.png b/app/src/main/res/drawable/rainy_day.png index 7cd3b14..537a01f 100755 Binary files a/app/src/main/res/drawable/rainy_day.png and b/app/src/main/res/drawable/rainy_day.png differ diff --git a/app/src/main/res/drawable/rainy_night.png b/app/src/main/res/drawable/rainy_night.png index f6d26c6..dfef460 100755 Binary files a/app/src/main/res/drawable/rainy_night.png and b/app/src/main/res/drawable/rainy_night.png differ diff --git a/app/src/main/res/drawable/rainy_weather.png b/app/src/main/res/drawable/rainy_weather.png index 99df6ed..ddb2bd5 100755 Binary files a/app/src/main/res/drawable/rainy_weather.png and b/app/src/main/res/drawable/rainy_weather.png differ diff --git a/app/src/main/res/drawable/showcase.png b/app/src/main/res/drawable/showcase.png index d094d51..4e15c6f 100755 Binary files a/app/src/main/res/drawable/showcase.png and b/app/src/main/res/drawable/showcase.png differ diff --git a/app/src/main/res/drawable/snow_day.png b/app/src/main/res/drawable/snow_day.png index 363f918..bfae201 100755 Binary files a/app/src/main/res/drawable/snow_day.png and b/app/src/main/res/drawable/snow_day.png differ diff --git a/app/src/main/res/drawable/snow_night.png b/app/src/main/res/drawable/snow_night.png index c34aa1a..84a96ab 100755 Binary files a/app/src/main/res/drawable/snow_night.png and b/app/src/main/res/drawable/snow_night.png differ diff --git a/app/src/main/res/drawable/snow_weather.png b/app/src/main/res/drawable/snow_weather.png index b08fb89..bf3de5f 100755 Binary files a/app/src/main/res/drawable/snow_weather.png and b/app/src/main/res/drawable/snow_weather.png differ diff --git a/app/src/main/res/drawable/storm_weather.png b/app/src/main/res/drawable/storm_weather.png index adaa311..c7d0cb0 100755 Binary files a/app/src/main/res/drawable/storm_weather.png and b/app/src/main/res/drawable/storm_weather.png differ diff --git a/app/src/main/res/drawable/storm_weather_day.png b/app/src/main/res/drawable/storm_weather_day.png index 8cb290c..9743fc1 100755 Binary files a/app/src/main/res/drawable/storm_weather_day.png and b/app/src/main/res/drawable/storm_weather_day.png differ diff --git a/app/src/main/res/drawable/storm_weather_night.png b/app/src/main/res/drawable/storm_weather_night.png index d23581d..aa9b298 100755 Binary files a/app/src/main/res/drawable/storm_weather_night.png and b/app/src/main/res/drawable/storm_weather_night.png differ diff --git a/app/src/main/res/drawable/thunder_day.png b/app/src/main/res/drawable/thunder_day.png index 512b054..3d97d30 100755 Binary files a/app/src/main/res/drawable/thunder_day.png and b/app/src/main/res/drawable/thunder_day.png differ diff --git a/app/src/main/res/drawable/thunder_night.png b/app/src/main/res/drawable/thunder_night.png index 3cc624a..883c124 100755 Binary files a/app/src/main/res/drawable/thunder_night.png and b/app/src/main/res/drawable/thunder_night.png differ diff --git a/app/src/main/res/drawable/thunder_weather.png b/app/src/main/res/drawable/thunder_weather.png index a2312f6..80edb08 100755 Binary files a/app/src/main/res/drawable/thunder_weather.png and b/app/src/main/res/drawable/thunder_weather.png differ diff --git a/app/src/main/res/drawable/unknown.png b/app/src/main/res/drawable/unknown.png index 4887f60..b9f62e9 100755 Binary files a/app/src/main/res/drawable/unknown.png and b/app/src/main/res/drawable/unknown.png differ diff --git a/app/src/main/res/drawable/windy_day.png b/app/src/main/res/drawable/windy_day.png index ffdbf08..5dc15e4 100755 Binary files a/app/src/main/res/drawable/windy_day.png and b/app/src/main/res/drawable/windy_day.png differ diff --git a/app/src/main/res/drawable/windy_night.png b/app/src/main/res/drawable/windy_night.png index 54fd851..c4f76ca 100755 Binary files a/app/src/main/res/drawable/windy_night.png and b/app/src/main/res/drawable/windy_night.png differ diff --git a/app/src/main/res/drawable/windy_weather.png b/app/src/main/res/drawable/windy_weather.png index 5b20afb..b571fa1 100755 Binary files a/app/src/main/res/drawable/windy_weather.png and b/app/src/main/res/drawable/windy_weather.png differ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index f15ce5f..448ff12 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,233 +1,262 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:layout_margin="32dp" + android:id="@+id/toolbar" + android:gravity="center_vertical"> - - - + android:text="@string/main_pre_title" + android:alpha="0.6" + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:gravity="center_vertical" + style="@style/AnotherWidget.Main.Subtitle" + android:textAllCaps="true"/> + android:text="@string/app_name" + android:gravity="center_vertical" + style="@style/AnotherWidget.Main.Title" + android:textAllCaps="true"/> - + - - - + android:layout_height="match_parent" + android:scaleType="centerCrop" + android:id="@+id/widget_bg"/> + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/the_widget.xml b/app/src/main/res/layout/the_widget.xml index 9a19688..6ee3358 100644 --- a/app/src/main/res/layout/the_widget.xml +++ b/app/src/main/res/layout/the_widget.xml @@ -2,18 +2,17 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/main_layout"> - diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml new file mode 100644 index 0000000..ade5cab --- /dev/null +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -0,0 +1,27 @@ + + + Another Widget + Aggiungi Another Widget + Just + Concedi Accesso + Rimani Aggiornato + Molto bene! + Supporta + Valuta + Condividi + | + Ottieni di più dal tuo widget + Controlla il Meteo + Controlla i tuoi Impegni + Aggiungi gli eventi e il meteo al tuo widget. + Concedi l\'accesso al tuo calendario per vedere gli eventi. + Concedi l\'accesso alla tua posizione per vedere il meteo. + Hai completato la configurazione! Rimani aggiornato. + Info + ore + min + tra + Progetto + Unità di Misura + Modifica l\'unità di misura della temperatura + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 0bf55d3..bcabb1d 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -9,4 +9,6 @@ #48000000 #1A000000 #CCFFFFFF + #80FFFFFF + #204A85 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d3cb4db..615c17a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -16,4 +16,13 @@ Good Job! You have completed the configuration.\nWatch out for updates. Stay up to date + About + h + min + in + Project + Unit of Measure + Choose the unit of temperature measurement + °F - Fahrenheit + °C - Celsius diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 4f7ca1d..e58dca2 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -57,6 +57,18 @@ 12sp + + + +