├── .bazelci
└── presubmit.yml
├── .bazelproject
├── .bazelrc
├── .github
├── ISSUE_TEMPLATE
│ ├── bug-report.md
│ └── feature-request.md
└── PULL_REQUEST_TEMPLATE.md
├── .gitignore
├── BUILD
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── WORKSPACE
├── java
└── com
│ └── google
│ └── android
│ └── apps
│ └── authenticator
│ ├── AndroidManifest.xml
│ ├── AuthenticatorActivity.java
│ ├── AuthenticatorApplication.java
│ ├── AuthenticatorModule.java
│ ├── BUILD
│ ├── CountdownIndicator.java
│ ├── UserRowView.java
│ ├── barcode
│ ├── BarcodeCaptureActivity.java
│ ├── BarcodeCentralFilter.java
│ ├── BarcodeCentralFocusingProcessor.java
│ ├── BarcodeConditionChecker.java
│ ├── BarcodeTracker.java
│ └── preview
│ │ ├── CameraSourcePreview.java
│ │ └── GraphicOverlay.java
│ ├── common
│ ├── AndroidDependenciesModule.java
│ └── ApplicationContext.java
│ ├── crypto
│ └── CryptoModule.java
│ ├── enroll2sv
│ └── wizard
│ │ └── AddAccountActivity.java
│ ├── howitworks
│ ├── HowItWorksActivity.java
│ └── PagingIndicator.java
│ ├── license
│ ├── License.java
│ ├── LicenseActivity.java
│ ├── LicenseLoader.java
│ ├── LicenseMenuActivity.java
│ └── Licenses.java
│ ├── otp
│ ├── AccountDb.java
│ ├── CheckCodeActivity.java
│ ├── EnterKeyActivity.java
│ ├── OtpModule.java
│ ├── OtpProvider.java
│ ├── OtpSource.java
│ ├── OtpSourceException.java
│ ├── PasscodeGenerator.java
│ ├── PinInfo.java
│ ├── TotpClock.java
│ ├── TotpCountdownTask.java
│ └── TotpCounter.java
│ ├── proguard-rules.pro
│ ├── res
│ ├── anim
│ │ └── deny_allow_seekbar.xml
│ ├── drawable-hdpi
│ │ ├── barcode_scanner_image.png
│ │ ├── ic_menu_grey400_24dp.png
│ │ ├── ic_refresh_grey400_24dp.png
│ │ ├── ic_refresh_grey700_24dp.png
│ │ ├── product_logo_authenticator_color_144.png
│ │ ├── product_logo_authenticator_color_tablet.png
│ │ ├── quantum_ic_account_circle_googblue_24.png
│ │ ├── quantum_ic_add_white_24.png
│ │ ├── quantum_ic_content_copy_white_24.png
│ │ ├── quantum_ic_delete_white_24.png
│ │ ├── quantum_ic_edit_white_24.png
│ │ ├── quantum_ic_highlight_off_white_24.png
│ │ ├── quantum_ic_history_googblue_24.png
│ │ ├── quantum_ic_keyboard_arrow_down_grey600_24.png
│ │ ├── quantum_ic_keyboard_grey600_24.png
│ │ ├── quantum_ic_lock_googblue_24.png
│ │ ├── quantum_ic_lock_white_24.png
│ │ ├── quantum_ic_navigate_next_white_24.png
│ │ ├── quantum_ic_phone_white_24.png
│ │ ├── quantum_ic_photo_camera_grey600_24.png
│ │ ├── quantum_ic_refresh_black_48.png
│ │ ├── quantum_ic_refresh_googblue_48.png
│ │ ├── quantum_ic_refresh_grey600_48.png
│ │ ├── quantum_ic_report_problem_grey600_24.png
│ │ └── quantum_ic_vpn_key_white_24.png
│ ├── drawable-ldrtl-hdpi
│ │ └── quantum_ic_content_copy_white_24.png
│ ├── drawable-ldrtl-mdpi
│ │ └── quantum_ic_content_copy_white_24.png
│ ├── drawable-ldrtl-xhdpi
│ │ └── quantum_ic_content_copy_white_24.png
│ ├── drawable-ldrtl-xxhdpi
│ │ └── quantum_ic_content_copy_white_24.png
│ ├── drawable-ldrtl-xxxhdpi
│ │ └── quantum_ic_content_copy_white_24.png
│ ├── drawable-mdpi
│ │ ├── product_logo_authenticator_color_144.png
│ │ ├── quantum_ic_account_circle_googblue_24.png
│ │ ├── quantum_ic_add_white_24.png
│ │ ├── quantum_ic_content_copy_white_24.png
│ │ ├── quantum_ic_delete_white_24.png
│ │ ├── quantum_ic_edit_white_24.png
│ │ ├── quantum_ic_highlight_off_white_24.png
│ │ ├── quantum_ic_history_googblue_24.png
│ │ ├── quantum_ic_keyboard_arrow_down_grey600_24.png
│ │ ├── quantum_ic_keyboard_grey600_24.png
│ │ ├── quantum_ic_lock_googblue_24.png
│ │ ├── quantum_ic_lock_white_24.png
│ │ ├── quantum_ic_navigate_next_white_24.png
│ │ ├── quantum_ic_phone_white_24.png
│ │ ├── quantum_ic_photo_camera_grey600_24.png
│ │ ├── quantum_ic_refresh_black_48.png
│ │ ├── quantum_ic_refresh_googblue_48.png
│ │ ├── quantum_ic_refresh_grey600_48.png
│ │ ├── quantum_ic_report_problem_grey600_24.png
│ │ └── quantum_ic_vpn_key_white_24.png
│ ├── drawable-xhdpi
│ │ ├── barcode_scanner_image.png
│ │ ├── howitworks_image_1.png
│ │ ├── howitworks_image_1_tablet.png
│ │ ├── howitworks_image_2.png
│ │ ├── howitworks_image_2_tablet.png
│ │ ├── howitworks_image_3.png
│ │ ├── howitworks_image_3_tablet.png
│ │ ├── ic_enroll2sv_account.png
│ │ ├── ic_menu_grey400_24dp.png
│ │ ├── ic_refresh_grey400_24dp.png
│ │ ├── ic_refresh_grey700_24dp.png
│ │ ├── product_logo_authenticator_color_144.png
│ │ ├── quantum_ic_account_circle_googblue_24.png
│ │ ├── quantum_ic_add_white_24.png
│ │ ├── quantum_ic_content_copy_white_24.png
│ │ ├── quantum_ic_delete_white_24.png
│ │ ├── quantum_ic_edit_white_24.png
│ │ ├── quantum_ic_highlight_off_white_24.png
│ │ ├── quantum_ic_history_googblue_24.png
│ │ ├── quantum_ic_keyboard_arrow_down_grey600_24.png
│ │ ├── quantum_ic_keyboard_grey600_24.png
│ │ ├── quantum_ic_lock_googblue_24.png
│ │ ├── quantum_ic_lock_white_24.png
│ │ ├── quantum_ic_navigate_next_white_24.png
│ │ ├── quantum_ic_phone_white_24.png
│ │ ├── quantum_ic_photo_camera_grey600_24.png
│ │ ├── quantum_ic_refresh_black_48.png
│ │ ├── quantum_ic_refresh_googblue_48.png
│ │ ├── quantum_ic_refresh_grey600_48.png
│ │ ├── quantum_ic_report_problem_grey600_24.png
│ │ └── quantum_ic_vpn_key_white_24.png
│ ├── drawable-xxhdpi
│ │ ├── product_logo_authenticator_color_144.png
│ │ ├── quantum_ic_account_circle_googblue_24.png
│ │ ├── quantum_ic_add_white_24.png
│ │ ├── quantum_ic_content_copy_white_24.png
│ │ ├── quantum_ic_delete_white_24.png
│ │ ├── quantum_ic_edit_white_24.png
│ │ ├── quantum_ic_highlight_off_white_24.png
│ │ ├── quantum_ic_history_googblue_24.png
│ │ ├── quantum_ic_keyboard_arrow_down_grey600_24.png
│ │ ├── quantum_ic_keyboard_grey600_24.png
│ │ ├── quantum_ic_lock_googblue_24.png
│ │ ├── quantum_ic_lock_white_24.png
│ │ ├── quantum_ic_navigate_next_white_24.png
│ │ ├── quantum_ic_phone_white_24.png
│ │ ├── quantum_ic_photo_camera_grey600_24.png
│ │ ├── quantum_ic_refresh_black_48.png
│ │ ├── quantum_ic_refresh_googblue_48.png
│ │ ├── quantum_ic_refresh_grey600_48.png
│ │ ├── quantum_ic_report_problem_grey600_24.png
│ │ └── quantum_ic_vpn_key_white_24.png
│ ├── drawable-xxxhdpi
│ │ ├── product_logo_authenticator_color_144.png
│ │ ├── quantum_ic_account_circle_googblue_24.png
│ │ ├── quantum_ic_add_white_24.png
│ │ ├── quantum_ic_content_copy_white_24.png
│ │ ├── quantum_ic_delete_white_24.png
│ │ ├── quantum_ic_edit_white_24.png
│ │ ├── quantum_ic_highlight_off_white_24.png
│ │ ├── quantum_ic_history_googblue_24.png
│ │ ├── quantum_ic_keyboard_arrow_down_grey600_24.png
│ │ ├── quantum_ic_keyboard_grey600_24.png
│ │ ├── quantum_ic_lock_googblue_24.png
│ │ ├── quantum_ic_lock_white_24.png
│ │ ├── quantum_ic_navigate_next_white_24.png
│ │ ├── quantum_ic_phone_white_24.png
│ │ ├── quantum_ic_photo_camera_grey600_24.png
│ │ ├── quantum_ic_refresh_black_48.png
│ │ ├── quantum_ic_refresh_googblue_48.png
│ │ ├── quantum_ic_refresh_grey600_48.png
│ │ ├── quantum_ic_report_problem_grey600_24.png
│ │ └── quantum_ic_vpn_key_white_24.png
│ ├── drawable
│ │ ├── refresh_button.xml
│ │ ├── refresh_button_dark.xml
│ │ ├── toolbar_shadow.xml
│ │ ├── user_row_dragged_shadow_bottom.xml
│ │ ├── user_row_dragged_shadow_bottom_dark.xml
│ │ ├── user_row_dragged_shadow_top.xml
│ │ ├── user_row_dragged_shadow_top_dark.xml
│ │ ├── user_row_selector.xml
│ │ └── user_row_selector_dark.xml
│ ├── layout-sw360dp
│ │ └── main_no_accounts.xml
│ ├── layout-sw600dp-land
│ │ ├── howitworks_layout_1.xml
│ │ ├── howitworks_layout_2.xml
│ │ ├── howitworks_layout_3.xml
│ │ └── main_no_accounts.xml
│ ├── layout-sw600dp-port
│ │ ├── howitworks_layout_1.xml
│ │ ├── howitworks_layout_2.xml
│ │ ├── howitworks_layout_3.xml
│ │ └── main_no_accounts.xml
│ ├── layout
│ │ ├── barcode_capture_activity.xml
│ │ ├── check_code.xml
│ │ ├── dummy_placeholder.xml
│ │ ├── enroll2sv_add_account.xml
│ │ ├── enter_key.xml
│ │ ├── howitworks.xml
│ │ ├── howitworks_layout_1.xml
│ │ ├── howitworks_layout_2.xml
│ │ ├── howitworks_layout_3.xml
│ │ ├── license.xml
│ │ ├── license_menu_activity.xml
│ │ ├── license_scrollview.xml
│ │ ├── listitem_device.xml
│ │ ├── main.xml
│ │ ├── main_bottom_sheet.xml
│ │ ├── main_no_accounts.xml
│ │ ├── opensource_notices.xml
│ │ ├── rename.xml
│ │ ├── two_step_verification_settings.xml
│ │ ├── user_row.xml
│ │ └── user_row_dragged.xml
│ ├── menu
│ │ ├── account_list_context.xml
│ │ ├── add_account.xml
│ │ └── main.xml
│ ├── mipmap-hdpi
│ │ └── product_logo_authenticator_launcher_color_48.png
│ ├── mipmap-mdpi
│ │ └── product_logo_authenticator_launcher_color_48.png
│ ├── mipmap-xhdpi
│ │ └── product_logo_authenticator_launcher_color_48.png
│ ├── mipmap-xxhdpi
│ │ └── product_logo_authenticator_launcher_color_48.png
│ ├── mipmap-xxxhdpi
│ │ └── product_logo_authenticator_launcher_color_48.png
│ ├── raw
│ │ ├── third_party_license_metadata
│ │ └── third_party_licenses
│ ├── values-af
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-am
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-ar
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-az-rAZ
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-b+sr+Latn
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-be-rBY
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-bg
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-bn-rBD
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-bs-rBA
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-ca
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-cs
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-da
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-de
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-el
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-en-rAU
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-en-rGB
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-en-rIN
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-es-rUS
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-es
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-et-rEE
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-eu-rES
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-fa
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-fi
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-fr-rCA
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-fr
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-gl-rES
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-gu-rIN
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-hi
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-hr
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-hu
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-hy-rAM
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-in
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-is-rIS
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-it
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-iw
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-ja
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-ka-rGE
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-kk-rKZ
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-km-rKH
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-kn-rIN
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-ko
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-ky-rKG
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-lo-rLA
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-lt
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-lv
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-mk-rMK
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-ml-rIN
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-mn-rMN
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-mr-rIN
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-ms-rMY
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-ms
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-my-rMM
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-nb
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-ne-rNP
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-nl
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-pa-rIN
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-pl
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-pt-rPT
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-pt
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-ro
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-ru
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-si-rLK
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-sk
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-sl
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-sq-rAL
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-sr
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-sv
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-sw
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-sw600dp
│ │ ├── dimen.xml
│ │ └── others.xml
│ ├── values-ta-rIN
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-te-rIN
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-th
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-tl
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-tr
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-uk
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-ur-rPK
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-uz-rUZ
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-v21
│ │ └── themes.xml
│ ├── values-vi
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-zh-rCN
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-zh-rHK
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-zh-rTW
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values-zu
│ │ ├── enroll2sv_strings.xml
│ │ ├── strings.xml
│ │ └── timesync_strings.xml
│ ├── values
│ │ ├── attrs.xml
│ │ ├── colors.xml
│ │ ├── dimen.xml
│ │ ├── enroll2sv_strings.xml
│ │ ├── others.xml
│ │ ├── strings.xml
│ │ ├── themes.xml
│ │ └── timesync_strings.xml
│ └── xml
│ │ ├── preferences.xml
│ │ ├── preferences_about.xml
│ │ └── preferences_time_correction.xml
│ ├── settings
│ ├── AppCompatPreferenceActivity.java
│ ├── SettingsAboutActivity.java
│ └── SettingsActivity.java
│ ├── testability
│ ├── DaggerInjector.java
│ ├── DependencyInjector.java
│ ├── DependencyInjectorModule.java
│ ├── SharedPreferencesRenamingDelegatingContext.java
│ ├── StartActivityListener.java
│ ├── StartServiceListener.java
│ ├── TestableActivity.java
│ └── TestablePreferenceActivity.java
│ ├── time
│ ├── Clock.java
│ └── SystemWallClock.java
│ ├── timesync
│ ├── HttpURLConnectionFactory.java
│ ├── HttpURLConnectionFactoryImpl.java
│ ├── NetworkTimeProvider.java
│ ├── SettingsTimeCorrectionActivity.java
│ ├── SyncNowActivity.java
│ ├── SyncNowController.java
│ └── TimeSyncModule.java
│ └── util
│ ├── Base32String.java
│ ├── CryptoUtils.java
│ ├── EmptySpaceClickableDragSortListView.java
│ ├── FileUtilities.java
│ ├── IntentUtils.java
│ ├── PrngFixes.java
│ ├── Utilities.java
│ ├── annotations
│ └── FixWhenMinSdkVersion.java
│ ├── concurrent
│ └── RunOnThisLooperThreadExecutor.java
│ └── permissions
│ ├── AutoGrantPermissionRequestor.java
│ ├── PermissionRequestor.java
│ └── RuntimePermissionRequestor.java
├── javatests
└── com
│ └── google
│ └── android
│ └── apps
│ └── authenticator
│ ├── AndroidManifest.xml
│ ├── AuthenticatorActivityPart2Test.java
│ ├── AuthenticatorActivityTest.java
│ ├── BUILD
│ ├── enroll2sv
│ └── wizard
│ │ └── AddAccountActivityTest.java
│ ├── howitworks
│ └── HowItWorksActivityTest.java
│ ├── otp
│ ├── AccountDbTest.java
│ ├── CheckCodeActivityTest.java
│ ├── EnterKeyActivityTest.java
│ ├── OtpProviderTest.java
│ ├── PasscodeGeneratorTest.java
│ ├── PinInfoTest.java
│ ├── TotpClockTest.java
│ └── TotpCounterTest.java
│ ├── settings
│ ├── SettingsAboutActivityTest.java
│ └── SettingsActivityTest.java
│ ├── target_devices.bzl
│ ├── testability
│ └── DependencyInjectorModuleForIntegrationTesting.java
│ ├── testing
│ └── TestUtilities.java
│ ├── time
│ └── SystemWallClockTest.java
│ ├── timesync
│ ├── NetworkTimeProviderTest.java
│ └── SyncNowControllerTest.java
│ └── util
│ ├── Base32StringTest.java
│ ├── CryptoUtilsTest.java
│ ├── FileUtilitiesTest.java
│ ├── IntentUtilsTest.java
│ └── UtilitiesTest.java
└── third_party
└── DragSortListView
├── AndroidManifest.xml
├── BUILD
├── LICENSE
├── README.md
├── res
└── values
│ └── dslv_attrs.xml
└── src
└── com
└── mobeta
└── android
└── dslv
├── DragSortController.java
├── DragSortCursorAdapter.java
├── DragSortItemView.java
├── DragSortItemViewCheckable.java
├── DragSortListView.java
├── ResourceDragSortCursorAdapter.java
├── SimpleDragSortCursorAdapter.java
└── SimpleFloatViewManager.java
/.bazelci/presubmit.yml:
--------------------------------------------------------------------------------
1 | ---
2 | tasks:
3 | ubuntu1804:
4 | build_targets:
5 | - "//java/com/google/android/apps/authenticator"
6 | test_targets:
7 | - "//javatests/..."
8 |
--------------------------------------------------------------------------------
/.bazelproject:
--------------------------------------------------------------------------------
1 | # Copyright 2019 Google LLC
2 | #
3 | # Licensed under the Apache License, Version 2.0 (the "License");
4 | # you may not use this file except in compliance with the License.
5 | # You may obtain a copy of the License at
6 | #
7 | # http://www.apache.org/licenses/LICENSE-2.0
8 | #
9 | # Unless required by applicable law or agreed to in writing, software
10 | # distributed under the License is distributed on an "AS IS" BASIS,
11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 | # See the License for the specific language governing permissions and
13 | # limitations under the License.
14 |
15 | directories:
16 | .
17 |
18 | targets:
19 | //...
20 |
21 | test_sources:
22 | javatests/com/google/android/apps/authenticator/*
23 |
24 | android_sdk_platform: android-28
25 |
--------------------------------------------------------------------------------
/.bazelrc:
--------------------------------------------------------------------------------
1 | # Configurations for testing with Bazel
2 | # Select a configuration by running
3 | # `bazel test //my:target --config={headless, gui, local_device}`
4 |
5 | # Headless instrumentation tests (No GUI)
6 | test:headless --test_arg=--enable_display=false
7 | # Graphical instrumentation tests. Ensure that $DISPLAY is set.
8 | test:gui --test_env=DISPLAY
9 | test:gui --test_arg=--enable_display=true
10 |
11 | # Testing with a local emulator or device. Ensure that `adb devices` lists the
12 | # device.
13 | # WARNING: Running tests may delete existing seeds on the target device. Only
14 | # use test devices when running the test suite on a real device.
15 | #
16 | # Run tests serially.
17 | test:local_device --test_strategy=exclusive
18 | # Use the local device broker type, as opposed to WRAPPED_EMULATOR.
19 | test:local_device --test_arg=--device_broker_type=LOCAL_ADB_SERVER
20 | # Uncomment and set $device_id if there is more than one connected device.
21 | # test:local_device --test_arg=--device_serial_number=$device_id
22 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug-report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug Report
3 | about: "There's a bug in the app \U0001F41B"
4 | title: ''
5 | labels: bug
6 | assignees: ''
7 |
8 | ---
9 |
10 | Found a bug in the Android app? Thanks for reporting it! To help us out, fill out this template to the best of your ability.
11 |
12 | Please note that the code in this repository is an open source fork of the app in the Play Store, so **there is no guarantee that both apps will be in sync**. Please check which version of the app your bug applies to below.
13 |
14 | - [ ] This issue is present in the app downloaded from the [Play Store][playstore].
15 | - [ ] This issue is with the [Github version][opensource] of the app.
16 |
17 | ## Describe the Bug
18 |
19 | Replace this section with a clear summary of the issue you're encountering. Be as clear and concise as possible.
20 |
21 | ### Intended Behavior
22 |
23 | What did you expect to happen?
24 |
25 | ### Actual Behavior
26 |
27 | What actually happened?
28 |
29 | ## Reproducing
30 |
31 | How does one encounter this error. If possible, provide steps that we can take, like as shown below:
32 |
33 | 1. Go to '...'
34 | 2. Click on '....'
35 | 3. Scroll down to '....'
36 | 4. See error
37 |
38 | ### Screenshots
39 |
40 | If applicable, add screenshots to help explain your problem.
41 |
42 | ### Device
43 |
44 | Fill out the details about the device and app version in which you encountered the bug.
45 |
46 | - Device: [e.g. iPhone6]
47 | - OS: [e.g. iOS8.1]
48 | - Version [e.g. 22]
49 |
50 | ## Additional Information
51 |
52 | Add any other context about the problem here.
53 |
54 | [playstore]: https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2
55 | [opensource]: https://github.com/google/google-authenticator-android
56 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature-request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature Request
3 | about: Request a feature ⚙️
4 | title: ''
5 | labels: enhancement
6 | assignees: ''
7 |
8 | ---
9 |
10 | Please note that the code in this repository is an open source fork of the app in the Play Store, so **there is no guarantee that both apps will be in sync**. Please check which version of the app your bug applies to below.
11 |
12 | - [ ] This feature request applies to the app downloaded from the [Play Store][playstore].
13 | - [ ] This feature request is for the [Github version][opensource] of the app.
14 |
15 | The Google Authenticator app is maintained by a small group of 20%-ers within Google. Although we'd love to give the app some more love, engineers need to allocate limited cycles to many competing priorities. Please check the box below to make sure that we're on the same page.
16 |
17 | - [ ] I have acknowledged that filing this feature request does not obligate Google to implement my specific request.
18 |
19 | ## Feature Description
20 |
21 | Describe the feature you'd like. Be as clear and concise as possible. Why do you want this feature? (We also welcome [pull requests][pr]!)
22 |
23 | ### Why is it important?
24 |
25 | Why is implementing this feature important? Filling this out helps us prioritize different issues.
26 |
27 | ## Additional Information
28 |
29 | Add any other context about the feature request here.
30 |
31 | [playstore]: https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2
32 | [opensource]: https://github.com/google/google-authenticator-android
33 | [pr]: https://github.com/google/google-authenticator-android/blob/master/CONTRIBUTING.md
34 |
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | Thanks for creating a pull request with us! Please make sure you have submitted the CLA at https://cla.developers.google.com/ if you haven't already.
2 |
3 | ## Change Description
4 |
5 | Please describe the change from your pull request here. If this pull request is related to an existing issue, link the issue here as well.
6 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Ignore all bazel-* symlinks. There is no full list since this can change
2 | # based on the name of the directory bazel is cloned into.
3 | /bazel-*
4 |
5 | # Built application files
6 | *.apk
7 | *.ap_
8 | *.aab
9 |
10 | # Files for the ART/Dalvik VM
11 | *.dex
12 |
13 | # Java class files
14 | *.class
15 |
16 | # Generated files
17 | bin/
18 | gen/
19 | out/
20 |
21 | # Gradle files
22 | .gradle/
23 | build/
24 |
25 | # Local configuration file (sdk path, etc)
26 | local.properties
27 |
28 | # Proguard folder generated by Eclipse
29 | proguard/
30 |
31 | # Log Files
32 | *.log
33 |
34 | # Android Studio Navigation editor temp files
35 | .navigation/
36 |
37 | # Android Studio captures folder
38 | captures/
39 |
40 | # IntelliJ
41 | *.iml
42 | .idea/workspace.xml
43 | .idea/tasks.xml
44 | .idea/gradle.xml
45 | .idea/assetWizardSettings.xml
46 | .idea/dictionaries
47 | .idea/libraries
48 | .idea/caches
49 | # Android Studio 3 in .gitignore file.
50 | .idea/caches/build_file_checksums.ser
51 | .idea/modules.xml
52 | .aswb/
53 |
54 | # Keystore files
55 | *.jks
56 | *.keystore
57 |
58 | # External native build folder generated in Android Studio 2.2 and later
59 | .externalNativeBuild
60 |
61 | # Google Services (e.g. APIs or Firebase)
62 | google-services.json
63 |
64 | # Freeline
65 | freeline.py
66 | freeline/
67 | freeline_project_description.json
68 |
69 | # fastlane
70 | fastlane/report.xml
71 | fastlane/Preview.html
72 | fastlane/screenshots
73 | fastlane/test_output
74 | fastlane/readme.md
75 |
76 | # Version control
77 | vcs.xml
78 |
79 | # lint
80 | lint/intermediates/
81 | lint/generated/
82 | lint/outputs/
83 | lint/tmp/
84 | gint/reports/
85 |
--------------------------------------------------------------------------------
/BUILD:
--------------------------------------------------------------------------------
1 | # Copyright 2019 Google LLC
2 | #
3 | # Licensed under the Apache License, Version 2.0 (the "License");
4 | # you may not use this file except in compliance with the License.
5 | # You may obtain a copy of the License at
6 | #
7 | # http://www.apache.org/licenses/LICENSE-2.0
8 | #
9 | # Unless required by applicable law or agreed to in writing, software
10 | # distributed under the License is distributed on an "AS IS" BASIS,
11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 | # See the License for the specific language governing permissions and
13 | # limitations under the License.
14 |
15 | package(
16 | default_visibility = [
17 | "//java/com/google/android/apps/authenticator:__subpackages__",
18 | "//javatests/com/google/android/apps/authenticator:__subpackages__",
19 | ],
20 | )
21 |
22 | licenses(["notice"]) # Apache 2.0
23 |
24 | java_plugin(
25 | name = "dagger-graph-analysis-processor",
26 | processor_class = "dagger.internal.codegen.GraphAnalysisProcessor",
27 | deps = [
28 | "@maven//:com_squareup_dagger_dagger_compiler",
29 | ],
30 | )
31 |
32 | java_plugin(
33 | name = "dagger-inject-adapter-processor",
34 | processor_class = "dagger.internal.codegen.InjectAdapterProcessor",
35 | deps = [
36 | "@maven//:com_squareup_dagger_dagger_compiler",
37 | ],
38 | )
39 |
40 | java_plugin(
41 | name = "dagger-module-adapter-processor",
42 | processor_class = "dagger.internal.codegen.ModuleAdapterProcessor",
43 | deps = [
44 | "@maven//:com_squareup_dagger_dagger_compiler",
45 | ],
46 | )
47 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # How to Contribute
2 |
3 | We'd love to accept your patches and contributions to this project. There are
4 | just a few small guidelines you need to follow.
5 |
6 | ## Contributor License Agreement
7 |
8 | Contributions to this project must be accompanied by a Contributor License
9 | Agreement. You (or your employer) retain the copyright to your contribution;
10 | this simply gives us permission to use and redistribute your contributions as
11 | part of the project. Head over to to see
12 | your current agreements on file or to sign a new one.
13 |
14 | You generally only need to submit a CLA once, so if you've already submitted one
15 | (even if it was for a different project), you probably don't need to do it
16 | again.
17 |
18 | ## Code reviews
19 |
20 | All submissions, including submissions by project members, require review. We
21 | use GitHub pull requests for this purpose. Consult
22 | [GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
23 | information on using pull requests.
24 |
25 | ## Community Guidelines
26 |
27 | This project follows
28 | [Google's Open Source Community Guidelines](https://opensource.google.com/conduct/).
29 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/AuthenticatorModule.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator;
18 |
19 | import android.content.Context;
20 | import com.google.android.apps.authenticator.barcode.BarcodeCaptureActivity;
21 | import com.google.android.apps.authenticator.barcode.BarcodeConditionChecker;
22 | import com.google.android.apps.authenticator.common.AndroidDependenciesModule;
23 | import com.google.android.apps.authenticator.common.ApplicationContext;
24 | import com.google.android.apps.authenticator.crypto.CryptoModule;
25 | import com.google.android.apps.authenticator.otp.OtpModule;
26 | import com.google.android.apps.authenticator.timesync.TimeSyncModule;
27 | import dagger.Module;
28 | import dagger.Provides;
29 | import javax.inject.Singleton;
30 |
31 | /**
32 | * Dagger injection module for Authenticator.
33 | */
34 | @Module(
35 | includes = {
36 | AndroidDependenciesModule.class,
37 | CryptoModule.class,
38 | OtpModule.class,
39 | TimeSyncModule.class,
40 | },
41 | injects = {
42 | AuthenticatorActivity.class,
43 | BarcodeCaptureActivity.class
44 | }
45 | )
46 | public class AuthenticatorModule {
47 | private Context applicationContext;
48 |
49 | // No arg constructor is needed for this module to be included from other modules
50 | public AuthenticatorModule() {}
51 |
52 | public AuthenticatorModule(Context applicationContext) {
53 | this.applicationContext = applicationContext;
54 | }
55 |
56 | @Provides @ApplicationContext
57 | public Context provideApplicationContext() {
58 | return applicationContext;
59 | }
60 |
61 | @Provides @Singleton
62 | public BarcodeConditionChecker provideBarcodeConditionChecker() {
63 | return new BarcodeConditionChecker();
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/barcode/BarcodeTracker.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.barcode;
18 |
19 | import com.google.android.gms.vision.Tracker;
20 | import com.google.android.gms.vision.barcode.Barcode;
21 |
22 | /**
23 | * Tracker used to receive notifications for a detected barcode over time. It can notify others
24 | * about detected barcodes using the {@link OnDetectionListener}.
25 | */
26 | class BarcodeTracker extends Tracker {
27 |
28 | /**
29 | * Listener interface used to supply data from a detected barcode.
30 | */
31 | public interface OnDetectionListener {
32 |
33 | /**
34 | * Called when a barcode is detected.
35 | *
36 | * The ID represents the specific detected barcode. If two different calls to this method
37 | * contain the same ID, it's because it has been determined that the new barcode was the same
38 | * barcode that was detected before.
39 | *
40 | * @param id ID representing the specified barcode.
41 | * @param barcode the barcode detected.
42 | */
43 | void onNewDetection(int id, Barcode barcode);
44 | }
45 |
46 | private OnDetectionListener onDetectionListener;
47 |
48 | /**
49 | * Sets a detection listener.
50 | */
51 | public void setDetectionListener(OnDetectionListener onDetectionListener) {
52 | this.onDetectionListener = onDetectionListener;
53 | }
54 |
55 | @Override
56 | public void onNewItem(int id, Barcode barcode) {
57 | if (onDetectionListener != null) {
58 | onDetectionListener.onNewDetection(id, barcode);
59 | }
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/common/AndroidDependenciesModule.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.common;
18 |
19 | import android.content.Context;
20 | import android.content.SharedPreferences;
21 | import android.os.Build.VERSION;
22 | import android.os.Build.VERSION_CODES;
23 | import android.preference.PreferenceManager;
24 | import com.google.android.apps.authenticator.time.Clock;
25 | import com.google.android.apps.authenticator.time.SystemWallClock;
26 | import com.google.android.apps.authenticator.util.permissions.AutoGrantPermissionRequestor;
27 | import com.google.android.apps.authenticator.util.permissions.PermissionRequestor;
28 | import com.google.android.apps.authenticator.util.permissions.RuntimePermissionRequestor;
29 | import dagger.Module;
30 | import dagger.Provides;
31 | import java.net.Authenticator;
32 | import javax.inject.Singleton;
33 |
34 | /**
35 | * Android framework dependencies module.
36 | */
37 | @Module(
38 | library = true,
39 | complete = false
40 | )
41 | public class AndroidDependenciesModule {
42 |
43 | @Provides @Singleton
44 | public SharedPreferences provideSharedPreferences(
45 | @ApplicationContext Context applicationContext) {
46 | return PreferenceManager.getDefaultSharedPreferences(applicationContext);
47 | }
48 |
49 | @Provides @Singleton
50 | public Clock provideClock() {
51 | return new SystemWallClock();
52 | }
53 |
54 | @Provides @Singleton
55 | public PermissionRequestor providesPermissionRequestor() {
56 | return VERSION.SDK_INT < VERSION_CODES.N
57 | ? new AutoGrantPermissionRequestor()
58 | : new RuntimePermissionRequestor();
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/common/ApplicationContext.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.common;
18 |
19 | import java.lang.annotation.Retention;
20 | import java.lang.annotation.RetentionPolicy;
21 |
22 | import javax.inject.Qualifier;
23 |
24 | /**
25 | * Annotation for requesting the application context.
26 | */
27 | @Qualifier
28 | @Retention(RetentionPolicy.RUNTIME)
29 | public @interface ApplicationContext {}
30 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/crypto/CryptoModule.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.crypto;
18 |
19 | import dagger.Module;
20 | import dagger.Provides;
21 |
22 | import java.security.MessageDigest;
23 | import java.security.NoSuchAlgorithmException;
24 |
25 | import javax.inject.Named;
26 |
27 | /**
28 | * Dagger module for crypto package.
29 | */
30 | @Module(
31 | library = true
32 | )
33 | public class CryptoModule {
34 |
35 | @Provides @Named("MD5")
36 | public MessageDigest provideMessageDigestMd5() {
37 | try {
38 | return MessageDigest.getInstance("MD5");
39 | } catch (NoSuchAlgorithmException e) {
40 | throw new RuntimeException(e);
41 | }
42 | }
43 |
44 | @Provides @Named("SHA256")
45 | public MessageDigest provideMessageDigestSha256() {
46 | try {
47 | return MessageDigest.getInstance("SHA256");
48 | } catch (NoSuchAlgorithmException e) {
49 | throw new RuntimeException(e);
50 | }
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/license/LicenseLoader.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (C) 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License
15 | */
16 |
17 | package com.google.android.apps.authenticator.license;
18 |
19 | import android.content.Context;
20 | import android.support.v4.content.AsyncTaskLoader;
21 | import com.google.android.apps.authenticator2.R;
22 | import java.util.List;
23 |
24 | /** {@link AsyncTaskLoader} to load the list of licenses for the license menu activity. */
25 | final class LicenseLoader extends AsyncTaskLoader> {
26 |
27 | private List licenses;
28 |
29 | LicenseLoader(Context context) {
30 | // This must only pass the application context to avoid leaking a pointer to the Activity.
31 | super(context.getApplicationContext());
32 | }
33 |
34 | @Override
35 | public List loadInBackground() {
36 | return Licenses.getLicenses(getContext());
37 | }
38 |
39 | @Override
40 | public void deliverResult(List licenses) {
41 | this.licenses = licenses;
42 | super.deliverResult(licenses);
43 | }
44 |
45 | @Override
46 | protected void onStartLoading() {
47 | if (licenses != null) {
48 | deliverResult(licenses);
49 | } else {
50 | forceLoad();
51 | }
52 | }
53 |
54 | @Override
55 | protected void onStopLoading() {
56 | cancelLoad();
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/otp/OtpModule.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.otp;
18 |
19 | import android.content.Context;
20 | import com.google.android.apps.authenticator.AuthenticatorActivity;
21 | import com.google.android.apps.authenticator.common.ApplicationContext;
22 | import com.google.android.apps.authenticator.time.Clock;
23 | import dagger.Module;
24 | import dagger.Provides;
25 | import javax.inject.Singleton;
26 |
27 | /**
28 | * Dagger module for the otp package.
29 | */
30 | @Module(
31 | library = true,
32 | complete = false
33 | )
34 | public class OtpModule {
35 |
36 | @Provides @Singleton
37 | public TotpClock providesTotpClock(@ApplicationContext Context applicationContext, Clock clock) {
38 | return new TotpClock(applicationContext, clock);
39 | }
40 |
41 | @Provides @Singleton
42 | public OtpSource providesOtpSource(AccountDb accountDb, TotpClock totpClock) {
43 | return new OtpProvider(accountDb, totpClock);
44 | }
45 |
46 | @Provides
47 | public TotpCounter providesTotpCounter(OtpSource otpSource) {
48 | return otpSource.getTotpCounter();
49 | }
50 |
51 | @Provides
52 | public TotpCountdownTask providesTotpCountdownTask(TotpCounter totpCounter, TotpClock totpClock) {
53 | return new TotpCountdownTask(totpCounter, totpClock,
54 | AuthenticatorActivity.TOTP_COUNTDOWN_REFRESH_PERIOD_MILLIS);
55 | }
56 |
57 | @Provides @Singleton
58 | public AccountDb providesAccountDb(@ApplicationContext Context applicationContext) {
59 | return new AccountDb(applicationContext);
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/otp/OtpSource.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.otp;
18 |
19 | import com.google.android.apps.authenticator.otp.AccountDb.AccountIndex;
20 |
21 | import java.util.List;
22 |
23 | /** Abstraction for collection of OTP tokens. */
24 | public interface OtpSource {
25 |
26 | /**
27 | * Enumerate list of accounts that this OTP token supports.
28 | */
29 | List enumerateAccounts();
30 |
31 | /**
32 | * Return the next OTP code for specified account.
33 | * Invoking this function may change internal state of the OTP generator,
34 | * for example advancing the counter.
35 | *
36 | * @return OTP as string code.
37 | */
38 | String getNextCode(AccountIndex account) throws OtpSourceException;
39 |
40 | /**
41 | * Generate response to a given challenge based on next OTP code.
42 | * Subclasses are not required to implement this method.
43 | *
44 | * @param account the unique index for the account.
45 | * @param challenge Server specified challenge as UTF8 string.
46 | * @return Response to the challenge.
47 | * @throws UnsupportedOperationException if the token does not support
48 | * challenge-response extension for this account.
49 | */
50 | String respondToChallenge(AccountIndex account, String challenge) throws OtpSourceException;
51 |
52 | /**
53 | * Gets the counter for generating or verifying TOTP codes.
54 | */
55 | TotpCounter getTotpCounter();
56 |
57 | /**
58 | * Gets the clock for generating or verifying TOTP codes.
59 | */
60 | TotpClock getTotpClock();
61 | }
62 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/otp/OtpSourceException.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.otp;
18 |
19 | /** Indicates that {@link OtpSource} failed to performed the requested operation. */
20 | public class OtpSourceException extends Exception {
21 | public OtpSourceException(String message) {
22 | super(message);
23 | }
24 |
25 | public OtpSourceException(String message, Throwable cause) {
26 | super(message, cause);
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/anim/deny_allow_seekbar.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
18 |
26 |
27 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/barcode_scanner_image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/barcode_scanner_image.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/ic_menu_grey400_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/ic_menu_grey400_24dp.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/ic_refresh_grey400_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/ic_refresh_grey400_24dp.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/ic_refresh_grey700_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/ic_refresh_grey700_24dp.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/product_logo_authenticator_color_144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/product_logo_authenticator_color_144.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/product_logo_authenticator_color_tablet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/product_logo_authenticator_color_tablet.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_account_circle_googblue_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_account_circle_googblue_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_add_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_add_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_content_copy_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_content_copy_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_delete_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_delete_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_edit_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_edit_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_highlight_off_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_highlight_off_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_history_googblue_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_history_googblue_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_keyboard_arrow_down_grey600_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_keyboard_arrow_down_grey600_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_keyboard_grey600_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_keyboard_grey600_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_lock_googblue_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_lock_googblue_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_lock_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_lock_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_navigate_next_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_navigate_next_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_phone_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_phone_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_photo_camera_grey600_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_photo_camera_grey600_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_refresh_black_48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_refresh_black_48.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_refresh_googblue_48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_refresh_googblue_48.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_refresh_grey600_48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_refresh_grey600_48.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_report_problem_grey600_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_report_problem_grey600_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_vpn_key_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-hdpi/quantum_ic_vpn_key_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-ldrtl-hdpi/quantum_ic_content_copy_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-ldrtl-hdpi/quantum_ic_content_copy_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-ldrtl-mdpi/quantum_ic_content_copy_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-ldrtl-mdpi/quantum_ic_content_copy_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-ldrtl-xhdpi/quantum_ic_content_copy_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-ldrtl-xhdpi/quantum_ic_content_copy_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-ldrtl-xxhdpi/quantum_ic_content_copy_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-ldrtl-xxhdpi/quantum_ic_content_copy_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-ldrtl-xxxhdpi/quantum_ic_content_copy_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-ldrtl-xxxhdpi/quantum_ic_content_copy_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-mdpi/product_logo_authenticator_color_144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-mdpi/product_logo_authenticator_color_144.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_account_circle_googblue_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_account_circle_googblue_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_add_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_add_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_content_copy_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_content_copy_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_delete_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_delete_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_edit_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_edit_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_highlight_off_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_highlight_off_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_history_googblue_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_history_googblue_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_keyboard_arrow_down_grey600_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_keyboard_arrow_down_grey600_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_keyboard_grey600_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_keyboard_grey600_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_lock_googblue_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_lock_googblue_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_lock_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_lock_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_navigate_next_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_navigate_next_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_phone_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_phone_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_photo_camera_grey600_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_photo_camera_grey600_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_refresh_black_48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_refresh_black_48.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_refresh_googblue_48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_refresh_googblue_48.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_refresh_grey600_48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_refresh_grey600_48.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_report_problem_grey600_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_report_problem_grey600_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_vpn_key_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-mdpi/quantum_ic_vpn_key_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/barcode_scanner_image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/barcode_scanner_image.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/howitworks_image_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/howitworks_image_1.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/howitworks_image_1_tablet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/howitworks_image_1_tablet.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/howitworks_image_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/howitworks_image_2.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/howitworks_image_2_tablet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/howitworks_image_2_tablet.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/howitworks_image_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/howitworks_image_3.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/howitworks_image_3_tablet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/howitworks_image_3_tablet.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/ic_enroll2sv_account.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/ic_enroll2sv_account.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/ic_menu_grey400_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/ic_menu_grey400_24dp.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/ic_refresh_grey400_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/ic_refresh_grey400_24dp.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/ic_refresh_grey700_24dp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/ic_refresh_grey700_24dp.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/product_logo_authenticator_color_144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/product_logo_authenticator_color_144.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_account_circle_googblue_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_account_circle_googblue_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_add_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_add_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_content_copy_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_content_copy_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_delete_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_delete_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_edit_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_edit_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_highlight_off_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_highlight_off_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_history_googblue_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_history_googblue_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_keyboard_arrow_down_grey600_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_keyboard_arrow_down_grey600_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_keyboard_grey600_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_keyboard_grey600_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_lock_googblue_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_lock_googblue_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_lock_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_lock_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_navigate_next_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_navigate_next_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_phone_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_phone_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_photo_camera_grey600_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_photo_camera_grey600_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_refresh_black_48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_refresh_black_48.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_refresh_googblue_48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_refresh_googblue_48.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_refresh_grey600_48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_refresh_grey600_48.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_report_problem_grey600_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_report_problem_grey600_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_vpn_key_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xhdpi/quantum_ic_vpn_key_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/product_logo_authenticator_color_144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/product_logo_authenticator_color_144.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_account_circle_googblue_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_account_circle_googblue_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_add_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_add_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_content_copy_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_content_copy_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_delete_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_delete_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_edit_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_edit_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_highlight_off_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_highlight_off_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_history_googblue_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_history_googblue_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_keyboard_arrow_down_grey600_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_keyboard_arrow_down_grey600_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_keyboard_grey600_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_keyboard_grey600_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_lock_googblue_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_lock_googblue_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_lock_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_lock_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_navigate_next_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_navigate_next_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_phone_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_phone_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_photo_camera_grey600_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_photo_camera_grey600_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_refresh_black_48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_refresh_black_48.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_refresh_googblue_48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_refresh_googblue_48.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_refresh_grey600_48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_refresh_grey600_48.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_report_problem_grey600_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_report_problem_grey600_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_vpn_key_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxhdpi/quantum_ic_vpn_key_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/product_logo_authenticator_color_144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/product_logo_authenticator_color_144.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_account_circle_googblue_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_account_circle_googblue_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_add_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_add_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_content_copy_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_content_copy_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_delete_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_delete_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_edit_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_edit_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_highlight_off_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_highlight_off_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_history_googblue_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_history_googblue_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_keyboard_arrow_down_grey600_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_keyboard_arrow_down_grey600_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_keyboard_grey600_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_keyboard_grey600_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_lock_googblue_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_lock_googblue_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_lock_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_lock_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_navigate_next_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_navigate_next_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_phone_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_phone_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_photo_camera_grey600_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_photo_camera_grey600_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_refresh_black_48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_refresh_black_48.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_refresh_googblue_48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_refresh_googblue_48.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_refresh_grey600_48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_refresh_grey600_48.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_report_problem_grey600_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_report_problem_grey600_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_vpn_key_white_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/drawable-xxxhdpi/quantum_ic_vpn_key_white_24.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable/refresh_button.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
18 |
20 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable/refresh_button_dark.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
18 |
20 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable/toolbar_shadow.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 |
22 |
23 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable/user_row_dragged_shadow_bottom.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 |
22 |
23 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable/user_row_dragged_shadow_bottom_dark.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 |
22 |
23 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable/user_row_dragged_shadow_top.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 |
22 |
23 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable/user_row_dragged_shadow_top_dark.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 |
22 |
23 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable/user_row_selector.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
18 |
20 |
22 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/drawable/user_row_selector_dark.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
18 |
20 |
22 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/layout/barcode_capture_activity.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
23 |
27 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/layout/dummy_placeholder.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
18 |
22 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/layout/license.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
24 |
25 |
39 |
40 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/layout/license_menu_activity.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
22 |
23 |
36 |
37 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/layout/license_scrollview.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
21 |
22 |
32 |
33 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/layout/listitem_device.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
21 |
25 |
29 |
30 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/layout/opensource_notices.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
21 |
23 |
26 |
27 |
31 |
32 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/layout/rename.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
22 |
23 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/layout/two_step_verification_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
21 |
24 |
27 |
28 |
34 |
35 |
40 |
41 |
42 |
51 |
52 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/layout/user_row_dragged.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
20 |
25 |
29 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/menu/account_list_context.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
32 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/menu/add_account.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
27 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/menu/main.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
29 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/mipmap-hdpi/product_logo_authenticator_launcher_color_48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/mipmap-hdpi/product_logo_authenticator_launcher_color_48.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/mipmap-mdpi/product_logo_authenticator_launcher_color_48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/mipmap-mdpi/product_logo_authenticator_launcher_color_48.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/mipmap-xhdpi/product_logo_authenticator_launcher_color_48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/mipmap-xhdpi/product_logo_authenticator_launcher_color_48.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/mipmap-xxhdpi/product_logo_authenticator_launcher_color_48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/mipmap-xxhdpi/product_logo_authenticator_launcher_color_48.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/mipmap-xxxhdpi/product_logo_authenticator_launcher_color_48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/google/google-authenticator-android/6f65e99fcbc9bbefdc3317c008345db595052a2b/java/com/google/android/apps/authenticator/res/mipmap-xxxhdpi/product_logo_authenticator_launcher_color_48.png
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/raw/third_party_license_metadata:
--------------------------------------------------------------------------------
1 | 0:10695 Android Arch Common
2 | 0:10695 Android Arch Runtime
3 | 0:10695 Android Lifecycle Common
4 | 0:10695 Android Lifecycle LiveData
5 | 0:10695 Android Lifecycle LiveData Core
6 | 0:10695 Android Lifecycle Runtime
7 | 0:10695 Android Lifecycle ViewModel
8 | 0:10695 Android Support AnimatedVectorDrawable
9 | 0:10695 Android AppCompat Library V7
10 | 0:10695 Android Support Library Async Layout Inflater
11 | 0:10695 Android Support CardView V7
12 | 0:10695 Android Support Library Collections
13 | 0:10695 Android Support Library Coordinator Layout
14 | 0:10695 Android Support Library Cursor Adapter
15 | 0:10695 Android Support Library Custom View
16 | 0:10695 Material Components For Android
17 | 0:10695 Android Support Library Document File
18 | 0:10695 Android Support Library Drawer Layout
19 | 0:10695 Android Support Library Interpolators
20 | 0:10695 Android Support Library Loader
21 | 0:10695 Android Support Library Local Broadcast Manager
22 | 0:10695 Android Multi Dex Library
23 | 0:10695 Android Support Library Print
24 | 0:10695 Android Support RecyclerView V7
25 | 0:10695 Android Support Library Sliding Pane Layout
26 | 0:10695 Android Support Library Annotations
27 | 0:10695 Android Support Library Compat
28 | 0:10695 Android Support Library Core UI
29 | 0:10695 Android Support Library Core Utilities
30 | 0:10695 Android Support Library Fragment
31 | 0:10695 Android Support Library Media Compat
32 | 0:10695 Android Support Library V4
33 | 0:10695 Android Support VectorDrawable
34 | 0:10695 Android Support Library Custom View
35 | 0:10695 Android Transition Support Library
36 | 0:10695 VersionedParcelable and Friends
37 | 0:10695 Android Support Library View Pager
38 | 0:10695 DragSortListView
39 | 520:10175 Error Prone
40 | 520:10175 Guava
41 | 520:10175 J2ObjC
42 | 520:10175 Dagger
43 | 520:10175 JSR330
44 | 10695:16013 Android SDK
45 | 26708:1588 JSR305
46 | 28296:1075 Animal Sniffer
47 | 29371:1845 Checker Framework Annotations
48 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values-am/timesync_strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 | "ለኮዶች የሰዓት ማስተካከያ"
20 | "አሁን አመሳስል"
21 | "ስለዚህ ባህርይ"
22 | "አሁን አመሳስል"
23 | "አሁን አመሳስል"
24 | "ከአገልጋይ ጋር በመገናኘት ላይ…"
25 | "ሰዓት ተስተካክሏል"
26 | "የአረጋጋጭ ውስጣዊ ሰዓት የGoogle አገልጋዮች ከሚሰጡት ሰዓት ጋር እንዲገጣጠም ተብሎ ተስተካክሏል። \n\nበዚህ መሣሪያ ላይ ያሉት የቀን እና ሰዓት ቅንብሮች አልተቀየሩም።"
27 | "ሰዓት አስቀድሞ ትክክል ነው"
28 | "አረጋጋጭ ከGoogle አገልጋዮች ጋር አስቀድሞ የተመሳሰለ ሆኖ ስለሚታይ ውስጣዊ ሰዓቱ አልተስተካከለም።"
29 | "አሁን አመሳስል"
30 | "የGoogle አገልጋይ ማግኘት ላይ ችግር ነበር። እባክህ የአውታረ መረብህን ግንኙነት አረጋግጥና እንደገና ሞክር።"
31 |
32 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values-ar/timesync_strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 | "التصحيح الزمني للرموز"
20 | "مزامنة الآن"
21 | "حول هذه الميزة"
22 | "مزامنة الآن"
23 | "مزامنة الآن"
24 | "جارٍ الاتصال بالخادم..."
25 | "تم تصحيح الوقت"
26 | "تم ضبط الساعة الداخلية لأداة المزامنة لتطابق الوقت الذي توفره خوادم Google. \n\nلم يتم تغيير إعدادات \"الوقت والتاريخ\" على هذا الجهاز."
27 | "الوقت صحيح فعلاً"
28 | "لم يتم ضبط الساعة الداخلية لأداة المصادقة نظرًا لأنها تتم مزامنتها مع خوادم Google فعلاً."
29 | "مزامنة الآن"
30 | "حدثت مشكلة أثناء الاتصال بخادم Google. يُرجى التحقق من إعدادات الشبكة وإعادة المحاولة."
31 |
32 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values-be-rBY/timesync_strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 | "Карэкцыя часу для кодаў"
20 | "Сінхранізаваць"
21 | "Пра гэту функцыю"
22 | "Сінхранізацыя"
23 | "Сінхранізацыя"
24 | "Ідзе падключэнне да сервера…"
25 | "Час выпраўлены"
26 | "Унутраны гадзіннік праграмы Authenticator быў выпраўлены і цяпер адпавядае часу на серверах Google. \n\nНалады даты і часу на гэтай прыладзе не былі зменены."
27 | "Час ужо правільны"
28 | "Унутраны гадзіннік праграмы Authenticator не быў выпраўлены, таму што ён ужо сінхранізаваны з серверамі Google."
29 | "Сінхранізацыя"
30 | "Пры спробе звязацца з серверам Google узнікла праблема. Праверце налады сеткі і паўтарыце спробу."
31 |
32 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values-en-rAU/timesync_strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 | "Time correction for codes"
20 | "Sync now"
21 | "About this feature"
22 | "Sync Now"
23 | "Sync now"
24 | "Connecting to server"
25 | "Time corrected"
26 | "Authenticator\'s internal clock has been adjusted to match the time provided by Google servers. \n\nThe Date & Time settings on this device have not been changed."
27 | "Time already correct"
28 | "Authenticator\'s internal clock was not adjusted because it appears to already be in sync with Google servers."
29 | "Sync Now"
30 | "There was a problem contacting Google\'s server. Please check your network settings and try again."
31 |
32 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values-en-rGB/timesync_strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 | "Time correction for codes"
20 | "Sync now"
21 | "About this feature"
22 | "Sync Now"
23 | "Sync now"
24 | "Connecting to server"
25 | "Time corrected"
26 | "Authenticator\'s internal clock has been adjusted to match the time provided by Google servers. \n\nThe Date & Time settings on this device have not been changed."
27 | "Time already correct"
28 | "Authenticator\'s internal clock was not adjusted because it appears to already be in sync with Google servers."
29 | "Sync Now"
30 | "There was a problem contacting Google\'s server. Please check your network settings and try again."
31 |
32 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values-en-rIN/timesync_strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 | "Time correction for codes"
20 | "Sync now"
21 | "About this feature"
22 | "Sync Now"
23 | "Sync now"
24 | "Connecting to server"
25 | "Time corrected"
26 | "Authenticator\'s internal clock has been adjusted to match the time provided by Google servers. \n\nThe Date & Time settings on this device have not been changed."
27 | "Time already correct"
28 | "Authenticator\'s internal clock was not adjusted because it appears to already be in sync with Google servers."
29 | "Sync Now"
30 | "There was a problem contacting Google\'s server. Please check your network settings and try again."
31 |
32 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values-fa/timesync_strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 | "اصلاح زمان برای کدها"
20 | "اکنون همگامسازی شود"
21 | "دربارهٔ این ویژگی"
22 | "اکنون همگامسازی شود"
23 | "اکنون همگامسازی شود"
24 | "اتصال به سرور..."
25 | "زمان اصلاح شد"
26 | "ساعت داخلی Authenticator تنظیم شده است تا با زمان ارائه شده توسط سرورهای Google هماهنگ شود.\n\n تنظیمات تاریخ و زمان این دستگاه تغییر نکرده است."
27 | "زمان در حال حاضر درست است"
28 | "ساعت داخلی Authenticator تنظیم نشد چون به نظر میرسد از قبل با سرورهای Google همگامسازی میشود."
29 | "اکنون همگامسازی شود"
30 | "در تماس با سرور Google مشکلی وجود داشت. لطفاً تنظیمات شبکه خود را بررسی کنید و دوباره امتحان کنید."
31 |
32 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values-fi/timesync_strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 | "Koodien aikakorjaus"
20 | "Synkronoi nyt"
21 | "Tietoja tästä ominaisuudesta"
22 | "Synkronoi nyt"
23 | "Synkronoi nyt"
24 | "Muodostetaan yhteyttä palvelimeen..."
25 | "Aika korjattu"
26 | "Authenticatorin sisäinen kello on muutettu vastaamaan Googlen palvelimien tarjoamaa aikaa. \n\nLaitteen päivämäärä- ja aika-asetuksia ei ole muutettu."
27 | "Aika on jo oikea"
28 | "Authenticatorin sisäistä kelloa ei säädetty, koska se vaikuttaa olevan synkronoitu Googlen palvelimien kanssa."
29 | "Synkronoi nyt"
30 | "Ongelma Googlen palvelinyhteydessä. Tarkista verkon asetukset ja yritä uudelleen."
31 |
32 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values-iw/timesync_strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 | "תיקון שעה לקודים"
20 | "סנכרן עכשיו"
21 | "מידע על תכונה זו"
22 | "סנכרן עכשיו"
23 | "סנכרן עכשיו"
24 | "מתחבר לשרת…"
25 | "השעה תוקנה"
26 | "השעון הפנימי של המאמת הותאם כדי שיהיה תואם לשעה שמספקים שרתי Google. \n \n הגדרות התאריך והשעה במכשיר זה לא שונו."
27 | "השעה כבר נכונה"
28 | "השעון הפנימי של המאמת לא הותאם מפני שעושה רושם שהוא כבר מסונכרן עם השרתים של Google."
29 | "סנכרן עכשיו"
30 | "אירעה בעיה ביצירת קשר עם השרת של Google. בדוק את הגדרות הרשת שלך ונסה שוב."
31 |
32 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values-ja/timesync_strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 | "コードの時刻調整"
20 | "今すぐ同期"
21 | "この機能について"
22 | "今すぐ同期"
23 | "今すぐ同期"
24 | "サーバーに接続中..."
25 | "時刻を調整しました"
26 | "認証システムの内部クロックがGoogleサーバーの時刻に合わせて調整されました。\n\nこの端末の日付/時刻設定は変更されていません。"
27 | "時刻は調整済みです"
28 | "認証システムの内部クロックは調整されませんでした。既にGoogleサーバーと同期済みです。"
29 | "今すぐ同期"
30 | "Googleのサーバーとの接続に問題が発生しました。ネットワーク設定を確認してもう一度お試しください。"
31 |
32 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values-ko/timesync_strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 | "코드에 맞게 시간 수정"
20 | "지금 동기화"
21 | "기능 정보"
22 | "지금 동기화"
23 | "지금 동기화"
24 | "서버에 연결 중…"
25 | "시간 수정됨"
26 | "Google 서버에서 제공한 시간과 일치하도록 OTP의 내부 시계가 조정되었습니다. \n\n이 기기의 날짜 및 시간 설정이 변경되지 않았습니다."
27 | "시간이 이미 정확함"
28 | "OTP의 내부 시계가 조정되지 않았습니다. Google 서버와 이미 동기화된 것 같습니다."
29 | "지금 동기화"
30 | "Google 서버에 접속하는 중에 문제가 발생했습니다. 네트워크 설정을 확인한 다음 다시 시도하세요."
31 |
32 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values-nb/timesync_strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 | "Tidskorrigering for koder"
20 | "Synkroniser nå"
21 | "Om denne funksjonen"
22 | "Synkroniser nå"
23 | "Synkroniser nå"
24 | "Kobler til tjener ..."
25 | "Klokken ble stilt"
26 | "Google Autentiserings interne klokke ble stilt etter Google-tjenerne. \n\nDato og tid-innstillingene på denne enheten har ikke blitt endret."
27 | "Klokken er allerede riktig"
28 | "Google Autentiserings interne klokke ble ikke stilt fordi den ser ut til å allerede gå likt med Googles tjenerne."
29 | "Synkroniser nå"
30 | "Kunne ikke kontakte Googles tjener. Kontrollér nettverksinnstillingene dine og prøv på nytt."
31 |
32 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values-ne-rNP/timesync_strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 | "कोडहरूका लागि समय सुधार"
20 | "अब सिंक गर्नुहोस्"
21 | "यो सुविधाको बारेमा"
22 | "अब सिंक गर्नुहोस्"
23 | "अब सिंक गर्नुहोस्"
24 | "सर्भरसँग जडान गर्दै..."
25 | "समय सुधारियो"
26 | "प्रमाणक आन्तरिक घडि Google सर्भर द्वारा प्रदान गरिएको समय जोडा समायोजित गरिएको छ। \n\n यस उपकरणमा तिथि र समय सेटिङ्स परिवर्तन गरिएको छैन।"
27 | "समय पहिले देखि नै सहि छ।"
28 | "प्रमाणिकरणकर्ताको आन्तरिक घडि समायोजन भएको थिएन किनकि यो Google सर्वरसँग पहिले नै सिंक भएको देखियो।"
29 | "अब सिंक गर्नुहोस्"
30 | "Google सर्भरसँग सम्पर्कगर्दा समस्या आएको छ। आफ्नो सञ्जाल सेटिङ्ग्स जाँच गरि फेरि प्रयास गर्नुहोला।"
31 |
32 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values-si-rLK/timesync_strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 | "කේත සඳහා වේලාව නිවැරදි කිරීම"
20 | "සමමුහුර්ත කරන්න"
21 | "මෙම අංගය පිළිබඳ විස්තර"
22 | "සමමුහුර්ත කරන්න"
23 | "සමමුහුර්ත කරන්න"
24 | "සේවාදායකයට සම්බන්ධ වෙමින්..."
25 | "වේලාව නිවැරදි කරන ලදි"
26 | "සත්යාපකයේ අන්තර් ඔරලෝසුව Google සේවාදායක සපයන වේලාවට ගලපා ඇත. \n\n උපාංගයේ දවස & සහ වේලාව පිළිබඳ සිටුවම් වෙනස් කළේ නැත."
27 | "වේලාව දැනටමත් නිවැරදියි"
28 | "සත්යාපකයේ අන්තර් ඔරලෝසුව Google සේවාදායක සමඟ දැනටමත් සමමුහුර්තක නිසා එය වෙනස් කරේ නැත."
29 | "සමමුහුර්ත කරන්න"
30 | "Google සේවාදායකය සමඟ සම්බන්ධ වීමේ ගැටලුවක් ඇත. කරුණාකර ඔබගෙ ජාල සිටුවම් පරික්ෂා කර නැවත උත්සාහ කරන්න."
31 |
32 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values-sw600dp/dimen.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
18 |
19 |
20 | 64dp
21 |
22 |
23 | 64dp
24 | 500dp
25 | 440dp
26 | 250dp
27 |
28 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values-sw600dp/others.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
18 |
19 |
20 | true
21 |
22 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values-th/timesync_strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 | "การแก้ไขเวลาให้ถูกต้องเพื่อรับรหัส"
20 | "ซิงค์เลย"
21 | "เกี่ยวกับฟีเจอร์นี้"
22 | "ซิงค์เลย"
23 | "ซิงค์เลย"
24 | "กำลังเชื่อมต่อกับเซิร์ฟเวอร์…"
25 | "แก้ไขเวลาให้ถูกต้องแล้ว"
26 | "ปรับนาฬิกาภายในของ Authenticator ให้ตรงกับเวลาของเซิร์ฟเวอร์ของ Google \n\nการตั้งค่าวันที่และเวลาบนอุปกรณ์นี้ไม่มีการเปลี่ยนแปลง"
27 | "เวลาถูกต้องอยู่แล้ว"
28 | "ไม่ได้ปรับนาฬิกาภายในของ Authenticator เพราะดูเหมือนว่าจะถูกซิงค์กับเซิร์ฟเวอร์ของ Google อยู่แล้ว"
29 | "ซิงค์เลย"
30 | "เกิดปัญหาในการติดต่อกับเซิร์ฟเวอร์ของ Google โปรดตรวจสอบการตั้งค่าเครือข่ายของคุณและลองอีกครั้ง"
31 |
32 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values-uz-rUZ/timesync_strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 | "Kodlar uchun vaqtni to‘g‘rilash"
20 | "Sinxronlash"
21 | "Bu funksiya haqida"
22 | "Sinxronlash"
23 | "Sinxronlash"
24 | "Serverga ulanilmoqda…"
25 | "Vaqt tuzatildi"
26 | "Authenticator ilovasining ichki soati Google serverlaridagi vaqtga mos sozlangan. \n\nBu qurilmadagi sozlamalar o‘zgartirilmagan."
27 | "Vaqt to‘g‘ri sozlangan"
28 | "Authenticator ilovasining ichki soati allaqachon Google serverlari bilan sinxronlanganligi uchun sozlamalar o‘zgartirilmadi."
29 | "Sinxronlash"
30 | "Google serverlariga ulanishda muammo yuz berdi. Tarmoq sozlamalarini tekshirib, qaytadan urinib ko‘ring."
31 |
32 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values-v21/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
18 |
19 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values-zh-rCN/timesync_strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 | "校正用来生成验证码的时间"
20 | "立即同步"
21 | "关于此功能"
22 | "立即同步"
23 | "立即同步"
24 | "正在连接服务器…"
25 | "时间已校正"
26 | "身份验证器的内部时钟已按照 Google 服务器提供的时间进行调整。\n\n此设备上的日期和时间设置未更改。"
27 | "时间已正确"
28 | "身份验证器的内部时钟未作调整,因为该时钟已经与 Google 服务器同步。"
29 | "立即同步"
30 | "与 Google 服务器联系时出现问题。请检查您的网络设置,然后重试。"
31 |
32 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values-zh-rHK/timesync_strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 | "修正時間以供驗證碼之用"
20 | "立即同步"
21 | "關於這項功能"
22 | "立即同步"
23 | "立即同步"
24 | "正在連接到伺服器..."
25 | "時間已修正"
26 | "Authenticator 的內部時鐘已經調整,以配合由 Google 伺服器所提供的時間。\n\n此裝置上的日期和時間設定並未變更。"
27 | "時間已經是正確的"
28 | "Authenticator 的內部時鐘並無作出調整,原因是它似乎已經與 Google 伺服器保持同步。"
29 | "立即同步"
30 | "連線到 Google 伺服器時發生問題。請檢查您的互聯網設定並再試一次。"
31 |
32 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values-zh-rTW/timesync_strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
19 | "驗證碼時間修正"
20 | "立即同步處理"
21 | "關於這項功能"
22 | "立即同步處理"
23 | "立即同步處理"
24 | "正在連線到伺服器…"
25 | "時間已修正"
26 | "系統已按照 Google 伺服器的時間調整了 Authenticator 的內部時鐘。\n\n這個裝置的「日期和時間」設定並未變更。"
27 | "時間正確"
28 | "Authenticator 已和 Google 伺服器同步處理完成,因此系統未調整 Authenticator 內部時鐘。"
29 | "立即同步處理"
30 | "連線到 Google 伺服器時發生問題,請檢查您的網路設定,然後再試一次。"
31 |
32 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values/attrs.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values/dimen.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
18 |
19 |
20 | 0dp
21 | 6dp
22 | 56dp
23 | 4dp
24 |
25 |
26 | 56dp
27 |
28 |
29 | 4dp
30 | 6dp
31 | 4dp
32 | 4dp
33 | 50dp
34 |
35 |
36 | 12dp
37 | 76dp
38 | 0dp
39 | 0dp
40 |
41 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/values/others.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
18 |
19 |
20 | false
21 |
22 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/xml/preferences.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
18 |
19 |
22 |
23 |
24 |
25 |
26 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/xml/preferences_about.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
18 |
23 |
24 |
26 |
27 |
29 |
30 |
31 |
33 |
34 |
36 |
37 |
38 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/res/xml/preferences_time_correction.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
18 |
21 |
22 |
23 |
26 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/settings/SettingsAboutActivity.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.settings;
18 |
19 | import android.content.pm.PackageManager.NameNotFoundException;
20 | import android.os.Bundle;
21 | import com.google.android.apps.authenticator.testability.TestablePreferenceActivity;
22 | import com.google.android.apps.authenticator.util.annotations.FixWhenMinSdkVersion;
23 | import com.google.android.apps.authenticator2.R;
24 |
25 | /** Activity that displays the "About" preferences. */
26 | public class SettingsAboutActivity extends TestablePreferenceActivity {
27 |
28 | @FixWhenMinSdkVersion(11) @SuppressWarnings("deprecation")
29 | @Override
30 | protected void onCreate(Bundle savedInstanceState) {
31 | super.onCreate(savedInstanceState);
32 |
33 | addPreferencesFromResource(R.xml.preferences_about);
34 |
35 | try {
36 | String packageVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
37 | findPreference("version").setSummary(packageVersion);
38 | } catch (NameNotFoundException e) {
39 | throw new RuntimeException(e);
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/settings/SettingsActivity.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.settings;
18 |
19 | import android.os.Bundle;
20 | import com.google.android.apps.authenticator.testability.TestablePreferenceActivity;
21 | import com.google.android.apps.authenticator.util.annotations.FixWhenMinSdkVersion;
22 | import com.google.android.apps.authenticator2.R;
23 |
24 | /** Top-level preferences Activity. */
25 | public class SettingsActivity extends TestablePreferenceActivity {
26 |
27 | @FixWhenMinSdkVersion(11) @SuppressWarnings("deprecation")
28 | @Override
29 | protected void onCreate(Bundle savedInstanceState) {
30 | super.onCreate(savedInstanceState);
31 |
32 | addPreferencesFromResource(R.xml.preferences);
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/testability/DaggerInjector.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.testability;
18 |
19 | import android.util.Log;
20 |
21 | import dagger.ObjectGraph;
22 |
23 | import javax.annotation.Nullable;
24 |
25 | /** Dependency injector using dagger. */
26 | public class DaggerInjector {
27 |
28 | private static final String TAG = DaggerInjector.class.getSimpleName();
29 |
30 | @Nullable
31 | private static volatile ObjectGraph mObjectGraph;
32 |
33 | /**
34 | * Initializes dagger injector with the application module.
35 | *
36 | *
If module is {@code null} this disables Dagger injection (for unit tests).
37 | */
38 | public static void init(Object module) {
39 | mObjectGraph = module != null ? ObjectGraph.create(module) : null;
40 | }
41 |
42 | /** Injects this instance */
43 | public static void inject(Object instance) {
44 | if (mObjectGraph == null) {
45 | // This should happen only during unit tests
46 | Log.w(TAG, "Dagger injection has not been initialized!");
47 | return;
48 | }
49 |
50 | mObjectGraph.inject(instance);
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/testability/SharedPreferencesRenamingDelegatingContext.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.testability;
18 |
19 | import android.content.Context;
20 | import android.content.ContextWrapper;
21 | import android.content.SharedPreferences;
22 |
23 | /**
24 | * {@link ContextWrapper} that prefixes shared preference file names with the provided prefix and
25 | * passes all other invocations through unmodified to the delegate {@link Context}.
26 | */
27 | public class SharedPreferencesRenamingDelegatingContext extends ContextWrapper {
28 |
29 | private final String mPrefix;
30 |
31 | public SharedPreferencesRenamingDelegatingContext(Context delegate, String prefix) {
32 | super(delegate);
33 | mPrefix = prefix;
34 | }
35 |
36 | @Override
37 | public SharedPreferences getSharedPreferences(String name, int mode) {
38 | return super.getSharedPreferences(mPrefix + name, mode);
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/testability/StartActivityListener.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.testability;
18 |
19 | import android.content.Context;
20 | import android.content.Intent;
21 |
22 | /**
23 | * Listener which is invoked when an attempt is made to launch an {@link android.app.Activity} via
24 | * {@link Context#startActivity(Intent)} or
25 | * {@link android.app.Activity#startActivityForResult(Intent, int)}.
26 | * The listener can decide whether to proceed with the launch.
27 | *
28 | * @see StartServiceListener
29 | */
30 | public interface StartActivityListener {
31 |
32 | /**
33 | * Invoked when a launch of an {@link android.app.Activity} is requested.
34 | *
35 | * @return {@code true} to consume/ignore the request, {@code false} to proceed with the launching
36 | * of the {@code Activity}.
37 | */
38 | boolean onStartActivityInvoked(Context sourceContext, Intent intent);
39 | }
40 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/testability/StartServiceListener.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.testability;
18 |
19 | import android.content.Context;
20 | import android.content.Intent;
21 |
22 | /**
23 | * Listener which is invoked when an attempt is made to launch a service via
24 | * {@link Context#startService(Intent)}. The listener can decide whether to proceed with the launch
25 | * or not.
26 | *
27 | * @see StartActivityListener
28 | */
29 | public interface StartServiceListener {
30 |
31 | /**
32 | * Invoked when a service startup is requested.
33 | *
34 | * @return {@code true} to consume/ignore the request, {@code false} to proceed with the launching
35 | * of the service.
36 | */
37 | boolean onStartServiceInvoked(Context sourceContext, Intent intent);
38 | }
39 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/testability/TestableActivity.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.testability;
18 |
19 | import android.content.ComponentName;
20 | import android.content.Intent;
21 | import android.support.v7.app.AppCompatActivity;
22 |
23 | /** Base class for {@link AppCompatActivity} instances to make them more testable. */
24 | public class TestableActivity extends AppCompatActivity {
25 |
26 |
27 | @Override
28 | public void startActivity(Intent intent) {
29 | StartActivityListener listener = DependencyInjector.getStartActivityListener();
30 | if ((listener != null) && (listener.onStartActivityInvoked(this, intent))) {
31 | return;
32 | }
33 |
34 | super.startActivity(intent);
35 | }
36 |
37 | @Override
38 | public void startActivityForResult(Intent intent, int requestCode) {
39 | StartActivityListener listener = DependencyInjector.getStartActivityListener();
40 | if ((listener != null) && (listener.onStartActivityInvoked(this, intent))) {
41 | return;
42 | }
43 |
44 | super.startActivityForResult(intent, requestCode);
45 | }
46 |
47 | @Override
48 | public ComponentName startService(Intent intent) {
49 | StartServiceListener listener = DependencyInjector.getStartServiceListener();
50 | if ((listener != null) && (listener.onStartServiceInvoked(this, intent))) {
51 | return null;
52 | }
53 |
54 | return super.startService(intent);
55 | }
56 |
57 | /** See {@link AppCompatActivity#setResult(int, Intent)} */
58 | public void setActivityResult(int resultCode, Intent data) {
59 | super.setResult(resultCode, data);
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/testability/TestablePreferenceActivity.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.testability;
18 |
19 | import android.content.ComponentName;
20 | import android.content.Intent;
21 | import com.google.android.apps.authenticator.settings.AppCompatPreferenceActivity;
22 |
23 | /** Base class for {@link AppCompatPreferenceActivity} instances to make them more testable. */
24 | public class TestablePreferenceActivity extends AppCompatPreferenceActivity {
25 |
26 | @Override
27 | public void startActivity(Intent intent) {
28 | StartActivityListener listener = DependencyInjector.getStartActivityListener();
29 | if ((listener != null) && (listener.onStartActivityInvoked(this, intent))) {
30 | return;
31 | }
32 |
33 | super.startActivity(intent);
34 | }
35 |
36 | @Override
37 | public void startActivityForResult(Intent intent, int requestCode) {
38 | StartActivityListener listener = DependencyInjector.getStartActivityListener();
39 | if ((listener != null) && (listener.onStartActivityInvoked(this, intent))) {
40 | return;
41 | }
42 |
43 | super.startActivityForResult(intent, requestCode);
44 | }
45 |
46 | @Override
47 | public ComponentName startService(Intent intent) {
48 | StartServiceListener listener = DependencyInjector.getStartServiceListener();
49 | if ((listener != null) && (listener.onStartServiceInvoked(this, intent))) {
50 | return null;
51 | }
52 |
53 | return super.startService(intent);
54 | }
55 |
56 | @Override
57 | protected boolean isValidFragment(String fragmentName) {
58 | // PreferenceActivity is vulnerable to Fragment Injection prior to KitKat
59 | // (http://goo.gl/jz36Ip)
60 | // Override this to always return false as we do not use Fragment for Preference.
61 | return false;
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/time/Clock.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.time;
18 |
19 | /** Provides the current value of "now" to improve testability. */
20 | public interface Clock {
21 | /** Gets the current time in milliseconds. */
22 | long nowMillis();
23 | }
24 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/time/SystemWallClock.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.time;
18 |
19 | /**
20 | * Standard "wall" clock expressing milliseconds since the UNIX epoch.
21 | *
22 | *
This is equivalent to {@link System#currentTimeMillis()}.
23 | */
24 | public class SystemWallClock implements Clock {
25 | @Override
26 | public long nowMillis() {
27 | return System.currentTimeMillis();
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/timesync/HttpURLConnectionFactory.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.timesync;
18 |
19 | import java.io.IOException;
20 | import java.net.HttpURLConnection;
21 | import java.net.URL;
22 |
23 | /** A factory for creating {@link HttpURLConnection}s. */
24 | public interface HttpURLConnectionFactory {
25 | HttpURLConnection openHttpUrl(URL url) throws IOException;
26 | }
27 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/timesync/HttpURLConnectionFactoryImpl.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.timesync;
18 |
19 | import java.io.IOException;
20 | import java.net.HttpURLConnection;
21 | import java.net.URL;
22 |
23 | /** A simple implementation of {@link HttpURLConnectionFactory}. */
24 | public class HttpURLConnectionFactoryImpl implements HttpURLConnectionFactory {
25 | public HttpURLConnection openHttpUrl(URL url) throws IOException {
26 | return (HttpURLConnection) (url.openConnection());
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/timesync/SettingsTimeCorrectionActivity.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.timesync;
18 |
19 | import android.os.Bundle;
20 | import com.google.android.apps.authenticator.testability.TestablePreferenceActivity;
21 | import com.google.android.apps.authenticator.util.annotations.FixWhenMinSdkVersion;
22 | import com.google.android.apps.authenticator2.R;
23 |
24 | /** Activity that displays the "Time correction" preferences. */
25 | public class SettingsTimeCorrectionActivity extends TestablePreferenceActivity {
26 |
27 | @FixWhenMinSdkVersion(11) @SuppressWarnings("deprecation")
28 | @Override
29 | protected void onCreate(Bundle savedInstanceState) {
30 | super.onCreate(savedInstanceState);
31 |
32 | addPreferencesFromResource(R.xml.preferences_time_correction);
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/timesync/TimeSyncModule.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.timesync;
18 |
19 | import dagger.Module;
20 | import dagger.Provides;
21 |
22 | import javax.inject.Singleton;
23 |
24 | /** Dagger module for the timesync package. */
25 | @Module(
26 | library = true,
27 | complete = false,
28 | injects = {
29 | SyncNowActivity.class
30 | }
31 | )
32 | public class TimeSyncModule {
33 |
34 | @Provides @Singleton
35 | public NetworkTimeProvider providesNetworkTimeProvider(HttpURLConnectionFactory factory) {
36 | return new NetworkTimeProvider(factory);
37 | }
38 |
39 | @Provides
40 | public HttpURLConnectionFactory providesHttpURLConnectionFactory() {
41 | return new HttpURLConnectionFactoryImpl();
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/util/EmptySpaceClickableDragSortListView.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.util;
18 |
19 | import android.content.Context;
20 | import android.util.AttributeSet;
21 | import android.view.MotionEvent;
22 | import android.widget.AdapterView;
23 | import com.mobeta.android.dslv.DragSortListView;
24 |
25 | /**
26 | * A special {@link DragSortListView} that knows how to handle the click event
27 | * on empty space of the list.
28 | */
29 | public class EmptySpaceClickableDragSortListView extends DragSortListView {
30 |
31 | /**
32 | * Handle click event on the empty space of the list.
33 | */
34 | public interface OnEmptySpaceClickListener {
35 | void onEmptySpaceClick();
36 | }
37 |
38 | private OnEmptySpaceClickListener mOnEmptySpaceClickListener;
39 |
40 | public EmptySpaceClickableDragSortListView(Context context, AttributeSet attrs) {
41 | super(context, attrs);
42 | }
43 |
44 | public void setOnEmptySpaceClickListener(OnEmptySpaceClickListener onEmptySpaceClickListener) {
45 | mOnEmptySpaceClickListener = onEmptySpaceClickListener;
46 | }
47 |
48 | @Override
49 | public boolean dispatchTouchEvent(MotionEvent ev) {
50 | int x = (int) ev.getX();
51 | int y = (int) ev.getY();
52 | if (pointToPosition(x, y) == AdapterView.INVALID_POSITION
53 | && ev.getAction() == MotionEvent.ACTION_DOWN
54 | && mOnEmptySpaceClickListener != null) {
55 | mOnEmptySpaceClickListener.onEmptySpaceClick();
56 | }
57 | return super.dispatchTouchEvent(ev);
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/util/annotations/FixWhenMinSdkVersion.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.util.annotations;
18 |
19 | import static java.lang.annotation.ElementType.CONSTRUCTOR;
20 | import static java.lang.annotation.ElementType.FIELD;
21 | import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
22 | import static java.lang.annotation.ElementType.METHOD;
23 | import static java.lang.annotation.ElementType.PARAMETER;
24 | import static java.lang.annotation.ElementType.TYPE;
25 |
26 | import java.lang.annotation.Retention;
27 | import java.lang.annotation.RetentionPolicy;
28 | import java.lang.annotation.Target;
29 |
30 |
31 | /**
32 | * Indicates that the marked code should be reviewed when this applications's minimum supported
33 | * Android SDK API Level is at or above the specified value.
34 | */
35 | @Retention(RetentionPolicy.SOURCE)
36 | @Target({TYPE, METHOD, CONSTRUCTOR, FIELD, LOCAL_VARIABLE, PARAMETER})
37 | public @interface FixWhenMinSdkVersion {
38 | int value();
39 | }
40 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/util/concurrent/RunOnThisLooperThreadExecutor.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.util.concurrent;
18 |
19 | import android.os.Handler;
20 | import java.util.concurrent.Executor;
21 |
22 | /**
23 | * {@link Executor} that invokes {@link Runnable} instances on the thread on which it was created.
24 | * The assumption is that the thread has a {@link android.os.Looper} associated with it.
25 | */
26 | public class RunOnThisLooperThreadExecutor implements Executor {
27 |
28 | private final Handler handler = new Handler();
29 |
30 | @Override
31 | public void execute(Runnable command) {
32 | if (Thread.currentThread() == handler.getLooper().getThread()) {
33 | // The calling thread is the target thread of the Handler -- invoke immediately, blocking
34 | // the calling thread.
35 | command.run();
36 | } else {
37 | // The calling thread is not the same as the thread with which the Handler is associated --
38 | // post to the Handler for later execution.
39 | handler.post(command);
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/util/permissions/AutoGrantPermissionRequestor.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.util.permissions;
18 |
19 | import android.app.Activity;
20 | import android.content.Context;
21 | import android.content.pm.PackageManager;
22 | import android.os.Build.VERSION;
23 | import android.os.Build.VERSION_CODES;
24 | import com.google.common.base.Preconditions;
25 |
26 | /**
27 | * Permission requestor implementation that automatically grants requests for any permissions.
28 | *
29 | *
This should only be used when API level is below 23.
30 | */
31 | public class AutoGrantPermissionRequestor implements PermissionRequestor {
32 | @Override
33 | public int checkSelfPermission(Context context, String permission) {
34 | Preconditions.checkArgument(VERSION.SDK_INT < VERSION_CODES.M);
35 | return PackageManager.PERMISSION_GRANTED;
36 | }
37 |
38 | @Override
39 | public boolean shouldShowRequestPermissionRationale(Activity activity, String permission) {
40 | Preconditions.checkArgument(VERSION.SDK_INT < VERSION_CODES.M);
41 | return false;
42 | }
43 |
44 | @Override
45 | public void requestPermissions(Activity activity, String[] permissions, int requestCode) {
46 | Preconditions.checkArgument(VERSION.SDK_INT < VERSION_CODES.M);
47 | throw new UnsupportedOperationException("All permissions are already granted");
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/util/permissions/PermissionRequestor.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.util.permissions;
18 |
19 | import android.app.Activity;
20 | import android.content.Context;
21 |
22 | /** Interface for requesting permissions, to abstract platform differences in permissions. */
23 | public interface PermissionRequestor {
24 |
25 | /**
26 | * Determine whether you have been granted a particular permission.
27 | *
28 | * @return {@code PERMISSION_GRANTED} or {@code PERMISSION_DENIED}.
29 | */
30 | int checkSelfPermission(Context context, String permission);
31 |
32 | /**
33 | * @return whether you should show UI with rationale for requesting permission.
34 | */
35 | boolean shouldShowRequestPermissionRationale(Activity activity, String permission);
36 |
37 | /** Request permissions to be granted to this application. */
38 | void requestPermissions(Activity activity, String[] permissions, int requestCode);
39 | }
40 |
--------------------------------------------------------------------------------
/java/com/google/android/apps/authenticator/util/permissions/RuntimePermissionRequestor.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.util.permissions;
18 |
19 | import android.annotation.TargetApi;
20 | import android.app.Activity;
21 | import android.content.Context;
22 | import android.os.Build.VERSION;
23 | import android.os.Build.VERSION_CODES;
24 | import android.support.v4.app.ActivityCompat;
25 | import com.google.common.base.Preconditions;
26 |
27 | /** Runtime permission requestor implementation for Android M and above. */
28 | public class RuntimePermissionRequestor implements PermissionRequestor {
29 |
30 | @Override
31 | @TargetApi(23)
32 | public int checkSelfPermission(Context context, String permission) {
33 | Preconditions.checkArgument(VERSION.SDK_INT >= VERSION_CODES.M);
34 | return ActivityCompat.checkSelfPermission(context, permission);
35 | }
36 |
37 | @Override
38 | @TargetApi(23)
39 | public boolean shouldShowRequestPermissionRationale(Activity activity, String permission) {
40 | Preconditions.checkArgument(VERSION.SDK_INT >= VERSION_CODES.M);
41 | return ActivityCompat.shouldShowRequestPermissionRationale(activity, permission);
42 | }
43 |
44 | @Override
45 | @TargetApi(23)
46 | public void requestPermissions(Activity activity, String[] permissions, int requestCode) {
47 | Preconditions.checkArgument(VERSION.SDK_INT >= VERSION_CODES.M);
48 | ActivityCompat.requestPermissions(activity, permissions, requestCode);
49 | }
50 |
51 | }
52 |
--------------------------------------------------------------------------------
/javatests/com/google/android/apps/authenticator/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
22 |
23 |
24 |
26 |
27 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/javatests/com/google/android/apps/authenticator/target_devices.bzl:
--------------------------------------------------------------------------------
1 | # Copyright 2019 Google LLC
2 | #
3 | # Licensed under the Apache License, Version 2.0 (the "License");
4 | # you may not use this file except in compliance with the License.
5 | # You may obtain a copy of the License at
6 | #
7 | # http://www.apache.org/licenses/LICENSE-2.0
8 | #
9 | # Unless required by applicable law or agreed to in writing, software
10 | # distributed under the License is distributed on an "AS IS" BASIS,
11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 | # See the License for the specific language governing permissions and
13 | # limitations under the License.
14 |
15 | # Android devices to run tests against. This is a dictionary mapping
16 | # a user-friendly name to a map containing information about the corresponding
17 | # BUILD target. The user-friendly name is used used as a suffix for test
18 | # targets.
19 | #
20 | # The following keys in the map are supported (others are silently ignored):
21 | # * target -- Blaze target to use in android_test's target_devices.
22 | # * dex_mode -- Either "legacy" (< API 21) or "native" (>= API 21)
23 |
24 | _tested_api_levels = [
25 | "19",
26 | "21",
27 | "22",
28 | "23",
29 | ]
30 |
31 | test_target_devices = {
32 | api_level: {
33 | "target": "@android_test_support//tools/android/emulated_devices/generic_phone:android_%s_x86_qemu2" % api_level,
34 | "dex_mode": "legacy" if int(api_level) < 21 else "native",
35 | } for api_level in _tested_api_levels
36 | }
37 |
--------------------------------------------------------------------------------
/javatests/com/google/android/apps/authenticator/time/SystemWallClockTest.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2019 Google LLC
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * https://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.google.android.apps.authenticator.time;
18 |
19 | import com.google.android.apps.authenticator.testing.TestUtilities;
20 | import org.junit.Test;
21 | import org.junit.runner.RunWith;
22 | import org.junit.runners.JUnit4;
23 |
24 | /** Unit tests for {@link SystemWallClock}. */
25 | @RunWith(JUnit4.class)
26 | public class SystemWallClockTest {
27 |
28 | @Test
29 | public void testNowMillis() {
30 | SystemWallClock clock = new SystemWallClock();
31 | long timeBefore = System.currentTimeMillis();
32 | long time = clock.nowMillis();
33 | long timeAfter = System.currentTimeMillis();
34 | TestUtilities.assertInRangeInclusive(time, timeBefore, timeAfter);
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/third_party/DragSortListView/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
8 |
9 |
--------------------------------------------------------------------------------
/third_party/DragSortListView/BUILD:
--------------------------------------------------------------------------------
1 | package(
2 | default_visibility = [
3 | "//java/com/google/android/apps/authenticator:__subpackages__",
4 | "//javatests/com/google/android/apps/authenticator:__subpackages__",
5 | ],
6 | )
7 |
8 | licenses(["notice"]) # Apache 2.0
9 |
10 | exports_files(["LICENSE"])
11 |
12 | android_library(
13 | name = "DragSortListView",
14 | srcs = glob(["src/**/*.java"]),
15 | custom_package = "com.mobeta.android.dslv",
16 | manifest = "AndroidManifest.xml",
17 | resource_files = [":resource_files"],
18 | deps = [
19 | "@maven//:com_android_support_cursoradapter",
20 | "@maven//:com_android_support_support_v4",
21 | ],
22 | )
23 |
24 | filegroup(
25 | name = "resource_files",
26 | srcs = glob(["res/**"]),
27 | )
28 |
--------------------------------------------------------------------------------
/third_party/DragSortListView/res/values/dslv_attrs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/third_party/DragSortListView/src/com/mobeta/android/dslv/DragSortItemViewCheckable.java:
--------------------------------------------------------------------------------
1 | package com.mobeta.android.dslv;
2 |
3 | import android.content.Context;
4 | import android.view.Gravity;
5 | import android.view.View;
6 | import android.view.View.MeasureSpec;
7 | import android.view.ViewGroup;
8 | import android.widget.AbsListView;
9 | import android.widget.Checkable;
10 | import android.util.Log;
11 |
12 | /**
13 | * Lightweight ViewGroup that wraps list items obtained from user's
14 | * ListAdapter. ItemView expects a single child that has a definite
15 | * height (i.e. the child's layout height is not MATCH_PARENT).
16 | * The width of
17 | * ItemView will always match the width of its child (that is,
18 | * the width MeasureSpec given to ItemView is passed directly
19 | * to the child, and the ItemView measured width is set to the
20 | * child's measured width). The height of ItemView can be anything;
21 | * the
22 | *
23 | *
24 | * The purpose of this class is to optimize slide
25 | * shuffle animations.
26 | */
27 | public class DragSortItemViewCheckable extends DragSortItemView implements Checkable {
28 |
29 | public DragSortItemViewCheckable(Context context) {
30 | super(context);
31 | }
32 |
33 | @Override
34 | public boolean isChecked() {
35 | View child = getChildAt(0);
36 | if (child instanceof Checkable)
37 | return ((Checkable) child).isChecked();
38 | else
39 | return false;
40 | }
41 |
42 | @Override
43 | public void setChecked(boolean checked) {
44 | View child = getChildAt(0);
45 | if (child instanceof Checkable)
46 | ((Checkable) child).setChecked(checked);
47 | }
48 |
49 | @Override
50 | public void toggle() {
51 | View child = getChildAt(0);
52 | if (child instanceof Checkable)
53 | ((Checkable) child).toggle();
54 | }
55 | }
56 |
--------------------------------------------------------------------------------