diff options
-rw-r--r-- | core/java/android/content/SyncActivityTooManyDeletes.java | 133 | ||||
-rw-r--r-- | core/java/android/content/SyncManager.java | 4 | ||||
-rw-r--r-- | core/res/AndroidManifest.xml | 5 | ||||
-rwxr-xr-x | core/res/res/values/strings.xml | 31 |
4 files changed, 160 insertions, 13 deletions
diff --git a/core/java/android/content/SyncActivityTooManyDeletes.java b/core/java/android/content/SyncActivityTooManyDeletes.java new file mode 100644 index 0000000..350f35e --- /dev/null +++ b/core/java/android/content/SyncActivityTooManyDeletes.java @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2007 The Android Open Source Project + * + * 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. + */ + +package android.content; + +import com.android.internal.R; +import android.accounts.Account; +import android.app.Activity; +import android.os.Bundle; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.LinearLayout; +import android.widget.ListAdapter; +import android.widget.ListView; +import android.widget.TextView; + +/** + * Presents multiple options for handling the case where a sync was aborted because there + * were too many pending deletes. One option is to force the delete, another is to rollback + * the deletes, the third is to do nothing. + * @hide + */ +public class SyncActivityTooManyDeletes extends Activity + implements AdapterView.OnItemClickListener { + + private long mNumDeletes; + private Account mAccount; + private String mAuthority; + private String mProvider; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Bundle extras = getIntent().getExtras(); + if (extras == null) { + finish(); + return; + } + + mNumDeletes = extras.getLong("numDeletes"); + mAccount = (Account) extras.getParcelable("account"); + mAuthority = extras.getString("authority"); + mProvider = extras.getString("provider"); + + // the order of these must match up with the constants for position used in onItemClick + CharSequence[] options = new CharSequence[]{ + getResources().getText(R.string.sync_really_delete), + getResources().getText(R.string.sync_undo_deletes), + getResources().getText(R.string.sync_do_nothing) + }; + + ListAdapter adapter = new ArrayAdapter<CharSequence>(this, + android.R.layout.simple_list_item_1, + android.R.id.text1, + options); + + ListView listView = new ListView(this); + listView.setAdapter(adapter); + listView.setItemsCanFocus(true); + listView.setOnItemClickListener(this); + + TextView textView = new TextView(this); + CharSequence tooManyDeletesDescFormat = + getResources().getText(R.string.sync_too_many_deletes_desc); + textView.setText(String.format(tooManyDeletesDescFormat.toString(), + mNumDeletes, mProvider, mAccount.name)); + + final LinearLayout ll = new LinearLayout(this); + ll.setOrientation(LinearLayout.VERTICAL); + final LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 0); + ll.addView(textView, lp); + ll.addView(listView, lp); + + // TODO: consider displaying the icon of the account type +// AuthenticatorDescription[] descs = AccountManager.get(this).getAuthenticatorTypes(); +// for (AuthenticatorDescription desc : descs) { +// if (desc.type.equals(mAccount.type)) { +// try { +// final Context authContext = createPackageContext(desc.packageName, 0); +// ImageView imageView = new ImageView(this); +// imageView.setImageDrawable(authContext.getResources().getDrawable(desc.iconId)); +// ll.addView(imageView, lp); +// } catch (PackageManager.NameNotFoundException e) { +// } +// break; +// } +// } + + setContentView(ll); + } + + public void onItemClick(AdapterView<?> parent, View view, int position, long id) { + // the constants for position correspond to the items options array in onCreate() + if (position == 0) startSyncReallyDelete(); + else if (position == 1) startSyncUndoDeletes(); + finish(); + } + + private void startSyncReallyDelete() { + Bundle extras = new Bundle(); + extras.putBoolean(ContentResolver.SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS, true); + extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); + extras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true); + extras.putBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD, true); + ContentResolver.requestSync(mAccount, mAuthority, extras); + } + + private void startSyncUndoDeletes() { + Bundle extras = new Bundle(); + extras.putBoolean(ContentResolver.SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS, true); + extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); + extras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true); + extras.putBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD, true); + ContentResolver.requestSync(mAccount, mAuthority, extras); + } +} diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java index 599429b..8b292c9 100644 --- a/core/java/android/content/SyncManager.java +++ b/core/java/android/content/SyncManager.java @@ -2157,9 +2157,7 @@ public class SyncManager implements OnAccountsUpdateListener { } CharSequence authorityName = providerInfo.loadLabel(mContext.getPackageManager()); - Intent clickIntent = new Intent(); - clickIntent.setClassName("com.android.providers.subscribedfeeds", - "com.android.settings.SyncActivityTooManyDeletes"); + Intent clickIntent = new Intent(mContext, SyncActivityTooManyDeletes.class); clickIntent.putExtra("account", account); clickIntent.putExtra("authority", authority); clickIntent.putExtra("provider", authorityName.toString()); diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 92b50c7..981661a 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1335,6 +1335,11 @@ android:exported="true"> </activity> + <activity android:name="android.content.SyncActivityTooManyDeletes" + android:theme="@android:style/Theme.Holo.Dialog" + android:label="@string/sync_too_many_deletes"> + </activity> + <activity android:name="com.android.server.ShutdownActivity" android:permission="android.permission.SHUTDOWN" android:excludeFromRecents="true"> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index e48321c..92f3593 100755 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -298,12 +298,12 @@ <string name="shutdown_confirm_question">Would you like to shut down?</string> <!-- Recent Tasks dialog: title - TODO: this should move to SystemUI.apk, but the code for the old + TODO: this should move to SystemUI.apk, but the code for the old recent dialog is still in the framework --> <string name="recent_tasks_title">Recent</string> <!-- Recent Tasks dialog: message when there are no recent applications - TODO: this should move to SystemUI.apk, but the code for the old + TODO: this should move to SystemUI.apk, but the code for the old recent dialog is still in the framework --> <string name="no_recent_tasks">No recent applications.</string> @@ -1363,17 +1363,17 @@ <!-- Title of policy access to limiting the user's password choices --> <string name="policylab_limitPassword">Set password rules</string> <!-- Description of policy access to limiting the user's password choices --> - <string name="policydesc_limitPassword">Control the length and the characters + <string name="policydesc_limitPassword">Control the length and the characters allowed in screen-unlock passwords</string> <!-- Title of policy access to watch user login attempts --> <string name="policylab_watchLogin">Monitor screen-unlock attempts</string> <!-- Description of policy access to watch user login attempts --> - <string name="policydesc_watchLogin" product="tablet">Monitor the number of incorrect passwords - entered when unlocking the screen, and lock the tablet or erase all the tablet\'s + <string name="policydesc_watchLogin" product="tablet">Monitor the number of incorrect passwords + entered when unlocking the screen, and lock the tablet or erase all the tablet\'s data if too many incorrect passwords are entered</string> <!-- Description of policy access to watch user login attempts --> - <string name="policydesc_watchLogin" product="default">Monitor the number of incorrect passwords - entered when unlocking the screen, and lock the phone or erase all the phone\'s + <string name="policydesc_watchLogin" product="default">Monitor the number of incorrect passwords + entered when unlocking the screen, and lock the phone or erase all the phone\'s data if too many incorrect passwords are entered</string> <!-- Title of policy access to reset user's password --> <string name="policylab_resetPassword">Change the screen-unlock password</string> @@ -1386,10 +1386,10 @@ <!-- Title of policy access to wipe the user's data --> <string name="policylab_wipeData">Erase all data</string> <!-- Description of policy access to wipe the user's data --> - <string name="policydesc_wipeData" product="tablet">Erase the tablet\'s data without warning, + <string name="policydesc_wipeData" product="tablet">Erase the tablet\'s data without warning, by performing a factory data reset</string> <!-- Description of policy access to wipe the user's data --> - <string name="policydesc_wipeData" product="default">Erase the phone\'s data without warning, + <string name="policydesc_wipeData" product="default">Erase the phone\'s data without warning, by performing a factory data reset</string> <string name="policylab_setGlobalProxy">Set the device global proxy</string> <!-- Description of policy access to wipe the user's data --> @@ -1602,7 +1602,7 @@ <string name="relationTypeSister">Sister</string> <!-- Spouse relationship type [CHAR LIMIT=20] --> <string name="relationTypeSpouse">Spouse</string> - + <!-- Custom SIP address type --> <string name="sipAddressTypeCustom">Custom</string> <!-- Home SIP address type --> @@ -2640,4 +2640,15 @@ <!-- Network positioning verification No. Button to push to deny sharing of location information. --> <string name="gpsVerifNo">No</string> + + <!-- Error message when the sync tried to delete too many things --> + <string name="sync_too_many_deletes">Delete limit exceeded</string> + <!-- Dialog message for when there are too many deletes that would take place and we want user confirmation --> + <string name="sync_too_many_deletes_desc">There are <xliff:g id="number_of_deleted_items">%1$d</xliff:g> deleted items for <xliff:g id="type_of_sync">%2$s</xliff:g>, account <xliff:g id="account_name">%3$s</xliff:g>. What would you like to do?</string> + <!-- Dialog action for when there are too many deletes that would take place and we want user confirmation, and the user wants to delete the items --> + <string name="sync_really_delete">Delete the items.</string> + <!-- Dialog action for when there are too many deletes that would take place and we want user confirmation, and the user wants to undo the deletions --> + <string name="sync_undo_deletes">Undo the deletes.</string> + <!-- Dialog action for when there are too many deletes that would take place and we want user confirmation, and the user wants to do nothing for now --> + <string name="sync_do_nothing">Do nothing for now.</string> </resources> |