├── app ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ ├── resources.properties │ │ │ ├── values-bn │ │ │ │ └── strings.xml │ │ │ ├── values-bs │ │ │ │ └── strings.xml │ │ │ ├── values-cy │ │ │ │ └── strings.xml │ │ │ ├── values-pa │ │ │ │ └── strings.xml │ │ │ ├── drawable │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── call_draggable_background.xml │ │ │ │ ├── tab_indicator.xml │ │ │ │ ├── ic_minus_vector.xml │ │ │ │ ├── ic_hashtag.xml │ │ │ │ ├── button_dialpad_background.xml │ │ │ │ ├── pulsing_background.xml │ │ │ │ ├── ic_sim_vector.xml │ │ │ │ ├── ic_transparent.xml │ │ │ │ ├── call_draggable_background_stroke.xml │ │ │ │ ├── ripple_all_corners_12dp.xml │ │ │ │ ├── ripple_all_corners_8dp.xml │ │ │ │ ├── ic_backspace_x.xml │ │ │ │ ├── ic_theme_black.xml │ │ │ │ ├── ripple_left_corners_8dp.xml │ │ │ │ ├── ripple_right_corners_8dp.xml │ │ │ │ ├── button_dialpad.xml │ │ │ │ ├── button_dialpad_press.xml │ │ │ │ ├── ic_sim_one.xml │ │ │ │ ├── ic_phone_down_red_vector.xml │ │ │ │ ├── ic_phone_down_vector.xml │ │ │ │ ├── ic_asterisk.xml │ │ │ │ ├── pulsing_background_ripple.xml │ │ │ │ ├── ic_phone_green_vector.xml │ │ │ │ ├── shortcut_dialpad.xml │ │ │ │ ├── ic_call_merge_vector.xml │ │ │ │ ├── button_background_11dp.xml │ │ │ │ ├── button_rounded_8dp.xml │ │ │ │ ├── ic_sim_two.xml │ │ │ │ ├── ic_person_rounded_scaled.xml │ │ │ │ ├── ic_pause_vector.xml │ │ │ │ ├── ic_call_end.xml │ │ │ │ ├── ic_theme.xml │ │ │ │ ├── ic_phone_one_vector.xml │ │ │ │ ├── ic_voicemail.xml │ │ │ │ ├── ic_bold_italic.xml │ │ │ │ ├── ic_messages.xml │ │ │ │ ├── ic_backspace.xml │ │ │ │ ├── placeholder_voicemail.xml │ │ │ │ ├── ic_call_split_vector.xml │ │ │ │ ├── button_rounded.xml │ │ │ │ ├── ic_slider.xml │ │ │ │ ├── ic_add_call_vector.xml │ │ │ │ ├── ic_bold.xml │ │ │ │ ├── ic_clock_filled_scaled.xml │ │ │ │ ├── tab_background.xml │ │ │ │ ├── ic_star_vector_scaled.xml │ │ │ │ ├── ic_call_swap_vector.xml │ │ │ │ ├── ic_hd.xml │ │ │ │ ├── ic_call_missed_vector.xml │ │ │ │ ├── ic_volume_down_vector.xml │ │ │ │ ├── ic_telegram_vector.xml │ │ │ │ ├── ic_italic.xml │ │ │ │ ├── ic_pause_crossed_vector.xml │ │ │ │ ├── ic_microphone_off_vector.xml │ │ │ │ ├── ic_call_made_vector.xml │ │ │ │ ├── ic_restore_vector.xml │ │ │ │ ├── ic_call_received_vector.xml │ │ │ │ ├── ic_call_accept.xml │ │ │ │ ├── ic_run.xml │ │ │ │ ├── ic_show_block.xml │ │ │ │ ├── ic_slider_outline.xml │ │ │ │ ├── ic_change.xml │ │ │ │ ├── ic_restart.xml │ │ │ │ ├── ic_person_rounded_outline.xml │ │ │ │ ├── ic_bluetooth_audio_vector.xml │ │ │ │ ├── ic_note.xml │ │ │ │ ├── ic_volume_up_vector.xml │ │ │ │ ├── ic_threema_vector.xml │ │ │ │ ├── ic_contact_photo.xml │ │ │ │ ├── ic_whatsapp_vector.xml │ │ │ │ ├── ic_slider_vertical.xml │ │ │ │ ├── ic_info.xml │ │ │ │ ├── ic_wallpaper.xml │ │ │ │ ├── ic_phone_two_vector.xml │ │ │ │ ├── ic_contact_blur.xml │ │ │ │ ├── ic_answer_buttons.xml │ │ │ │ ├── ic_signal_vector.xml │ │ │ │ └── ic_call_button_bottom.xml │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_five.png │ │ │ │ ├── ic_launcher_four.png │ │ │ │ ├── ic_launcher_nine.png │ │ │ │ ├── ic_launcher_one.png │ │ │ │ ├── ic_launcher_six.png │ │ │ │ ├── ic_launcher_ten.png │ │ │ │ ├── ic_launcher_two.png │ │ │ │ ├── ic_launcher_eight.png │ │ │ │ ├── ic_launcher_eleven.png │ │ │ │ ├── ic_launcher_seven.png │ │ │ │ ├── ic_launcher_three.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ ├── ic_launcher_monochrome.png │ │ │ │ ├── ic_launcher_six_background.png │ │ │ │ ├── ic_launcher_ten_background.png │ │ │ │ ├── ic_launcher_two_background.png │ │ │ │ ├── ic_launcher_two_foreground.png │ │ │ │ ├── ic_launcher_two_monochrome.png │ │ │ │ ├── ic_launcher_eight_background.png │ │ │ │ ├── ic_launcher_eleven_background.png │ │ │ │ ├── ic_launcher_five_background.png │ │ │ │ ├── ic_launcher_four_background.png │ │ │ │ ├── ic_launcher_nine_background.png │ │ │ │ ├── ic_launcher_seven_background.png │ │ │ │ └── ic_launcher_three_background.png │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_five.png │ │ │ │ ├── ic_launcher_four.png │ │ │ │ ├── ic_launcher_nine.png │ │ │ │ ├── ic_launcher_one.png │ │ │ │ ├── ic_launcher_six.png │ │ │ │ ├── ic_launcher_ten.png │ │ │ │ ├── ic_launcher_two.png │ │ │ │ ├── ic_launcher_eight.png │ │ │ │ ├── ic_launcher_eleven.png │ │ │ │ ├── ic_launcher_seven.png │ │ │ │ ├── ic_launcher_three.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ ├── ic_launcher_monochrome.png │ │ │ │ ├── ic_launcher_six_background.png │ │ │ │ ├── ic_launcher_ten_background.png │ │ │ │ ├── ic_launcher_two_background.png │ │ │ │ ├── ic_launcher_two_foreground.png │ │ │ │ ├── ic_launcher_two_monochrome.png │ │ │ │ ├── ic_launcher_eight_background.png │ │ │ │ ├── ic_launcher_eleven_background.png │ │ │ │ ├── ic_launcher_five_background.png │ │ │ │ ├── ic_launcher_four_background.png │ │ │ │ ├── ic_launcher_nine_background.png │ │ │ │ ├── ic_launcher_seven_background.png │ │ │ │ └── ic_launcher_three_background.png │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_one.png │ │ │ │ ├── ic_launcher_six.png │ │ │ │ ├── ic_launcher_ten.png │ │ │ │ ├── ic_launcher_two.png │ │ │ │ ├── ic_launcher_eight.png │ │ │ │ ├── ic_launcher_eleven.png │ │ │ │ ├── ic_launcher_five.png │ │ │ │ ├── ic_launcher_four.png │ │ │ │ ├── ic_launcher_nine.png │ │ │ │ ├── ic_launcher_seven.png │ │ │ │ ├── ic_launcher_three.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ ├── ic_launcher_monochrome.png │ │ │ │ ├── ic_launcher_eight_background.png │ │ │ │ ├── ic_launcher_five_background.png │ │ │ │ ├── ic_launcher_four_background.png │ │ │ │ ├── ic_launcher_nine_background.png │ │ │ │ ├── ic_launcher_seven_background.png │ │ │ │ ├── ic_launcher_six_background.png │ │ │ │ ├── ic_launcher_ten_background.png │ │ │ │ ├── ic_launcher_three_background.png │ │ │ │ ├── ic_launcher_two_background.png │ │ │ │ ├── ic_launcher_two_foreground.png │ │ │ │ ├── ic_launcher_two_monochrome.png │ │ │ │ └── ic_launcher_eleven_background.png │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_eight.png │ │ │ │ ├── ic_launcher_five.png │ │ │ │ ├── ic_launcher_four.png │ │ │ │ ├── ic_launcher_nine.png │ │ │ │ ├── ic_launcher_one.png │ │ │ │ ├── ic_launcher_seven.png │ │ │ │ ├── ic_launcher_six.png │ │ │ │ ├── ic_launcher_ten.png │ │ │ │ ├── ic_launcher_three.png │ │ │ │ ├── ic_launcher_two.png │ │ │ │ ├── ic_launcher_eleven.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ ├── ic_launcher_monochrome.png │ │ │ │ ├── ic_launcher_five_background.png │ │ │ │ ├── ic_launcher_four_background.png │ │ │ │ ├── ic_launcher_nine_background.png │ │ │ │ ├── ic_launcher_six_background.png │ │ │ │ ├── ic_launcher_ten_background.png │ │ │ │ ├── ic_launcher_two_background.png │ │ │ │ ├── ic_launcher_two_foreground.png │ │ │ │ ├── ic_launcher_two_monochrome.png │ │ │ │ ├── ic_launcher_eight_background.png │ │ │ │ ├── ic_launcher_eleven_background.png │ │ │ │ ├── ic_launcher_seven_background.png │ │ │ │ └── ic_launcher_three_background.png │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_five.png │ │ │ │ ├── ic_launcher_four.png │ │ │ │ ├── ic_launcher_nine.png │ │ │ │ ├── ic_launcher_one.png │ │ │ │ ├── ic_launcher_six.png │ │ │ │ ├── ic_launcher_ten.png │ │ │ │ ├── ic_launcher_two.png │ │ │ │ ├── ic_launcher_eight.png │ │ │ │ ├── ic_launcher_eleven.png │ │ │ │ ├── ic_launcher_seven.png │ │ │ │ ├── ic_launcher_three.png │ │ │ │ ├── ic_launcher_background.png │ │ │ │ ├── ic_launcher_foreground.png │ │ │ │ ├── ic_launcher_monochrome.png │ │ │ │ ├── ic_launcher_six_background.png │ │ │ │ ├── ic_launcher_ten_background.png │ │ │ │ ├── ic_launcher_two_background.png │ │ │ │ ├── ic_launcher_two_foreground.png │ │ │ │ ├── ic_launcher_two_monochrome.png │ │ │ │ ├── ic_launcher_eight_background.png │ │ │ │ ├── ic_launcher_five_background.png │ │ │ │ ├── ic_launcher_four_background.png │ │ │ │ ├── ic_launcher_nine_background.png │ │ │ │ ├── ic_launcher_seven_background.png │ │ │ │ ├── ic_launcher_three_background.png │ │ │ │ └── ic_launcher_eleven_background.png │ │ │ ├── values-az │ │ │ │ └── strings.xml │ │ │ ├── values-mk │ │ │ │ └── strings.xml │ │ │ ├── values-night │ │ │ │ └── colors.xml │ │ │ ├── values │ │ │ │ ├── integers.xml │ │ │ │ ├── bools.xml │ │ │ │ ├── colors.xml │ │ │ │ └── styles.xml │ │ │ ├── values-sw720dp │ │ │ │ └── dimens.xml │ │ │ ├── values-land │ │ │ │ └── dimens.xml │ │ │ ├── values-sw600dp │ │ │ │ └── dimens.xml │ │ │ ├── layout │ │ │ │ ├── dialog_choose_social.xml │ │ │ │ ├── fragment_contacts.xml │ │ │ │ ├── fragment_favorites.xml │ │ │ │ ├── item_recents_date.xml │ │ │ │ ├── layout_simple_recycler_view.xml │ │ │ │ ├── dialog_filter_contact_sources.xml │ │ │ │ ├── item_speed_dial.xml │ │ │ │ ├── dialog_show_grouped_calls.xml │ │ │ │ ├── item_filter_contact_source.xml │ │ │ │ ├── item_choose_social.xml │ │ │ │ ├── dialog_export_call_history.xml │ │ │ │ ├── dialog_add_speed_dial.xml │ │ │ │ ├── dialog_change_text.xml │ │ │ │ ├── activity_conference.xml │ │ │ │ ├── timer_notification.xml │ │ │ │ ├── dialog_select_sim.xml │ │ │ │ └── dialog_manage_visible_tabs.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ ├── ic_launcher_one.xml │ │ │ │ ├── ic_launcher_five.xml │ │ │ │ ├── ic_launcher_four.xml │ │ │ │ ├── ic_launcher_nine.xml │ │ │ │ ├── ic_launcher_six.xml │ │ │ │ ├── ic_launcher_ten.xml │ │ │ │ ├── ic_launcher_eight.xml │ │ │ │ ├── ic_launcher_eleven.xml │ │ │ │ ├── ic_launcher_seven.xml │ │ │ │ ├── ic_launcher_three.xml │ │ │ │ └── ic_launcher_two.xml │ │ │ ├── menu │ │ │ │ ├── menu_call_history_item_options.xml │ │ │ │ ├── menu_settings.xml │ │ │ │ ├── menu_call_history.xml │ │ │ │ ├── menu_dialpad.xml │ │ │ │ ├── menu_recent_item_options.xml │ │ │ │ └── menu.xml │ │ │ ├── values-sw340dp-notlong │ │ │ │ └── dimens.xml │ │ │ ├── values-pa-rPK │ │ │ │ └── strings.xml │ │ │ ├── values-sw240dp │ │ │ │ └── dimens.xml │ │ │ ├── values-lv │ │ │ │ └── strings.xml │ │ │ └── raw │ │ │ │ └── t9languages.json │ │ └── kotlin │ │ │ └── com │ │ │ └── goodwy │ │ │ └── dialer │ │ │ ├── models │ │ │ ├── StateWrapper.kt │ │ │ ├── CallerNote.kt │ │ │ ├── SIMAccount.kt │ │ │ ├── Events.kt │ │ │ ├── CallContact.kt │ │ │ ├── PhoneAccountHandleModel.kt │ │ │ ├── CallLogItem.kt │ │ │ ├── SpeedDial.kt │ │ │ ├── TimerState.kt │ │ │ ├── TimerEvent.kt │ │ │ ├── AudioRoute.kt │ │ │ ├── Timer.kt │ │ │ └── RecentCall.kt │ │ │ ├── interfaces │ │ │ ├── RemoveSpeedDialListener.kt │ │ │ ├── RefreshItemsListener.kt │ │ │ └── TimerDao.kt │ │ │ ├── helpers │ │ │ ├── CameraTorchListener.kt │ │ │ ├── UriUtils.kt │ │ │ ├── CallerNotesHelper.kt │ │ │ ├── TimerHelper.kt │ │ │ ├── Converters.kt │ │ │ └── CallContactAvatarHelper.kt │ │ │ ├── extensions │ │ │ ├── View.kt │ │ │ ├── Long.kt │ │ │ ├── RecyclerView.kt │ │ │ ├── FastScrollerView.kt │ │ │ ├── EditText.kt │ │ │ ├── SharedPreferences.kt │ │ │ ├── String.kt │ │ │ └── Call.kt │ │ │ ├── activities │ │ │ ├── SplashActivity.kt │ │ │ ├── SimpleActivity.kt │ │ │ ├── ConferenceActivity.kt │ │ │ └── NotificationActivity.kt │ │ │ ├── dialogs │ │ │ ├── ExportCallHistoryDialog.kt │ │ │ ├── ShowGroupedCallsDialog.kt │ │ │ ├── AddSpeedDialDialog.kt │ │ │ ├── ChooseSocialDialog.kt │ │ │ └── ManageVisibleTabsDialog.kt │ │ │ ├── receivers │ │ │ └── TimerReceiver.kt │ │ │ └── adapters │ │ │ └── ViewPagerAdapter.kt │ ├── debug │ │ └── res │ │ │ └── values │ │ │ └── strings.xml │ └── gplay │ │ └── AndroidManifest.xml └── proguard-rules.pro ├── fastlane └── metadata │ └── android │ └── en-US │ ├── title.txt │ ├── images │ ├── icon.png │ └── phoneScreenshots │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ ├── 6.png │ │ ├── 7.png │ │ └── 8.png │ ├── short_description.txt │ └── full_description.txt ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitignore ├── .editorconfig ├── settings.gradle.kts ├── README.md └── gradle.properties /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /foss 3 | /gplay 4 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/title.txt: -------------------------------------------------------------------------------- 1 | Right Dialer -------------------------------------------------------------------------------- /app/src/main/res/resources.properties: -------------------------------------------------------------------------------- 1 | unqualifiedResLocale=en-US 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-bn/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-bs/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-cy/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-pa/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/drawable/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/fastlane/metadata/android/en-US/images/icon.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_five.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_five.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_four.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_four.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_nine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_nine.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_one.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_one.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_six.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_six.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_ten.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_ten.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_two.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_two.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_five.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_five.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_four.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_four.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_nine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_nine.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_one.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_one.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_six.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_six.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_ten.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_ten.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_two.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_two.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_one.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_one.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_six.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_six.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_ten.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_ten.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_two.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_two.png -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/models/StateWrapper.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.models 2 | 3 | data class StateWrapper(val state: TimerState) 4 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_eight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_eight.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_eleven.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_eleven.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_seven.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_seven.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_three.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_three.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_eight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_eight.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_eleven.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_eleven.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_seven.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_seven.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_three.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_three.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_eight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_eight.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_eleven.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_eleven.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_five.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_five.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_four.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_four.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_nine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_nine.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_seven.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_seven.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_three.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_three.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_eight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_eight.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_five.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_five.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_four.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_four.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_nine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_nine.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_one.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_one.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_seven.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_seven.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_six.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_six.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_ten.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_ten.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_three.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_three.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_two.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_two.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_five.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_five.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_four.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_four.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_nine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_nine.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_one.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_one.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_six.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_six.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_ten.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_ten.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_two.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_two.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_eleven.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_eleven.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_eight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_eight.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_eleven.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_eleven.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_seven.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_seven.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_three.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_three.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /app/src/main/res/values-az/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Zəng paneli 4 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_six_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_six_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_ten_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_ten_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_two_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_two_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_two_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_two_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_two_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_two_monochrome.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_six_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_six_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_ten_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_ten_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_two_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_two_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_two_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_two_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_two_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_two_monochrome.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_eight_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_eight_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_eleven_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_eleven_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_five_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_five_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_four_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_four_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_nine_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_nine_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_seven_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_seven_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_three_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_three_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_eight_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_eight_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_eleven_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_eleven_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_five_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_five_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_four_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_four_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_nine_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_nine_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_seven_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_seven_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_three_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_three_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_eight_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_eight_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_five_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_five_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_four_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_four_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_nine_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_nine_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_seven_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_seven_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_six_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_six_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_ten_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_ten_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_three_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_three_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_two_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_two_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_two_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_two_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_two_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_two_monochrome.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_five_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_five_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_four_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_four_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_nine_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_nine_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_six_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_six_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_ten_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_ten_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_two_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_two_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_two_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_two_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_two_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_two_monochrome.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_six_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_six_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_ten_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_ten_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_two_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_two_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_two_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_two_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_two_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_two_monochrome.png -------------------------------------------------------------------------------- /app/src/main/res/values-mk/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Телефон 4 | 5 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/7.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/8.png -------------------------------------------------------------------------------- /app/src/debug/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Phone_debug 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_eleven_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_eleven_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_eight_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_eight_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_eleven_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_eleven_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_seven_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_seven_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_three_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_three_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_eight_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_eight_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_five_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_five_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_four_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_four_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_nine_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_nine_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_seven_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_seven_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_three_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_three_background.png -------------------------------------------------------------------------------- /app/src/main/res/values-night/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | @color/white 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_eleven_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Goodwy/Dialer/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_eleven_background.png -------------------------------------------------------------------------------- /app/src/main/res/values/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 2 3 | 65536 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/values-sw720dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 228dp 5 | 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | *.aab 3 | .gradle 4 | /local.properties 5 | /.idea/ 6 | .DS_Store 7 | /build 8 | /captures 9 | keystore.jks 10 | keystore.properties 11 | fastlane/report.xml 12 | .kotlin/ 13 | -------------------------------------------------------------------------------- /app/src/main/res/values/bools.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | false 4 | true 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/interfaces/RemoveSpeedDialListener.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.interfaces 2 | 3 | interface RemoveSpeedDialListener { 4 | fun removeSpeedDial(ids: ArrayList) 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/models/CallerNote.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.models 2 | 3 | data class CallerNote( 4 | var id: String, 5 | var note: String, 6 | val creationDate: Long 7 | ) 8 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/helpers/CameraTorchListener.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.helpers 2 | 3 | interface CameraTorchListener { 4 | fun onTorchEnabled(isEnabled:Boolean) 5 | 6 | fun onTorchUnavailable() 7 | } 8 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/interfaces/RefreshItemsListener.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.interfaces 2 | 3 | interface RefreshItemsListener { 4 | fun refreshItems(invalidate: Boolean = false, needUpdate: Boolean = false, callback: (() -> Unit)? = null) 5 | } 6 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/short_description.txt: -------------------------------------------------------------------------------- 1 | The Dialer app is a built-in phone application, which manages your call history and contacts. It provides quick access to making calls and sending text messages through the application interface, including popular messengers. -------------------------------------------------------------------------------- /app/src/gplay/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values-land/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 63dp 5 | 6 | 7 | 328dp 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/values-sw600dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22dp 5 | 6 | 7 | 168dp 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/call_draggable_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tab_indicator.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStorePath=wrapper/dists 7 | zipStoreBase=GRADLE_USER_HOME 8 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/models/SIMAccount.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.models 2 | 3 | import android.telecom.PhoneAccountHandle 4 | 5 | data class SIMAccount( 6 | val id: Int, 7 | val handle: PhoneAccountHandle, 8 | val label: String, 9 | val phoneNumber: String, 10 | val color: Int, 11 | ) 12 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/models/Events.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.models 2 | 3 | sealed class Events { 4 | data object RefreshCallLog : Events() 5 | 6 | class StateChanged(val isEnabled: Boolean) 7 | 8 | class CameraUnavailable 9 | 10 | class StopStroboscope 11 | 12 | class StopSOS 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_choose_social.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/extensions/View.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.extensions 2 | 3 | import android.graphics.Rect 4 | import android.view.View 5 | 6 | val View.boundingBox 7 | get() = Rect().also { getGlobalVisibleRect(it) } 8 | 9 | fun View.setWidth(size: Int) { 10 | val lp = layoutParams 11 | lp.width = size 12 | layoutParams = lp 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_one.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_minus_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_five.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_four.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_nine.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_six.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_ten.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_eight.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_eleven.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_seven.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_three.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_two.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_hashtag.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_dialpad_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/pulsing_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sim_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/models/CallContact.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.models 2 | 3 | // a simpler Contact model containing just info needed at the call screen 4 | data class CallContact( 5 | var name: String, 6 | var photoUri: String, 7 | var number: String, 8 | var numberLabel: String, 9 | var description: String, 10 | var isABusinessCall: Boolean = false, 11 | var isVoiceMail: Boolean = false 12 | ) 13 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_call_history_item_options.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #33FFFFFF 4 | #FF67CE67 5 | #FFEB5545 6 | #FF5E5CE6 7 | #FF454545 8 | @color/dark_grey 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_transparent.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_contacts.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_favorites.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/call_draggable_background_stroke.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ripple_all_corners_12dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ripple_all_corners_8dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/activities/SplashActivity.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.activities 2 | 3 | import android.annotation.SuppressLint 4 | import android.content.Intent 5 | import com.goodwy.commons.activities.BaseSplashActivity 6 | 7 | @SuppressLint("CustomSplashScreen") 8 | class SplashActivity : BaseSplashActivity() { 9 | override fun initActivity() { 10 | startActivity(Intent(this, MainActivity::class.java)) 11 | finish() 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/models/PhoneAccountHandleModel.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.models 2 | 3 | import android.content.ComponentName 4 | import android.telecom.PhoneAccountHandle 5 | 6 | data class PhoneAccountHandleModel( 7 | val packageName: String, 8 | val className: String, 9 | val id: String 10 | ) { 11 | fun toPhoneAccountHandle(): PhoneAccountHandle { 12 | return PhoneAccountHandle( 13 | ComponentName(packageName, className), id 14 | ) 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_backspace_x.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_theme_black.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ripple_left_corners_8dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig 2 | # http://EditorConfig.org 3 | 4 | # top-most EditorConfig file 5 | root = true 6 | 7 | # LF end-of-line, insert an empty new line and UTF-8 8 | [*] 9 | end_of_line = lf 10 | insert_final_newline = true 11 | charset = utf-8 12 | indent_style = space 13 | indent_size = 4 14 | continuation_indent_size = 4 15 | max_line_length = 160 16 | 17 | [*.xml] 18 | continuation_indent_size = 4 19 | 20 | [*.kt] 21 | ij_kotlin_name_count_to_use_star_import = 5 22 | ij_kotlin_name_count_to_use_star_import_for_members = 5 -------------------------------------------------------------------------------- /app/src/main/res/drawable/ripple_right_corners_8dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/extensions/Long.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.extensions 2 | 3 | import com.goodwy.commons.extensions.getFormattedDuration 4 | import com.goodwy.commons.extensions.toDayCodeGregorian 5 | import kotlin.math.roundToInt 6 | 7 | fun Long.getDayCode(): String { 8 | return toDayCodeGregorian("yyyy-MM-dd") // format helps with sorting in call log 9 | } 10 | fun Long.getFormattedDuration(forceShowHours: Boolean = false): String { 11 | return this.div(1000F).roundToInt().getFormattedDuration(forceShowHours) 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/extensions/RecyclerView.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.extensions 2 | 3 | import androidx.recyclerview.widget.RecyclerView 4 | 5 | fun RecyclerView.runAfterAnimations(callback: () -> Unit) { 6 | if (isComputingLayout) { 7 | post { runAfterAnimations(callback) } 8 | return 9 | } 10 | 11 | val animator = itemAnimator 12 | if (animator == null) { 13 | post(callback) 14 | } else { 15 | animator.isRunning { 16 | post(callback) 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_recents_date.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_dialpad.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | rootProject.name = "Dialer" 2 | pluginManagement { 3 | repositories { 4 | gradlePluginPortal() 5 | google() 6 | mavenCentral() 7 | } 8 | } 9 | dependencyResolutionManagement { 10 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 11 | repositories { 12 | google() 13 | mavenCentral() 14 | maven { setUrl("https://artifactory-external.vkpartner.ru/artifactory/maven") } 15 | maven { setUrl("https://jitpack.io") } 16 | mavenLocal() 17 | } 18 | } 19 | include(":app") 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_dialpad_press.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sim_one.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/layout_simple_recycler_view.xml: -------------------------------------------------------------------------------- 1 | 11 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/models/CallLogItem.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.models 2 | 3 | import java.io.Serializable 4 | import com.goodwy.commons.helpers.DAY_SECONDS 5 | 6 | @kotlinx.serialization.Serializable 7 | sealed class CallLogItem : Serializable { 8 | data class Date( 9 | val timestamp: Long, 10 | val dayCode: String, 11 | ) : CallLogItem() 12 | 13 | fun getItemId(): Int { 14 | return when (this) { 15 | is Date -> -(timestamp / (DAY_SECONDS * 1000L)).toInt() 16 | is RecentCall -> id 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_phone_down_red_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_phone_down_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_filter_contact_sources.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Right Dialer 2 | 3 | Logo 4 | The Dialer app is a built-in phone application on Android devices, which manages your call history and contacts. 5 | It provides quick access to making calls and sending text messages through the application interface, 6 | including popular messengers (Whatsapp, Telegram, Signal, Viber, and Threema).

7 | 8 | [Google Play](https://play.google.com/store/apps/details?id=com.goodwy.dialer)

9 | 10 | Based on [Simple Dialer](https://github.com/SimpleMobileTools/Simple-Dialer). 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_asterisk.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/pulsing_background_ripple.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 9 | 10 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_phone_green_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shortcut_dialpad.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/values-sw340dp-notlong/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 0.05 5 | 0.48 6 | 0.90 7 | 400dp 8 | 9 | 10 | 0dp 11 | 8dp 12 | 380dp 13 | 480dp 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_call_merge_vector.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_background_11dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_rounded_8dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sim_two.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/models/SpeedDial.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.models 2 | 3 | import android.content.Context 4 | import com.goodwy.commons.extensions.getPhoneNumberTypeText 5 | 6 | data class SpeedDial( 7 | val id: Int, 8 | var number: String, 9 | var displayName: String, 10 | var type: Int? = null, 11 | var label: String? = null 12 | ) { 13 | fun isValid() = number.trim().isNotEmpty() 14 | 15 | fun getName(context: Context) = if (type != null && label != null) { 16 | "$displayName - ${context.getPhoneNumberTypeText(type!!, label!!)}" 17 | } else { 18 | displayName 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_person_rounded_scaled.xml: -------------------------------------------------------------------------------- 1 | 3 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_pause_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_call_end.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_theme.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values-pa-rPK/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | سیٹنگاں وچ ایہہ اَیپ مول فون چاہدی 4 | تہاڈے فون‌بوک پہنچ نہیں سکے 5 | کوئی پچھلیا کالاں نہیں لبھیاں 6 | کال دی تریخ ہٹاؤ 7 | فون کیبورڈ 8 | ایسٹرسک 9 | ہیش‌ٹیگ 10 | کال دا نمبر 11 | فون دائک 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_phone_one_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_voicemail.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/models/TimerState.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.models 2 | 3 | import androidx.annotation.Keep 4 | 5 | @Keep 6 | @kotlinx.serialization.Serializable 7 | sealed class TimerState { 8 | @Keep 9 | @kotlinx.serialization.Serializable 10 | object Idle : TimerState() 11 | 12 | @Keep 13 | @kotlinx.serialization.Serializable 14 | data class Running(val duration: Long, val tick: Long) : TimerState() 15 | 16 | @Keep 17 | @kotlinx.serialization.Serializable 18 | data class Paused(val duration: Long, val tick: Long) : TimerState() 19 | 20 | @Keep 21 | @kotlinx.serialization.Serializable 22 | object Finished : TimerState() 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bold_italic.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/full_description.txt: -------------------------------------------------------------------------------- 1 | Introducing the all-new Right Dialer app! Take your calling experience to the next level with our highly customizable interface. 2 | 3 | Personalize your device to match your unique style. With a wide range of themes and color options, you can truly make your calling experience your own. 4 | 5 | Key features: 6 | 7 | - Free and No annoying ads or interruptions 8 | - Enhanced security for your privacy 9 | - Intuitive and user-friendly interface 10 | - Integration with popular messengers 11 | - Call blocking and speed dialing 12 | - Dual sim card support 13 | 14 | Download Right Dialer now and customize your calling experience like never before! -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_messages.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_backspace.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/placeholder_voicemail.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_call_split_vector.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_speed_dial.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/extensions/FastScrollerView.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.extensions 2 | 3 | import androidx.recyclerview.widget.RecyclerView 4 | import com.reddit.indicatorfastscroll.FastScrollItemIndicator 5 | import com.reddit.indicatorfastscroll.FastScrollerView 6 | import com.goodwy.commons.models.contacts.Contact 7 | 8 | fun FastScrollerView.setupWithContacts( 9 | recyclerView: RecyclerView, 10 | contacts: List, 11 | ) = setupWithRecyclerView(recyclerView, { position -> 12 | val initialLetter = try { 13 | contacts[position].getFirstLetter() 14 | } catch (_: IndexOutOfBoundsException) { 15 | "" 16 | } 17 | 18 | FastScrollItemIndicator.Text(initialLetter) 19 | }) 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_rounded.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 9 | 10 | 11 | 12 | 13 | 17 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/models/TimerEvent.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.models 2 | 3 | import com.goodwy.dialer.helpers.INVALID_TIMER_ID 4 | 5 | sealed class TimerEvent(open val timerId: Int) { 6 | data class Delete(override val timerId: Int) : TimerEvent(timerId) 7 | data class Reset(override val timerId: Int) : TimerEvent(timerId) 8 | data class Start(override val timerId: Int, val duration: Long) : TimerEvent(timerId) 9 | data class Pause(override val timerId: Int, val duration: Long) : TimerEvent(timerId) 10 | data class Finish(override val timerId: Int, val duration: Long) : TimerEvent(timerId) 11 | data class Restart(override val timerId: Int) : TimerEvent(timerId) 12 | object Refresh : TimerEvent(INVALID_TIMER_ID) 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_slider.xml: -------------------------------------------------------------------------------- 1 | 9 | 11 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_add_call_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bold.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clock_filled_scaled.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/tab_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 14 | 15 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_star_vector_scaled.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_call_swap_vector.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_hd.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_call_missed_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/interfaces/TimerDao.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.interfaces 2 | 3 | import androidx.room.* 4 | import com.goodwy.dialer.models.Timer 5 | 6 | @Dao 7 | interface TimerDao { 8 | 9 | @Query("SELECT * FROM timers ORDER BY createdAt ASC") 10 | fun getTimers(): List 11 | 12 | @Query("SELECT * FROM timers WHERE id=:id") 13 | fun getTimer(id: Int): Timer? 14 | 15 | @Query("SELECT * FROM timers WHERE seconds=:seconds AND label=:label") 16 | fun findTimers(seconds: Int, label: String): List 17 | 18 | @Insert(onConflict = OnConflictStrategy.REPLACE) 19 | fun insertOrUpdateTimer(timer: Timer): Long 20 | 21 | @Query("DELETE FROM timers WHERE id=:id") 22 | fun deleteTimer(id: Int) 23 | 24 | @Delete 25 | fun deleteTimers(list: List) 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_show_grouped_calls.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_volume_down_vector.xml: -------------------------------------------------------------------------------- 1 | 3 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_telegram_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_italic.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/values-sw240dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 94dp 4 | 72dp 5 | 72dp 6 | 7 | 8 | 30dp 9 | 10 | 11 | 62dp 12 | 0.05 13 | 0.48 14 | 0.95 15 | 170dp 16 | 300dp 17 | 18 | 19 | 0dp 20 | 8dp 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_pause_crossed_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_microphone_off_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_call_made_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_restore_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_call_received_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/activities/SimpleActivity.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.activities 2 | 3 | import com.goodwy.commons.activities.BaseSimpleActivity 4 | import com.goodwy.dialer.R 5 | 6 | open class SimpleActivity : BaseSimpleActivity() { 7 | override fun getAppIconIDs() = arrayListOf( 8 | R.mipmap.ic_launcher, 9 | R.mipmap.ic_launcher_one, 10 | R.mipmap.ic_launcher_two, 11 | R.mipmap.ic_launcher_three, 12 | R.mipmap.ic_launcher_four, 13 | R.mipmap.ic_launcher_five, 14 | R.mipmap.ic_launcher_six, 15 | R.mipmap.ic_launcher_seven, 16 | R.mipmap.ic_launcher_eight, 17 | R.mipmap.ic_launcher_nine, 18 | R.mipmap.ic_launcher_ten, 19 | R.mipmap.ic_launcher_eleven 20 | ) 21 | 22 | override fun getAppLauncherName() = getString(R.string.app_launcher_name) 23 | 24 | override fun getRepositoryName() = "Dialer" 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_call_accept.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_run.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_show_block.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_slider_outline.xml: -------------------------------------------------------------------------------- 1 | 9 | 11 | 15 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_filter_contact_source.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_change.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_restart.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/extensions/EditText.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.extensions 2 | 3 | import android.view.KeyEvent 4 | import android.widget.EditText 5 | 6 | fun EditText.addCharacter(char: Char) { 7 | dispatchKeyEvent(getKeyEvent(getCharKeyCode(char))) 8 | } 9 | 10 | fun EditText.getKeyEvent(keyCode: Int) = KeyEvent(0, 0, KeyEvent.ACTION_DOWN, keyCode, 0) 11 | 12 | private fun getCharKeyCode(char: Char) = when (char) { 13 | '0' -> KeyEvent.KEYCODE_0 14 | '1' -> KeyEvent.KEYCODE_1 15 | '2' -> KeyEvent.KEYCODE_2 16 | '3' -> KeyEvent.KEYCODE_3 17 | '4' -> KeyEvent.KEYCODE_4 18 | '5' -> KeyEvent.KEYCODE_5 19 | '6' -> KeyEvent.KEYCODE_6 20 | '7' -> KeyEvent.KEYCODE_7 21 | '8' -> KeyEvent.KEYCODE_8 22 | '9' -> KeyEvent.KEYCODE_9 23 | '*' -> KeyEvent.KEYCODE_STAR 24 | ',' -> KeyEvent.KEYCODE_NUMPAD_COMMA 25 | '+' -> KeyEvent.KEYCODE_PLUS 26 | ';' -> KeyEvent.KEYCODE_SEMICOLON 27 | else -> KeyEvent.KEYCODE_POUND 28 | } 29 | 30 | fun EditText.disableKeyboard() { 31 | showSoftInputOnFocus = false 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_person_rounded_outline.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 14 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_bluetooth_audio_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/models/AudioRoute.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.models 2 | 3 | import android.telecom.CallAudioState 4 | import androidx.annotation.DrawableRes 5 | import androidx.annotation.StringRes 6 | import com.goodwy.dialer.R 7 | 8 | enum class AudioRoute(val route: Int, @StringRes val stringRes: Int, @DrawableRes val iconRes: Int) { 9 | SPEAKER(CallAudioState.ROUTE_SPEAKER, R.string.audio_route_speaker, R.drawable.ic_volume_up_vector), //Speaker 10 | EARPIECE(CallAudioState.ROUTE_EARPIECE, R.string.audio_route_earpiece_g, R.drawable.ic_phone_device), //Phone 11 | BLUETOOTH(CallAudioState.ROUTE_BLUETOOTH, R.string.audio_route_bluetooth, R.drawable.ic_bluetooth_audio_vector), 12 | WIRED_HEADSET(CallAudioState.ROUTE_WIRED_HEADSET, R.string.audio_route_wired_headset, R.drawable.ic_headset_wired), //Wired headphones 13 | WIRED_OR_EARPIECE(CallAudioState.ROUTE_WIRED_OR_EARPIECE, R.string.audio_route_wired_or_earpiece, R.drawable.ic_volume_down_vector); //Phone or Wired headphones 14 | 15 | companion object { 16 | fun fromRoute(route: Int?) = entries.firstOrNull { it.route == route } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/models/Timer.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.models 2 | 3 | import androidx.annotation.Keep 4 | import androidx.room.Entity 5 | import androidx.room.PrimaryKey 6 | 7 | @Entity(tableName = "timers") 8 | @Keep 9 | @kotlinx.serialization.Serializable 10 | data class Timer( 11 | @PrimaryKey(autoGenerate = true) var id: Int?, 12 | var seconds: Int, 13 | val state: TimerState, 14 | var vibrate: Boolean, 15 | var soundUri: String, 16 | var soundTitle: String, 17 | var title: String, 18 | var label: String, 19 | var description: String, 20 | var createdAt: Long, 21 | var channelId: String? = null, 22 | var oneShot: Boolean = false 23 | ) 24 | 25 | @Keep 26 | data class ObfuscatedTimer( 27 | var a: Int?, 28 | var b: Int, 29 | // We ignore timer state and will just use idle 30 | val c: Map, 31 | var d: Boolean, 32 | var e: String, 33 | var f: String, 34 | var g: String, 35 | var h: String, 36 | var i: String, 37 | var j: Long, 38 | var k: String? = null, 39 | var l: Boolean = false 40 | ) { 41 | fun toTimer() = Timer(a, b, TimerState.Idle, d, e, f, g, h, i, j, k, l) 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/extensions/SharedPreferences.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.extensions 2 | 3 | import android.content.SharedPreferences 4 | import android.telecom.PhoneAccountHandle 5 | import com.google.gson.Gson 6 | import com.google.gson.JsonSyntaxException 7 | import com.goodwy.dialer.models.PhoneAccountHandleModel 8 | 9 | fun SharedPreferences.Editor.putPhoneAccountHandle( 10 | key: String, 11 | parcelable: PhoneAccountHandle 12 | ): SharedPreferences.Editor { 13 | val componentName = parcelable.componentName 14 | val myPhoneAccountHandleModel = PhoneAccountHandleModel( 15 | componentName.packageName, componentName.className, parcelable.id 16 | ) 17 | val json = Gson().toJson(myPhoneAccountHandleModel) 18 | return putString(key, json) 19 | } 20 | 21 | inline fun SharedPreferences.getPhoneAccountHandleModel( 22 | key: String, 23 | default: T 24 | ): T { 25 | val json = getString(key, null) 26 | return try { 27 | if (json != null) { 28 | Gson().fromJson(json, T::class.java) 29 | } else { 30 | default 31 | } 32 | } catch (_: JsonSyntaxException) { 33 | default 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_note.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 14 | 15 | 19 | 20 | 24 | 25 | 29 | 30 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_volume_up_vector.xml: -------------------------------------------------------------------------------- 1 | 3 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_threema_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_contact_photo.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/extensions/String.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.extensions 2 | 3 | import com.google.i18n.phonenumbers.NumberParseException 4 | import com.google.i18n.phonenumbers.PhoneNumberUtil 5 | import com.google.i18n.phonenumbers.geocoding.PhoneNumberOfflineGeocoder 6 | import java.util.* 7 | 8 | fun String.getCountryByNumber(): String { 9 | return try { 10 | val locale = Locale.getDefault() 11 | val countryCode = locale.country 12 | val phoneUtil = PhoneNumberUtil.getInstance() 13 | val geocoder = PhoneNumberOfflineGeocoder.getInstance() 14 | val numberParse = phoneUtil.parse(this, countryCode) 15 | geocoder.getDescriptionForNumber(numberParse, Locale.getDefault()) 16 | } catch (_: NumberParseException) { 17 | "" 18 | } 19 | } 20 | 21 | // remove the pluses, spaces and hyphens. 22 | fun String.numberForNotes() = replace("\\s".toRegex(), "") 23 | .replace("\\+".toRegex(), "") 24 | .replace("\\(".toRegex(), "") 25 | .replace("\\)".toRegex(), "") 26 | .replace("-".toRegex(), "") 27 | 28 | fun String.removeNumberFormatting() = replace("\\s".toRegex(), "") 29 | .replace("\\(".toRegex(), "") 30 | .replace("\\)".toRegex(), "") 31 | .replace("-".toRegex(), "") 32 | .replace("\\*".toRegex(), "") 33 | .replace("#".toRegex(), "") 34 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx4g 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app's APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Automatically convert third-party libraries to use AndroidX 19 | android.enableJetifier=true 20 | android.nonTransitiveRClass=false 21 | # Kotlin code style for this project: "official" or "obsolete": 22 | kotlin.code.style=official 23 | # Versioning 24 | VERSION_NAME=8.0.4 25 | VERSION_CODE=804 26 | APP_ID=com.goodwy.dialer 27 | -------------------------------------------------------------------------------- /app/src/main/res/values-lv/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Zvana stāvoklis (augsts svarīgums) 4 | Zvana stāvoklis 5 | Tālrunis 6 | Lūgums padarīt šo lietotni par noklusējuma tālruņa lietotni 7 | Lūgums atļaut attēlošanu virs citām lietotnēm, lai nodrošinātu uzticamu darbību 8 | Nevarēja piekļūt kontaktpersonām 9 | Nav atrasts neviens iepriekšējs zvans 10 | Nevarēja piekļūt zvanu vēsturei 11 | Pieprasīt piekļuvi 12 | Vai tiešām izņemt no zvanu vēstures atlasītos vienumus? 13 | Vai tiešām izņemt visu no zvanu vēstures? 14 | Rādīt apkopotus zvanus 15 | Notīrīt zvanu vēsturi 16 | Rādīt informāciju par zvanu 17 | Ciparnīca 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_whatsapp_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_slider_vertical.xml: -------------------------------------------------------------------------------- 1 | 9 | 11 | 14 | 15 | 17 | 20 | 21 | 23 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_call_history.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 12 | 18 | 23 | 28 | 34 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_info.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 13 | 14 | 15 | 18 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_choose_social.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 18 | 19 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Keep `Companion` object fields of serializable classes. 2 | # This avoids serializer lookup through `getDeclaredClasses` as done for named companion objects. 3 | -if @kotlinx.serialization.Serializable class ** 4 | -keepclassmembers class <1> { 5 | static <1>$Companion Companion; 6 | } 7 | 8 | # Keep `serializer()` on companion objects (both default and named) of serializable classes. 9 | -if @kotlinx.serialization.Serializable class ** { 10 | static **$* *; 11 | } 12 | -keepclassmembers class <2>$<3> { 13 | kotlinx.serialization.KSerializer serializer(...); 14 | } 15 | 16 | # Keep `INSTANCE.serializer()` of serializable objects. 17 | -if @kotlinx.serialization.Serializable class ** { 18 | public static ** INSTANCE; 19 | } 20 | -keepclassmembers class <1> { 21 | public static <1> INSTANCE; 22 | kotlinx.serialization.KSerializer serializer(...); 23 | } 24 | 25 | # EventBus 26 | -keepattributes *Annotation* 27 | -keepclassmembers class ** { 28 | @org.greenrobot.eventbus.Subscribe ; 29 | } 30 | -keep enum org.greenrobot.eventbus.ThreadMode { *; } 31 | 32 | #Goodwy 33 | -dontwarn org.bouncycastle.jsse.BCSSLParameters 34 | -dontwarn org.bouncycastle.jsse.BCSSLSocket 35 | -dontwarn org.bouncycastle.jsse.provider.BouncyCastleJsseProvider 36 | -dontwarn org.conscrypt.Conscrypt$Version 37 | -dontwarn org.conscrypt.Conscrypt 38 | -dontwarn org.conscrypt.ConscryptHostnameVerifier 39 | -dontwarn org.openjsse.javax.net.ssl.SSLParameters 40 | -dontwarn org.openjsse.javax.net.ssl.SSLSocket 41 | -dontwarn org.openjsse.net.ssl.OpenJSSE 42 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/dialogs/ExportCallHistoryDialog.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.dialogs 2 | 3 | import androidx.appcompat.app.AlertDialog 4 | import com.goodwy.commons.extensions.* 5 | import com.goodwy.dialer.R 6 | import com.goodwy.dialer.activities.SimpleActivity 7 | import com.goodwy.dialer.databinding.DialogExportCallHistoryBinding 8 | 9 | class ExportCallHistoryDialog(val activity: SimpleActivity, callback: (filename: String) -> Unit) { 10 | 11 | init { 12 | val binding = DialogExportCallHistoryBinding.inflate(activity.layoutInflater).apply { 13 | exportCallHistoryFilename.setText("call_history_${getCurrentFormattedDateTime()}") 14 | } 15 | 16 | activity.getAlertDialogBuilder().setPositiveButton(R.string.ok, null).setNegativeButton(R.string.cancel, null).apply { 17 | activity.setupDialogStuff(binding.root, this, R.string.export_call_history) { alertDialog -> 18 | alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { 19 | 20 | val filename = binding.exportCallHistoryFilename.value 21 | when { 22 | filename.isEmpty() -> activity.toast(R.string.empty_name) 23 | filename.isAValidFilename() -> { 24 | callback(filename) 25 | alertDialog.dismiss() 26 | } 27 | 28 | else -> activity.toast(R.string.invalid_name) 29 | } 30 | } 31 | } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_export_call_history.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 13 | 14 | 22 | 23 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /app/src/main/res/raw/t9languages.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "lang": "uk", 4 | "letters": [ 5 | "АБВГҐ", 6 | "ДЕЄЖЗ", 7 | "ИІЇЙКЛ", 8 | "МНОП", 9 | "РСТУ", 10 | "ФХЦЧ", 11 | "ШЩ", 12 | "ЬЮЯ" 13 | ] 14 | }, 15 | { 16 | "lang": "be", 17 | "letters": [ 18 | "АБВГҐ", 19 | "ДЕЁЖЗ", 20 | "ІЙКЛ", 21 | "МНОП", 22 | "РСТУЎ", 23 | "ФХЦЧ", 24 | "ШЫ", 25 | "ЬЭЮЯ" 26 | ] 27 | }, 28 | { 29 | "lang": "ru", 30 | "letters": [ 31 | "АБВГ", 32 | "ДЕЁЖЗ", 33 | "ИЙКЛ", 34 | "МНОП", 35 | "РСТУ", 36 | "ФХЦЧ", 37 | "ШЩЪЫ", 38 | "ЬЭЮЯ" 39 | ] 40 | }, 41 | { 42 | "lang": "el", 43 | "letters": [ 44 | "ΑΒΓ", 45 | "ΔΕΖ", 46 | "ΗΘΙ", 47 | "ΚΛΜ", 48 | "ΝΞΟ", 49 | "ΠΡΣ", 50 | "ΤΥΦ", 51 | "ΧΨΩ" 52 | ] 53 | }, 54 | { 55 | "lang": "ar", 56 | "letters": [ 57 | "ب\u200Aت\u200Aث\u200Aة", 58 | "ا\u200Aأ\u200Aإ\u200Aآ\u200Aء\u200Aؤ\u200Aئ", 59 | "س\u200Aش\u200Aص\u200Aض", 60 | "د\u200Aذ\u200Aر\u200Aز", 61 | "ج\u200Aح\u200Aخ", 62 | "ن\u200Aه\u200Aو\u200Aي\u200Aى", 63 | "ف\u200Aق\u200Aك\u200Aل\u200Aم", 64 | "ط\u200Aظ\u200Aع\u200Aغ" 65 | ] 66 | } 67 | ] 68 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/extensions/Call.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.extensions 2 | 3 | import android.telecom.Call 4 | import android.telecom.Call.STATE_CONNECTING 5 | import android.telecom.Call.STATE_DIALING 6 | import android.telecom.Call.STATE_SELECT_PHONE_ACCOUNT 7 | import com.goodwy.commons.helpers.isQPlus 8 | import com.goodwy.commons.helpers.isSPlus 9 | 10 | private val OUTGOING_CALL_STATES = arrayOf(STATE_CONNECTING, STATE_DIALING, STATE_SELECT_PHONE_ACCOUNT) 11 | 12 | @Suppress("DEPRECATION") 13 | fun Call?.getStateCompat(): Int { 14 | return when { 15 | this == null -> Call.STATE_DISCONNECTED 16 | isSPlus() -> details.state 17 | else -> state 18 | } 19 | } 20 | 21 | fun Call?.getCallDuration(): Int { 22 | return if (this != null) { 23 | val connectTimeMillis = details.connectTimeMillis 24 | if (connectTimeMillis == 0L) { 25 | return 0 26 | } 27 | ((System.currentTimeMillis() - connectTimeMillis) / 1000).toInt() 28 | } else { 29 | 0 30 | } 31 | } 32 | 33 | fun Call.isOutgoing(): Boolean { 34 | return if (isQPlus()) { 35 | details.callDirection == Call.Details.DIRECTION_OUTGOING 36 | } else { 37 | OUTGOING_CALL_STATES.contains(getStateCompat()) 38 | } 39 | } 40 | 41 | fun Call.hasCapability(capability: Int): Boolean = (details.callCapabilities and capability) != 0 42 | 43 | fun Call?.isConference(): Boolean = this?.details?.hasProperty(Call.Details.PROPERTY_CONFERENCE) == true 44 | 45 | fun Call?.isHD(): Boolean = this?.details?.hasProperty(Call.Details.PROPERTY_HIGH_DEF_AUDIO) == true 46 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_add_speed_dial.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 21 | 23 | 24 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/dialogs/ShowGroupedCallsDialog.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.dialogs 2 | 3 | import androidx.appcompat.app.AlertDialog 4 | import com.goodwy.commons.activities.BaseSimpleActivity 5 | import com.goodwy.commons.extensions.getAlertDialogBuilder 6 | import com.goodwy.commons.extensions.setupDialogStuff 7 | import com.goodwy.commons.extensions.viewBinding 8 | import com.goodwy.dialer.activities.SimpleActivity 9 | import com.goodwy.dialer.adapters.RecentCallsAdapter 10 | import com.goodwy.dialer.databinding.DialogShowGroupedCallsBinding 11 | import com.goodwy.dialer.models.RecentCall 12 | 13 | class ShowGroupedCallsDialog(val activity: BaseSimpleActivity, recentCalls: List) { 14 | private var dialog: AlertDialog? = null 15 | private val binding by activity.viewBinding(DialogShowGroupedCallsBinding::inflate) 16 | 17 | init { 18 | activity.runOnUiThread { 19 | RecentCallsAdapter( 20 | activity = activity as SimpleActivity, 21 | recyclerView = binding.selectGroupedCallsList, 22 | refreshItemsListener = null, 23 | showOverflowMenu = false, 24 | itemClick = {} 25 | ).apply { 26 | binding.selectGroupedCallsList.adapter = this 27 | updateItems(recentCalls) 28 | } 29 | } 30 | 31 | activity.getAlertDialogBuilder() 32 | .apply { 33 | activity.setupDialogStuff(binding.root, this) { alertDialog -> 34 | dialog = alertDialog 35 | } 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/helpers/UriUtils.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.helpers 2 | 3 | import android.net.Uri 4 | import android.provider.ContactsContract 5 | import androidx.core.net.toUri 6 | 7 | /** 8 | * Utility methods for dealing with URIs. 9 | */ 10 | object UriUtils { 11 | private const val LOOKUP_URI_ENCODED = "encoded" 12 | 13 | /** 14 | * Checks whether two URI are equal, taking care of the case where either is null. 15 | */ 16 | fun areEqual(uri1: Uri?, uri2: Uri?): Boolean { 17 | if (uri1 == null && uri2 == null) { 18 | return true 19 | } 20 | if (uri1 == null || uri2 == null) { 21 | return false 22 | } 23 | return uri1 == uri2 24 | } 25 | 26 | /** 27 | * Parses a string into a URI and returns null if the given string is null. 28 | */ 29 | fun parseUriOrNull(uriString: String?): Uri? { 30 | if (uriString == null) { 31 | return null 32 | } 33 | return uriString.toUri() 34 | } 35 | 36 | /** 37 | * Converts a URI into a string, returns null if the given URI is null. 38 | */ 39 | fun uriToString(uri: Uri?): String? { 40 | return uri?.toString() 41 | } 42 | 43 | /** 44 | * @return `uri` as-is if the authority is of contacts provider. Otherwise or `uri` is 45 | * null, return null otherwise 46 | */ 47 | fun nullForNonContactsUri(uri: Uri?): Uri? { 48 | if (uri == null) { 49 | return null 50 | } 51 | return if (ContactsContract.AUTHORITY == uri.authority) uri else null 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_wallpaper.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/receivers/TimerReceiver.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.receivers 2 | 3 | import android.content.BroadcastReceiver 4 | import android.content.Context 5 | import android.content.Intent 6 | import com.goodwy.dialer.extensions.hideTimerNotification 7 | import com.goodwy.dialer.extensions.timerHelper 8 | import com.goodwy.dialer.helpers.INVALID_TIMER_ID 9 | import com.goodwy.dialer.helpers.TIMER_HIDE 10 | import com.goodwy.dialer.helpers.TIMER_ID 11 | import com.goodwy.dialer.helpers.TIMER_RESTART 12 | import com.goodwy.dialer.models.TimerEvent 13 | import org.greenrobot.eventbus.EventBus 14 | import java.util.concurrent.TimeUnit 15 | 16 | class TimerReceiver : BroadcastReceiver() { 17 | override fun onReceive(context: Context, intent: Intent) { 18 | val timerId = intent.getIntExtra(TIMER_ID, INVALID_TIMER_ID) 19 | 20 | when (intent.action) { 21 | TIMER_HIDE -> { 22 | context.hideTimerNotification(timerId) 23 | EventBus.getDefault().post(TimerEvent.Reset(timerId)) 24 | } 25 | TIMER_RESTART -> { 26 | EventBus.getDefault().post(TimerEvent.Restart(timerId)) 27 | } 28 | else -> { // Start a new 29 | context.hideTimerNotification(timerId) 30 | EventBus.getDefault().post(TimerEvent.Reset(timerId)) 31 | context.timerHelper.getTimer(timerId) { timer -> 32 | EventBus.getDefault().post(TimerEvent.Start(timer.id!!, TimeUnit.SECONDS.toMillis(timer.seconds.toLong()))) 33 | } 34 | } 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_change_text.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 15 | 16 | 24 | 25 | 26 | 27 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_phone_two_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_dialpad.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 12 | 16 | 20 | 24 | 29 | 33 | 37 | 43 | 44 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/activities/ConferenceActivity.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.activities 2 | 3 | import android.content.Intent 4 | import android.os.Bundle 5 | import com.goodwy.commons.extensions.viewBinding 6 | import com.goodwy.commons.helpers.NavigationIcon 7 | import com.goodwy.dialer.adapters.ConferenceCallsAdapter 8 | import com.goodwy.dialer.databinding.ActivityConferenceBinding 9 | import com.goodwy.dialer.helpers.CallManager 10 | import com.goodwy.dialer.helpers.NoCall 11 | import com.goodwy.dialer.helpers.SHOW_RECENT_CALLS_ON_DIALPAD 12 | 13 | class ConferenceActivity : SimpleActivity() { 14 | private val binding by viewBinding(ActivityConferenceBinding::inflate) 15 | 16 | override fun onCreate(savedInstanceState: Bundle?) { 17 | super.onCreate(savedInstanceState) 18 | setContentView(binding.root) 19 | binding.apply { 20 | setupEdgeToEdge(padBottomSystem = listOf(conferenceList)) 21 | setupMaterialScrollListener(conferenceList, conferenceAppbar) 22 | conferenceList.adapter = ConferenceCallsAdapter(this@ConferenceActivity, conferenceList, ArrayList(CallManager.getConferenceCalls())) {} 23 | } 24 | } 25 | 26 | override fun onResume() { 27 | super.onResume() 28 | setupTopAppBar(binding.conferenceAppbar, NavigationIcon.Arrow) 29 | } 30 | 31 | override fun onBackPressedCompat(): Boolean { 32 | return when (CallManager.getPhoneState()) { 33 | NoCall -> { 34 | finishAndRemoveTask() 35 | true 36 | } 37 | else -> { 38 | startActivity(Intent(this, CallActivity::class.java)) 39 | true 40 | } 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/helpers/CallerNotesHelper.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.helpers 2 | 3 | import android.content.Context 4 | import com.goodwy.dialer.extensions.config 5 | import com.goodwy.dialer.extensions.numberForNotes 6 | import com.goodwy.dialer.models.CallerNote 7 | import com.google.gson.Gson 8 | import java.util.Calendar 9 | import java.util.Locale 10 | 11 | class CallerNotesHelper(val context: Context) { 12 | 13 | fun addCallerNotes(number: String, note: String, callerNote: CallerNote?, callback: () -> Unit = {}) { 14 | val date = Calendar.getInstance(Locale.ENGLISH).timeInMillis 15 | val mCallerNotes = context.config.parseCallerNotes() 16 | mCallerNotes.remove(callerNote) 17 | mCallerNotes.add(CallerNote(number.numberForNotes(), note, date)) 18 | context.config.callerNotes = Gson().toJson(mCallerNotes) 19 | callback.invoke() 20 | } 21 | 22 | fun deleteCallerNotes(callerNote: CallerNote?, callback: () -> Unit = {}) { 23 | val mCallerNotes = context.config.parseCallerNotes() 24 | mCallerNotes.remove(callerNote) 25 | context.config.callerNotes = Gson().toJson(mCallerNotes) 26 | callback.invoke() 27 | } 28 | 29 | fun removeCallerNotes(allRecentsNumber: List) { 30 | val mCallerNotes = context.config.parseCallerNotes() 31 | val newList = mCallerNotes.filter { allRecentsNumber.contains(it.id.numberForNotes()) } 32 | if (mCallerNotes != newList) context.config.callerNotes = Gson().toJson(newList) 33 | } 34 | 35 | fun getCallerNotes(number: String?): CallerNote? { 36 | val mCallerNotes = context.config.parseCallerNotes() 37 | return mCallerNotes.firstOrNull {it.id.numberForNotes() == number?.numberForNotes()} 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_recent_item_options.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 9 | 12 | 15 | 18 | 21 | 24 | 27 | 30 | 33 | 36 | 39 | 42 | 45 | 48 | 49 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/helpers/TimerHelper.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.helpers 2 | 3 | import android.content.Context 4 | import com.goodwy.dialer.extensions.timerDb 5 | import com.goodwy.dialer.models.Timer 6 | import com.goodwy.commons.helpers.ensureBackgroundThread 7 | 8 | class TimerHelper(val context: Context) { 9 | private val timerDao = context.timerDb 10 | 11 | fun getTimers(callback: (timers: List) -> Unit) { 12 | ensureBackgroundThread { 13 | callback.invoke(timerDao.getTimers()) 14 | } 15 | } 16 | 17 | fun getTimer(timerId: Int, callback: (timer: Timer) -> Unit) { 18 | ensureBackgroundThread { 19 | callback.invoke(timerDao.getTimer(timerId)!!) 20 | } 21 | } 22 | 23 | // fun tryGetTimer(timerId: Int, callback: (timer: Timer?) -> Unit) { 24 | // ensureBackgroundThread { 25 | // callback.invoke(timerDao.getTimer(timerId)) 26 | // } 27 | // } 28 | // 29 | // fun findTimers(seconds: Int, label: String, callback: (timers: List) -> Unit) { 30 | // ensureBackgroundThread { 31 | // callback.invoke(timerDao.findTimers(seconds, label)) 32 | // } 33 | // } 34 | 35 | fun insertOrUpdateTimer(timer: Timer, callback: (id: Long) -> Unit = {}) { 36 | ensureBackgroundThread { 37 | val id = timerDao.insertOrUpdateTimer(timer) 38 | callback.invoke(id) 39 | } 40 | } 41 | 42 | fun deleteTimer(id: Int, callback: () -> Unit = {}) { 43 | ensureBackgroundThread { 44 | timerDao.deleteTimer(id) 45 | callback.invoke() 46 | } 47 | } 48 | 49 | // fun deleteTimers(timers: List, callback: () -> Unit = {}) { 50 | // ensureBackgroundThread { 51 | // timerDao.deleteTimers(timers) 52 | // callback.invoke() 53 | // } 54 | // } 55 | } 56 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_conference.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 20 | 21 | 22 | 28 | 29 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/helpers/Converters.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.helpers 2 | 3 | import androidx.room.TypeConverter 4 | import com.goodwy.dialer.extensions.RuntimeTypeAdapterFactory 5 | import com.goodwy.dialer.models.StateWrapper 6 | import com.goodwy.dialer.models.TimerState 7 | import com.google.gson.Gson 8 | import com.google.gson.GsonBuilder 9 | import com.google.gson.TypeAdapterFactory 10 | import com.google.gson.reflect.TypeToken 11 | 12 | class Converters { 13 | private val gson = Gson() 14 | private val stringType = object : TypeToken>() {}.type 15 | 16 | fun jsonToStringList(value: String) = gson.fromJson>(value, stringType) 17 | 18 | fun stringListToJson(list: ArrayList) = gson.toJson(list) 19 | 20 | //timer 21 | val timerStates = valueOf() 22 | .registerSubtype(TimerState.Idle::class.java) 23 | .registerSubtype(TimerState.Running::class.java) 24 | .registerSubtype(TimerState.Paused::class.java) 25 | .registerSubtype(TimerState.Finished::class.java) 26 | 27 | inline fun valueOf(): RuntimeTypeAdapterFactory = RuntimeTypeAdapterFactory.of(T::class.java) 28 | 29 | fun GsonBuilder.registerTypes(vararg types: TypeAdapterFactory) = apply { 30 | types.forEach { registerTypeAdapterFactory(it) } 31 | } 32 | 33 | val gsonTimer: Gson = GsonBuilder().registerTypes(timerStates).create() 34 | 35 | @TypeConverter 36 | fun jsonToTimerState(value: String?): TimerState { 37 | if (value.isNullOrEmpty()) return TimerState.Idle 38 | return try { 39 | gsonTimer.fromJson(value, StateWrapper::class.java).state 40 | } catch (_: Exception) { 41 | TimerState.Idle 42 | } 43 | } 44 | 45 | @TypeConverter 46 | fun timerStateToJson(state: TimerState) = gsonTimer.toJson(StateWrapper(state)) 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/models/RecentCall.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.models 2 | 3 | import android.telephony.PhoneNumberUtils 4 | import com.goodwy.commons.extensions.normalizePhoneNumber 5 | import com.goodwy.dialer.extensions.getDayCode 6 | import com.google.gson.annotations.SerializedName 7 | import java.io.Serializable 8 | 9 | /** 10 | * Used at displaying recent calls. 11 | * For contacts with multiple numbers specify the number and type 12 | */ 13 | @kotlinx.serialization.Serializable 14 | data class RecentCall( 15 | var id: Int, 16 | var phoneNumber: String, 17 | var name: String, 18 | var nickname: String = "", 19 | var company: String = "", 20 | var jobPosition: String = "", 21 | var photoUri: String, 22 | val startTS: Long, 23 | var duration: Int, 24 | var type: Int, 25 | val simID: Int, 26 | val simColor: Int, 27 | var specificNumber: String, 28 | var specificType: String, 29 | val isUnknownNumber: Boolean, 30 | @SerializedName("title") val groupedCalls: MutableList? = null, 31 | var contactID: Int? = null, 32 | var features: Int? = null, 33 | val isVoiceMail: Boolean, 34 | var blockReason: Int? = 0, 35 | ) : CallLogItem(), Serializable { 36 | val dayCode = startTS.getDayCode() 37 | 38 | fun doesContainPhoneNumber(text: String): Boolean { 39 | return if (text.toLongOrNull() != null) { 40 | val normalizedText = text.normalizePhoneNumber() 41 | PhoneNumberUtils.compare(phoneNumber.normalizePhoneNumber(), normalizedText) || 42 | phoneNumber.contains(text) || 43 | phoneNumber.normalizePhoneNumber().contains(normalizedText) || 44 | phoneNumber.contains(normalizedText) 45 | } else { 46 | false 47 | } 48 | } 49 | 50 | fun isABusinessCall() = name.contains(company) && company.isNotEmpty() 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/res/layout/timer_notification.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 19 | 20 | 31 | 32 | 42 | 43 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/dialogs/AddSpeedDialDialog.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.dialogs 2 | 3 | import android.app.Activity 4 | import android.content.DialogInterface.BUTTON_POSITIVE 5 | import androidx.appcompat.app.AlertDialog 6 | import com.goodwy.commons.extensions.getAlertDialogBuilder 7 | import com.goodwy.commons.extensions.setupDialogStuff 8 | import com.goodwy.commons.extensions.showKeyboard 9 | import com.goodwy.dialer.R 10 | import com.goodwy.dialer.databinding.DialogAddSpeedDialBinding 11 | import com.goodwy.dialer.models.SpeedDial 12 | 13 | class AddSpeedDialDialog( 14 | private val activity: Activity, 15 | private val speedDial: SpeedDial, 16 | private val callback: (name: String) -> Unit, 17 | ) { 18 | private var dialog: AlertDialog? = null 19 | 20 | init { 21 | val binding = DialogAddSpeedDialBinding.inflate(activity.layoutInflater).apply { 22 | addSpeedDialEditText.apply { 23 | setText(speedDial.number) 24 | hint = speedDial.number 25 | } 26 | } 27 | 28 | activity.getAlertDialogBuilder() 29 | .setPositiveButton(com.goodwy.commons.R.string.ok, null) 30 | .setNegativeButton(com.goodwy.commons.R.string.cancel, null) 31 | .apply { 32 | activity.setupDialogStuff(binding.root, this, R.string.speed_dial) { alertDialog -> 33 | dialog = alertDialog 34 | alertDialog.showKeyboard(binding.addSpeedDialEditText) 35 | alertDialog.getButton(BUTTON_POSITIVE).apply { 36 | setOnClickListener { 37 | val newTitle = binding.addSpeedDialEditText.text.toString() 38 | callback(newTitle) 39 | alertDialog.dismiss() 40 | } 41 | } 42 | } 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_select_sim.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 19 | 20 | 25 | 26 | 29 | 30 | 36 | 37 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_manage_visible_tabs.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 16 | 17 | 24 | 25 | 32 | 33 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_contact_blur.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/helpers/CallContactAvatarHelper.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.helpers 2 | 3 | import android.content.Context 4 | import android.graphics.* 5 | import android.provider.MediaStore 6 | import android.util.Size 7 | import com.goodwy.commons.helpers.isQPlus 8 | import com.goodwy.dialer.R 9 | import androidx.core.net.toUri 10 | import androidx.core.graphics.createBitmap 11 | 12 | class CallContactAvatarHelper(private val context: Context) { 13 | fun getCallContactAvatar(photoUri: String?, round: Boolean = true): Bitmap? { 14 | var bitmap: Bitmap? = null 15 | if (photoUri?.isNotEmpty() == true) { 16 | val photoUriParse = photoUri.toUri() 17 | try { 18 | val contentResolver = context.contentResolver 19 | bitmap = if (isQPlus()) { 20 | val tmbSize = context.resources.getDimension(R.dimen.list_avatar_size).toInt() 21 | contentResolver.loadThumbnail(photoUriParse, Size(tmbSize, tmbSize), null) 22 | } else { 23 | MediaStore.Images.Media.getBitmap(contentResolver, photoUriParse) 24 | } 25 | bitmap = if (round) getCircularBitmap(bitmap!!) else bitmap 26 | } catch (_: Exception) { 27 | return null 28 | } 29 | } 30 | return bitmap 31 | } 32 | 33 | fun getCircularBitmap(bitmap: Bitmap): Bitmap { 34 | val output = createBitmap(bitmap.width, bitmap.width) 35 | val canvas = Canvas(output) 36 | val paint = Paint() 37 | val rect = Rect(0, 0, bitmap.width, bitmap.height) 38 | val radius = bitmap.width / 2.toFloat() 39 | 40 | paint.isAntiAlias = true 41 | canvas.drawARGB(0, 0, 0, 0) 42 | canvas.drawCircle(radius, radius, radius, paint) 43 | paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN) 44 | canvas.drawBitmap(bitmap, rect, rect, paint) 45 | return output 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_answer_buttons.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 16 | 17 | 22 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/adapters/ViewPagerAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.adapters 2 | 3 | import android.view.View 4 | import android.view.ViewGroup 5 | import androidx.viewpager.widget.PagerAdapter 6 | import com.goodwy.commons.helpers.TAB_CALL_HISTORY 7 | import com.goodwy.commons.helpers.TAB_CONTACTS 8 | import com.goodwy.commons.helpers.TAB_FAVORITES 9 | import com.goodwy.dialer.R 10 | import com.goodwy.dialer.activities.SimpleActivity 11 | import com.goodwy.dialer.extensions.config 12 | import com.goodwy.dialer.fragments.MyViewPagerFragment 13 | import com.goodwy.dialer.helpers.tabsList 14 | 15 | class ViewPagerAdapter(val activity: SimpleActivity) : PagerAdapter() { 16 | 17 | override fun instantiateItem(container: ViewGroup, position: Int): Any { 18 | val layout = getFragment(position) 19 | val view = activity.layoutInflater.inflate(layout, container, false) 20 | container.addView(view) 21 | 22 | (view as MyViewPagerFragment<*>).apply { 23 | setupFragment(activity) 24 | } 25 | 26 | return view 27 | } 28 | 29 | override fun destroyItem(container: ViewGroup, position: Int, item: Any) { 30 | container.removeView(item as View) 31 | } 32 | 33 | override fun getCount() = tabsList.filter { it and activity.config.showTabs != 0 }.size 34 | 35 | override fun isViewFromObject(view: View, item: Any) = view == item 36 | 37 | private fun getFragment(position: Int): Int { 38 | val showTabs = activity.config.showTabs 39 | val fragments = arrayListOf() 40 | if (showTabs and TAB_FAVORITES > 0) { 41 | fragments.add(R.layout.fragment_favorites) 42 | } 43 | 44 | if (showTabs and TAB_CALL_HISTORY > 0) { 45 | fragments.add(R.layout.fragment_recents) 46 | } 47 | 48 | if (showTabs and TAB_CONTACTS > 0) { 49 | fragments.add(R.layout.fragment_contacts) 50 | } 51 | 52 | return if (position < fragments.size) fragments[position] else fragments.last() 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/dialogs/ChooseSocialDialog.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.dialogs 2 | 3 | import android.app.Activity 4 | import android.view.ViewGroup 5 | import android.widget.RadioGroup 6 | import androidx.appcompat.app.AlertDialog 7 | import com.goodwy.commons.extensions.beGone 8 | import com.goodwy.commons.extensions.getAlertDialogBuilder 9 | import com.goodwy.commons.extensions.setupDialogStuff 10 | import com.goodwy.dialer.extensions.getPackageDrawable 11 | import com.goodwy.dialer.databinding.DialogChooseSocialBinding 12 | import com.goodwy.dialer.databinding.ItemChooseSocialBinding 13 | import com.goodwy.commons.models.contacts.SocialAction 14 | 15 | class ChooseSocialDialog(val activity: Activity, actions: ArrayList, val callback: (action: SocialAction) -> Unit) { 16 | private lateinit var dialog: AlertDialog 17 | 18 | init { 19 | val binding = DialogChooseSocialBinding.inflate(activity.layoutInflater) 20 | actions.sortBy { it.type } 21 | actions.forEach { action -> 22 | val item = ItemChooseSocialBinding.inflate(activity.layoutInflater).apply { 23 | itemSocialLabel.text = action.label 24 | root.setOnClickListener { 25 | callback(action) 26 | dialog.dismiss() 27 | } 28 | 29 | val drawable = activity.getPackageDrawable(action.packageName) 30 | if (drawable == null) { 31 | itemSocialImage.beGone() 32 | } else { 33 | itemSocialImage.setImageDrawable(drawable) 34 | } 35 | } 36 | 37 | binding.dialogChooseSocial.addView(item.root, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)) 38 | } 39 | 40 | val builder = activity.getAlertDialogBuilder() 41 | 42 | builder.apply { 43 | activity.setupDialogStuff(binding.root, this) { alertDialog -> 44 | dialog = alertDialog 45 | } 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_signal_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/dialogs/ManageVisibleTabsDialog.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.dialogs 2 | 3 | import com.goodwy.commons.activities.BaseSimpleActivity 4 | import com.goodwy.commons.extensions.getAlertDialogBuilder 5 | import com.goodwy.commons.extensions.setupDialogStuff 6 | import com.goodwy.commons.extensions.viewBinding 7 | import com.goodwy.commons.helpers.TAB_CALL_HISTORY 8 | import com.goodwy.commons.helpers.TAB_CONTACTS 9 | import com.goodwy.commons.helpers.TAB_FAVORITES 10 | import com.goodwy.commons.views.MyAppCompatCheckbox 11 | import com.goodwy.dialer.R 12 | import com.goodwy.dialer.databinding.DialogManageVisibleTabsBinding 13 | import com.goodwy.dialer.extensions.config 14 | import com.goodwy.dialer.helpers.ALL_TABS_MASK 15 | 16 | class ManageVisibleTabsDialog(val activity: BaseSimpleActivity) { 17 | private val binding by activity.viewBinding(DialogManageVisibleTabsBinding::inflate) 18 | private val tabs = LinkedHashMap() 19 | 20 | init { 21 | tabs.apply { 22 | put(TAB_FAVORITES, R.id.manage_visible_tabs_favorites) 23 | put(TAB_CALL_HISTORY, R.id.manage_visible_tabs_call_history) 24 | put(TAB_CONTACTS, R.id.manage_visible_tabs_contacts) 25 | } 26 | 27 | val showTabs = activity.config.showTabs 28 | for ((key, value) in tabs) { 29 | binding.root.findViewById(value).isChecked = showTabs and key != 0 30 | } 31 | 32 | activity.getAlertDialogBuilder() 33 | .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } 34 | .setNegativeButton(R.string.cancel, null) 35 | .apply { 36 | activity.setupDialogStuff(binding.root, this, R.string.manage_shown_tabs) 37 | } 38 | } 39 | 40 | private fun dialogConfirmed() { 41 | var result = 0 42 | for ((key, value) in tabs) { 43 | if (binding.root.findViewById(value).isChecked) { 44 | result += key 45 | } 46 | } 47 | 48 | if (result == 0) { 49 | result = ALL_TABS_MASK 50 | } 51 | 52 | activity.config.showTabs = result 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_call_button_bottom.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 16 | 21 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 11 | 17 | 23 | 28 | 33 | 38 | 42 | 47 | 52 | 57 | 58 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/goodwy/dialer/activities/NotificationActivity.kt: -------------------------------------------------------------------------------- 1 | package com.goodwy.dialer.activities 2 | 3 | import android.annotation.SuppressLint 4 | import android.content.Intent 5 | import android.net.Uri 6 | import android.os.Bundle 7 | import com.goodwy.commons.extensions.launchActivityIntent 8 | import com.goodwy.commons.extensions.notificationManager 9 | import com.goodwy.commons.helpers.CURRENT_PHONE_NUMBER 10 | import com.goodwy.commons.helpers.IS_RIGHT_APP 11 | import com.goodwy.dialer.BuildConfig 12 | import com.goodwy.dialer.helpers.MISSED_CALL_BACK 13 | import com.goodwy.dialer.helpers.MISSED_CALL_MESSAGE 14 | import com.goodwy.dialer.receivers.MissedCallReceiver.Companion.clearMissedCallCount 15 | 16 | //Empty activation to remove missed call notifications when you press to call or send a message 17 | //https://stackoverflow.com/questions/18261969/clicking-android-notification-actions-does-not-close-notification-drawer?noredirect=1&lq=1 18 | class NotificationActivity : SimpleActivity() { 19 | @SuppressLint("MissingPermission") 20 | override fun onCreate(savedInstanceState: Bundle?) { 21 | super.onCreate(savedInstanceState) 22 | 23 | val phoneNumber = intent.extras?.getString(CURRENT_PHONE_NUMBER) ?: return 24 | 25 | // When answering a call or message, we clear the counter for that number. 26 | phoneNumber.let { 27 | clearMissedCallCount(it) 28 | notificationManager.cancel(it.hashCode()) 29 | // updateUnreadCountAndGroup(this) 30 | } 31 | 32 | when (intent.action) { 33 | MISSED_CALL_BACK -> phoneNumber.let { 34 | Intent(Intent.ACTION_CALL).apply { 35 | data = Uri.fromParts("tel", it, null) 36 | putExtra(IS_RIGHT_APP, BuildConfig.RIGHT_APP_KEY) 37 | flags = Intent.FLAG_ACTIVITY_NEW_TASK 38 | launchActivityIntent(this) 39 | } 40 | } 41 | 42 | MISSED_CALL_MESSAGE -> phoneNumber.let { 43 | Intent(Intent.ACTION_VIEW).apply { 44 | data = Uri.fromParts("smsto", it, null) 45 | flags = Intent.FLAG_ACTIVITY_NEW_TASK 46 | launchActivityIntent(this) 47 | } 48 | } 49 | } 50 | 51 | finish() 52 | } 53 | } 54 | --------------------------------------------------------------------------------