From b19e62add0a747127952862bb7bea0b73379edcc Mon Sep 17 00:00:00 2001 From: Fred Quintana Date: Thu, 16 Dec 2010 13:54:43 -0800 Subject: [PATCH] fix the TooManyDeletes to show up again It was moved so it was no longer in the location that SyncManager expected. I fixed it by (a) moving it to the SyncManager directory and by (b) changing the SyncManager to refer to it by class rather than by class name, which means it will now check for it at compile time, not run time. Bug: 3289922 Change-Id: I24f8bac371a16c62c2a38ed1024702c6d0913b93 --- .../content/SyncActivityTooManyDeletes.java | 133 ++++++++++++++++++ core/java/android/content/SyncManager.java | 4 +- core/res/AndroidManifest.xml | 5 + core/res/res/values/strings.xml | 31 ++-- 4 files changed, 160 insertions(+), 13 deletions(-) create mode 100644 core/java/android/content/SyncActivityTooManyDeletes.java diff --git a/core/java/android/content/SyncActivityTooManyDeletes.java b/core/java/android/content/SyncActivityTooManyDeletes.java new file mode 100644 index 0000000000000..350f35ee620a5 --- /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(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 599429b11a58e..8b292c90c9eec 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 92b50c7689092..981661abe7783 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1335,6 +1335,11 @@ android:exported="true"> + + + diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index e48321cb65468..92f3593109c10 100755 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -298,12 +298,12 @@ Would you like to shut down? Recent No recent applications. @@ -1363,17 +1363,17 @@ Set password rules - Control the length and the characters + Control the length and the characters allowed in screen-unlock passwords Monitor screen-unlock attempts - Monitor the number of incorrect passwords - entered when unlocking the screen, and lock the tablet or erase all the tablet\'s + 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 - Monitor the number of incorrect passwords - entered when unlocking the screen, and lock the phone or erase all the phone\'s + 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 Change the screen-unlock password @@ -1386,10 +1386,10 @@ Erase all data - Erase the tablet\'s data without warning, + Erase the tablet\'s data without warning, by performing a factory data reset - Erase the phone\'s data without warning, + Erase the phone\'s data without warning, by performing a factory data reset Set the device global proxy @@ -1602,7 +1602,7 @@ Sister Spouse - + Custom @@ -2640,4 +2640,15 @@ No + + + Delete limit exceeded + + There are %1$d deleted items for %2$s, account %3$s. What would you like to do? + + Delete the items. + + Undo the deletes. + + Do nothing for now.