diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 9df3548..19a3efa 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -3,8 +3,9 @@
-
+
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 5fa01ed..3925225 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -17,6 +17,8 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/jrsen/lte/DaemonService.java b/app/src/main/java/com/jrsen/lte/DaemonService.java
new file mode 100644
index 0000000..03f1fd1
--- /dev/null
+++ b/app/src/main/java/com/jrsen/lte/DaemonService.java
@@ -0,0 +1,111 @@
+package com.jrsen.lte;
+
+import android.app.Notification;
+import android.app.Service;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.os.IBinder;
+import android.widget.Toast;
+
+import com.jrsen.ltepatch.LteDaemon;
+
+import java.io.File;
+import java.io.OutputStream;
+import java.util.StringTokenizer;
+
+/**
+ * Created by jrsen on 16-9-7.
+ */
+public final class DaemonService extends Service {
+
+ @Override
+ public void onCreate() {
+ if (isRooted()) {
+ tryAutoSetPreferredNetwork();
+ } else {
+ tryManualSetPreferredNetwork();
+ Toast.makeText(this, "没有su权限,请手动切换到lte网络.", Toast.LENGTH_LONG).show();
+ stopSelf();
+ }
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ return null;
+ }
+
+ private void tryManualSetPreferredNetwork() {
+ try {
+ Intent intent = new Intent();
+ ComponentName componentName = new ComponentName("com.android.settings", "com.android.settings.RadioInfo");
+ intent.setComponent(componentName);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity(intent);
+ } catch (Exception ignore) {
+ }
+ }
+
+ private void tryAutoSetPreferredNetwork() {
+ new AsyncTask() {
+
+ @Override
+ protected void onPreExecute() {
+ startForeground(1, new Notification());
+ Toast.makeText(DaemonService.this, "正在检测是否支持lte网络...", Toast.LENGTH_LONG).show();
+ }
+
+ @Override
+ protected Integer doInBackground(Void... params) {
+ try {
+ final String[] COMMANDS = {
+ "export CLASSPATH=" + getPackageCodePath(),
+ "app_process /system/bin " + LteDaemon.class.getName()
+ };
+ Runtime runtime = Runtime.getRuntime();
+ Process su = runtime.exec("su");
+ OutputStream os = su.getOutputStream();
+ for (String command : COMMANDS) {
+ os.write((command + "\n").getBytes());
+ }
+ os.flush();
+ os.close();
+ return su.waitFor();
+ } catch (Exception ignore) {
+ }
+ return LteDaemon.ERROR_UNKNOW;
+ }
+
+ @Override
+ protected void onPostExecute(Integer result) {
+ if (result == 0) {
+ Toast.makeText(DaemonService.this, "已成功切换到lte网络!", Toast.LENGTH_LONG).show();
+ } else if (result == LteDaemon.ERROR_UNKNOW) {
+ tryManualSetPreferredNetwork();
+ Toast.makeText(DaemonService.this, "自动切换失败,请手动切换到lte网络。", Toast.LENGTH_LONG).show();
+ } else if (result == LteDaemon.ERROR_NO_LTE) {
+ tryManualSetPreferredNetwork();
+ Toast.makeText(DaemonService.this, "目前位置可能不支持lte网络,请尝试手动切换到lte网络。", Toast.LENGTH_LONG).show();
+ }
+ stopForeground(true);
+ stopSelf();
+ }
+ }.execute();
+ }
+
+ public static boolean isRooted() {
+ String path = System.getenv("PATH");//获取环境变量,eg:/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin:/vendor/bin
+ if (path == null) {
+ return false;
+ }
+ StringTokenizer stok = new StringTokenizer(path, ":");
+ while (stok.hasMoreTokens()) {
+ File su = new File(stok.nextToken(), "su");
+ if (su.exists()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/app/src/main/java/com/jrsen/lte/SettingsActivity.java b/app/src/main/java/com/jrsen/lte/SettingsActivity.java
index 7fea29a..70ba8dc 100644
--- a/app/src/main/java/com/jrsen/lte/SettingsActivity.java
+++ b/app/src/main/java/com/jrsen/lte/SettingsActivity.java
@@ -2,65 +2,16 @@
import android.app.Activity;
-import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
-import android.widget.Toast;
-import com.jrsen.ltepatch.LteDaemon;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.util.StringTokenizer;
-
-public class SettingsActivity extends Activity {
+public final class SettingsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- if (isRooted()) {
- try {
- final String[] COMMANDS = {
- "export CLASSPATH=" + getPackageCodePath(),
- "app_process /system/bin " + LteDaemon.class.getName()
- };
- Runtime runtime = Runtime.getRuntime();
- Process su = runtime.exec("su");
- OutputStream os = su.getOutputStream();
- BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
- for (String command : COMMANDS) {
- bw.write(command + "\n");
- bw.flush();
- }
- bw.close();
- } catch (IOException ignore) {
- }
- Toast.makeText(this, "自动切换到lte网络", Toast.LENGTH_LONG).show();
- } else {
- Intent intent = new Intent();
- ComponentName componentName = new ComponentName("com.android.settings", "com.android.settings.RadioInfo");
- intent.setComponent(componentName);
- startActivity(intent);
- Toast.makeText(this, "手动切换到lte网络", Toast.LENGTH_LONG).show();
- }
+ startService(new Intent(this, DaemonService.class));
finish();
}
- public static boolean isRooted() {
- String path = System.getenv("PATH");//获取环境变量,eg:/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin:/vendor/bin
- if (path == null) {
- return false;
- }
- StringTokenizer stok = new StringTokenizer(path, ":");
- while (stok.hasMoreTokens()) {
- File su = new File(stok.nextToken(), "su");
- if (su.exists()) {
- return true;
- }
- }
- return false;
- }
}
diff --git a/build.gradle b/build.gradle
index aff4f41..77ce66e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,7 +5,7 @@ buildscript {
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:2.1.2'
+ classpath 'com.android.tools.build:gradle:2.1.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
diff --git a/gradle.properties b/gradle.properties
index 5255d96..58fbc1e 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -12,6 +12,6 @@
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
-#Fri Jun 24 14:16:05 CST 2016
+#Wed Sep 07 15:04:20 CST 2016
systemProp.http.proxyHost=127.0.0.1
-systemProp.http.proxyPort=1080
+systemProp.http.proxyPort=8118
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 122a0dc..7ee49b2 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Mon Dec 28 10:00:20 PST 2015
+#Wed Sep 07 15:14:51 CST 2016
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
diff --git a/ltepatch/build.gradle b/ltepatch/build.gradle
index 0f20241..dd7e592 100644
--- a/ltepatch/build.gradle
+++ b/ltepatch/build.gradle
@@ -21,6 +21,5 @@ android {
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
- compile 'com.android.support:appcompat-v7:23.4.0'
compile project(':reflect-lib')
}
diff --git a/ltepatch/src/main/java/com/jrsen/ltepatch/ITelephony_L.java b/ltepatch/src/main/java/com/jrsen/ltepatch/ITelephony_L.java
index 3514f4a..32e621b 100644
--- a/ltepatch/src/main/java/com/jrsen/ltepatch/ITelephony_L.java
+++ b/ltepatch/src/main/java/com/jrsen/ltepatch/ITelephony_L.java
@@ -16,6 +16,8 @@ public final class ITelephony_L {
@ClassParams({int.class})
public static Method setPreferredNetworkType;
+ public static Method getNetworkType;
+
static {
Reflection.init("com.android.internal.telephony.ITelephony", ITelephony_L.class);
}
diff --git a/ltepatch/src/main/java/com/jrsen/ltepatch/LteDaemon.java b/ltepatch/src/main/java/com/jrsen/ltepatch/LteDaemon.java
index 96e664d..6c824c9 100644
--- a/ltepatch/src/main/java/com/jrsen/ltepatch/LteDaemon.java
+++ b/ltepatch/src/main/java/com/jrsen/ltepatch/LteDaemon.java
@@ -3,7 +3,7 @@
import android.content.Context;
import android.os.Build;
import android.os.IBinder;
-import android.os.SystemClock;
+import android.telephony.TelephonyManager;
import android.util.Log;
/**
@@ -11,50 +11,50 @@
*/
public final class LteDaemon implements Runnable {
- private static final long WAIT_LTE_READY_DELAY = 10000l;
+ private static final String LOG_TAG = "LTE";
+ private static final long WAIT_LTE_READY_DELAY = 8 * 1000l;
- private final String[] args;
+ public static final int ERROR_UNKNOW = 1;
+ public static final int ERROR_NO_LTE = 2;
public static void main(String[] args) {
- new LteDaemon(args).run();
- }
-
- public LteDaemon(String[] args) {
- this.args = args;
+ new LteDaemon().run();
}
@Override
public void run() {
- log("LTE-DAEMON", "auto lte daemon start...");
-
try {
- IBinder service = ServiceManager.getService.invoke(Context.TELEPHONY_SERVICE);
- Object iTelephony = ITelephony_L.Stub.asInterface.invoke(service);
+ Log.i(LOG_TAG, "lte daemon running...");
+
+ IBinder telService = ServiceManager.getService.invoke(Context.TELEPHONY_SERVICE);
+ Object iTelephony = ITelephony_L.Stub.asInterface.invoke(telService);
// save previous preferred network type
int preferredNetworkType = getPreferredNetwork(iTelephony);
- log("LTE-DAEMON", "network type = " + preferredNetworkType);
+ Log.i(LOG_TAG, "previous network type = " + preferredNetworkType);
// switch to lte network type
boolean successful = setPreferredNetworkType(iTelephony, RILConstants.NETWORK_MODE_LTE_ONLY.get());
- log("LTE-DAEMON", "changed = " + successful + " new network type = " + getPreferredNetwork(iTelephony));
+ Log.i(LOG_TAG, "changed = " + successful + " new network type = " + getPreferredNetwork(iTelephony));
if (successful) {
//wait to lte network prepare
- SystemClock.sleep(WAIT_LTE_READY_DELAY);
-
-// int dataNetworkType = getDataNetworkType(iTelephony);
-// System.out.println("current dataNetworkType = " + dataNetworkType);
-// boolean isLTE = dataNetworkType == TelephonyManager.NETWORK_TYPE_LTE;
-// if (isLTE) {
+ Thread.sleep(WAIT_LTE_READY_DELAY);
//restore network type
boolean result = setPreferredNetworkType(iTelephony, preferredNetworkType);
- log("LTE-DAEMON", "restore success = " + result + " new network type = " + getPreferredNetwork(iTelephony));
+ Log.i(LOG_TAG, "restore success = " + result + " new network type = " + getPreferredNetwork(iTelephony));
+
+ int networkType = ITelephony_L.getNetworkType.invoke(iTelephony);
+ boolean isLte = networkType == TelephonyManager.NETWORK_TYPE_LTE;
+ Log.i(LOG_TAG, "current dataNetworkType = " + networkType + " is lte = " + isLte);
+ if (!isLte) {
+ System.exit(ERROR_NO_LTE);
+ }
}
} catch (Exception e) {
- e.printStackTrace();
- log("LTE-DAEMON", "Exception:" + Log.getStackTraceString(e));
+ Log.i(LOG_TAG, "Exception:" + Log.getStackTraceString(e));
+ System.exit(ERROR_UNKNOW);
}
}
@@ -76,8 +76,4 @@ private int getPreferredNetwork(Object iTelephony) {
}
}
- private void log(String tag, String msg) {
- Log.i(tag, msg);
- System.out.println(msg);
- }
}