88import android .support .v4 .app .FragmentActivity ;
99import android .support .v7 .app .AppCompatActivity ;
1010import android .support .v7 .widget .Toolbar ;
11+ import android .text .TextUtils ;
1112import android .util .Log ;
1213import android .util .Patterns ;
1314import android .view .View ;
3334import org .json .JSONException ;
3435import org .json .JSONObject ;
3536
37+ import java .net .URI ;
38+ import java .net .URISyntaxException ;
3639import java .util .List ;
3740
3841public class LoginActivity extends AppCompatActivity implements View .OnClickListener ,
@@ -41,13 +44,15 @@ public class LoginActivity extends AppCompatActivity implements View.OnClickList
4144 private static final int REQUEST_CODE_RESOLVE_ERR = 9000 ;
4245 private static final int REQUEST_CODE_SIGN_IN = 9001 ;
4346
47+ private boolean startedFromAddRealm = false ;
4448 private ProgressDialog connectionProgressDialog ;
4549 private GoogleApiClient mGoogleApiClient ;
4650 private EditText mServerEditText ;
4751 private EditText mUserName ;
4852 private EditText mPassword ;
4953 private EditText serverIn ;
5054 private EditText realmNameET ;
55+ String serverURL ;
5156
5257 private View mGoogleSignInButton ;
5358 @ Override
@@ -165,6 +170,43 @@ protected void onStop() {
165170 super .onStop ();
166171 }
167172
173+ private String getServerURL () {
174+ if (ZulipApp .get ().serverStringSet .contains (realmNameET .getText ().toString ())) {
175+ Toast .makeText (LoginActivity .this , R .string .realm_exists , Toast .LENGTH_SHORT ).show ();
176+ return null ;
177+ }
178+
179+ String serverURL = mServerEditText .getText ().toString ();
180+ int errorMessage = R .string .invalid_server_domain ;
181+
182+ if (serverURL .isEmpty ()) {
183+ serverIn .setError (getString (errorMessage ));
184+ return "" ;
185+ }
186+
187+ // add http if scheme is not included
188+ if (!serverURL .contains ("://" )) {
189+ serverURL = "http://" + serverURL ;
190+ }
191+
192+ Uri serverUri = Uri .parse (serverURL );
193+ if (serverUri .isRelative ()) {
194+ serverUri = serverUri .buildUpon ().scheme ("http" ).build ();
195+ }
196+
197+ // if does not begin with "api.zulip.com" and if the path is empty, use "/api" as first segment in the path
198+ List <String > paths = serverUri .getPathSegments ();
199+ if (!serverUri .getHost ().startsWith ("api." ) && paths .isEmpty ()) {
200+ serverUri = serverUri .buildUpon ().appendEncodedPath ("api/" ).build ();
201+ }
202+ serverIn .setText (serverUri .toString ());
203+ mServerEditText .setText (serverUri .toString ());
204+ mServerEditText .setEnabled (false );
205+ ((ZulipApp ) getApplication ()).setServerURL (serverUri .toString ());
206+ Toast .makeText (this , getString (R .string .logging_into_server , serverUri .toString ()), Toast .LENGTH_SHORT ).show ();
207+ return serverUri .toString ();
208+ }
209+
168210 private boolean checkForError () {
169211 String serverURL = serverIn .getText ().toString ();
170212 int errorMessage = R .string .invalid_server_domain ;
@@ -208,7 +250,7 @@ private void handleSignInResult(GoogleSignInResult result) {
208250 return ;
209251 }
210252
211- final AsyncLogin loginTask = new AsyncLogin (LoginActivity .this , "google-oauth2-token" , account .getIdToken (), false );
253+ final AsyncLogin loginTask = new AsyncLogin (LoginActivity .this , "google-oauth2-token" , account .getIdToken (), getRealmName (), startedFromAddRealm , serverURL , false );
212254 loginTask .setCallback (new AsyncTaskCompleteListener () {
213255 @ Override
214256 public void onTaskComplete (String result , JSONObject object ) {
@@ -236,6 +278,20 @@ public void onTaskFailure(String result) {
236278 }
237279 }
238280
281+ private String getRealmName () {
282+ if (TextUtils .isEmpty (realmNameET .getText ())) {
283+ String server = ZulipApp .get ().getServerURI ();
284+ URI uri = null ;
285+ try {
286+ uri = new URI (server );
287+ } catch (URISyntaxException e ) {
288+ return server ;
289+ }
290+ return uri .getHost ();
291+ }
292+ return realmNameET .getText ().toString ();
293+ }
294+
239295 protected void openLegal () {
240296 Intent i = new Intent (this , LegalActivity .class );
241297 startActivityForResult (i , 0 );
@@ -305,14 +361,15 @@ public void onClick(View v) {
305361 setupGoogleSignIn ();
306362 break ;
307363 case R .id .zulip_login :
308- if (!isInputValid ()) {
309- return ;
310- }
311- Toast .makeText (this , getString (R .string .logging_into_server , ZulipApp .get ().getServerURI ()), Toast .LENGTH_SHORT ).show ();
364+ if (!isInputValid ()) return ;
365+ serverURL = getServerURL ();
366+ if (serverURL == null ) return ;
312367 connectionProgressDialog .show ();
313368
314369 AsyncLogin alog = new AsyncLogin (LoginActivity .this ,
315- mUserName .getText ().toString (), mPassword .getText ().toString (), false );
370+ mUserName .getText ().toString (), mPassword .getText ().toString (),
371+ getRealmName (), startedFromAddRealm , serverURL , false );
372+
316373 // Remove the CPD when done
317374 alog .setCallback (new AsyncTaskCompleteListener () {
318375 @ Override
@@ -334,7 +391,7 @@ public void onTaskFailure(String result) {
334391 case R .id .local_server_button :
335392 if (!isInputValidForDevAuth ()) return ;
336393 connectionProgressDialog .show ();
337- AsyncDevGetEmails asyncDevGetEmails = new AsyncDevGetEmails (LoginActivity .this );
394+ AsyncDevGetEmails asyncDevGetEmails = new AsyncDevGetEmails (LoginActivity .this , getServerURL (), getRealmName (), startedFromAddRealm );
338395 asyncDevGetEmails .setCallback (new AsyncTaskCompleteListener () {
339396 @ Override
340397 public void onTaskComplete (String result , JSONObject jsonObject ) {
0 commit comments