blob: 1f61647b713f00ff6641e071b1a5efbb4b186f43 [file] [log] [blame]
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.hdmi;
import android.os.UserHandle;
import android.provider.Settings;
import com.android.internal.app.LocalePicker;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.util.settings.SecureSettings;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Locale;
import java.util.concurrent.Executor;
import javax.inject.Inject;
/**
* Helper class to separate model and view for system language change initiated by HDMI CEC.
*/
@SysUISingleton
public class HdmiCecSetMenuLanguageHelper {
private static final String TAG = HdmiCecSetMenuLanguageHelper.class.getSimpleName();
private static final String SEPARATOR = ",";
private final Executor mBackgroundExecutor;
private final SecureSettings mSecureSettings;
private Locale mLocale;
private HashSet<String> mDenylist;
@Inject
public HdmiCecSetMenuLanguageHelper(@Background Executor executor,
SecureSettings secureSettings) {
mBackgroundExecutor = executor;
mSecureSettings = secureSettings;
String denylist = mSecureSettings.getStringForUser(
Settings.Secure.HDMI_CEC_SET_MENU_LANGUAGE_DENYLIST, UserHandle.USER_CURRENT);
mDenylist = new HashSet<>(denylist == null
? Collections.EMPTY_SET
: Arrays.asList(denylist.split(SEPARATOR)));
}
/**
* Set internal locale based on given language tag.
*/
public void setLocale(String languageTag) {
mLocale = Locale.forLanguageTag(languageTag);
}
/**
* Returns the locale from {@code <Set Menu Language>} CEC message.
*/
public Locale getLocale() {
return mLocale;
}
/**
* Returns whether the locale from {@code <Set Menu Language>} CEC message was already
* denylisted.
*/
public boolean isLocaleDenylisted() {
return mDenylist.contains(mLocale.toLanguageTag());
}
/**
* Accepts the new locale and updates system language.
*/
public void acceptLocale() {
mBackgroundExecutor.execute(() -> LocalePicker.updateLocale(mLocale));
}
/**
* Declines the locale and puts it on the denylist.
*/
public void declineLocale() {
mDenylist.add(mLocale.toLanguageTag());
mSecureSettings.putStringForUser(Settings.Secure.HDMI_CEC_SET_MENU_LANGUAGE_DENYLIST,
String.join(SEPARATOR, mDenylist), UserHandle.USER_CURRENT);
}
}