checkpoint: starting app on new activity and getting an app token and forwarding...
authorkenstir <kenstir@gmail.com>
Wed, 20 Nov 2013 01:08:46 +0000 (20:08 -0500)
committerkenstir <kenstir@gmail.com>
Wed, 20 Nov 2013 01:08:46 +0000 (20:08 -0500)
Open-ILS/src/Android/AndroidManifest.xml
Open-ILS/src/Android/res/layout/activity_junk.xml [new file with mode: 0644]
Open-ILS/src/Android/res/menu/junk.xml [new file with mode: 0644]
Open-ILS/src/Android/res/values/dimens.xml
Open-ILS/src/Android/res/values/strings.xml
Open-ILS/src/Android/src/org/evergreen/android/JunkActivity.java [new file with mode: 0644]
Open-ILS/src/Android/src/org/evergreen/android/accountAccess/CurrentLogin.java [new file with mode: 0644]
Open-ILS/src/Android/src/org/evergreen/android/globals/AppPreferences.java [new file with mode: 0644]
Open-ILS/src/Android/src/org/evergreen/android/views/StartupActivity.java

index dbc80c2..15cadea 100644 (file)
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="org.evergreen.android"
-    android:installLocation="auto"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <uses-sdk
-        android:minSdkVersion="8"
-        android:targetSdkVersion="18" />
-
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-    <uses-permission android:name="android.permission.INTERNET" />
-    <uses-permission android:name="android.permission.CAMERA" />
-    <uses-permission android:name="android.permission.VIBRATE" />
-    <uses-permission android:name="android.permission.FLASHLIGHT" />
-    <uses-permission android:name="android.permission.WAKE_LOCK" />
-
-    <uses-feature android:name="android.hardware.camera" />
-    <uses-feature android:name="android.hardware.camera.autofocus" />
-
-    <uses-permission android:name="android.permission.READ_CALENDAR" />
-    <uses-permission android:name="android.permission.WRITE_CALENDAR" />
-    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
-    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
-    <uses-permission android:name="android.permission.USE_CREDENTIALS"/>
-    <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
-    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
-
-    <application
-        android:allowBackup="true"
-        android:icon="@drawable/evergreen_launcher_icon"
-        android:label="@string/ou_app_name"
-        android:theme="@style/EvergreenTheme" >
-
-        <!-- Notification receiver -->
-        <receiver
-            android:name="org.evergreen.android.services.NotificationReceiver"
-            android:process=":remote" >
-        </receiver>
-        <!-- Receiver to reinit notifications on reboot -->
-        <receiver android:name="org.evergreen.android.services.RebootReceiver" >
-            <intent-filter>
-                <action android:name="android.intent.action.BOOT_COMPLETED" />
-            </intent-filter>
-        </receiver>
-        <receiver android:name="org.evergreen.android.services.PeriodicServiceBroadcastReceiver" >
-            <intent-filter>
-                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
-            </intent-filter>
-        </receiver>
-
-        <service android:name="org.evergreen.android.services.ScheduledIntentService" >
-        </service>
-
-        <activity
-            android:name="org.evergreen.android.views.splashscreen.SplashActivity"
-            android:label="@string/ou_app_label"
-            android:theme="@android:style/Theme.Light.NoTitleBar" >
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-        <activity
-            android:name="org.evergreen.android.views.MainScreenDashboard"
-            android:label="@string/ou_app_label"
-            android:theme="@android:style/Theme.Light.NoTitleBar" >
-        </activity>
-        <activity
-            android:name="org.evergreen.android.views.AccountScreenDashboard"
-            android:theme="@android:style/Theme.Light.NoTitleBar" >
-        </activity>
-        <activity android:name="org.evergreen.android.views.ApplicationPreferences" >
-        </activity>
-
-        <!-- First launch configuration activity -->
-        <activity android:name="org.evergreen.android.views.ConfigureApplicationActivity" >
-        </activity>
-
-        <!-- Search -->
-
-        <activity
-            android:name="org.evergreen.android.searchCatalog.SampleUnderlinesNoFade"
-            android:label="Underlines/No Fade" >
-        </activity>
-        <activity android:name="org.evergreen.android.searchCatalog.MoreCopyInformation" >
-        </activity>
-        <activity
-            android:name="org.evergreen.android.searchCatalog.SearchCatalogListView"
-            android:label="@string/ou_app_label" >
-        </activity>
-        <activity android:name="org.evergreen.android.searchCatalog.AdvancedSearchActivity" >
-        </activity>
-        <activity
-            android:name="org.evergreen.android.barcodescan.CaptureActivity"
-            android:label="@string/ou_app_label"
-            android:screenOrientation="landscape"
-            android:theme="@android:style/Theme.NoTitleBar"
-            android:windowSoftInputMode="stateAlwaysHidden" >
-        </activity>
-
-        <!-- Checkout Activities -->
-        <activity android:name="org.evergreen.android.accountAccess.checkout.ItemsCheckOutListView" >
-        </activity>
-
-        <!-- Holds Activities -->
-        <activity android:name="org.evergreen.android.accountAccess.holds.HoldsListView" >
-        </activity>
-        <activity android:name="org.evergreen.android.accountAccess.holds.PlaceHold" >
-        </activity>
-        <activity android:name="org.evergreen.android.accountAccess.holds.HoldDetails" >
-        </activity>
-
-        <!-- Fines Activities -->
-        <activity android:name="org.evergreen.android.accountAccess.fines.FinesActivity" >
-        </activity>
-
-        <!-- Bookbags -->
-        <activity android:name="org.evergreen.android.accountAccess.bookbags.BookbagsListView" >
-        </activity>
-        <activity android:name="org.evergreen.android.accountAccess.bookbags.BookBagDetails" >
-        </activity>
-        <activity
-            android:name="org.evergreen.android.views.StartupActivity"
-            android:label="@string/title_activity_startup"
-            android:windowSoftInputMode="adjustResize|stateVisible" >
-        </activity>
-        <activity
-            android:name="org.evergreen_ils.auth.AuthenticatorActivity"
-            android:label="@string/ou_account_label"
-            android:theme="@android:style/Theme.Light">
-        </activity>
-        <service 
-            android:name="org.evergreen_ils.auth.AuthenticatorService"
-            android:exported="false">
-            <intent-filter>
-                <action android:name="android.accounts.AccountAuthenticator" />
-            </intent-filter>
-            <meta-data android:name="android.accounts.AccountAuthenticator"
-                       android:resource="@xml/authenticator" />
-        </service>
-
-    </application>
-
-</manifest>
+<?xml version="1.0" encoding="utf-8"?>\r
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"\r
+    package="org.evergreen.android"\r
+    android:installLocation="auto"\r
+    android:versionCode="1"\r
+    android:versionName="1.0" >\r
+\r
+    <uses-sdk\r
+        android:minSdkVersion="8"\r
+        android:targetSdkVersion="18" />\r
+\r
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />\r
+    <uses-permission android:name="android.permission.INTERNET" />\r
+    <uses-permission android:name="android.permission.CAMERA" />\r
+    <uses-permission android:name="android.permission.VIBRATE" />\r
+    <uses-permission android:name="android.permission.FLASHLIGHT" />\r
+    <uses-permission android:name="android.permission.WAKE_LOCK" />\r
+\r
+    <uses-feature android:name="android.hardware.camera" />\r
+    <uses-feature android:name="android.hardware.camera.autofocus" />\r
+\r
+    <uses-permission android:name="android.permission.READ_CALENDAR" />\r
+    <uses-permission android:name="android.permission.WRITE_CALENDAR" />\r
+    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />\r
+    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />\r
+    <uses-permission android:name="android.permission.USE_CREDENTIALS" />\r
+    <uses-permission android:name="android.permission.GET_ACCOUNTS" />\r
+    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />\r
+\r
+    <application\r
+        android:allowBackup="true"\r
+        android:icon="@drawable/evergreen_launcher_icon"\r
+        android:label="@string/ou_app_name"\r
+        android:theme="@style/EvergreenTheme" >\r
+\r
+        <!-- Notification receiver -->\r
+        <receiver\r
+            android:name="org.evergreen.android.services.NotificationReceiver"\r
+            android:process=":remote" >\r
+        </receiver>\r
+        <!-- Receiver to reinit notifications on reboot -->\r
+        <receiver android:name="org.evergreen.android.services.RebootReceiver" >\r
+            <intent-filter>\r
+                <action android:name="android.intent.action.BOOT_COMPLETED" />\r
+            </intent-filter>\r
+        </receiver>\r
+        <receiver android:name="org.evergreen.android.services.PeriodicServiceBroadcastReceiver" >\r
+            <intent-filter>\r
+                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />\r
+            </intent-filter>\r
+        </receiver>\r
+\r
+        <service android:name="org.evergreen.android.services.ScheduledIntentService" >\r
+        </service>\r
+\r
+        <activity\r
+            android:name="org.evergreen.android.views.splashscreen.SplashActivity"\r
+            android:label="@string/ou_app_label"\r
+            android:theme="@android:style/Theme.Light.NoTitleBar" >\r
+\r
+            <!--\r
+            <intent-filter>\r
+                <action android:name="android.intent.action.MAIN" />\r
+\r
+                <category android:name="android.intent.category.LAUNCHER" />\r
+            </intent-filter>\r\r
+            -->\r
+        </activity>\r
+        <activity\r
+            android:name="org.evergreen.android.views.MainScreenDashboard"\r
+            android:label="@string/ou_app_label"\r
+            android:theme="@android:style/Theme.Light.NoTitleBar" >\r
+        </activity>\r
+        <activity\r
+            android:name="org.evergreen.android.views.AccountScreenDashboard"\r
+            android:theme="@android:style/Theme.Light.NoTitleBar" >\r
+        </activity>\r
+        <activity android:name="org.evergreen.android.views.ApplicationPreferences" >\r
+        </activity>\r
+\r
+        <!-- First launch configuration activity -->\r
+        <activity android:name="org.evergreen.android.views.ConfigureApplicationActivity" >\r
+        </activity>\r
+\r
+        <!-- Search -->\r
+\r
+        <activity\r
+            android:name="org.evergreen.android.searchCatalog.SampleUnderlinesNoFade"\r
+            android:label="Underlines/No Fade" >\r
+        </activity>\r
+        <activity android:name="org.evergreen.android.searchCatalog.MoreCopyInformation" >\r
+        </activity>\r
+        <activity\r
+            android:name="org.evergreen.android.searchCatalog.SearchCatalogListView"\r
+            android:label="@string/ou_app_label" >\r
+        </activity>\r
+        <activity android:name="org.evergreen.android.searchCatalog.AdvancedSearchActivity" >\r
+        </activity>\r
+        <activity\r
+            android:name="org.evergreen.android.barcodescan.CaptureActivity"\r
+            android:label="@string/ou_app_label"\r
+            android:screenOrientation="landscape"\r
+            android:theme="@android:style/Theme.NoTitleBar"\r
+            android:windowSoftInputMode="stateAlwaysHidden" >\r
+        </activity>\r
+\r
+        <!-- Checkout Activities -->\r
+        <activity android:name="org.evergreen.android.accountAccess.checkout.ItemsCheckOutListView" >\r
+        </activity>\r
+\r
+        <!-- Holds Activities -->\r
+        <activity android:name="org.evergreen.android.accountAccess.holds.HoldsListView" >\r
+        </activity>\r
+        <activity android:name="org.evergreen.android.accountAccess.holds.PlaceHold" >\r
+        </activity>\r
+        <activity android:name="org.evergreen.android.accountAccess.holds.HoldDetails" >\r
+        </activity>\r
+\r
+        <!-- Fines Activities -->\r
+        <activity android:name="org.evergreen.android.accountAccess.fines.FinesActivity" >\r
+        </activity>\r
+\r
+        <!-- Bookbags -->\r
+        <activity android:name="org.evergreen.android.accountAccess.bookbags.BookbagsListView" >\r
+        </activity>\r
+        <activity android:name="org.evergreen.android.accountAccess.bookbags.BookBagDetails" >\r
+        </activity>\r
+        <activity\r
+            android:name="org.evergreen.android.views.StartupActivity"\r
+            android:label="@string/ou_app_label"\r
+            android:windowSoftInputMode="adjustResize|stateVisible" >\r
+            <intent-filter>\r
+                <action android:name="android.intent.action.MAIN" />\r
+\r
+                <category android:name="android.intent.category.LAUNCHER" />\r
+            </intent-filter>\r
+        </activity>\r
+        <activity\r
+            android:name="org.evergreen_ils.auth.AuthenticatorActivity"\r
+            android:label="@string/ou_account_label"\r
+            android:theme="@android:style/Theme.Light" >\r
+        </activity>\r
+\r
+        <service\r
+            android:name="org.evergreen_ils.auth.AuthenticatorService"\r
+            android:exported="false" >\r
+            <intent-filter>\r
+                <action android:name="android.accounts.AccountAuthenticator" />\r
+            </intent-filter>\r
+\r
+            <meta-data\r
+                android:name="android.accounts.AccountAuthenticator"\r
+                android:resource="@xml/authenticator" />\r
+        </service>\r
+\r
+        <activity\r
+            android:name="org.evergreen.android.JunkActivity"\r
+            android:label="@string/title_activity_junk" >\r
+        </activity>\r
+    </application>\r
+\r
+</manifest>\r
diff --git a/Open-ILS/src/Android/res/layout/activity_junk.xml b/Open-ILS/src/Android/res/layout/activity_junk.xml
new file mode 100644 (file)
index 0000000..77cf5e3
--- /dev/null
@@ -0,0 +1,20 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:paddingBottom="@dimen/activity_vertical_margin"
+    android:paddingLeft="@dimen/activity_horizontal_margin"
+    android:paddingRight="@dimen/activity_horizontal_margin"
+    android:paddingTop="@dimen/activity_vertical_margin"
+    tools:context=".JunkActivity" >
+
+    <TextView
+        android:id="@+id/textView1"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="20dp"
+        android:layout_marginTop="51dp"
+        android:text="Large Text"
+        android:textAppearance="?android:attr/textAppearanceLarge" />
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/Open-ILS/src/Android/res/menu/junk.xml b/Open-ILS/src/Android/res/menu/junk.xml
new file mode 100644 (file)
index 0000000..c002028
--- /dev/null
@@ -0,0 +1,9 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android" >
+
+    <item
+        android:id="@+id/action_settings"
+        android:orderInCategory="100"
+        android:showAsAction="never"
+        android:title="@string/action_settings"/>
+
+</menu>
index b4919ed..0dad7c1 100644 (file)
@@ -1,26 +1,28 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-    Copyright 2011 Wglxy.com
-
-    Licensed under the Apache License, Version 2.0 (the "License");
-    you may not use this file except in compliance with the License.
-    You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<resources>
-    <dimen name="title_height">45dip</dimen>
-    <dimen name="text_size_small">14sp</dimen>
-    <dimen name="text_size_medium">18sp</dimen>
-    <dimen name="text_size_large">22sp</dimen>
-
-    
-    <dimen name="library_logo_text_size">16sp</dimen>
-    <dimen name="search_details_rect_text_size">16dip</dimen>
-</resources>
+<?xml version="1.0" encoding="utf-8"?>\r
+<!--\r
+    Copyright 2011 Wglxy.com\r
+\r
+    Licensed under the Apache License, Version 2.0 (the "License");\r
+    you may not use this file except in compliance with the License.\r
+    You may obtain a copy of the License at\r
+\r
+         http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+    Unless required by applicable law or agreed to in writing, software\r
+    distributed under the License is distributed on an "AS IS" BASIS,\r
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+    See the License for the specific language governing permissions and\r
+    limitations under the License.\r\r
+-->\r
+<resources>\r
+\r
+    <dimen name="title_height">45dip</dimen>\r
+    <dimen name="text_size_small">14sp</dimen>\r
+    <dimen name="text_size_medium">18sp</dimen>\r
+    <dimen name="text_size_large">22sp</dimen>\r
+    <dimen name="library_logo_text_size">16sp</dimen>\r
+    <dimen name="search_details_rect_text_size">16dip</dimen>\r
+    <dimen name="activity_horizontal_margin">16dp</dimen>\r
+    <dimen name="activity_vertical_margin">16dp</dimen>\r
+\r
+</resources>\r
index f6faace..decc082 100644 (file)
@@ -6,12 +6,11 @@
     <string name="menu_preferences">settings</string>
     <string name="menu_library_hours">library hours</string>
     <string name="menu_barcode_scan">barcode scan</string>
