├── README.md ├── app ├── app-release.apk ├── build.gradle ├── libs │ └── XposedBridgeApi.jar └── src │ └── main │ ├── AndroidManifest.xml │ ├── assets │ └── xposed_init │ ├── java │ └── com │ │ └── ghostflying │ │ └── locationreportenabler │ │ ├── Main.java │ │ └── SettingActivity.java │ └── res │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── mipmap-xxxhdpi │ └── ic_launcher.png │ ├── values-w820dp │ └── dimens.xml │ ├── values │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml │ └── xml │ └── preferences.xml ├── build.gradle └── settings.gradle /README.md: -------------------------------------------------------------------------------- 1 | LocationReportEnablerXposed 2 | ===================== 3 | 4 | A simple android app to enable Google Location Report, Google Now and related functions in China. 5 | 6 | *Xposed REQUIRED* 7 | 8 | If you have already installed the xposed framwork, you can easily install the below module to enable location report and do not effect any other apps. 9 | 10 | Download: https://github.com/GhostFlying/LocationReportEnablerXposed/releases 11 | 12 | Xposed Repo: http://repo.xposed.info/module/com.ghostflying.locationreportenabler 13 | -------------------------------------------------------------------------------- /app/app-release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GhostFlying/LocationReportEnablerXposed/db4d5108a7b6c28eb506cc4e2c3423c589c5d346/app/app-release.apk -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 23 5 | buildToolsVersion "25.0.2" 6 | 7 | defaultConfig { 8 | applicationId "com.ghostflying.locationreportenabler" 9 | minSdkVersion 16 10 | targetSdkVersion 23 11 | versionCode 19 12 | versionName "1.4.0 xposed" 13 | } 14 | buildTypes { 15 | } 16 | } 17 | 18 | dependencies { 19 | provided fileTree(dir: 'libs', include: ['*.jar']) 20 | compile "com.android.support:appcompat-v7:23.+" 21 | } 22 | -------------------------------------------------------------------------------- /app/libs/XposedBridgeApi.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GhostFlying/LocationReportEnablerXposed/db4d5108a7b6c28eb506cc4e2c3423c589c5d346/app/libs/XposedBridgeApi.jar -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 12 | 15 | 18 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/src/main/assets/xposed_init: -------------------------------------------------------------------------------- 1 | com.ghostflying.locationreportenabler.Main -------------------------------------------------------------------------------- /app/src/main/java/com/ghostflying/locationreportenabler/Main.java: -------------------------------------------------------------------------------- 1 | package com.ghostflying.locationreportenabler; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Arrays; 5 | import java.util.List; 6 | 7 | import de.robv.android.xposed.IXposedHookLoadPackage; 8 | import de.robv.android.xposed.XC_MethodHook; 9 | import de.robv.android.xposed.XC_MethodReplacement; 10 | import de.robv.android.xposed.XSharedPreferences; 11 | import de.robv.android.xposed.XposedBridge; 12 | import de.robv.android.xposed.callbacks.XC_LoadPackage; 13 | 14 | import static de.robv.android.xposed.XposedHelpers.findAndHookMethod; 15 | 16 | /** 17 | * Created by ghostflying on 2/16/15. 18 | */ 19 | public class Main implements IXposedHookLoadPackage { 20 | private static final List HOOKED_PKG = new ArrayList<>(Arrays.asList( 21 | "com.google.android.gms", 22 | "com.google.android.apps.maps", 23 | "com.example.ghostflying.testapp" 24 | ) 25 | ); 26 | 27 | @Override 28 | public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable { 29 | if (!HOOKED_PKG.contains(loadPackageParam.packageName)){ 30 | return; 31 | } 32 | 33 | try{ 34 | findAndHookMethod("android.telephony.TelephonyManager", loadPackageParam.classLoader, "getSimOperator", mOperatorCodeHook); 35 | findAndHookMethod("android.telephony.TelephonyManager", loadPackageParam.classLoader, "getSimCountryIso", mCountryISOHook); 36 | findAndHookMethod("android.telephony.TelephonyManager", loadPackageParam.classLoader, "getSimOperatorName", mOperatorNameHook); 37 | } 38 | catch (Throwable t){ 39 | XposedBridge.log(t); 40 | } 41 | } 42 | 43 | private XC_MethodHook mOperatorCodeHook = new XC_MethodReplacement() { 44 | XSharedPreferences sharedPreferences = new XSharedPreferences(BuildConfig.APPLICATION_ID); 45 | 46 | @Override 47 | protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable { 48 | return sharedPreferences.getString("pref_operator_code", "310030"); 49 | } 50 | }; 51 | 52 | private XC_MethodHook mCountryISOHook = new XC_MethodReplacement() { 53 | XSharedPreferences sharedPreferences = new XSharedPreferences(BuildConfig.APPLICATION_ID); 54 | 55 | @Override 56 | protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable { 57 | return sharedPreferences.getString("pref_operator_country", "us"); 58 | } 59 | }; 60 | 61 | private XC_MethodHook mOperatorNameHook = new XC_MethodReplacement() { 62 | XSharedPreferences sharedPreferences = new XSharedPreferences(BuildConfig.APPLICATION_ID); 63 | 64 | @Override 65 | protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable { 66 | return sharedPreferences.getString("pref_operator_name", "Centennial"); 67 | } 68 | }; 69 | } 70 | -------------------------------------------------------------------------------- /app/src/main/java/com/ghostflying/locationreportenabler/SettingActivity.java: -------------------------------------------------------------------------------- 1 | package com.ghostflying.locationreportenabler; 2 | 3 | import android.content.ComponentName; 4 | import android.content.SharedPreferences; 5 | import android.content.pm.PackageManager; 6 | import android.preference.EditTextPreference; 7 | import android.preference.Preference; 8 | import android.preference.PreferenceActivity; 9 | import android.os.Bundle; 10 | import android.preference.PreferenceGroup; 11 | import android.util.Log; 12 | 13 | public class SettingActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener { 14 | 15 | @Override 16 | protected void onCreate(Bundle savedInstanceState) { 17 | super.onCreate(savedInstanceState); 18 | 19 | getPreferenceManager().setSharedPreferencesMode(MODE_WORLD_READABLE); 20 | 21 | addPreferencesFromResource(R.xml.preferences); 22 | } 23 | 24 | @Override 25 | protected void onResume() { 26 | super.onResume(); 27 | 28 | updateSummary(getPreferenceScreen()); 29 | 30 | SharedPreferences sharedPreferences = getPreferenceManager().getSharedPreferences(); 31 | sharedPreferences.registerOnSharedPreferenceChangeListener(this); 32 | } 33 | 34 | @Override 35 | protected void onPause() { 36 | getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); 37 | super.onPause(); 38 | } 39 | 40 | @Override 41 | public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) { 42 | updateSummary(sharedPreferences, s); 43 | 44 | if (getString(R.string.pref_hide_launcher_key).equals(s)) { 45 | boolean needHide = sharedPreferences.getBoolean(s, false); 46 | 47 | if (needHide) { 48 | PackageManager p = getPackageManager(); 49 | ComponentName componentName = new ComponentName(this, SettingActivity.class); 50 | if (needHide) { 51 | if (p.getComponentEnabledSetting(componentName) != PackageManager.COMPONENT_ENABLED_STATE_DISABLED) { 52 | p.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); 53 | Log.d("PropUtil", "Hide the icon."); 54 | } 55 | } else { 56 | if (p.getComponentEnabledSetting(componentName) != PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { 57 | p.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); 58 | Log.d("PropUtil", "Show the icon."); 59 | } 60 | } 61 | } 62 | } 63 | } 64 | 65 | private void updateSummary(SharedPreferences sharedPreferences, String key) { 66 | Preference preference = findPreference(key); 67 | if (preference instanceof EditTextPreference) { 68 | preference.setSummary(sharedPreferences.getString(key, "")); 69 | } 70 | } 71 | 72 | private void updateSummary(PreferenceGroup group) { 73 | for (int i = 0; i < group.getPreferenceCount(); i++) { 74 | Preference preference = group.getPreference(i); 75 | if (preference instanceof EditTextPreference) { 76 | EditTextPreference editTextPreference = (EditTextPreference)preference; 77 | editTextPreference.setSummary(editTextPreference.getText()); 78 | } 79 | if (preference instanceof PreferenceGroup) { 80 | updateSummary((PreferenceGroup) preference); 81 | } 82 | } 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GhostFlying/LocationReportEnablerXposed/db4d5108a7b6c28eb506cc4e2c3423c589c5d346/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GhostFlying/LocationReportEnablerXposed/db4d5108a7b6c28eb506cc4e2c3423c589c5d346/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GhostFlying/LocationReportEnablerXposed/db4d5108a7b6c28eb506cc4e2c3423c589c5d346/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GhostFlying/LocationReportEnablerXposed/db4d5108a7b6c28eb506cc4e2c3423c589c5d346/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GhostFlying/LocationReportEnablerXposed/db4d5108a7b6c28eb506cc4e2c3423c589c5d346/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | LocationReportEnabler 5 | 6 | pref_operator_country 7 | pref_operator_code 8 | pref_operator_name 9 | 10 | Set operator country 11 | Set operator code 12 | Set operator name 13 | 14 | us 15 | 310030 16 | Centennial 17 | 18 | pref_hide_launcher 19 | Hide icon from launcher 20 | WARNING: u may not access all settings unless u reinstall 21 | 22 | Take effect after reboot 23 | Take effect immediately 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/xml/preferences.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 11 | 12 | 18 | 19 | 24 | 25 | 26 | 28 | 29 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:2.3.0' 9 | 10 | // NOTE: Do not place your application dependencies here; they belong 11 | // in the individual module build.gradle files 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | jcenter() 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | --------------------------------------------------------------------------------