• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 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.settings.bluetooth;
18 
19 import android.companion.AssociationInfo;
20 import android.companion.CompanionDeviceManager;
21 import android.companion.datatransfer.PermissionSyncRequest;
22 import android.content.Context;
23 import android.provider.Settings;
24 
25 import androidx.preference.Preference;
26 import androidx.preference.PreferenceCategory;
27 import androidx.preference.PreferenceFragmentCompat;
28 import androidx.preference.PreferenceScreen;
29 import androidx.preference.SwitchPreference;
30 
31 import com.android.internal.annotations.VisibleForTesting;
32 import com.android.settings.R;
33 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
34 import com.android.settingslib.core.lifecycle.Lifecycle;
35 
36 import com.google.common.base.Objects;
37 
38 import java.util.Comparator;
39 
40 /**
41  * The controller of the CDM data sync in the bluetooth detail settings.
42  */
43 public class BluetoothDetailsDataSyncController extends BluetoothDetailsController
44         implements Preference.OnPreferenceClickListener {
45 
46     private static final int DUMMY_ASSOCIATION_ID = -1;
47     private static final String TAG = "BTDataSyncController";
48     private static final String KEY_DATA_SYNC_GROUP = "data_sync_group";
49     private static final String KEY_PERM_SYNC = "perm_sync";
50 
51     @VisibleForTesting
52     PreferenceCategory mPreferenceCategory;
53     @VisibleForTesting
54     int mAssociationId = DUMMY_ASSOCIATION_ID;
55 
56     private CachedBluetoothDevice mCachedDevice;
57     private CompanionDeviceManager mCompanionDeviceManager;
58 
BluetoothDetailsDataSyncController(Context context, PreferenceFragmentCompat fragment, CachedBluetoothDevice device, Lifecycle lifecycle)59     public BluetoothDetailsDataSyncController(Context context,
60             PreferenceFragmentCompat fragment,
61             CachedBluetoothDevice device,
62             Lifecycle lifecycle) {
63         super(context, fragment, device, lifecycle);
64         mCachedDevice = device;
65         mCompanionDeviceManager = context.getSystemService(CompanionDeviceManager.class);
66 
67         mCompanionDeviceManager.getAllAssociations().stream().filter(
68                 a -> a.getDeviceMacAddress() != null).filter(
69                 a -> Objects.equal(mCachedDevice.getAddress(),
70                         a.getDeviceMacAddress().toString().toUpperCase())).max(
71                 Comparator.comparingLong(AssociationInfo::getTimeApprovedMs)).ifPresent(
72                     a -> mAssociationId = a.getId());
73     }
74 
75     @Override
isAvailable()76     public boolean isAvailable() {
77         if (mAssociationId == DUMMY_ASSOCIATION_ID) {
78             return false;
79         }
80         return true;
81     }
82 
83     @Override
onPreferenceClick(Preference preference)84     public boolean onPreferenceClick(Preference preference) {
85         SwitchPreference switchPreference = (SwitchPreference) preference;
86         String key = switchPreference.getKey();
87         if (key.equals(KEY_PERM_SYNC)) {
88             if (switchPreference.isChecked()) {
89                 mCompanionDeviceManager.enablePermissionsSync(mAssociationId);
90             } else {
91                 mCompanionDeviceManager.disablePermissionsSync(mAssociationId);
92             }
93         }
94         return true;
95     }
96 
97     @Override
getPreferenceKey()98     public String getPreferenceKey() {
99         return KEY_DATA_SYNC_GROUP;
100     }
101 
102     @Override
init(PreferenceScreen screen)103     protected void init(PreferenceScreen screen) {
104         mPreferenceCategory = screen.findPreference(getPreferenceKey());
105         refresh();
106     }
107 
108     @Override
refresh()109     protected void refresh() {
110         SwitchPreference permSyncPref = mPreferenceCategory.findPreference(KEY_PERM_SYNC);
111         if (permSyncPref == null) {
112             permSyncPref = createPermSyncPreference(mPreferenceCategory.getContext());
113             mPreferenceCategory.addPreference(permSyncPref);
114         }
115 
116         if (mAssociationId == DUMMY_ASSOCIATION_ID) {
117             permSyncPref.setVisible(false);
118             return;
119         }
120 
121         boolean visible = false;
122         boolean checked = false;
123         PermissionSyncRequest request = mCompanionDeviceManager.getPermissionSyncRequest(
124                 mAssociationId);
125         if (request != null) {
126             visible = true;
127             if (request.isUserConsented()) {
128                 checked = true;
129             }
130         }
131         permSyncPref.setVisible(visible);
132         permSyncPref.setChecked(checked);
133     }
134 
135     @VisibleForTesting
createPermSyncPreference(Context context)136     SwitchPreference createPermSyncPreference(Context context) {
137         SwitchPreference pref = new SwitchPreference(context);
138         pref.setKey(KEY_PERM_SYNC);
139         pref.setTitle(context.getString(R.string.bluetooth_details_permissions_sync_title));
140         pref.setSummary(context.getString(R.string.bluetooth_details_permissions_sync_summary,
141                 mCachedDevice.getName(),
142                 Settings.Global.getString(context.getContentResolver(), "device_name")));
143         pref.setOnPreferenceClickListener(this);
144         return pref;
145     }
146 }
147