-    
-    <!-- Header portion  -->
+
+    <!-- Header portion -->
     <string name="library_text_logo"> Evergreen </string>
     <string name="my_account_button_text">My Account</string>
     <string name="options_button_text">Options</string>
-    
     <string name="search_details_title">Search Details</string>
     <string name="checkout_items_title">Checked Out</string>
     <string name="hold_items_title">Holds</string>
     <string name="bookbag_details_title">Bookbag details</string>
     <string name="fines_title">Fines</string>
     <string name="copy_information_title">Copy Information</string>
-    
     <string name="button_place_hold">Place Hold</string>
     <string name="button_add_to_bookbag">Add to Bookbag</string>
-    
     <string name="bookbag_choose_text">Choose a bookbag from the list.</string>
-    
+
     <!-- first config activity -->
-    
+
     <string name="first_config_message">Please enter the Evergreen server url, username and password of your account.</string>
     <string name="server_name">Library Catalog URL:</string>
     <string name="username">Username:</string>
     <string name="action_sign_in">Sign in</string>
     <string name="login_progress_signing_in">Signing in&#8230;</string>
     <string name="action_forgot_password">Forgot password</string>
-    
     <string name="cancel_button">Cancel</string>
     <string name="connect_button">Connect</string>
-    
+
     <!-- Search -->
