├── .gitattributes
├── .github
└── workflows
│ ├── build.yml
│ └── release.yml
├── .gitignore
├── META-INF
└── com
│ └── google
│ └── android
│ ├── update-binary
│ └── updater-script
├── README.md
├── build.sh
├── customize.sh
├── module.prop
└── system.prop
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Declare files that will always have LF line endings on checkout.
2 | META-INF/** text eol=lf
3 | *.prop text eol=lf
4 | *.sh text eol=lf
5 | *.md text eol=lf
6 |
7 | # Denote all files that are truly binary and should not be modified.
8 | system/** binary
9 |
--------------------------------------------------------------------------------
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
1 | # This is a basic workflow to help you get started with Actions
2 |
3 | name: CI build master
4 |
5 | # Controls when the action will run. Triggers the workflow on push or pull request
6 | # events but only for the master branch
7 | on:
8 | push:
9 | branches: [ master ]
10 | #pull_request:
11 | # branches: [ master ]
12 | paths-ignore:
13 | - './README.md'
14 | - '.gitignore'
15 |
16 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel
17 | jobs:
18 | # This workflow contains a single job called "build"
19 | build:
20 | # The type of runner that the job will run on
21 | runs-on: ubuntu-latest
22 |
23 | # Steps represent a sequence of tasks that will be executed as part of the job
24 | steps:
25 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
26 | - uses: actions/checkout@v2
27 |
28 | # Runs a single command using the runners shell
29 | - name: build
30 | run: ./build.sh -l
31 |
32 | - uses: actions/upload-artifact@v1
33 | with:
34 | name: voenabler-latest.zip
35 | path: ./voenabler-latest.zip
36 |
37 | # Runs a set of commands using the runners shell
38 | #- name: Run a multi-line script
39 | # run: |
40 | # echo Add other actions to build,
41 | # echo test, and deploy your project.
42 |
--------------------------------------------------------------------------------
/.github/workflows/release.yml:
--------------------------------------------------------------------------------
1 | name: CI release version as draft
2 |
3 | on:
4 | push:
5 | # Sequence of patterns matched against refs/tags
6 | tags:
7 | - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10
8 | paths-ignore:
9 | - './README.md'
10 | - '.gitignore'
11 |
12 | jobs:
13 | build:
14 | name: Create Release
15 | runs-on: ubuntu-latest
16 | steps:
17 | - name: Get the version
18 | id: get_version
19 | run: echo ::set-output name=TAGVERSION::${GITHUB_REF/refs\/tags\/v/}
20 |
21 | - name: Checkout code and create magisk module.
22 | uses: actions/checkout@v2
23 | - name: build
24 | run: ./build.sh -v ${{ steps.get_version.outputs.TAGVERSION }}
25 | - uses: actions/upload-artifact@v1
26 | with:
27 | name: voenabler-v${{ steps.get_version.outputs.TAGVERSION }}.zip
28 | path: ./voenabler-v${{ steps.get_version.outputs.TAGVERSION }}.zip
29 |
30 | - name: Create Release
31 | id: create_release
32 | uses: actions/create-release@latest
33 | env:
34 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
35 | with:
36 | tag_name: ${{ github.ref }}
37 | release_name: Release ${{ github.ref }}
38 | body: |
39 | Changes in this Release
40 | - First Change
41 | - Second Change
42 | draft: true
43 | prerelease: false
44 |
45 | - name: Upload Release Asset
46 | id: upload-release-asset
47 | uses: actions/upload-release-asset@v1
48 | env:
49 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
50 | with:
51 | upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps
52 | asset_path: ./voenabler-v${{ steps.get_version.outputs.TAGVERSION }}.zip
53 | asset_name: voenabler-v${{ steps.get_version.outputs.TAGVERSION }}.zip
54 | asset_content_type: application/zip
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /.idea/
2 | *.zip
3 |
--------------------------------------------------------------------------------
/META-INF/com/google/android/update-binary:
--------------------------------------------------------------------------------
1 | #!/sbin/sh
2 |
3 | #################
4 | # Initialization
5 | #################
6 |
7 | umask 022
8 |
9 | # Global vars
10 | TMPDIR=/dev/tmp
11 | PERSISTDIR=/sbin/.magisk/mirror/persist
12 |
13 | rm -rf $TMPDIR 2>/dev/null
14 | mkdir -p $TMPDIR
15 |
16 | # echo before loading util_functions
17 | ui_print() { echo "$1"; }
18 |
19 | require_new_magisk() {
20 | ui_print "*******************************"
21 | ui_print " Please install Magisk v19.0+! "
22 | ui_print "*******************************"
23 | exit 1
24 | }
25 |
26 | is_legacy_script() {
27 | unzip -l "$ZIPFILE" install.sh | grep -q install.sh
28 | return $?
29 | }
30 |
31 | print_modname() {
32 | local len
33 | len=`echo -n $MODNAME | wc -c`
34 | len=$((len + 2))
35 | local pounds=`printf "%${len}s" | tr ' ' '*'`
36 | ui_print "$pounds"
37 | ui_print " $MODNAME "
38 | ui_print "$pounds"
39 | ui_print "*******************"
40 | ui_print " Powered by Magisk "
41 | ui_print "*******************"
42 | }
43 |
44 | ##############
45 | # Environment
46 | ##############
47 |
48 | OUTFD=$2
49 | ZIPFILE=$3
50 |
51 | mount /data 2>/dev/null
52 |
53 | # Load utility functions
54 | [ -f /data/adb/magisk/util_functions.sh ] || require_new_magisk
55 | . /data/adb/magisk/util_functions.sh
56 | [ $MAGISK_VER_CODE -gt 18100 ] || require_new_magisk
57 |
58 | # Preperation for flashable zips
59 | setup_flashable
60 |
61 | # Mount partitions
62 | mount_partitions
63 |
64 | # Detect version and architecture
65 | api_level_arch_detect
66 |
67 | # Setup busybox and binaries
68 | $BOOTMODE && boot_actions || recovery_actions
69 |
70 | ##############
71 | # Preparation
72 | ##############
73 |
74 | # Extract prop file
75 | unzip -o "$ZIPFILE" module.prop -d $TMPDIR >&2
76 | [ ! -f $TMPDIR/module.prop ] && abort "! Unable to extract zip file!"
77 |
78 | $BOOTMODE && MODDIRNAME=modules_update || MODDIRNAME=modules
79 | MODULEROOT=$NVBASE/$MODDIRNAME
80 | MODID=`grep_prop id $TMPDIR/module.prop`
81 | MODPATH=$MODULEROOT/$MODID
82 | MODNAME=`grep_prop name $TMPDIR/module.prop`
83 |
84 | # Create mod paths
85 | rm -rf $MODPATH 2>/dev/null
86 | mkdir -p $MODPATH
87 |
88 | ##########
89 | # Install
90 | ##########
91 |
92 | if is_legacy_script; then
93 | unzip -oj "$ZIPFILE" module.prop install.sh uninstall.sh 'common/*' -d $TMPDIR >&2
94 |
95 | # Load install script
96 | . $TMPDIR/install.sh
97 |
98 | # Callbacks
99 | print_modname
100 | on_install
101 |
102 | # Custom uninstaller
103 | [ -f $TMPDIR/uninstall.sh ] && cp -af $TMPDIR/uninstall.sh $MODPATH/uninstall.sh
104 |
105 | # Skip mount
106 | $SKIPMOUNT && touch $MODPATH/skip_mount
107 |
108 | # prop file
109 | $PROPFILE && cp -af $TMPDIR/system.prop $MODPATH/system.prop
110 |
111 | # Module info
112 | cp -af $TMPDIR/module.prop $MODPATH/module.prop
113 |
114 | # post-fs-data scripts
115 | $POSTFSDATA && cp -af $TMPDIR/post-fs-data.sh $MODPATH/post-fs-data.sh
116 |
117 | # service scripts
118 | $LATESTARTSERVICE && cp -af $TMPDIR/service.sh $MODPATH/service.sh
119 |
120 | ui_print "- Setting permissions"
121 | set_permissions
122 | else
123 | print_modname
124 |
125 | unzip -o "$ZIPFILE" customize.sh -d $MODPATH >&2
126 |
127 | if ! grep -q '^SKIPUNZIP=1$' $MODPATH/customize.sh 2>/dev/null; then
128 | ui_print "- Extracting module files"
129 | unzip -o "$ZIPFILE" -x 'META-INF/*' -d $MODPATH >&2
130 |
131 | # Default permissions
132 | set_perm_recursive $MODPATH 0 0 0755 0644
133 | fi
134 |
135 | # Load customization script
136 | [ -f $MODPATH/customize.sh ] && . $MODPATH/customize.sh
137 | fi
138 |
139 | # Handle replace folders
140 | for TARGET in $REPLACE; do
141 | ui_print "- Replace target: $TARGET"
142 | mktouch $MODPATH$TARGET/.replace
143 | done
144 |
145 | if $BOOTMODE; then
146 | # Update info for Magisk Manager
147 | mktouch $NVBASE/modules/$MODID/update
148 | cp -af $MODPATH/module.prop $NVBASE/modules/$MODID/module.prop
149 | fi
150 |
151 | # Copy over custom sepolicy rules
152 | if [ -f $MODPATH/sepolicy.rule -a -e $PERSISTDIR ]; then
153 | ui_print "- Installing custom sepolicy patch"
154 | PERSISTMOD=$PERSISTDIR/magisk/$MODID
155 | mkdir -p $PERSISTMOD
156 | cp -af $MODPATH/sepolicy.rule $PERSISTMOD/sepolicy.rule
157 | fi
158 |
159 | # Remove stuffs that don't belong to modules
160 | rm -rf \
161 | $MODPATH/system/placeholder $MODPATH/customize.sh \
162 | $MODPATH/README.md $MODPATH/.git* 2>/dev/null
163 |
164 | ##############
165 | # Finalizing
166 | ##############
167 |
168 | cd /
169 | $BOOTMODE || recovery_cleanup
170 | rm -rf $TMPDIR
171 |
172 | ui_print "- Done"
173 | exit 0
--------------------------------------------------------------------------------
/META-INF/com/google/android/updater-script:
--------------------------------------------------------------------------------
1 | #MAGISK
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ### Please note that this is a fork of [Toucan-sam](https://github.com/Toucan-Sam/VoEnabler).
2 |
3 | I'm updating it whenever possible for my OP5. I have no other devices to validate the module.
4 |
5 | ## VoEnabler
6 |
7 | [](http://hits.dwyl.com/{edgd1er}/{voenabler})
8 | 
9 | 
10 |
11 | This module enables the VoLTE & VoWiFi & RCS options by editing `build.prop`.
12 |
13 | **Important:** VoLTE/VoWiFi will not work if your carrier doesn't support it, even if you install this module.
14 |
15 | ## Devices
16 |
OnePlus 5
17 |
Redmi Note 7 Pro
18 |
19 |
20 | XDA Thread: [here](https://forum.xda-developers.com/apps/magisk/module-v4-volte-enabler-t3649613)
21 |
Guide to **_maybe_** make this work: [here](https://forum.xda-developers.com/oneplus-5t/how-to/guide-volte-vowifi-german-carriers-t3817542)
22 |
23 | ## What does this module change?
24 |
persist.data.iwlan.enable=true
25 |
persist.dbg.ims_volte_enable=1
26 |
persist.dbg.volte_avail_ovr=1
27 |
persist.dbg.vt_avail_ovr=1
28 |
persist.dbg.wfc_avail_ovr=1
29 |
persist.radio.rat_on=combine
30 |
persist.radio.data_ltd_sys_ind=1
31 |
persist.radio.data_con_rprt=1
32 |
persist.radio.calls.on.ims=1
33 |
persist.dbg.ims_volte_enable=1
34 |
persist.dbg.volte_avail_ovr=1
35 |
persist.dbg.vt_avail_ovr=1
36 |
persist.dbg.wfc_avail_ovr=1
37 |
persist.data.iwlan=1
38 |
persist.data.iwlan.ipsec.ap=1
39 |
persist.radio.volte.dan_support=true
40 |
persist.radio.rat_on=combine
41 |
persist.radio.data_ltd_sys_ind=1
42 |
persist.radio.data_con_rprt=1
43 |
persist.radio.calls.on.ims=1
44 |
persist.radio.VT_ENABLE=1
45 |
persist.sys.cust.lte_config=true
46 |
persist.rcs.supported=1
47 |
48 | ## Changelog
49 |
2020-04-04 (v1.8): Update Module & Test devices
50 |
2020-04-04 (v1.7): Update VoLTE & WoWIFI & RCS
51 |
2020-02-02 (v1.6): Update template for Magisk v20.x
52 |
2019-04-05 (v1.5): Update template for Magisk v19.x
53 |
2018-11-25 (v1.4): Removed some white space that may cause issues.
54 |
2018-09-19 (v1.3): Update template for Magisk v17.x
55 |
2018-04-09 (v1.2): Update template for Magisk v15.x
56 |
2017-08-02 (v1.1): Removed "persist.data.iwlan.enable=true" as this was reported to break WiFi calling on some carriers.
57 |
2017-08-01 (v1): Switched from using service.sh to system.prop
58 |
2017-07-31 (Beta): Initial commit.
59 |
--------------------------------------------------------------------------------
/build.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ## VoEnabler
4 | createZip() {
5 | #remove if force enabled
6 | [[ ${2} -eq 1 ]] && [[ -f ${1} ]] && rm -f ${1}
7 |
8 | if [[ ${3} -eq 1 ]]; then
9 | echo "DRYRUN:${DRYRUN}, ${VFILE} not created"
10 | else
11 | #create archive
12 | echo "creating ${VFILE}"
13 | zip -r ./${1} META-INF module.prop system.prop customize.sh README.md
14 | ls -al *.zip
15 | fi
16 | }
17 |
18 | usage() {
19 | echo -e "\n$0:\t [d,f,h,v]"
20 | echo -e "\t-v\tversion: define version for zip filename."
21 | echo -e "\t-d\tDryRun: is set, then no zip file is created"
22 | echo -e "\t-f\tForce, overwrite existing zip if any"
23 | echo -e "\t-h\tHelp: this help"
24 | echo -e "\t-l\tlatest: build zip with latest commit"
25 | }
26 |
27 | #Main
28 | #process options
29 | VERSION=""
30 | FORCE=0
31 | DRYRUN=0
32 | LATEST=0
33 |
34 | while getopts "dfhlv:" option; do
35 | case $option in
36 | d)
37 | DRYRUN=1
38 | ;;
39 | f)
40 | FORCE=1
41 | ;;
42 | h)
43 | usage
44 | exit 1
45 | ;;
46 | l)
47 | LATEST=1
48 | FORCE=1
49 | ;;
50 | v)
51 | VERSION=$OPTARG
52 | ;;
53 | esac
54 | done
55 |
56 | #set filename
57 | if [[ ${LATEST} == 1 ]]; then
58 | VFILE=voenabler-latest.zip
59 | else
60 | VFILE=voenabler-v${VERSION}.zip
61 | fi
62 |
63 | #check version naming
64 | if [[ ! ${VERSION} =~ [0-9]\.[0-9]$ ]] && [[ ${LATEST} == 0 ]]; then
65 | echo -e "\nError, VERSION string is incorrect (${VERSION}): expected x.y where x and y are integers\n"
66 | exit 1
67 | fi
68 |
69 | createZip ${VFILE} ${FORCE} ${DRYRUN}
70 |
--------------------------------------------------------------------------------
/customize.sh:
--------------------------------------------------------------------------------
1 | #!/system/bin/sh
2 |
3 | ui_print "************************************"
4 | ui_print " Enabling VoLTE/VoWiFi/RCS settings "
5 | ui_print "************************************"
--------------------------------------------------------------------------------
/module.prop:
--------------------------------------------------------------------------------
1 | id=voenabler
2 | name=VoEnabler
3 | version=v1.8
4 | versionCode=7
5 | author=Toucan
6 | description=Adds settings to build.prop to enable: VoLTE & VoWifi & RCS
7 |
--------------------------------------------------------------------------------
/system.prop:
--------------------------------------------------------------------------------
1 | # Debug Options
2 | persist.dbg.ims_volte_enable=1
3 | persist.dbg.volte_avail_ovr=1
4 | persist.dbg.vt_avail_ovr=1
5 | persist.dbg.wfc_avail_ovr=1
6 |
7 | # Data Options
8 | # Commented this line out as it was reported to break WiFi calling on some carriers. Not even sure if it's required to begin with.
9 | persist.data.iwlan.enable=true
10 | persist.data.iwlan=1
11 | persist.data.iwlan.ipsec.ap=1
12 |
13 | # Radio Options
14 | persist.radio.volte.dan_support=true
15 | persist.radio.rat_on=combine
16 | persist.radio.data_ltd_sys_ind=1
17 | persist.radio.data_con_rprt=1
18 | persist.radio.calls.on.ims=1
19 | persist.radio.VT_ENABLE=1
20 |
21 | # Other Options
22 | persist.sys.cust.lte_config=true
23 | persist.rcs.supported=1
--------------------------------------------------------------------------------