Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7f6f6e18 authored by Freeman Ng's avatar Freeman Ng
Browse files

use prefs-style layout for setup wizard date/time settings on non-xlarge screens

Adjusted the screen size test to fall back to phone version of
DateTimeSettingsSetupWizard on large screens.

I made the following changes from how the phone version works:

1. Some layout changes. (Tablet look, bigger margins.)
2. Use zone picker to select time zone.
3. Added isFirstRun boolean extra to hide the pref fields
we don't need to see from setup wizard

Furthermore, I made the following fixes to the existing phone flow
(which had probably never yet been tried on a phone):

1. Added conditionals around access to some variables that only
exist in the xlarge layout.
2. Implemented PreferenceFragment.OnPreferenceStartFragmentCallback
in DateTimeSettingsSetupWizard in order to catch the user tapping
on the timezone preference and show the time zone picker popup.
(Note: for phones in ICS, we might want to launch the zone picker
preferences style, like it would have been had this been a
PreferenceActivity. Or maybe we should just create a separate
DateTimeSettingsSetupWizardPhone activity that subclasses
PreferencesActivity and doesn't need to play this trick.)

Change-Id: Ib5774a005c9f44d730d86c13746d91eb712141cc
parent 1f7014a2
Loading
Loading
Loading
Loading
+48 −148
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2010 The Android Open Source Project
<!-- Copyright (C) 2011 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.
@@ -13,156 +13,56 @@
     See the License for the specific language governing permissions and
     limitations under the License.
-->
<RelativeLayout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/layout_root"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
        android:layout_height="match_parent"
    android:paddingTop="@dimen/datetime_margin_top"
    android:paddingLeft="@dimen/screen_margin_sides"
    android:paddingRight="@dimen/screen_margin_sides"
    android:paddingBottom="@dimen/datetime_margin_bottom">

    <!-- Title: Set date & time-->
    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minHeight="48dip"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="16dip"
        android:layout_alignParentTop="true"
        android:textSize="32dip"
        android:textColor="#FF99cc00"
        android:text="@string/date_and_time_settings_title_setup_wizard"
        android:gravity="bottom" />

    <!-- Divider -->
    <View
        android:id="@+id/top_divider"
        android:layout_width="match_parent"
        android:layout_height="3dip"
        android:layout_below="@id/title"
        android:layout_marginTop="6dip"
        android:layout_marginBottom="17dip"
        android:background="@color/divider_color" />

    <RelativeLayout
        android:id="@+id/timezone_auto_time"
        android:layout_width="716dip"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_below="@id/top_divider">
        <!-- timezone -->
        <Button
            android:id="@+id/time_zone_button"
            style="?android:attr/dropDownSpinnerStyle"
            android:layout_width="304dip"
            android:layout_height="48dip"
            android:layout_alignParentLeft="true"
            android:layout_alignBottom="@+id/date_time_auto"
            android:gravity="left|center_vertical"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textSize="20dip" />

        <LinearLayout
            android:id="@+id/date_time_auto"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_toRightOf="@id/time_zone_button"
            android:layout_marginLeft="32dip"
            android:layout_alignParentRight="true">
        android:paddingTop="96dip"
        android:paddingLeft="40dip"
        android:paddingRight="40dip"
        android:paddingBottom="96dip"
        android:orientation="vertical">

            <Switch
                android:id="@+id/date_time_auto_button"
    <FrameLayout android:id="@+id/timezone_dropdown_anchor"
            android:layout_height="0px"
            android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:minHeight="?android:attr/listPreferredItemHeight"
                android:layout_marginLeft="16dip"
                android:text="@string/date_time_auto"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:textSize="20dip" />
            android:layout_marginLeft="40dip"
            android:layout_marginRight="40dip"/>

            <!-- Divider -->
            <View
    <LinearLayout android:layout_height="0px"
                  android:layout_weight="1"
                  android:layout_width="match_parent"
                android:layout_height="1px"
                android:background="@color/divider_color" />
        </LinearLayout>
    </RelativeLayout>

    <LinearLayout
        android:layout_width="624dip"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/timezone_auto_time"
        android:layout_marginTop="48dip"
        android:orientation="horizontal">

        <LinearLayout
            android:layout_width="312dip"
            android:layout_height="wrap_content"
                  android:orientation="vertical">
            <TextView
                android:id="@+id/date_picker_title"
                android:layout_width="match_parent"
                android:layout_height="48dip"
                android:text="@string/date_picker_title"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:textSize="20dip"
                android:clickable="false"
                android:longClickable="false"
                android:gravity="center" />
            <DatePicker
                android:id="@+id/date_picker"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/date_picker_title" />
        </LinearLayout>

        <!-- divider -->
        <View
            android:id="@+id/center_divider"
            android:layout_width="1dip"
            android:layout_height="match_parent"
            android:background="@color/divider_color" />

        <LinearLayout
            android:layout_width="312dip"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <TextView
                android:id="@+id/time_picker_title"
        <fragment android:id="@+id/date_time_settings_fragment"
                  class="com.android.settings.DateTimeSettings"
                  android:layout_width="match_parent"
                android:layout_height="48dip"
                android:text="@string/time_picker_title"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:textSize="20dip"
                android:gravity="center" />
                  android:layout_height="match_parent" />

            <TimePicker
                android:id="@+id/time_picker"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/time_picker_title" />
        </LinearLayout>
    </LinearLayout>

    <RelativeLayout android:layout_height="wrap_content"
                    android:layout_weight="0"
                    android:layout_width="match_parent">

        <View
            android:id="@+id/bottom_divider"
        android:layout_width="match_parent"
            android:layout_height="3dip"
        android:layout_alignLeft="@id/timezone_auto_time"
        android:layout_above="@+id/next_button"
            android:layout_width="match_parent"
            android:layout_marginTop="0dip"
            android:layout_marginBottom="16dip"
        android:background="@color/divider_color" />
            android:background="@color/divider_color"
            android:layout_above="@+id/next_button"/>

    <Button
        android:id="@+id/next_button"
        style="@style/setup_wizard_button"
        android:layout_alignParentBottom="true"
        <Button android:id="@+id/next_button"
            android:layout_width="wrap_content"
            android:minWidth="208dip"
            android:layout_height="48dip"
            android:layout_marginTop="10dip"
            android:layout_alignParentRight="true"
            android:text="@string/next_label"/>

    </RelativeLayout>

</LinearLayout>
+2 −2
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2010 The Android Open Source Project
<!-- Copyright (C) 2011 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.
+14 −4
Original line number Diff line number Diff line
@@ -60,6 +60,9 @@ public class DateTimeSettings extends SettingsPreferenceFragment
    private static final int DIALOG_DATEPICKER = 0;
    private static final int DIALOG_TIMEPICKER = 1;

    // have we been launched from the setup wizard?
    protected static final String EXTRA_IS_FIRST_RUN = "firstRun";

    private CheckBoxPreference mAutoTimePref;
    private Preference mTimePref;
    private Preference mTime24Pref;
@@ -81,15 +84,18 @@ public class DateTimeSettings extends SettingsPreferenceFragment
        boolean autoTimeEnabled = getAutoState(Settings.System.AUTO_TIME);
        boolean autoTimeZoneEnabled = getAutoState(Settings.System.AUTO_TIME_ZONE);

        Intent intent = getActivity().getIntent();
        boolean isFirstRun = intent.getBooleanExtra(EXTRA_IS_FIRST_RUN, false);

        mDummyDate = Calendar.getInstance();
        mDummyDate.set(mDummyDate.get(Calendar.YEAR), 11, 31, 13, 0, 0);

        mAutoTimePref = (CheckBoxPreference) findPreference(KEY_AUTO_TIME);
        mAutoTimePref.setChecked(autoTimeEnabled);
        mAutoTimeZonePref = (CheckBoxPreference) findPreference(KEY_AUTO_TIME_ZONE);
        // Override auto-timezone if it's a wifi-only device.
        // TODO: Remove this when auto-timezone is implemented based on wifi-location.
        if (Utils.isWifiOnly()) {
        // Override auto-timezone if it's a wifi-only device or if we're still in setup wizard.
        // TODO: Remove the wifiOnly test when auto-timezone is implemented based on wifi-location.
        if (Utils.isWifiOnly() || isFirstRun) {
            getPreferenceScreen().removePreference(mAutoTimeZonePref);
            autoTimeZoneEnabled = false;
        }
@@ -100,6 +106,10 @@ public class DateTimeSettings extends SettingsPreferenceFragment
        mTimeZone = findPreference("timezone");
        mDatePref = findPreference("date");
        mDateFormat = (ListPreference) findPreference(KEY_DATE_FORMAT);
        if (isFirstRun) {
            getPreferenceScreen().removePreference(mTime24Pref);
            getPreferenceScreen().removePreference(mDateFormat);
        }

        String [] dateFormats = getResources().getStringArray(R.array.date_format_values);
        String [] formattedDates = new String[dateFormats.length];
@@ -158,7 +168,7 @@ public class DateTimeSettings extends SettingsPreferenceFragment
                .unregisterOnSharedPreferenceChangeListener(this);
    }

    private void updateTimeAndDateDisplay(Context context) {
    public void updateTimeAndDateDisplay(Context context) {
        java.text.DateFormat shortDateFormat = DateFormat.getDateFormat(context);
        final Calendar now = Calendar.getInstance();
        Date dummyDate = mDummyDate.getTime();
+85 −36
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ package com.android.settings;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -25,6 +27,8 @@ import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
import android.text.format.DateFormat;
@@ -39,6 +43,7 @@ import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.DatePicker;
import android.widget.LinearLayout;
import android.widget.ListPopupWindow;
import android.widget.SimpleAdapter;
import android.widget.TimePicker;
@@ -47,14 +52,18 @@ import java.util.Calendar;
import java.util.TimeZone;

public class DateTimeSettingsSetupWizard extends Activity
        implements OnClickListener, OnItemClickListener, OnCheckedChangeListener{
        implements OnClickListener, OnItemClickListener, OnCheckedChangeListener,
        PreferenceFragment.OnPreferenceStartFragmentCallback {
    private static final String TAG = DateTimeSettingsSetupWizard.class.getSimpleName();

    // force the first status of auto datetime flag.
    private static final String EXTRA_INITIAL_AUTO_DATETIME_VALUE =
            "extra_initial_auto_datetime_value";

    private boolean mXLargeScreenSize;
    // If we have enough screen real estate, we use a radically different layout with
    // big date and time pickers right on the screen, which requires very different handling.
    // Otherwise, we use the standard date time settings fragment.
    private boolean mUsingXLargeLayout;

    /* Available only in XL */
    private CompoundButton mAutoDateTimeButton;
@@ -74,20 +83,25 @@ public class DateTimeSettingsSetupWizard extends Activity
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.date_time_settings_setupwizard);
        mXLargeScreenSize = (getResources().getConfiguration().screenLayout
                & Configuration.SCREENLAYOUT_SIZE_MASK)
                >= Configuration.SCREENLAYOUT_SIZE_LARGE;
        if (mXLargeScreenSize) {

        // we know we've loaded the special xlarge layout because it has controls
        // not present in the standard layout
        mUsingXLargeLayout = findViewById(R.id.time_zone_button) != null;
        if (mUsingXLargeLayout) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
            initUiForXl();
        } else {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
            findViewById(R.id.next_button).setOnClickListener(this);
        }
    }
        mTimeZoneAdapter = ZonePicker.constructTimezoneAdapter(this, false,
            R.layout.date_time_setup_custom_list_item_2);

    public void initUiForXl() {
        final View layoutRoot = findViewById(R.id.layout_root);
        layoutRoot.setSystemUiVisibility(View.STATUS_BAR_DISABLE_BACK);
    }

    public void initUiForXl() {
        // Currently just comment out codes related to auto timezone.
        // TODO: Remove them when we are sure they are unnecessary.
        /*
@@ -98,16 +112,12 @@ public class DateTimeSettingsSetupWizard extends Activity
        mAutoTimeZoneButton.setText(autoTimeZoneEnabled ? R.string.zone_auto_summaryOn :
                R.string.zone_auto_summaryOff);*/

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);

        final TimeZone tz = TimeZone.getDefault();
        mSelectedTimeZone = tz;
        mTimeZoneButton = (Button)findViewById(R.id.time_zone_button);
        mTimeZoneButton.setText(tz.getDisplayName());
        // mTimeZoneButton.setText(DateTimeSettings.getTimeZoneText(tz));
        mTimeZoneButton.setOnClickListener(this);
        mTimeZoneAdapter = ZonePicker.constructTimezoneAdapter(this, false,
                R.layout.date_time_setup_custom_list_item_2);

        final boolean autoDateTimeEnabled;
        final Intent intent = getIntent();
@@ -158,22 +168,11 @@ public class DateTimeSettingsSetupWizard extends Activity
    public void onClick(View view) {
        switch (view.getId()) {
        case R.id.time_zone_button: {
            mTimeZonePopup = new ListPopupWindow(this, null);
            mTimeZonePopup.setWidth(mTimeZoneButton.getWidth());
            mTimeZonePopup.setAnchorView(mTimeZoneButton);
            mTimeZonePopup.setAdapter(mTimeZoneAdapter);
            mTimeZonePopup.setOnItemClickListener(this);
            mTimeZonePopup.setModal(true);
            mTimeZonePopup.show();
            showTimezonePicker(R.id.time_zone_button);
            break;
        }
        case R.id.next_button: {
            if (mXLargeScreenSize) {
                /* Settings.System.putInt(getContentResolver(), Settings.System.AUTO_TIME_ZONE,
                        mAutoTimeZoneButton.isChecked() ? 1 : 0); */
                Settings.System.putInt(getContentResolver(), Settings.System.AUTO_TIME,
                        mAutoDateTimeButton.isChecked() ? 1 : 0);

            if (mSelectedTimeZone != null) {
                final TimeZone systemTimeZone = TimeZone.getDefault();
                if (!systemTimeZone.equals(mSelectedTimeZone)) {
                    Log.i(TAG, "Another TimeZone is selected by a user. Changing system TimeZone.");
@@ -181,7 +180,10 @@ public class DateTimeSettingsSetupWizard extends Activity
                            getSystemService(Context.ALARM_SERVICE);
                    alarm.setTimeZone(mSelectedTimeZone.getID());
                }

            }
            if (mAutoDateTimeButton != null) {
                Settings.System.putInt(getContentResolver(), Settings.System.AUTO_TIME,
                      mAutoDateTimeButton.isChecked() ? 1 : 0);
                if (!mAutoDateTimeButton.isChecked()) {
                    DateTimeSettings.setDate(mDatePicker.getYear(), mDatePicker.getMonth(),
                            mDatePicker.getDayOfMonth());
@@ -203,7 +205,7 @@ public class DateTimeSettingsSetupWizard extends Activity
        final boolean autoEnabled = isChecked;  // just for readibility.
        /*if (buttonView == mAutoTimeZoneButton) {
            // In XL screen, we save all the state only when the next button is pressed.
            if (!mXLargeScreenSize) {
            if (!mUsingXLargeLayout) {
                Settings.System.putInt(getContentResolver(),
                        Settings.System.AUTO_TIME_ZONE,
                        isChecked ? 1 : 0);
@@ -233,18 +235,62 @@ public class DateTimeSettingsSetupWizard extends Activity
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        final TimeZone tz = ZonePicker.obtainTimeZoneFromItem(parent.getItemAtPosition(position));
        if (mUsingXLargeLayout) {
            mSelectedTimeZone = tz;

            final Calendar now = Calendar.getInstance(tz);
            if (mTimeZoneButton != null) {
                mTimeZoneButton.setText(tz.getDisplayName());
            }
            // mTimeZoneButton.setText(DateTimeSettings.getTimeZoneText(tz));
            mDatePicker.updateDate(now.get(Calendar.YEAR), now.get(Calendar.MONTH),
                    now.get(Calendar.DAY_OF_MONTH));
            mTimePicker.setCurrentHour(now.get(Calendar.HOUR_OF_DAY));
            mTimePicker.setCurrentMinute(now.get(Calendar.MINUTE));
        } else {
            // in prefs mode, we actually change the setting right now, as opposed to waiting
            // until Next is pressed in xLarge mode
            final AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            alarm.setTimeZone(tz.getID());
            DateTimeSettings settingsFragment = (DateTimeSettings) getFragmentManager().
                    findFragmentById(R.id.date_time_settings_fragment);
            settingsFragment.updateTimeAndDateDisplay(this);
        }
        mTimeZonePopup.dismiss();
    }

    /**
     * If this is called, that means we're in prefs style portrait mode for a large display
     * and the user has tapped on the time zone preference. If we were a PreferenceActivity,
     * we'd then launch the timezone fragment in a new activity, but we aren't, and here
     * on a tablet display, we really want more of a popup picker look' like the one we use
     * for the xlarge version of this activity. So we just take this opportunity to launch that.
     *
     * TODO: For phones, we might want to change this to do the "normal" opening
     * of the zonepicker fragment in its own activity. Or we might end up just
     * creating a separate DateTimeSettingsSetupWizardPhone activity that subclasses
     * PreferenceActivity in the first place to handle all that automatically.
     */
    @Override
    public boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) {
        showTimezonePicker(R.id.timezone_dropdown_anchor);
        return true;
    }

    private void showTimezonePicker(int anchorViewId) {
        View anchorView = findViewById(anchorViewId);
        if (anchorView == null) {
            Log.e(TAG, "Unable to find zone picker anchor view " + anchorViewId);
            return;
        }
        mTimeZonePopup = new ListPopupWindow(this, null);
        mTimeZonePopup.setWidth(anchorView.getWidth());
        mTimeZonePopup.setAnchorView(anchorView);
        mTimeZonePopup.setAdapter(mTimeZoneAdapter);
        mTimeZonePopup.setOnItemClickListener(this);
        mTimeZonePopup.setModal(true);
        mTimeZonePopup.show();
    }

    private boolean isAutoDateTimeEnabled() {
        try {
            return Settings.System.getInt(getContentResolver(), Settings.System.AUTO_TIME) > 0;
@@ -264,6 +310,9 @@ public class DateTimeSettingsSetupWizard extends Activity
    }*/

    private void updateTimeAndDateDisplay() {
        if (!mUsingXLargeLayout) {
            return;
        }
        final Calendar now = Calendar.getInstance();
        mTimeZoneButton.setText(now.getTimeZone().getDisplayName());
        mDatePicker.updateDate(now.get(Calendar.YEAR), now.get(Calendar.MONTH),