├── .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 | [![HitCount](http://hits.dwyl.com/{edgd1er}/{voenabler}.svg)](http://hits.dwyl.com/{edgd1er}/{voenabler}) 8 | ![CI](https://github.com/edgd1er/voenabler/workflows/CI/badge.svg) 9 | ![CI](https://img.shields.io/github/release/edgd1er/voenabler.svg) 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 --------------------------------------------------------------------------------