├── 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 |
--------------------------------------------------------------------------------