Progress toward a generic authenticator which stores the library url as userdata...
authorkenstir <kenstir@gmail.com>
Sat, 14 Nov 2015 23:01:31 +0000 (18:01 -0500)
committerkenstir <kenstir@gmail.com>
Sat, 14 Nov 2015 23:01:31 +0000 (18:01 -0500)
Open-ILS/src/Android/core/res/layout/activity_login.xml
Open-ILS/src/Android/core/res/values/ou.xml
Open-ILS/src/Android/core/res/values/strings.xml
Open-ILS/src/Android/core/src/org/evergreen_ils/auth/AuthenticatorActivity.java
Open-ILS/src/Android/core/src/org/evergreen_ils/views/ChooseLibraryActivity.java
Open-ILS/src/Android/cwmars_app/res/values/ou.xml
Open-ILS/src/Android/eg_app/AndroidManifest.xml
Open-ILS/src/Android/eg_app/res/values/ou.xml

index bf9fb15..078c65b 100644 (file)
@@ -9,19 +9,27 @@
         >
 
     <TextView
-        android:id="@+id/account_sign_in_text"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/ou_account_sign_in_message"
-        android:textAppearance="?android:attr/textAppearanceLarge" />
-    
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="1dip"
-        android:background="#000000"
-        android:layout_marginTop="5dp"
-        android:layout_marginBottom="5dp"
-        />
+            android:id="@+id/account_sign_in_text"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/ou_account_sign_in_message"
+            android:textAppearance="?android:attr/textAppearanceLarge"
+            android:layout_marginBottom="32dp"/>
+
+    <TextView
+            android:id="@+id/choose_library_label"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/ou_choose_library_label"
+            android:textAppearance="?android:attr/textAppearanceMedium" />
+
+    <Spinner
+            android:id="@+id/choose_library_spinner"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="0dp"
+            android:layout_marginBottom="32dp"
+    />
 
     <EditText android:id="@+id/accountName"
               android:layout_width="match_parent"
index 44cb1fd..5a125d9 100644 (file)
@@ -2,8 +2,10 @@
 <resources>
     <!-- the label shown in the android account manager -->
     <string name="ou_account_label">Example Library</string>
-    <!-- $1 in ou_account_sign_in_message will be replaced with the value of ou_account_label -->
-    <string name="ou_account_sign_in_message">Sign in to your\n%1$s account</string>
+    <!-- title shown on sign in activity -->
+    <string name="ou_account_sign_in_message">Sign in to your\nXYZZY account</string>
+    <!-- label above choose library spinner, leave empty for library-specific app -->
+    <string name="ou_choose_library_label"></string>
     <!-- android account manager internal type.
          Each evergreen-derived app must have its own unique ou_account_type. -->
     <string name="ou_account_type">org.evergreen_ils.example</string>
index fb18d6e..c494f02 100644 (file)
     <string name="retry_label">Retry</string>
     <string name="choose_library_message">Select your Library</string>
     <string name="action_choose_library">Select</string>
+    <string name="evergreen_libraries_url">http://evergreen-ils.org/testing/libraries.json</string>
 
 </resources>
index c57058f..90f98ef 100644 (file)
@@ -1,6 +1,11 @@
 package org.evergreen_ils.auth;
 
+import android.content.Context;
 import android.preference.PreferenceManager;
+import android.text.TextUtils;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.Spinner;
 import org.evergreen_ils.R;
 import org.evergreen_ils.auth.Const;
 
@@ -19,25 +24,63 @@ import android.view.ContextThemeWrapper;
 import android.view.View;
 import android.widget.TextView;
 import org.evergreen_ils.globals.AppPrefs;
