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.