1b19e62add0a747127952862bb7bea0b73379edccFred Quintana/* 2b19e62add0a747127952862bb7bea0b73379edccFred Quintana * Copyright (C) 2007 The Android Open Source Project 3b19e62add0a747127952862bb7bea0b73379edccFred Quintana * 4b19e62add0a747127952862bb7bea0b73379edccFred Quintana * Licensed under the Apache License, Version 2.0 (the "License"); 5b19e62add0a747127952862bb7bea0b73379edccFred Quintana * you may not use this file except in compliance with the License. 6b19e62add0a747127952862bb7bea0b73379edccFred Quintana * You may obtain a copy of the License at 7b19e62add0a747127952862bb7bea0b73379edccFred Quintana * 8b19e62add0a747127952862bb7bea0b73379edccFred Quintana * http://www.apache.org/licenses/LICENSE-2.0 9b19e62add0a747127952862bb7bea0b73379edccFred Quintana * 10b19e62add0a747127952862bb7bea0b73379edccFred Quintana * Unless required by applicable law or agreed to in writing, software 11b19e62add0a747127952862bb7bea0b73379edccFred Quintana * distributed under the License is distributed on an "AS IS" BASIS, 12b19e62add0a747127952862bb7bea0b73379edccFred Quintana * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b19e62add0a747127952862bb7bea0b73379edccFred Quintana * See the License for the specific language governing permissions and 14b19e62add0a747127952862bb7bea0b73379edccFred Quintana * limitations under the License. 15b19e62add0a747127952862bb7bea0b73379edccFred Quintana */ 16b19e62add0a747127952862bb7bea0b73379edccFred Quintana 17b19e62add0a747127952862bb7bea0b73379edccFred Quintanapackage android.content; 18b19e62add0a747127952862bb7bea0b73379edccFred Quintana 19b19e62add0a747127952862bb7bea0b73379edccFred Quintanaimport com.android.internal.R; 20b19e62add0a747127952862bb7bea0b73379edccFred Quintanaimport android.accounts.Account; 21b19e62add0a747127952862bb7bea0b73379edccFred Quintanaimport android.app.Activity; 22b19e62add0a747127952862bb7bea0b73379edccFred Quintanaimport android.os.Bundle; 23b19e62add0a747127952862bb7bea0b73379edccFred Quintanaimport android.view.View; 24b19e62add0a747127952862bb7bea0b73379edccFred Quintanaimport android.view.ViewGroup; 25b19e62add0a747127952862bb7bea0b73379edccFred Quintanaimport android.widget.AdapterView; 26b19e62add0a747127952862bb7bea0b73379edccFred Quintanaimport android.widget.ArrayAdapter; 27b19e62add0a747127952862bb7bea0b73379edccFred Quintanaimport android.widget.LinearLayout; 28b19e62add0a747127952862bb7bea0b73379edccFred Quintanaimport android.widget.ListAdapter; 29b19e62add0a747127952862bb7bea0b73379edccFred Quintanaimport android.widget.ListView; 30b19e62add0a747127952862bb7bea0b73379edccFred Quintanaimport android.widget.TextView; 31b19e62add0a747127952862bb7bea0b73379edccFred Quintana 32b19e62add0a747127952862bb7bea0b73379edccFred Quintana/** 33b19e62add0a747127952862bb7bea0b73379edccFred Quintana * Presents multiple options for handling the case where a sync was aborted because there 34b19e62add0a747127952862bb7bea0b73379edccFred Quintana * were too many pending deletes. One option is to force the delete, another is to rollback 35b19e62add0a747127952862bb7bea0b73379edccFred Quintana * the deletes, the third is to do nothing. 36b19e62add0a747127952862bb7bea0b73379edccFred Quintana * @hide 37b19e62add0a747127952862bb7bea0b73379edccFred Quintana */ 38b19e62add0a747127952862bb7bea0b73379edccFred Quintanapublic class SyncActivityTooManyDeletes extends Activity 39b19e62add0a747127952862bb7bea0b73379edccFred Quintana implements AdapterView.OnItemClickListener { 40b19e62add0a747127952862bb7bea0b73379edccFred Quintana 41b19e62add0a747127952862bb7bea0b73379edccFred Quintana private long mNumDeletes; 42b19e62add0a747127952862bb7bea0b73379edccFred Quintana private Account mAccount; 43b19e62add0a747127952862bb7bea0b73379edccFred Quintana private String mAuthority; 44b19e62add0a747127952862bb7bea0b73379edccFred Quintana private String mProvider; 45b19e62add0a747127952862bb7bea0b73379edccFred Quintana 46b19e62add0a747127952862bb7bea0b73379edccFred Quintana @Override 47b19e62add0a747127952862bb7bea0b73379edccFred Quintana protected void onCreate(Bundle savedInstanceState) { 48b19e62add0a747127952862bb7bea0b73379edccFred Quintana super.onCreate(savedInstanceState); 49b19e62add0a747127952862bb7bea0b73379edccFred Quintana 50b19e62add0a747127952862bb7bea0b73379edccFred Quintana Bundle extras = getIntent().getExtras(); 51b19e62add0a747127952862bb7bea0b73379edccFred Quintana if (extras == null) { 52b19e62add0a747127952862bb7bea0b73379edccFred Quintana finish(); 53b19e62add0a747127952862bb7bea0b73379edccFred Quintana return; 54b19e62add0a747127952862bb7bea0b73379edccFred Quintana } 55b19e62add0a747127952862bb7bea0b73379edccFred Quintana 56b19e62add0a747127952862bb7bea0b73379edccFred Quintana mNumDeletes = extras.getLong("numDeletes"); 57b19e62add0a747127952862bb7bea0b73379edccFred Quintana mAccount = (Account) extras.getParcelable("account"); 58b19e62add0a747127952862bb7bea0b73379edccFred Quintana mAuthority = extras.getString("authority"); 59b19e62add0a747127952862bb7bea0b73379edccFred Quintana mProvider = extras.getString("provider"); 60b19e62add0a747127952862bb7bea0b73379edccFred Quintana 61b19e62add0a747127952862bb7bea0b73379edccFred Quintana // the order of these must match up with the constants for position used in onItemClick 62b19e62add0a747127952862bb7bea0b73379edccFred Quintana CharSequence[] options = new CharSequence[]{ 63b19e62add0a747127952862bb7bea0b73379edccFred Quintana getResources().getText(R.string.sync_really_delete), 64b19e62add0a747127952862bb7bea0b73379edccFred Quintana getResources().getText(R.string.sync_undo_deletes), 65b19e62add0a747127952862bb7bea0b73379edccFred Quintana getResources().getText(R.string.sync_do_nothing) 66b19e62add0a747127952862bb7bea0b73379edccFred Quintana }; 67b19e62add0a747127952862bb7bea0b73379edccFred Quintana 68b19e62add0a747127952862bb7bea0b73379edccFred Quintana ListAdapter adapter = new ArrayAdapter<CharSequence>(this, 69b19e62add0a747127952862bb7bea0b73379edccFred Quintana android.R.layout.simple_list_item_1, 70b19e62add0a747127952862bb7bea0b73379edccFred Quintana android.R.id.text1, 71b19e62add0a747127952862bb7bea0b73379edccFred Quintana options); 72b19e62add0a747127952862bb7bea0b73379edccFred Quintana 73b19e62add0a747127952862bb7bea0b73379edccFred Quintana ListView listView = new ListView(this); 74b19e62add0a747127952862bb7bea0b73379edccFred Quintana listView.setAdapter(adapter); 75b19e62add0a747127952862bb7bea0b73379edccFred Quintana listView.setItemsCanFocus(true); 76b19e62add0a747127952862bb7bea0b73379edccFred Quintana listView.setOnItemClickListener(this); 77b19e62add0a747127952862bb7bea0b73379edccFred Quintana 78b19e62add0a747127952862bb7bea0b73379edccFred Quintana TextView textView = new TextView(this); 79b19e62add0a747127952862bb7bea0b73379edccFred Quintana CharSequence tooManyDeletesDescFormat = 80b19e62add0a747127952862bb7bea0b73379edccFred Quintana getResources().getText(R.string.sync_too_many_deletes_desc); 81b19e62add0a747127952862bb7bea0b73379edccFred Quintana textView.setText(String.format(tooManyDeletesDescFormat.toString(), 82b19e62add0a747127952862bb7bea0b73379edccFred Quintana mNumDeletes, mProvider, mAccount.name)); 83b19e62add0a747127952862bb7bea0b73379edccFred Quintana 84b19e62add0a747127952862bb7bea0b73379edccFred Quintana final LinearLayout ll = new LinearLayout(this); 85b19e62add0a747127952862bb7bea0b73379edccFred Quintana ll.setOrientation(LinearLayout.VERTICAL); 86b19e62add0a747127952862bb7bea0b73379edccFred Quintana final LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( 87b19e62add0a747127952862bb7bea0b73379edccFred Quintana ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 0); 88b19e62add0a747127952862bb7bea0b73379edccFred Quintana ll.addView(textView, lp); 89b19e62add0a747127952862bb7bea0b73379edccFred Quintana ll.addView(listView, lp); 90b19e62add0a747127952862bb7bea0b73379edccFred Quintana 91b19e62add0a747127952862bb7bea0b73379edccFred Quintana // TODO: consider displaying the icon of the account type 92b19e62add0a747127952862bb7bea0b73379edccFred Quintana// AuthenticatorDescription[] descs = AccountManager.get(this).getAuthenticatorTypes(); 93b19e62add0a747127952862bb7bea0b73379edccFred Quintana// for (AuthenticatorDescription desc : descs) { 94b19e62add0a747127952862bb7bea0b73379edccFred Quintana// if (desc.type.equals(mAccount.type)) { 95b19e62add0a747127952862bb7bea0b73379edccFred Quintana// try { 96b19e62add0a747127952862bb7bea0b73379edccFred Quintana// final Context authContext = createPackageContext(desc.packageName, 0); 97b19e62add0a747127952862bb7bea0b73379edccFred Quintana// ImageView imageView = new ImageView(this); 98b19e62add0a747127952862bb7bea0b73379edccFred Quintana// imageView.setImageDrawable(authContext.getResources().getDrawable(desc.iconId)); 99b19e62add0a747127952862bb7bea0b73379edccFred Quintana// ll.addView(imageView, lp); 100b19e62add0a747127952862bb7bea0b73379edccFred Quintana// } catch (PackageManager.NameNotFoundException e) { 101b19e62add0a747127952862bb7bea0b73379edccFred Quintana// } 102b19e62add0a747127952862bb7bea0b73379edccFred Quintana// break; 103b19e62add0a747127952862bb7bea0b73379edccFred Quintana// } 104b19e62add0a747127952862bb7bea0b73379edccFred Quintana// } 105b19e62add0a747127952862bb7bea0b73379edccFred Quintana 106b19e62add0a747127952862bb7bea0b73379edccFred Quintana setContentView(ll); 107b19e62add0a747127952862bb7bea0b73379edccFred Quintana } 108b19e62add0a747127952862bb7bea0b73379edccFred Quintana 109b19e62add0a747127952862bb7bea0b73379edccFred Quintana public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 110b19e62add0a747127952862bb7bea0b73379edccFred Quintana // the constants for position correspond to the items options array in onCreate() 111b19e62add0a747127952862bb7bea0b73379edccFred Quintana if (position == 0) startSyncReallyDelete(); 112b19e62add0a747127952862bb7bea0b73379edccFred Quintana else if (position == 1) startSyncUndoDeletes(); 113b19e62add0a747127952862bb7bea0b73379edccFred Quintana finish(); 114b19e62add0a747127952862bb7bea0b73379edccFred Quintana } 115b19e62add0a747127952862bb7bea0b73379edccFred Quintana 116b19e62add0a747127952862bb7bea0b73379edccFred Quintana private void startSyncReallyDelete() { 117b19e62add0a747127952862bb7bea0b73379edccFred Quintana Bundle extras = new Bundle(); 118b19e62add0a747127952862bb7bea0b73379edccFred Quintana extras.putBoolean(ContentResolver.SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS, true); 119b19e62add0a747127952862bb7bea0b73379edccFred Quintana extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); 120b19e62add0a747127952862bb7bea0b73379edccFred Quintana extras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true); 121b19e62add0a747127952862bb7bea0b73379edccFred Quintana extras.putBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD, true); 122b19e62add0a747127952862bb7bea0b73379edccFred Quintana ContentResolver.requestSync(mAccount, mAuthority, extras); 123b19e62add0a747127952862bb7bea0b73379edccFred Quintana } 124b19e62add0a747127952862bb7bea0b73379edccFred Quintana 125b19e62add0a747127952862bb7bea0b73379edccFred Quintana private void startSyncUndoDeletes() { 126b19e62add0a747127952862bb7bea0b73379edccFred Quintana Bundle extras = new Bundle(); 127b19e62add0a747127952862bb7bea0b73379edccFred Quintana extras.putBoolean(ContentResolver.SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS, true); 128b19e62add0a747127952862bb7bea0b73379edccFred Quintana extras.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); 129b19e62add0a747127952862bb7bea0b73379edccFred Quintana extras.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true); 130b19e62add0a747127952862bb7bea0b73379edccFred Quintana extras.putBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD, true); 131b19e62add0a747127952862bb7bea0b73379edccFred Quintana ContentResolver.requestSync(mAccount, mAuthority, extras); 132b19e62add0a747127952862bb7bea0b73379edccFred Quintana } 133b19e62add0a747127952862bb7bea0b73379edccFred Quintana} 134