SetupWizard: Add captive portal check
Change-Id: I990b3d5c67fa9ba54e7e834b42a11a93133646d9
This commit is contained in:
parent
328ec8da42
commit
e001f975db
@ -20,6 +20,7 @@ package com.cyanogenmod.setupwizard;
|
|||||||
import android.app.Application;
|
import android.app.Application;
|
||||||
import android.app.StatusBarManager;
|
import android.app.StatusBarManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.provider.Settings;
|
||||||
|
|
||||||
public class SetupWizardApp extends Application {
|
public class SetupWizardApp extends Application {
|
||||||
|
|
||||||
@ -41,16 +42,20 @@ public class SetupWizardApp extends Application {
|
|||||||
public static final String EXTRA_THEME = "theme";
|
public static final String EXTRA_THEME = "theme";
|
||||||
public static final String EXTRA_MATERIAL_LIGHT = "material_light";
|
public static final String EXTRA_MATERIAL_LIGHT = "material_light";
|
||||||
|
|
||||||
|
private static final String KEY_DETECT_CAPTIVE_PORTAL = "captive_portal_detection_enabled";
|
||||||
|
|
||||||
public static final int REQUEST_CODE_SETUP_WIFI = 0;
|
public static final int REQUEST_CODE_SETUP_WIFI = 0;
|
||||||
public static final int REQUEST_CODE_SETUP_GMS= 1;
|
public static final int REQUEST_CODE_SETUP_GMS= 1;
|
||||||
public static final int REQUEST_CODE_RESTORE_GMS= 2;
|
public static final int REQUEST_CODE_RESTORE_GMS= 2;
|
||||||
public static final int REQUEST_CODE_SETUP_CYANOGEN= 3;
|
public static final int REQUEST_CODE_SETUP_CYANOGEN= 3;
|
||||||
|
public static final int REQUEST_CODE_SETUP_CAPTIVE_PORTAL= 4;
|
||||||
|
|
||||||
private StatusBarManager mStatusBarManager;
|
private StatusBarManager mStatusBarManager;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
|
disableCaptivePortalDetection();
|
||||||
mStatusBarManager = (StatusBarManager)getSystemService(Context.STATUS_BAR_SERVICE);
|
mStatusBarManager = (StatusBarManager)getSystemService(Context.STATUS_BAR_SERVICE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,4 +68,12 @@ public class SetupWizardApp extends Application {
|
|||||||
public void enableStatusBar() {
|
public void enableStatusBar() {
|
||||||
mStatusBarManager.disable(StatusBarManager.DISABLE_NONE);
|
mStatusBarManager.disable(StatusBarManager.DISABLE_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void disableCaptivePortalDetection() {
|
||||||
|
Settings.Global.putInt(getContentResolver(), KEY_DETECT_CAPTIVE_PORTAL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void enableCaptivePortalDetection() {
|
||||||
|
Settings.Global.putInt(getContentResolver(), KEY_DETECT_CAPTIVE_PORTAL, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,36 +17,99 @@
|
|||||||
package com.cyanogenmod.setupwizard.setup;
|
package com.cyanogenmod.setupwizard.setup;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.app.ActivityOptions;
|
||||||
import android.app.Fragment;
|
import android.app.Fragment;
|
||||||
import android.app.FragmentManager;
|
import android.app.FragmentManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.net.ConnectivityManager;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.provider.Settings;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
import com.cyanogenmod.setupwizard.R;
|
import com.cyanogenmod.setupwizard.R;
|
||||||
import com.cyanogenmod.setupwizard.SetupWizardApp;
|
import com.cyanogenmod.setupwizard.SetupWizardApp;
|
||||||
import com.cyanogenmod.setupwizard.ui.LoadingFragment;
|
import com.cyanogenmod.setupwizard.ui.LoadingFragment;
|
||||||
import com.cyanogenmod.setupwizard.util.SetupWizardUtils;
|
import com.cyanogenmod.setupwizard.util.SetupWizardUtils;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
public class WifiSetupPage extends SetupPage {
|
public class WifiSetupPage extends SetupPage {
|
||||||
|
|
||||||
public static final String TAG = "WifiSetupPage";
|
public static final String TAG = "WifiSetupPage";
|
||||||
|
|
||||||
|
private static final String DEFAULT_SERVER = "clients3.google.com";
|
||||||
|
private static final int CAPTIVE_PORTAL_SOCKET_TIMEOUT_MS = 10000;
|
||||||
|
|
||||||
|
private static final String CAPTIVE_PORTAL_LOGIN_ACTION
|
||||||
|
= "android.net.action.captive_portal_login";
|
||||||
|
|
||||||
|
private LoadingFragment mLoadingFragment;
|
||||||
|
|
||||||
|
private URL mCaptivePortalUrl;
|
||||||
|
|
||||||
|
private boolean mIsCaptivePortal = false;
|
||||||
|
|
||||||
|
private final Handler mHandler = new Handler();
|
||||||
|
|
||||||
|
private Runnable mFinishCaptivePortalCheckRunnable = new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
final Activity activity = (Activity)mContext;
|
||||||
|
if (mIsCaptivePortal) {
|
||||||
|
try {
|
||||||
|
int netId = ConnectivityManager.from(activity)
|
||||||
|
.getNetworkForType(ConnectivityManager.TYPE_WIFI).netId;
|
||||||
|
Intent intent = new Intent(CAPTIVE_PORTAL_LOGIN_ACTION);
|
||||||
|
intent.putExtra(Intent.EXTRA_TEXT, String.valueOf(netId));
|
||||||
|
intent.putExtra("status_bar_color",
|
||||||
|
mContext.getResources().getColor(R.color.primary_dark));
|
||||||
|
intent.putExtra("action_bar_color", mContext.getResources().getColor(
|
||||||
|
R.color.primary_dark));
|
||||||
|
ActivityOptions options =
|
||||||
|
ActivityOptions.makeCustomAnimation(mContext,
|
||||||
|
android.R.anim.fade_in,
|
||||||
|
android.R.anim.fade_out);
|
||||||
|
activity.startActivityForResult(intent,
|
||||||
|
SetupWizardApp.REQUEST_CODE_SETUP_CAPTIVE_PORTAL,
|
||||||
|
options.toBundle());
|
||||||
|
} catch (Exception e) {
|
||||||
|
//Oh well
|
||||||
|
Log.e(TAG, "No captive portal activity found" + e);
|
||||||
|
getCallbacks().onNextPage();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
getCallbacks().onNextPage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
public WifiSetupPage(Context context, SetupDataCallbacks callbacks) {
|
public WifiSetupPage(Context context, SetupDataCallbacks callbacks) {
|
||||||
super(context, callbacks);
|
super(context, callbacks);
|
||||||
|
String server = Settings.Global.getString(context.getContentResolver(), "captive_portal_server");
|
||||||
|
if (server == null) server = DEFAULT_SERVER;
|
||||||
|
try {
|
||||||
|
mCaptivePortalUrl = new URL("http://" + server + "/generate_204");
|
||||||
|
} catch (MalformedURLException e) {
|
||||||
|
Log.e(TAG, "Not a valid url" + e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Fragment getFragment(FragmentManager fragmentManager, int action) {
|
public Fragment getFragment(FragmentManager fragmentManager, int action) {
|
||||||
Fragment fragment = fragmentManager.findFragmentByTag(getKey());
|
mLoadingFragment = (LoadingFragment)fragmentManager.findFragmentByTag(getKey());
|
||||||
if (fragment == null) {
|
if (mLoadingFragment == null) {
|
||||||
Bundle args = new Bundle();
|
Bundle args = new Bundle();
|
||||||
args.putString(Page.KEY_PAGE_ARGUMENT, getKey());
|
args.putString(Page.KEY_PAGE_ARGUMENT, getKey());
|
||||||
args.putInt(Page.KEY_PAGE_ACTION, action);
|
args.putInt(Page.KEY_PAGE_ACTION, action);
|
||||||
fragment = new LoadingFragment();
|
mLoadingFragment = new LoadingFragment();
|
||||||
fragment.setArguments(args);
|
mLoadingFragment.setArguments(args);
|
||||||
}
|
}
|
||||||
return fragment;
|
return mLoadingFragment;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -61,7 +124,7 @@ public class WifiSetupPage extends SetupPage {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getTitleResId() {
|
public int getTitleResId() {
|
||||||
return R.string.setup_wifi;
|
return R.string.loading;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -72,12 +135,57 @@ public class WifiSetupPage extends SetupPage {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
|
public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||||
if (requestCode != SetupWizardApp.REQUEST_CODE_SETUP_WIFI) return false;
|
if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_WIFI) {
|
||||||
if (resultCode == Activity.RESULT_CANCELED) {
|
if (resultCode == Activity.RESULT_CANCELED) {
|
||||||
getCallbacks().onPreviousPage();
|
getCallbacks().onPreviousPage();
|
||||||
|
} else if (resultCode == Activity.RESULT_OK) {
|
||||||
|
checkForCaptivePortal();
|
||||||
} else {
|
} else {
|
||||||
getCallbacks().onNextPage();
|
getCallbacks().onNextPage();
|
||||||
}
|
}
|
||||||
|
} else if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_CAPTIVE_PORTAL) {
|
||||||
|
if (resultCode == Activity.RESULT_CANCELED) {
|
||||||
|
SetupWizardUtils.launchWifiSetup((Activity)mContext);
|
||||||
|
} else {
|
||||||
|
getCallbacks().onNextPage();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void checkForCaptivePortal() {
|
||||||
|
new Thread() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
mIsCaptivePortal = isCaptivePortal();
|
||||||
|
mHandler.post(mFinishCaptivePortalCheckRunnable);
|
||||||
|
}
|
||||||
|
}.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't run on UI thread
|
||||||
|
private boolean isCaptivePortal() {
|
||||||
|
if (mCaptivePortalUrl == null) return false;
|
||||||
|
HttpURLConnection urlConnection = null;
|
||||||
|
try {
|
||||||
|
urlConnection = (HttpURLConnection) mCaptivePortalUrl.openConnection();
|
||||||
|
urlConnection.setInstanceFollowRedirects(false);
|
||||||
|
urlConnection.setConnectTimeout(CAPTIVE_PORTAL_SOCKET_TIMEOUT_MS);
|
||||||
|
urlConnection.setReadTimeout(CAPTIVE_PORTAL_SOCKET_TIMEOUT_MS);
|
||||||
|
urlConnection.setUseCaches(false);
|
||||||
|
urlConnection.getInputStream();
|
||||||
|
// We got a valid response, but not from the real google
|
||||||
|
return urlConnection.getResponseCode() != 204;
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.e(TAG, "Captive portal check - probably not a portal: exception "
|
||||||
|
+ e);
|
||||||
|
return false;
|
||||||
|
} finally {
|
||||||
|
if (urlConnection != null) {
|
||||||
|
urlConnection.disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -312,6 +312,7 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks
|
|||||||
mSetupData.finishPages();
|
mSetupData.finishPages();
|
||||||
Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);
|
Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);
|
||||||
Settings.Secure.putInt(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1);
|
Settings.Secure.putInt(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1);
|
||||||
|
setupWizardApp.enableCaptivePortalDetection();
|
||||||
setupWizardApp.enableStatusBar();
|
setupWizardApp.enableStatusBar();
|
||||||
finish();
|
finish();
|
||||||
if (mEnableAccessibilityController != null) {
|
if (mEnableAccessibilityController != null) {
|
||||||
|
Loading…
Reference in New Issue
Block a user