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