From 0e5ebecf57baf239c3577e841eec9bf2fdd041a0 Mon Sep 17 00:00:00 2001 From: kunall17 Date: Mon, 27 Jun 2016 22:58:58 +0530 Subject: [PATCH 01/18] Add Realm item to ZulipActivity Menu --- app/src/main/res/menu/options.xml | 3 +++ app/src/main/res/values/strings.xml | 15 ++++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/menu/options.xml b/app/src/main/res/menu/options.xml index 466382435..11537011b 100644 --- a/app/src/main/res/menu/options.xml +++ b/app/src/main/res/menu/options.xml @@ -9,6 +9,9 @@ app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="ifRoom" /> + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0b1a2a940..05e9e3bdc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -40,13 +40,6 @@ Person Topic Stream - Message sent! - Error sending message - Please specify stream. - Stream does not exist. - Please specify topic. - Please specify recipient. - No message written. Dev backend testing server Zulip Dev login Administrators (None) @@ -73,4 +66,12 @@ Reply to Sender Narrow to this stream Narrow to this topic + Message sent! + Error sending message + No stream specified. + Stream does not exists. + No subject specified. + No person specified. + No message written. + Realms From 72da75cbf8be66522be73fccf084feb957197a29 Mon Sep 17 00:00:00 2001 From: kunall17 Date: Mon, 27 Jun 2016 23:00:03 +0530 Subject: [PATCH 02/18] Added SharedPreferences to store the realms This GlobalSettings will store all the info about the saved realms. --- .../main/java/com/zulip/android/ZulipApp.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/zulip/android/ZulipApp.java b/app/src/main/java/com/zulip/android/ZulipApp.java index 2505d1d06..dc9662df4 100644 --- a/app/src/main/java/com/zulip/android/ZulipApp.java +++ b/app/src/main/java/com/zulip/android/ZulipApp.java @@ -60,6 +60,16 @@ public class ZulipApp extends Application { private Set mutedTopics; private static final String MUTED_TOPIC_KEY = "mutedTopics"; + private final static String GLOBAL_SETTINGS = "HumbugActivity"; + private final static String SERVER_SETTINGS = "serverSettings"; + private final static String GLOBAL_SETTINGS_CURRENT = "currentRealm"; + private static final String GLOBAL_SETTINGS_REALMS = "REALMS"; + + + public int currentRealm = 0; + + public HashSet serverStringSet; + private SharedPreferences globalSettings; /** * Handler to manage batching of unread messages */ @@ -98,13 +108,10 @@ public void onCreate() { // This used to be from HumbugActivity.getPreferences, so we keep that // file name. - this.settings = getSharedPreferences("HumbugActivity", - Context.MODE_PRIVATE); + globalSettings = getSharedPreferences(GLOBAL_SETTINGS, Context.MODE_PRIVATE); + currentRealm = globalSettings.getInt(GLOBAL_SETTINGS_CURRENT, currentRealm); + serverStringSet = new HashSet(globalSettings.getStringSet(GLOBAL_SETTINGS_REALMS, new HashSet())); - max_message_id = settings.getInt("max_message_id", -1); - eventQueueId = settings.getString("eventQueueId", null); - lastEventId = settings.getInt("lastEventId", -1); - pointer = settings.getInt("pointer", -1); this.api_key = settings.getString(API_KEY, null); From 2cb7684db874eb0aba8b9628a9be22fcbe2a775a Mon Sep 17 00:00:00 2001 From: kunall17 Date: Mon, 27 Jun 2016 23:00:49 +0530 Subject: [PATCH 03/18] Method to create a new Realm Changes the database helper and save default settings for the server. --- app/src/main/java/com/zulip/android/ZulipApp.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/app/src/main/java/com/zulip/android/ZulipApp.java b/app/src/main/java/com/zulip/android/ZulipApp.java index dc9662df4..373429371 100644 --- a/app/src/main/java/com/zulip/android/ZulipApp.java +++ b/app/src/main/java/com/zulip/android/ZulipApp.java @@ -386,4 +386,19 @@ private static void setInstance(ZulipApp instance) { public boolean isTopicMute(int id, String subject) { return mutedTopics.contains(id + subject); } + + public void createNewRealm() { + SharedPreferences.Editor editor = this.globalSettings.edit(); + currentRealm = serverStringSet.size(); + editor.putInt(GLOBAL_SETTINGS_CURRENT, currentRealm); + editor.apply(); + + databaseHelper = new DatabaseHelper(this, SERVER_SETTINGS + serverStringSet.size()); + + this.settings = getSharedPreferences(SERVER_SETTINGS + serverStringSet.size(), Context.MODE_PRIVATE); + max_message_id = settings.getInt("max_message_id", -1); + eventQueueId = settings.getString("eventQueueId", null); + lastEventId = settings.getInt("lastEventId", -1); + pointer = settings.getInt("pointer", -1); + } } From 119848ca36e29852cfad122de62eac9577a66344 Mon Sep 17 00:00:00 2001 From: kunall17 Date: Mon, 27 Jun 2016 23:01:20 +0530 Subject: [PATCH 04/18] Method to switch the current realm Saves current server position, changes the databaseHelper and get's the saved data for this server --- .../main/java/com/zulip/android/ZulipApp.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/zulip/android/ZulipApp.java b/app/src/main/java/com/zulip/android/ZulipApp.java index 373429371..163aceb3a 100644 --- a/app/src/main/java/com/zulip/android/ZulipApp.java +++ b/app/src/main/java/com/zulip/android/ZulipApp.java @@ -112,8 +112,7 @@ public void onCreate() { currentRealm = globalSettings.getInt(GLOBAL_SETTINGS_CURRENT, currentRealm); serverStringSet = new HashSet(globalSettings.getStringSet(GLOBAL_SETTINGS_REALMS, new HashSet())); - - + switchToRealm(currentRealm); this.api_key = settings.getString(API_KEY, null); if (api_key != null) { @@ -401,4 +400,22 @@ public void createNewRealm() { lastEventId = settings.getInt("lastEventId", -1); pointer = settings.getInt("pointer", -1); } + + public void switchToRealm(int position) { + databaseHelper = new DatabaseHelper(this, SERVER_SETTINGS + position); + this.settings = getSharedPreferences(SERVER_SETTINGS + position, Context.MODE_PRIVATE); + this.api_key = settings.getString("api_key", null); + max_message_id = settings.getInt("max_message_id", -1); + eventQueueId = settings.getString("eventQueueId", null); + lastEventId = settings.getInt("lastEventId", -1); + pointer = settings.getInt("pointer", -1); + if (settings.contains("email")) + this.you = Person.getOrUpdate(this, settings.getString("email", null), null, null); + currentRealm = position; + if (position != currentRealm) { + SharedPreferences.Editor edit = globalSettings.edit(); + edit.putInt(GLOBAL_SETTINGS_CURRENT, position); + edit.apply(); + } + } } From 2c0bd8096a1b9dd49b5a7f14dcfd492659330c9a Mon Sep 17 00:00:00 2001 From: kunall17 Date: Mon, 27 Jun 2016 23:07:44 +0530 Subject: [PATCH 05/18] Added a DialogFragment for the list of Realms --- .../zulip/android/activities/RealmDialog.java | 68 +++++++++++++++++++ .../android/activities/ZulipActivity.java | 4 ++ app/src/main/res/layout/realm_dialog_list.xml | 9 +++ app/src/main/res/values/strings.xml | 3 +- 4 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/zulip/android/activities/RealmDialog.java create mode 100644 app/src/main/res/layout/realm_dialog_list.xml diff --git a/app/src/main/java/com/zulip/android/activities/RealmDialog.java b/app/src/main/java/com/zulip/android/activities/RealmDialog.java new file mode 100644 index 000000000..7a1910372 --- /dev/null +++ b/app/src/main/java/com/zulip/android/activities/RealmDialog.java @@ -0,0 +1,68 @@ +package com.zulip.android.activities; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.app.DialogFragment; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ListView; +import android.widget.Toast; + +import com.zulip.android.R; +import com.zulip.android.ZulipApp; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; + +public class RealmDialog extends DialogFragment { + private ZulipApp app; + private ArrayAdapter realmsAdapter; + private Context context; + + static RealmDialog newInstance() { + return new RealmDialog(); + } + + public RealmDialog() { + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + LayoutInflater inflater = getActivity().getLayoutInflater(); + builder.setTitle(R.string.realm_title); + View rootView = inflater.inflate(R.layout.realm_dialog_list, null); + List realmsList = new ArrayList<>(); + context = getActivity(); + app = ZulipApp.get(); + ListView listView = (ListView) rootView.findViewById(R.id.realmListView); + realmsList = new ArrayList(app.serverStringSet); + realmsAdapter = new ArrayAdapter(context, android.R.layout.simple_list_item_1, realmsList); + listView.setAdapter(realmsAdapter); + builder.setView(rootView) + .setPositiveButton(R.string.realm_add, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + } + }) + .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + RealmDialog.this.getDialog().cancel(); + } + }); + return builder.create(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/zulip/android/activities/ZulipActivity.java b/app/src/main/java/com/zulip/android/activities/ZulipActivity.java index 2ab3f8080..2fb719b5c 100644 --- a/app/src/main/java/com/zulip/android/activities/ZulipActivity.java +++ b/app/src/main/java/com/zulip/android/activities/ZulipActivity.java @@ -1340,6 +1340,10 @@ public void onClick( break; case R.id.today: doNarrow(new NarrowFilterToday()); + case R.id.menu_realm: + FragmentManager fm = getSupportFragmentManager(); + RealmDialog dialogFragment = RealmDialog.newInstance(); + dialogFragment.show(fm, "fragment_realm"); break; case R.id.logout: logout(); diff --git a/app/src/main/res/layout/realm_dialog_list.xml b/app/src/main/res/layout/realm_dialog_list.xml new file mode 100644 index 000000000..47fb5f61c --- /dev/null +++ b/app/src/main/res/layout/realm_dialog_list.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 05e9e3bdc..c1871bac9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -74,4 +74,5 @@ No person specified. No message written. Realms - + Add Realm + \ No newline at end of file From cafa69eb38fd5ee4399cba1e43a4302dc6c7ef5e Mon Sep 17 00:00:00 2001 From: kunall17 Date: Mon, 27 Jun 2016 23:09:11 +0530 Subject: [PATCH 06/18] Switch realm on listView item click --- .../zulip/android/activities/RealmDialog.java | 30 +++++++++++++++++++ app/src/main/res/values/strings.xml | 5 ++++ 2 files changed, 35 insertions(+) diff --git a/app/src/main/java/com/zulip/android/activities/RealmDialog.java b/app/src/main/java/com/zulip/android/activities/RealmDialog.java index 7a1910372..3d443cc2f 100644 --- a/app/src/main/java/com/zulip/android/activities/RealmDialog.java +++ b/app/src/main/java/com/zulip/android/activities/RealmDialog.java @@ -52,6 +52,36 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { realmsList = new ArrayList(app.serverStringSet); realmsAdapter = new ArrayAdapter(context, android.R.layout.simple_list_item_1, realmsList); listView.setAdapter(realmsAdapter); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, final int position, long id) { + new AlertDialog.Builder(context) + .setTitle(R.string.realm_switch) + .setMessage(context.getString(R.string.realm_switch_confirm, realmsAdapter.getItem(position))) + .setPositiveButton(getResources().getString(android.R.string.yes), new DialogInterface.OnClickListener() { + public void onClick(final DialogInterface dialog, int whichButton) { + if (position == app.currentRealm) { + Toast.makeText(context, R.string.realm_this_is_current, Toast.LENGTH_LONG).show(); + return; + } + final ProgressDialog progressDialog = new ProgressDialog(getActivity()); + progressDialog.setCancelable(false); + progressDialog.setTitle(app.getString(R.string.realm_switching)); + progressDialog.setMessage(app.getString(R.string.please_wait)); + progressDialog.show(); + ((ZulipActivity) getActivity()).switchRealm(progressDialog, position); + if (RealmDialog.this.getDialog() != null) + RealmDialog.this.getDialog().cancel(); + } + }) + .setNegativeButton(getResources().getString(android.R.string.cancel), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + dialog.dismiss(); + } + }) + .show(); + } + }); builder.setView(rootView) .setPositiveButton(R.string.realm_add, new DialogInterface.OnClickListener() { @Override diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c1871bac9..62d8ed86a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -74,5 +74,10 @@ No person specified. No message written. Realms + Switch to this realm + "Do you want to switch to %s ?" + This is the current realm only! + Switching realm + Please wait Add Realm \ No newline at end of file From 10ce13d64bcbfc964b43ef11dd3412b54f9c0908 Mon Sep 17 00:00:00 2001 From: kunall17 Date: Mon, 27 Jun 2016 23:10:16 +0530 Subject: [PATCH 07/18] Switch realm method in ZulipActivity Abort current connections, handlers and establish new ones. --- .../android/activities/ZulipActivity.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/app/src/main/java/com/zulip/android/activities/ZulipActivity.java b/app/src/main/java/com/zulip/android/activities/ZulipActivity.java index 2fb719b5c..b2599130f 100644 --- a/app/src/main/java/com/zulip/android/activities/ZulipActivity.java +++ b/app/src/main/java/com/zulip/android/activities/ZulipActivity.java @@ -1491,4 +1491,24 @@ public void onNewMessages(Message[] messages) { narrowedList.onNewMessages(messages); } } + + void switchRealm(final ProgressDialog progressDialog, final int position) { + if (event_poll != null) { + event_poll.abort(); + event_poll = null; + } + statusUpdateHandler.removeMessages(0); + unregisterReceiver(onGcmMessage); + app.clearConnectionState(); + app.switchToRealm(position); + app.resetDatabase(); + app.setEmail(app.getYou().getEmail()); + event_poll = new AsyncGetEvents(ZulipActivity.this); + event_poll.start(); + IntentFilter filter = new IntentFilter(GcmBroadcastReceiver.getGCMReceiverAction(getApplicationContext())); + filter.setPriority(2); + registerReceiver(onGcmMessage, filter); + progressDialog.dismiss(); + } + } From c7e510d8a8163922e1c8973c5dc9b909ac42cb8c Mon Sep 17 00:00:00 2001 From: kunall17 Date: Mon, 27 Jun 2016 23:24:52 +0530 Subject: [PATCH 08/18] Added server Url, realmName editText to the login Activity --- .../java/com/zulip/android/activities/LoginActivity.java | 2 ++ .../java/com/zulip/android/activities/ZulipActivity.java | 1 + app/src/main/res/layout-v21/login.xml | 6 ++++++ app/src/main/res/layout/login.xml | 6 ++++++ app/src/main/res/values/strings.xml | 4 ++++ 5 files changed, 19 insertions(+) diff --git a/app/src/main/java/com/zulip/android/activities/LoginActivity.java b/app/src/main/java/com/zulip/android/activities/LoginActivity.java index ca7be23ce..2435ea67e 100644 --- a/app/src/main/java/com/zulip/android/activities/LoginActivity.java +++ b/app/src/main/java/com/zulip/android/activities/LoginActivity.java @@ -52,6 +52,7 @@ public class LoginActivity extends AppCompatActivity implements View.OnClickList private EditText mUserName; private EditText mPassword; private EditText serverIn; + private EditText realmNameET; private View mGoogleSignInButton; @@ -100,6 +101,7 @@ public void onClick(View view) { private void showLoginFields() { AnimationHelper.showView(findViewById(R.id.serverInput), 201); AnimationHelper.hideView(findViewById(R.id.serverFieldLayout), 100); + realmNameET = (EditText) findViewById(R.id.realmName); } @Override diff --git a/app/src/main/java/com/zulip/android/activities/ZulipActivity.java b/app/src/main/java/com/zulip/android/activities/ZulipActivity.java index b2599130f..b4ae4383f 100644 --- a/app/src/main/java/com/zulip/android/activities/ZulipActivity.java +++ b/app/src/main/java/com/zulip/android/activities/ZulipActivity.java @@ -11,6 +11,7 @@ import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.AlertDialog; +import android.app.ProgressDialog; import android.app.SearchManager; import android.content.BroadcastReceiver; import android.content.ComponentName; diff --git a/app/src/main/res/layout-v21/login.xml b/app/src/main/res/layout-v21/login.xml index 9d9414f62..5c2b4d3aa 100644 --- a/app/src/main/res/layout-v21/login.xml +++ b/app/src/main/res/layout-v21/login.xml @@ -46,6 +46,12 @@ android:text="@string/enter_server" android:textAppearance="?android:attr/textAppearanceMedium" /> + + + + Switching realm Please wait Add Realm + Name of a realm (Optional) + + + \ No newline at end of file From eb244f7e7da6b395ccf9f6a519bd6e10215b3d2d Mon Sep 17 00:00:00 2001 From: kunall17 Date: Mon, 27 Jun 2016 23:30:59 +0530 Subject: [PATCH 09/18] Save realmName, serverUrl in asynLogin --- .../android/activities/DevAuthActivity.java | 5 ++- .../android/activities/LoginActivity.java | 37 +++++++++++++++---- .../android/networking/AsyncDevGetEmails.java | 14 ++++++- .../android/networking/AsyncGetBackends.java | 5 ++- .../zulip/android/networking/AsyncLogin.java | 17 +++++++-- app/src/main/res/values/strings.xml | 3 +- 6 files changed, 65 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/zulip/android/activities/DevAuthActivity.java b/app/src/main/java/com/zulip/android/activities/DevAuthActivity.java index 560f986df..92479b15f 100644 --- a/app/src/main/java/com/zulip/android/activities/DevAuthActivity.java +++ b/app/src/main/java/com/zulip/android/activities/DevAuthActivity.java @@ -33,6 +33,9 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dev_auth); String json = getIntent().getStringExtra(AsyncDevGetEmails.EMAIL_JSON); + final String realmName = getIntent().getStringExtra(AsyncDevGetEmails.REALM_NAME_JSON); + final String serverURL = getIntent().getStringExtra(AsyncDevGetEmails.SERVER_URL_JSON); + final boolean startedFromAddRealm = getIntent().getBooleanExtra(AsyncDevGetEmails.ADD_REALM_BOOLEAN_JSON, false); recyclerView = (RecyclerView) findViewById(R.id.devAuthRecyclerView); List emails = new ArrayList<>(); int directAdminSize = 1; @@ -58,7 +61,7 @@ protected void onCreate(Bundle savedInstanceState) { authEmailAdapter.setOnItemClickListener(new AuthClickListener() { @Override public void onItemClick(String email) { - AsyncLogin asyncLogin = new AsyncLogin(DevAuthActivity.this, email, null, true); + AsyncLogin asyncLogin = new AsyncLogin(DevAuthActivity.this, email, null, realmName, startedFromAddRealm, serverURL, true); asyncLogin.execute(); connectionProgressDialog.show(); } diff --git a/app/src/main/java/com/zulip/android/activities/LoginActivity.java b/app/src/main/java/com/zulip/android/activities/LoginActivity.java index 2435ea67e..b6abbd3b0 100644 --- a/app/src/main/java/com/zulip/android/activities/LoginActivity.java +++ b/app/src/main/java/com/zulip/android/activities/LoginActivity.java @@ -9,6 +9,7 @@ import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; +import android.text.TextUtils; import android.util.Log; import android.util.Patterns; import android.view.View; @@ -34,6 +35,8 @@ import org.json.JSONException; import org.json.JSONObject; +import java.net.URI; +import java.net.URISyntaxException; import java.util.List; /** @@ -46,6 +49,7 @@ public class LoginActivity extends AppCompatActivity implements View.OnClickList private static final int REQUEST_CODE_RESOLVE_ERR = 9000; private static final int REQUEST_CODE_SIGN_IN = 9001; + private boolean startedFromAddRealm = false; private ProgressDialog connectionProgressDialog; private GoogleApiClient mGoogleApiClient; private EditText mServerEditText; @@ -53,7 +57,7 @@ public class LoginActivity extends AppCompatActivity implements View.OnClickList private EditText mPassword; private EditText serverIn; private EditText realmNameET; - + String serverURL; private View mGoogleSignInButton; @Override @@ -157,6 +161,7 @@ private void checkForError() { } } } + private void showBackends(String httpScheme, String serverURL) { Uri serverUri = Uri.parse(serverURL); @@ -171,8 +176,8 @@ private void showBackends(String httpScheme, String serverURL) { serverIn.setText(serverUri.toString()); mServerEditText.setText(serverUri.toString()); mServerEditText.setEnabled(false); - ((ZulipApp) getApplication()).setServerURL(serverUri.toString()); - AsyncGetBackends asyncGetBackends = new AsyncGetBackends(ZulipApp.get()); + serverURL = serverUri.toString(); + AsyncGetBackends asyncGetBackends = new AsyncGetBackends(ZulipApp.get(), serverURL); asyncGetBackends.setCallback(new AsyncTaskCompleteListener() { @Override public void onTaskComplete(String result, JSONObject jsonObject) { @@ -244,7 +249,7 @@ private void handleSignInResult(GoogleSignInResult result) { return; } - final AsyncLogin loginTask = new AsyncLogin(LoginActivity.this, "google-oauth2-token", account.getIdToken(), false); + final AsyncLogin loginTask = new AsyncLogin(LoginActivity.this, "google-oauth2-token", account.getIdToken(), getRealmName(), startedFromAddRealm, serverURL, false); loginTask.setCallback(new AsyncTaskCompleteListener() { @Override public void onTaskComplete(String result, JSONObject object) { @@ -272,7 +277,21 @@ public void onTaskFailure(String result) { } } - private void openLegal() { + private String getRealmName() { + if (TextUtils.isEmpty(realmNameET.getText())) { + String server = serverURL; + URI uri = null; + try { + uri = new URI(server); + } catch (URISyntaxException e) { + return server; + } + return uri.getHost(); + } + return realmNameET.getText().toString(); + } + + protected void openLegal() { Intent i = new Intent(this, LegalActivity.class); startActivityForResult(i, 0); } @@ -343,10 +362,14 @@ public void onClick(View v) { if (!isInputValid()) { return; } + if (!isInputValid()) return; + if (serverURL == null) return; connectionProgressDialog.show(); AsyncLogin alog = new AsyncLogin(LoginActivity.this, - mUserName.getText().toString(), mPassword.getText().toString(), false); + mUserName.getText().toString(), mPassword.getText().toString(), + getRealmName(), startedFromAddRealm, serverURL, false); + // Remove the CPD when done alog.setCallback(new AsyncTaskCompleteListener() { @Override @@ -368,7 +391,7 @@ public void onTaskFailure(String result) { case R.id.local_server_button: if (!isInputValidForDevAuth()) return; connectionProgressDialog.show(); - AsyncDevGetEmails asyncDevGetEmails = new AsyncDevGetEmails(LoginActivity.this); + AsyncDevGetEmails asyncDevGetEmails = new AsyncDevGetEmails(LoginActivity.this, serverURL, getRealmName(), startedFromAddRealm); asyncDevGetEmails.setCallback(new AsyncTaskCompleteListener() { @Override public void onTaskComplete(String result, JSONObject jsonObject) { diff --git a/app/src/main/java/com/zulip/android/networking/AsyncDevGetEmails.java b/app/src/main/java/com/zulip/android/networking/AsyncDevGetEmails.java index b171c6061..29e686f51 100644 --- a/app/src/main/java/com/zulip/android/networking/AsyncDevGetEmails.java +++ b/app/src/main/java/com/zulip/android/networking/AsyncDevGetEmails.java @@ -20,11 +20,20 @@ public class AsyncDevGetEmails extends ZulipAsyncPushTask { private static final String DISABLED = "dev_disabled"; private Context context; + public static final String SERVER_URL_JSON = "server_url"; + public static final String REALM_NAME_JSON = "realm_json"; + public static final String ADD_REALM_BOOLEAN_JSON = "add_realm_bool_json"; public final static String EMAIL_JSON = "emails_json"; + private String serverURL; + private String realmName; + private boolean startedFromAddRealm; - public AsyncDevGetEmails(LoginActivity loginActivity) { + public AsyncDevGetEmails(LoginActivity loginActivity, String serverURL, String realmName, boolean startedFromAddRealm) { super((ZulipApp) loginActivity.getApplication()); context = loginActivity; + this.serverURL = serverURL; + this.realmName = realmName; + this.startedFromAddRealm = startedFromAddRealm; } public final void execute() { @@ -38,6 +47,9 @@ protected void onPostExecute(String result) { if (obj.getString("result").equals("success")) { Intent intent = new Intent(context, DevAuthActivity.class); intent.putExtra(EMAIL_JSON, result); + intent.putExtra(REALM_NAME_JSON, realmName); + intent.putExtra(SERVER_URL_JSON, serverURL); + intent.putExtra(ADD_REALM_BOOLEAN_JSON, startedFromAddRealm); context.startActivity(intent); } } catch (JSONException e) { diff --git a/app/src/main/java/com/zulip/android/networking/AsyncGetBackends.java b/app/src/main/java/com/zulip/android/networking/AsyncGetBackends.java index dac689aad..78c6384d7 100644 --- a/app/src/main/java/com/zulip/android/networking/AsyncGetBackends.java +++ b/app/src/main/java/com/zulip/android/networking/AsyncGetBackends.java @@ -8,8 +8,11 @@ */ public class AsyncGetBackends extends ZulipAsyncPushTask { - public AsyncGetBackends(ZulipApp app) { + private String serverURL; + + public AsyncGetBackends(ZulipApp app, String url) { super(app); + this.serverURL = url; } //Json Format - {"msg":"","password":false,"google":false,"result":"success","dev":true} diff --git a/app/src/main/java/com/zulip/android/networking/AsyncLogin.java b/app/src/main/java/com/zulip/android/networking/AsyncLogin.java index ba1eb4740..0e53ea5e4 100644 --- a/app/src/main/java/com/zulip/android/networking/AsyncLogin.java +++ b/app/src/main/java/com/zulip/android/networking/AsyncLogin.java @@ -22,18 +22,24 @@ public class AsyncLogin extends ZulipAsyncPushTask { private Activity activity; private boolean devServer = true; //If this is a DevAuthBackend server! - private LoginActivity context; + private Activity context; private boolean userDefinitelyInvalid = false; + boolean startedFromAddRealm = false; + private String realmName; + private String username; + private String serverURL; /** * @param activity Reference to the activity from this is called mainly {@link LoginActivity} and {@link DevAuthActivity} * @param username Stores the E-Mail of the user or a string "google-oauth2-token" if this is for Google Authentication * @param password Stores the password if EmailBackend, ID Token if GoogleMobileOauth2Backend, and blank if DevAuthBackend */ - public AsyncLogin(Activity activity, String username, String password, boolean devServer) { + public AsyncLogin(Activity loginActivity, String username, String password, String realmName, boolean startedFromAddRealm, String serverURL, boolean devServer) { super(ZulipApp.get()); - this.activity = activity; - if (username.contains("@")) { + this.startedFromAddRealm = startedFromAddRealm; + context = loginActivity; + this.username = username; + if (username.contains("@") && !startedFromAddRealm) { // @-less usernames are used as indicating special cases, for // example in OAuth2 authentication this.app.setEmail(username); @@ -43,6 +49,9 @@ public AsyncLogin(Activity activity, String username, String password, boolean d this.setProperty("password", password); this.devServer = false; } + this.setProperty("password", password); + this.realmName = realmName; + this.serverURL = serverURL; } public final void execute() { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8809864a9..73caab8a3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -81,7 +81,6 @@ Please wait Add Realm Name of a realm (Optional) - - + Realm Name already exists, please change. \ No newline at end of file From 7dba7554d5048854b0ca3257ef9bc542ab3f451b Mon Sep 17 00:00:00 2001 From: kunall17 Date: Mon, 27 Jun 2016 23:33:29 +0530 Subject: [PATCH 10/18] Pass Server URL to HTTPRequest for logging in. --- .../java/com/zulip/android/activities/LoginActivity.java | 6 +++--- .../com/zulip/android/networking/AsyncDevGetEmails.java | 1 + .../com/zulip/android/networking/AsyncGetBackends.java | 1 + .../main/java/com/zulip/android/networking/AsyncLogin.java | 1 + .../java/com/zulip/android/networking/HTTPRequest.java | 7 ++++++- .../com/zulip/android/networking/ZulipAsyncPushTask.java | 4 ++++ 6 files changed, 16 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/zulip/android/activities/LoginActivity.java b/app/src/main/java/com/zulip/android/activities/LoginActivity.java index b6abbd3b0..9e11ad0de 100644 --- a/app/src/main/java/com/zulip/android/activities/LoginActivity.java +++ b/app/src/main/java/com/zulip/android/activities/LoginActivity.java @@ -57,7 +57,7 @@ public class LoginActivity extends AppCompatActivity implements View.OnClickList private EditText mPassword; private EditText serverIn; private EditText realmNameET; - String serverURL; + private String serverURL; private View mGoogleSignInButton; @Override @@ -176,8 +176,8 @@ private void showBackends(String httpScheme, String serverURL) { serverIn.setText(serverUri.toString()); mServerEditText.setText(serverUri.toString()); mServerEditText.setEnabled(false); - serverURL = serverUri.toString(); - AsyncGetBackends asyncGetBackends = new AsyncGetBackends(ZulipApp.get(), serverURL); + this.serverURL = serverUri.toString(); + AsyncGetBackends asyncGetBackends = new AsyncGetBackends(ZulipApp.get(), this.serverURL); asyncGetBackends.setCallback(new AsyncTaskCompleteListener() { @Override public void onTaskComplete(String result, JSONObject jsonObject) { diff --git a/app/src/main/java/com/zulip/android/networking/AsyncDevGetEmails.java b/app/src/main/java/com/zulip/android/networking/AsyncDevGetEmails.java index 29e686f51..b75f522b7 100644 --- a/app/src/main/java/com/zulip/android/networking/AsyncDevGetEmails.java +++ b/app/src/main/java/com/zulip/android/networking/AsyncDevGetEmails.java @@ -34,6 +34,7 @@ public AsyncDevGetEmails(LoginActivity loginActivity, String serverURL, String r this.serverURL = serverURL; this.realmName = realmName; this.startedFromAddRealm = startedFromAddRealm; + this.setServerURL(serverURL); } public final void execute() { diff --git a/app/src/main/java/com/zulip/android/networking/AsyncGetBackends.java b/app/src/main/java/com/zulip/android/networking/AsyncGetBackends.java index 78c6384d7..7be703fc9 100644 --- a/app/src/main/java/com/zulip/android/networking/AsyncGetBackends.java +++ b/app/src/main/java/com/zulip/android/networking/AsyncGetBackends.java @@ -13,6 +13,7 @@ public class AsyncGetBackends extends ZulipAsyncPushTask { public AsyncGetBackends(ZulipApp app, String url) { super(app); this.serverURL = url; + this.setServerURL(serverURL); } //Json Format - {"msg":"","password":false,"google":false,"result":"success","dev":true} diff --git a/app/src/main/java/com/zulip/android/networking/AsyncLogin.java b/app/src/main/java/com/zulip/android/networking/AsyncLogin.java index 0e53ea5e4..f05567fae 100644 --- a/app/src/main/java/com/zulip/android/networking/AsyncLogin.java +++ b/app/src/main/java/com/zulip/android/networking/AsyncLogin.java @@ -51,6 +51,7 @@ public AsyncLogin(Activity loginActivity, String username, String password, Stri } this.setProperty("password", password); this.realmName = realmName; + this.setServerURL(serverURL); this.serverURL = serverURL; } diff --git a/app/src/main/java/com/zulip/android/networking/HTTPRequest.java b/app/src/main/java/com/zulip/android/networking/HTTPRequest.java index f1b6af91e..a8e930d7f 100644 --- a/app/src/main/java/com/zulip/android/networking/HTTPRequest.java +++ b/app/src/main/java/com/zulip/android/networking/HTTPRequest.java @@ -33,6 +33,7 @@ public class HTTPRequest { private OkHttpClient okHttpClient; private Response response = null; private String method, path; + private String serverURL; public void setMethodAndUrl(String method, String URL) { this.method = method; @@ -43,8 +44,12 @@ public HTTPRequest(ZulipApp app) { properties = new HashMap<>(); this.app = app; okHttpClient = new OkHttpClient.Builder().readTimeout(60, TimeUnit.SECONDS).build(); + this.serverURL = app.getServerURI(); } + public void setServerURL(String serverURL) { + this.serverURL = serverURL; + } public void setProperty(String key, String value) { properties.put((key == null) ? "" : key, (value == null) ? "" : value); @@ -71,7 +76,7 @@ public Response execute() throws IOException { if (method == null) throw new IOException(app.getString(R.string.method_null)); Request.Builder requestBuilder = new Request.Builder(); - String url = app.getServerURI() + path; + String url = serverURL + path; requestBuilder.addHeader("client", "Android"); requestBuilder.addHeader("User-Agent", app.getUserAgent()); diff --git a/app/src/main/java/com/zulip/android/networking/ZulipAsyncPushTask.java b/app/src/main/java/com/zulip/android/networking/ZulipAsyncPushTask.java index 2c210708d..50e999e2d 100644 --- a/app/src/main/java/com/zulip/android/networking/ZulipAsyncPushTask.java +++ b/app/src/main/java/com/zulip/android/networking/ZulipAsyncPushTask.java @@ -24,6 +24,10 @@ public abstract class ZulipAsyncPushTask extends AsyncTask From da6713b8a4b8dd3db934c515a1877669cccd4ba6 Mon Sep 17 00:00:00 2001 From: kunall17 Date: Mon, 27 Jun 2016 23:40:06 +0530 Subject: [PATCH 11/18] Save apikey, server to sharedPreferences while login --- app/src/main/java/com/zulip/android/ZulipApp.java | 13 +++++++++++++ .../zulip/android/activities/DevAuthActivity.java | 5 ++++- .../zulip/android/activities/LoginActivity.java | 4 +++- .../com/zulip/android/networking/AsyncLogin.java | 15 +++++++++++---- .../zulip/android/networking/LoginInterface.java | 6 ++++++ 5 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/com/zulip/android/networking/LoginInterface.java diff --git a/app/src/main/java/com/zulip/android/ZulipApp.java b/app/src/main/java/com/zulip/android/ZulipApp.java index 163aceb3a..f17112e3b 100644 --- a/app/src/main/java/com/zulip/android/ZulipApp.java +++ b/app/src/main/java/com/zulip/android/ZulipApp.java @@ -386,6 +386,19 @@ public boolean isTopicMute(int id, String subject) { return mutedTopics.contains(id + subject); } + public void saveServerName(String serverName) { + String username=null; + try { + username = you.getEmail(); + } catch (Exception e) { + //SQL Exception can occur if name is not updated! + ZLog.logException(e); + } + Editor globalEditor = this.globalSettings.edit(); + serverStringSet.add((username != null) ? serverName + " - " + username : serverName); + globalEditor.putStringSet(GLOBAL_SETTINGS_REALMS, new HashSet(serverStringSet)); + globalEditor.apply(); + } public void createNewRealm() { SharedPreferences.Editor editor = this.globalSettings.edit(); currentRealm = serverStringSet.size(); diff --git a/app/src/main/java/com/zulip/android/activities/DevAuthActivity.java b/app/src/main/java/com/zulip/android/activities/DevAuthActivity.java index 92479b15f..5e4fc71a2 100644 --- a/app/src/main/java/com/zulip/android/activities/DevAuthActivity.java +++ b/app/src/main/java/com/zulip/android/activities/DevAuthActivity.java @@ -10,6 +10,8 @@ import com.zulip.android.R; import com.zulip.android.networking.AsyncDevGetEmails; import com.zulip.android.networking.AsyncLogin; +import com.zulip.android.networking.LoginInterface; +import com.zulip.android.networking.ZulipAsyncPushTask; import com.zulip.android.util.AuthClickListener; import com.zulip.android.util.ZLog; @@ -23,7 +25,7 @@ /** * Activity where the Emails for the DevAuthBackend are displayed. */ -public class DevAuthActivity extends Activity { +public class DevAuthActivity extends Activity implements LoginInterface { private RecyclerView recyclerView; private ProgressDialog connectionProgressDialog; @@ -70,6 +72,7 @@ public void onItemClick(String email) { }); } + @Override public void openHome() { // Cancel before leaving activity to avoid leaking windows connectionProgressDialog.dismiss(); diff --git a/app/src/main/java/com/zulip/android/activities/LoginActivity.java b/app/src/main/java/com/zulip/android/activities/LoginActivity.java index 9e11ad0de..557235e8a 100644 --- a/app/src/main/java/com/zulip/android/activities/LoginActivity.java +++ b/app/src/main/java/com/zulip/android/activities/LoginActivity.java @@ -26,6 +26,7 @@ import com.zulip.android.R; import com.zulip.android.networking.AsyncDevGetEmails; import com.zulip.android.networking.AsyncGetBackends; +import com.zulip.android.networking.LoginInterface; import com.zulip.android.util.AnimationHelper; import com.zulip.android.util.ZLog; import com.zulip.android.ZulipApp; @@ -44,7 +45,7 @@ * Currently supported LoginAuths are Emailbackend and DevAuthBackend. */ public class LoginActivity extends AppCompatActivity implements View.OnClickListener, - GoogleApiClient.OnConnectionFailedListener { + GoogleApiClient.OnConnectionFailedListener, LoginInterface { private static final String TAG = "LoginActivity"; private static final int REQUEST_CODE_RESOLVE_ERR = 9000; private static final int REQUEST_CODE_SIGN_IN = 9001; @@ -296,6 +297,7 @@ protected void openLegal() { startActivityForResult(i, 0); } + @Override public void openHome() { // Cancel before leaving activity to avoid leaking windows connectionProgressDialog.dismiss(); diff --git a/app/src/main/java/com/zulip/android/networking/AsyncLogin.java b/app/src/main/java/com/zulip/android/networking/AsyncLogin.java index f05567fae..e354fa4d1 100644 --- a/app/src/main/java/com/zulip/android/networking/AsyncLogin.java +++ b/app/src/main/java/com/zulip/android/networking/AsyncLogin.java @@ -28,6 +28,7 @@ public class AsyncLogin extends ZulipAsyncPushTask { private String realmName; private String username; private String serverURL; + LoginInterface loginInterface; /** * @param activity Reference to the activity from this is called mainly {@link LoginActivity} and {@link DevAuthActivity} @@ -53,6 +54,7 @@ public AsyncLogin(Activity loginActivity, String username, String password, Stri this.realmName = realmName; this.setServerURL(serverURL); this.serverURL = serverURL; + loginInterface = (LoginInterface) context; } public final void execute() { @@ -67,10 +69,15 @@ protected void onPostExecute(String result) { JSONObject obj = new JSONObject(result); if (obj.getString("result").equals("success")) { - this.app.setLoggedInApiKey(obj.getString("api_key")); - if (devServer) ((DevAuthActivity) activity).openHome(); - else ((LoginActivity) activity).openHome(); - callback.onTaskComplete(result, obj); + if (startedFromAddRealm) { + loginThroughAddRealm(obj); + callback.onTaskComplete(result, obj); + } else { + this.app.setServerURL(serverURL); + this.app.setLoggedInApiKey(obj.getString("api_key")); + ZulipApp.get().saveServerName(realmName); + loginInterface.openHome(); + } return; } } catch (JSONException e) { diff --git a/app/src/main/java/com/zulip/android/networking/LoginInterface.java b/app/src/main/java/com/zulip/android/networking/LoginInterface.java new file mode 100644 index 000000000..dd2b740cc --- /dev/null +++ b/app/src/main/java/com/zulip/android/networking/LoginInterface.java @@ -0,0 +1,6 @@ +package com.zulip.android.networking; + + +public interface LoginInterface { + void openHome(); +} From 362808e7fe19a6b3fdef1f95cccba0d1b5d370b9 Mon Sep 17 00:00:00 2001 From: kunall17 Date: Mon, 27 Jun 2016 23:41:14 +0530 Subject: [PATCH 12/18] Add new realm button code to realmDialog --- .../main/java/com/zulip/android/activities/RealmDialog.java | 4 ++++ .../main/java/com/zulip/android/activities/ZulipActivity.java | 1 + 2 files changed, 5 insertions(+) diff --git a/app/src/main/java/com/zulip/android/activities/RealmDialog.java b/app/src/main/java/com/zulip/android/activities/RealmDialog.java index 3d443cc2f..3f812d766 100644 --- a/app/src/main/java/com/zulip/android/activities/RealmDialog.java +++ b/app/src/main/java/com/zulip/android/activities/RealmDialog.java @@ -86,6 +86,10 @@ public void onClick(DialogInterface dialog, int whichButton) { .setPositiveButton(R.string.realm_add, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { + Intent newIntent = new Intent(context, LoginActivity.class); + newIntent.putExtra("FROM_ADDREALM", true); + getActivity().startActivityForResult(newIntent, ZulipActivity.ADDREALM_REQUEST_CODE); + RealmDialog.this.getDialog().cancel(); } }) .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { diff --git a/app/src/main/java/com/zulip/android/activities/ZulipActivity.java b/app/src/main/java/com/zulip/android/activities/ZulipActivity.java index b4ae4383f..64433ff82 100644 --- a/app/src/main/java/com/zulip/android/activities/ZulipActivity.java +++ b/app/src/main/java/com/zulip/android/activities/ZulipActivity.java @@ -152,6 +152,7 @@ public class ZulipActivity extends AppCompatActivity implements private SimpleCursorAdapter streamActvAdapter; private SimpleCursorAdapter subjectActvAdapter; private SimpleCursorAdapter emailActvAdapter; + public static final int ADDREALM_REQUEST_CODE = 201; private BroadcastReceiver onGcmMessage = new BroadcastReceiver() { public void onReceive(Context contenxt, Intent intent) { From 6e4d804687dbf9a423e23fd3a09552cada1e6c72 Mon Sep 17 00:00:00 2001 From: kunall17 Date: Mon, 27 Jun 2016 23:41:35 +0530 Subject: [PATCH 13/18] Change Title in LoginActivity if started from add realm --- .../java/com/zulip/android/activities/LoginActivity.java | 9 +++++++++ app/src/main/res/layout-v21/login.xml | 1 + app/src/main/res/layout/login.xml | 1 + app/src/main/res/values/strings.xml | 3 ++- 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/zulip/android/activities/LoginActivity.java b/app/src/main/java/com/zulip/android/activities/LoginActivity.java index 557235e8a..7afa15037 100644 --- a/app/src/main/java/com/zulip/android/activities/LoginActivity.java +++ b/app/src/main/java/com/zulip/android/activities/LoginActivity.java @@ -13,7 +13,11 @@ import android.util.Log; import android.util.Patterns; import android.view.View; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.CompoundButton; import android.widget.EditText; +import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.auth.api.Auth; @@ -107,6 +111,11 @@ private void showLoginFields() { AnimationHelper.showView(findViewById(R.id.serverInput), 201); AnimationHelper.hideView(findViewById(R.id.serverFieldLayout), 100); realmNameET = (EditText) findViewById(R.id.realmName); + if (getIntent().getBooleanExtra("FROM_ADDREALM", false)) { + startedFromAddRealm = true; + ((TextView) findViewById(R.id.welcome_zulip)).setText(R.string.add_realm); + ((Button) findViewById(R.id.zulip_login)).setText(R.string.add_realm_login); + } } @Override diff --git a/app/src/main/res/layout-v21/login.xml b/app/src/main/res/layout-v21/login.xml index 5c2b4d3aa..202a2432a 100644 --- a/app/src/main/res/layout-v21/login.xml +++ b/app/src/main/res/layout-v21/login.xml @@ -26,6 +26,7 @@ android:layout_marginTop="16dp" android:gravity="center|center_horizontal" android:padding="10dp" + android:id="@+id/welcome_zulip" android:text="@string/login_welcome_blurb" android:textAppearance="?android:attr/textAppearanceLarge" /> diff --git a/app/src/main/res/layout/login.xml b/app/src/main/res/layout/login.xml index b29edb897..26f1a3ff5 100644 --- a/app/src/main/res/layout/login.xml +++ b/app/src/main/res/layout/login.xml @@ -20,6 +20,7 @@ android:layout_marginTop="16dp" android:gravity="center|center_horizontal" android:padding="10dp" + android:id="@+id/welcome_zulip" android:text="@string/login_welcome_blurb" android:textAppearance="?android:attr/textAppearanceLarge" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 73caab8a3..86d071246 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -82,5 +82,6 @@ Add Realm Name of a realm (Optional) Realm Name already exists, please change. - + Add new Realm + Add \ No newline at end of file From 194a5810d78c65daf3f0e1427af9229950be225c Mon Sep 17 00:00:00 2001 From: kunall17 Date: Mon, 27 Jun 2016 23:51:59 +0530 Subject: [PATCH 14/18] Login through add realm in AsyncLogin --- .../com/zulip/android/networking/AsyncLogin.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/app/src/main/java/com/zulip/android/networking/AsyncLogin.java b/app/src/main/java/com/zulip/android/networking/AsyncLogin.java index e354fa4d1..b8c33d5f6 100644 --- a/app/src/main/java/com/zulip/android/networking/AsyncLogin.java +++ b/app/src/main/java/com/zulip/android/networking/AsyncLogin.java @@ -4,11 +4,13 @@ import org.json.JSONObject; import android.app.Activity; +import android.content.Intent; import android.util.Log; import android.widget.Toast; import com.zulip.android.activities.DevAuthActivity; import com.zulip.android.activities.LoginActivity; +import com.zulip.android.activities.ZulipActivity; import com.zulip.android.util.ZLog; import com.zulip.android.ZulipApp; @@ -88,6 +90,20 @@ protected void onPostExecute(String result) { Log.wtf("login", "We shouldn't have gotten this far."); } + private void loginThroughAddRealm(JSONObject jsonObject) { + try { + Intent intent = new Intent(context, ZulipActivity.class); + intent.putExtra("realmName", realmName); + intent.putExtra("api_key", jsonObject.getString("api_key")); + intent.putExtra("email", username); + intent.putExtra("serverURL", serverURL); + context.setResult(Activity.RESULT_OK, intent); + context.finish(); + } catch (JSONException e) { + ZLog.logException(e); + } + } + @Override protected void onCancelled(String result) { super.onCancelled(result); From d00242893f29a3b584ccf7b7ea4e0398a5352a3f Mon Sep 17 00:00:00 2001 From: Kunal Date: Wed, 17 Aug 2016 01:16:50 +0530 Subject: [PATCH 15/18] Finish DevAuthActivity first then finish LoginActivity to login to Zulip Activity --- .../com/zulip/android/activities/DevAuthActivity.java | 2 +- .../com/zulip/android/activities/LoginActivity.java | 10 +++++++++- .../zulip/android/networking/AsyncDevGetEmails.java | 5 ++++- .../java/com/zulip/android/networking/AsyncLogin.java | 9 ++++++++- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/zulip/android/activities/DevAuthActivity.java b/app/src/main/java/com/zulip/android/activities/DevAuthActivity.java index 5e4fc71a2..ade50ef47 100644 --- a/app/src/main/java/com/zulip/android/activities/DevAuthActivity.java +++ b/app/src/main/java/com/zulip/android/activities/DevAuthActivity.java @@ -28,7 +28,7 @@ public class DevAuthActivity extends Activity implements LoginInterface { private RecyclerView recyclerView; private ProgressDialog connectionProgressDialog; - + public static final int ADD_REALM_REQUEST = 566; @Override protected void onCreate(Bundle savedInstanceState) { diff --git a/app/src/main/java/com/zulip/android/activities/LoginActivity.java b/app/src/main/java/com/zulip/android/activities/LoginActivity.java index 7afa15037..5d9a6c641 100644 --- a/app/src/main/java/com/zulip/android/activities/LoginActivity.java +++ b/app/src/main/java/com/zulip/android/activities/LoginActivity.java @@ -1,5 +1,6 @@ package com.zulip.android.activities; +import android.app.Activity; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; @@ -44,6 +45,8 @@ import java.net.URISyntaxException; import java.util.List; +import static com.zulip.android.activities.DevAuthActivity.ADD_REALM_REQUEST; + /** * Activity to Login through various backends on a specified server. * Currently supported LoginAuths are Emailbackend and DevAuthBackend. @@ -126,6 +129,11 @@ protected void onActivityResult(int requestCode, int resultCode, Intent intent) GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(intent); handleSignInResult(result); break; + case ADD_REALM_REQUEST: + if (resultCode == Activity.RESULT_OK) { + setResult(Activity.RESULT_OK, intent); + finish(); + } default: break; } @@ -171,7 +179,7 @@ private void checkForError() { } } } - + private void showBackends(String httpScheme, String serverURL) { Uri serverUri = Uri.parse(serverURL); diff --git a/app/src/main/java/com/zulip/android/networking/AsyncDevGetEmails.java b/app/src/main/java/com/zulip/android/networking/AsyncDevGetEmails.java index b75f522b7..d982bd39f 100644 --- a/app/src/main/java/com/zulip/android/networking/AsyncDevGetEmails.java +++ b/app/src/main/java/com/zulip/android/networking/AsyncDevGetEmails.java @@ -13,6 +13,9 @@ import org.json.JSONException; import org.json.JSONObject; + +import static com.zulip.android.activities.DevAuthActivity.ADD_REALM_REQUEST; + /** * A background task which asynchronously fetches the Emails (Admins or Users) for the devAuthBackend * Mainly used Development builds. @@ -51,7 +54,7 @@ protected void onPostExecute(String result) { intent.putExtra(REALM_NAME_JSON, realmName); intent.putExtra(SERVER_URL_JSON, serverURL); intent.putExtra(ADD_REALM_BOOLEAN_JSON, startedFromAddRealm); - context.startActivity(intent); + ((LoginActivity) context).startActivityForResult(intent, ADD_REALM_REQUEST); } } catch (JSONException e) { ZLog.logException(e); diff --git a/app/src/main/java/com/zulip/android/networking/AsyncLogin.java b/app/src/main/java/com/zulip/android/networking/AsyncLogin.java index b8c33d5f6..97e9e943e 100644 --- a/app/src/main/java/com/zulip/android/networking/AsyncLogin.java +++ b/app/src/main/java/com/zulip/android/networking/AsyncLogin.java @@ -92,7 +92,14 @@ protected void onPostExecute(String result) { private void loginThroughAddRealm(JSONObject jsonObject) { try { - Intent intent = new Intent(context, ZulipActivity.class); + Intent intent = null; + //This is done to start ZulipActivity from DevAuthActivity which cannot be done directly as DevAuthActivity was called from LoginActivity + //And Therefore we have to finish two activities (DevAuthActivity and LoginActivity) if started from DevAuthActivity. + if (context instanceof DevAuthActivity) { + intent = new Intent(); + } else if (context instanceof LoginActivity) { + intent = new Intent(context, ZulipActivity.class); + } intent.putExtra("realmName", realmName); intent.putExtra("api_key", jsonObject.getString("api_key")); intent.putExtra("email", username); From 034af89110cde0bbf4ad0c73a9523a80b63b79f4 Mon Sep 17 00:00:00 2001 From: kunall17 Date: Mon, 27 Jun 2016 23:53:31 +0530 Subject: [PATCH 16/18] Save settings for the new realm settings. Reset, Abort current connections and estabilish new connections and settings. --- .../android/activities/ZulipActivity.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/app/src/main/java/com/zulip/android/activities/ZulipActivity.java b/app/src/main/java/com/zulip/android/activities/ZulipActivity.java index 64433ff82..2dcff9204 100644 --- a/app/src/main/java/com/zulip/android/activities/ZulipActivity.java +++ b/app/src/main/java/com/zulip/android/activities/ZulipActivity.java @@ -10,6 +10,7 @@ import android.animation.Animator; import android.annotation.SuppressLint; import android.annotation.TargetApi; +import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; import android.app.SearchManager; @@ -1513,4 +1514,44 @@ void switchRealm(final ProgressDialog progressDialog, final int position) { progressDialog.dismiss(); } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == ADDREALM_REQUEST_CODE && resultCode == Activity.RESULT_OK) { + this.currentList.adapter.clear(); + this.currentList.adapter.setHeaderShowing(true); + final String realmName = data.getStringExtra("realmName"); + final String apiKey = data.getStringExtra("api_key"); + final String email = data.getStringExtra("email"); + final String serverURL = data.getStringExtra("serverURL"); + notifications.logOut(new Runnable() { + @Override + public void run() { + if (event_poll != null) { + event_poll.abort(); + event_poll = null; + } + statusUpdateHandler.removeMessages(0); + try { + unregisterReceiver(onGcmMessage); + } catch (IllegalArgumentException e) { + ZLog.logException(e); + } + + app.clearConnectionState(); + app.createNewRealm(); + app.setEmail(email); + app.setServerURL(serverURL); + app.saveServerName(realmName); + app.setLoggedInApiKey(apiKey); + IntentFilter filter = new IntentFilter(GcmBroadcastReceiver.getGCMReceiverAction(getApplicationContext())); + filter.setPriority(2); + registerReceiver(onGcmMessage, filter); + onRefresh(); + } + }); + + } + this.currentList.adapter.setHeaderShowing(false); + } } From e9b39267a97d2788ddb6ac2fd58ce12634102734 Mon Sep 17 00:00:00 2001 From: kunall17 Date: Mon, 27 Jun 2016 23:54:33 +0530 Subject: [PATCH 17/18] Changed database name according to realm Position --- app/src/main/java/com/zulip/android/ZulipApp.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/zulip/android/ZulipApp.java b/app/src/main/java/com/zulip/android/ZulipApp.java index f17112e3b..26a2481d4 100644 --- a/app/src/main/java/com/zulip/android/ZulipApp.java +++ b/app/src/main/java/com/zulip/android/ZulipApp.java @@ -229,7 +229,7 @@ public void addToMutedTopics(JSONArray jsonArray) { } public void setEmail(String email) { - databaseHelper = new DatabaseHelper(this, email); + databaseHelper = new DatabaseHelper(this, SERVER_SETTINGS + currentRealm); this.you = Person.getOrUpdate(this, email, null, null); } From f21827db4682e8fbbbadd0beec5e974f20b64ac3 Mon Sep 17 00:00:00 2001 From: Kunal Date: Sun, 7 Aug 2016 01:51:16 +0530 Subject: [PATCH 18/18] Dismiss dialog after signing in Dev Auth Backend --- .../com/zulip/android/activities/DevAuthActivity.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/app/src/main/java/com/zulip/android/activities/DevAuthActivity.java b/app/src/main/java/com/zulip/android/activities/DevAuthActivity.java index ade50ef47..f50fa55f8 100644 --- a/app/src/main/java/com/zulip/android/activities/DevAuthActivity.java +++ b/app/src/main/java/com/zulip/android/activities/DevAuthActivity.java @@ -66,6 +66,17 @@ public void onItemClick(String email) { AsyncLogin asyncLogin = new AsyncLogin(DevAuthActivity.this, email, null, realmName, startedFromAddRealm, serverURL, true); asyncLogin.execute(); connectionProgressDialog.show(); + asyncLogin.setCallback(new ZulipAsyncPushTask.AsyncTaskCompleteListener() { + @Override + public void onTaskComplete(String result, JSONObject jsonObject) { + connectionProgressDialog.dismiss(); + } + + @Override + public void onTaskFailure(String result) { + connectionProgressDialog.dismiss(); + } + }); } }); recyclerView.setLayoutManager(new LinearLayoutManager(DevAuthActivity.this) {