Created NumberGrid time picker

This commit is contained in:
Phillip Hsu 2016-07-21 18:52:03 -07:00
parent 886f10b06c
commit cf17ba5014
16 changed files with 521 additions and 1 deletions

View File

@ -321,7 +321,8 @@ public class EditAlarmActivity extends BaseActivity implements
// If we keep a reference to the dialog, we keep its previous state as well.
// So the next time we call show() on it, the input field will show the
// last inputted time.
NumpadTimePickerDialog.newInstance(this).show(getSupportFragmentManager(), TAG_TIME_PICKER);
// NumpadTimePickerDialog.newInstance(this).show(getSupportFragmentManager(), TAG_TIME_PICKER);
NumberGridTimePickerDialog.newInstance().show(getSupportFragmentManager(), TAG_TIME_PICKER);
}
private void setWeekDaysText() {

View File

@ -0,0 +1,112 @@
package com.philliphsu.clock2.editalarm;
import android.content.Context;
import android.support.v7.widget.GridLayout;
import android.text.format.DateFormat;
import android.util.AttributeSet;
import com.philliphsu.clock2.R;
/**
* Created by Phillip Hsu on 7/21/2016.
*/
public class NumberGrid extends GridLayout {
private static final String TAG = "NumberGrid";
private static final int COLUMNS = 3;
// private CircularIndicatorSetter mIndicatorSetter;
private OnNumberSelectedListener mSelectionListener;
// TODO: Since we plan to dynamically clear and inflate children into this
// parent to represent "pages", this seems useless? Since each page has at
// most one selection, and at any given time, this GridLayout can only show
// one page at a time. Instead, when the onNumberSelected() is fired, the
// hosting dialog should keep a reference to the returned number. It is up
// to the dialog to deduce what time field the number represents, probably
// with an int flag that indicates what "page" this GridLayout is displaying.
private int mSelection;
public interface OnNumberSelectedListener {
void onNumberSelected(int number);
}
public NumberGrid(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public NumberGrid(Context context) {
super(context);
init();
}
public void setOnNumberSelectedListener(OnNumberSelectedListener onNumberSelectedListener) {
mSelectionListener = onNumberSelectedListener;
}
// /*package*/ void setTheme(Context context, boolean themeDark) {
// for (int i = 0; i < getChildCount(); i++) {
// View view = getChildAt(i);
// if (view instanceof TextViewWithCircularIndicator) {
// TextViewWithCircularIndicator text = (TextViewWithCircularIndicator) getChildAt(i);
// text.setTheme(context, themeDark);
// }
// }
// }
public int getSelection() {
return mSelection;
}
public void setSelection(int value) {
mSelection = value;
// for (int i = 0; i < getChildCount(); i++) {
// View v = getChildAt(i);
// if (v instanceof TextViewWithCircularIndicator) {
// TextViewWithCircularIndicator text = (TextViewWithCircularIndicator) v;
// // parseInt() strips out leading zeroes
// int num = Integer.parseInt(text.getText().toString());
// if (value == num) {
// mIndicatorSetter.setIndicator(text);
// break;
// }
// } else {
// // We have reached a non-numeric button, i.e. the minute tuners, unless you have
// // other non-numeric buttons as well. This means we iterated through all numeric
// // buttons, but this value is not one of the preset values.
// // Clear the indicator from the default selection.
// mIndicatorSetter.setIndicator(null);
// break;
// }
// }
}
/**
* Final because this is implemented for the grid of numbers. If subclasses need their own
* click listeners for non-numeric buttons, they should set new OnClickListeners on those buttons.
*/
// @Override
// public final void onClick(View v) {
// TextViewWithCircularIndicator view = (TextViewWithCircularIndicator) v;
// String text = view.getText().toString();
// int number = Integer.parseInt(text);
// mSelection = number;
// fireOnNumberSelectedEvent(number);
// mIndicatorSetter.setIndicator(view);
// }
protected void fireOnNumberSelectedEvent(int number) {
if (mSelectionListener != null)
mSelectionListener.onNumberSelected(number);
}
private void init() {
// setAlignmentMode(ALIGN_BOUNDS);
setColumnCount(COLUMNS);
// When we initialize, display the hour values "page".
int layout = DateFormat.is24HourFormat(getContext())
? R.layout.content_24h_number_grid
: R.layout.content_12h_number_grid;
inflate(getContext(), layout, this);
// ButterKnife.bind(this);
}
}

View File

@ -0,0 +1,46 @@
package com.philliphsu.clock2.editalarm;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import com.philliphsu.clock2.R;
/**
* Created by Phillip Hsu on 7/21/2016.
*
* AppCompat-themed AlertDialog.
*/
public class NumberGridTimePickerDialog extends DialogFragment {
public static NumberGridTimePickerDialog newInstance() {
return new NumberGridTimePickerDialog();
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use an AlertDialog to display footer buttons, rather than
// re-invent them in our layout.
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(R.layout.dialog_time_picker_number_grid)
// The action strings are already defined and localized by the system!
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
return builder.create();
// return super.onCreateDialog(savedInstanceState);
}
}

View File

@ -0,0 +1,61 @@
package com.philliphsu.clock2.editalarm;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.Gravity;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.philliphsu.clock2.R;
import butterknife.Bind;
import butterknife.ButterKnife;
/**
* Created by Phillip Hsu on 7/21/2016.
*/
public class TwentyFourHourGridItem extends LinearLayout {
@Bind(R.id.primary) TextView mPrimaryText;
@Bind(R.id.secondary) TextView mSecondaryText;
public TwentyFourHourGridItem(Context context) {
super(context);
init();
}
public TwentyFourHourGridItem(Context context, AttributeSet attrs) {
super(context, attrs);
init();
TypedArray a = context.getTheme().obtainStyledAttributes(attrs,
R.styleable.TwentyFourHourGridItem, 0, 0);
try {
setPrimaryText(a.getString(R.styleable.TwentyFourHourGridItem_primaryText));
setSecondaryText(a.getString(R.styleable.TwentyFourHourGridItem_secondaryText));
} finally {
a.recycle();
}
}
public void setPrimaryText(CharSequence text) {
mPrimaryText.setText(text);
}
public void setSecondaryText(CharSequence text) {
mSecondaryText.setText(text);
}
public void swapTexts() {
CharSequence primary = mPrimaryText.getText();
setPrimaryText(mSecondaryText.getText());
setSecondaryText(primary);
}
private void init() {
setOrientation(VERTICAL);
setGravity(Gravity.CENTER);
inflate(getContext(), R.layout.element_24h_number_grid, this);
ButterKnife.bind(this);
}
}

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#8c8c8c"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM17,13h-4v4h-2v-4L7,13v-2h4L11,7h2v4h4v2z"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFF"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM17,13h-4v4h-2v-4L7,13v-2h4L11,7h2v4h4v2z"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#8c8c8c"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM17,13L7,13v-2h10v2z"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFF"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM17,13L7,13v-2h10v2z"/>
</vector>

View File

@ -0,0 +1,80 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!-- TODO: Define another style with LWW and LHW -->
<!-- TODO: Use a fixed height so the circular indicator doesn't stretch into an oval. -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/GridLayoutNumpadButton"
app:layout_gravity="center"
android:text="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/GridLayoutNumpadButton"
app:layout_gravity="center"
android:text="2"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/GridLayoutNumpadButton"
app:layout_gravity="center"
android:text="3"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/GridLayoutNumpadButton"
app:layout_gravity="center"
android:text="4"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/GridLayoutNumpadButton"
app:layout_gravity="center"
android:text="5"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/GridLayoutNumpadButton"
app:layout_gravity="center"
android:text="6"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/GridLayoutNumpadButton"
app:layout_gravity="center"
android:text="7"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/GridLayoutNumpadButton"
app:layout_gravity="center"
android:text="8"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/GridLayoutNumpadButton"
app:layout_gravity="center"
android:text="9"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/GridLayoutNumpadButton"
app:layout_gravity="center"
android:text="10"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/GridLayoutNumpadButton"
app:layout_gravity="center"
android:text="11"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/GridLayoutNumpadButton"
app:layout_gravity="center"
android:text="12"/>
</merge>

View File

@ -0,0 +1,91 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!-- TODO: Define a grid item style with the first 3 attrs-->
<com.philliphsu.clock2.editalarm.TwentyFourHourGridItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_gravity="center"
style="@style/GridLayoutNumpadElement"
app:primaryText="00"
app:secondaryText="12"/>
<com.philliphsu.clock2.editalarm.TwentyFourHourGridItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_gravity="center"
style="@style/GridLayoutNumpadElement"
app:primaryText="01"
app:secondaryText="13"/>
<com.philliphsu.clock2.editalarm.TwentyFourHourGridItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_gravity="center"
style="@style/GridLayoutNumpadElement"
app:primaryText="02"
app:secondaryText="14"/>
<com.philliphsu.clock2.editalarm.TwentyFourHourGridItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_gravity="center"
style="@style/GridLayoutNumpadElement"
app:primaryText="03"
app:secondaryText="15"/>
<com.philliphsu.clock2.editalarm.TwentyFourHourGridItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_gravity="center"
style="@style/GridLayoutNumpadElement"
app:primaryText="04"
app:secondaryText="16"/>
<com.philliphsu.clock2.editalarm.TwentyFourHourGridItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_gravity="center"
style="@style/GridLayoutNumpadElement"
app:primaryText="05"
app:secondaryText="17"/>
<com.philliphsu.clock2.editalarm.TwentyFourHourGridItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_gravity="center"
style="@style/GridLayoutNumpadElement"
app:primaryText="06"
app:secondaryText="18"/>
<com.philliphsu.clock2.editalarm.TwentyFourHourGridItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_gravity="center"
style="@style/GridLayoutNumpadElement"
app:primaryText="07"
app:secondaryText="19"/>
<com.philliphsu.clock2.editalarm.TwentyFourHourGridItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_gravity="center"
style="@style/GridLayoutNumpadElement"
app:primaryText="08"
app:secondaryText="20"/>
<com.philliphsu.clock2.editalarm.TwentyFourHourGridItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_gravity="center"
style="@style/GridLayoutNumpadElement"
app:primaryText="09"
app:secondaryText="21"/>
<com.philliphsu.clock2.editalarm.TwentyFourHourGridItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_gravity="center"
style="@style/GridLayoutNumpadElement"
app:primaryText="10"
app:secondaryText="22"/>
<com.philliphsu.clock2.editalarm.TwentyFourHourGridItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_gravity="center"
style="@style/GridLayoutNumpadElement"
app:primaryText="11"
app:secondaryText="23"/>
</merge>

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<include layout="@layout/element_number_grid"/>
<include layout="@layout/element_number_grid"/>
<include layout="@layout/element_number_grid"/>
<include layout="@layout/element_number_grid"/>
<include layout="@layout/element_number_grid"/>
<include layout="@layout/element_number_grid"/>
<include layout="@layout/element_number_grid"/>
<include layout="@layout/element_number_grid"/>
<include layout="@layout/element_number_grid"/>
<include layout="@layout/element_number_grid"/>
<include layout="@layout/element_number_grid"/>
<include layout="@layout/element_number_grid"/>
<!-- TODO: Use fixed width and height -->
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/GridLayoutNumpadElement"
android:src="@drawable/ic_minus_circle_24dp"
app:layout_column="1"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/GridLayoutNumpadElement"
android:src="@drawable/ic_add_circle_24dp"
app:layout_column="2"/>
</merge>

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.philliphsu.clock2.editalarm.NumberGrid
android:id="@+id/grid"
android:layout_width="match_parent"
android:layout_height="@dimen/numpad_height"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_below="@id/grid">
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="AM"/>
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="PM"/>
</LinearLayout>
</RelativeLayout>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/primary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/colorPrimary"
android:textSize="@dimen/grid_element_text_size"/>
<TextView
android:id="@+id/secondary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</merge>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/GridLayoutNumpadButton"
android:text="1"
xmlns:android="http://schemas.android.com/apk/res/android"/>

View File

@ -9,4 +9,9 @@
<attr name="metaButtonBarButtonStyle" format="reference"/>
</declare-styleable>
<declare-styleable name="TwentyFourHourGridItem">
<attr name="primaryText" format="string"/>
<attr name="secondaryText" format="string"/>
</declare-styleable>
</resources>

View File

@ -26,6 +26,7 @@
<item name="android:textSize">@dimen/grid_element_text_size</item>
</style>
<!-- TODO: Rename to GridLayoutElement -->
<style name="GridLayoutNumpadElement">
<!-- http://stackoverflow.com/a/6868308/5055032
Leave off the namespace to reference a custom attribute.
@ -35,6 +36,7 @@
<item name="android:background">?android:attr/selectableItemBackground</item>
</style>
<!-- TODO: Rename to GridLayout[Text/Button/TextView]? -->
<style name="GridLayoutNumpadButton" parent="GridLayoutNumpadElement">
<item name="android:textSize">@dimen/grid_element_text_size</item>
</style>