summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/DynamicGridSizeFragment.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/launcher3/DynamicGridSizeFragment.java')
-rw-r--r--src/com/android/launcher3/DynamicGridSizeFragment.java381
1 files changed, 381 insertions, 0 deletions
diff --git a/src/com/android/launcher3/DynamicGridSizeFragment.java b/src/com/android/launcher3/DynamicGridSizeFragment.java
new file mode 100644
index 000000000..103d660dd
--- /dev/null
+++ b/src/com/android/launcher3/DynamicGridSizeFragment.java
@@ -0,0 +1,381 @@
+/*
+ * Copyright (C) 2014 The CyanogenMod 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.launcher3;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.app.Dialog;
+import android.app.Fragment;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.os.Bundle;
+import android.util.AttributeSet;
+import android.util.DisplayMetrics;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.Button;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.NumberPicker;
+import android.widget.TextView;
+import com.android.launcher3.settings.SettingsProvider;
+
+public class DynamicGridSizeFragment extends Fragment
+ implements NumberPicker.OnValueChangeListener, Dialog.OnDismissListener {
+ public static final String DYNAMIC_GRID_SIZE_FRAGMENT = "DynamicGridSizeFragment";
+
+ public static final int MIN_DYNAMIC_GRID_ROWS = 2;
+ public static final int MIN_DYNAMIC_GRID_COLUMNS = 3;
+
+ GridSizeView mDynamicGrid;
+
+ ListView mListView;
+ View mCurrentSelection;
+ GridSizeAdapter mAdapter;
+ InvariantDeviceProfile.GridSize mCurrentSize;
+
+ Dialog mDialog;
+
+ int mCustomGridRows = 0;
+ int mCustomGridColumns = 0;
+
+ View.OnClickListener mSettingsItemListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mCurrentSize = InvariantDeviceProfile.GridSize.getModeForValue((Integer) v.getTag());
+
+ setCleared(mCurrentSelection);
+ setSelected(v);
+ mCurrentSelection = v;
+
+ if (mCurrentSize == InvariantDeviceProfile.GridSize.Custom) {
+ showNumberPicker();
+ }
+
+ ((GridSizeAdapter) mListView.getAdapter()).notifyDataSetChanged();
+
+ mAdapter.notifyDataSetInvalidated();
+ updateGridMetrics();
+ }
+ };
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View v = inflater.inflate(R.layout.dynamic_grid_size_screen, container, false);
+ mDynamicGrid = (GridSizeView) v.findViewById(R.id.dynamic_grid_size_image);
+ mListView = (ListView) v.findViewById(R.id.dynamic_grid_list);
+
+ Launcher launcher = (Launcher) getActivity();
+ LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)
+ mListView.getLayoutParams();
+ lp.bottomMargin = ((FrameLayout.LayoutParams) launcher.getOverviewPanel()
+ .findViewById(R.id.settings_container).getLayoutParams()).bottomMargin;
+ mListView.setLayoutParams(lp);
+
+ LinearLayout titleLayout = (LinearLayout) v.findViewById(R.id.dynamic_grid_title);
+ titleLayout.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ setSize();
+ }
+ });
+
+ mCurrentSize = InvariantDeviceProfile.GridSize.getModeForValue(
+ SettingsProvider.getIntCustomDefault(getActivity(),
+ SettingsProvider.SETTINGS_UI_DYNAMIC_GRID_SIZE, 0));
+
+ InvariantDeviceProfile grid = getInvariantDeviceProfile();
+ mCustomGridRows = grid.numRows;
+ mCustomGridColumns = grid.numColumns;
+
+ updateGridMetrics();
+
+ Resources res = getResources();
+ int[] valueResIds = {
+ R.string.grid_size_comfortable,
+ R.string.grid_size_cozy,
+ R.string.grid_size_condensed,
+ R.string.grid_size_custom
+ };
+ mAdapter = new GridSizeAdapter(getActivity(), valueResIds);
+ mListView.setAdapter(mAdapter);
+
+ // RTL
+ ImageView navPrev = (ImageView) v.findViewById(R.id.nav_prev);
+ Configuration config = getResources().getConfiguration();
+ if (config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
+ navPrev.setImageResource(R.drawable.ic_navigation_next);
+ }
+
+ return v;
+ }
+
+ private void updateGridMetrics() {
+ if (mCurrentSize == InvariantDeviceProfile.GridSize.Custom) {
+ mDynamicGrid.setMetrics(mCustomGridRows, mCustomGridColumns);
+ } else {
+ InvariantDeviceProfile grid = getInvariantDeviceProfile();
+ mDynamicGrid.setMetrics(grid.numRowsBase + mCurrentSize.getValue(),
+ grid.numColumnsBase + mCurrentSize.getValue());
+ }
+ }
+
+ @Override
+ public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) {
+ if (enter) {
+ DisplayMetrics displaymetrics = new DisplayMetrics();
+ getActivity().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
+ int width = displaymetrics.widthPixels;
+ Configuration config = getResources().getConfiguration();
+ final ObjectAnimator anim;
+ if (config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
+ anim = ObjectAnimator.ofFloat(this, "translationX", -width, 0);
+ } else {
+ anim = ObjectAnimator.ofFloat(this, "translationX", width, 0);
+ }
+
+ final View darkPanel = ((Launcher) getActivity()).getDarkPanel();
+ darkPanel.setVisibility(View.VISIBLE);
+ ObjectAnimator anim2 = ObjectAnimator.ofFloat(darkPanel, "alpha", 0.0f, 0.3f);
+ anim2.start();
+
+ anim.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd (Animator animation) {
+ darkPanel.setVisibility(View.GONE);
+ }
+ });
+
+ return anim;
+ } else {
+ return super.onCreateAnimator(transit, enter, nextAnim);
+ }
+ }
+
+ public void setSize() {
+ ((Launcher) getActivity()).setDynamicGridSize(mCurrentSize);
+ }
+
+ private void setSelected(View v) {
+ v.setBackgroundColor(Color.WHITE);
+ TextView t = (TextView) v.findViewById(R.id.item_name);
+ t.setTextColor(getResources().getColor(R.color.settings_bg_color));
+ }
+
+ private void setCleared(View v) {
+ v.setBackgroundColor(getResources().getColor(R.color.settings_bg_color));
+ TextView t = (TextView) v.findViewById(R.id.item_name);
+ t.setTextColor(Color.WHITE);
+ }
+
+ private void showNumberPicker() {
+ mDialog = new Dialog(getActivity());
+ mDialog.setTitle(getResources().getString(
+ R.string.preferences_interface_homescreen_custom));
+ mDialog.setContentView(R.layout.custom_grid_size_dialog);
+
+ NumberPicker nPRows = (NumberPicker) mDialog.findViewById(R.id.custom_rows);
+ NumberPicker nPColumns = (NumberPicker) mDialog.findViewById(R.id.custom_columns);
+
+ InvariantDeviceProfile grid = getInvariantDeviceProfile();
+ int rows = grid.numRowsBase;
+ int columns = grid.numColumnsBase;
+
+ nPRows.setMinValue(Math.max(MIN_DYNAMIC_GRID_ROWS, rows - InvariantDeviceProfile.GRID_SIZE_MIN));
+ nPRows.setMaxValue(rows + InvariantDeviceProfile.GRID_SIZE_MAX);
+ nPRows.setValue(mCustomGridRows);
+ nPRows.setWrapSelectorWheel(false);
+ nPRows.setOnValueChangedListener(this);
+ nPRows.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
+
+ nPColumns.setMinValue(Math.max(MIN_DYNAMIC_GRID_COLUMNS,
+ columns - InvariantDeviceProfile.GRID_SIZE_MIN));
+ nPColumns.setMaxValue(columns + InvariantDeviceProfile.GRID_SIZE_MAX);
+ nPColumns.setValue(mCustomGridColumns);
+ nPColumns.setWrapSelectorWheel(false);
+ nPColumns.setOnValueChangedListener(this);
+ nPColumns.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
+
+ Button button = (Button) mDialog.findViewById(R.id.dialog_confirm_button);
+ button.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mDialog != null) {
+ mDialog.dismiss();
+ }
+ }
+ });
+
+ mDialog.setOnDismissListener(this);
+ mDialog.show();
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ if (mDialog != null) {
+ mDialog.dismiss();
+ }
+ }
+
+ @Override
+ public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
+ if (picker.getId() == R.id.custom_rows) {
+ mCustomGridRows = newVal;
+ } else if (picker.getId() == R.id.custom_columns) {
+ mCustomGridColumns = newVal;
+ }
+ }
+
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ SettingsProvider.putInt(getActivity(),
+ SettingsProvider.SETTINGS_UI_HOMESCREEN_ROWS, mCustomGridRows);
+ SettingsProvider.putInt(getActivity(),
+ SettingsProvider.SETTINGS_UI_HOMESCREEN_COLUMNS, mCustomGridColumns);
+
+ mAdapter.notifyDataSetInvalidated();
+ mDynamicGrid.setMetrics(mCustomGridRows, mCustomGridColumns);
+ }
+
+ private class GridSizeAdapter extends BaseAdapter {
+ Context mContext;
+ int[] mTitleResIds;
+
+ public GridSizeAdapter(Context context, int[] resIds) {
+ mContext = context;
+ mTitleResIds = resIds;
+ }
+
+ @Override
+ public int getCount() {
+ return mTitleResIds.length;
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return mContext.getString(mTitleResIds[position]);
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ if (convertView == null) {
+ LayoutInflater inflater = (LayoutInflater)
+ mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ convertView = inflater.inflate(R.layout.settings_pane_list_item, parent, false);
+ }
+
+ TextView textView = (TextView) convertView.findViewById(R.id.item_name);
+
+ // RTL
+ Configuration config = getResources().getConfiguration();
+ if (config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
+ textView.setGravity(Gravity.RIGHT);
+ }
+
+ // Set selected state
+ if (position == mCurrentSize.getValue()) {
+ if (mCurrentSelection != null) {
+ setCleared(mCurrentSelection);
+ }
+ mCurrentSelection = convertView;
+ setSelected(mCurrentSelection);
+ }
+
+ if (position == InvariantDeviceProfile.GridSize.Custom.getValue()) {
+ InvariantDeviceProfile grid = getInvariantDeviceProfile();
+
+ int rows = SettingsProvider.getIntCustomDefault(getActivity(),
+ SettingsProvider.SETTINGS_UI_HOMESCREEN_ROWS, grid.numRowsBase);
+ int columns = SettingsProvider.getIntCustomDefault(getActivity(),
+ SettingsProvider.SETTINGS_UI_HOMESCREEN_COLUMNS, grid.numColumnsBase);
+ textView.setText(mContext.getString(mTitleResIds[position], rows, columns));
+ } else {
+ textView.setText(mTitleResIds[position]);
+ }
+
+ convertView.setOnClickListener(mSettingsItemListener);
+ convertView.setTag(position);
+ return convertView;
+ }
+ }
+
+ private InvariantDeviceProfile getInvariantDeviceProfile() {
+ LauncherAppState app = LauncherAppState.getInstance();
+ return app.getInvariantDeviceProfile();
+ }
+
+ private static class GridSizeView extends View {
+ private int mRows = 0, mColumns = 0;
+ private Paint mForegroundPaint;
+ private int mBackgroundColor;
+
+ public GridSizeView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ Resources res = context.getResources();
+
+ mForegroundPaint = new Paint();
+ mForegroundPaint.setColor(res.getColor(R.color.dynamic_grid_preview_foreground));
+ mBackgroundColor = res.getColor(R.color.dynamic_grid_preview_background);
+ }
+
+ public void setMetrics(int rows, int columns) {
+ mRows = rows;
+ mColumns = columns;
+ invalidate();
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ float width = getWidth() - getPaddingLeft() - getPaddingRight();
+ float height = getHeight() - getPaddingTop() - getPaddingBottom();
+ float xOffset = getPaddingLeft();
+ float yOffset = getPaddingTop();
+
+ canvas.drawColor(mBackgroundColor);
+
+ // Draw rows
+ for (int i = 1; i < mRows; i++) {
+ float yPos = yOffset + height / mRows * i;
+ canvas.drawLine(xOffset, yPos, xOffset + width, yPos, mForegroundPaint);
+ }
+
+ // Draw columns
+ for (int j = 1; j < mColumns; j++) {
+ float xPos = xOffset + width / mColumns * j;
+ canvas.drawLine(xPos, yOffset, xPos, yOffset + height, mForegroundPaint);
+ }
+ }
+ }
+}