1 /*
2  * Copyright (C) 2018 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.car.settings.accounts;
18 
19 import android.content.Context;
20 import android.view.View;
21 import android.widget.TextView;
22 
23 import androidx.preference.PreferenceViewHolder;
24 import androidx.preference.SwitchPreference;
25 
26 import com.android.car.apps.common.util.Themes;
27 import com.android.car.settings.R;
28 
29 /**
30  * A preference that represents the state of a sync adapter.
31  *
32  * <p>Largely derived from {@link com.android.settings.accounts.SyncStateSwitchPreference}.
33  */
34 public class SyncPreference extends SwitchPreference {
35     private int mUid;
36     private String mPackageName;
37     private AccountSyncHelper.SyncState mSyncState = AccountSyncHelper.SyncState.NONE;
38     private boolean mOneTimeSyncMode = false;
39 
SyncPreference(Context context, String authority)40     public SyncPreference(Context context, String authority) {
41         super(context);
42         setKey(authority);
43         setPersistent(false);
44         updateIcon();
45     }
46 
47     @Override
onBindViewHolder(PreferenceViewHolder view)48     public void onBindViewHolder(PreferenceViewHolder view) {
49         super.onBindViewHolder(view);
50 
51         View switchView = view.findViewById(com.android.internal.R.id.switch_widget);
52         if (mOneTimeSyncMode) {
53             switchView.setVisibility(View.GONE);
54 
55             /*
56              * Override the summary. Fill in the %1$s with the existing summary
57              * (what ends up happening is the old summary is shown on the next
58              * line).
59              */
60             TextView summary = (TextView) view.findViewById(android.R.id.summary);
61             summary.setText(getContext().getString(R.string.sync_one_time_sync, getSummary()));
62         } else {
63             switchView.setVisibility(View.VISIBLE);
64         }
65     }
66 
67     /** Updates the preference icon based on the current syncing state. */
updateIcon()68     private void updateIcon() {
69         switch (mSyncState) {
70             case ACTIVE:
71                 setIcon(R.drawable.ic_sync_anim);
72                 getIcon().setTintList(Themes.getAttrColorStateList(getContext(), R.attr.iconColor));
73                 break;
74             case PENDING:
75                 setIcon(R.drawable.ic_sync);
76                 getIcon().setTintList(Themes.getAttrColorStateList(getContext(), R.attr.iconColor));
77                 break;
78             case FAILED:
79                 setIcon(R.drawable.ic_sync_problem);
80                 getIcon().setTintList(Themes.getAttrColorStateList(getContext(), R.attr.iconColor));
81                 break;
82             default:
83                 setIcon(null);
84                 setIconSpaceReserved(true);
85                 break;
86         }
87     }
88 
89     /** Sets the sync state for this preference. */
setSyncState(AccountSyncHelper.SyncState state)90     public void setSyncState(AccountSyncHelper.SyncState state) {
91         mSyncState = state;
92         // Force a manual update of the icon since the sync state affects what is shown.
93         updateIcon();
94     }
95 
96     /**
97      * Returns whether or not the sync adapter is in one-time sync mode.
98      *
99      * <p>One-time sync mode means that the sync adapter is not being automatically synced but
100      * can be manually synced (i.e. a one time sync).
101      */
isOneTimeSyncMode()102     public boolean isOneTimeSyncMode() {
103         return mOneTimeSyncMode;
104     }
105 
106     /** Sets whether one-time sync mode is on for this preference. */
setOneTimeSyncMode(boolean oneTimeSyncMode)107     public void setOneTimeSyncMode(boolean oneTimeSyncMode) {
108         mOneTimeSyncMode = oneTimeSyncMode;
109         // Force a refresh so that onBindViewHolder is called
110         notifyChanged();
111     }
112 
113     /**
114      * Returns the uid corresponding to the sync adapter's package.
115      *
116      * <p>This can be used to create an intent to request account access via
117      * {@link android.accounts.AccountManager#createRequestAccountAccessIntentSenderAsUser}.
118      */
getUid()119     public int getUid() {
120         return mUid;
121     }
122 
123     /** Sets the uid for this preference. */
setUid(int uid)124     public void setUid(int uid) {
125         mUid = uid;
126     }
127 
getPackageName()128     public String getPackageName() {
129         return mPackageName;
130     }
131 
setPackageName(String packageName)132     public void setPackageName(String packageName) {
133         mPackageName = packageName;
134     }
135 }
136