-    
+
     <string name="search_hint">What are you looking for?</string>
     <string name="advanced_search">Search</string>
-    
     <string name="loading_dialog_text"></string>
     <string name="dialog_please_wait">Please wait</string>
     <string name="dialog_fetching_data_message">Searching catalog</string>
     <string name="dialog_load_more_message">Fetching more results</string>
-    
     <string name="advanced_search_hint">Enter text here</string>
     <string name="advanced_search_add_filter_button">Add filter</string>
     <string name="advanced_search_filter_text">Added filters:</string>
-    
     <string name="menu_button_advanced_search">Advanced search</string>
     <string name="menu_button_library_hours">Library hours</string>
     <string name="menu_button_application_preferences">Preferences</string>
-    
     <string name="copy_information"> Availability of the book :</string>
     <string name="hello">Hello World, EvergreenAppActivity!</string>
     <string name="generic_app_name">Evergreen</string>
-
     <string name="title_activity_startup">Welcome to Evergreen</string>
     <string name="title_search">Search</string>
     <string name="title_my_account">My Account</string>
     <string name="search_result_text"> Search result :</string>
     <string name="renew_button">renew</string>
     <string name="record_of">Record %1$d of %2$d</string>
-    
+
     <!-- Search Details View -->
     <string name="show_more_text">Show More</string>
