From 0ec3dcbadb583bf1ed1f52f11edb41f2156054a3 Mon Sep 17 00:00:00 2001 From: Tommaso Berlose Date: Sun, 15 Oct 2017 19:39:15 +0200 Subject: [PATCH] Multiple changes --- app/build.gradle | 3 +- app/src/main/AndroidManifest.xml | 8 +- .../anotherwidget/object/Constants.kt | 2 + .../anotherwidget/receiver/WeatherReceiver.kt | 2 +- .../ui/activity/ChooseApplicationActivity.kt | 26 +- .../anotherwidget/ui/activity/MainActivity.kt | 88 +++++-- .../ui/activity/WeatherProviderActivity.kt | 71 +++++ .../ui/adapter/ApplicationInfoAdapter.kt | 44 ++++ .../anotherwidget/ui/widget/TheWidget.kt | 6 +- .../anotherwidget/util/CalendarUtil.kt | 124 ++++----- .../tommasoberlose/anotherwidget/util/Util.kt | 69 ++++- .../anotherwidget/util/WeatherUtil.kt | 144 ++++++---- .../res/drawable-hdpi/ic_action_alert.png | Bin 0 -> 896 bytes .../main/res/drawable-hdpi/ic_action_menu.png | Bin 0 -> 215 bytes .../res/drawable-hdpi/ic_action_paste.png | Bin 0 -> 412 bytes .../res/drawable-hdpi/ic_action_refresh.png | Bin 661 -> 815 bytes .../main/res/drawable-hdpi/ic_action_save.png | Bin 0 -> 291 bytes .../res/drawable-mdpi/ic_action_alert.png | Bin 0 -> 538 bytes .../main/res/drawable-mdpi/ic_action_menu.png | Bin 0 -> 160 bytes .../res/drawable-mdpi/ic_action_paste.png | Bin 0 -> 288 bytes .../res/drawable-mdpi/ic_action_refresh.png | Bin 419 -> 533 bytes .../main/res/drawable-mdpi/ic_action_save.png | Bin 0 -> 196 bytes .../res/drawable-xhdpi/ic_action_alert.png | Bin 0 -> 1119 bytes .../res/drawable-xhdpi/ic_action_menu.png | Bin 0 -> 274 bytes .../res/drawable-xhdpi/ic_action_paste.png | Bin 0 -> 476 bytes .../res/drawable-xhdpi/ic_action_refresh.png | Bin 832 -> 1066 bytes .../res/drawable-xhdpi/ic_action_save.png | Bin 0 -> 289 bytes .../res/drawable-xxhdpi/ic_action_alert.png | Bin 0 -> 1875 bytes .../res/drawable-xxhdpi/ic_action_menu.png | Bin 0 -> 508 bytes .../res/drawable-xxhdpi/ic_action_paste.png | Bin 0 -> 801 bytes .../res/drawable-xxhdpi/ic_action_refresh.png | Bin 1364 -> 1802 bytes .../res/drawable-xxhdpi/ic_action_save.png | Bin 0 -> 462 bytes .../res/drawable/ic_launcher_background.xml | 183 +++++-------- .../res/drawable/ic_launcher_foreground.xml | 34 +++ .../layout/activity_choose_application.xml | 3 +- .../res/layout/activity_custom_location.xml | 1 - app/src/main/res/layout/activity_main.xml | 246 +++++++----------- .../res/layout/activity_weather_provider.xml | 85 ++++++ .../res/layout/application_info_layout.xml | 24 ++ app/src/main/res/layout/main_menu_layout.xml | 144 ++++++++++ .../res/mipmap-anydpi-v26/ic_generic_app.xml | 5 + .../ic_generic_app_round.xml | 5 + .../main/res/mipmap-hdpi/ic_generic_app.png | Bin 0 -> 4826 bytes .../main/res/mipmap-mdpi/ic_generic_app.png | Bin 0 -> 2872 bytes .../main/res/mipmap-xhdpi/ic_generic_app.png | Bin 0 -> 7209 bytes .../main/res/mipmap-xxhdpi/ic_generic_app.png | Bin 0 -> 10719 bytes .../res/mipmap-xxxhdpi/ic_generic_app.png | Bin 0 -> 14777 bytes app/src/main/res/values-it-rIT/strings.xml | 16 +- app/src/main/res/values/colors.xml | 2 +- app/src/main/res/values/strings.xml | 16 +- 50 files changed, 923 insertions(+), 428 deletions(-) create mode 100644 app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/WeatherProviderActivity.kt create mode 100644 app/src/main/java/com/tommasoberlose/anotherwidget/ui/adapter/ApplicationInfoAdapter.kt create mode 100644 app/src/main/res/drawable-hdpi/ic_action_alert.png create mode 100644 app/src/main/res/drawable-hdpi/ic_action_menu.png create mode 100644 app/src/main/res/drawable-hdpi/ic_action_paste.png create mode 100644 app/src/main/res/drawable-hdpi/ic_action_save.png create mode 100644 app/src/main/res/drawable-mdpi/ic_action_alert.png create mode 100644 app/src/main/res/drawable-mdpi/ic_action_menu.png create mode 100644 app/src/main/res/drawable-mdpi/ic_action_paste.png create mode 100644 app/src/main/res/drawable-mdpi/ic_action_save.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_action_alert.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_action_menu.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_action_paste.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_action_save.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_action_alert.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_action_menu.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_action_paste.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_action_save.png create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/main/res/layout/activity_weather_provider.xml create mode 100644 app/src/main/res/layout/application_info_layout.xml create mode 100644 app/src/main/res/layout/main_menu_layout.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_generic_app.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_generic_app_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_generic_app.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_generic_app.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_generic_app.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_generic_app.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_generic_app.png diff --git a/app/build.gradle b/app/build.gradle index fb03c0e..d0d7c1c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -46,7 +46,6 @@ dependencies { transitive = true; } compile 'com.android.support:design:26.1.0' - compile 'com.github.rubensousa:bottomsheetbuilder:1.6.0' - compile 'com.github.johnhiott:DarkSkyApi:v0.1.5' compile 'org.greenrobot:eventbus:3.0.0' + compile 'com.android.support:recyclerview-v7:26.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a40cddd..39acf35 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -66,6 +66,7 @@ + @@ -78,7 +79,12 @@ android:configChanges="keyboardHidden|orientation|screenSize" android:launchMode="singleInstance" android:screenOrientation="portrait" /> - + + \ 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 ce590c9..d7f7210 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/object/Constants.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/object/Constants.kt @@ -14,6 +14,7 @@ object Constants { val LOCATION_REQUEST_CODE = 2 val CALENDAR_APP_REQUEST_CODE = 3 val WEATHER_APP_REQUEST_CODE = 4 + val WEATHER_PROVIDER_REQUEST_CODE = 5 val RESULT_CODE_CUSTOM_LOCATION = 45 @@ -45,6 +46,7 @@ object Constants { val PREF_CALENDAR_APP_PACKAGE = "PREF_CALENDAR_APP_PACKAGE" val PREF_WEATHER_APP_NAME = "PREF_WEATHER_APP_NAME" val PREF_WEATHER_APP_PACKAGE = "PREF_WEATHER_APP_PACKAGE" + val PREF_WEATHER_PROVIDER_API_KEY = "PREF_WEATHER_PROVIDER_API_KEY" val itDateFormat = SimpleDateFormat("EEEE, d MMM") val engDateFormat = SimpleDateFormat("EEEE, MMM d") diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/receiver/WeatherReceiver.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/receiver/WeatherReceiver.kt index 4ec4ee9..ea1a5b1 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/receiver/WeatherReceiver.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/receiver/WeatherReceiver.kt @@ -18,7 +18,7 @@ class WeatherReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (intent.action.equals(Intent.ACTION_BOOT_COMPLETED) || intent.action.equals(Intent.ACTION_MY_PACKAGE_REPLACED)) { setUpdates(context) - } else if (intent.action.equals(Constants.ACTION_WEATHER_UPDATE)) { + } else if (intent.action.equals(Constants.ACTION_WEATHER_UPDATE) || intent.action.equals("android.location.PROVIDERS_CHANGED")) { WeatherUtil.updateWeather(context) } } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/ChooseApplicationActivity.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/ChooseApplicationActivity.kt index b976c0b..96dbfb1 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/ChooseApplicationActivity.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/ChooseApplicationActivity.kt @@ -19,13 +19,15 @@ import android.widget.ArrayAdapter import com.tommasoberlose.anotherwidget.`object`.ApplicationListEvent import android.content.pm.PackageManager import android.location.Geocoder +import android.support.v7.widget.LinearLayoutManager import android.text.Editable import android.text.TextWatcher import android.util.Log +import com.tommasoberlose.anotherwidget.ui.adapter.ApplicationInfoAdapter class ChooseApplicationActivity : AppCompatActivity() { - lateinit var adapter: ArrayAdapter + lateinit var adapter: ApplicationInfoAdapter val appList = ArrayList() val appListFiltered = ArrayList() @@ -38,16 +40,20 @@ class ChooseApplicationActivity : AppCompatActivity() { selectDefaultApp() } - adapter = ArrayAdapter(this, R.layout.custom_location_item, appList.map { it.name }) - list_view.adapter = adapter + list_view.setHasFixedSize(true); + val mLayoutManager = LinearLayoutManager(this); + list_view.layoutManager = mLayoutManager; - list_view.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id -> + adapter = ApplicationInfoAdapter(this, appListFiltered); + list_view.setAdapter(adapter); + + /*list_view.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id -> val resultIntent = Intent() resultIntent.putExtra(Constants.RESULT_APP_NAME, pm.getApplicationLabel(appListFiltered[position]).toString()) resultIntent.putExtra(Constants.RESULT_APP_PACKAGE, appListFiltered[position].packageName) setResult(Activity.RESULT_OK, resultIntent) finish() - } + }*/ location.addTextChangedListener(object: TextWatcher { override fun afterTextChanged(text: Editable?) { @@ -95,20 +101,12 @@ class ChooseApplicationActivity : AppCompatActivity() { @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) fun onMessageEvent(event: ApplicationListEvent) { - val pm = packageManager - adapter.clear() if (!event.filtered) { appList.clear() event.apps.mapTo(appList, {it}) - for (a:ApplicationInfo in appList) { - adapter.add(pm.getApplicationLabel(a).toString()) - } } appListFiltered.clear() event.apps.mapTo(appListFiltered, {it}) - for (a:ApplicationInfo in appListFiltered) { - adapter.add(pm.getApplicationLabel(a).toString()) - } - adapter.notifyDataSetChanged() + adapter.changeData(appListFiltered) } } 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 fb9bc53..1053fc8 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 @@ -24,12 +24,14 @@ import com.tommasoberlose.anotherwidget.util.CalendarUtil import com.tommasoberlose.anotherwidget.util.WeatherUtil import android.content.DialogInterface import android.graphics.drawable.Drawable +import android.support.design.widget.BottomSheetDialog import android.util.Log import android.widget.Toast import com.crashlytics.android.Crashlytics import com.tommasoberlose.anotherwidget.`object`.CalendarSelector import io.fabric.sdk.android.Fabric import kotlinx.android.synthetic.main.activity_main.* +import kotlinx.android.synthetic.main.main_menu_layout.view.* import kotlinx.android.synthetic.main.the_widget.* @@ -55,10 +57,6 @@ class MainActivity : AppCompatActivity() { AppWidgetManager.INVALID_APPWIDGET_ID) if (mAppWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) { - - action_refresh.visibility = View.GONE - action_support.visibility = View.GONE - action_share.visibility = View.GONE action_add_widget.visibility = View.VISIBLE action_add_widget.setOnClickListener { @@ -67,22 +65,47 @@ class MainActivity : AppCompatActivity() { } } - action_support.setOnClickListener(object: View.OnClickListener { - override fun onClick(p0: View?) { - Util.openURI(this@MainActivity, "https://paypal.me/tommasoberlose") - } - }) - action_share.setOnClickListener(object: View.OnClickListener { - override fun onClick(p0: View?) { - Util.share(this@MainActivity) - } - }) - action_refresh.setOnClickListener { - WeatherUtil.updateWeather(this) - CalendarUtil.updateEventList(this) - Util.updateWidget(this) + action_menu.setOnClickListener { + val mBottomSheetDialog: BottomSheetDialog = BottomSheetDialog(this) + val menuView: View = getLayoutInflater().inflate(R.layout.main_menu_layout, null) + menuView.action_support.setOnClickListener(object: View.OnClickListener { + override fun onClick(p0: View?) { + Util.openURI(this@MainActivity, "https://paypal.me/tommasoberlose") + mBottomSheetDialog.dismiss() + } + }) + + menuView.action_share.setOnClickListener(object: View.OnClickListener { + override fun onClick(p0: View?) { + Util.share(this@MainActivity) + mBottomSheetDialog.dismiss() + } + }) + + menuView.action_rate.setOnClickListener(object: View.OnClickListener { + override fun onClick(p0: View?) { + Util.rateApp(this@MainActivity, "https://play.google.com/store/apps/details?id=com.tommasoberlose.anotherwidget") + mBottomSheetDialog.dismiss() + } + }) + + menuView.action_feedback.setOnClickListener(object: View.OnClickListener { + override fun onClick(p0: View?) { + Util.sendEmail(this@MainActivity) + mBottomSheetDialog.dismiss() + } + }) + + menuView.action_refresh.setOnClickListener { + WeatherUtil.updateWeather(this) + CalendarUtil.updateEventList(this) + Util.updateWidget(this) + mBottomSheetDialog.dismiss() + } + mBottomSheetDialog.setContentView(menuView) + mBottomSheetDialog.show(); } } @@ -125,8 +148,13 @@ class MainActivity : AppCompatActivity() { updateSettings() } Constants.LOCATION_REQUEST_CODE -> if (!(permissions.size != 1 || grantResults.size != 1 || grantResults[0] != PackageManager.PERMISSION_GRANTED)) { - WeatherUtil.updateWeather(this) - updateAppWidget() + val SP = PreferenceManager.getDefaultSharedPreferences(this) + if (SP.getString(Constants.PREF_WEATHER_PROVIDER_API_KEY, "").equals("")) { + startActivityForResult(Intent(this, WeatherProviderActivity::class.java), Constants.WEATHER_PROVIDER_REQUEST_CODE) + } else { + WeatherUtil.updateWeather(this) + updateAppWidget() + } updateSettings() } } @@ -169,6 +197,9 @@ class MainActivity : AppCompatActivity() { Util.updateWidget(this) updateSettings() updateAppWidget() + } else if (requestCode == Constants.WEATHER_PROVIDER_REQUEST_CODE && resultCode == Activity.RESULT_OK) { + sendBroadcast(Intent(Constants.ACTION_WEATHER_UPDATE)) + updateSettings() } } @@ -179,9 +210,9 @@ class MainActivity : AppCompatActivity() { empty_layout.visibility = View.VISIBLE calendar_layout.visibility = View.GONE - var dateStringValue: String = String.format("%s%s", Constants.engDateFormat.format(now.time)[0].toUpperCase(), Constants.engDateFormat.format(now.time).substring(1)) + var dateStringValue: String = Util.getCapWordString(Constants.engDateFormat.format(now.time)) if (SP.getBoolean(Constants.PREF_ITA_FORMAT_DATE, false)) { - dateStringValue = String.format("%s%s", Constants.itDateFormat.format(now.time)[0].toUpperCase(), Constants.itDateFormat.format(now.time).substring(1)) + dateStringValue = Util.getCapWordString(Constants.itDateFormat.format(now.time)) } empty_date.text = dateStringValue //empty_date.setImageBitmap(Util.buildUpdate(this, String.format("%s%s", Constants.dateFormat.format(now.time)[0].toUpperCase(), Constants.dateFormat.format(now.time).substring(1)), "fonts/product_sans_regular.ttf")) @@ -241,7 +272,7 @@ class MainActivity : AppCompatActivity() { fun updateLocationView() { val SP = PreferenceManager.getDefaultSharedPreferences(this) - val locationLayout = SP.getBoolean(Constants.PREF_SHOW_WEATHER, true) && Util.checkGrantedPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) + val locationLayout = SP.getBoolean(Constants.PREF_SHOW_WEATHER, true) if (locationLayout && SP.contains(Constants.PREF_WEATHER_TEMP) && SP.contains(Constants.PREF_WEATHER_ICON)) { weather.visibility = View.VISIBLE @@ -408,6 +439,17 @@ class MainActivity : AppCompatActivity() { startActivityForResult(Intent(this, ChooseApplicationActivity::class.java), Constants.WEATHER_APP_REQUEST_CODE) } + if (!SP.getString(Constants.PREF_WEATHER_PROVIDER_API_KEY, "").equals("")) { + label_weather_provider_api_key.text = getString(R.string.settings_weather_provider_api_key_subtitle_all_set) + alert_icon.visibility = View.GONE + } else { + label_weather_provider_api_key.text = getString(R.string.settings_weather_provider_api_key_subtitle_not_set) + alert_icon.visibility = View.VISIBLE + } + action_weather_provider_api_key.setOnClickListener { + startActivityForResult(Intent(this, WeatherProviderActivity::class.java), Constants.WEATHER_PROVIDER_REQUEST_CODE) + } + action_filter_calendar.setOnClickListener { val calendarSelectorList: List = CalendarUtil.getCalendarList(this) var calFiltered = SP.getString(Constants.PREF_CALENDAR_FILTER, "") diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/WeatherProviderActivity.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/WeatherProviderActivity.kt new file mode 100644 index 0000000..509162e --- /dev/null +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/WeatherProviderActivity.kt @@ -0,0 +1,71 @@ +package com.tommasoberlose.anotherwidget.ui.activity + +import android.annotation.SuppressLint +import android.app.Activity +import android.app.AlertDialog +import android.content.ClipboardManager +import android.content.Context +import android.content.DialogInterface +import android.support.v7.app.AppCompatActivity +import android.os.Bundle +import android.preference.PreferenceManager +import android.text.Editable +import android.text.TextWatcher +import android.view.View +import com.tommasoberlose.anotherwidget.R +import com.tommasoberlose.anotherwidget.`object`.Constants +import kotlinx.android.synthetic.main.activity_weather_provider.* + +class WeatherProviderActivity : AppCompatActivity() { + + @SuppressLint("ApplySharedPref") + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_weather_provider) + + val SP = PreferenceManager.getDefaultSharedPreferences(this) + action_paste.setOnClickListener { + val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + api_key.setText(clipboard.primaryClip.getItemAt(0).text) + } + + action_save.setOnClickListener { + SP.edit() + .putString(Constants.PREF_WEATHER_PROVIDER_API_KEY, api_key.text.toString()) + .commit() + setResult(Activity.RESULT_OK) + finish() + } + + api_key.addTextChangedListener(object: TextWatcher { + override fun afterTextChanged(text: Editable?) { + if (text.toString().equals("") || text.toString().equals(SP.getString(Constants.PREF_WEATHER_PROVIDER_API_KEY, ""))) { + action_save.animate().scaleY(-2f).start() + } else { + action_save.animate().scaleY(0f).start() + } + } + + override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { + } + + override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { + } + }) + } + + override fun onBackPressed() { + val SP = PreferenceManager.getDefaultSharedPreferences(this) + if (api_key.text.toString().equals("") || !api_key.text.toString().equals(SP.getString(Constants.PREF_WEATHER_PROVIDER_API_KEY, ""))) { + AlertDialog.Builder(this) + .setTitle(getString(R.string.error_weather_api_key)) + .setNegativeButton(android.R.string.cancel, null) + .setPositiveButton(android.R.string.ok, DialogInterface.OnClickListener { _,_ -> + super.onBackPressed() + }) + .show() + } else { + super.onBackPressed() + } + } +} diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/adapter/ApplicationInfoAdapter.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/adapter/ApplicationInfoAdapter.kt new file mode 100644 index 0000000..1baae55 --- /dev/null +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/adapter/ApplicationInfoAdapter.kt @@ -0,0 +1,44 @@ +package com.tommasoberlose.anotherwidget.ui.adapter + +import android.content.Context +import android.content.pm.ApplicationInfo +import android.support.v7.widget.RecyclerView +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import com.tommasoberlose.anotherwidget.R +import java.io.File + +/** + * Created by tommaso on 15/10/17. + */ +class ApplicationInfoAdapter (private val context: Context, private var mDataset: ArrayList) : RecyclerView.Adapter() { + + class ViewHolder(var view: View, var text: TextView, var icon: ImageView) : RecyclerView.ViewHolder(view) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val v = LayoutInflater.from(parent.context).inflate(R.layout.application_info_layout, parent, false) + return ViewHolder(v, v.findViewById(R.id.text), v.findViewById(R.id.icon)) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val pm = context.packageManager + holder.text.text = pm.getApplicationLabel(mDataset[position]).toString() + try { + holder.icon.setImageDrawable(mDataset[position].loadIcon(pm)) + } catch (ignore: Exception) { + } + } + + override fun getItemCount(): Int { + return mDataset.size + } + + fun changeData(newData: ArrayList) { + mDataset = newData + notifyDataSetChanged() + } +} \ No newline at end of file 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 a203cbd..fbe1348 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 @@ -80,9 +80,9 @@ class TheWidget : AppWidgetProvider() { views.setViewVisibility(R.id.empty_layout, View.VISIBLE) views.setViewVisibility(R.id.calendar_layout, View.GONE) - var dateStringValue: String = String.format("%s%s", Constants.engDateFormat.format(now.time)[0].toUpperCase(), Constants.engDateFormat.format(now.time).substring(1)) + var dateStringValue: String = Util.getCapWordString(Constants.engDateFormat.format(now.time)) if (SP.getBoolean(Constants.PREF_ITA_FORMAT_DATE, false)) { - dateStringValue = String.format("%s%s", Constants.itDateFormat.format(now.time)[0].toUpperCase(), Constants.itDateFormat.format(now.time).substring(1)) + dateStringValue = Util.getCapWordString(Constants.itDateFormat.format(now.time)) } views.setTextViewText(R.id.empty_date, dateStringValue) //views.setImageViewBitmap(R.id.empty_date, Util.buildUpdate(context, Constants.dateFormat.format(now.time)[0].toUpperCase() + Constants.dateFormat.format(now.time).substring(1), "fonts/product_sans_regular.ttf")) @@ -158,7 +158,7 @@ class TheWidget : AppWidgetProvider() { fun updateLocationView(context: Context, views: RemoteViews, widgetID: Int): RemoteViews { val SP = PreferenceManager.getDefaultSharedPreferences(context) - val locationLayout = SP.getBoolean(Constants.PREF_SHOW_WEATHER, true) && Util.checkGrantedPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) + val locationLayout = SP.getBoolean(Constants.PREF_SHOW_WEATHER, true) if (locationLayout && SP.contains(Constants.PREF_WEATHER_TEMP) && SP.contains(Constants.PREF_WEATHER_ICON)) { views.setViewVisibility(R.id.weather, View.VISIBLE) diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/util/CalendarUtil.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/util/CalendarUtil.kt index bb569c0..21b04d5 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/util/CalendarUtil.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/util/CalendarUtil.kt @@ -22,74 +22,78 @@ object CalendarUtil { fun updateEventList(context: Context) { val SP: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) - val eventList = ArrayList() + if (SP.getBoolean(Constants.PREF_SHOW_EVENTS, true)) { + val eventList = ArrayList() - val now = Calendar.getInstance() - val limit = Calendar.getInstance() - when (SP.getInt(Constants.PREF_SHOW_UNTIL, 1)) { - 0 -> limit.add(Calendar.HOUR, 3) - 1 -> limit.add(Calendar.HOUR, 6) - 2 -> limit.add(Calendar.HOUR, 12) - 3 -> limit.add(Calendar.DAY_OF_MONTH, 1) - 4 -> limit.add(Calendar.DAY_OF_MONTH, 3) - 5 -> limit.add(Calendar.DAY_OF_MONTH, 7) - else -> limit.add(Calendar.HOUR, 6) - } - - - val builder = CalendarContract.Instances.CONTENT_URI.buildUpon() - ContentUris.appendId(builder, now.timeInMillis) - ContentUris.appendId(builder, limit.timeInMillis) - - if (!Util.checkGrantedPermission(context, Manifest.permission.READ_CALENDAR)) { - resetNextEventData(context) - } else { - - val instanceCursor = context.contentResolver.query(builder.build(), arrayOf(CalendarContract.Instances.EVENT_ID, CalendarContract.Instances.BEGIN, CalendarContract.Instances.END), null, null, null) - if (instanceCursor != null && instanceCursor.count > 0) { - instanceCursor.moveToFirst() - - for (i in 0 until instanceCursor.count) { - val ID = instanceCursor.getInt(0) - - val eventCursor = context.contentResolver.query(CalendarContract.Events.CONTENT_URI, arrayOf(CalendarContract.Events.TITLE, CalendarContract.Events.ALL_DAY, CalendarContract.Events.CALENDAR_ID), - CalendarContract.Events._ID + " is ?", - arrayOf(Integer.toString(ID)), null) - - if (eventCursor != null && eventCursor.count > 0) { - eventCursor.moveToFirst() - - for (j in 0 until eventCursor.count) { - val e = Event(eventCursor, instanceCursor) - val allDay: Boolean = !eventCursor.getString(1).equals("0") - if ((SP.getBoolean(Constants.PREF_CALENDAR_ALL_DAY, false) || !allDay) && !(SP.getString(Constants.PREF_CALENDAR_FILTER, "").contains(" " + e.calendarID + ","))) { - eventList.add(e) - } - eventCursor.moveToNext() - } - } - - eventCursor.close() - - instanceCursor.moveToNext() - } + val now = Calendar.getInstance() + val limit = Calendar.getInstance() + when (SP.getInt(Constants.PREF_SHOW_UNTIL, 1)) { + 0 -> limit.add(Calendar.HOUR, 3) + 1 -> limit.add(Calendar.HOUR, 6) + 2 -> limit.add(Calendar.HOUR, 12) + 3 -> limit.add(Calendar.DAY_OF_MONTH, 1) + 4 -> limit.add(Calendar.DAY_OF_MONTH, 3) + 5 -> limit.add(Calendar.DAY_OF_MONTH, 7) + else -> limit.add(Calendar.HOUR, 6) } - instanceCursor.close() - if (eventList.isEmpty()) { + val builder = CalendarContract.Instances.CONTENT_URI.buildUpon() + ContentUris.appendId(builder, now.timeInMillis) + ContentUris.appendId(builder, limit.timeInMillis) + + if (!Util.checkGrantedPermission(context, Manifest.permission.READ_CALENDAR)) { resetNextEventData(context) } else { - Collections.sort(eventList, { event: Event, event1: Event -> - if (event.startDate > event1.startDate) { - return@sort 1 - } else if (event.startDate < event1.startDate) { - return@sort -1 + + val instanceCursor = context.contentResolver.query(builder.build(), arrayOf(CalendarContract.Instances.EVENT_ID, CalendarContract.Instances.BEGIN, CalendarContract.Instances.END), null, null, null) + if (instanceCursor != null && instanceCursor.count > 0) { + instanceCursor.moveToFirst() + + for (i in 0 until instanceCursor.count) { + val ID = instanceCursor.getInt(0) + + val eventCursor = context.contentResolver.query(CalendarContract.Events.CONTENT_URI, arrayOf(CalendarContract.Events.TITLE, CalendarContract.Events.ALL_DAY, CalendarContract.Events.CALENDAR_ID), + CalendarContract.Events._ID + " is ?", + arrayOf(Integer.toString(ID)), null) + + if (eventCursor != null && eventCursor.count > 0) { + eventCursor.moveToFirst() + + for (j in 0 until eventCursor.count) { + val e = Event(eventCursor, instanceCursor) + val allDay: Boolean = !eventCursor.getString(1).equals("0") + if ((SP.getBoolean(Constants.PREF_CALENDAR_ALL_DAY, false) || !allDay) && !(SP.getString(Constants.PREF_CALENDAR_FILTER, "").contains(" " + e.calendarID + ","))) { + eventList.add(e) + } + eventCursor.moveToNext() + } + } + + eventCursor.close() + + instanceCursor.moveToNext() } - return@sort 0 - }) - saveNextEventData(context, eventList.get(0)) + } + + instanceCursor.close() + + if (eventList.isEmpty()) { + resetNextEventData(context) + } else { + Collections.sort(eventList, { event: Event, event1: Event -> + if (event.startDate > event1.startDate) { + return@sort 1 + } else if (event.startDate < event1.startDate) { + return@sort -1 + } + return@sort 0 + }) + saveNextEventData(context, eventList.get(0)) + } } + } else { + resetNextEventData(context) } } 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 8a1ae5f..83f8f14 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/util/Util.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/util/Util.kt @@ -27,6 +27,7 @@ import android.util.TypedValue import android.content.Intent import android.content.ComponentName import android.preference.PreferenceManager +import android.provider.Settings import android.util.Log import android.widget.Toast import com.tommasoberlose.anotherwidget.`object`.Constants @@ -76,10 +77,10 @@ object Util { fun openURI(context: Context, url: String) { try { - val builder: CustomTabsIntent.Builder = CustomTabsIntent.Builder(); - builder.setToolbarColor(ContextCompat.getColor(context, R.color.colorPrimary)); - val customTabsIntent: CustomTabsIntent = builder.build(); - customTabsIntent.launchUrl(context, Uri.parse(url)); + val builder: CustomTabsIntent.Builder = CustomTabsIntent.Builder() + builder.setToolbarColor(ContextCompat.getColor(context, R.color.colorPrimary)) + val customTabsIntent: CustomTabsIntent = builder.build() + customTabsIntent.launchUrl(context, Uri.parse(url)) } catch (e: Exception) { try { val openIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url)); @@ -91,10 +92,11 @@ object Util { Toast.makeText(context, R.string.error_opening_uri, Toast.LENGTH_LONG).show() } } - val clipboard:ClipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager - val clip = ClipData.newPlainText(context.getString(R.string.app_name), url); - clipboard.primaryClip = clip; - Toast.makeText(context, R.string.error_opening_uri, Toast.LENGTH_LONG).show() + } + + fun rateApp(context: Context, url: String) { + val openIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) + context.startActivity(openIntent) } fun share(context: Context) { @@ -229,4 +231,55 @@ object Util { } } + fun getCapWordString(text: String): String { + return try { + val ar = text.split(" ") + var newText = "" + for (t: String in ar) { + newText += " " + newText += t.substring(0, 1).toUpperCase() + newText += t.substring(1) + } + newText.substring(1) + } catch (e: Exception) { + text + } + } + + + + fun showLocationNotification(context: Context, show: Boolean) { + val mNotificationManager: NotificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager; + + if (show) { + val mBuilder: NotificationCompat.Builder = NotificationCompat.Builder(context, "Settings") + .setSmallIcon(R.drawable.ic_stat_name) + .setPriority(Notification.PRIORITY_MIN) + .setColor(ContextCompat.getColor(context, R.color.colorPrimary)) + .setContentTitle(context.getString(R.string.notification_gps_title)) + .setContentText(context.getString(R.string.notification_gps_subtitle)) + .setAutoCancel(true); + + val intent: Intent = Intent( Settings.ACTION_LOCATION_SOURCE_SETTINGS); + val pi: PendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); + mBuilder.setContentIntent(pi); + mNotificationManager.notify(1, mBuilder.build()); + } else { + mNotificationManager.cancel(1); + } + + } + + fun sendEmail(context: Context) { + val i:Intent = Intent(Intent.ACTION_SEND) + i.type = "message/rfc822" + i.putExtra(Intent.EXTRA_EMAIL, arrayOf("tommaso.berlose@gmail.com")) + i.putExtra(Intent.EXTRA_SUBJECT, context.getString(R.string.feedback_title)) + try { + context.startActivity(Intent.createChooser(i, context.getString(R.string.feedback_chooser_title))) + } catch (ex: Exception) { + Toast.makeText(context, R.string.feedback_error, Toast.LENGTH_SHORT).show(); + } + } + } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/util/WeatherUtil.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/util/WeatherUtil.kt index cec117c..31f1fda 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/util/WeatherUtil.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/util/WeatherUtil.kt @@ -15,6 +15,13 @@ import com.survivingwithandroid.weather.lib.provider.openweathermap.Openweatherm import com.survivingwithandroid.weather.lib.request.WeatherRequest import com.tommasoberlose.anotherwidget.R import com.tommasoberlose.anotherwidget.`object`.Constants +import android.content.DialogInterface +import android.support.v4.content.ContextCompat.startActivity +import android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS +import android.content.Intent +import android.location.LocationManager + + /** @@ -22,41 +29,73 @@ import com.tommasoberlose.anotherwidget.`object`.Constants */ object WeatherUtil { - val API_KEY_1 = "43e744ad8ff91b09ea62dbc7d0e7c1dd" - val API_KEY_2 = "61cde158f4bcc2e5cd18de7b9d000702" fun updateWeather(context: Context) { + Util.showLocationNotification(context, false) val SP: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) if (SP.getString(Constants.PREF_CUSTOM_LOCATION_ADD, "").equals("") || SP.getString(Constants.PREF_CUSTOM_LOCATION_LAT, "").equals("") || SP.getString(Constants.PREF_CUSTOM_LOCATION_LON, "").equals("")) { if (!Util.checkGrantedPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)) { return } - + var gpsEnabled = false + var networkEnabled = false val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager - getCurrentWeather(context, locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)) - getCurrentWeather(context, locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)) + try { + gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) + } catch (ex: Exception) { + } - locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0f, object : LocationListener { - override fun onLocationChanged(location: Location) { - locationManager.removeUpdates(this) - getCurrentWeather(context, location) - } + try { + networkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER) + } catch (ex: Exception) { + } - @SuppressLint("ApplySharedPref") - override fun onProviderDisabled(p0: String?) { - } + if (!gpsEnabled && !networkEnabled) { + Util.showLocationNotification(context, true) + } else { + if (gpsEnabled) { + getCurrentWeather(context, locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)) + locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f, object : LocationListener { + override fun onLocationChanged(location: Location) { + locationManager.removeUpdates(this) + getCurrentWeather(context, location) + } - @SuppressLint("ApplySharedPref") - override fun onProviderEnabled(p0: String?) { - } + @SuppressLint("ApplySharedPref") + override fun onProviderDisabled(p0: String?) { + } - override fun onStatusChanged(p0: String?, p1: Int, p2: Bundle?) { + @SuppressLint("ApplySharedPref") + override fun onProviderEnabled(p0: String?) { + } + + override fun onStatusChanged(p0: String?, p1: Int, p2: Bundle?) { + } + }) + } else { + getCurrentWeather(context, locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)) + locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0f, object : LocationListener { + override fun onLocationChanged(location: Location) { + locationManager.removeUpdates(this) + getCurrentWeather(context, location) + } + + @SuppressLint("ApplySharedPref") + override fun onProviderDisabled(p0: String?) { + } + + @SuppressLint("ApplySharedPref") + override fun onProviderEnabled(p0: String?) { + } + + override fun onStatusChanged(p0: String?, p1: Int, p2: Bundle?) { + } + }) } - }) + } } else { weatherNetworkRequest(context, SP.getString(Constants.PREF_CUSTOM_LOCATION_LAT, "").toDouble(), SP.getString(Constants.PREF_CUSTOM_LOCATION_LON, "").toDouble()) - } } @@ -69,42 +108,45 @@ object WeatherUtil { fun weatherNetworkRequest(context: Context, latitude: Double, longitude: Double) { val SP: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) + if (!SP.getString(Constants.PREF_WEATHER_PROVIDER_API_KEY, "").equals("")) { + try { + val config = WeatherConfig() + 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" + config.maxResult = 1 + config.numDays = 1 + config.ApiKey = SP.getString(Constants.PREF_WEATHER_PROVIDER_API_KEY, "") - try { - val config = WeatherConfig() - 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 - config.ApiKey = API_KEY_2 + val client = WeatherClient.ClientBuilder().attach(context) + .httpClient(com.survivingwithandroid.weather.lib.client.volley.WeatherClientDefault::class.java) + .provider(OpenweathermapProviderType()) + .config(config) + .build() - val client = WeatherClient.ClientBuilder().attach(context) - .httpClient(com.survivingwithandroid.weather.lib.client.volley.WeatherClientDefault::class.java) - .provider(OpenweathermapProviderType()) - .config(config) - .build() + client.getCurrentCondition(WeatherRequest(longitude, latitude), object : WeatherClient.WeatherEventListener { + @SuppressLint("ApplySharedPref") + override fun onWeatherRetrieved(currentWeather: CurrentWeather) { + SP.edit() + .putFloat(Constants.PREF_WEATHER_TEMP, currentWeather.weather.temperature.temp) + .putString(Constants.PREF_WEATHER_ICON, currentWeather.weather.currentCondition.icon) + .commit() + Util.updateWidget(context) + } - client.getCurrentCondition(WeatherRequest(longitude, latitude), object : WeatherClient.WeatherEventListener { - @SuppressLint("ApplySharedPref") - override fun onWeatherRetrieved(currentWeather: CurrentWeather) { - SP.edit() - .putFloat(Constants.PREF_WEATHER_TEMP, currentWeather.weather.temperature.temp) - .putString(Constants.PREF_WEATHER_ICON, currentWeather.weather.currentCondition.icon) - .commit() - Util.updateWidget(context) - } + @SuppressLint("ApplySharedPref") + override fun onWeatherError(e: WeatherLibException?) { + // removeWeather(context, SP) + } - @SuppressLint("ApplySharedPref") - override fun onWeatherError(e: WeatherLibException?) { - removeWeather(context, SP) - } - - @SuppressLint("ApplySharedPref") - override fun onConnectionError(throwable: Throwable?) { - removeWeather(context, SP) - } - }) - } catch (t: Exception) { + @SuppressLint("ApplySharedPref") + override fun onConnectionError(throwable: Throwable?) { + // removeWeather(context, SP) + } + }) + } catch (t: Exception) { + // removeWeather(context, SP) + } + } else { removeWeather(context, SP) } } diff --git a/app/src/main/res/drawable-hdpi/ic_action_alert.png b/app/src/main/res/drawable-hdpi/ic_action_alert.png new file mode 100644 index 0000000000000000000000000000000000000000..3603ce8ef039b1fbad926fd441ea095fa9c46f45 GIT binary patch literal 896 zcmV-`1AqL9P)^p7$1GBIUbJuh3J$vs)d*Juxa%axWxpQXboEr+YM|-s9s8*|;AWC$$y0H;( z23!Zvz{nrV0!n4`}x8BhWRkOOBy2Be4#JsSgy;D>{b-}E)YwvA7M*AA1e zgHez$)R&`uAn9BJahoguMwp}w@+wVw&>aJlv=1aF!ZsY3b6E9$i(hyUYzp%{^s4xZ z5cA6_3pHVnouFF5_rwJ+sd86X`5sOAXgvl_Yzo;aZ6kEbx?!U>H26xHsYGcvW)M#M zoY0N$|;b9kb!?gpX zBgbsm&`PURG3y1t>&CBT2a-a?9@G(>VnR<{R&GxYke)?mOI}B4i3yDa=)f4WWkE-1 z)%deD&jB9JD>@r^haEi90XmRj4s10%o>KZMvHY71(18>?PZS%bb2Z7o?m&d~KVCv; zkDRDbTVW%FwvP&-4)B2q4Y-)NgPf?52)P)>o0x>2d#S>fTWns93pzqKn9zKH4iwxJ zvU5ym&$N}WWPE}p6zx_*oq@kF!E6A%&?vLvqxKmYFWzIqsycW1*iJ|3^jB}gEfeog zfdi&s+(!rU!hxpGGzK3D7gwhZ;INLI*BPR7*Q=|he8Rkpe0SD(^Lb>hInFQy8udUwe0K^6PH z&^zg%ehl6*uCPsVL^Xit!Az8++C$Bn<+Y|L_)1Ps1ir$j2&xfW833@AAbR* WS_2**kUzT=Pf8fgb|o?228cZ&bivN`=M z;_fS+dDjE+g{=<@k8@0Iikg_b-^mE%z#cx?=By?bIa$7IT6 zonX1rSn&sJdzwTmHt%15pzhk!Mi%x2wtd?TSeM88?&DC|e=tNj-+HHv49kvOk8hVB z#qSq8a@tgAKZELw+h6x^+h0^SU`qb*=x#LkqnVcP4@7!>;yySjn zUQG2>J#z|_4GNNag;;pL8!~C@pJ;c_xOC~Am-Fs9PUqiu?e7sRU=De}@kLktL2N|l z)(1Ni{)8|F_a54LU7X8<^Vo6*Rx6DSIX5hmBDd&nV6Qs2Zlc%u*}uzKqkeo_#K5ZI zz{nNQz$CH&iRoa@;`94=K*74DM>n=PJZ1SIG$%7NC{w1uM%yeuSTmVLZCm5->nCR) zdtdqHw8_S)7v8vd8y4F&c=yIG3;?n-bFV-Cas4s-g<|(f7o8@D14Es`)78&qol`;+ E0P#Stc>n+a literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_action_refresh.png b/app/src/main/res/drawable-hdpi/ic_action_refresh.png index a61eb2498dad5ad87bd7a3ba3a44368dc3e10f08..33963447d1508676b4bd06480a6fb2584dfadccb 100644 GIT binary patch delta 792 zcmV+z1Lype1+NB>B!BivL_t(|+U=RoYZE~f#~Zb&DE1&WgqqFJMaP_yxEwiX;e4feaV{Q(zHzph9@`+kYe&27T%thi8n54hVwn z0B67|_zC_P@&h~qr@?kZ@e|;UhyeuY21W4MLbQ&L;2hZM^E@TK2Hu7?fB<>0E+D*> z=OCvU`Nn_T4bTf&0GknrZ}1(QCE*S6)zAh={B@c}KLPLPe?#CP$P$OZ2`~*_2EU2k3JC zHs}#ris!`*&{FwI6X=5NMr4pyPoxbLH9>9(i%&JJ^D+i#T0b!XRwUAf5nmNeAu12J z)g~ugL)nNoGeD!V%G^93!N}WgbVdd;Okt+-bAKCh-hau!2yGafUAfKc&Y=tq9O_G7vjDbB#>LhR}v@b~p9x?`w zCCR`vW1yTQ1EY+Ab;%0UP)9F=Q6bl_DJAyCD1Lwr_|2#mPOs^X`Iwo7xfl&BFwehl z6JVSP@PA8n8e$Niqt2asHGn_w1YejS%OD-0_%wK`seyWIgOxM|)r}}#Xi8mO`)1U2 zG%A{YO(BAFaY<9DdSTj$M>P3ZqnStxi0}64`h8Okv#<{+`PA^sVP0%%Kd$(+7*9$S zcr!kS47EDVseQsEtteeo8}g23b{jK%O)O2x#D8qSX{ts$cA1*Hc{;@OQ*(EazR-99 zajJB3OG&R1%EU#VQIlYUK6a#{+-Q!{x-2c;i({i~UScnSuL8n9&{=m|J1W;*;5>L1 z(CcqylXl!wlC8?H??;xtI^G0JU=6&dFN>-;d_a50aj-k?^4xWIO~!}r&h%1kKm1Xq|esCFo?L+oC0Cpj<^I1k8i4EF9;2fH}L9Hs^n|1pv`zaPGlz&M{~p?Tqs&EdfBVlX6<-$Q@V*1HvJZ z>qH|M1aWZx$8QttGqnNG&dZz^PECSh7aC#u?vsmuMqL1u^JkJp_CaM1dez_{p8?EE z7FYp651Pf`LVtSzbX0yxcHWEg0ambD1K5-lT!lx?|D0D70Nt=jCOn~F=TmtpVrmcU zqSvCw(U>;M1K41q3C(GvJb)u6+LxowG_?-d@T?*LesQ(rs1v1n%7&C&$}@V z0mRrEPs$Dq2yHR(8&Iau`6}?h)>u}#J8hD7de2KcZPN~dU8emCYE}Qmi;`Yt$>U5A zq&b=E&geKHq7Kv3UM}e*<_XEp3l81P)?Owv*)V=XMHq5={qdr3 zO)1e!FLf9Za=0G!g9QpU<**6u`MTUhQC}*2*gDBPY~}NY7B#U9zCAcDPPSR?54isX z(gAkBXO@$eNVVod>Y2*HIM@cK;DsC&FVVM@CgMeUNPO21O<;fuIAj?!X3UteLbYG) Wg>qWv(YZul&>G#zmlnL)p!soCVP$y4phz+qJ zHt!1`#P={gIBYchLl+#^l-LX#dH6mG@1hb0Vz&tkh_Cvp(-JMjZWEPozm$+`C-GFp zZlfh`nG$B<{-fAd^^y7(C!M^l@+0*Lr>d}7iIasm+Z1rZIolL)f;!vea2jBKgCsa% p9El4h@WLl0FvC+6MN!n2dI29vujRZ{tZ4uM002ovPDHLkV1jK1eA55` literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_action_alert.png b/app/src/main/res/drawable-mdpi/ic_action_alert.png new file mode 100644 index 0000000000000000000000000000000000000000..1d4890243eefea0dd03df96be40b59ea5d1831f2 GIT binary patch literal 538 zcmV+#0_FXQP)bjEN$G& zIXB({;s*2Mz`f$cf$rpWCG52TDZEnBk<^*g(Nu=Spa9YMz<(bj1-uiA&0Q$g#p zg^NDv7_;t3OAa*Iq8C2SYB|6P+S4{9;VaA6+7cazu@)Ul#pf;9)u^#946O==6pvv?GKL<)7I8gC(z%&J$*Z3y#9I=oPJ zD7+;)YHM_nnasJs9tG{;6cwh)wR}ofd1skB8Mf#h@Gcl0)5l9D?60I0ogH|9ozk-t cSq+Qv4+m1N`3nQMF8}}l07*qoM6N<$f(^y^nE(I) literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_action_menu.png b/app/src/main/res/drawable-mdpi/ic_action_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..b07955b524b70c25360020d325d7fe977306a958 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJbWaz@kcwN$2@mdK II;Vst07Hy8wEzGB literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_action_paste.png b/app/src/main/res/drawable-mdpi/ic_action_paste.png new file mode 100644 index 0000000000000000000000000000000000000000..1ccd6755bd17c48e2d8fc15fea464e596954f8b6 GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ=bkQ(Ar-fh6BL;L{Qn=%*Ri|d z2ZKmC(?%X?vaQ8>h`? z`lzU5=W@KeaRz7CbisxH6a=J&A2*n~NU$C1ZkQqXs$r?it4PltW$@-Qih#;7u>u2lQzm-m2qe-O1;9km`|egzzSwJ zS%X&%f$TiG><6Tl78h>$c=F(9&&(<7R2Tnr)roWMVLsFN!+=+Zy|m1yv)5Qrp-g45 kYzKGq8KD#j)(8fMnIFO}g%?b-1A3Xk)78&qol`;+08*H(wyfNP>!rR}mC_0Czn&zEk`gYM?15Gu=ItYnPVnnjH-E^34;RsDyn}tv$<`9$ zHn3F1GvHA}m~#)trJdU}ZmEdRyX^WGl))O900YD%Sf&4LHs=+bvT;jg=Un_;2q~W0 zjnBzge((H2G8Ud6f>w>VX#*#w4&<3}-r&YK?_AFTx@z*#mvwgT67AX!Y_Nb!8}8gT ziUCS8j?r0-#DCo#p!6zdxRsEP-PeI6GsM>!)N~0?`2CQR|XCIn#GI4W0uwrRkv8NW{c3_5C_+`GH7oVJ4{r*a5fT xr^<)P1%154YMn8=DA=-8#D>IJ^P|<|`3K##KFLV?_f7x+002ovPDHLkV1jMT^WXpg delta 393 zcmV;40e1eC1fv6xB!6m2L_t(|+GAiC1*2f7f&c&i3jnbP5a$7L6A(8-*=|70k4K+2 zr54KpaT^ey0OB(^@Npn+24WdBy(u8Qlvo}K#K-VhjE+HSLy#;#L$(8e8jH{jUj@Wb zK&%AB>`)A1M*#6^G_|vl*lpzc965NyfS3u7dL|%_#Su+y`614&~f6)Y#&0eMIo6^T%<3&foSa1<#HXhL!T z=Rg#<$PQo`2nXaNIY4e89N>xMfN%=TQ3YaWC>9_^qaac?Tuy8@#8N7*f|_vzh`A^! zh(gG4Kp2w#I)8G4PaawX!)iBU67-rP72`*NSc2R*j7G0wiKvW1(W>qMN)u!WT8Rcq z6X8It04gJZm<`Gfg~}nT&8Akah(U@DV(<}CDllRlp$IKfPvWuo1hf#7qh%Q(1jOFZ nmQpKPqf~IT***$}8~^}Qn`SA0UK&3D0000p?}rd?+9CSt+z1 zMp{N%t)`X!Pj&{5uw3TM-MKS!f7BiLz{2i+&zy5-&YU|lkx1CW7Phd3&3xP3+}s5m z1}*_NfnHz$=*Q0qpb@AA^8W>gGk_z&J>WI44s4{!A7BdT1`YwyAUR$LbO0YE9Jb>< za1F@wv*UTdZ6K-9aVy_}P9WEB&YuUq7rNt-ykf zEjIlQxas_|pfgEyJX@p99H7m{?hoTZz#%Mp^5ei>gZB3UFKtFbsmX-*fiS#|Yk!7I z1y;f)C*|=Pf~?M#34LL!T;g+8t_E0jDe+ zbf}dO6ic}}0?S|g1fY`W zd##K}j3cn3Yj@Ug05XZ4r6w7XJIeFOqX3}(j8atyKknlQya-SLCOG=NG6I99Rsfd* zz*`CW|Mvh4gi}C5pqnEwsj-7sF$k%|HR?~RCczetz;X}{DRCKGQ!3)%$H$3cq9gzT zs37`YCnK_l5NQlR0AfTbTp%m-mLoJAfB=kg`u)m@&_m*Nc&Cq@FC@y~yH3PT64M~& ziy!l1pThpja}&f|vD&Xf*WNBuG_~cqQMrdlFkq zRaYAKdu3p`=7!3>W3P5+*`~@PEKX#dX6JkNfunBRKy@P^?3MKdE^9q__%ev};el)n l9o`)YTiC)Dwy>FRe*w4n{ejCS4;BCb002ovPDHLkV1kw6`@#SK literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_action_menu.png b/app/src/main/res/drawable-xhdpi/ic_action_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..276d9b8ff73a5e443e3f3bd20140ee61ebd73d35 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=H$7b(Ln>~)y%EdR6d>Z7xICci zoXh-K^AuQoRXL1BuId>FY@BQR`E9CU_iHXM+Nh?Z)Qh9C!XN*~c8+vZ4H5?6Ya7 zKk?c4T9l>DJDbaKhOO~&$KwjVH_ZYyP5c+wb|0 zT^YLjr)RLwl9n~0?<49hT%82-4zz@QPJR%&(IWBgq~$B;JeKUq;K-erwTCE7(8A5T-G@yGywo)y2OkC literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_action_refresh.png b/app/src/main/res/drawable-xhdpi/ic_action_refresh.png index 6c9b809d389e11bc38b6cf730142e8c25c106dd4..ff7d85c531c6f002c328a647fb4937cb124d66d6 100644 GIT binary patch delta 1045 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 N002ovPDHLkV1kuMXkh>V literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_menu.png b/app/src/main/res/drawable-xxhdpi/ic_action_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..ec25f349151be1e121fc7f15be250174a97bd68f GIT binary patch literal 508 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 delta 1346 zcmV-I1-<%;4%7;eBYy=ONklL$pUh1rntNMiEi8 zFW5$VJtQh&CD8^g&_iIG`Ov;+Wf|?;&-|b49QXns@;7tub?%)R&j;U|>6!D*J@?GH zXHKb6L><-D#5M>XsqMvQ#4e^FJ z+!v=85!Vy%6aPeTdSC1!wh>oHaT<1hEq>=a=LLY{cO#^9$3PbM8F6z^=k;=a+Ia!6 znB~NmF**K!e1A+_M9c~hcGA86y_*7%(c_6NhC)r4C*lgRTr=!+J1YPdvJ{4QTSk5o z7qE?ru;ZoxSjZvbZwsCOkKc(~6=BCc0dQD45y3GZiI>bpAKu zL1IZi+A)@RG~%JoEddbo4+f0CTt+A}Xj2)U#`HiCpgO<{_XTlIkT4Umh_?(O&QAf5 z=XYo>f@AHN1Z*ev_J5db?%r?zt^ z$(^rx$bWKDfSnpfKPQg1VCUC*^%BPJZ&w)1dH8HgoS*hhfOQ(NzcG$f({R|aR)BjN zyMLqyVaGlJ@D2BmBIVrcN!YPcfc*+XxiVSoN!YPV0JM&@DhxgDQP{CgfKeJ%#!8RE zj&%Z5YSi_MJPJG337~q!&+B#_I1+ZO6X2A>$bXG7+p`*u`49uSnmR0L0d6S-SQ4Wx zSvZlG#KhvH50)u3%4QN^MoM5b1y!{ajuB6p6ChvX%U7;=Dp>)t#Z$?Kpgi%ESrMKo z1Sl6TnHAu+LV&sAC9?uFD+E|8UNS4d4ut?`;w(iBL;)5l1mG-bgm}uF0OcCx=mie0 zD}R?aP6iIQ;>qUbDzq175}?6B0qRlI>x<3SoN;jTC6fSrRw#7H`QvcMIMbR|*kte& zjgRs>91=j)uK0skV3WaI27aV4`co2L#zL&6fY_;6%S9Uv->C5gsm|t<6kpStG`hO0 zZ8W|FvlB8I|AjcsVgdM0*)PQ!9$Gt~gMXW^G;gPuT4;N*Mi^z**c?A~o&x4|o4ym^ zN~+GKk{e0iY0z2BD$R}p&a($wa*jErd3AN33n|>1( zz-z$aXhe`*h|&m`i>Klx`ys@zjyi8zY9PYd2u-jZc#<|?B+Ybg_(BSqgJ~+0I87vO z;#v)^%XWqQd;4rikxhi7x)@rV4Ujd;uunK>+KC|FXljzhKD~i z7Pnd#@FzWFy5l0{D$vxsdxO8AKuq_tFNW1!&rh|m6dJfbn|Gkbe$J%>w&kBrrkG4p z@kF4yD81>AXS|-_eEUS?Kb>c`X-UeZ)9a;-`!jF-?AW<=W|e5MNn~>>Cd28yjohB(PiGIOw;wIsS;v)b(~{ujGCyJTrQ>);1*afQ0o|zPM@s zf4y$lJZri^O4+(3FrGH1OE@65TM?QguC6=xy!#XHQ>u!5K(D?UE=h@MGYfhQ1{{Oa} zmVcISU0c{P*QIa6 - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..c7bd21d --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_choose_application.xml b/app/src/main/res/layout/activity_choose_application.xml index 914bf5f..e8f16a1 100644 --- a/app/src/main/res/layout/activity_choose_application.xml +++ b/app/src/main/res/layout/activity_choose_application.xml @@ -66,7 +66,6 @@ android:layout_width="48dp" android:layout_height="48dp" android:padding="12dp" - android:background="?android:attr/selectableItemBackground" android:contentDescription="@string/custom_location_gps" android:id="@+id/action_default" android:src="@drawable/ic_action_reset" @@ -76,7 +75,7 @@ android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/black_10"/> - diff --git a/app/src/main/res/layout/activity_custom_location.xml b/app/src/main/res/layout/activity_custom_location.xml index c5b87ed..07505e6 100644 --- a/app/src/main/res/layout/activity_custom_location.xml +++ b/app/src/main/res/layout/activity_custom_location.xml @@ -64,7 +64,6 @@ android:layout_width="48dp" android:layout_height="48dp" android:padding="12dp" - android:background="?android:attr/selectableItemBackground" android:contentDescription="@string/custom_location_gps" android:id="@+id/action_geolocation" android:src="@drawable/ic_action_gps" diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index de579af..4d18bce 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,73 +1,79 @@ - + android:layout_width="match_parent" + android:layout_height="match_parent"> - + + android:orientation="vertical" + android:layout_margin="32dp" + android:id="@+id/toolbar" + android:gravity="center_vertical"> + + + + + + + - - - - - - - + android:layout_height="60dp" + android:text="@string/add_widget" + android:visibility="gone" + android:gravity="center" + android:background="@color/black_30" + android:foreground="?android:attr/selectableItemBackground" + android:id="@+id/action_add_widget" + style="@style/AnotherWidget.Main.Button"/> + android:id="@+id/all_set_container"> + android:paddingTop="16dp" + android:paddingBottom="16dp"> @@ -289,6 +294,42 @@ android:layout_height="wrap_content" android:id="@+id/weather_settings" android:orientation="vertical"> + + + + + + + - - - - - - - - - - - - - - - - - - \ No newline at end of file + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_weather_provider.xml b/app/src/main/res/layout/activity_weather_provider.xml new file mode 100644 index 0000000..223e90b --- /dev/null +++ b/app/src/main/res/layout/activity_weather_provider.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/application_info_layout.xml b/app/src/main/res/layout/application_info_layout.xml new file mode 100644 index 0000000..574e59e --- /dev/null +++ b/app/src/main/res/layout/application_info_layout.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/main_menu_layout.xml b/app/src/main/res/layout/main_menu_layout.xml new file mode 100644 index 0000000..b75f47f --- /dev/null +++ b/app/src/main/res/layout/main_menu_layout.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_generic_app.xml b/app/src/main/res/mipmap-anydpi-v26/ic_generic_app.xml new file mode 100644 index 0000000..bbd3e02 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_generic_app.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_generic_app_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_generic_app_round.xml new file mode 100644 index 0000000..bbd3e02 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_generic_app_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_generic_app.png b/app/src/main/res/mipmap-hdpi/ic_generic_app.png new file mode 100644 index 0000000000000000000000000000000000000000..ebae12c4b3b868225722ca4b0c71fe6a55c3a918 GIT binary patch literal 4826 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_generic_app.png b/app/src/main/res/mipmap-xxhdpi/ic_generic_app.png new file mode 100644 index 0000000000000000000000000000000000000000..2ed8ddbcf480dec67bc8409652afaed02a5c6bc6 GIT binary patch literal 10719 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 Another Widget - Aggiungi Another Widget + Aggiungi Widget Just Concedi Accesso Rimani Aggiornato @@ -48,7 +48,7 @@ 24 Ore Località Meteo Geolocalizzazione - Aggiorna + Aggiorna Widget Eventi Visibili Eventi non Visibili Meteo Visibile @@ -68,4 +68,16 @@ Il meteo apre App Predefinita Scegli Applicazione + "Provider del Meteo " + Il provider meteo è configurato correttamente + Il provider meteo deve essere configurato + Localizzazione disattivata + Riaccendi la localizzazione per avere il meteo aggiornato. + Feedback + AW Feedback + Invia email... + Errore invio mail. + Chiave API OpenWeather + Il provider non è configurato correttamente, vuoi comunque uscire? + Salva \ 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 a542063..96e532b 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -3,7 +3,7 @@ #0092ca #0083B5 #124E96 - #124E96 + #04507D #DAEAF6 #80000000 #48000000 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f67012d..c633c7a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,6 +1,6 @@ Another Widget - Add Another Widget + Add Widget Just Grant Permission See your Events @@ -49,7 +49,7 @@ 24 Hours Custom Location Geolocation - Refresh + Refresh Widget Events are Visible Events are not Visible Weather Info are Visible @@ -70,4 +70,16 @@ Tap on weather opens Default App Choose Application + Weather Provider + The weather provider is configured correctly + The weather provider must be configured + Location is turned off + Turn on the localization to get the updated weather. + Feedback + AW Feedback + Send email... + Error sending email. + OpenWeather API Key + The provider is not configured correctly, do you still want to go back? + Save