-<?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
--- /dev/null
+<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
--- /dev/null
+<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>
-<?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
<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…</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>
--- /dev/null
+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);
+ }
+}
--- /dev/null
+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;
+ }
+}
--- /dev/null
+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);
+ }
+}
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
*/
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
}
*/
+ /**
+ * 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();
}
// 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 {