Add Transcode Settings screen in Developer Options

This screen would be used to enable/disable transcoding for all apps, and select a list of apps to be skipped from transcoding.
UI screenshot: https://screenshot.googleplex.com/4bpbZdM6vbhdw5u

Design doc reference for native transcoding: go/seamless-transcoding

Test: Manual
Bug: 169547037
Change-Id: I7cf72131560b99728083838bf0dad400bb5cb4a9
This commit is contained in:
Biswarup Pal
2020-10-25 16:38:23 +00:00
parent 60d3e5ec63
commit 519ebd6fe8
7 changed files with 478 additions and 0 deletions

View File

@@ -0,0 +1,52 @@
/*
* Copyright (C) 2020 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.settings.development.transcode;
import android.content.Context;
import android.os.SystemProperties;
import com.android.settings.core.TogglePreferenceController;
/**
* The controller for the "Enable transcode for all apps" switch on the transcode settings
* screen.
*/
public class TranscodeGlobalTogglePreferenceController extends TogglePreferenceController {
private static final String TRANSCODE_ENABLED_PROP_KEY = "persist.sys.fuse.transcode";
public TranscodeGlobalTogglePreferenceController(Context context,
String preferenceKey) {
super(context, preferenceKey);
}
@Override
public int getAvailabilityStatus() {
return AVAILABLE;
}
@Override
public boolean isChecked() {
return SystemProperties.getBoolean(TRANSCODE_ENABLED_PROP_KEY, false);
}
@Override
public boolean setChecked(boolean isChecked) {
SystemProperties.set(TRANSCODE_ENABLED_PROP_KEY, String.valueOf(isChecked));
return true;
}
}

View File

@@ -0,0 +1,58 @@
/*
* Copyright (C) 2020 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.settings.development.transcode;
import android.app.settings.SettingsEnums;
import android.content.Context;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.development.DevelopmentSettingsEnabler;
import com.android.settingslib.search.SearchIndexable;
/**
* Fragment for native transcode settings in Developer options.
*/
@SearchIndexable
public class TranscodeSettingsFragment extends DashboardFragment {
private static final String TAG = "TranscodeSettings";
@Override
protected String getLogTag() {
return TAG;
}
@Override
protected int getPreferenceScreenResId() {
return R.xml.transcode_settings;
}
@Override
public int getMetricsCategory() {
return SettingsEnums.TRANSCODE_SETTINGS;
}
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.transcode_settings) {
@Override
protected boolean isPageSearchEnabled(Context context) {
return DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(context);
}
};
}

View File

@@ -0,0 +1,97 @@
/*
* Copyright (C) 2020 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.settings.development.transcode;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.SystemProperties;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;
import com.android.settings.core.BasePreferenceController;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* The controller for the "Skip transcoding for apps" section on the transcode settings
* screen.
*/
public class TranscodeSkipAppsPreferenceController extends BasePreferenceController implements
Preference.OnPreferenceChangeListener {
private static final String SKIP_SELECTED_APPS_PROP_KEY =
"persist.sys.fuse.transcode_skip_uids";
private final PackageManager mPackageManager;
private final List<String> mUidsToSkip = new ArrayList<>();
public TranscodeSkipAppsPreferenceController(Context context,
String preferenceKey) {
super(context, preferenceKey);
mPackageManager = context.getPackageManager();
}
@Override
public int getAvailabilityStatus() {
return AVAILABLE;
}
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
final Context context = screen.getContext();
mUidsToSkip.addAll(Arrays.asList(
SystemProperties.get(SKIP_SELECTED_APPS_PROP_KEY).split(",")));
Intent launcherIntent = new Intent(Intent.ACTION_MAIN);
launcherIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> apps = mPackageManager.queryIntentActivities(launcherIntent, 0);
for (ResolveInfo app : apps) {
String uid = String.valueOf(app.activityInfo.applicationInfo.uid);
SwitchPreference preference = new SwitchPreference(context);
preference.setTitle(app.loadLabel(mPackageManager));
preference.setIcon(app.loadIcon(mPackageManager));
preference.setKey(uid);
preference.setChecked(isSkippedForTranscoding(uid));
preference.setOnPreferenceChangeListener(this);
screen.addPreference(preference);
}
}
@Override
public boolean onPreferenceChange(Preference preference, Object o) {
boolean value = (Boolean) o;
String uidStr = preference.getKey();
if (value) {
mUidsToSkip.add(uidStr);
} else {
mUidsToSkip.remove(uidStr);
}
SystemProperties.set(SKIP_SELECTED_APPS_PROP_KEY, String.join(",", mUidsToSkip));
return true;
}
private boolean isSkippedForTranscoding(String uid) {
return mUidsToSkip.contains(uid);
}
}