+import org.evergreen_ils.globals.GlobalConfigs;
+import org.evergreen_ils.globals.Utils;
+import org.evergreen_ils.searchCatalog.Library;
+import org.opensrf.util.JSONException;
+import org.opensrf.util.JSONReader;
+
+import java.util.*;
 
 public class AuthenticatorActivity extends AccountAuthenticatorActivity {
 
-    private final String TAG = AuthenticatorActivity.class.getName();
+    private final String TAG = AuthenticatorActivity.class.getSimpleName();
 
     public final static String ARG_ACCOUNT_TYPE = "ACCOUNT_TYPE";
     public final static String ARG_AUTH_TYPE = "AUTH_TYPE";
     public final static String ARG_ACCOUNT_NAME = "ACCOUNT_NAME";
     //public final static String ARG_IS_ADDING_NEW_ACCOUNT = "IS_ADDING_ACCOUNT";
     public static final String KEY_ERROR_MESSAGE = "ERR_MSG";
+    public static final String KEY_LIBRARY_URL = "library_url";
     public final static String PARAM_USER_PASS = "USER_PASS";
     private final int REQ_SIGNUP = 1;
     private static final String STATE_ALERT_MESSAGE = "state_dialog";
 
     private AccountManager accountManager;
+    private Context context;
+    private Spinner librarySpinner;
     private String authTokenType;
     private AsyncTask task = null;
     private AlertDialog alertDialog = null;
     private String alertMessage = null;
+    Library selected_library = null;
+    List<Library> libraries = new ArrayList<Library>();
+    public String libraries_directory_json_url;
+
+    private class FetchConsortiumsTask extends AsyncTask<String, Integer, String> {
+        protected String doInBackground(String... params) {
+            String url = params[0];
+            String result = null;
+            try {
+                Log.d(TAG, "fetching "+url);
+                result = Utils.getNetPageContent(url);
+            } catch (Exception e) {
+                Log.d(TAG, "error fetching", e);
+            }
+            return result;
+        }
+
+        protected void onPostExecute(String result) {
+            Log.d(TAG, "results available: "+result);
+            parseLibrariesJSON(result);
+            ArrayList<String> l = new ArrayList<String>(libraries.size());
+            for (Library library : libraries) {
+                l.add(library.directory_name);
+            }
+            ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_spinner_dropdown_item, l);
+            librarySpinner.setAdapter(adapter);
+        }
+    }
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -47,6 +90,8 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity {
         AppPrefs.init(this);
 
         accountManager = AccountManager.get(getBaseContext());
+        context = getApplicationContext();
+        libraries_directory_json_url = getString(R.string.evergreen_libraries_url);
 
         String accountName = getIntent().getStringExtra(ARG_ACCOUNT_NAME);
         Log.d(TAG, "onCreate> accountName="+accountName);
@@ -55,6 +100,19 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity {
             authTokenType = Const.AUTHTOKEN_TYPE;
         Log.d(TAG, "onCreate> authTokenType="+authTokenType);
 
+        librarySpinner = (Spinner) findViewById(R.id.choose_library_spinner);
+        librarySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
+                selected_library = libraries.get(position);
+            }
+
+            @Override
+            public void onNothingSelected(AdapterView<?> parent) {
+                selected_library = null;
+            }
+        });
+
         TextView signInText = (TextView) findViewById(R.id.account_sign_in_text);
         signInText.setText(String.format(getString(R.string.ou_account_sign_in_message),
                 AppPrefs.getString(AppPrefs.LIBRARY_NAME)));
@@ -77,7 +135,20 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity {
             }
         }
     }
-    
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+        Log.d(TAG, "onstart");
+        startTask();
+    }
+
+    @Override
+    protected void onRestart() {
+        super.onRestart();
+        Log.d(TAG, "onrestart");
+    }
+
     @Override
     protected void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
