• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2013 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 com.android.mail.ui;
18 
19 import android.app.Activity;
20 import android.content.ContentResolver;
21 import android.content.Context;
22 import android.content.res.Resources;
23 import android.text.Html;
24 import android.text.Spannable;
25 import android.text.SpannableString;
26 import android.text.Spanned;
27 import android.text.TextUtils;
28 import android.text.style.TextAppearanceSpan;
29 import android.util.Log;
30 import android.view.View;
31 
32 import com.android.mail.R;
33 import com.android.mail.analytics.Analytics;
34 import com.android.mail.browse.ConversationCursor;
35 import com.android.mail.preferences.AccountPreferences;
36 import com.android.mail.preferences.MailPrefs;
37 import com.android.mail.providers.Account;
38 import com.android.mail.providers.Folder;
39 import com.android.mail.utils.LogTag;
40 import com.android.mail.utils.LogUtils;
41 import com.android.mail.utils.StyleUtils;
42 import com.android.mail.utils.Utils;
43 
44 /**
45  * A tip displayed on top of conversation view to indicate that Gmail sync is
46  * currently disabled on this account.
47  */
48 public class ConversationSyncDisabledTipView extends ConversationTipView {
49     public static final String LOG_TAG = LogTag.getLogTag();
50     private Account mAccount = null;
51     private Folder mFolder = null;
52     private final MailPrefs mMailPrefs;
53     private AccountPreferences mAccountPreferences;
54     private Activity mActivity;
55 
56     private int mReasonSyncOff = ReasonSyncOff.NONE;
57 
58     public interface ReasonSyncOff {
59         // Background sync is enabled for current account, do not display this tip
60         public static final int NONE = 0;
61         // Global auto-sync (affects all apps and all accounts) is turned off
62         public static final int AUTO_SYNC_OFF = 1;
63         // Global auto-sync is on, but Gmail app level sync is disabled for this particular account
64         public static final int ACCOUNT_SYNC_OFF = 2;
65     }
66 
ConversationSyncDisabledTipView(final Context context)67     public ConversationSyncDisabledTipView(final Context context) {
68         super(context);
69 
70         mMailPrefs = MailPrefs.get(context);
71     }
72 
73     @Override
getTextAreaOnClickListener()74     protected OnClickListener getTextAreaOnClickListener() {
75         return new OnClickListener() {
76             @Override
77             public void onClick(View view) {
78                 if (mReasonSyncOff == ReasonSyncOff.AUTO_SYNC_OFF) {
79                     final TurnAutoSyncOnDialog dialog = TurnAutoSyncOnDialog.newInstance(
80                             mAccount.getAccountManagerAccount(), mAccount.syncAuthority);
81                     dialog.show(mActivity.getFragmentManager(), TurnAutoSyncOnDialog.DIALOG_TAG);
82                 } else if (mReasonSyncOff == ReasonSyncOff.ACCOUNT_SYNC_OFF) {
83                     Utils.showAccountSettings(getContext(), mAccount);
84                 }
85             }
86         };
87     }
88 
89     public void bindAccount(Account account, ControllableActivity activity) {
90         mAccount = account;
91         mAccountPreferences = AccountPreferences.get(getContext(), account);
92         mActivity = (Activity) activity;
93     }
94 
95     @Override
96     public void onUpdate(Folder folder, ConversationCursor cursor) {
97         mFolder = folder;
98     }
99 
100     @Override
101     public boolean getShouldDisplayInList() {
102         if (mAccount == null || mAccount.syncAuthority == null) {
103             return false;
104         }
105 
106         // Do not show this message for folders/labels that are not set to sync.
107         if (mFolder == null || mFolder.syncWindow <= 0) {
108             return false;
109         }
110 
111         setReasonSyncOff(calculateReasonSyncOff(mMailPrefs, mAccount, mAccountPreferences));
112 
113         if (mReasonSyncOff != ReasonSyncOff.NONE) {
114             LogUtils.i(LOG_TAG, "Sync is off with reason %d", mReasonSyncOff);
115         }
116 
117         switch (mReasonSyncOff) {
118             case ReasonSyncOff.AUTO_SYNC_OFF:
119                 return (mMailPrefs.getNumOfDismissesForAutoSyncOff() == 0);
120             case ReasonSyncOff.ACCOUNT_SYNC_OFF:
121                 return (mAccountPreferences.getNumOfDismissesForAccountSyncOff() == 0);
122             default:
123                 return false;
124         }
125     }
126 
127     public static int calculateReasonSyncOff(MailPrefs mailPrefs,
128             Account account, AccountPreferences accountPreferences) {
129         if (!ContentResolver.getMasterSyncAutomatically()) {
130             // Global sync is turned off
131             accountPreferences.resetNumOfDismissesForAccountSyncOff();
132             // Logging to track down bug where this tip is being showing when it shouldn't be.
133             LogUtils.i(LOG_TAG, "getMasterSyncAutomatically() return false");
134             return ReasonSyncOff.AUTO_SYNC_OFF;
135         } else {
136             // Global sync is on, clear the number of times users has dismissed this
137             // warning so that next time global sync is off, warning gets displayed again.
138             mailPrefs.resetNumOfDismissesForAutoSyncOff();
139 
140             // Now check for whether account level sync is on/off.
141             android.accounts.Account acct = account.getAccountManagerAccount();
142             if (!TextUtils.isEmpty(account.syncAuthority) &&
143                     !ContentResolver.getSyncAutomatically(acct, account.syncAuthority)) {
144                 // Account level sync is off
145                 return ReasonSyncOff.ACCOUNT_SYNC_OFF;
146             } else {
147                 // Account sync is on, clear the number of times users has dismissed this
148                 // warning so that next time sync is off, warning gets displayed again.
149                 accountPreferences.resetNumOfDismissesForAccountSyncOff();
150                 return ReasonSyncOff.NONE;
151             }
152         }
153     }
154 
155     private void setReasonSyncOff(int reason) {
156         if (mReasonSyncOff != reason) {
157             mReasonSyncOff = reason;
158             final Resources resources = getResources();
159             switch (mReasonSyncOff) {
160                 case ReasonSyncOff.AUTO_SYNC_OFF:
161                     setText(resources.getString(R.string.auto_sync_off));
162                     break;
163                 case ReasonSyncOff.ACCOUNT_SYNC_OFF:
164                     // Create the "Turn on in Account settings." text where "Account settings" appear as
165                     // a blue link.
166                     Spannable accountSyncOff = new SpannableString(
167                             Html.fromHtml(resources.getString(R.string.account_sync_off)));
168                     StyleUtils.stripUnderlinesAndLinkUrls(accountSyncOff, null);
169                     setText(accountSyncOff);
170                     break;
171                 default:
172             }
173         }
174     }
175 
176     @Override
177     public void dismiss() {
178         final String reason;
179         switch (mReasonSyncOff) {
180             case ReasonSyncOff.AUTO_SYNC_OFF:
181                 mMailPrefs.incNumOfDismissesForAutoSyncOff();
182                 reason = "auto_sync_off";
183                 break;
184             case ReasonSyncOff.ACCOUNT_SYNC_OFF:
185                 mAccountPreferences.incNumOfDismissesForAccountSyncOff();
186                 reason = "account_sync_off";
187                 break;
188             default:
189                 reason = null;
190                 break;
191         }
192         Analytics.getInstance().sendEvent("list_swipe", "sync_disabled_tip", reason, 0);
193         super.dismiss();
194     }
195 }