@ -39,7 +39,9 @@ import java.util.Set;
import java.util.logging.Level ;
import at.bitfire.davdroid.model.ServiceDB ;
import at.bitfire.davdroid.model.ServiceDB.* ;
import at.bitfire.davdroid.model.ServiceDB.Collections ;
import at.bitfire.davdroid.model.ServiceDB.HomeSets ;
import at.bitfire.davdroid.model.ServiceDB.Services ;
import at.bitfire.davdroid.resource.LocalAddressBook ;
import at.bitfire.davdroid.resource.LocalCalendar ;
import at.bitfire.davdroid.resource.LocalTaskList ;
@ -50,12 +52,12 @@ import lombok.Cleanup;
import okhttp3.HttpUrl ;
public class AccountSettings {
private final static int CURRENT_VERSION = 3 ;
private final static String
KEY_SETTINGS_VERSION = "version" ,
private final static int CURRENT_VERSION = 3 ;
private final static String
KEY_SETTINGS_VERSION = "version" ,
KEY_USERNAME = "user_name" ,
KEY_AUTH_PREEMPTIVE = "auth_preemptive" ;
KEY_AUTH_PREEMPTIVE = "auth_preemptive" ;
/ * * Time range limitation to the past [ in days ]
value = null default value ( DEFAULT_TIME_RANGE_PAST_DAYS )
@ -65,28 +67,32 @@ public class AccountSettings {
private final static String KEY_TIME_RANGE_PAST_DAYS = "time_range_past_days" ;
private final static int DEFAULT_TIME_RANGE_PAST_DAYS = 90 ;
public final static long SYNC_INTERVAL_MANUALLY = - 1 ;
final Context context ;
final AccountManager accountManager ;
final Account account ;
public AccountSettings ( @NonNull Context context , @NonNull Account account ) {
this . context = context ;
this . account = account ;
accountManager = AccountManager . get ( context ) ;
synchronized ( AccountSettings . class ) {
int version = 0 ;
try {
version = Integer . parseInt ( accountManager . getUserData ( account , KEY_SETTINGS_VERSION ) ) ;
} catch ( NumberFormatException ignored ) {
}
public final static long SYNC_INTERVAL_MANUALLY = - 1 ;
final Context context ;
final AccountManager accountManager ;
final Account account ;
public AccountSettings ( @NonNull Context context , @NonNull Account account ) throws InvalidAccountException {
this . context = context ;
this . account = account ;
accountManager = AccountManager . get ( context ) ;
synchronized ( AccountSettings . class ) {
String versionStr = accountManager . getUserData ( account , KEY_SETTINGS_VERSION ) ;
if ( versionStr = = null )
throw new InvalidAccountException ( account ) ;
int version = 0 ;
try {
version = Integer . parseInt ( versionStr ) ;
} catch ( NumberFormatException ignored ) {
}
App . log . info ( "Account " + account . name + " has version " + version + ", current version: " + CURRENT_VERSION ) ;
if ( version < CURRENT_VERSION ) {
if ( version < CURRENT_VERSION ) {
Notification notify = new NotificationCompat . Builder ( context )
. setSmallIcon ( R . drawable . ic_new_releases_light )
. setLargeIcon ( ( ( BitmapDrawable ) context . getResources ( ) . getDrawable ( R . drawable . ic_launcher ) ) . getBitmap ( ) )
@ -104,54 +110,54 @@ public class AccountSettings {
update ( version ) ;
}
}
}
public static Bundle initialUserData ( String userName , boolean preemptive ) {
Bundle bundle = new Bundle ( ) ;
bundle . putString ( KEY_SETTINGS_VERSION , String . valueOf ( CURRENT_VERSION ) ) ;
bundle . putString ( KEY_USERNAME , userName ) ;
bundle . putString ( KEY_AUTH_PREEMPTIVE , Boolean . toString ( preemptive ) ) ;
return bundle ;
}
// authentication settings
public String username ( ) { return accountManager . getUserData ( account , KEY_USERNAME ) ; }
public void username ( @NonNull String userName ) { accountManager . setUserData ( account , KEY_USERNAME , userName ) ; }
public String password ( ) { return accountManager . getPassword ( account ) ; }
public void password ( @NonNull String password ) { accountManager . setPassword ( account , password ) ; }
public boolean preemptiveAuth ( ) { return Boolean . parseBoolean ( accountManager . getUserData ( account , KEY_AUTH_PREEMPTIVE ) ) ; }
public void preemptiveAuth ( boolean preemptive ) { accountManager . setUserData ( account , KEY_AUTH_PREEMPTIVE , Boolean . toString ( preemptive ) ) ; }
// sync. settings
public Long getSyncInterval ( @NonNull String authority ) {
if ( ContentResolver . getIsSyncable ( account , authority ) < = 0 )
return null ;
if ( ContentResolver . getSyncAutomatically ( account , authority ) ) {
List < PeriodicSync > syncs = ContentResolver . getPeriodicSyncs ( account , authority ) ;
if ( syncs . isEmpty ( ) )
return SYNC_INTERVAL_MANUALLY ;
else
return syncs . get ( 0 ) . period ;
} else
return SYNC_INTERVAL_MANUALLY ;
}
public void setSyncInterval ( @NonNull String authority , long seconds ) {
if ( seconds = = SYNC_INTERVAL_MANUALLY ) {
ContentResolver . setSyncAutomatically ( account , authority , false ) ;
} else {
ContentResolver . setSyncAutomatically ( account , authority , true ) ;
ContentResolver . addPeriodicSync ( account , authority , new Bundle ( ) , seconds ) ;
}
}
}
}
public static Bundle initialUserData ( String userName , boolean preemptive ) {
Bundle bundle = new Bundle ( ) ;
bundle . putString ( KEY_SETTINGS_VERSION , String . valueOf ( CURRENT_VERSION ) ) ;
bundle . putString ( KEY_USERNAME , userName ) ;
bundle . putString ( KEY_AUTH_PREEMPTIVE , Boolean . toString ( preemptive ) ) ;
return bundle ;
}
// authentication settings
public String username ( ) { return accountManager . getUserData ( account , KEY_USERNAME ) ; }
public void username ( @NonNull String userName ) { accountManager . setUserData ( account , KEY_USERNAME , userName ) ; }
public String password ( ) { return accountManager . getPassword ( account ) ; }
public void password ( @NonNull String password ) { accountManager . setPassword ( account , password ) ; }
public boolean preemptiveAuth ( ) { return Boolean . parseBoolean ( accountManager . getUserData ( account , KEY_AUTH_PREEMPTIVE ) ) ; }
public void preemptiveAuth ( boolean preemptive ) { accountManager . setUserData ( account , KEY_AUTH_PREEMPTIVE , Boolean . toString ( preemptive ) ) ; }
// sync. settings
public Long getSyncInterval ( @NonNull String authority ) {
if ( ContentResolver . getIsSyncable ( account , authority ) < = 0 )
return null ;
if ( ContentResolver . getSyncAutomatically ( account , authority ) ) {
List < PeriodicSync > syncs = ContentResolver . getPeriodicSyncs ( account , authority ) ;
if ( syncs . isEmpty ( ) )
return SYNC_INTERVAL_MANUALLY ;
else
return syncs . get ( 0 ) . period ;
} else
return SYNC_INTERVAL_MANUALLY ;
}
public void setSyncInterval ( @NonNull String authority , long seconds ) {
if ( seconds = = SYNC_INTERVAL_MANUALLY ) {
ContentResolver . setSyncAutomatically ( account , authority , false ) ;
} else {
ContentResolver . setSyncAutomatically ( account , authority , true ) ;
ContentResolver . addPeriodicSync ( account , authority , new Bundle ( ) , seconds ) ;
}
}
public Integer getTimeRangePastDays ( ) {
String strDays = accountManager . getUserData ( account , KEY_TIME_RANGE_PAST_DAYS ) ;
@ -166,11 +172,11 @@ public class AccountSettings {
accountManager . setUserData ( account , KEY_TIME_RANGE_PAST_DAYS , String . valueOf ( days = = null ? - 1 : days ) ) ;
}
// update from previous account settings
private void update ( int fromVersion ) {
for ( int toVersion = fromVersion + 1 ; toVersion < = CURRENT_VERSION ; toVersion + + ) {
// update from previous account settings
private void update ( int fromVersion ) {
for ( int toVersion = fromVersion + 1 ; toVersion < = CURRENT_VERSION ; toVersion + + ) {
App . log . info ( "Updating account " + account . name + " from version " + fromVersion + " to " + toVersion ) ;
try {
Method updateProc = getClass ( ) . getDeclaredMethod ( "update_" + fromVersion + "_" + toVersion ) ;
@ -180,51 +186,7 @@ public class AccountSettings {
}
fromVersion = toVersion ;
}
}
@SuppressWarnings ( { "Recycle" , "unused" } )
private void update_0_1 ( ) throws URISyntaxException {
String v0_principalURL = accountManager . getUserData ( account , "principal_url" ) ,
v0_addressBookPath = accountManager . getUserData ( account , "addressbook_path" ) ;
App . log . fine ( "Old principal URL = " + v0_principalURL ) ;
App . log . fine ( "Old address book path = " + v0_addressBookPath ) ;
URI principalURI = new URI ( v0_principalURL ) ;
// update address book
if ( v0_addressBookPath ! = null ) {
String addressBookURL = principalURI . resolve ( v0_addressBookPath ) . toASCIIString ( ) ;
App . log . fine ( "New address book URL = " + addressBookURL ) ;
accountManager . setUserData ( account , "addressbook_url" , addressBookURL ) ;
}
// update calendars
ContentResolver resolver = context . getContentResolver ( ) ;
Uri calendars = Calendars . CONTENT_URI . buildUpon ( )
. appendQueryParameter ( Calendars . ACCOUNT_NAME , account . name )
. appendQueryParameter ( Calendars . ACCOUNT_TYPE , account . type )
. appendQueryParameter ( CalendarContract . CALLER_IS_SYNCADAPTER , "true" ) . build ( ) ;
@Cleanup Cursor cursor = resolver . query ( calendars , new String [ ] { Calendars . _ID , Calendars . NAME } , null , null , null ) ;
while ( cursor ! = null & & cursor . moveToNext ( ) ) {
int id = cursor . getInt ( 0 ) ;
String v0_path = cursor . getString ( 1 ) ,
v1_url = principalURI . resolve ( v0_path ) . toASCIIString ( ) ;
App . log . fine ( "Updating calendar #" + id + " name: " + v0_path + " -> " + v1_url ) ;
Uri calendar = ContentUris . appendId ( Calendars . CONTENT_URI . buildUpon ( )
. appendQueryParameter ( Calendars . ACCOUNT_NAME , account . name )
. appendQueryParameter ( Calendars . ACCOUNT_TYPE , account . type )
. appendQueryParameter ( CalendarContract . CALLER_IS_SYNCADAPTER , "true" ) , id ) . build ( ) ;
ContentValues newValues = new ContentValues ( 1 ) ;
newValues . put ( Calendars . NAME , v1_url ) ;
if ( resolver . update ( calendar , newValues , null , null ) ! = 1 )
App . log . fine ( "Number of modified calendars != 1" ) ;
}
accountManager . setUserData ( account , "principal_url" , null ) ;
accountManager . setUserData ( account , "addressbook_path" , null ) ;
accountManager . setUserData ( account , KEY_SETTINGS_VERSION , "1" ) ;
}
}
@SuppressWarnings ( { "Recycle" , "unused" } )
private void update_1_2 ( ) throws ContactsStorageException {