-    
+
     <!-- Place Hold Activity View -->
-    
+
     <string name="recipient">Recipient</string>
     <string name="title">Title</string>
     <string name="author">Author</string>
     <string name="hold_phone_hint">Contact phone number</string>
     <string name="hold_expire_time_hint">Hold expire time</string>
     <string name="hold_thaw_date_hint">Date when the hold is frozen</string>
-    
     <string name="hold_items">Items on hold: </string>
-    
+
     <!-- Checkout items -->
     <string name="checkout_item_txt">Total items out: </string>
     <string name="checkout_overdue_items">/ Overdue items: </string>
-    
+
     <!-- Fines Activity -->
     <string name="total_owned">Total Owned </string>
     <string name="total_paid">Total Paid</string>
     <string name="balance_owed">Balance Owed</string>
     <string name="overdue_materials">Overdue Materials</string>
-    
+
     <!-- Bookbag Activities -->
     <string name="delete_button">delete</string>
     <string name="bags_name">name</string>
     <string name="create">create</string>
     <string name="bookbag_name">Bookbag name: </string>
     <string name="add_button">add</string>
-    
-    
-     <!--  Camera -->
-     <string name="msg_camera_framework_bug">Sorry, the Android camera encountered a problem. You may need to restart the device.</string>
-     <string name="button_ok">OK</string>
-     
-     <!-- Preference Activity -->
-     <string name="preference_login_information">Login information</string>
-     <string name="preference_login_informantion_summary">Username and password information</string>
-     
-     <string name="preference_username">Username</string>
-     <string name="preference_username_summary">Please enter your login username</string>
-     
-     <string name="preference_password">Password</string>
-     <string name="preference_password_summary">Enter your account password</string>
-     
-     <string name="preference_server_information_title">Server settings</string>
-     <string name="preference_server_information_summary">Library server settings</string>
-     
-     <string name="preference_library_url_address">Library url address</string>
-     <string name="preference_library_url_address_summary">Please enter the library url in format http://</string>
-     
-     <string name="preference_notification_preference_screen_title">Notification settings</string>
-     <string name="preference_notification_preference_screen_summary">Configure notifications and reminders for checkout items</string>
-     
-     <string name="preference_enable_notifications">Enable notifications</string>
-     <string name="preference_enable_notifications_summary_on">Uncheck this option to remove notifications when checkout items are about to expire</string>
-     <string name="preference_enable_notifications_summary_off">Check this option to enable notifications each time a checkout item will expire</string>
-     
-     <string name="preference_notifications_days_before">Days before expiration</string>
-     <string name="preference_notifications_days_before_summary">Chose how many days before the actual expiration date to set the reminder</string>
-     
-     <string name="preference_notifications_each_day">Each day notifications</string>
-     <string name="preference_notifications_each_day_summary">Give a notification in every day before the actual start notification period and due date</string>
-     
-     <string name="preference_notifications_title">Notification settings</string>
-     
-     <plurals name="number_of_copies">
+
+    <!-- Camera -->
+    <string name="msg_camera_framework_bug">Sorry, the Android camera encountered a problem. You may need to restart the device.</string>
+    <string name="button_ok">OK</string>
+
+    <!-- Preference Activity -->
+    <string name="preference_login_information">Login information</string>
+    <string name="preference_login_informantion_summary">Username and password information</string>
+    <string name="preference_username">Username</string>
+    <string name="preference_username_summary">Please enter your login username</string>
+    <string name="preference_password">Password</string>
+    <string name="preference_password_summary">Enter your account password</string>
+    <string name="preference_server_information_title">Server settings</string>
+    <string name="preference_server_information_summary">Library server settings</string>
+    <string name="preference_library_url_address">Library url address</string>
+    <string name="preference_library_url_address_summary">Please enter the library url in format http://</string>
+    <string name="preference_notification_preference_screen_title">Notification settings</string>
+    <string name="preference_notification_preference_screen_summary">Configure notifications and reminders for checkout items</string>
+    <string name="preference_enable_notifications">Enable notifications</string>
+    <string name="preference_enable_notifications_summary_on">Uncheck this option to remove notifications when checkout items are about to expire</string>
+    <string name="preference_enable_notifications_summary_off">Check this option to enable notifications each time a checkout item will expire</string>
+    <string name="preference_notifications_days_before">Days before expiration</string>
+    <string name="preference_notifications_days_before_summary">Chose how many days before the actual expiration date to set the reminder</string>
+    <string name="preference_notifications_each_day">Each day notifications</string>
+    <string name="preference_notifications_each_day_summary">Give a notification in every day before the actual start notification period and due date</string>
+    <string name="preference_notifications_title">Notification settings</string>
+
+    <plurals name="number_of_copies">
         <item quantity="one">one copy</item>
         <item quantity="other">%d copies</item>
