diff --git a/README.md b/README.md index 6aeaeeec5858816a5a5dd4bce91df1c50747a9f5..cb1489f88b8b348804937d1a3d459180ec6dfcec 100644 --- a/README.md +++ b/README.md @@ -34,5 +34,9 @@ > <p> 1.나라별 변경 완료.</p> > <p> 2.기능 한글화.</p> -> <p> 2.D-day 기능 구현(예정)..</p> -> <p> 3.GPS기능 추가(예정)</p> \ No newline at end of file +> <p> 3.나라별 공휴일 한글화 완료.</p> +> <p> 4.D-day 기능 구현(예정)</p> +> <p> 5.GPS 국가 자동 변경 기능 완료</p> +> <p> 6.가계부 기능 추가 구현(예정)</p> + +### ScreenShot diff --git a/app/build.gradle b/app/build.gradle index 947b13da87007c79f6fa37a814051964aa19b16f..86e2ed8fc96768c2b251b3454cb86c7926ba023d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -50,6 +50,14 @@ dependencies { implementation 'joda-time:joda-time:2.9.9' implementation 'com.facebook.stetho:stetho:1.5.0' implementation 'com.android.support:multidex:1.0.3' + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" + implementation 'com.android.support.constraint:constraint-layout:1.0.2' + implementation 'com.google.android.gms:play-services-location:11.8.0' + implementation 'com.google.android.gms:play-services-maps:11.8.0' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.1' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' debugImplementation "com.squareup.leakcanary:leakcanary-android:$leakCanaryVersion" releaseImplementation "com.squareup.leakcanary:leakcanary-android-no-op:$leakCanaryVersion" } diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/MainActivity.kt index 8b6281746710d9545b848cb1d188d5d83b17296d..a68a89b4717660cf1e65543aa2e4b3237ba390dd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/calendar/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/MainActivity.kt @@ -22,6 +22,7 @@ import com.simplemobiletools.calendar.adapters.EventListAdapter import com.simplemobiletools.calendar.dialogs.ExportEventsDialog import com.simplemobiletools.calendar.dialogs.FilterEventTypesDialog import com.simplemobiletools.calendar.dialogs.ImportEventsDialog +import com.google.android.gms.maps.model.LatLng import com.simplemobiletools.calendar.extensions.* import com.simplemobiletools.calendar.fragments.* import com.simplemobiletools.calendar.helpers.* @@ -43,8 +44,38 @@ import java.io.FileOutputStream import java.text.SimpleDateFormat import java.util.* import kotlin.collections.ArrayList - -class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { +import android.Manifest +import android.annotation.SuppressLint +import android.content.DialogInterface +import android.content.pm.PackageManager +import android.location.Location +import android.location.LocationManager +import android.os.Build +import android.provider.Settings +import android.location.Geocoder +import android.support.v4.app.ActivityCompat +import android.support.v4.content.ContextCompat +import android.support.v7.app.AlertDialog +import android.support.v7.app.AppCompatActivity +import android.view.View +import com.google.android.gms.common.api.GoogleApiClient +import com.google.android.gms.location.LocationRequest +import com.google.android.gms.location.LocationServices +import kotlinx.android.synthetic.main.activity_main.* +import android.location.Address +import android.util.Log +import java.io.IOException + +class MainActivity : SimpleActivity(), RefreshRecyclerViewListener , com.google.android.gms.location.LocationListener{ + + //for gps module + private var REQUEST_LOCATION_CODE = 101 + private var mGoogleApiClient: GoogleApiClient? = null + private var mLocation: Location? = null + private var mLocationRequest: LocationRequest? = null + private val UPDATE_INTERVAL = (2 * 1000).toLong() /* 10 secs */ + private val FASTEST_INTERVAL: Long = 2000 /* 2 sec */ + //for main private val CALDAV_SYNC_DELAY = 1000L private var showCalDAVRefreshToast = false @@ -56,7 +87,8 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { private var shouldGoToTodayBeVisible = false private var goToTodayButton: MenuItem? = null private var currentFragments = ArrayList<MyFragmentHolder>() - + private var lat = 0.1 + private var lng = 0.1 private var mStoredTextColor = 0 private var mStoredBackgroundColor = 0 private var mStoredPrimaryColor = 0 @@ -65,8 +97,42 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { private var mStoredUse24HourFormat = false private var mStoredDimPastEvents = true + override fun onLocationChanged(location: Location?) { + // You can now create a LatLng Object for use with maps + // val latLng = LatLng(location.latitude, location.longitude) + } + + @SuppressLint("MissingPermission") + private fun getLocation() { + mLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); + + if (mLocation == null) { + startLocationUpdates(); + } + if (mLocation != null) { + lat = mLocation!!.latitude + lng = mLocation!!.longitude + } else { + Toast.makeText(this, "Location not Detected", Toast.LENGTH_SHORT).show(); + } + } + private fun startLocationUpdates() { + // Create the location request + mLocationRequest = LocationRequest.create() + .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) + .setInterval(UPDATE_INTERVAL) + .setFastestInterval(FASTEST_INTERVAL) + // Request location updates + if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { + return + } + LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this) + } + + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + buildGoogleApiClient() setContentView(R.layout.activity_main) appLaunched(BuildConfig.APPLICATION_ID) @@ -109,7 +175,107 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { refreshCalDAVCalendars(false) } } + @Synchronized + private fun buildGoogleApiClient() { + mGoogleApiClient = GoogleApiClient.Builder(this) + .addApi(LocationServices.API) + .build() + + mGoogleApiClient!!.connect() + } + private fun checkGPSEnabled(): Boolean { + if (!isLocationEnabled()) + showAlert() + return isLocationEnabled() + } + + private fun showAlert() { + val dialog = AlertDialog.Builder(this) + dialog.setTitle("Enable Location") + .setMessage("Your Locations Settings is set to 'Off'.\nPlease Enable Location to " + "use this app") + .setPositiveButton("Location Settings") { paramDialogInterface, paramInt -> + val myIntent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) + startActivity(myIntent) + } + .setNegativeButton("Cancel") { paramDialogInterface, paramInt -> } + dialog.show() + } + + private fun isLocationEnabled(): Boolean { + var locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager + return locationManager!!.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager!!.isProviderEnabled(LocationManager.NETWORK_PROVIDER) + } + + private fun checkLocationPermission() { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { + if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) { + AlertDialog.Builder(this) + .setTitle("Location Permission Needed") + .setMessage("This app needs the Location permission, please accept to use location functionality") + .setPositiveButton("OK", DialogInterface.OnClickListener { dialog, which -> + ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), REQUEST_LOCATION_CODE) + }) + .create() + .show() + + } else ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), REQUEST_LOCATION_CODE) + } + } + + private fun autochange(){ + val geocoder = Geocoder(this) + val addresses: List<Address>? + var add = "" + val items = getHolidayRadioItemsCode() + if (!checkGPSEnabled()) { + return + } + + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + //Location Permission already granted + getLocation(); + } else { + //Request Location Permission + checkLocationPermission() + } + } else { + getLocation(); + } + addresses = geocoder.getFromLocation(lat,lng,1) + toast(R.string.importing) + + Thread { + var country = "" + for((num,code,file) in items){ + if(code == addresses.get(0).countryCode){ + country = file.toString() + break + } + } + + val holidays = getString(R.string.holidays) + var eventTypeId = dbHelper.getEventTypeIdWithTitle(holidays) + deleteHolidays() +// dbHelper.deleteEventsWithType(eventTypeId) + if (eventTypeId == -1) { + val eventType = EventType(0, holidays, resources.getColor(R.color.default_holidays_color)) + eventTypeId = dbHelper.insertEventType(eventType) + } + + val result = IcsImporter(this).importEvents(country, eventTypeId, 0, false) + handleParseResult(result) + if (result != IcsImporter.ImportResult.IMPORT_FAIL) { + runOnUiThread { + updateViewPager() + } + } + }.start() + toast(addresses.get(0).countryCode) + + + } override fun onResume() { super.onResume() if (mStoredTextColor != config.textColor || mStoredBackgroundColor != config.backgroundColor || mStoredPrimaryColor != config.primaryColor @@ -142,9 +308,15 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { super.onPause() storeStateVariables() } - + override fun onStart() { + super.onStart() + mGoogleApiClient?.connect() + } override fun onStop() { super.onStop() + if (mGoogleApiClient!!.isConnected()) { + mGoogleApiClient!!.disconnect() + } mCalDAVSyncHandler.removeCallbacksAndMessages(null) contentResolver.unregisterContentObserver(calDAVSyncObserver) closeSearch() @@ -177,6 +349,7 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { R.id.filter -> showFilterDialog() R.id.refresh_caldav_calendars -> refreshCalDAVCalendars(true) R.id.add_holidays -> addHolidays() + R.id.auto_countryChange -> autochange() R.id.add_birthdays -> tryAddBirthdays() R.id.add_anniversaries -> tryAddAnniversaries() R.id.import_events -> tryImportEvents() @@ -819,6 +992,70 @@ class MainActivity : SimpleActivity(), RefreshRecyclerViewListener { + var i = 0 + for ((country, file) in this) { + items.add(RadioItem(i++, country, file)) + } + } + + return items + } + private fun getHolidayRadioItemsCode(): ArrayList<RadioItem> { + val items = ArrayList<RadioItem>() + + LinkedHashMap<String, String>().apply { + put("GR", "greece.ics") + put("ZA", "southafrica.ics") + put("NO", "norway.ics") + put("NL", "netherlands.ics") + put("KR", "southkorea.ics") + put("DK", "denmark.ics") + put("DE", "germany.ics") + put("LV", "latvia.ics") + put("RU", "russia.ics") + put("RO", "romania.ics") + put("LT", "lithuania.ics") + put("LU", "luxembourg.ics") + put("MK", "macedonia.ics") + put("MX", "mexico.ics") + put("BO", "bolivia.ics") + put("US", "unitedstates.ics") + put("BE", "belgium.ics") + put("BR", "brazil.ics") + put("RS", "serbia.ics") + put("CH", "switzerland.ics") + put("SE", "sweden.ics") + put("ES", "spain.ics") + put("SK", "slovakia.ics") + put("SI", "slovenia.ics") + put("AR", "argentina.ics") + put("IS", "iceland.ics") + put("IE", "ireland.ics") + put("DZ", "algeria.ics") + put("EE", "estonia.ics") + put("GB", "unitedkingdom.ics") + put("AT", "austria.ics") + put("UA", "ukraine.ics") + put("IT", "italy.ics") + put("IN", "india.ics") + put("ID", "indonesia.ics") + put("JP", "japan.ics") + put("CN", "china.ics") + put("CZ", "czech.ics") + put("CA", "canada.ics") + put("HR", "croatia.ics") + put("PK", "pakistan.ics") + put("PT", "portugal.ics") + put("PL", "poland.ics") + put("FR", "france.ics") + put("FI", "finland.ics") + put("AU", "australia.ics") + put("HU", "hungary.ics") + + + + + var i = 0 for ((country, file) in this) { items.add(RadioItem(i++, country, file)) diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index bd7261da2b823c5833d104430fcb9d831e5bb4da..eb73adae40fa4dfe526fb8b090839327ea483011 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -31,6 +31,10 @@ android:id="@+id/add_holidays" android:title="@string/add_holidays" app:showAsAction="never"/> + <item + android:id="@+id/auto_countryChange" + android:title="@string/auto_countryChange" + app:showAsAction="never"/> <item android:id="@+id/add_birthdays" android:title="@string/add_birthdays" diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 87c8f7fead96599b72c34371ddec24df96a0274f..1073e0783d73820b2abf4ec1d775b8074a83682c 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -131,10 +131,10 @@ <!-- Holidays --> <string name="holidays">공휴일</string> - <string name="add_holidays">공휴일 추가</string> + <string name="add_holidays">국가 변경</string> <string name="national_holidays">국경일</string> <string name="religious_holidays">종교 휴일</string> - <string name="holidays_imported_successfully">Holidays have been successfully imported into the \"Holidays\" event type</string> + <string name="holidays_imported_successfully">국가 변경 성공</string> <string name="importing_some_holidays_failed">일부 이벤트를 가져오지 못했습니다</string> <string name="importing_holidays_failed">공휴일을 가져오는데 실패했습니다</string> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2d935e25d18e155be1928853438eed0d2152c135..ad533e1f6d5ac375cbc3f570d70f5ace4a74426a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,7 +10,7 @@ <string name="simple_event_list">간단한 이벤트 목록</string> <string name="no_upcoming_events">다가올 이벤트가 없는 것 같습니다.</string> <string name="go_to_today">오늘로 이동</string> - + <string name="auto_countryChange">국가 자동변경</string> <!-- Widget titles --> <string name="widget_monthly">월별 달력</string> <string name="widget_list">일정 목록 달력</string>