Messaging: Vendor chips, colorpicker, photoviewer, and vcard in-tree
Clone no longer depends on LineageOS gitlinks; the libraries used by the app live in this repo. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Submodule modules/colorpicker deleted from 34d5137f88
@@ -0,0 +1,2 @@
|
||||
bin/
|
||||
gen/
|
||||
@@ -0,0 +1,27 @@
|
||||
// Copyright (C) 2013 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 {
|
||||
default_applicable_licenses: ["Android-Apache-2.0"],
|
||||
}
|
||||
|
||||
android_library {
|
||||
name: "colorpicker",
|
||||
sdk_version: "15",
|
||||
srcs: [
|
||||
"src/**/*.java",
|
||||
"src/**/*.logtags",
|
||||
],
|
||||
resource_dirs: ["res"],
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2013 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.
|
||||
-->
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.android.colorpicker"
|
||||
android:versionCode="1"
|
||||
android:versionName="1.0" >
|
||||
</manifest>
|
||||
@@ -0,0 +1,25 @@
|
||||
plugins {
|
||||
id 'com.android.library'
|
||||
}
|
||||
|
||||
android {
|
||||
namespace 'com.android.colorpicker'
|
||||
compileSdk 35
|
||||
|
||||
defaultConfig {
|
||||
minSdk 33
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_17
|
||||
targetCompatibility JavaVersion.VERSION_17
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
manifest.srcFile 'AndroidManifest.xml'
|
||||
java.srcDirs = ['src']
|
||||
res.srcDirs = ['res']
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
# This file is automatically generated by Android Tools.
|
||||
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
||||
#
|
||||
# This file must be checked in Version Control Systems.
|
||||
#
|
||||
# To customize properties used by the Ant build system edit
|
||||
# "ant.properties", and override values to adapt the script to your
|
||||
# project structure.
|
||||
#
|
||||
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
||||
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
|
||||
|
||||
# Project target.
|
||||
target=android-15
|
||||
android.library=true
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 2.4 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.6 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 3.2 KiB |
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2013 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.
|
||||
-->
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" />
|
||||
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2013 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.
|
||||
-->
|
||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center" >
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:gravity="center"
|
||||
android:padding="28dp" >
|
||||
|
||||
<ProgressBar
|
||||
android:id="@android:id/progress"
|
||||
style="?android:attr/progressBarStyleLarge"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center" />
|
||||
|
||||
<com.android.colorpicker.ColorPickerPalette
|
||||
android:id="@+id/color_picker"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:visibility="gone" />
|
||||
</FrameLayout>
|
||||
</ScrollView>
|
||||
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2013 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.
|
||||
-->
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<ImageView
|
||||
android:id="@+id/color_picker_swatch"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
<ImageView
|
||||
android:id="@+id/color_picker_checkmark"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:src="@drawable/ic_colorpicker_swatch_selected"
|
||||
android:scaleType="fitXY"
|
||||
android:visibility="gone" />
|
||||
</merge>
|
||||
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2013 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.
|
||||
-->
|
||||
<resources>
|
||||
<dimen name="color_swatch_large">64dip</dimen>
|
||||
<dimen name="color_swatch_small">48dip</dimen>
|
||||
<dimen name="color_swatch_margins_large">8dip</dimen>
|
||||
<dimen name="color_swatch_margins_small">4dip</dimen>
|
||||
</resources>
|
||||
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2013 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.
|
||||
-->
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<!-- Default title for color picker dialog [CHAR LIMIT=30] -->
|
||||
<string name="color_picker_default_title">Select a Color</string>
|
||||
<!-- Content description for a color square. -->
|
||||
<string name="color_swatch_description">Color <xliff:g id="color_index" example="14">%1$d</xliff:g></string>
|
||||
<!-- Content description for a selected color square. -->
|
||||
<string name="color_swatch_description_selected">Color <xliff:g id="color_index" example="14">%1$d</xliff:g> selected</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,213 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.colorpicker;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.app.Dialog;
|
||||
import android.app.DialogFragment;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.ProgressBar;
|
||||
|
||||
import com.android.colorpicker.ColorPickerSwatch.OnColorSelectedListener;
|
||||
|
||||
/**
|
||||
* A dialog which takes in as input an array of colors and creates a palette allowing the user to
|
||||
* select a specific color swatch, which invokes a listener.
|
||||
*/
|
||||
public class ColorPickerDialog extends DialogFragment implements OnColorSelectedListener {
|
||||
|
||||
public static final int SIZE_LARGE = 1;
|
||||
public static final int SIZE_SMALL = 2;
|
||||
|
||||
protected AlertDialog mAlertDialog;
|
||||
|
||||
protected static final String KEY_TITLE_ID = "title_id";
|
||||
protected static final String KEY_COLORS = "colors";
|
||||
protected static final String KEY_COLOR_CONTENT_DESCRIPTIONS = "color_content_descriptions";
|
||||
protected static final String KEY_SELECTED_COLOR = "selected_color";
|
||||
protected static final String KEY_COLUMNS = "columns";
|
||||
protected static final String KEY_SIZE = "size";
|
||||
|
||||
protected int mTitleResId = R.string.color_picker_default_title;
|
||||
protected int[] mColors = null;
|
||||
protected String[] mColorContentDescriptions = null;
|
||||
protected int mSelectedColor;
|
||||
protected int mColumns;
|
||||
protected int mSize;
|
||||
|
||||
private ColorPickerPalette mPalette;
|
||||
private ProgressBar mProgress;
|
||||
|
||||
protected OnColorSelectedListener mListener;
|
||||
|
||||
public ColorPickerDialog() {
|
||||
// Empty constructor required for dialog fragments.
|
||||
}
|
||||
|
||||
public static ColorPickerDialog newInstance(int titleResId, int[] colors, int selectedColor,
|
||||
int columns, int size) {
|
||||
ColorPickerDialog ret = new ColorPickerDialog();
|
||||
ret.initialize(titleResId, colors, selectedColor, columns, size);
|
||||
return ret;
|
||||
}
|
||||
|
||||
public void initialize(int titleResId, int[] colors, int selectedColor, int columns, int size) {
|
||||
setArguments(titleResId, columns, size);
|
||||
setColors(colors, selectedColor);
|
||||
}
|
||||
|
||||
public void setArguments(int titleResId, int columns, int size) {
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putInt(KEY_TITLE_ID, titleResId);
|
||||
bundle.putInt(KEY_COLUMNS, columns);
|
||||
bundle.putInt(KEY_SIZE, size);
|
||||
setArguments(bundle);
|
||||
}
|
||||
|
||||
public void setOnColorSelectedListener(OnColorSelectedListener listener) {
|
||||
mListener = listener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
if (getArguments() != null) {
|
||||
mTitleResId = getArguments().getInt(KEY_TITLE_ID);
|
||||
mColumns = getArguments().getInt(KEY_COLUMNS);
|
||||
mSize = getArguments().getInt(KEY_SIZE);
|
||||
}
|
||||
|
||||
if (savedInstanceState != null) {
|
||||
mColors = savedInstanceState.getIntArray(KEY_COLORS);
|
||||
mSelectedColor = (Integer) savedInstanceState.getSerializable(KEY_SELECTED_COLOR);
|
||||
mColorContentDescriptions = savedInstanceState.getStringArray(
|
||||
KEY_COLOR_CONTENT_DESCRIPTIONS);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
final Activity activity = getActivity();
|
||||
|
||||
View view = LayoutInflater.from(getActivity()).inflate(R.layout.color_picker_dialog, null);
|
||||
mProgress = (ProgressBar) view.findViewById(android.R.id.progress);
|
||||
mPalette = (ColorPickerPalette) view.findViewById(R.id.color_picker);
|
||||
mPalette.init(mSize, mColumns, this);
|
||||
|
||||
if (mColors != null) {
|
||||
showPaletteView();
|
||||
}
|
||||
|
||||
mAlertDialog = new AlertDialog.Builder(activity)
|
||||
.setTitle(mTitleResId)
|
||||
.setView(view)
|
||||
.create();
|
||||
|
||||
return mAlertDialog;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onColorSelected(int color) {
|
||||
if (mListener != null) {
|
||||
mListener.onColorSelected(color);
|
||||
}
|
||||
|
||||
if (getTargetFragment() instanceof OnColorSelectedListener) {
|
||||
final OnColorSelectedListener listener =
|
||||
(OnColorSelectedListener) getTargetFragment();
|
||||
listener.onColorSelected(color);
|
||||
}
|
||||
|
||||
if (color != mSelectedColor) {
|
||||
mSelectedColor = color;
|
||||
// Redraw palette to show checkmark on newly selected color before dismissing.
|
||||
mPalette.drawPalette(mColors, mSelectedColor);
|
||||
}
|
||||
|
||||
dismiss();
|
||||
}
|
||||
|
||||
public void showPaletteView() {
|
||||
if (mProgress != null && mPalette != null) {
|
||||
mProgress.setVisibility(View.GONE);
|
||||
refreshPalette();
|
||||
mPalette.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
public void showProgressBarView() {
|
||||
if (mProgress != null && mPalette != null) {
|
||||
mProgress.setVisibility(View.VISIBLE);
|
||||
mPalette.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
public void setColors(int[] colors, int selectedColor) {
|
||||
if (mColors != colors || mSelectedColor != selectedColor) {
|
||||
mColors = colors;
|
||||
mSelectedColor = selectedColor;
|
||||
refreshPalette();
|
||||
}
|
||||
}
|
||||
|
||||
public void setColors(int[] colors) {
|
||||
if (mColors != colors) {
|
||||
mColors = colors;
|
||||
refreshPalette();
|
||||
}
|
||||
}
|
||||
|
||||
public void setSelectedColor(int color) {
|
||||
if (mSelectedColor != color) {
|
||||
mSelectedColor = color;
|
||||
refreshPalette();
|
||||
}
|
||||
}
|
||||
|
||||
public void setColorContentDescriptions(String[] colorContentDescriptions) {
|
||||
if (mColorContentDescriptions != colorContentDescriptions) {
|
||||
mColorContentDescriptions = colorContentDescriptions;
|
||||
refreshPalette();
|
||||
}
|
||||
}
|
||||
|
||||
private void refreshPalette() {
|
||||
if (mPalette != null && mColors != null) {
|
||||
mPalette.drawPalette(mColors, mSelectedColor, mColorContentDescriptions);
|
||||
}
|
||||
}
|
||||
|
||||
public int[] getColors() {
|
||||
return mColors;
|
||||
}
|
||||
|
||||
public int getSelectedColor() {
|
||||
return mSelectedColor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
outState.putIntArray(KEY_COLORS, mColors);
|
||||
outState.putSerializable(KEY_SELECTED_COLOR, mSelectedColor);
|
||||
outState.putStringArray(KEY_COLOR_CONTENT_DESCRIPTIONS, mColorContentDescriptions);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,194 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.colorpicker;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TableLayout;
|
||||
import android.widget.TableRow;
|
||||
|
||||
import com.android.colorpicker.ColorPickerSwatch.OnColorSelectedListener;
|
||||
|
||||
/**
|
||||
* A color picker custom view which creates an grid of color squares. The number of squares per
|
||||
* row (and the padding between the squares) is determined by the user.
|
||||
*/
|
||||
public class ColorPickerPalette extends TableLayout {
|
||||
|
||||
public OnColorSelectedListener mOnColorSelectedListener;
|
||||
|
||||
private String mDescription;
|
||||
private String mDescriptionSelected;
|
||||
|
||||
private int mSwatchLength;
|
||||
private int mMarginSize;
|
||||
private int mNumColumns;
|
||||
|
||||
public ColorPickerPalette(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
public ColorPickerPalette(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the size, columns, and listener. Size should be a pre-defined size (SIZE_LARGE
|
||||
* or SIZE_SMALL) from ColorPickerDialogFragment.
|
||||
*/
|
||||
public void init(int size, int columns, OnColorSelectedListener listener) {
|
||||
mNumColumns = columns;
|
||||
Resources res = getResources();
|
||||
if (size == ColorPickerDialog.SIZE_LARGE) {
|
||||
mSwatchLength = res.getDimensionPixelSize(R.dimen.color_swatch_large);
|
||||
mMarginSize = res.getDimensionPixelSize(R.dimen.color_swatch_margins_large);
|
||||
} else {
|
||||
mSwatchLength = res.getDimensionPixelSize(R.dimen.color_swatch_small);
|
||||
mMarginSize = res.getDimensionPixelSize(R.dimen.color_swatch_margins_small);
|
||||
}
|
||||
mOnColorSelectedListener = listener;
|
||||
|
||||
mDescription = res.getString(R.string.color_swatch_description);
|
||||
mDescriptionSelected = res.getString(R.string.color_swatch_description_selected);
|
||||
}
|
||||
|
||||
private TableRow createTableRow() {
|
||||
TableRow row = new TableRow(getContext());
|
||||
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,
|
||||
LayoutParams.WRAP_CONTENT);
|
||||
row.setLayoutParams(params);
|
||||
return row;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds swatches to table in a serpentine format.
|
||||
*/
|
||||
public void drawPalette(int[] colors, int selectedColor) {
|
||||
drawPalette(colors, selectedColor, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds swatches to table in a serpentine format.
|
||||
*/
|
||||
public void drawPalette(int[] colors, int selectedColor, String[] colorContentDescriptions) {
|
||||
if (colors == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.removeAllViews();
|
||||
int tableElements = 0;
|
||||
int rowElements = 0;
|
||||
int rowNumber = 0;
|
||||
|
||||
// Fills the table with swatches based on the array of colors.
|
||||
TableRow row = createTableRow();
|
||||
for (int color : colors) {
|
||||
View colorSwatch = createColorSwatch(color, selectedColor);
|
||||
setSwatchDescription(rowNumber, tableElements, rowElements, color == selectedColor,
|
||||
colorSwatch, colorContentDescriptions);
|
||||
addSwatchToRow(row, colorSwatch, rowNumber);
|
||||
|
||||
tableElements++;
|
||||
rowElements++;
|
||||
if (rowElements == mNumColumns) {
|
||||
addView(row);
|
||||
row = createTableRow();
|
||||
rowElements = 0;
|
||||
rowNumber++;
|
||||
}
|
||||
}
|
||||
|
||||
// Create blank views to fill the row if the last row has not been filled.
|
||||
if (rowElements > 0) {
|
||||
while (rowElements != mNumColumns) {
|
||||
addSwatchToRow(row, createBlankSpace(), rowNumber);
|
||||
rowElements++;
|
||||
}
|
||||
addView(row);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends a swatch to the end of the row for even-numbered rows (starting with row 0),
|
||||
* to the beginning of a row for odd-numbered rows.
|
||||
*/
|
||||
private static void addSwatchToRow(TableRow row, View swatch, int rowNumber) {
|
||||
if (rowNumber % 2 == 0) {
|
||||
row.addView(swatch);
|
||||
} else {
|
||||
row.addView(swatch, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a content description to the specified swatch view. Because the colors get added in a
|
||||
* snaking form, every other row will need to compensate for the fact that the colors are added
|
||||
* in an opposite direction from their left->right/top->bottom order, which is how the system
|
||||
* will arrange them for accessibility purposes.
|
||||
*/
|
||||
private void setSwatchDescription(int rowNumber, int index, int rowElements, boolean selected,
|
||||
View swatch, String[] contentDescriptions) {
|
||||
String description;
|
||||
if (contentDescriptions != null && contentDescriptions.length > index) {
|
||||
description = contentDescriptions[index];
|
||||
} else {
|
||||
int accessibilityIndex;
|
||||
if (rowNumber % 2 == 0) {
|
||||
// We're in a regular-ordered row
|
||||
accessibilityIndex = index + 1;
|
||||
} else {
|
||||
// We're in a backwards-ordered row.
|
||||
int rowMax = ((rowNumber + 1) * mNumColumns);
|
||||
accessibilityIndex = rowMax - rowElements;
|
||||
}
|
||||
|
||||
if (selected) {
|
||||
description = String.format(mDescriptionSelected, accessibilityIndex);
|
||||
} else {
|
||||
description = String.format(mDescription, accessibilityIndex);
|
||||
}
|
||||
}
|
||||
swatch.setContentDescription(description);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a blank space to fill the row.
|
||||
*/
|
||||
private ImageView createBlankSpace() {
|
||||
ImageView view = new ImageView(getContext());
|
||||
TableRow.LayoutParams params = new TableRow.LayoutParams(mSwatchLength, mSwatchLength);
|
||||
params.setMargins(mMarginSize, mMarginSize, mMarginSize, mMarginSize);
|
||||
view.setLayoutParams(params);
|
||||
return view;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a color swatch.
|
||||
*/
|
||||
private ColorPickerSwatch createColorSwatch(int color, int selectedColor) {
|
||||
ColorPickerSwatch view = new ColorPickerSwatch(getContext(), color,
|
||||
color == selectedColor, mOnColorSelectedListener);
|
||||
TableRow.LayoutParams params = new TableRow.LayoutParams(mSwatchLength, mSwatchLength);
|
||||
params.setMargins(mMarginSize, mMarginSize, mMarginSize, mMarginSize);
|
||||
view.setLayoutParams(params);
|
||||
return view;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.colorpicker;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageView;
|
||||
|
||||
/**
|
||||
* Creates a circular swatch of a specified color. Adds a checkmark if marked as checked.
|
||||
*/
|
||||
public class ColorPickerSwatch extends FrameLayout implements View.OnClickListener {
|
||||
private int mColor;
|
||||
private ImageView mSwatchImage;
|
||||
private ImageView mCheckmarkImage;
|
||||
private OnColorSelectedListener mOnColorSelectedListener;
|
||||
|
||||
/**
|
||||
* Interface for a callback when a color square is selected.
|
||||
*/
|
||||
public interface OnColorSelectedListener {
|
||||
|
||||
/**
|
||||
* Called when a specific color square has been selected.
|
||||
*/
|
||||
public void onColorSelected(int color);
|
||||
}
|
||||
|
||||
public ColorPickerSwatch(Context context, int color, boolean checked,
|
||||
OnColorSelectedListener listener) {
|
||||
super(context);
|
||||
mColor = color;
|
||||
mOnColorSelectedListener = listener;
|
||||
|
||||
LayoutInflater.from(context).inflate(R.layout.color_picker_swatch, this);
|
||||
mSwatchImage = (ImageView) findViewById(R.id.color_picker_swatch);
|
||||
mCheckmarkImage = (ImageView) findViewById(R.id.color_picker_checkmark);
|
||||
setColor(color);
|
||||
setChecked(checked);
|
||||
setOnClickListener(this);
|
||||
}
|
||||
|
||||
protected void setColor(int color) {
|
||||
Drawable[] colorDrawable = new Drawable[]
|
||||
{getContext().getResources().getDrawable(R.drawable.color_picker_swatch)};
|
||||
mSwatchImage.setImageDrawable(new ColorStateDrawable(colorDrawable, color));
|
||||
}
|
||||
|
||||
private void setChecked(boolean checked) {
|
||||
if (checked) {
|
||||
mCheckmarkImage.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
mCheckmarkImage.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (mOnColorSelectedListener != null) {
|
||||
mOnColorSelectedListener.onColorSelected(mColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.colorpicker;
|
||||
|
||||
import android.graphics.Color;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.graphics.drawable.LayerDrawable;
|
||||
|
||||
/**
|
||||
* A drawable which sets its color filter to a color specified by the user, and changes to a
|
||||
* slightly darker color when pressed or focused.
|
||||
*/
|
||||
public class ColorStateDrawable extends LayerDrawable {
|
||||
|
||||
private static final float PRESSED_STATE_MULTIPLIER = 0.70f;
|
||||
|
||||
private int mColor;
|
||||
|
||||
public ColorStateDrawable(Drawable[] layers, int color) {
|
||||
super(layers);
|
||||
mColor = color;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onStateChange(int[] states) {
|
||||
boolean pressedOrFocused = false;
|
||||
for (int state : states) {
|
||||
if (state == android.R.attr.state_pressed || state == android.R.attr.state_focused) {
|
||||
pressedOrFocused = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (pressedOrFocused) {
|
||||
super.setColorFilter(getPressedColor(mColor), PorterDuff.Mode.SRC_ATOP);
|
||||
} else {
|
||||
super.setColorFilter(mColor, PorterDuff.Mode.SRC_ATOP);
|
||||
}
|
||||
|
||||
return super.onStateChange(states);
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a particular color, adjusts its value by a multiplier.
|
||||
*/
|
||||
private static int getPressedColor(int color) {
|
||||
float[] hsv = new float[3];
|
||||
Color.colorToHSV(color, hsv);
|
||||
hsv[2] = hsv[2] * PRESSED_STATE_MULTIPLIER;
|
||||
return Color.HSVToColor(hsv);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isStateful() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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.colorpicker;
|
||||
|
||||
import android.graphics.Color;
|
||||
|
||||
import java.util.Comparator;
|
||||
|
||||
/**
|
||||
* A color comparator which compares based on hue, saturation, and value.
|
||||
*/
|
||||
public class HsvColorComparator implements Comparator<Integer> {
|
||||
|
||||
@Override
|
||||
public int compare(Integer lhs, Integer rhs) {
|
||||
float[] hsv = new float[3];
|
||||
Color.colorToHSV(lhs, hsv);
|
||||
float hue1 = hsv[0];
|
||||
float sat1 = hsv[1];
|
||||
float val1 = hsv[2];
|
||||
|
||||
float[] hsv2 = new float[3];
|
||||
Color.colorToHSV(rhs, hsv2);
|
||||
float hue2 = hsv2[0];
|
||||
float sat2 = hsv2[1];
|
||||
float val2 = hsv2[2];
|
||||
|
||||
if (hue1 < hue2) {
|
||||
return 1;
|
||||
} else if (hue1 > hue2) {
|
||||
return -1;
|
||||
} else {
|
||||
if (sat1 < sat2) {
|
||||
return 1;
|
||||
} else if (sat1 > sat2) {
|
||||
return -1;
|
||||
} else {
|
||||
if (val1 < val2) {
|
||||
return 1;
|
||||
} else if (val1 > val2) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user