mirror of
https://github.com/vector-im/riotX-android
synced 2025-10-06 08:12:46 +02:00
Compare commits
278 Commits
app-layout
...
base/no-su
Author | SHA1 | Date | |
---|---|---|---|
|
739a513f89 | ||
|
e83fa9c81f | ||
|
abd70d953b | ||
|
5058f942af | ||
|
8bfe7b68c3 | ||
|
11e6ca1784 | ||
|
ae50f5a006 | ||
|
be9c9f1640 | ||
|
1d8b4ce63b | ||
|
4e99217164 | ||
|
c61df899b4 | ||
|
ca92ad267d | ||
|
b05d52bb6d | ||
|
ad16130a94 | ||
|
e86b72b8db | ||
|
0ce72057dc | ||
|
60b164a447 | ||
|
01e1d74c72 | ||
|
e9d15b46d8 | ||
|
619ea819ed | ||
|
68da403f2f | ||
|
e9e29603de | ||
|
9e5f07a855 | ||
|
1d50bbdbda | ||
|
0c469ae079 | ||
|
32a15bee04 | ||
|
0691046601 | ||
|
3a38898961 | ||
|
373a0ca4fb | ||
|
5d533d4ec9 | ||
|
a947a53e14 | ||
|
b72a174edf | ||
|
e53972cf2d | ||
|
6c9ae331e3 | ||
|
1d3c191153 | ||
|
7631c7ac9f | ||
|
e792228879 | ||
|
3b1599763c | ||
|
50b042ee98 | ||
|
f4b5cfc71f | ||
|
e0f327e8f6 | ||
|
7982f4be00 | ||
|
fb3fdf097c | ||
|
a1bdfd1a5c | ||
|
279820224c | ||
|
6cd0fbb614 | ||
|
c1dfa925c0 | ||
|
4205b4a777 | ||
|
4cd81f194c | ||
|
ecb7d77582 | ||
|
30effb781b | ||
|
92888b666c | ||
|
bf88c16c9d | ||
|
94d1649ec9 | ||
|
c7099f53c1 | ||
|
51fba85a3a | ||
|
3970c2ec31 | ||
|
15cf8b63a0 | ||
|
9553fe0648 | ||
|
a661f9c3fb | ||
|
4a89fcea14 | ||
|
583cc29472 | ||
|
8dbfafb324 | ||
|
34303c4a62 | ||
|
85f16e8dfa | ||
|
147dac8ebf | ||
|
125339a164 | ||
|
55c60c9a40 | ||
|
8fc201121d | ||
|
662d77cb7e | ||
|
db83099dc3 | ||
|
8177d9777c | ||
|
2a59533818 | ||
|
7f766eef2a | ||
|
6ac4d58636 | ||
|
ec0770434d | ||
|
da83a85f74 | ||
|
0c4707c315 | ||
|
73eb63a35e | ||
|
e37344a059 | ||
|
5d035314b4 | ||
|
59d3ff1671 | ||
|
58b94aef2d | ||
|
4de62d84b4 | ||
|
4b63f4b9bf | ||
|
8c884f45fb | ||
|
e19647f6ca | ||
|
ca2805fb7f | ||
|
bdff23a74d | ||
|
d9ad9859ec | ||
|
7c4527fba6 | ||
|
b501770fa9 | ||
|
f88039b7fd | ||
|
ff9add5a0c | ||
|
b60c279c06 | ||
|
41f75eed50 | ||
|
398f9427df | ||
|
b4d72d2219 | ||
|
b66c405430 | ||
|
a17a4fe4b1 | ||
|
614383c08d | ||
|
3e12907b26 | ||
|
4222c7c7c4 | ||
|
cb36ef766c | ||
|
bc5309b5d7 | ||
|
dbea1726ec | ||
|
2527dbbeb2 | ||
|
de17c47a7d | ||
|
2ab0343e4f | ||
|
65654e7e8a | ||
|
6badbe738d | ||
|
f65074b3c5 | ||
|
62dbab907d | ||
|
48498020a0 | ||
|
3267cbbf78 | ||
|
94e2a0a3e3 | ||
|
5dd26a43dd | ||
|
a743cf28c6 | ||
|
7bdcacf489 | ||
|
6ba963b552 | ||
|
0b9b8251f9 | ||
|
45b138e53d | ||
|
c45f536855 | ||
|
f2891b74c5 | ||
|
047384c08c | ||
|
3566b10e3c | ||
|
438f302787 | ||
|
07d9e35842 | ||
|
27031ab267 | ||
|
06d447247a | ||
|
0eae1bd505 | ||
|
39a0b3b1ba | ||
|
712d39b9dd | ||
|
4a6a39b3c4 | ||
|
e3c41a07e5 | ||
|
6c2bf35d60 | ||
|
418a48de18 | ||
|
00a04b807e | ||
|
f13c34b2a0 | ||
|
5b46c803b2 | ||
|
9cf6dd7a88 | ||
|
5143ef9deb | ||
|
59e6fa98c9 | ||
|
a5046d43c8 | ||
|
d1776a04c0 | ||
|
13dd87dd85 | ||
|
36ba1c5491 | ||
|
3b2fa0d563 | ||
|
4a31dc403f | ||
|
37b216393e | ||
|
bdfbbbb2e6 | ||
|
3c6efd673e | ||
|
c408621bd5 | ||
|
8c32b08505 | ||
|
9b5d8c2d01 | ||
|
80507dac00 | ||
|
199195dcbd | ||
|
608c4bacec | ||
|
39f366a4a2 | ||
|
64c8789ef2 | ||
|
da88b37ec7 | ||
|
669beb1156 | ||
|
2ba00b3845 | ||
|
fe484e84f4 | ||
|
c5d3eaffb9 | ||
|
682905df25 | ||
|
2148270773 | ||
|
6e9b2baf6f | ||
|
0b105e2a7a | ||
|
52d05b373c | ||
|
fb8d4668d8 | ||
|
1ad585e154 | ||
|
d12bb09273 | ||
|
fde7072bc7 | ||
|
38a04c3655 | ||
|
3f30cf0bee | ||
|
78c2b10b89 | ||
|
f4865df50c | ||
|
52006c1bb4 | ||
|
a5ee4faef4 | ||
|
b995f798f9 | ||
|
611749c08f | ||
|
0c3310dd16 | ||
|
68f106efac | ||
|
e542dc4aac | ||
|
f74a0b0901 | ||
|
2a599d9760 | ||
|
3eb29b4661 | ||
|
26dbd31717 | ||
|
ebf707dca9 | ||
|
969663786b | ||
|
e2aa66e4c2 | ||
|
afbb76f341 | ||
|
273999ee88 | ||
|
6c2363471d | ||
|
9564c8f144 | ||
|
d77ce27953 | ||
|
b4fcffbdf9 | ||
|
22f8ace4c4 | ||
|
b7efd6384c | ||
|
ef17aac981 | ||
|
f54979ce13 | ||
|
593a04ea25 | ||
|
31a3552e26 | ||
|
468c7b600c | ||
|
16fad63e49 | ||
|
f604b1d384 | ||
|
b3eac52e3f | ||
|
1c35e5ae9c | ||
|
4e0735c759 | ||
|
4dc01fcfa6 | ||
|
91b4918526 | ||
|
5e0d84bb25 | ||
|
73d4492bf5 | ||
|
707ff27371 | ||
|
250633ec67 | ||
|
fea0c27bdd | ||
|
59f8753c6a | ||
|
a851b0aa96 | ||
|
fbe5918f30 | ||
|
24509543b9 | ||
|
97a010cbc5 | ||
|
8f69c5e0bc | ||
|
bfc89242fe | ||
|
3c7889c95d | ||
|
9347bc8cf4 | ||
|
7cc7444bd5 | ||
|
6a3bef591c | ||
|
e0c455a476 | ||
|
36a221adf1 | ||
|
ee300cf11d | ||
|
891173c04a | ||
|
1b651f2aa5 | ||
|
9a29c79233 | ||
|
67b7bc3d83 | ||
|
61cf3c3125 | ||
|
ecd1776085 | ||
|
8314eb71c0 | ||
|
0f4deb7067 | ||
|
00f1c06504 | ||
|
82868dd6b7 | ||
|
df25b1a419 | ||
|
0973a20fe4 | ||
|
abca70f6f9 | ||
|
e4a1495f36 | ||
|
8727912052 | ||
|
bb6cb597d1 | ||
|
511c6a2ae1 | ||
|
a147d8623b | ||
|
34a424678d | ||
|
b13546b096 | ||
|
db29ebb93d | ||
|
287e890f60 | ||
|
c3bac2f0cf | ||
|
054802c02b | ||
|
6917e97f49 | ||
|
ad360074bf | ||
|
9616cd4186 | ||
|
c302438b37 | ||
|
3c53a579a9 | ||
|
e0e9fbc820 | ||
|
ec260fac16 | ||
|
cad23d1477 | ||
|
578ff6bd44 | ||
|
8535e30937 | ||
|
da73550493 | ||
|
3e6f406ad4 | ||
|
deaf6984c1 | ||
|
5003459962 | ||
|
f7ae377874 | ||
|
e2646c3243 | ||
|
42c580c249 | ||
|
a4dd08ddb3 | ||
|
02d54878c3 | ||
|
cda50dca8c | ||
|
d130dd5e1b | ||
|
e00a9a10fb | ||
|
d52f3ab586 |
15
.github/workflows/tests.yml
vendored
15
.github/workflows/tests.yml
vendored
@@ -1,9 +1,9 @@
|
||||
name: Test
|
||||
|
||||
on:
|
||||
pull_request: {}
|
||||
pull_request: { }
|
||||
push:
|
||||
branches: [main, develop]
|
||||
branches: [ main, develop ]
|
||||
|
||||
# Enrich gradle.properties for CI/CD
|
||||
env:
|
||||
@@ -48,12 +48,12 @@ jobs:
|
||||
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
|
||||
disable-animations: true
|
||||
emulator-build: 7425822
|
||||
script: |
|
||||
script: |
|
||||
./gradlew gatherGplayDebugStringTemplates $CI_GRADLE_ARG_PROPERTIES
|
||||
./gradlew unitTestsWithCoverage $CI_GRADLE_ARG_PROPERTIES
|
||||
./gradlew instrumentationTestsWithCoverage $CI_GRADLE_ARG_PROPERTIES
|
||||
./gradlew generateCoverageReport $CI_GRADLE_ARG_PROPERTIES
|
||||
# NB: continue-on-error marks steps.tests.conclusion = 'success' but leaves stes.tests.outcome = 'failure'
|
||||
# NB: continue-on-error marks steps.tests.conclusion = 'success' but leaves stes.tests.outcome = 'failure'
|
||||
- name: Run all the codecoverage tests at once (retry if emulator failed)
|
||||
uses: reactivecircus/android-emulator-runner@v2
|
||||
if: always() && steps.tests.outcome == 'failure' # don't run if previous step succeeded.
|
||||
@@ -70,12 +70,15 @@ jobs:
|
||||
./gradlew unitTestsWithCoverage $CI_GRADLE_ARG_PROPERTIES
|
||||
./gradlew instrumentationTestsWithCoverage $CI_GRADLE_ARG_PROPERTIES
|
||||
./gradlew generateCoverageReport $CI_GRADLE_ARG_PROPERTIES
|
||||
- run: ./gradlew sonarqube $CI_GRADLE_ARG_PROPERTIES
|
||||
if: always() # we may have failed a previous step and retried, that's OK
|
||||
|
||||
# we may have failed a previous step and retried, that's OK
|
||||
- name: Publish results to Sonar
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.SONARQUBE_GITHUB_API_TOKEN }} # Needed to get PR information, if any
|
||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||
ORG_GRADLE_PROJECT_SONAR_LOGIN: ${{ secrets.SONAR_TOKEN }}
|
||||
if: ${{ always() && env.GITHUB_TOKEN != '' && env.SONAR_TOKEN != '' && env.ORG_GRADLE_PROJECT_SONAR_LOGIN != '' }}
|
||||
run: ./gradlew sonarqube $CI_GRADLE_ARG_PROPERTIES
|
||||
|
||||
- name: Format unit test results
|
||||
if: always()
|
||||
|
26
.github/workflows/triage-labelled.yml
vendored
26
.github/workflows/triage-labelled.yml
vendored
@@ -142,32 +142,6 @@ jobs:
|
||||
env:
|
||||
PROJECT_ID: "PN_kwDOAM0swc2KCw"
|
||||
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
||||
|
||||
move_threads_issues:
|
||||
name: A-Threads to Thread board
|
||||
runs-on: ubuntu-latest
|
||||
# Skip in forks
|
||||
if: >
|
||||
github.repository == 'vector-im/element-android' &&
|
||||
contains(github.event.issue.labels.*.name, 'A-Threads')
|
||||
steps:
|
||||
- uses: octokit/graphql-action@v2.x
|
||||
with:
|
||||
headers: '{"GraphQL-Features": "projects_next_graphql"}'
|
||||
query: |
|
||||
mutation add_to_project($projectid:ID!,$contentid:ID!) {
|
||||
addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
|
||||
projectNextItem {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
projectid: ${{ env.PROJECT_ID }}
|
||||
contentid: ${{ github.event.issue.node_id }}
|
||||
env:
|
||||
PROJECT_ID: "PN_kwDOAM0swc0rRA"
|
||||
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
||||
|
||||
move_message_bubbles_issues:
|
||||
name: A-Message-Bubbles to Message bubbles board
|
||||
runs-on: ubuntu-latest
|
||||
|
2
.github/workflows/triage-priority-bugs.yml
vendored
2
.github/workflows/triage-priority-bugs.yml
vendored
@@ -27,7 +27,7 @@ jobs:
|
||||
- uses: alex-page/github-project-automation-plus@bb266ff4dde9242060e2d5418e120a133586d488
|
||||
with:
|
||||
project: Android App Team
|
||||
column: P1
|
||||
column: Important Issues & Topics (P1)
|
||||
repo-token: ${{ secrets.ELEMENT_BOT_TOKEN }}
|
||||
|
||||
P1_issues_to_crypto_team_workboard:
|
||||
|
66
CHANGES.md
66
CHANGES.md
@@ -1,3 +1,69 @@
|
||||
Changes in Element v1.4.36 (2022-09-10)
|
||||
=======================================
|
||||
|
||||
New App Layout can be enabled in the Labs settings. Please give it a try!
|
||||
|
||||
Features ✨
|
||||
----------
|
||||
- Adds New App Layout into Labs ([#7038](https://github.com/vector-im/element-android/issues/7038))
|
||||
- Try to detect devices that lack Opus encoder support, use bundled libopus library for those. ([#7010](https://github.com/vector-im/element-android/issues/7010))
|
||||
- Suggest @room when @channel, @everyone, or @here is typed in composer ([#6529](https://github.com/vector-im/element-android/issues/6529))
|
||||
|
||||
Bugfixes 🐛
|
||||
----------
|
||||
- Fix long incremental sync. ([#6917](https://github.com/vector-im/element-android/issues/6917))
|
||||
- Fix push with FCM ([#7068](https://github.com/vector-im/element-android/issues/7068))
|
||||
- FTUE - Fixes optional email registration step always being mandatory ([#6969](https://github.com/vector-im/element-android/issues/6969))
|
||||
- Fixes /addToSpace and /joinSpace commands showing invalid syntax warnings ([#6844](https://github.com/vector-im/element-android/issues/6844))
|
||||
- Fix low occurrence crashes. ([#6967](https://github.com/vector-im/element-android/issues/6967))
|
||||
- Fix crash when opening an unknown room ([#6978](https://github.com/vector-im/element-android/issues/6978))
|
||||
- Fix crash on PIN code settings screen. ([#6979](https://github.com/vector-im/element-android/issues/6979))
|
||||
- Fix autoplayed animated stickers ([#6982](https://github.com/vector-im/element-android/issues/6982))
|
||||
- Catch race condition crash in voice recording ([#6989](https://github.com/vector-im/element-android/issues/6989))
|
||||
- Fix invite to room when in a space buttons not working. ([#7054](https://github.com/vector-im/element-android/issues/7054))
|
||||
|
||||
In development 🚧
|
||||
----------------
|
||||
- Create DM room only on first message - Create the DM and navigate to the new room after sending an event ([#5525](https://github.com/vector-im/element-android/issues/5525))
|
||||
- [App Layout] New empty states for home screen ([#6835](https://github.com/vector-im/element-android/issues/6835))
|
||||
- [App Layout] Bottom navigation tabs are removed for new home screen ([#6565](https://github.com/vector-im/element-android/issues/6565))
|
||||
- [App Layout] fixed space switching dialog measured with wrong height sometimes ([#6750](https://github.com/vector-im/element-android/issues/6750))
|
||||
- [App Layout] Fabs doesn't go off screen anymore ([#6765](https://github.com/vector-im/element-android/issues/6765))
|
||||
- [New Layout] Adds back navigation through spaces ([#6877](https://github.com/vector-im/element-android/issues/6877))
|
||||
- [App Layout] new room invites screen ([#6889](https://github.com/vector-im/element-android/issues/6889))
|
||||
- [App Layout] - Invites now show empty screen after you reject last invite ([#6876](https://github.com/vector-im/element-android/issues/6876))
|
||||
- [App Layout] - space switcher now has empty state ([#6754](https://github.com/vector-im/element-android/issues/6754))
|
||||
- [App Layout] - Improves Developer Mode Debug Button UX and adds it to New App Layout ([#6871](https://github.com/vector-im/element-android/issues/6871))
|
||||
- [New Layout] Changes space sheet to accordion-style with expandable subspaces ([#6907](https://github.com/vector-im/element-android/issues/6907))
|
||||
- [New Layout] Adds space invites ([#6924](https://github.com/vector-im/element-android/issues/6924))
|
||||
- [App Layout] fixed invites count badge bottom margin on a home screen ([#6947](https://github.com/vector-im/element-android/issues/6947))
|
||||
- [New Layout] Improves talkback accessibility ([#7016](https://github.com/vector-im/element-android/issues/7016))
|
||||
- [New Layout] Changes space icon in fab and in release notes screen ([#7039](https://github.com/vector-im/element-android/issues/7039))
|
||||
- [New Layout] Adds header to spaces bottom sheet ([#7040](https://github.com/vector-im/element-android/issues/7040))
|
||||
- [App Layout] New App Layout is enabled by default (Edit: has to be enabled in Labs) ([#6958](https://github.com/vector-im/element-android/issues/6958))
|
||||
- [App Layout] Obsolete settings are not shown when App Layout flag is enabled ([#6646](https://github.com/vector-im/element-android/issues/6646))
|
||||
- [Devices Management] Session overview screen ([#6961](https://github.com/vector-im/element-android/issues/6961))
|
||||
- [Devices Management] Refactor some code to improve testability ([#7043](https://github.com/vector-im/element-android/issues/7043))
|
||||
- [Device Manager] Current Session Section ([#6902](https://github.com/vector-im/element-android/issues/6902))
|
||||
- [Device Manager] Other Sessions Section ([#6945](https://github.com/vector-im/element-android/issues/6945))
|
||||
- [Device Manager] Render Security Recommendations ([#6964](https://github.com/vector-im/element-android/issues/6964))
|
||||
|
||||
Improved Documentation 📚
|
||||
------------------------
|
||||
- Clarify that setting up a FCM Rewrite Proxy is not necessary for use of the UnifiedPush FCM distributor. ([#6727](https://github.com/vector-im/element-android/issues/6727))
|
||||
|
||||
Other changes
|
||||
-------------
|
||||
- Increase sticker size ([#6982](https://github.com/vector-im/element-android/issues/6982))
|
||||
- Focus input field when editing homeserver address to speed up login and registration. ([#6926](https://github.com/vector-im/element-android/issues/6926))
|
||||
- Log basic Http information in production. ([#6925](https://github.com/vector-im/element-android/issues/6925))
|
||||
- Converts the vector module to a library with a parent vector-app application module ([#6407](https://github.com/vector-im/element-android/issues/6407))
|
||||
- Creates a dedicated strings module ([#3955](https://github.com/vector-im/element-android/issues/3955))
|
||||
- Remove FragmentModule and the Fragment factory. No need to Inject the constructor on your Fragment, just add @AndroidEntryPoint annotation and @Inject class members. ([#6894](https://github.com/vector-im/element-android/issues/6894))
|
||||
- Small refactor of UnifiedPushHelper ([#6936](https://github.com/vector-im/element-android/issues/6936))
|
||||
- CI: only run sonarqube task when token is known ([#7057](https://github.com/vector-im/element-android/issues/7057))
|
||||
|
||||
|
||||
Changes in Element v1.4.34 (2022-08-23)
|
||||
=======================================
|
||||
|
||||
|
@@ -45,7 +45,7 @@ plugins {
|
||||
id "io.gitlab.arturbosch.detekt" version "1.21.0"
|
||||
|
||||
// Dependency Analysis
|
||||
id 'com.autonomousapps.dependency-analysis' version "1.12.0"
|
||||
id 'com.autonomousapps.dependency-analysis' version "1.13.1"
|
||||
}
|
||||
|
||||
// https://github.com/jeremylong/DependencyCheck
|
||||
@@ -216,7 +216,7 @@ project(":vector") {
|
||||
}
|
||||
}
|
||||
|
||||
project(":library:diff-match-patch") {
|
||||
project(":library:external:diff-match-patch") {
|
||||
sonarqube {
|
||||
skipProject = true
|
||||
}
|
||||
|
@@ -1 +0,0 @@
|
||||
Creates a dedicated strings module
|
1
changelog.d/5424.bugfix
Normal file
1
changelog.d/5424.bugfix
Normal file
@@ -0,0 +1 @@
|
||||
Fix text margin in QR code view when no display name is set
|
@@ -1 +0,0 @@
|
||||
Create DM room only on first message - Create the DM and navigate to the new room after sending an event
|
@@ -1 +0,0 @@
|
||||
Converts the vector module to a library with a parent vector-app application module
|
@@ -1 +0,0 @@
|
||||
[App Layout] Bottom navigation tabs are removed for new home screen
|
@@ -1 +0,0 @@
|
||||
[App Layout] fixed space switching dialog measured with wrong height sometimes
|
@@ -1 +0,0 @@
|
||||
[App Layout] - space switcher now has empty state
|
@@ -1 +0,0 @@
|
||||
[App Layout] Fabs doesn't go off screen anymore
|
1
changelog.d/6776.bugfix
Normal file
1
changelog.d/6776.bugfix
Normal file
@@ -0,0 +1 @@
|
||||
[App Layout] Recents carousel now scrolled to first position when new item added to or moved to this position
|
1
changelog.d/6779.misc
Normal file
1
changelog.d/6779.misc
Normal file
@@ -0,0 +1 @@
|
||||
[Modules] Lifts the application variants to the app module
|
@@ -1 +0,0 @@
|
||||
[App Layout] New empty states for home screen
|
@@ -1 +0,0 @@
|
||||
Fixes /addToSpace and /joinSpace commands showing invalid syntax warnings
|
@@ -1 +0,0 @@
|
||||
Improves Developer Mode Debug Button UX and adds it to New App Layout
|
@@ -1 +0,0 @@
|
||||
[New Layout] Adds back navigation through spaces
|
@@ -1 +0,0 @@
|
||||
[App Layout] new room invites screen
|
@@ -1 +0,0 @@
|
||||
Remove FragmentModule and the Fragment factory. No need to Inject the constructor on your Fragment, just add @AndroidEntryPoint annotation and @Inject class members.
|
@@ -1 +0,0 @@
|
||||
[Device Manager] Current Session Section
|
@@ -1 +0,0 @@
|
||||
[New Layout] Changes space sheet to accordion-style with expandable subspaces
|
@@ -1 +0,0 @@
|
||||
Fix long incremental sync.
|
@@ -1 +0,0 @@
|
||||
[New Layout] Adds space invites
|
@@ -1 +0,0 @@
|
||||
Log basic Http information in production.
|
@@ -1 +0,0 @@
|
||||
Focus input field when editing homeserver address to speed up login and registration.
|
@@ -1 +0,0 @@
|
||||
[Device Manager] Other Sessions Section
|
@@ -1 +0,0 @@
|
||||
[App Layout] fixed invites count badge bottom margin on a home screen
|
@@ -1 +0,0 @@
|
||||
[App Layout] New App Layout is enabled by default
|
@@ -1 +0,0 @@
|
||||
[Device Manager] Render Security Recommendations
|
@@ -1 +0,0 @@
|
||||
Fix low occurrence crashes.
|
@@ -1 +0,0 @@
|
||||
FTUE - Fixes optional email registration step always being mandatory
|
@@ -1 +0,0 @@
|
||||
Fix crash when opening an unknown room
|
@@ -1 +0,0 @@
|
||||
Fix crash on PIN code settings screen.
|
@@ -1,2 +0,0 @@
|
||||
Fix autoplayed animated stickers
|
||||
Increase sticker size
|
@@ -1 +0,0 @@
|
||||
Catch race condition crash in voice recording
|
@@ -1 +0,0 @@
|
||||
Try to detect devices that lack Opus encoder support, use bundled libopus library for those.
|
@@ -1 +0,0 @@
|
||||
[New Layout] Improves talkback accessibility
|
1
changelog.d/7035.misc
Normal file
1
changelog.d/7035.misc
Normal file
@@ -0,0 +1 @@
|
||||
Ensure that we do not expect all the Event fields when requesting `rooms/{roomId}/hierarchy` endpoint.
|
1
changelog.d/7077.wip
Normal file
1
changelog.d/7077.wip
Normal file
@@ -0,0 +1 @@
|
||||
[Device management] Session details screen
|
1
changelog.d/7102.bugfix
Normal file
1
changelog.d/7102.bugfix
Normal file
@@ -0,0 +1 @@
|
||||
Fixes crash when quickly double clicking FABs in the new app layout
|
1
changelog.d/7103.bugfix
Normal file
1
changelog.d/7103.bugfix
Normal file
@@ -0,0 +1 @@
|
||||
Fixes space list and new chat bottom sheets showing too small in New App Layout (especially evident in landscape)
|
1
changelog.d/7121.wip
Normal file
1
changelog.d/7121.wip
Normal file
@@ -0,0 +1 @@
|
||||
Create DM room only on first message - Fix glitch in the room list
|
1
changelog.d/7122.bugfix
Normal file
1
changelog.d/7122.bugfix
Normal file
@@ -0,0 +1 @@
|
||||
[App Layout] Room leaving prompt dialog now waits user to confirm leaving before do so
|
1
changelog.d/7140.misc
Normal file
1
changelog.d/7140.misc
Normal file
@@ -0,0 +1 @@
|
||||
Exclude legacy android support annotation library
|
1
changelog.d/7142.misc
Normal file
1
changelog.d/7142.misc
Normal file
@@ -0,0 +1 @@
|
||||
Pulling no longer hosted im.dlg:android-dialer directly into the repository and removing legacy support library usages
|
@@ -81,11 +81,11 @@ task generateCoverageReport(type: JacocoReport) {
|
||||
task unitTestsWithCoverage(type: GradleBuild) {
|
||||
// the 7.1.3 android gradle plugin has a bug where enableTestCoverage generates invalid coverage
|
||||
startParameter.projectProperties.coverage = [enableTestCoverage: false]
|
||||
tasks = [':vector:testGplayDebugUnitTest', ':matrix-sdk-android:testDebugUnitTest']
|
||||
tasks = ['testDebugUnitTest']
|
||||
}
|
||||
|
||||
task instrumentationTestsWithCoverage(type: GradleBuild) {
|
||||
startParameter.projectProperties.coverage = [enableTestCoverage: true]
|
||||
startParameter.projectProperties['android.testInstrumentationRunnerArguments.notPackage'] = 'im.vector.app.ui'
|
||||
tasks = [':vector-app:connectedGplayDebugAndroidTest', ':vector:connectedGplayDebugAndroidTest', 'matrix-sdk-android:connectedDebugAndroidTest']
|
||||
tasks = [':vector-app:connectedGplayDebugAndroidTest', ':vector:connectedDebugAndroidTest', 'matrix-sdk-android:connectedDebugAndroidTest']
|
||||
}
|
||||
|
@@ -15,14 +15,14 @@ def gradle = "7.1.3"
|
||||
def kotlin = "1.6.21"
|
||||
def kotlinCoroutines = "1.6.4"
|
||||
def dagger = "2.42"
|
||||
def appDistribution = "16.0.0-beta03"
|
||||
def appDistribution = "16.0.0-beta04"
|
||||
def retrofit = "2.9.0"
|
||||
def arrow = "0.8.2"
|
||||
def markwon = "4.6.2"
|
||||
def moshi = "1.13.0"
|
||||
def lifecycle = "2.5.1"
|
||||
def flowBinding = "1.2.0"
|
||||
def flipper = "0.162.0"
|
||||
def flipper = "0.164.0"
|
||||
def epoxy = "4.6.2"
|
||||
def mavericks = "2.7.0"
|
||||
def glide = "4.13.2"
|
||||
@@ -86,7 +86,7 @@ ext.libs = [
|
||||
'appdistributionApi' : "com.google.firebase:firebase-appdistribution-api-ktx:$appDistribution",
|
||||
'appdistribution' : "com.google.firebase:firebase-appdistribution:$appDistribution",
|
||||
// Phone number https://github.com/google/libphonenumber
|
||||
'phonenumber' : "com.googlecode.libphonenumber:libphonenumber:8.12.54"
|
||||
'phonenumber' : "com.googlecode.libphonenumber:libphonenumber:8.12.55"
|
||||
],
|
||||
dagger : [
|
||||
'dagger' : "com.google.dagger:dagger:$dagger",
|
||||
|
@@ -69,8 +69,6 @@ ext.groups = [
|
||||
'com.gabrielittner.threetenbp',
|
||||
'com.getkeepsafe.relinker',
|
||||
'com.github.bumptech.glide',
|
||||
'com.github.filippudak',
|
||||
'com.github.filippudak.progresspieview',
|
||||
'com.github.javaparser',
|
||||
'com.github.piasy',
|
||||
'com.github.shyiko.klob',
|
||||
|
@@ -47,7 +47,7 @@ git checkout develop
|
||||
mv towncrier.toml towncrier.toml.bak
|
||||
sed 's/CHANGES\.md/CHANGES_NIGHTLY\.md/' towncrier.toml.bak > towncrier.toml
|
||||
rm towncrier.toml.bak
|
||||
yes n | towncrier --version nightly
|
||||
yes n | towncrier build --version nightly
|
||||
./gradlew assembleGplayNightly appDistributionUploadGplayNightly $CI_GRADLE_ARG_PROPERTIES
|
||||
```
|
||||
|
||||
|
@@ -18,7 +18,7 @@ The recently started UnifiedPush project is an Android protocol and library for
|
||||
|
||||
The *F-Droid* and *Gplay* flavors of Element Android support UnifiedPush, so the user can use any distributor installed on their devices. This would make it possible to have push notifications without depending on Google services or libraries. Currently, the main distributors are [ntfy](https://ntfy.sh) which does not require any setup (like manual registration) to use the public server and [NextPush](https://github.com/UP-NextPush/android), available as a nextcloud application.
|
||||
|
||||
The *Gplay* variant uses a UnifiedPush library which basically embed a FCM distributor built into the application (so a user doesn't need to do anything other than install the app to get FCM notifications). This variant uses Google Services to receive notifications if the user has not installed any distributor.
|
||||
The *Gplay* variant uses a UnifiedPush library which basically embed a FCM distributor built into the application (so a user doesn't need to do anything other than install the app to get FCM notifications). This variant uses Google Services to receive notifications if the user has not installed any distributor. A [FCM Rewrite Proxy](https://unifiedpush.org/developers/embedded_fcm/#fcm-rewrite-proxy) is not required for Element Android's implementation of the FCM distributor - it will work with an existing Matrix push provider, such as [Sygnal](https://github.com/matrix-org/sygnal).
|
||||
|
||||
The *F-Droid* variant does not use this library to avoid any proprietary blob. It will use a polling service if the user has not installed any distributor.
|
||||
|
||||
|
2
fastlane/metadata/android/cs-CZ/changelogs/40104340.txt
Normal file
2
fastlane/metadata/android/cs-CZ/changelogs/40104340.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Hlavní změny v této verzi: Opravy různých chyb a vylepšení stability.
|
||||
Úplný seznam změn: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/de-DE/changelogs/40104340.txt
Normal file
2
fastlane/metadata/android/de-DE/changelogs/40104340.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Die wichtigsten Änderungen in dieser Version: Verschiedene Fehlerbehebungen und Stabilitätsverbesserungen.
|
||||
Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases
|
3
fastlane/metadata/android/en-US/changelogs/40104360.txt
Normal file
3
fastlane/metadata/android/en-US/changelogs/40104360.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
New App Layout can be enabled in the Labs settings. Please give it a try!
|
||||
Fix issues about missing notification, and long incremental sync.
|
||||
Full changelog: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/et/changelogs/40104340.txt
Normal file
2
fastlane/metadata/android/et/changelogs/40104340.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Põhilised muutused selles versioonis: erinevate vigade parandused ja stabiilsust edendavad kohendused.
|
||||
Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/fa/changelogs/40104340.txt
Normal file
2
fastlane/metadata/android/fa/changelogs/40104340.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
تغییرات عمده در این نگارش: رفع اشکالهای مختلف و بهبودهای پایداری.
|
||||
گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/fr-FR/changelogs/40104340.txt
Normal file
2
fastlane/metadata/android/fr-FR/changelogs/40104340.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Principaux changements pour cette version : Plusieurs corrections de bogues et d’améliorations de stabilité.
|
||||
Intégralité des changements : https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/hu-HU/changelogs/40104100.txt
Normal file
2
fastlane/metadata/android/hu-HU/changelogs/40104100.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Főbb változások ebben a verzióban: Görgetés a hangüzenetben. Különböző hibajavítások és stabilitásjavítások.
|
||||
Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/hu-HU/changelogs/40104110.txt
Normal file
2
fastlane/metadata/android/hu-HU/changelogs/40104110.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
|
||||
Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/hu-HU/changelogs/40104120.txt
Normal file
2
fastlane/metadata/android/hu-HU/changelogs/40104120.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Főbb változások ebben a verzióban: Lehetővé teszi a felhasználók számára, hogy offline jelenjenek meg, és audio lejátszót ad hozzá a hangmellékletekhez.
|
||||
Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/hu-HU/changelogs/40104130.txt
Normal file
2
fastlane/metadata/android/hu-HU/changelogs/40104130.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Főbb változások ebben a verzióban: Lehetővé teszi a felhasználók számára, hogy offline jelenjenek meg, és audio lejátszót ad hozzá a hangmellékletekhez.
|
||||
Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/hu-HU/changelogs/40104140.txt
Normal file
2
fastlane/metadata/android/hu-HU/changelogs/40104140.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Főbb változások ebben a verzióban: A figyelmen kívül hagyott felhasználók kezelésének javítása. Különböző hibajavítások és stabilitásjavítások.
|
||||
Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/hu-HU/changelogs/40104160.txt
Normal file
2
fastlane/metadata/android/hu-HU/changelogs/40104160.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Főbb változások ebben a verzióban: A titkosított üzenetek jobb kezelése. Különböző hibajavítások és stabilitásjavítások.
|
||||
Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/hu-HU/changelogs/40104180.txt
Normal file
2
fastlane/metadata/android/hu-HU/changelogs/40104180.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
|
||||
Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/hu-HU/changelogs/40104190.txt
Normal file
2
fastlane/metadata/android/hu-HU/changelogs/40104190.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
|
||||
Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/hu-HU/changelogs/40104200.txt
Normal file
2
fastlane/metadata/android/hu-HU/changelogs/40104200.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
|
||||
Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/hu-HU/changelogs/40104220.txt
Normal file
2
fastlane/metadata/android/hu-HU/changelogs/40104220.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
|
||||
Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/hu-HU/changelogs/40104230.txt
Normal file
2
fastlane/metadata/android/hu-HU/changelogs/40104230.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
|
||||
Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/hu-HU/changelogs/40104240.txt
Normal file
2
fastlane/metadata/android/hu-HU/changelogs/40104240.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
|
||||
Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/hu-HU/changelogs/40104250.txt
Normal file
2
fastlane/metadata/android/hu-HU/changelogs/40104250.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
|
||||
Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/hu-HU/changelogs/40104260.txt
Normal file
2
fastlane/metadata/android/hu-HU/changelogs/40104260.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Főbb változások ebben a verzióban: UnifiedPush használata, és lehetővé teszi a felhasználó számára, hogy FCM nélkül tolja.
|
||||
Teljes változásnapló: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/hu-HU/changelogs/40104270.txt
Normal file
2
fastlane/metadata/android/hu-HU/changelogs/40104270.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
|
||||
Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/hu-HU/changelogs/40104280.txt
Normal file
2
fastlane/metadata/android/hu-HU/changelogs/40104280.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
|
||||
Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/hu-HU/changelogs/40104300.txt
Normal file
2
fastlane/metadata/android/hu-HU/changelogs/40104300.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Főbb változások ebben a verzióban: Lehetővé teszi a továbbfejlesztett bejelentkezési és regisztrációs utakat.
|
||||
Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/hu-HU/changelogs/40104310.txt
Normal file
2
fastlane/metadata/android/hu-HU/changelogs/40104310.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Főbb változások ebben a verzióban: Lehetővé teszi a továbbfejlesztett bejelentkezési és regisztrációs utakat.
|
||||
Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/hu-HU/changelogs/40104320.txt
Normal file
2
fastlane/metadata/android/hu-HU/changelogs/40104320.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
|
||||
Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/hu-HU/changelogs/40104340.txt
Normal file
2
fastlane/metadata/android/hu-HU/changelogs/40104340.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
|
||||
Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/id/changelogs/40104340.txt
Normal file
2
fastlane/metadata/android/id/changelogs/40104340.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Perubahan utama dalam versi ini: Banyak perbaikan kutu dan perbaikan stabilitas.
|
||||
Catatan perubahan lanjutan: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/it-IT/changelogs/40104340.txt
Normal file
2
fastlane/metadata/android/it-IT/changelogs/40104340.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Modifiche principali in questa versione: varie correzioni di errori e miglioramenti della stabilità.
|
||||
Cronologia completa: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/pl-PL/changelogs/40104340.txt
Normal file
2
fastlane/metadata/android/pl-PL/changelogs/40104340.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Główne zmiany w tej wersji: Rozmaite poprawki błędów i usprawnienia stabilności.
|
||||
Pełna lista zmian: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/pt-BR/changelogs/40104340.txt
Normal file
2
fastlane/metadata/android/pt-BR/changelogs/40104340.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Principais mudanças nesta versão: Vários consertos de bugs e melhorias de estabilidade.
|
||||
Changelog completo: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/sk/changelogs/40104340.txt
Normal file
2
fastlane/metadata/android/sk/changelogs/40104340.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Hlavné zmeny v tejto verzii: Rôzne opravy chýb a vylepšenia stability.
|
||||
Úplný zoznam zmien: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/uk/changelogs/40104340.txt
Normal file
2
fastlane/metadata/android/uk/changelogs/40104340.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Основні зміни в цій версії: Усунуто різні вади й поліпшено стабільність.
|
||||
Перелік усіх змін: https://github.com/vector-im/element-android/releases
|
2
fastlane/metadata/android/zh-TW/changelogs/40104340.txt
Normal file
2
fastlane/metadata/android/zh-TW/changelogs/40104340.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
此版本中的主要變動:多個臭蟲修復與穩定性改善。
|
||||
完整的變更紀錄:https://github.com/vector-im/element-android/releases
|
@@ -12,6 +12,7 @@ org.gradle.jvmargs=-Xmx4g -Xms512M -XX:MaxPermSize=2048m -XX:MaxMetaspaceSize=1g
|
||||
org.gradle.configureondemand=true
|
||||
org.gradle.parallel=true
|
||||
org.gradle.vfs.watch=true
|
||||
org.gradle.caching=true
|
||||
|
||||
# Android Settings
|
||||
android.enableJetifier=true
|
||||
|
26
library/external/dialpad/build.gradle
vendored
Normal file
26
library/external/dialpad/build.gradle
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
apply plugin: 'com.android.library'
|
||||
apply plugin: 'kotlin-android'
|
||||
|
||||
android {
|
||||
compileSdk versions.compileSdk
|
||||
|
||||
defaultConfig {
|
||||
minSdk versions.minSdk
|
||||
targetSdk versions.targetSdk
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility versions.sourceCompat
|
||||
targetCompatibility versions.targetCompat
|
||||
}
|
||||
|
||||
kotlinOptions {
|
||||
jvmTarget = "11"
|
||||
}
|
||||
}
|
||||
|
||||
afterEvaluate {
|
||||
tasks.findAll { it.name.startsWith("lint") }.each {
|
||||
it.enabled = false
|
||||
}
|
||||
}
|
2
library/external/dialpad/src/main/AndroidManifest.xml
vendored
Normal file
2
library/external/dialpad/src/main/AndroidManifest.xml
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest package="com.android.dialer.dialpadview" />
|
26
library/external/dialpad/src/main/java/com/android/dialer/animation/AnimUtils.java
vendored
Normal file
26
library/external/dialpad/src/main/java/com/android/dialer/animation/AnimUtils.java
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Copyright (C) 2014 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License
|
||||
*/
|
||||
|
||||
package com.android.dialer.animation;
|
||||
|
||||
import android.view.animation.Interpolator;
|
||||
|
||||
import com.android.dialer.compat.PathInterpolatorCompat;
|
||||
|
||||
public class AnimUtils {
|
||||
public static final Interpolator EASE_OUT_EASE_IN =
|
||||
PathInterpolatorCompat.create(0.4f, 0, 0.2f, 1);
|
||||
}
|
120
library/external/dialpad/src/main/java/com/android/dialer/compat/PathInterpolatorCompat.java
vendored
Normal file
120
library/external/dialpad/src/main/java/com/android/dialer/compat/PathInterpolatorCompat.java
vendored
Normal file
@@ -0,0 +1,120 @@
|
||||
/*
|
||||
* Copyright (C) 2015 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License
|
||||
*/
|
||||
|
||||
package com.android.dialer.compat;
|
||||
|
||||
import android.graphics.Path;
|
||||
import android.graphics.PathMeasure;
|
||||
import android.os.Build;
|
||||
import android.view.animation.Interpolator;
|
||||
import android.view.animation.PathInterpolator;
|
||||
|
||||
public class PathInterpolatorCompat {
|
||||
|
||||
public static Interpolator create(
|
||||
float controlX1, float controlY1, float controlX2, float controlY2) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
return new PathInterpolator(controlX1, controlY1, controlX2, controlY2);
|
||||
}
|
||||
return new PathInterpolatorBase(controlX1, controlY1, controlX2, controlY2);
|
||||
}
|
||||
|
||||
private static class PathInterpolatorBase implements Interpolator {
|
||||
|
||||
/** Governs the accuracy of the approximation of the {@link Path}. */
|
||||
private static final float PRECISION = 0.002f;
|
||||
|
||||
private final float[] mX;
|
||||
private final float[] mY;
|
||||
|
||||
public PathInterpolatorBase(Path path) {
|
||||
final PathMeasure pathMeasure = new PathMeasure(path, false /* forceClosed */);
|
||||
|
||||
final float pathLength = pathMeasure.getLength();
|
||||
final int numPoints = (int) (pathLength / PRECISION) + 1;
|
||||
|
||||
mX = new float[numPoints];
|
||||
mY = new float[numPoints];
|
||||
|
||||
final float[] position = new float[2];
|
||||
for (int i = 0; i < numPoints; ++i) {
|
||||
final float distance = (i * pathLength) / (numPoints - 1);
|
||||
pathMeasure.getPosTan(distance, position, null /* tangent */);
|
||||
|
||||
mX[i] = position[0];
|
||||
mY[i] = position[1];
|
||||
}
|
||||
}
|
||||
|
||||
public PathInterpolatorBase(float controlX, float controlY) {
|
||||
this(createQuad(controlX, controlY));
|
||||
}
|
||||
|
||||
public PathInterpolatorBase(
|
||||
float controlX1, float controlY1, float controlX2, float controlY2) {
|
||||
this(createCubic(controlX1, controlY1, controlX2, controlY2));
|
||||
}
|
||||
|
||||
private static Path createQuad(float controlX, float controlY) {
|
||||
final Path path = new Path();
|
||||
path.moveTo(0.0f, 0.0f);
|
||||
path.quadTo(controlX, controlY, 1.0f, 1.0f);
|
||||
return path;
|
||||
}
|
||||
|
||||
private static Path createCubic(
|
||||
float controlX1, float controlY1, float controlX2, float controlY2) {
|
||||
final Path path = new Path();
|
||||
path.moveTo(0.0f, 0.0f);
|
||||
path.cubicTo(controlX1, controlY1, controlX2, controlY2, 1.0f, 1.0f);
|
||||
return path;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getInterpolation(float t) {
|
||||
if (t <= 0.0f) {
|
||||
return 0.0f;
|
||||
} else if (t >= 1.0f) {
|
||||
return 1.0f;
|
||||
}
|
||||
|
||||
// Do a binary search for the correct x to interpolate between.
|
||||
int startIndex = 0;
|
||||
int endIndex = mX.length - 1;
|
||||
while (endIndex - startIndex > 1) {
|
||||
int midIndex = (startIndex + endIndex) / 2;
|
||||
if (t < mX[midIndex]) {
|
||||
endIndex = midIndex;
|
||||
} else {
|
||||
startIndex = midIndex;
|
||||
}
|
||||
}
|
||||
|
||||
final float xRange = mX[endIndex] - mX[startIndex];
|
||||
if (xRange == 0) {
|
||||
return mY[startIndex];
|
||||
}
|
||||
|
||||
final float tInRange = t - mX[startIndex];
|
||||
final float fraction = tInRange / xRange;
|
||||
|
||||
final float startY = mY[startIndex];
|
||||
final float endY = mY[endIndex];
|
||||
|
||||
return startY + (fraction * (endY - startY));
|
||||
}
|
||||
}
|
||||
}
|
231
library/external/dialpad/src/main/java/com/android/dialer/dialpadview/DialpadKeyButton.java
vendored
Normal file
231
library/external/dialpad/src/main/java/com/android/dialer/dialpadview/DialpadKeyButton.java
vendored
Normal file
@@ -0,0 +1,231 @@
|
||||
/*
|
||||
* Copyright (C) 2012 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.dialer.dialpadview;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.RectF;
|
||||
import android.os.Bundle;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewConfiguration;
|
||||
import android.view.accessibility.AccessibilityEvent;
|
||||
import android.view.accessibility.AccessibilityManager;
|
||||
import android.view.accessibility.AccessibilityNodeInfo;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
/**
|
||||
* Custom class for dialpad buttons.
|
||||
*
|
||||
* <p>When touch exploration mode is enabled for accessibility, this class implements the
|
||||
* lift-to-type interaction model:
|
||||
*
|
||||
* <ul>
|
||||
* <li>Hovering over the button will cause it to gain accessibility focus
|
||||
* <li>Removing the hover pointer while inside the bounds of the button will perform a click action
|
||||
* <li>If long-click is supported, hovering over the button for a longer period of time will switch
|
||||
* to the long-click action
|
||||
* <li>Moving the hover pointer outside of the bounds of the button will restore to the normal click
|
||||
* action
|
||||
* </ul>
|
||||
*/
|
||||
public class DialpadKeyButton extends FrameLayout {
|
||||
|
||||
/** Timeout before switching to long-click accessibility mode. */
|
||||
private static final int LONG_HOVER_TIMEOUT = ViewConfiguration.getLongPressTimeout() * 2;
|
||||
|
||||
/** Accessibility manager instance used to check touch exploration state. */
|
||||
private AccessibilityManager mAccessibilityManager;
|
||||
|
||||
/** Bounds used to filter HOVER_EXIT events. */
|
||||
private RectF mHoverBounds = new RectF();
|
||||
|
||||
/** Whether this view is currently in the long-hover state. */
|
||||
private boolean mLongHovered;
|
||||
|
||||
/** Alternate content description for long-hover state. */
|
||||
private CharSequence mLongHoverContentDesc;
|
||||
|
||||
/** Backup of standard content description. Used for accessibility. */
|
||||
private CharSequence mBackupContentDesc;
|
||||
|
||||
/** Backup of clickable property. Used for accessibility. */
|
||||
private boolean mWasClickable;
|
||||
|
||||
/** Backup of long-clickable property. Used for accessibility. */
|
||||
private boolean mWasLongClickable;
|
||||
|
||||
/** Runnable used to trigger long-click mode for accessibility. */
|
||||
private Runnable mLongHoverRunnable;
|
||||
|
||||
private OnPressedListener mOnPressedListener;
|
||||
|
||||
public DialpadKeyButton(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
initForAccessibility(context);
|
||||
}
|
||||
|
||||
public DialpadKeyButton(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
initForAccessibility(context);
|
||||
}
|
||||
|
||||
public void setOnPressedListener(OnPressedListener onPressedListener) {
|
||||
mOnPressedListener = onPressedListener;
|
||||
}
|
||||
|
||||
private void initForAccessibility(Context context) {
|
||||
mAccessibilityManager =
|
||||
(AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
|
||||
}
|
||||
|
||||
public void setLongHoverContentDescription(CharSequence contentDescription) {
|
||||
mLongHoverContentDesc = contentDescription;
|
||||
|
||||
if (mLongHovered) {
|
||||
super.setContentDescription(mLongHoverContentDesc);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setContentDescription(CharSequence contentDescription) {
|
||||
if (mLongHovered) {
|
||||
mBackupContentDesc = contentDescription;
|
||||
} else {
|
||||
super.setContentDescription(contentDescription);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPressed(boolean pressed) {
|
||||
super.setPressed(pressed);
|
||||
if (mOnPressedListener != null) {
|
||||
mOnPressedListener.onPressed(this, pressed);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSizeChanged(int w, int h, int oldw, int oldh) {
|
||||
super.onSizeChanged(w, h, oldw, oldh);
|
||||
|
||||
mHoverBounds.left = getPaddingLeft();
|
||||
mHoverBounds.right = w - getPaddingRight();
|
||||
mHoverBounds.top = getPaddingTop();
|
||||
mHoverBounds.bottom = h - getPaddingBottom();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean performAccessibilityAction(int action, Bundle arguments) {
|
||||
if (action == AccessibilityNodeInfo.ACTION_CLICK) {
|
||||
simulateClickForAccessibility();
|
||||
return true;
|
||||
}
|
||||
|
||||
return super.performAccessibilityAction(action, arguments);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onHoverEvent(MotionEvent event) {
|
||||
// When touch exploration is turned on, lifting a finger while inside
|
||||
// the button's hover target bounds should perform a click action.
|
||||
if (mAccessibilityManager.isEnabled() && mAccessibilityManager.isTouchExplorationEnabled()) {
|
||||
switch (event.getActionMasked()) {
|
||||
case MotionEvent.ACTION_HOVER_ENTER:
|
||||
// Lift-to-type temporarily disables double-tap activation.
|
||||
mWasClickable = isClickable();
|
||||
mWasLongClickable = isLongClickable();
|
||||
if (mWasLongClickable && mLongHoverContentDesc != null) {
|
||||
if (mLongHoverRunnable == null) {
|
||||
mLongHoverRunnable =
|
||||
new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
setLongHovered(true);
|
||||
announceForAccessibility(mLongHoverContentDesc);
|
||||
}
|
||||
};
|
||||
}
|
||||
postDelayed(mLongHoverRunnable, LONG_HOVER_TIMEOUT);
|
||||
}
|
||||
|
||||
setClickable(false);
|
||||
setLongClickable(false);
|
||||
break;
|
||||
case MotionEvent.ACTION_HOVER_EXIT:
|
||||
if (mHoverBounds.contains(event.getX(), event.getY())) {
|
||||
if (mLongHovered) {
|
||||
performLongClick();
|
||||
} else {
|
||||
simulateClickForAccessibility();
|
||||
}
|
||||
}
|
||||
|
||||
cancelLongHover();
|
||||
setClickable(mWasClickable);
|
||||
setLongClickable(mWasLongClickable);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return super.onHoverEvent(event);
|
||||
}
|
||||
|
||||
/**
|
||||
* When accessibility is on, simulate press and release to preserve the semantic meaning of
|
||||
* performClick(). Required for Braille support.
|
||||
*/
|
||||
private void simulateClickForAccessibility() {
|
||||
// Checking the press state prevents double activation.
|
||||
if (isPressed()) {
|
||||
return;
|
||||
}
|
||||
|
||||
setPressed(true);
|
||||
|
||||
// Stay consistent with performClick() by sending the event after
|
||||
// setting the pressed state but before performing the action.
|
||||
sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
|
||||
|
||||
setPressed(false);
|
||||
}
|
||||
|
||||
private void setLongHovered(boolean enabled) {
|
||||
if (mLongHovered != enabled) {
|
||||
mLongHovered = enabled;
|
||||
|
||||
// Switch between normal and alternate description, if available.
|
||||
if (enabled) {
|
||||
mBackupContentDesc = getContentDescription();
|
||||
super.setContentDescription(mLongHoverContentDesc);
|
||||
} else {
|
||||
super.setContentDescription(mBackupContentDesc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void cancelLongHover() {
|
||||
if (mLongHoverRunnable != null) {
|
||||
removeCallbacks(mLongHoverRunnable);
|
||||
}
|
||||
setLongHovered(false);
|
||||
}
|
||||
|
||||
public interface OnPressedListener {
|
||||
|
||||
void onPressed(View view, boolean pressed);
|
||||
}
|
||||
}
|
71
library/external/dialpad/src/main/java/com/android/dialer/dialpadview/DialpadTextView.java
vendored
Normal file
71
library/external/dialpad/src/main/java/com/android/dialer/dialpadview/DialpadTextView.java
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* Copyright (C) 2014 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License
|
||||
*/
|
||||
|
||||
package com.android.dialer.dialpadview;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Rect;
|
||||
import android.util.AttributeSet;
|
||||
import android.widget.TextView;
|
||||
|
||||
/**
|
||||
* This is a custom text view intended only for rendering the numerals (and star and pound) on the
|
||||
* dialpad. TextView has built in top/bottom padding to help account for ascenders/descenders.
|
||||
*
|
||||
* <p>Since vertical space is at a premium on the dialpad, particularly if the font size is scaled
|
||||
* to a larger default, for the dialpad we use this class to more precisely render characters
|
||||
* according to the precise amount of space they need.
|
||||
*/
|
||||
public class DialpadTextView extends TextView {
|
||||
|
||||
private Rect mTextBounds = new Rect();
|
||||
private String mTextStr;
|
||||
|
||||
public DialpadTextView(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
/** Draw the text to fit within the height/width which have been specified during measurement. */
|
||||
@Override
|
||||
public void draw(Canvas canvas) {
|
||||
Paint paint = getPaint();
|
||||
|
||||
// Without this, the draw does not respect the style's specified text color.
|
||||
paint.setColor(getCurrentTextColor());
|
||||
|
||||
// The text bounds values are relative and can be negative,, so rather than specifying a
|
||||
// standard origin such as 0, 0, we need to use negative of the left/top bounds.
|
||||
// For example, the bounds may be: Left: 11, Right: 37, Top: -77, Bottom: 0
|
||||
canvas.drawText(mTextStr, -mTextBounds.left, -mTextBounds.top, paint);
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the pixel-accurate bounds of the text when rendered, and use that to specify the
|
||||
* height and width.
|
||||
*/
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
||||
mTextStr = getText().toString();
|
||||
getPaint().getTextBounds(mTextStr, 0, mTextStr.length(), mTextBounds);
|
||||
|
||||
int width = resolveSize(mTextBounds.width(), widthMeasureSpec);
|
||||
int height = resolveSize(mTextBounds.height(), heightMeasureSpec);
|
||||
setMeasuredDimension(width, height);
|
||||
}
|
||||
}
|
455
library/external/dialpad/src/main/java/com/android/dialer/dialpadview/DialpadView.java
vendored
Normal file
455
library/external/dialpad/src/main/java/com/android/dialer/dialpadview/DialpadView.java
vendored
Normal file
@@ -0,0 +1,455 @@
|
||||
/*
|
||||
* Copyright (C) 2014 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.dialer.dialpadview;
|
||||
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Build;
|
||||
import android.text.Spannable;
|
||||
import android.text.TextUtils;
|
||||
import android.text.style.TtsSpan;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.ViewPropertyAnimator;
|
||||
import android.view.accessibility.AccessibilityManager;
|
||||
import android.widget.EditText;
|
||||
import android.widget.ImageButton;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.android.dialer.animation.AnimUtils;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.text.NumberFormat;
|
||||
import java.util.Locale;
|
||||
|
||||
/** View that displays a twelve-key phone dialpad. */
|
||||
public class DialpadView extends LinearLayout {
|
||||
|
||||
private static final String TAG = DialpadView.class.getSimpleName();
|
||||
|
||||
private static final double DELAY_MULTIPLIER = 0.66;
|
||||
private static final double DURATION_MULTIPLIER = 0.8;
|
||||
// For animation.
|
||||
private static final int KEY_FRAME_DURATION = 33;
|
||||
/** {@code True} if the dialpad is in landscape orientation. */
|
||||
private final boolean mIsLandscape;
|
||||
/** {@code True} if the dialpad is showing in a right-to-left locale. */
|
||||
private final boolean mIsRtl;
|
||||
|
||||
private final int[] mButtonIds =
|
||||
new int[] {
|
||||
R.id.zero,
|
||||
R.id.one,
|
||||
R.id.two,
|
||||
R.id.three,
|
||||
R.id.four,
|
||||
R.id.five,
|
||||
R.id.six,
|
||||
R.id.seven,
|
||||
R.id.eight,
|
||||
R.id.nine,
|
||||
R.id.star,
|
||||
R.id.pound
|
||||
};
|
||||
private EditText mDigits;
|
||||
private ImageButton mDelete;
|
||||
private View mOverflowMenuButton;
|
||||
private ViewGroup mRateContainer;
|
||||
private TextView mIldCountry;
|
||||
private TextView mIldRate;
|
||||
private boolean mCanDigitsBeEdited;
|
||||
private int mTranslateDistance;
|
||||
|
||||
public DialpadView(Context context) {
|
||||
this(context, null);
|
||||
}
|
||||
|
||||
public DialpadView(Context context, AttributeSet attrs) {
|
||||
this(context, attrs, 0);
|
||||
}
|
||||
|
||||
public DialpadView(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
|
||||
mTranslateDistance =
|
||||
getResources().getDimensionPixelSize(R.dimen.dialpad_key_button_translate_y);
|
||||
|
||||
mIsLandscape =
|
||||
getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
|
||||
mIsRtl = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 &&
|
||||
TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) == View.LAYOUT_DIRECTION_RTL;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFinishInflate() {
|
||||
setupKeypad();
|
||||
mDigits = (EditText) findViewById(R.id.digits);
|
||||
mDelete = (ImageButton) findViewById(R.id.deleteButton);
|
||||
mOverflowMenuButton = findViewById(R.id.dialpad_overflow);
|
||||
mRateContainer = (ViewGroup) findViewById(R.id.rate_container);
|
||||
mIldCountry = (TextView) mRateContainer.findViewById(R.id.ild_country);
|
||||
mIldRate = (TextView) mRateContainer.findViewById(R.id.ild_rate);
|
||||
|
||||
AccessibilityManager accessibilityManager =
|
||||
(AccessibilityManager) getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
|
||||
if (accessibilityManager.isEnabled()) {
|
||||
// The text view must be selected to send accessibility events.
|
||||
mDigits.setSelected(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void setupKeypad() {
|
||||
final int[] letterIds =
|
||||
new int[] {
|
||||
R.string.dialpad_0_letters,
|
||||
R.string.dialpad_1_letters,
|
||||
R.string.dialpad_2_letters,
|
||||
R.string.dialpad_3_letters,
|
||||
R.string.dialpad_4_letters,
|
||||
R.string.dialpad_5_letters,
|
||||
R.string.dialpad_6_letters,
|
||||
R.string.dialpad_7_letters,
|
||||
R.string.dialpad_8_letters,
|
||||
R.string.dialpad_9_letters,
|
||||
R.string.dialpad_star_letters,
|
||||
R.string.dialpad_pound_letters
|
||||
};
|
||||
|
||||
final Resources resources = getContext().getResources();
|
||||
|
||||
DialpadKeyButton dialpadKey;
|
||||
TextView numberView;
|
||||
TextView lettersView;
|
||||
|
||||
final Locale currentLocale = resources.getConfiguration().locale;
|
||||
final NumberFormat nf;
|
||||
// We translate dialpad numbers only for "fa" and not any other locale
|
||||
// ("ar" anybody ?).
|
||||
if ("fa".equals(currentLocale.getLanguage())) {
|
||||
nf = DecimalFormat.getInstance(resources.getConfiguration().locale);
|
||||
} else {
|
||||
nf = DecimalFormat.getInstance(Locale.ENGLISH);
|
||||
}
|
||||
|
||||
for (int i = 0; i < mButtonIds.length; i++) {
|
||||
dialpadKey = (DialpadKeyButton) findViewById(mButtonIds[i]);
|
||||
numberView = (TextView) dialpadKey.findViewById(R.id.dialpad_key_number);
|
||||
lettersView = (TextView) dialpadKey.findViewById(R.id.dialpad_key_letters);
|
||||
|
||||
final String numberString;
|
||||
final CharSequence numberContentDescription;
|
||||
if (mButtonIds[i] == R.id.pound) {
|
||||
numberString = resources.getString(R.string.dialpad_pound_number);
|
||||
numberContentDescription = numberString;
|
||||
} else if (mButtonIds[i] == R.id.star) {
|
||||
numberString = resources.getString(R.string.dialpad_star_number);
|
||||
numberContentDescription = numberString;
|
||||
} else {
|
||||
numberString = nf.format(i);
|
||||
// The content description is used for Talkback key presses. The number is
|
||||
// separated by a "," to introduce a slight delay. Convert letters into a verbatim
|
||||
// span so that they are read as letters instead of as one word.
|
||||
String letters = resources.getString(letterIds[i]);
|
||||
Spannable spannable =
|
||||
Spannable.Factory.getInstance().newSpannable(numberString + "," + letters);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
spannable.setSpan(
|
||||
(new TtsSpan.VerbatimBuilder(letters)).build(),
|
||||
numberString.length() + 1,
|
||||
numberString.length() + 1 + letters.length(),
|
||||
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
}
|
||||
numberContentDescription = spannable;
|
||||
}
|
||||
|
||||
numberView.setText(numberString);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
numberView.setElegantTextHeight(false);
|
||||
}
|
||||
dialpadKey.setContentDescription(numberContentDescription);
|
||||
|
||||
if (lettersView != null) {
|
||||
lettersView.setText(resources.getString(letterIds[i]));
|
||||
}
|
||||
}
|
||||
|
||||
final DialpadKeyButton one = (DialpadKeyButton) findViewById(R.id.one);
|
||||
one.setLongHoverContentDescription(resources.getText(R.string.description_voicemail_button));
|
||||
|
||||
final DialpadKeyButton zero = (DialpadKeyButton) findViewById(R.id.zero);
|
||||
zero.setLongHoverContentDescription(resources.getText(R.string.description_image_button_plus));
|
||||
}
|
||||
|
||||
private Drawable getDrawableCompat(Context context, int id) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
return context.getDrawable(id);
|
||||
} else {
|
||||
return context.getResources().getDrawable(id);
|
||||
}
|
||||
}
|
||||
|
||||
public void setShowVoicemailButton(boolean show) {
|
||||
View view = findViewById(R.id.dialpad_key_voicemail);
|
||||
if (view != null) {
|
||||
view.setVisibility(show ? View.VISIBLE : View.INVISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether or not the digits above the dialer can be edited.
|
||||
*
|
||||
* @param canBeEdited If true, the backspace button will be shown and the digits EditText will be
|
||||
* configured to allow text manipulation.
|
||||
*/
|
||||
public void setCanDigitsBeEdited(boolean canBeEdited) {
|
||||
// View deleteButton = findViewById(R.id.deleteButton);
|
||||
// deleteButton.setVisibility(canBeEdited ? View.VISIBLE : View.INVISIBLE);
|
||||
// View overflowMenuButton = findViewById(R.id.dialpad_overflow);
|
||||
// overflowMenuButton.setVisibility(canBeEdited ? View.VISIBLE : View.GONE);
|
||||
|
||||
// EditText digits = (EditText) findViewById(R.id.digits);
|
||||
// digits.setClickable(canBeEdited);
|
||||
// digits.setLongClickable(canBeEdited);
|
||||
// digits.setFocusableInTouchMode(canBeEdited);
|
||||
// digits.setCursorVisible(false);
|
||||
|
||||
mCanDigitsBeEdited = canBeEdited;
|
||||
}
|
||||
|
||||
public void setCallRateInformation(String countryName, String displayRate) {
|
||||
if (TextUtils.isEmpty(countryName) && TextUtils.isEmpty(displayRate)) {
|
||||
mRateContainer.setVisibility(View.GONE);
|
||||
return;
|
||||
}
|
||||
mRateContainer.setVisibility(View.VISIBLE);
|
||||
mIldCountry.setText(countryName);
|
||||
mIldRate.setText(displayRate);
|
||||
}
|
||||
|
||||
public boolean canDigitsBeEdited() {
|
||||
return mCanDigitsBeEdited;
|
||||
}
|
||||
|
||||
/**
|
||||
* Always returns true for onHoverEvent callbacks, to fix problems with accessibility due to the
|
||||
* dialpad overlaying other fragments.
|
||||
*/
|
||||
@Override
|
||||
public boolean onHoverEvent(MotionEvent event) {
|
||||
return true;
|
||||
}
|
||||
|
||||
public void animateShow() {
|
||||
// This is a hack; without this, the setTranslationY is delayed in being applied, and the
|
||||
// numbers appear at their original position (0) momentarily before animating.
|
||||
final AnimatorListenerAdapter showListener = new AnimatorListenerAdapter() {};
|
||||
|
||||
for (int i = 0; i < mButtonIds.length; i++) {
|
||||
int delay = (int) (getKeyButtonAnimationDelay(mButtonIds[i]) * DELAY_MULTIPLIER);
|
||||
int duration = (int) (getKeyButtonAnimationDuration(mButtonIds[i]) * DURATION_MULTIPLIER);
|
||||
final DialpadKeyButton dialpadKey = (DialpadKeyButton) findViewById(mButtonIds[i]);
|
||||
|
||||
ViewPropertyAnimator animator = dialpadKey.animate();
|
||||
if (mIsLandscape) {
|
||||
// Landscape orientation requires translation along the X axis.
|
||||
// For RTL locales, ensure we translate negative on the X axis.
|
||||
dialpadKey.setTranslationX((mIsRtl ? -1 : 1) * mTranslateDistance);
|
||||
animator.translationX(0);
|
||||
} else {
|
||||
// Portrait orientation requires translation along the Y axis.
|
||||
dialpadKey.setTranslationY(mTranslateDistance);
|
||||
animator.translationY(0);
|
||||
}
|
||||
animator
|
||||
.setInterpolator(AnimUtils.EASE_OUT_EASE_IN)
|
||||
.setStartDelay(delay)
|
||||
.setDuration(duration)
|
||||
.setListener(showListener)
|
||||
.start();
|
||||
}
|
||||
}
|
||||
|
||||
public EditText getDigits() {
|
||||
return mDigits;
|
||||
}
|
||||
|
||||
public ImageButton getDeleteButton() {
|
||||
return mDelete;
|
||||
}
|
||||
|
||||
public View getOverflowMenuButton() {
|
||||
return mOverflowMenuButton;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the animation delay for the buttons, taking into account whether the dialpad is in
|
||||
* landscape left-to-right, landscape right-to-left, or portrait.
|
||||
*
|
||||
* @param buttonId The button ID.
|
||||
* @return The animation delay.
|
||||
*/
|
||||
private int getKeyButtonAnimationDelay(int buttonId) {
|
||||
if (mIsLandscape) {
|
||||
if (mIsRtl) {
|
||||
if (buttonId == R.id.three) {
|
||||
return KEY_FRAME_DURATION * 1;
|
||||
} else if (buttonId == R.id.six) {
|
||||
return KEY_FRAME_DURATION * 2;
|
||||
} else if (buttonId == R.id.nine) {
|
||||
return KEY_FRAME_DURATION * 3;
|
||||
} else if (buttonId == R.id.pound) {
|
||||
return KEY_FRAME_DURATION * 4;
|
||||
} else if (buttonId == R.id.two) {
|
||||
return KEY_FRAME_DURATION * 5;
|
||||
} else if (buttonId == R.id.five) {
|
||||
return KEY_FRAME_DURATION * 6;
|
||||
} else if (buttonId == R.id.eight) {
|
||||
return KEY_FRAME_DURATION * 7;
|
||||
} else if (buttonId == R.id.zero) {
|
||||
return KEY_FRAME_DURATION * 8;
|
||||
} else if (buttonId == R.id.one) {
|
||||
return KEY_FRAME_DURATION * 9;
|
||||
} else if (buttonId == R.id.four) {
|
||||
return KEY_FRAME_DURATION * 10;
|
||||
} else if (buttonId == R.id.seven || buttonId == R.id.star) {
|
||||
return KEY_FRAME_DURATION * 11;
|
||||
}
|
||||
} else {
|
||||
if (buttonId == R.id.one) {
|
||||
return KEY_FRAME_DURATION * 1;
|
||||
} else if (buttonId == R.id.four) {
|
||||
return KEY_FRAME_DURATION * 2;
|
||||
} else if (buttonId == R.id.seven) {
|
||||
return KEY_FRAME_DURATION * 3;
|
||||
} else if (buttonId == R.id.star) {
|
||||
return KEY_FRAME_DURATION * 4;
|
||||
} else if (buttonId == R.id.two) {
|
||||
return KEY_FRAME_DURATION * 5;
|
||||
} else if (buttonId == R.id.five) {
|
||||
return KEY_FRAME_DURATION * 6;
|
||||
} else if (buttonId == R.id.eight) {
|
||||
return KEY_FRAME_DURATION * 7;
|
||||
} else if (buttonId == R.id.zero) {
|
||||
return KEY_FRAME_DURATION * 8;
|
||||
} else if (buttonId == R.id.three) {
|
||||
return KEY_FRAME_DURATION * 9;
|
||||
} else if (buttonId == R.id.six) {
|
||||
return KEY_FRAME_DURATION * 10;
|
||||
} else if (buttonId == R.id.nine || buttonId == R.id.pound) {
|
||||
return KEY_FRAME_DURATION * 11;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (buttonId == R.id.one) {
|
||||
return KEY_FRAME_DURATION * 1;
|
||||
} else if (buttonId == R.id.two) {
|
||||
return KEY_FRAME_DURATION * 2;
|
||||
} else if (buttonId == R.id.three) {
|
||||
return KEY_FRAME_DURATION * 3;
|
||||
} else if (buttonId == R.id.four) {
|
||||
return KEY_FRAME_DURATION * 4;
|
||||
} else if (buttonId == R.id.five) {
|
||||
return KEY_FRAME_DURATION * 5;
|
||||
} else if (buttonId == R.id.six) {
|
||||
return KEY_FRAME_DURATION * 6;
|
||||
} else if (buttonId == R.id.seven) {
|
||||
return KEY_FRAME_DURATION * 7;
|
||||
} else if (buttonId == R.id.eight) {
|
||||
return KEY_FRAME_DURATION * 8;
|
||||
} else if (buttonId == R.id.nine) {
|
||||
return KEY_FRAME_DURATION * 9;
|
||||
} else if (buttonId == R.id.star) {
|
||||
return KEY_FRAME_DURATION * 10;
|
||||
} else if (buttonId == R.id.zero || buttonId == R.id.pound) {
|
||||
return KEY_FRAME_DURATION * 11;
|
||||
}
|
||||
}
|
||||
|
||||
Log.wtf(TAG, "Attempted to get animation delay for invalid key button id.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the button animation duration, taking into account whether the dialpad is in landscape
|
||||
* left-to-right, landscape right-to-left, or portrait.
|
||||
*
|
||||
* @param buttonId The button ID.
|
||||
* @return The animation duration.
|
||||
*/
|
||||
private int getKeyButtonAnimationDuration(int buttonId) {
|
||||
if (mIsLandscape) {
|
||||
if (mIsRtl) {
|
||||
if (buttonId == R.id.one
|
||||
|| buttonId == R.id.four
|
||||
|| buttonId == R.id.seven
|
||||
|| buttonId == R.id.star) {
|
||||
return KEY_FRAME_DURATION * 8;
|
||||
} else if (buttonId == R.id.two
|
||||
|| buttonId == R.id.five
|
||||
|| buttonId == R.id.eight
|
||||
|| buttonId == R.id.zero) {
|
||||
return KEY_FRAME_DURATION * 9;
|
||||
} else if (buttonId == R.id.three
|
||||
|| buttonId == R.id.six
|
||||
|| buttonId == R.id.nine
|
||||
|| buttonId == R.id.pound) {
|
||||
return KEY_FRAME_DURATION * 10;
|
||||
}
|
||||
} else {
|
||||
if (buttonId == R.id.one
|
||||
|| buttonId == R.id.four
|
||||
|| buttonId == R.id.seven
|
||||
|| buttonId == R.id.star) {
|
||||
return KEY_FRAME_DURATION * 10;
|
||||
} else if (buttonId == R.id.two
|
||||
|| buttonId == R.id.five
|
||||
|| buttonId == R.id.eight
|
||||
|| buttonId == R.id.zero) {
|
||||
return KEY_FRAME_DURATION * 9;
|
||||
} else if (buttonId == R.id.three
|
||||
|| buttonId == R.id.six
|
||||
|| buttonId == R.id.nine
|
||||
|| buttonId == R.id.pound) {
|
||||
return KEY_FRAME_DURATION * 8;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (buttonId == R.id.one
|
||||
|| buttonId == R.id.two
|
||||
|| buttonId == R.id.three
|
||||
|| buttonId == R.id.four
|
||||
|| buttonId == R.id.five
|
||||
|| buttonId == R.id.six) {
|
||||
return KEY_FRAME_DURATION * 10;
|
||||
} else if (buttonId == R.id.seven || buttonId == R.id.eight || buttonId == R.id.nine) {
|
||||
return KEY_FRAME_DURATION * 9;
|
||||
} else if (buttonId == R.id.star || buttonId == R.id.zero || buttonId == R.id.pound) {
|
||||
return KEY_FRAME_DURATION * 8;
|
||||
}
|
||||
}
|
||||
|
||||
Log.wtf(TAG, "Attempted to get animation duration for invalid key button id.");
|
||||
return 0;
|
||||
}
|
||||
}
|
84
library/external/dialpad/src/main/java/com/android/dialer/dialpadview/DigitsEditText.java
vendored
Normal file
84
library/external/dialpad/src/main/java/com/android/dialer/dialpadview/DigitsEditText.java
vendored
Normal file
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
* Copyright (C) 2011 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.dialer.dialpadview;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Rect;
|
||||
import android.text.InputType;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
|
||||
import com.android.dialer.widget.ResizingTextEditText;
|
||||
|
||||
/** EditText which suppresses IME show up. */
|
||||
public class DigitsEditText extends ResizingTextEditText {
|
||||
private OnTextContextMenuClickListener mOnTextContextMenuClickListener;
|
||||
|
||||
public DigitsEditText(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
setInputType(getInputType() | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
|
||||
setShowSoftInputOnFocus(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
|
||||
super.onFocusChanged(focused, direction, previouslyFocusedRect);
|
||||
final InputMethodManager imm =
|
||||
((InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE));
|
||||
if (imm != null && imm.isActive(this)) {
|
||||
imm.hideSoftInputFromWindow(getApplicationWindowToken(), 0);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent event) {
|
||||
final boolean ret = super.onTouchEvent(event);
|
||||
// Must be done after super.onTouchEvent()
|
||||
final InputMethodManager imm =
|
||||
((InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE));
|
||||
if (imm != null && imm.isActive(this)) {
|
||||
imm.hideSoftInputFromWindow(getApplicationWindowToken(), 0);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
|
||||
super.onTextChanged(text, start, lengthBefore, lengthAfter);
|
||||
if (isCursorVisible()) {
|
||||
setSelection(getText().length());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTextContextMenuItem(int id) {
|
||||
boolean value = super.onTextContextMenuItem(id);
|
||||
if (mOnTextContextMenuClickListener != null) {
|
||||
mOnTextContextMenuClickListener.onTextContextMenuClickListener(id);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
public interface OnTextContextMenuClickListener {
|
||||
void onTextContextMenuClickListener(int id);
|
||||
}
|
||||
|
||||
public void setOnTextContextMenuClickListener(OnTextContextMenuClickListener listener) {
|
||||
this.mOnTextContextMenuClickListener = listener;
|
||||
}
|
||||
}
|
41
library/external/dialpad/src/main/java/com/android/dialer/util/ViewUtil.java
vendored
Normal file
41
library/external/dialpad/src/main/java/com/android/dialer/util/ViewUtil.java
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright (C) 2012 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.dialer.util;
|
||||
|
||||
import android.graphics.Paint;
|
||||
import android.util.TypedValue;
|
||||
import android.widget.TextView;
|
||||
|
||||
/** Provides static functions to work with views */
|
||||
public class ViewUtil {
|
||||
|
||||
private ViewUtil() {}
|
||||
|
||||
public static void resizeText(TextView textView, int originalTextSize, int minTextSize) {
|
||||
final Paint paint = textView.getPaint();
|
||||
final int width = textView.getWidth();
|
||||
if (width == 0) {
|
||||
return;
|
||||
}
|
||||
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, originalTextSize);
|
||||
float ratio = width / paint.measureText(textView.getText().toString());
|
||||
if (ratio <= 1.0f) {
|
||||
textView.setTextSize(
|
||||
TypedValue.COMPLEX_UNIT_PX, Math.max(minTextSize, originalTextSize * ratio));
|
||||
}
|
||||
}
|
||||
}
|
52
library/external/dialpad/src/main/java/com/android/dialer/widget/ResizingTextEditText.java
vendored
Normal file
52
library/external/dialpad/src/main/java/com/android/dialer/widget/ResizingTextEditText.java
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* Copyright (C) 2014 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.dialer.widget;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.util.AttributeSet;
|
||||
import android.widget.EditText;
|
||||
import com.android.dialer.dialpadview.R;
|
||||
import com.android.dialer.util.ViewUtil;
|
||||
|
||||
/** EditText which resizes dynamically with respect to text length. */
|
||||
public class ResizingTextEditText extends EditText {
|
||||
|
||||
private final int mOriginalTextSize;
|
||||
private final int mMinTextSize;
|
||||
|
||||
public ResizingTextEditText(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
mOriginalTextSize = (int) getTextSize();
|
||||
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ResizingText);
|
||||
mMinTextSize =
|
||||
(int) a.getDimension(R.styleable.ResizingText_resizing_text_min_size, mOriginalTextSize);
|
||||
a.recycle();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
|
||||
super.onTextChanged(text, start, lengthBefore, lengthAfter);
|
||||
ViewUtil.resizeText(this, mOriginalTextSize, mMinTextSize);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
|
||||
super.onSizeChanged(w, h, oldw, oldh);
|
||||
ViewUtil.resizeText(this, mOriginalTextSize, mMinTextSize);
|
||||
}
|
||||
}
|
BIN
library/external/dialpad/src/main/res/drawable-hdpi-v4/quantum_ic_arrow_back_white_24.png
vendored
Normal file
BIN
library/external/dialpad/src/main/res/drawable-hdpi-v4/quantum_ic_arrow_back_white_24.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 148 B |
BIN
library/external/dialpad/src/main/res/drawable-hdpi-v4/quantum_ic_arrow_drop_down_white_18.png
vendored
Normal file
BIN
library/external/dialpad/src/main/res/drawable-hdpi-v4/quantum_ic_arrow_drop_down_white_18.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 121 B |
BIN
library/external/dialpad/src/main/res/drawable-hdpi-v4/quantum_ic_backspace_white_24.png
vendored
Normal file
BIN
library/external/dialpad/src/main/res/drawable-hdpi-v4/quantum_ic_backspace_white_24.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 333 B |
BIN
library/external/dialpad/src/main/res/drawable-hdpi-v4/quantum_ic_block_white_24.png
vendored
Normal file
BIN
library/external/dialpad/src/main/res/drawable-hdpi-v4/quantum_ic_block_white_24.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 478 B |
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user