Files
app_Settings/src/com/android/settings/datetime/DateTimeSettings.java
Neil Fuller 43ded696dd UI changes to support time feedback
The feature is behind a release flag. It is also behind an experiment
flag so it can be trialed with Googlers before general release even
after being enabled in a release.

The feedback button only shows up if there is an intent URI configured,
which should be handled via an overlay. The design means that the intent
is potentially dependent on the manufacturer (good!), though I expect we
will suggest a standard one for GMS devices so we get feedback from a
variety of devices with different form factors / capabilities.
In this default, GMS core (Google Play Services) will handle the intent
and take the user through a feedback UI flow.

Testing:

To enable the button you need to build with one of release variants that
supports dynamic flags, e.g. trunk_food.

Then release flag:
$ adb shell device_config put location com.android.settings.flags.datetime_feedback true

It still won't work without the experiment flag:
$ adb shell device_config put settings_ui time_help_and_feedback_feature_supported true

Finally, the settings entry will launch an intent when pressed which has
to have a receiver. The receiver will be in GMS core but will be subject
to its own review / launch process. Until then, this feature will remain
quiet, biding its time.

Bug: 283239837
Test: Manual (see above)
Test: atest SettingsRoboTests:com.android.settings.datetime
Change-Id: I68798798fc0a47ae4c6755174ce509fbaee24142
2024-03-25 19:00:47 +00:00

124 lines
4.4 KiB
Java

/*
* Copyright (C) 2019 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.datetime;
import android.app.Dialog;
import android.app.settings.SettingsEnums;
import android.app.timedetector.TimeDetectorHelper;
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.search.SearchIndexable;
import com.google.android.setupcompat.util.WizardManagerHelper;
@SearchIndexable
public class DateTimeSettings extends DashboardFragment implements
TimePreferenceController.TimePreferenceHost, DatePreferenceController.DatePreferenceHost {
private static final String TAG = "DateTimeSettings";
// have we been launched from the setup wizard?
protected static final String EXTRA_IS_FROM_SUW = "firstRun";
@Override
public int getMetricsCategory() {
return SettingsEnums.DATE_TIME;
}
@Override
protected String getLogTag() {
return TAG;
}
@Override
protected int getPreferenceScreenResId() {
return R.xml.date_time_prefs;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
boolean isFromSUW = WizardManagerHelper.isAnySetupWizard(getIntent());
getSettingsLifecycle().addObserver(new TimeChangeListenerMixin(context, this));
use(LocationTimeZoneDetectionPreferenceController.class).setFragment(this);
use(AutoTimePreferenceController.class).setDateAndTimeCallback(this);
use(DatePreferenceController.class).setHost(this);
use(TimePreferenceController.class).setHost(this);
use(AutoTimeZonePreferenceController.class)
.setTimeAndDateCallback(this)
.setFromSUW(isFromSUW);
use(TimeFormatPreferenceController.class)
.setTimeAndDateCallback(this)
.setFromSUW(isFromSUW);
// All the elements in the category are optional, so we must ensure the category is only
// available if any of the elements are available.
TimeFeedbackPreferenceCategoryController helpAndFeedbackCategoryController =
use(TimeFeedbackPreferenceCategoryController.class);
use(TimeFeedbackPreferenceController.class)
.registerWithOptionalCategoryController(helpAndFeedbackCategoryController);
}
@Override
public void updateTimeAndDateDisplay(Context context) {
updatePreferenceStates();
}
@Override
public Dialog onCreateDialog(int id) {
switch (id) {
case DatePreferenceController.DIALOG_DATEPICKER:
return use(DatePreferenceController.class)
.buildDatePicker(getActivity(), TimeDetectorHelper.INSTANCE);
case TimePreferenceController.DIALOG_TIMEPICKER:
return use(TimePreferenceController.class)
.buildTimePicker(getActivity());
default:
throw new IllegalArgumentException();
}
}
@Override
public int getDialogMetricsCategory(int dialogId) {
switch (dialogId) {
case DatePreferenceController.DIALOG_DATEPICKER:
return SettingsEnums.DIALOG_DATE_PICKER;
case TimePreferenceController.DIALOG_TIMEPICKER:
return SettingsEnums.DIALOG_TIME_PICKER;
default:
return 0;
}
}
@Override
public void showTimePicker() {
removeDialog(TimePreferenceController.DIALOG_TIMEPICKER);
showDialog(TimePreferenceController.DIALOG_TIMEPICKER);
}
@Override
public void showDatePicker() {
showDialog(DatePreferenceController.DIALOG_DATEPICKER);
}
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.date_time_prefs);
}