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); - } }