-     </plurals>
-     <plurals name="number_of_holds">
+    </plurals>
+    <plurals name="number_of_holds">
         <item quantity="one">One hold</item>
         <item quantity="other">%d holds</item>
-     </plurals>
-          <plurals name="number_of_items">
+    </plurals>
+    <plurals name="number_of_items">
         <item quantity="one">one item</item>
         <item quantity="other">%d items</item>
-     </plurals>
-     
+    </plurals>
+
+    <string name="title_activity_junk">JunkActivity</string>
+    <string name="action_settings">Settings</string>
+    <string name="hello_world">Hello world!</string>
+
 </resources>
diff --git a/Open-ILS/src/Android/src/org/evergreen/android/JunkActivity.java b/Open-ILS/src/Android/src/org/evergreen/android/JunkActivity.java
new file mode 100644 (file)
index 0000000..b45c2cb
--- /dev/null
@@ -0,0 +1,21 @@
+package org.evergreen.android;
+
+import org.evergreen.android.accountAccess.CurrentLogin;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.widget.TextView;
+
+public class JunkActivity extends Activity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        TextView tv = new TextView(this);
+        String account_name = CurrentLogin.getUsername();
+        String auth_token = CurrentLogin.getAuthToken();
+        tv.setText("account.name="+((account_name==null)?"null":account_name)
+                + "\nauth_token="+((auth_token==null)?"null":auth_token));
+        setContentView(tv);
+    }
+}
diff --git a/Open-ILS/src/Android/src/org/evergreen/android/accountAccess/CurrentLogin.java b/Open-ILS/src/Android/src/org/evergreen/android/accountAccess/CurrentLogin.java
new file mode 100644 (file)
index 0000000..37d65ec
--- /dev/null
@@ -0,0 +1,39 @@
+package org.evergreen.android.accountAccess;
+
+/**
+ * data representing the current logged-in user 
+ * @author kenstir
+ */
+public class CurrentLogin {
+    
+    protected static CurrentLogin mInstance = null;
+    
+    protected String mUsername = null;
+    protected String mAuthToken = null; 
+
+    protected CurrentLogin() {
+    }
+
+    protected static CurrentLogin getInstance() {
+        if (mInstance == null)
+            mInstance = new CurrentLogin();
+        return mInstance;
+    }
+    
+    public static void clear() {
+        mInstance = null;
+    }
+
+    public static void setAccountInfo(String username, String auth_token) {
+        getInstance().mUsername = username;
+        getInstance().mAuthToken = auth_token;
+    }
+
+    public static String getUsername() {
+        return getInstance().mUsername;
+    }
+
+    public static String getAuthToken() {
+        return getInstance().mAuthToken;
+    }
+}
diff --git a/Open-ILS/src/Android/src/org/evergreen/android/globals/AppPreferences.java b/Open-ILS/src/Android/src/org/evergreen/android/globals/AppPreferences.java
new file mode 100644 (file)
index 0000000..6d4a906
--- /dev/null
@@ -0,0 +1,31 @@
+package org.evergreen.android.globals;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
+
+public class AppPreferences {
+    public static final String KEY_PREFS_LAST_ACCOUNT_NAME = "account_name";
+    private static final String APP_SHARED_PREFS = AppPreferences.class.getSimpleName();
+    private SharedPreferences _sharedPrefs;
+    private Editor _prefsEditor;
+
+    public AppPreferences(Context context) {
+        this._sharedPrefs = context.getSharedPreferences(APP_SHARED_PREFS, Activity.MODE_PRIVATE);
+        this._prefsEditor = _sharedPrefs.edit();
+    }
+
+    public String getLastAccountName() {
+        return _sharedPrefs.getString(KEY_PREFS_LAST_ACCOUNT_NAME, "");
+    }
+
+    public void putLastAccountName(String text) {
+        _prefsEditor.putString(KEY_PREFS_LAST_ACCOUNT_NAME, text);
+        _prefsEditor.commit();
+    }
+    
+    public void clearLastAccountName() {
+        putLastAccountName(null);
+    }
+}
index e12d484..78a91bd 100644 (file)
@@ -1,13 +1,28 @@
 package org.evergreen.android.views;
 
 import org.evergreen.android.R;