@@ -189,7 +260,12 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity {
         String authtokenType = authTokenType;
 
         // Create the account on the device
-        if (accountManager.addAccountExplicitly(account, accountPassword, null)) {
+        Bundle userdata = null;
+        if (selected_library != null) {
+            userdata = new Bundle();
+            userdata.putString(KEY_LIBRARY_URL, selected_library.url);
+        }
+        if (accountManager.addAccountExplicitly(account, accountPassword, userdata)) {
             Log.d(TAG, "onAuthSuccess> true, setAuthToken "+authtoken);
             // Not setting the auth token will cause another call to the server
             // to authenticate the user
@@ -204,4 +280,40 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity {
         setResult(RESULT_OK, intent);
         finish();
     }
+
+    private void startTask() {
+        new FetchConsortiumsTask().execute(libraries_directory_json_url);
+    }
+
+    private void parseLibrariesJSON(String json) {
+        libraries.clear();
+
+        if (json != null) {
+            List<Map<String,?>> l;
+            try {
+                l = (List<Map<String,?>>) new JSONReader(json).readArray();
+            } catch (JSONException e) {
+                Log.d(TAG, "failed parsing libraries array", e);
+                return;
+            }
+            for (Map<String, ?> map : l) {
+                String url = (String) map.get("url");
+                String directory_name = (String) map.get("directory_name");
+                String short_name = (String) map.get("short_name");
+                Library library = new Library(url, short_name, directory_name);
+                libraries.add(library);
+            }
+
+            Collections.sort(libraries, new Comparator<Library>() {
+                @Override
+                public int compare(Library a, Library b) {
+                    return a.directory_name.compareTo(b.directory_name);
+                }
+            });
+
+            for (int i = 0; i< libraries.size(); ++i) {
+                Log.d(TAG, "c["+i+"]: "+ libraries.get(i).directory_name);
+            }
+        }
+    }
 }
index bac7f18..a2fc2cc 100644 (file)
@@ -31,6 +31,10 @@ import java.util.*;
  */
 public class ChooseLibraryActivity extends ActionBarActivity {
 
+    /*
+    todo: DELETE ME DELETE ME DELETE ME DELETE ME DELETE ME DELETE ME DELETE ME DELETE ME DELETE ME
+    DELETE ME DELETE ME DELETE ME DELETE ME DELETE ME DELETE ME DELETE ME DELETE ME DELETE ME
+    DELETE ME DELETE ME DELETE ME DELETE ME DELETE ME DELETE ME DELETE ME DELETE ME DELETE ME
     public final static int CHOOSE_LIBRARY_REQUEST = 0;
     private final String TAG = ChooseLibraryActivity.class.getSimpleName();
     public static String librariesJSONUrl = "http://evergreen-ils.org/testing/libraries.json";
@@ -40,31 +44,6 @@ public class ChooseLibraryActivity extends ActionBarActivity {
     List<Library> libraries = new ArrayList<Library>();
     private boolean restarted = false;
 
-    private class FetchConsortiumsTask extends AsyncTask<String, Integer, String> {
-        protected String doInBackground(String... params) {
-            String url = params[0];
-            String result = null;
-            try {
-                Log.d(TAG, "fetching "+url);
-                result = Utils.getNetPageContent(url);
-            } catch (Exception e) {
-                Log.d(TAG, "error fetching", e);
-            }
-            return result;
-        }
-
-        protected void onPostExecute(String result) {
-            Log.d(TAG, "results available: "+result);
-            parseLibrariesJSON(result);
-            ArrayList<String> l = new ArrayList<String>(libraries.size());
-            for (Library library : libraries) {
-                l.add(library.directory_name);
-            }
-            ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_spinner_dropdown_item, l);
-            consortiumSpinner.setAdapter(adapter);
-        }
-    }
-
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         context = getApplicationContext();
@@ -166,5 +145,5 @@ public class ChooseLibraryActivity extends ActionBarActivity {
             }
         }
     }
-
+*/
 }
index 4aac9db..2222191 100644 (file)
@@ -3,7 +3,7 @@
 <resources>
     <!-- see ../core/res/values/ou.xml for a description -->
     <string name="ou_account_label">C/W MARS Library</string>
-    <string name="ou_account_sign_in_message">Sign in to your\n%1$s account</string>
+    <string name="ou_account_sign_in_message">Sign in to your\nC/W MARS account</string>
     <string name="ou_account_type">org.cwmars</string>
     <string name="ou_app_label">C/W MARS</string>
     <string name="ou_library_name">C/W MARS</string>
index 706b8a1..6f45453 100644 (file)
         <activity
                 android:name="org.evergreen_ils.views.splashscreen.SplashActivity"
                 android:theme="@android:style/Theme.NoTitleBar">
-        </activity>
-        <activity
-                android:name="org.evergreen_ils.views.ChooseLibraryActivity"
-                android:label="@string/ou_account_label">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
index 60a1cf8..9b68742 100644 (file)
@@ -3,7 +3,8 @@
 <resources>
     <!-- see ../core/res/values/ou.xml for a description -->
     <string name="ou_account_label">Evergreen Library</string>
-    <string name="ou_account_sign_in_message">Sign in to your\n%1$s account</string>
+    <string name="ou_account_sign_in_message">Sign in to your library account</string>
+    <string name="ou_choose_library_label">Location:</string>
     <string name="ou_account_type">org.evergreen-ils.eg_app</string>
     <string name="ou_app_label">Evergreen</string>
     <string name="ou_library_name"></string>