From b927b5db082cfb924fc33f9eb3aa1893eaea3b59 Mon Sep 17 00:00:00 2001 From: dom Date: Sun, 18 Nov 2018 16:48:12 +0100 Subject: [PATCH] Initial commit --- README.md | 2 +- app/.gitignore | 1 + app/build.gradle | 48 +++ app/proguard-rules.pro | 21 ++ app/src/main/AndroidManifest.xml | 51 ++++ app/src/main/ic_launcher-web.png | Bin 0 -> 13203 bytes .../AppCompatPreferenceActivity.kt | 90 ++++++ .../dgunia/calllogpicker/BroadcastActions.kt | 5 + .../java/com/dgunia/calllogpicker/Contact.kt | 22 ++ .../calllogpicker/IncomingCallReceiver.kt | 56 ++++ .../com/dgunia/calllogpicker/MainActivity.kt | 285 ++++++++++++++++++ .../dgunia/calllogpicker/PermissionUtils.kt | 20 ++ .../dgunia/calllogpicker/SettingsActivity.kt | 74 +++++ .../java/com/dgunia/calllogpicker/Utils.kt | 16 + .../calllogpicker/list/CallArrowDrawable.java | 57 ++++ .../drawable-v24/ic_launcher_foreground.xml | 34 +++ .../main/res/drawable/ic_info_black_24dp.xml | 9 + .../res/drawable/ic_launcher_background.xml | 74 +++++ .../drawable/ic_notifications_black_24dp.xml | 9 + .../main/res/drawable/ic_sync_black_24dp.xml | 9 + app/src/main/res/layout/activity_main.xml | 11 + app/src/main/res/layout/listviewcell.xml | 57 ++++ app/src/main/res/layout/savesettings.xml | 7 + app/src/main/res/menu/main_menu.xml | 6 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1362 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 1061 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 3296 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 969 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 681 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2046 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 1907 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 1450 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 4723 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 2854 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 2358 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 7337 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 4055 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 3333 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 10572 bytes .../main/res/values-de/strings_calllog.xml | 17 ++ app/src/main/res/values/colors.xml | 6 + .../res/values/ic_launcher_background.xml | 4 + app/src/main/res/values/strings_calllog.xml | 19 ++ app/src/main/res/values/styles.xml | 14 + app/src/main/res/xml/pref_general.xml | 9 + build.gradle | 27 ++ settings.gradle | 1 + 49 files changed, 1070 insertions(+), 1 deletion(-) create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/ic_launcher-web.png create mode 100644 app/src/main/java/com/dgunia/calllogpicker/AppCompatPreferenceActivity.kt create mode 100644 app/src/main/java/com/dgunia/calllogpicker/BroadcastActions.kt create mode 100644 app/src/main/java/com/dgunia/calllogpicker/Contact.kt create mode 100644 app/src/main/java/com/dgunia/calllogpicker/IncomingCallReceiver.kt create mode 100644 app/src/main/java/com/dgunia/calllogpicker/MainActivity.kt create mode 100644 app/src/main/java/com/dgunia/calllogpicker/PermissionUtils.kt create mode 100644 app/src/main/java/com/dgunia/calllogpicker/SettingsActivity.kt create mode 100644 app/src/main/java/com/dgunia/calllogpicker/Utils.kt create mode 100644 app/src/main/java/com/dgunia/calllogpicker/list/CallArrowDrawable.java create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_info_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/ic_notifications_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_sync_black_24dp.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/listviewcell.xml create mode 100644 app/src/main/res/layout/savesettings.xml create mode 100644 app/src/main/res/menu/main_menu.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/values-de/strings_calllog.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/ic_launcher_background.xml create mode 100644 app/src/main/res/values/strings_calllog.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/main/res/xml/pref_general.xml create mode 100644 build.gradle create mode 100644 settings.gradle diff --git a/README.md b/README.md index 4eec734..8b6270a 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ This is an Android app to let the user pick an entry from his call log. When it is started directly you can tap on an entry to either -1. create an event from it +1. create an event from it (using one of your installed calendar apps) 2. or to call that number. When it is started by another app using a diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..962a692 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,48 @@ +apply plugin: 'com.android.application' + +apply plugin: 'kotlin-android' + +apply plugin: 'kotlin-android-extensions' + +android { + compileSdkVersion 28 + defaultConfig { + applicationId "com.dgunia.calllogpicker" + minSdkVersion 15 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + vectorDrawables.useSupportLibrary = true + } + signingConfigs { + configDefault { + keyAlias 'key0' + keyPassword 'calllogpicker' + storeFile file('../../calllog-picker.keystore') + storePassword 'calllogpicker' + } + } + buildTypes { + release { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.configDefault + } + debug { + signingConfig signingConfigs.configDefault + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'com.android.support.constraint:constraint-layout:1.1.3' + implementation 'com.android.support:support-v4:28.0.0' + implementation 'com.android.support:support-vector-drawable:28.0.0' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..cdb20ec --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png new file mode 100644 index 0000000000000000000000000000000000000000..f7215da578f2c6634341ffc9f223565393fed0e6 GIT binary patch literal 13203 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 + when (intent?.action) { + TelephonyManager.ACTION_PHONE_STATE_CHANGED -> { + val state = intent.getStringExtra(TelephonyManager.EXTRA_STATE) + + when (state) { + TelephonyManager.EXTRA_STATE_RINGING -> { + context.getSharedPreferences("incomingcallreceiver", Context.MODE_PRIVATE).edit() + .putBoolean("ringing", true) + .putBoolean("offhook", false) + .apply() + } + TelephonyManager.EXTRA_STATE_OFFHOOK -> { + context.getSharedPreferences("incomingcallreceiver", Context.MODE_PRIVATE).edit() + .putBoolean("offhook", true) + .apply() + currentlyActiveCallNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER) + } + TelephonyManager.EXTRA_STATE_IDLE -> { + val prefs = context.getSharedPreferences("incomingcallreceiver", Context.MODE_PRIVATE) + val ringing = prefs.getBoolean("ringing", false) + val offhook = prefs.getBoolean("offhook", false) + currentlyActiveCallNumber = null + + val phoneNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER) + if (ringing && !offhook && phoneNumber != null && phoneNumber.isNotBlank()) { + onMissedCall(context, phoneNumber) + } + } + } + + context.sendBroadcast(Intent(BroadcastActions.REFRESH).apply { setPackage(BuildConfig.APPLICATION_ID) }) + } + } + } + } + + private fun onMissedCall(context: Context, phoneNumber: String) { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dgunia/calllogpicker/MainActivity.kt b/app/src/main/java/com/dgunia/calllogpicker/MainActivity.kt new file mode 100644 index 0000000..2e141d9 --- /dev/null +++ b/app/src/main/java/com/dgunia/calllogpicker/MainActivity.kt @@ -0,0 +1,285 @@ +package com.dgunia.calllogpicker + +import android.Manifest +import android.app.Activity +import android.app.AlertDialog +import android.content.* +import android.content.pm.PackageManager +import android.database.Cursor +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.provider.BaseColumns +import android.provider.CalendarContract +import android.provider.CallLog +import android.provider.ContactsContract +import android.support.v7.app.AppCompatActivity +import android.view.Menu +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.ArrayAdapter +import android.widget.ListAdapter +import android.widget.Toast +import com.dgunia.calllogpicker.list.CallArrowDrawable +import kotlinx.android.synthetic.main.activity_main.* +import kotlinx.android.synthetic.main.listviewcell.view.* +import java.text.DateFormat +import java.util.* +import java.util.concurrent.Executors + +class MainActivity : AppCompatActivity() { + + private val REQUEST_CALLLOG: Int = 1 + val executor = Executors.newSingleThreadExecutor() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + if (Build.VERSION.SDK_INT >= 23) { + requestPermissions(arrayOf(Manifest.permission.READ_CALL_LOG, Manifest.permission.READ_CONTACTS), REQUEST_CALLLOG) + } else { + buildList() + } + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + + if (requestCode == REQUEST_CALLLOG) { + buildList() + } + } + + private val broadcastReceiverRefresh = object : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + buildList() + } + } + + override fun onResume() { + super.onResume() + + buildList() + + registerReceiver(broadcastReceiverRefresh, IntentFilter(BroadcastActions.REFRESH)) + } + + override fun onPause() { + super.onPause() + + unregisterReceiver(broadcastReceiverRefresh) + } + + class Call(var name: String?, val number: String?, val date: Date?, val duration: Long, val type: Int) + + private fun buildList() { + val calls = ArrayList() + if (Build.VERSION.SDK_INT < 23 || checkSelfPermission(Manifest.permission.READ_CALL_LOG) == PackageManager.PERMISSION_GRANTED) { + IncomingCallReceiver.currentlyActiveCallNumber?.let { phoneNumber -> + calls.add(Call(null, phoneNumber, Date(), 0, 0)) + } + + var cursor: Cursor? = null + try { + cursor = contentResolver.query(CallLog.Calls.CONTENT_URI, null, null, null, CallLog.Calls.DATE + " DESC") + while (cursor != null && cursor.moveToNext() && calls.size < 20) { + val name = cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME)) + val number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER)) + val date = Date(cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE))) + val duration = cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DURATION)) + val type = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE)) + + calls.add(Call(name, number, date, duration, type)) + } + } finally { + cursor?.close() + } + } else if (Build.VERSION.SDK_INT >= 23 && checkSelfPermission(Manifest.permission.READ_CALL_LOG) == PackageManager.PERMISSION_GRANTED) { + AlertDialog.Builder(this) + .setMessage(getString(R.string.cannotaccesscalllog)) + .show() + } + + if (calls.size == 0) { + Toast.makeText(this, R.string.nolastcall, Toast.LENGTH_LONG).show() + } else { + listView.onItemClickListener = object : AdapterView.OnItemClickListener { + override fun onItemClick(adapterView: AdapterView<*>, view: View, pos: Int, l: Long) { + val selectedCall = calls[pos] + if (intent.action == Intent.ACTION_PICK) { + setResult(Activity.RESULT_OK, Intent().apply { + putExtra("name", selectedCall.name) + putExtra("number", selectedCall.number) + putExtra("date", selectedCall.date?.time ?: Date().time) + putExtra("duration", selectedCall.duration) + putExtra("type", selectedCall.type) + }) + finish() + } else { + AlertDialog.Builder(this@MainActivity) + .setItems(arrayOf(getString(R.string.createevent), getString(R.string.callnumber)), { dialog, which -> + when (which) { + 0 -> onCreateEvent(selectedCall) + else -> onCall(selectedCall) + } + }) + .show() + } + } + + fun onNothingSelected(adapterView: AdapterView<*>) {} + } + + val dfDate = DateFormat.getDateInstance(DateFormat.SHORT) + val dfTime = DateFormat.getTimeInstance(DateFormat.SHORT) + + listView.adapter = object : ArrayAdapter(this, R.layout.listviewcell, calls), ListAdapter { + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val view = convertView ?: layoutInflater.inflate(R.layout.listviewcell, null) + + getItem(position)?.let { call -> + view.name.text = call.name ?: call.number + view.date.text = dfDate.format(call.date) + view.time.text = dfTime.format(call.date) + view.imageView.setImageDrawable(CallArrowDrawable(call.type != CallLog.Calls.OUTGOING_TYPE, call.type == CallLog.Calls.MISSED_TYPE)) + view.duration.text = "${call.duration / 60} ${view.context.getString(R.string.minutes)}" + + if (call.name == null) { + call.number?.let { number -> + if (Build.VERSION.SDK_INT < 23 || checkSelfPermission(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) { + // Nachladen des Namens, wenn er in der Telefonliste nicht drin stand. + executor.submit { + val contacts = loadContactsByPhoneNumberQuery(layoutInflater.context.contentResolver, number) + if (contacts.size > 0) { + call.name = contacts.get(0).displayName // Damit der Name nicht nochmal geladen wird. + view.name.text = call.name + } + } + } + } + } + } + + return view + } + } + } + } + + private fun onCall(selectedCall: Call) { + val intentCall = Intent(Intent.ACTION_VIEW, Uri.parse("tel://${selectedCall.number}")) + if (Utils.isIntentAvailable(applicationContext, intentCall)) { + startActivity(intentCall) + } else { + AlertDialog.Builder(this).setMessage(R.string.notelephoneapp).setNegativeButton(android.R.string.cancel, null).show() + } + } + + private fun onCreateEvent(selectedCall: Call) { + val intentCreateEvent = Intent(Intent.ACTION_INSERT, CalendarContract.Events.CONTENT_URI).apply { + putExtra(CalendarContract.Events.TITLE, selectedCall.name) + putExtra(CalendarContract.Events.DESCRIPTION, selectedCall.number) + } + if (Utils.isIntentAvailable(applicationContext, intentCreateEvent)) { + startActivity(intentCreateEvent) + } else { + AlertDialog.Builder(this).setMessage(R.string.nocalendarapp).setNegativeButton(android.R.string.cancel, null).show() + } + } + + fun loadContactsByPhoneNumberQuery(cr: ContentResolver, phonenumber: String): List { + val uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phonenumber)) + var name = "?" + val phoneNumbers = ArrayList() + + val contactLookup = + cr.query(uri, arrayOf(BaseColumns._ID, ContactsContract.PhoneLookup.DISPLAY_NAME), null, null, null) + + try { + if (contactLookup != null && contactLookup.count > 0) { + contactLookup.moveToNext() + name = contactLookup.getString(contactLookup.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)) + val contactId = contactLookup.getString(contactLookup.getColumnIndex(BaseColumns._ID)) + val contact = loadContactStructuredNameByID(cr, contactId) + contact.displayName = name + + phoneNumbers.add(contact) + } + } finally { + contactLookup?.close() + } + + return phoneNumbers + } + + fun loadContactStructuredNameByID(cr: ContentResolver, contactID: String): Contact { + val result = Contact(contactID, "") + // projection + val projection = arrayOf( + ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, + ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, + ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, + ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME + ) + + val where = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?" + val whereParameters = arrayOf(contactID, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) + + //Request + val cursor = cr.query(ContactsContract.Data.CONTENT_URI, projection, where, whereParameters, null) + + if (cursor != null) { + //Iteration + if (cursor.moveToFirst()) { + result.displayName = + cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME)) + result.givenName = + cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME)) + result.middleName = + cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME)) + result.familyName = + cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME)) + } + cursor.close() + } + return result + } + + override fun onCreateOptionsMenu(menu: Menu?): Boolean { + menuInflater.inflate(R.menu.main_menu, menu) + return true + } + + override fun onOptionsItemSelected(item: MenuItem?): Boolean { + when (item?.itemId) { + R.id.menusettings -> { + onSettings() + return true + } + R.id.menuprivacypolicy -> { + onPrivacyPolicy() + return true + } + R.id.menuabout -> { + onAbout() + return true + } + } + return super.onOptionsItemSelected(item) + } + + private fun onPrivacyPolicy() { + AlertDialog.Builder(this).setMessage(getString(R.string.privacypolicytext)).setPositiveButton(android.R.string.ok, null).show() + } + + private fun onSettings() { + startActivity(Intent(this, SettingsActivity::class.java)) + } + + private fun onAbout() { + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/dg76/calllog-picker"))) + } +} diff --git a/app/src/main/java/com/dgunia/calllogpicker/PermissionUtils.kt b/app/src/main/java/com/dgunia/calllogpicker/PermissionUtils.kt new file mode 100644 index 0000000..2fc9b4a --- /dev/null +++ b/app/src/main/java/com/dgunia/calllogpicker/PermissionUtils.kt @@ -0,0 +1,20 @@ +package com.dgunia.calllogpicker + +import android.content.Context +import android.content.pm.PackageManager +import android.os.Build + +object PermissionUtils { + /** + * Checks if all necessary permissions were granted. + */ + fun hasPermissions(context: Context, vararg permissions: String): Boolean { + if (Build.VERSION.SDK_INT < 23) return true; + + for(permission in permissions) { + if (context.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) return false + } + + return true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dgunia/calllogpicker/SettingsActivity.kt b/app/src/main/java/com/dgunia/calllogpicker/SettingsActivity.kt new file mode 100644 index 0000000..0364906 --- /dev/null +++ b/app/src/main/java/com/dgunia/calllogpicker/SettingsActivity.kt @@ -0,0 +1,74 @@ +package com.dgunia.calllogpicker + +import android.Manifest +import android.content.SharedPreferences +import android.content.pm.PackageManager +import android.os.Build +import android.os.Bundle +import android.preference.PreferenceActivity +import android.preference.SwitchPreference + +/** + * A [PreferenceActivity] that presents a set of application settings. On + * handset devices, settings are presented as a single list. On tablets, + * settings are split by category, with category headers shown to the left of + * the list of settings. + * + * See [Android Design: Settings](http://developer.android.com/design/patterns/settings.html) + * for design guidelines and the [Settings API Guide](http://developer.android.com/guide/topics/ui/settings.html) + * for more information on developing a Settings UI. + */ +class SettingsActivity : AppCompatPreferenceActivity(), SharedPreferences.OnSharedPreferenceChangeListener { + companion object { + val REQUEST_READ_PHONE_STATE = 1 + } + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { + when (key) { + "showcurrentcall" -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && sharedPreferences.getBoolean(key, false)) { + requestPermissions(arrayOf(Manifest.permission.READ_PHONE_STATE), REQUEST_READ_PHONE_STATE) + } + } + } + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + + if (Build.VERSION.SDK_INT >= 23 && checkSelfPermission(Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { + (findPreference("showcurrentcall") as SwitchPreference).isChecked = false + } + } + + override fun onPostCreate(savedInstanceState: Bundle?) { + super.onPostCreate(savedInstanceState) + + setupSimplePreferencesScreen() + } + + override fun onResume() { + super.onResume() + preferenceScreen.sharedPreferences + .registerOnSharedPreferenceChangeListener(this) + } + + override fun onPause() { + super.onPause() + preferenceScreen.sharedPreferences + .unregisterOnSharedPreferenceChangeListener(this) + } + + /** + * Shows the simplified settings UI if the device configuration if the + * device configuration dictates that a simplified, single-pane UI should be + * shown. + */ + private fun setupSimplePreferencesScreen() { + addPreferencesFromResource(R.xml.pref_general) + } + + /** + * {@inheritDoc} + */ + override fun onIsMultiPane(): Boolean = false +} diff --git a/app/src/main/java/com/dgunia/calllogpicker/Utils.kt b/app/src/main/java/com/dgunia/calllogpicker/Utils.kt new file mode 100644 index 0000000..dfc4ae9 --- /dev/null +++ b/app/src/main/java/com/dgunia/calllogpicker/Utils.kt @@ -0,0 +1,16 @@ +package com.dgunia.calllogpicker + +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager + +object Utils { + /** + * Checks if the given intent can be called, i.e. if it exists. + */ + fun isIntentAvailable(context: Context, intent: Intent): Boolean { + val packageManager = context.packageManager + val list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY) + return list != null && list.size > 0 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dgunia/calllogpicker/list/CallArrowDrawable.java b/app/src/main/java/com/dgunia/calllogpicker/list/CallArrowDrawable.java new file mode 100644 index 0000000..d4fbaf6 --- /dev/null +++ b/app/src/main/java/com/dgunia/calllogpicker/list/CallArrowDrawable.java @@ -0,0 +1,57 @@ +package com.dgunia.calllogpicker.list; + +import android.graphics.*; +import android.graphics.drawable.Drawable; + +/** + * Draws an arrow for incoming/outgoing calls. + */ +public class CallArrowDrawable extends Drawable { + private final boolean incoming; + private final boolean missed; + + public CallArrowDrawable(boolean incoming, boolean missed) { + this.incoming = incoming; + this.missed = missed; + } + + @Override + public void draw(Canvas canvas) { + RectF rect = new RectF(getBounds()); + rect.inset(5, 5); + + Paint paint = new Paint(); + paint.setStrokeWidth(4); + paint.setStyle(Paint.Style.STROKE); + + paint.setColor(missed ? Color.RED : incoming ? Color.GREEN : Color.BLUE); + canvas.drawLine(rect.right, rect.top, rect.left, rect.bottom, paint); + + if (incoming) { + Path path = new Path(); + path.moveTo(rect.left, rect.top + rect.height() * 0.5f); + path.lineTo(rect.left, rect.bottom); + path.lineTo(rect.left + rect.width() * 0.5f, rect.bottom); + canvas.drawPath(path, paint); + } else { + Path path = new Path(); + path.moveTo(rect.left + rect.width() * 0.5f, rect.top); + path.lineTo(rect.right, rect.top); + path.lineTo(rect.right, rect.top + rect.height() * 0.5f); + canvas.drawPath(path, paint); + } + } + + @Override + public void setAlpha(int i) { + } + + @Override + public void setColorFilter(ColorFilter colorFilter) { + } + + @Override + public int getOpacity() { + return PixelFormat.TRANSLUCENT; + } +} diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..6348baa --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_info_black_24dp.xml b/app/src/main/res/drawable/ic_info_black_24dp.xml new file mode 100644 index 0000000..8024b5b --- /dev/null +++ b/app/src/main/res/drawable/ic_info_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..a0ad202 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_notifications_black_24dp.xml b/app/src/main/res/drawable/ic_notifications_black_24dp.xml new file mode 100644 index 0000000..14f20f9 --- /dev/null +++ b/app/src/main/res/drawable/ic_notifications_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_sync_black_24dp.xml b/app/src/main/res/drawable/ic_sync_black_24dp.xml new file mode 100644 index 0000000..478aa98 --- /dev/null +++ b/app/src/main/res/drawable/ic_sync_black_24dp.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..e497beb --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/listviewcell.xml b/app/src/main/res/layout/listviewcell.xml new file mode 100644 index 0000000..184330b --- /dev/null +++ b/app/src/main/res/layout/listviewcell.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/savesettings.xml b/app/src/main/res/layout/savesettings.xml new file mode 100644 index 0000000..fb3d8a2 --- /dev/null +++ b/app/src/main/res/layout/savesettings.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/main_menu.xml b/app/src/main/res/menu/main_menu.xml new file mode 100644 index 0000000..6678038 --- /dev/null +++ b/app/src/main/res/menu/main_menu.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..979143b02201dae825817263312aad0df6ac2994 GIT binary patch literal 1362 zcmV-Y1+DstP)E)#$RYEg(Qm=IxUh1ys|R&3w@Z2Je{V3fh2{HCda46>gnQO z+%8QCJsArJzDA4j!JfkgPhtjxajkRdBpe2slH_rj){Vg3Ij2_mdyWK9oN?{Y7VQFJ zE_2Zsq`lTtM_!cxiZ>NFw(wfFAQz;*Y~M*< z6#<%`-@je+fO71gCWEMt%%=@?MW7YqhR7`WV1 z>xXj;7FX#I5cM2_!&rFL9?&76%uT$9$N{vgONW5&FJUm|k_V`*Tc$DczcPu=dvR0hti**X9U>AcCXJ|NsIQ+^H z&V9u?uI3kF)qb`wG@QzP4DOZ0eh@Tt;8gBcmpMlnRDUk^gM3<9$KY?rB%om&a=G;a zkWVyy2Pf+jXJTl0#ln{BbG5vr@U5P4$W?uY@C2aAUbMZPmlYF`E(|hQQ6m8P^yFp+ z_Fn^s+P6P5c(g(Q^6B*kTpSJu4z-qU1`lr%fV`rOv2E>v+p*3u2K5ISJh(vs;``O5 zyg2nAYP8zk`XxfzD6b8g0iSx8!SWhDM58WrW9{JZ@pl-U49Z8BZ~@ua#Q}zcv#yE3 zUl;jnPMv4aio>*`jlt@V7%Zt`u&9!QlM6g1Pga*zGdL5pElc}H?by4X*gW-YShVNL z``vU{;22`ii_40`Jsg&5kDi}-kHP6bE;mW_Tkej_pD*oY@UP6nfC*8~Q}x+A<&y57 z0@p~SQB2-@zv0URdfvun`6ng*YCa+(N5%TZ3yvl~&#M?}X*_Fv?m zkmw4Ke~)@&CxiXR`L>BOf?h>4q2>Vv^r|uj`HlRrkyhiBtEjefhq&B^eqYk8^J^68 zVl7JSbhcK#pBKIakB+_xPKH(IfI^le)(8t&ah0n8Bml)ep!_}^+^bZ7ZCjal8Af#dZed0fWA0l4$&raba$diA?$ zk>1pM9qRV^ zqd*O-TVr4>a6syd$L+V?wRjuE(z_sQGs+s+DG~JkT^JyQ^(>_Mw*9 zFLbsBsw3$8ju3y7^PH>ECO&3&w$OVg59EbBdA-e8a6>eoy%1+eG2Mud(^0cfsi-uS zD|OsUvLQMBCa=fn!!#{%W>(@YDW;^Glhbcgv&aK^Ax~H1<3QpxA`v1)h)_lR2OjBX UJn}e~FaQ7m07*qoM6N<$f>MBz2LJ#7 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..05ad45af272c13b821ec31951d307707cc77f693 GIT binary patch literal 1061 zcmeAS@N?(olHy`uVBq!ia0vp^i$Iuz4M-mPBqq(k!2HJ3#WAGf*4w+j9igcb2MTrF zgWC+)gdLObTu}?WrSjs?Spi2k?(ITN-PaQH*jSFXDr^Zj)f$)=CGw7SBg<_KNhPlq z`2>$$ojIX(4?k8u6;ZT$o_w$PS;_P7&FQuu?$|#+XZih3vA7Pg*p z^itoB)kf_VH^VZ8AGtgeSbtk9*GcBQ%%k^uPcNt)aW$+@=lPg;CTaFk-=6Kp@}lvZ zfjTQRi#wuorkW|vJ0bJPeVf;8f&LV}kHsLfb{n@>+yj~Qd#3Xq`OllqUNSjyQfdG9 zoN3Dxm)$<_?@PUsbH~TsXB7Xv5*7oxLBF`8KWW-69be}f_2Q20m!kK9bbLHB-?Bbw z^_Jd`Da$zet)z@*3)qV(I&&1}R!&lMdS-L1Sn0|CU*B|`Hnq=~cdNj^g-7w&W2F=h zMZeAoiY+?~o+TYUUM`*6Wta44!=sLhQ`253A5k?lzf*idAn8t|;G?M`YkV)3cD(dV z4A)M&lO6m;@bR`Tfy<`HOU+#6(=RO7PTKQ8ca~k!oq#&yd^L8EK{f%8S2ITEcCB-c z37e;S{z?Cg>$%2VzI|}Y(Mt=!hP$?g|7uJZ#`;kn)FA_mgUN^ z7e>dvF#Ncmb>zoX>yj5%$Id?G{}W<)?drshdyehAA*_02$KGet*Y4}B)O>v3_x!7y zqQ#qQ(#ox7+lze8v)cXr)S2@V->>YMZCz{i*$WsP=RTDG>#~&o9C@a1#`ff}AL5B$ zoPF~9+ok^$Jdu`liwI$v)wf`Ja$V0)#b@0!%=dOJ7Eb1Ra(b5IlKX#uFL=(en(6MN zP?@~3<)$tB_WCHimgDWAFkw-Qi zg`sE9FPm>SQ?te6oy74|yUXN64yzui6nU~t%KSRl#JHrGu)4Po_6bNjO_0v2u@30? zQg*g5x>x@r_r!aCX=T?cuJsALR6U{kH28!b*TjW;QvIj;uiLBc(kAfq)F;Nz&#m@d z*n4c-O6jM!j809SS-(#AuCis?;Vqp-d;Tb%u6_Fa^5&m=UuH_HhR=AJH}_--yZ@PY zGn5V0lk|?>sXHfVBFnkFc7Cg!b8Lv5tNJNv!?0>=P`1Vi8r0>OV+3<89zFK-0x9xz L^>bP0l+XkKZ9wny literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..20cbdac46ed1bb12d95957ec4530b7c72664e361 GIT binary patch literal 3296 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 P00000NkvXXu0mjf=fy)2 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..e1ce7d8f4934ad7b3581dfe40cb3f60e588d5623 GIT binary patch literal 2046 zcmV?>=_#u6Nm8*PB-Ol&YkU@9tRYC_Rm(WnTj}#>|LT#pzx?(yJf@{1dcQ2=d z>AI`HbtXDlYoaT3X1YgfvVEsEk~*!CG;7Q@3k28Pd+am*9(FH#Cg?<9dg(4}Of*en zvK`l%ZJk=PjcQHAYr!*k7CNRE(2;U$`0>U2xp=KxPgk*Bt&xJ(n21envJ!6u_c{?` zx}Z~x3EskfiVtaEs!enT+qFs&I0HhoCTk!6m-u7>xo0&-YbDl@TYJFZHS1{(^I@xf zaii7hD`>aEbUBFFaGf(?64D2m;$04R;dagDH}Db{gl@=;Lg#JtKM7Vth{o7QRRxwjDK?LJUSsIhi2*C_1i;rd5qjemp5{SQCZ=B9y}rPa-p8kdln6jy>Dt?qfTB(>;NjMnWIo6p(nZ@vhWM6W2Co$-9!kNL@n1+3wef zxml_x^8-TLI^7d!X(x34mH-7du&_;KR;ZnndTi8fRuCDf3^&rm-FH>;;!Z-ZTHF)p zvl9BkjsRvRSfQwgPR;rw-Ng!y)TA!zKJM!KqQJlFo81$DY&{al^vYvO%xyklj|E^C z3xslAODv1}PDh{O(mgUc^LzgUj-3x|ZP1!2O)BW@Ojv$KVJ~iCT2kee^-P6xWk*=%ql#mef{_LM4GK%L+5p)~Ky$*X(#yzdIUw~x>h7Xui?PHl#jD%aGP zqB=|4ix9P;tHKk3r?wJ$@z2|Xx1yT=EEs(f{wlMZ&N9r7RI1RQiclBbs`ErZXC`!) ziyIxk5cr*Ut<1{YYgeM?yfNBNAaT{t<5{7&>WKhk!8YfLocD2Xz)K0J@~<~Xr|gZk z6PUWZDn@JUYx9Nx;&RpDv$Mr0E$|}HAevNJQ{og zlNOdL>;xXwe-)Kv=x+9wzzh}(?|#FB2Z^ROLRakOV;$6b7)PrO zH|xA50C{pVp+D3*TwZere!iLaq>^VmlSW zKEBJX{)f=2D};VhE`KoMF`<>{rjt{@&F6}*w3T>d(LNQc1=rm*bN$JzVxEL(2`;c1 zsGY|gDHgkoiY*4dJGst|r`e@)1gv~Bmv8A9pS*o0=RL`%LZ$6=gfhG3q`P+78%w~Q z#F!9W3Uva-4iy`1M}OcUup|Zr?%L^TnKk7M>%C4#0Wl8ZQctgikNN6Gu7Qp0QLWE19Vx#ToZ<^tW0Ea=?{YlRqc?}rl=R*!gk;--d zR^4eVxN88>#iA9LJ5NXjWDR99zQ3yGJj3=dKP){oq`#@$u;?dtq$CyI=-~#sewsp~ zE+CEKP=u2mj;A(&KwkFuu5&tBz_K;qHd9hhV&^9TgHUmOe+dtQL^S+R zm1pVZ7G%EZFCr4)oGxWfPx<{%>X&7-G* zEf-S)aGbK3&S{y|Rgp6dsl3m#HGOrP{sLQ}KLiq(1jNUte7Y%db$u;NEm(vTwV8PS zn$^rt*m!p&oV!3*Y)aW?raJ*^@M{I&X9z+LhD(hN3x7~Gap6big!GH$s+?=>*g?L6 z6VW;@B78N=?m<;m<+QdZq+cqB4(NhTukyS)`hf_XsjlcrOh1;3UOo cmx25F|D;6u-l&ov+yDRo07*qoM6N<$g8AI%FaQ7m literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..38db35b06890b62e333a04c2bae5ca0960af659d GIT binary patch literal 1907 zcmV-(2aNcMP)YR36nRq++EQ_y7fhU6g#JNv1WUjmT*ENXgWEFq&w)fQFhunKdc-Y}7F` zGcz4aYnW1dIiZ@1Yc~_hoPzw6y;nH4R$zT?h~B^w2Fj z6$0H+`0nTddf~_;#R=nQL>fG(OMxZ2WXR?+aaC}Y+dkb%_IEZ}z2KgpH@AAFc**Z; zfDrz$JTA~B*MiQ#NOqwg$+dafq^jPE)&x7vn0XcLbcWh|e2~__Zs-hxg+Evzp#+Q7 z6Yfo9Qq`HDDL?otRuk+$qBB^QSxdfNF!P7iQmOyHte)tZS^IhoM9e(5LKy(I;Z@Lx z{jK>!a;()%F9>9K1G0G&kyw1fKXj(gtscrM{b5t{0{IV@;*Uoe1V&~%mem{HN<2Qd zq%3IEwh-C1!1iU2UK4-r&8t`y0caY4h=y@>$G1~7!zfaB+-0a&n&0LTU~a500UXQcsHzMBBZ2GB2s z!QoTV0Brn@04OpH-TRv~0Q<8=fCNA$fOT2Y0AS}m=nVoO8$jv~X#lFPGZ>Lh0AvH0 zu$qC{A`L>)#{@t&fafw86qQK>urQX60vkQWd6Al^{oM@3P3a;&u{*|;gbLII$D%( z_FWMp-(hh5MtuMWe&-Xe6awIqZ7FDWT>w|A)Z6x}4gd}>uh!Iua5z_8>1S1M%yP6w zP{W(1WnT~gmjD?3E(23}eFzu%WbOGC1i&R*6EnZ5pQaYLemt$t-Epb|fP028+gZ03 zSOf;^v(%G@R`urG=^GhbuBZ>;8tpG-RR?$nY_1QXw35M$jp78305s$F zbX;&bki*-5!Es7DVVyc4sQP>WE?YLVhqRDGn7Up%1k6EUO`4d=V91i@n`@~4fX28F z#1iia!li#0ByMpY!swL@&J^DqVd1XpuZ}Uu*u&tZ55?Mtsd9vZ!X{BF=zHRX%#^ia z+wTZM^L$9=LvX{=9LYOzdwF8gFi1yH{ae| zE#B$ohx9NzYHz55CG?DK$oGJF^T~Q8nrV-XAsH=KobEZ7F~ICKzfvH0JiHlJbgM2 z^w%!Dev+;*X~GpI+@rARdHHSIhj&KrH1Rv--6InfwH_}idmwB^?i#J$!XH#?*6Ibi z#Ha2hK6*4gQ;450}*#`}X}u>OwhDyTp&9vl7nr|kj<4MUH7e1h;IH%0H1M3Sw&{CWi71GvK4`UdoG*E24z zL)heT{^66xx}*H~yQ2r(ivj2fdSmmbwUVXZ9ylUuTp-r0(f&A}au3lUrZZ7m7 z7(GF6&?B2y%@RlzJ7sT;Z|C;j-d#I-d3EXJ<@HE_d#Xz(^Z>oEdLnw`p>aWYSjV_x tJJ-t1)zapLON^(WprD|jprE)n;$L(`7a3javKjyY002ovPDHLkV1nu;d+GoH literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..56d197fd24a34f0b2c843891f38ad2304eee1215 GIT binary patch literal 1450 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 UW|Di$dYi8SH9DGqAkC8@;xp{ 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

a@{TC+iO zVdB(-$TP literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..a4940f512ed672d873972b63b04b3d1257dc5430 GIT binary patch literal 4055 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 W*=GuTmFTQZc=U+7bL}D0`Tql%uw&8y literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..ea22affaba10938a5d43bda999549c2cd5600a72 GIT binary patch literal 10572 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 a;PL;2yHRN0-GU$h0000 + CallLogPicker + Keine Anrufe + Minuten + Anrufliste + Auf Ihre Anrufliste kann nicht zugegriffen werden. + Einstellungen + Aktuellen Anruf anzeigen + Wenn es einen laufenden Anruf gibt, wird dieser auch angezeigt. Dafür wird eine zusätzliche Berechtigung benötigt. + Datenschutzerklärung + Mit dieser App können Sie Einträge aus Ihrer Anrufliste auswählen und entweder anrufen oder die Daten an die aufrufende App zurücksenden. Es verfügt nicht über die "Internet" Berechtigung und sendet Ihre Daten sonst nirgendwo hin. + Über Call Log Picker + Keine Kalender App gefunden. + Keine Telefon App gefunden. + Event erstellen + Kontakt anrufen + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..8657fb6 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #008577 + #00574B + #003df5 + diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..cd665d3 --- /dev/null +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #357AFF + \ No newline at end of file diff --git a/app/src/main/res/values/strings_calllog.xml b/app/src/main/res/values/strings_calllog.xml new file mode 100644 index 0000000..a9f4efc --- /dev/null +++ b/app/src/main/res/values/strings_calllog.xml @@ -0,0 +1,19 @@ + + CallLogPicker + No last call + minutes + Call Log + Cannot access your call log. + Settings + Show current call + If there is an active call this call is displayed, too. It requires special permissions. + Privacy Policy + This app allows you to select entries from your call log and either call them or send the data back to the calling app. + It does not have the Internet permission and does not send your data anywhere else. + + About Call Log Picker + No calendar app found. + No telephone app found. + Create Event + Call Number + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..591dbb7 --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,14 @@ + + + + + + + diff --git a/app/src/main/res/xml/pref_general.xml b/app/src/main/res/xml/pref_general.xml new file mode 100644 index 0000000..c98db14 --- /dev/null +++ b/app/src/main/res/xml/pref_general.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..a9bc046 --- /dev/null +++ b/build.gradle @@ -0,0 +1,27 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + ext.kotlin_version = '1.3.10' + repositories { + google() + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:3.2.1' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..e7b4def --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +include ':app'