+import org.evergreen.android.accountAccess.CurrentLogin;
+import org.evergreen.android.globals.AppPreferences;
 import org.evergreen.android.searchCatalog.SearchCatalogListView;
+import org.evergreen.android.JunkActivity;
+import org.evergreen_ils.auth.Const;
 
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.AccountManagerCallback;
+import android.accounts.AccountManagerFuture;
 import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
 import android.content.Intent;
 import android.os.AsyncTask;
+import android.os.Build;
 import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.ContextThemeWrapper;
 import android.widget.TextView;
+import android.widget.Toast;
 
 /**
  * Activity which displays a login screen to the user, offering registration as
@@ -15,21 +30,48 @@ import android.widget.TextView;
  */
 public class StartupActivity extends Activity {
 
+    private String TAG = StartupActivity.class.getSimpleName();
     private TextView mLoginStatusMessageView;
     private StartupTask mStartupTask = null;
     private String mAlertMessage = null;
+    private AppPreferences mAppPrefs;
+    private AccountManager mAccountManager;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_startup);
+        
+        mAppPrefs = new AppPreferences(this);
+        mAccountManager = AccountManager.get(this);
+        
         mLoginStatusMessageView = (TextView) findViewById(R.id.login_status_message);
         
-        //TODO
-        /*
-        last_username = getPref();
-        if (last_username) getAuthToken()
-         */
+        signIn();
+    }
+    
+    public void signIn() {
+        final String auth_token = CurrentLogin.getAuthToken();
+        if (TextUtils.isEmpty(auth_token)) {
+            getTokenForLastActiveAccount();
+        } else {
+            Log.d(TAG, "signIn> already have auth_token");
+            initializeAccountInfo();
+        }
+    }
+
+    private void getTokenForLastActiveAccount() {
+        final String username = mAppPrefs.getLastAccountName();
+        Log.d(TAG, "getToken> username="+username);
+        
+        // first try to get an auth token for the last account used
+        if (!TextUtils.isEmpty(username)) {
+            if (reuseExistingAccountAuthToken(username)) {
+                Log.d(TAG, "getToken> reuseExisting returned true");
+            }
+        } else {
+            getTokenForAccountCreateIfNeeded();
+        }
     }
 
     @Override
@@ -46,8 +88,191 @@ public class StartupActivity extends Activity {
     }
     */
 
+    /**
+     * Add new account to the account manager
+     */
+    private void addNewAccount() {
+        //final AccountManagerFuture<Bundle> future = 
+        mAccountManager.addAccount(Const.ACCOUNT_TYPE, Const.AUTHTOKEN_TYPE, null, null, this, new AccountManagerCallback<Bundle>() {
+            @Override
+            public void run(AccountManagerFuture<Bundle> future) {
+                try {
+                    Bundle bnd = future.getResult();
+                    final String account_name = bnd.getString(AccountManager.KEY_ACCOUNT_NAME);
+                    showMessage("Account "+account_name+" was created");
+                    mAppPrefs.putLastAccountName(account_name);
+                    Log.d(TAG, "addNewAccount bnd=" + bnd);
+                } catch (Exception e) {
+                    mAppPrefs.clearLastAccountName();
+                    e.printStackTrace();
+                    showMessage(e.getMessage());
+                }
+            }
+        }, null);
+    }
+
+    /**
+     * Show all the accounts registered on the account manager. Request an auth token upon user select.
+     * @param authTokenType
+     */
+    private void showAccountPicker() {
+        final Account availableAccounts[] = mAccountManager.getAccountsByType(Const.ACCOUNT_TYPE);
+
+        if (availableAccounts.length == 0) {
+            Toast.makeText(this, "No accounts", Toast.LENGTH_SHORT).show();
+            addNewAccount();
+        } else {
+            String name[] = new String[availableAccounts.length];
+            for (int i = 0; i < availableAccounts.length; i++) {
+                name[i] = availableAccounts[i].name;
+            }
+
+            // Account picker
+            AlertDialog.Builder builder;
+            if (Build.VERSION.SDK_INT >= 1/*Build.VERSION_CODES.HONEYCOMB*/) {
+                builder = new AlertDialog.Builder(this);
+            } else {
+                ContextThemeWrapper wrapper = new ContextThemeWrapper(this, R.style.EvergreenTheme);
+                builder = new AlertDialog.Builder(wrapper);
+            }
+            AlertDialog aDialog = builder.setTitle("Pick Account").setItems(name, new DialogInterface.OnClickListener() {
+                @Override
+                public void onClick(DialogInterface dialog, int which) {
+                    getExistingAccountAuthToken(availableAccounts[which]);
+                }
+            }).create();
+            aDialog.show();
+        }
+    }
+
+    private void getExistingAccountAuthToken(final Account account) {
+        final AccountManagerFuture<Bundle> future = mAccountManager.getAuthToken(account, Const.AUTHTOKEN_TYPE, null, this, 
+                new AccountManagerCallback<Bundle>() {
+            @Override
+            public void run(AccountManagerFuture<Bundle> future) {
+                Log.d(TAG, "getExistingAccountAuthToken> callback run> got future "+future);
+            }
+        }, null);
+
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    Bundle bnd = future.getResult();
+                    Log.d(TAG, "getExistingAccountAuthToken> thread run> got future "+future);
+                    final String authtoken = bnd.getString(AccountManager.KEY_AUTHTOKEN);
+                    final String account_name = bnd.getString(AccountManager.KEY_ACCOUNT_NAME);
+                    onSuccessfulLogin(account_name, authtoken);
+                } catch (Exception e) {
+                    Log.d(TAG, "getExistingAccountAuthToken caught "+e.getMessage());
+                    onFailedLogin(e.getMessage());
+                }
+            }
+        }).start();
+    }
+
+    protected void onSuccessfulLogin(String account_name, String auth_token) {
+        Log.d(TAG,"onSuccessfulLogin> account_name "+account_name+" token "+auth_token);
+        showMessage((auth_token != null) ? "SUCCESS with "+account_name+"\ntoken: " + auth_token : "FAIL");
+        if (auth_token != null) {
+            mAppPrefs.putLastAccountName(account_name);
+            CurrentLogin.setAccountInfo(account_name, auth_token);
+            startNextActivity();
+        }
+    }
+    
+    protected void onFailedLogin(String msg) {
+        mAppPrefs.clearLastAccountName();
+        CurrentLogin.clear();
+        showMessage(msg);
+    }
+
+    private boolean reuseExistingAccountAuthToken(final String account_name) {
+        final Account availableAccounts[] = mAccountManager.getAccountsByType(Const.ACCOUNT_TYPE);
+        for (int i = 0; i < availableAccounts.length; i++) {
+            Log.d(TAG, "reuseExistingAccountAuthToken> looking for "+account_name+", found "+availableAccounts[i].name);
+            if (account_name.equals(availableAccounts[i].name)) {
+                Log.d(TAG, "reuseExistingAccountAuthToken> found it");
+                getExistingAccountAuthToken(availableAccounts[i]);
+                return true;
+            }
+        }
+        return false;
+    }
+    
+    /**
+     * Invalidates the auth token for the account
+     * @param account
+     * @param authTokenType
+     */
+    private void invalidateAuthToken(final Account account) {
+        final AccountManagerFuture<Bundle> future = mAccountManager.getAuthToken(account, Const.AUTHTOKEN_TYPE, null, this, null,null);
+
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    Bundle bnd = future.getResult();
+
+                    final String authtoken = bnd.getString(AccountManager.KEY_AUTHTOKEN);
+                    mAccountManager.invalidateAuthToken(account.type, authtoken);
+                    showMessage(account.name + " invalidated");
+                    mAppPrefs.putLastAccountName(null);
+                } catch (Exception e) {
+                    mAppPrefs.putLastAccountName(null);
+                    e.printStackTrace();
+                    showMessage(e.getMessage());
+                }
+            }
+        }).start();
+    }
+
+    /**
+     * Get an auth token for the account.
+     * If not exist - add it and then return its auth token.
+     * If one exist - return its auth token.
+     * If more than one exists - show a picker and return the select account's auth token.
+     * @param accountType
+     * @param authTokenType
+     */
+    private void getTokenForAccountCreateIfNeeded() {
+        Log.d(TAG, "getTokenForAccountCreateIfNeeded> ");
+        final AccountManagerFuture<Bundle> future = mAccountManager.getAuthTokenByFeatures(Const.ACCOUNT_TYPE, Const.AUTHTOKEN_TYPE, null, this, null, null,
+                new AccountManagerCallback<Bundle>() {
+                    @Override
+                    public void run(AccountManagerFuture<Bundle> future) {
+                        Bundle bnd = null;
+                        try {
+                            bnd = future.getResult();
+                            Log.d(TAG, "getTokenForAccountCreateIfNeeded> bnd="+bnd);
+                            final String authtoken = bnd.getString(AccountManager.KEY_AUTHTOKEN);
+                            final String account_name = bnd.getString(AccountManager.KEY_ACCOUNT_NAME);
+                            onSuccessfulLogin(account_name, authtoken);
+                        } catch (Exception e) {
+                            Log.d(TAG, "getTokenForAccountCreateIfNeeded> caught "+e.getMessage());
+                            onFailedLogin(e.getMessage());
+                        }
+                    }
+                }
+        , null);
+    }
+
+    private void showMessage(final String msg) {
+        if (TextUtils.isEmpty(msg))
+            return;
+
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                Log.d(TAG, "showMessage> "+msg);
+                Toast.makeText(getBaseContext(), msg, Toast.LENGTH_SHORT).show();
+            }
+        });
+    }
+
     private void startNextActivity() {
-        Intent intent = new Intent(this, SearchCatalogListView.class);
+        //Intent intent = new Intent(this, SearchCatalogListView.class);
+        Intent intent = new Intent(this, JunkActivity.class);
         startActivity(intent);
         finish();
     }
@@ -61,7 +286,7 @@ public class StartupActivity extends Activity {
         // mDownloadTask = new LoginTask();
     }
 
-    public class StartupTask extends AsyncTask<Void, Void, Boolean> {
+    private class StartupTask extends AsyncTask<Void, Void, Boolean> {
         @Override
         protected Boolean doInBackground(Void... params) {
             try {