Refactor to allow for snooze reminders (snooze when user hits the back or home buttons).
1
GlowPadBackport/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/build
|
@ -71,6 +71,7 @@
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Android API 19 Platform" jdkType="Android SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" exported="" name="library-2.4.0" level="project" />
|
||||
</component>
|
||||
</module>
|
||||
|
||||
|
@ -5,8 +5,8 @@ android {
|
||||
buildToolsVersion "19.0.1"
|
||||
|
||||
defaultConfig {
|
||||
minSdkVersion 10
|
||||
targetSdkVersion 19
|
||||
minSdkVersion 8
|
||||
targetSdkVersion 16
|
||||
versionCode 1
|
||||
versionName "1.0"
|
||||
}
|
||||
@ -17,3 +17,7 @@ android {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile 'com.nineoldandroids:library:2.4.0'
|
||||
}
|
@ -1,4 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="net.sebastianopoggi.ui.GlowPadBackport">
|
||||
</manifest>
|
||||
package="net.sebastianopoggi.ui.GlowPadBackport" >
|
||||
<application />
|
||||
</manifest>
|
@ -0,0 +1,134 @@
|
||||
/*
|
||||
* 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.
|
||||
* 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 net.sebastianopoggi.ui.GlowPadBackport;
|
||||
|
||||
import net.sebastianopoggi.ui.GlowPadBackport.util.TimeInterpolator;
|
||||
|
||||
class Ease {
|
||||
private static final float DOMAIN = 1.0f;
|
||||
private static final float DURATION = 1.0f;
|
||||
private static final float START = 0.0f;
|
||||
|
||||
static class Linear {
|
||||
public static final TimeInterpolator easeNone = new TimeInterpolator() {
|
||||
public float getInterpolation(float input) {
|
||||
return input;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
static class Cubic {
|
||||
public static final TimeInterpolator easeIn = new TimeInterpolator() {
|
||||
public float getInterpolation(float input) {
|
||||
return DOMAIN * (input /= DURATION) * input * input + START;
|
||||
}
|
||||
};
|
||||
public static final TimeInterpolator easeOut = new TimeInterpolator() {
|
||||
public float getInterpolation(float input) {
|
||||
return DOMAIN * ((input = input / DURATION - 1) * input * input + 1) + START;
|
||||
}
|
||||
};
|
||||
public static final TimeInterpolator easeInOut = new TimeInterpolator() {
|
||||
public float getInterpolation(float input) {
|
||||
return ((input /= DURATION / 2) < 1.0f) ?
|
||||
(DOMAIN / 2 * input * input * input + START)
|
||||
: (DOMAIN / 2 * ((input -= 2) * input * input + 2) + START);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
static class Quad {
|
||||
public static final TimeInterpolator easeIn = new TimeInterpolator() {
|
||||
public float getInterpolation(float input) {
|
||||
return DOMAIN * (input /= DURATION) * input + START;
|
||||
}
|
||||
};
|
||||
public static final TimeInterpolator easeOut = new TimeInterpolator() {
|
||||
public float getInterpolation(float input) {
|
||||
return -DOMAIN * (input /= DURATION) * (input - 2) + START;
|
||||
}
|
||||
};
|
||||
public static final TimeInterpolator easeInOut = new TimeInterpolator() {
|
||||
public float getInterpolation(float input) {
|
||||
return ((input /= DURATION / 2) < 1) ?
|
||||
(DOMAIN / 2 * input * input + START)
|
||||
: (-DOMAIN / 2 * ((--input) * (input - 2) - 1) + START);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
static class Quart {
|
||||
public static final TimeInterpolator easeIn = new TimeInterpolator() {
|
||||
public float getInterpolation(float input) {
|
||||
return DOMAIN * (input /= DURATION) * input * input * input + START;
|
||||
}
|
||||
};
|
||||
public static final TimeInterpolator easeOut = new TimeInterpolator() {
|
||||
public float getInterpolation(float input) {
|
||||
return -DOMAIN * ((input = input / DURATION - 1) * input * input * input - 1) + START;
|
||||
}
|
||||
};
|
||||
public static final TimeInterpolator easeInOut = new TimeInterpolator() {
|
||||
public float getInterpolation(float input) {
|
||||
return ((input /= DURATION / 2) < 1) ?
|
||||
(DOMAIN / 2 * input * input * input * input + START)
|
||||
:
|
||||
(-DOMAIN / 2 * ((input -= 2) * input * input * input - 2) + START);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
static class Quint {
|
||||
public static final TimeInterpolator easeIn = new TimeInterpolator() {
|
||||
public float getInterpolation(float input) {
|
||||
return DOMAIN * (input /= DURATION) * input * input * input * input + START;
|
||||
}
|
||||
};
|
||||
public static final TimeInterpolator easeOut = new TimeInterpolator() {
|
||||
public float getInterpolation(float input) {
|
||||
return DOMAIN * ((input = input / DURATION - 1) * input * input * input * input + 1) + START;
|
||||
}
|
||||
};
|
||||
public static final TimeInterpolator easeInOut = new TimeInterpolator() {
|
||||
public float getInterpolation(float input) {
|
||||
return ((input /= DURATION / 2) < 1) ?
|
||||
(DOMAIN / 2 * input * input * input * input * input + START)
|
||||
:
|
||||
(DOMAIN / 2 * ((input -= 2) * input * input * input * input + 2) + START);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
static class Sine {
|
||||
public static final TimeInterpolator easeIn = new TimeInterpolator() {
|
||||
public float getInterpolation(float input) {
|
||||
return -DOMAIN * (float) Math.cos(input / DURATION * (Math.PI / 2)) + DOMAIN + START;
|
||||
}
|
||||
};
|
||||
public static final TimeInterpolator easeOut = new TimeInterpolator() {
|
||||
public float getInterpolation(float input) {
|
||||
return DOMAIN * (float) Math.sin(input / DURATION * (Math.PI / 2)) + START;
|
||||
}
|
||||
};
|
||||
public static final TimeInterpolator easeInOut = new TimeInterpolator() {
|
||||
public float getInterpolation(float input) {
|
||||
return -DOMAIN / 2 * ((float) Math.cos(Math.PI * input / DURATION) - 1.0f) + START;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,247 @@
|
||||
/*
|
||||
* Copyright (C) 2012 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 net.sebastianopoggi.ui.GlowPadBackport;
|
||||
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.util.FloatMath;
|
||||
import android.util.Log;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class PointCloud {
|
||||
private static final float MIN_POINT_SIZE = 2.0f;
|
||||
private static final float MAX_POINT_SIZE = 4.0f;
|
||||
private static int INNER_POINTS = 8;
|
||||
private static final String TAG = "PointCloud";
|
||||
private ArrayList<Point> mPointCloud = new ArrayList<Point>();
|
||||
private Drawable mDrawable;
|
||||
private float mCenterX;
|
||||
private float mCenterY;
|
||||
private Paint mPaint;
|
||||
private float mScale = 1.0f;
|
||||
private static final float PI = (float) Math.PI;
|
||||
|
||||
// These allow us to have multiple concurrent animations.
|
||||
WaveManager waveManager = new WaveManager();
|
||||
GlowManager glowManager = new GlowManager();
|
||||
private float mOuterRadius, mInnerRadius;
|
||||
|
||||
public class WaveManager {
|
||||
private float radius = 50;
|
||||
private float width = 200.0f; // TODO: Make configurable
|
||||
private float alpha = 0.0f;
|
||||
|
||||
public void setRadius(float r) {
|
||||
radius = r;
|
||||
}
|
||||
|
||||
public float getRadius() {
|
||||
return radius;
|
||||
}
|
||||
|
||||
public void setAlpha(float a) {
|
||||
alpha = a;
|
||||
}
|
||||
|
||||
public float getAlpha() {
|
||||
return alpha;
|
||||
}
|
||||
}
|
||||
|
||||
public class GlowManager {
|
||||
private float x;
|
||||
private float y;
|
||||
private float radius = 0.0f;
|
||||
private float alpha = 0.0f;
|
||||
|
||||
public void setX(float x1) {
|
||||
x = x1;
|
||||
}
|
||||
|
||||
public float getX() {
|
||||
return x;
|
||||
}
|
||||
|
||||
public void setY(float y1) {
|
||||
y = y1;
|
||||
}
|
||||
|
||||
public float getY() {
|
||||
return y;
|
||||
}
|
||||
|
||||
public void setAlpha(float a) {
|
||||
alpha = a;
|
||||
}
|
||||
|
||||
public float getAlpha() {
|
||||
return alpha;
|
||||
}
|
||||
|
||||
public void setRadius(float r) {
|
||||
radius = r;
|
||||
}
|
||||
|
||||
public float getRadius() {
|
||||
return radius;
|
||||
}
|
||||
}
|
||||
|
||||
class Point {
|
||||
float x;
|
||||
float y;
|
||||
float radius;
|
||||
|
||||
public Point(float x2, float y2, float r) {
|
||||
x = x2;
|
||||
y = y2;
|
||||
radius = r;
|
||||
}
|
||||
}
|
||||
|
||||
public PointCloud(Drawable drawable) {
|
||||
mPaint = new Paint();
|
||||
mPaint.setFilterBitmap(true);
|
||||
mPaint.setColor(Color.rgb(255, 255, 255)); // TODO: make configurable
|
||||
mPaint.setAntiAlias(true);
|
||||
mPaint.setDither(true);
|
||||
|
||||
mDrawable = drawable;
|
||||
if (mDrawable != null) {
|
||||
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
|
||||
}
|
||||
}
|
||||
|
||||
/*package*/ void setPointsMultiplier(int mult) {
|
||||
INNER_POINTS = mult;
|
||||
makePointCloud(mInnerRadius, mOuterRadius);
|
||||
}
|
||||
|
||||
/*package*/ int getPointsMultiplier() {
|
||||
return INNER_POINTS;
|
||||
}
|
||||
|
||||
public void setCenter(float x, float y) {
|
||||
mCenterX = x;
|
||||
mCenterY = y;
|
||||
}
|
||||
|
||||
public void makePointCloud(float innerRadius, float outerRadius) {
|
||||
if (innerRadius == 0) {
|
||||
Log.w(TAG, "Must specify an inner radius");
|
||||
return;
|
||||
}
|
||||
mOuterRadius = outerRadius;
|
||||
mInnerRadius = innerRadius;
|
||||
mPointCloud.clear();
|
||||
final float pointAreaRadius = (outerRadius - innerRadius);
|
||||
final float ds = (2.0f * PI * innerRadius / INNER_POINTS);
|
||||
final int bands = Math.round(pointAreaRadius / ds);
|
||||
final float dr = pointAreaRadius / bands;
|
||||
float r = innerRadius;
|
||||
for (int b = 0; b <= bands; b++, r += dr) {
|
||||
float circumference = 2.0f * PI * r;
|
||||
final int pointsInBand = (int) (circumference / ds);
|
||||
float eta = PI / 2.0f;
|
||||
float dEta = 2.0f * PI / pointsInBand;
|
||||
for (int i = 0; i < pointsInBand; i++) {
|
||||
float x = r * FloatMath.cos(eta);
|
||||
float y = r * FloatMath.sin(eta);
|
||||
eta += dEta;
|
||||
mPointCloud.add(new Point(x, y, r));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void setScale(float scale) {
|
||||
mScale = scale;
|
||||
}
|
||||
|
||||
public float getScale() {
|
||||
return mScale;
|
||||
}
|
||||
|
||||
private static float hypot(float x, float y) {
|
||||
return FloatMath.sqrt(x * x + y * y);
|
||||
}
|
||||
|
||||
private static float max(float a, float b) {
|
||||
return a > b ? a : b;
|
||||
}
|
||||
|
||||
public int getAlphaForPoint(Point point) {
|
||||
// Contribution from positional glow
|
||||
float glowDistance = hypot(glowManager.x - point.x, glowManager.y - point.y);
|
||||
float glowAlpha = 0.0f;
|
||||
if (glowDistance < glowManager.radius) {
|
||||
float cosf = FloatMath.cos(PI * 0.25f * glowDistance / glowManager.radius);
|
||||
glowAlpha = glowManager.alpha * max(0.0f, (float) Math.pow(cosf, 10.0f));
|
||||
}
|
||||
|
||||
// Compute contribution from Wave
|
||||
float radius = hypot(point.x, point.y);
|
||||
float distanceToWaveRing = (radius - waveManager.radius);
|
||||
float waveAlpha = 0.0f;
|
||||
if (distanceToWaveRing < waveManager.width * 0.5f && distanceToWaveRing < 0.0f) {
|
||||
float cosf = FloatMath.cos(PI * 0.25f * distanceToWaveRing / waveManager.width);
|
||||
waveAlpha = waveManager.alpha * max(0.0f, (float) Math.pow(cosf, 20.0f));
|
||||
}
|
||||
|
||||
return (int) (max(glowAlpha, waveAlpha) * 255);
|
||||
}
|
||||
|
||||
private float interp(float min, float max, float f) {
|
||||
return min + (max - min) * f;
|
||||
}
|
||||
|
||||
public void draw(Canvas canvas) {
|
||||
ArrayList<Point> points = mPointCloud;
|
||||
canvas.save(Canvas.MATRIX_SAVE_FLAG);
|
||||
canvas.scale(mScale, mScale, mCenterX, mCenterY);
|
||||
for (int i = 0; i < points.size(); i++) {
|
||||
Point point = points.get(i);
|
||||
final float pointSize = interp(MAX_POINT_SIZE, MIN_POINT_SIZE,
|
||||
point.radius / mOuterRadius);
|
||||
final float px = point.x + mCenterX;
|
||||
final float py = point.y + mCenterY;
|
||||
int alpha = getAlphaForPoint(point);
|
||||
|
||||
if (alpha == 0) continue;
|
||||
|
||||
if (mDrawable != null) {
|
||||
canvas.save(Canvas.MATRIX_SAVE_FLAG);
|
||||
final float cx = mDrawable.getIntrinsicWidth() * 0.5f;
|
||||
final float cy = mDrawable.getIntrinsicHeight() * 0.5f;
|
||||
final float s = pointSize / MAX_POINT_SIZE;
|
||||
canvas.scale(s, s, px, py);
|
||||
canvas.translate(px - cx, py - cy);
|
||||
mDrawable.setAlpha(alpha);
|
||||
mDrawable.draw(canvas);
|
||||
canvas.restore();
|
||||
}
|
||||
else {
|
||||
mPaint.setAlpha(alpha);
|
||||
canvas.drawCircle(px, py, pointSize, mPaint);
|
||||
}
|
||||
}
|
||||
canvas.restore();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,341 @@
|
||||
/*
|
||||
* 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.
|
||||
* 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 net.sebastianopoggi.ui.GlowPadBackport;
|
||||
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.ColorFilter;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.graphics.drawable.StateListDrawable;
|
||||
import android.util.Log;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
public class TargetDrawable {
|
||||
private static final String TAG = "TargetDrawable";
|
||||
private static final boolean DEBUG = false;
|
||||
|
||||
public static final int[] STATE_ACTIVE =
|
||||
{android.R.attr.state_enabled, android.R.attr.state_active};
|
||||
public static final int[] STATE_INACTIVE =
|
||||
{android.R.attr.state_enabled, -android.R.attr.state_active};
|
||||
public static final int[] STATE_FOCUSED =
|
||||
{android.R.attr.state_enabled, -android.R.attr.state_active,
|
||||
android.R.attr.state_focused};
|
||||
|
||||
// We're using Reflection to access these private APIs on older Android versions
|
||||
static Method mGetStateDrawableIndex, mGetStateCount, mGetStateDrawable;
|
||||
|
||||
static {
|
||||
// In this static block we initialize all reflected methods (so that we can work around
|
||||
// the @hide annotations for those Android Framework methods). This is not ideal, but
|
||||
// there's not much we can do about that either.
|
||||
try {
|
||||
mGetStateCount = StateListDrawable.class.getDeclaredMethod("getStateCount");
|
||||
mGetStateCount.setAccessible(true);
|
||||
}
|
||||
catch (NoSuchMethodException e) {
|
||||
Log.e(TAG, "Couldn't access the StateListDrawable#getStateCount() method. " +
|
||||
"Some stuff might break!", e);
|
||||
}
|
||||
try {
|
||||
mGetStateDrawable = StateListDrawable.class.getDeclaredMethod("getStateDrawable", int.class);
|
||||
mGetStateDrawable.setAccessible(true);
|
||||
}
|
||||
catch (NoSuchMethodException e) {
|
||||
Log.e(TAG, "Couldn't access the StateListDrawable#getStateDrawable(int) method. " +
|
||||
"Some stuff might break!", e);
|
||||
}
|
||||
try {
|
||||
mGetStateDrawableIndex = StateListDrawable.class.getDeclaredMethod("getStateDrawableIndex", int[].class);
|
||||
mGetStateDrawableIndex.setAccessible(true);
|
||||
}
|
||||
catch (NoSuchMethodException e) {
|
||||
Log.e(TAG, "Couldn't access the StateListDrawable#mGetStateDrawableIndex(int[]) method. " +
|
||||
"Some stuff might break!", e);
|
||||
}
|
||||
}
|
||||
|
||||
private float mTranslationX = 0.0f;
|
||||
private float mTranslationY = 0.0f;
|
||||
private float mPositionX = 0.0f;
|
||||
private float mPositionY = 0.0f;
|
||||
private float mScaleX = 1.0f;
|
||||
private float mScaleY = 1.0f;
|
||||
private float mAlpha = 1.0f;
|
||||
private Drawable mDrawable;
|
||||
private boolean mEnabled = true;
|
||||
private final int mResourceId;
|
||||
|
||||
/* package */ static class DrawableWithAlpha extends Drawable {
|
||||
private float mAlpha = 1.0f;
|
||||
private Drawable mRealDrawable;
|
||||
|
||||
public DrawableWithAlpha(Drawable realDrawable) {
|
||||
mRealDrawable = realDrawable;
|
||||
}
|
||||
|
||||
public void setAlphaFloat(float alpha) {
|
||||
mAlpha = alpha;
|
||||
}
|
||||
|
||||
public int getAlphaFloat() {
|
||||
return (int) (mAlpha * 255);
|
||||
}
|
||||
|
||||
public void draw(Canvas canvas) {
|
||||
mRealDrawable.setAlpha(Math.round(mAlpha * 255f));
|
||||
mRealDrawable.draw(canvas);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAlpha(int alpha) {
|
||||
mRealDrawable.setAlpha(alpha);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getAlpha() {
|
||||
return mRealDrawable.getAlpha();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setColorFilter(ColorFilter cf) {
|
||||
mRealDrawable.setColorFilter(cf);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOpacity() {
|
||||
return mRealDrawable.getOpacity();
|
||||
}
|
||||
}
|
||||
|
||||
public TargetDrawable(Resources res, int resId) {
|
||||
mResourceId = resId;
|
||||
setDrawable(res, resId);
|
||||
}
|
||||
|
||||
public void setDrawable(Resources res, int resId) {
|
||||
// Note we explicitly don't set mResourceId to resId since we allow the drawable to be
|
||||
// swapped at runtime and want to re-use the existing resource id for identification.
|
||||
Drawable drawable = resId == 0 ? null : res.getDrawable(resId);
|
||||
// Mutate the drawable so we can animate shared drawable properties.
|
||||
mDrawable = drawable != null ? drawable.mutate() : null;
|
||||
resizeDrawables();
|
||||
setState(STATE_INACTIVE);
|
||||
}
|
||||
|
||||
public TargetDrawable(TargetDrawable other) {
|
||||
mResourceId = other.mResourceId;
|
||||
// Mutate the drawable so we can animate shared drawable properties.
|
||||
mDrawable = other.mDrawable != null ? other.mDrawable.mutate() : null;
|
||||
resizeDrawables();
|
||||
setState(STATE_INACTIVE);
|
||||
}
|
||||
|
||||
public void setState(int[] state) {
|
||||
if (mDrawable instanceof StateListDrawable) {
|
||||
StateListDrawable d = (StateListDrawable) mDrawable;
|
||||
d.setState(state);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean hasState(int[] state) {
|
||||
if (mDrawable instanceof StateListDrawable) {
|
||||
StateListDrawable d = (StateListDrawable) mDrawable;
|
||||
// TODO: this doesn't seem to work
|
||||
try {
|
||||
return (Integer) mGetStateDrawableIndex.invoke(d, state) != -1;
|
||||
}
|
||||
catch (Exception e) {
|
||||
Log.w(TAG, "StateListDrawable#getStateDrawableIndex(int[]) call failed!", e);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the drawable is a StateListDrawable and is in the focused state.
|
||||
*
|
||||
* @return Returns true if the drawable is a StateListDrawable and is in the focused state
|
||||
*/
|
||||
public boolean isActive() {
|
||||
if (mDrawable instanceof StateListDrawable) {
|
||||
StateListDrawable d = (StateListDrawable) mDrawable;
|
||||
int[] states = d.getState();
|
||||
for (int i = 0; i < states.length; i++) {
|
||||
if (states[i] == android.R.attr.state_focused) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if this target is enabled. Typically an enabled target contains a valid
|
||||
* drawable in a valid state. Currently all targets with valid drawables are valid.
|
||||
*
|
||||
* @return Returns true if the target is enabled, false otherwise
|
||||
*/
|
||||
public boolean isEnabled() {
|
||||
return mDrawable != null && mEnabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes drawables in a StateListDrawable all the same dimensions.
|
||||
* If not a StateListDrawable, then justs sets the bounds to the intrinsic size of the
|
||||
* drawable.
|
||||
*/
|
||||
private void resizeDrawables() {
|
||||
if (mDrawable instanceof StateListDrawable) {
|
||||
StateListDrawable d = (StateListDrawable) mDrawable;
|
||||
int maxWidth = 0;
|
||||
int maxHeight = 0;
|
||||
Integer stateCount = 0;
|
||||
try {
|
||||
stateCount = (Integer) mGetStateCount.invoke(d);
|
||||
}
|
||||
catch (Exception e) {
|
||||
Log.w(TAG, "StateListDrawable#getStateCount() call failed!", e);
|
||||
}
|
||||
|
||||
for (int i = 0; i < stateCount; i++) {
|
||||
Drawable childDrawable;
|
||||
try {
|
||||
childDrawable = (Drawable) mGetStateDrawable.invoke(d, i);
|
||||
}
|
||||
catch (Exception e) {
|
||||
Log.w(TAG, "StateListDrawable#getStateDrawable(int) call failed!", e);
|
||||
continue;
|
||||
}
|
||||
|
||||
maxWidth = Math.max(maxWidth, childDrawable.getIntrinsicWidth());
|
||||
maxHeight = Math.max(maxHeight, childDrawable.getIntrinsicHeight());
|
||||
}
|
||||
if (DEBUG) {
|
||||
Log.v(TAG, "union of childDrawable rects " + d + " to: "
|
||||
+ maxWidth + "x" + maxHeight);
|
||||
}
|
||||
d.setBounds(0, 0, maxWidth, maxHeight);
|
||||
for (int i = 0; i < stateCount; i++) {
|
||||
Drawable childDrawable;
|
||||
try {
|
||||
childDrawable = (Drawable) mGetStateDrawable.invoke(d, i);
|
||||
}
|
||||
catch (Exception e) {
|
||||
Log.w(TAG, "StateListDrawable#getStateDrawable(int) call failed!", e);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (DEBUG) {
|
||||
Log.v(TAG, "sizing drawable " + childDrawable + " to: "
|
||||
+ maxWidth + "x" + maxHeight);
|
||||
}
|
||||
childDrawable.setBounds(0, 0, maxWidth, maxHeight);
|
||||
}
|
||||
}
|
||||
else if (mDrawable != null) {
|
||||
mDrawable.setBounds(0, 0,
|
||||
mDrawable.getIntrinsicWidth(), mDrawable.getIntrinsicHeight());
|
||||
}
|
||||
}
|
||||
|
||||
public void setX(float x) {
|
||||
mTranslationX = x;
|
||||
}
|
||||
|
||||
public void setY(float y) {
|
||||
mTranslationY = y;
|
||||
}
|
||||
|
||||
public void setScaleX(float x) {
|
||||
mScaleX = x;
|
||||
}
|
||||
|
||||
public void setScaleY(float y) {
|
||||
mScaleY = y;
|
||||
}
|
||||
|
||||
public void setAlpha(float alpha) {
|
||||
mAlpha = alpha;
|
||||
}
|
||||
|
||||
public float getX() {
|
||||
return mTranslationX;
|
||||
}
|
||||
|
||||
public float getY() {
|
||||
return mTranslationY;
|
||||
}
|
||||
|
||||
public float getScaleX() {
|
||||
return mScaleX;
|
||||
}
|
||||
|
||||
public float getScaleY() {
|
||||
return mScaleY;
|
||||
}
|
||||
|
||||
public float getAlpha() {
|
||||
return mAlpha;
|
||||
}
|
||||
|
||||
public void setPositionX(float x) {
|
||||
mPositionX = x;
|
||||
}
|
||||
|
||||
public void setPositionY(float y) {
|
||||
mPositionY = y;
|
||||
}
|
||||
|
||||
public float getPositionX() {
|
||||
return mPositionX;
|
||||
}
|
||||
|
||||
public float getPositionY() {
|
||||
return mPositionY;
|
||||
}
|
||||
|
||||
public int getWidth() {
|
||||
return mDrawable != null ? mDrawable.getIntrinsicWidth() : 0;
|
||||
}
|
||||
|
||||
public int getHeight() {
|
||||
return mDrawable != null ? mDrawable.getIntrinsicHeight() : 0;
|
||||
}
|
||||
|
||||
public void draw(Canvas canvas) {
|
||||
if (mDrawable == null || !mEnabled) {
|
||||
return;
|
||||
}
|
||||
canvas.save(Canvas.MATRIX_SAVE_FLAG);
|
||||
canvas.scale(mScaleX, mScaleY, mPositionX, mPositionY);
|
||||
canvas.translate(mTranslationX + mPositionX, mTranslationY + mPositionY);
|
||||
canvas.translate(-0.5f * getWidth(), -0.5f * getHeight());
|
||||
mDrawable.setAlpha(Math.round(mAlpha * 255f));
|
||||
mDrawable.draw(canvas);
|
||||
canvas.restore();
|
||||
}
|
||||
|
||||
public void setEnabled(boolean enabled) {
|
||||
mEnabled = enabled;
|
||||
}
|
||||
|
||||
public int getResourceId() {
|
||||
return mResourceId;
|
||||
}
|
||||
}
|
@ -0,0 +1,190 @@
|
||||
/*
|
||||
* 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.
|
||||
* 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 net.sebastianopoggi.ui.GlowPadBackport;
|
||||
|
||||
import android.util.Log;
|
||||
import com.nineoldandroids.animation.Animator;
|
||||
import com.nineoldandroids.animation.Animator.AnimatorListener;
|
||||
import com.nineoldandroids.animation.AnimatorListenerAdapter;
|
||||
import com.nineoldandroids.animation.ObjectAnimator;
|
||||
import com.nineoldandroids.animation.PropertyValuesHolder;
|
||||
import com.nineoldandroids.animation.ValueAnimator.AnimatorUpdateListener;
|
||||
import net.sebastianopoggi.ui.GlowPadBackport.util.TimeInterpolator;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
class Tweener {
|
||||
private static final String TAG = "Tweener";
|
||||
private static final boolean DEBUG = false;
|
||||
|
||||
ObjectAnimator animator;
|
||||
private static HashMap<Object, Tweener> sTweens = new HashMap<Object, Tweener>();
|
||||
|
||||
public Tweener(ObjectAnimator anim) {
|
||||
animator = anim;
|
||||
}
|
||||
|
||||
private static void remove(Animator animator) {
|
||||
Iterator<Entry<Object, Tweener>> iter = sTweens.entrySet().iterator();
|
||||
while (iter.hasNext()) {
|
||||
Entry<Object, Tweener> entry = iter.next();
|
||||
if (entry.getValue().animator == animator) {
|
||||
if (DEBUG) {
|
||||
Log.v(TAG, "Removing tweener " + sTweens.get(entry.getKey())
|
||||
+ " sTweens.size() = " + sTweens.size());
|
||||
}
|
||||
iter.remove();
|
||||
break; // an animator can only be attached to one object
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static Tweener to(Object object, long duration, Object... vars) {
|
||||
long delay = 0;
|
||||
AnimatorUpdateListener updateListener = null;
|
||||
AnimatorListener listener = null;
|
||||
TimeInterpolator interpolator = null;
|
||||
|
||||
// Iterate through arguments and discover properties to animate
|
||||
ArrayList<PropertyValuesHolder> props = new ArrayList<PropertyValuesHolder>(vars.length / 2);
|
||||
for (int i = 0; i < vars.length; i += 2) {
|
||||
if (!(vars[i] instanceof String)) {
|
||||
throw new IllegalArgumentException("Key must be a string: " + vars[i]);
|
||||
}
|
||||
String key = (String) vars[i];
|
||||
Object value = vars[i + 1];
|
||||
if ("simultaneousTween".equals(key)) {
|
||||
// TODO
|
||||
}
|
||||
else if ("ease".equals(key)) {
|
||||
interpolator = (TimeInterpolator) value; // TODO: multiple interpolators?
|
||||
}
|
||||
else if ("onUpdate".equals(key) || "onUpdateListener".equals(key)) {
|
||||
updateListener = (AnimatorUpdateListener) value;
|
||||
}
|
||||
else if ("onComplete".equals(key) || "onCompleteListener".equals(key)) {
|
||||
listener = (AnimatorListener) value;
|
||||
}
|
||||
else if ("delay".equals(key)) {
|
||||
delay = ((Number) value).longValue();
|
||||
}
|
||||
else if ("syncWith".equals(key)) {
|
||||
// TODO
|
||||
}
|
||||
else if (value instanceof float[]) {
|
||||
props.add(PropertyValuesHolder.ofFloat(key,
|
||||
((float[]) value)[0], ((float[]) value)[1]));
|
||||
}
|
||||
else if (value instanceof int[]) {
|
||||
props.add(PropertyValuesHolder.ofInt(key,
|
||||
((int[]) value)[0], ((int[]) value)[1]));
|
||||
}
|
||||
else if (value instanceof Number) {
|
||||
float floatValue = ((Number) value).floatValue();
|
||||
props.add(PropertyValuesHolder.ofFloat(key, floatValue));
|
||||
}
|
||||
else {
|
||||
throw new IllegalArgumentException(
|
||||
"Bad argument for key \"" + key + "\" with value " + value.getClass());
|
||||
}
|
||||
}
|
||||
|
||||
// Re-use existing tween, if present
|
||||
Tweener tween = sTweens.get(object);
|
||||
ObjectAnimator anim;
|
||||
if (tween == null) {
|
||||
anim = ObjectAnimator.ofPropertyValuesHolder(object,
|
||||
props.toArray(new PropertyValuesHolder[props.size()]));
|
||||
tween = new Tweener(anim);
|
||||
sTweens.put(object, tween);
|
||||
if (DEBUG) Log.v(TAG, "Added new Tweener " + tween);
|
||||
}
|
||||
else {
|
||||
anim = sTweens.get(object).animator;
|
||||
replace(props, object); // Cancel all animators for given object
|
||||
}
|
||||
|
||||
if (interpolator != null) {
|
||||
anim.setInterpolator(interpolator);
|
||||
}
|
||||
|
||||
// Update animation with properties discovered in loop above
|
||||
anim.setStartDelay(delay);
|
||||
anim.setDuration(duration);
|
||||
if (updateListener != null) {
|
||||
anim.removeAllUpdateListeners(); // There should be only one
|
||||
anim.addUpdateListener(updateListener);
|
||||
}
|
||||
if (listener != null) {
|
||||
anim.removeAllListeners(); // There should be only one.
|
||||
anim.addListener(listener);
|
||||
}
|
||||
anim.addListener(mCleanupListener);
|
||||
|
||||
return tween;
|
||||
}
|
||||
|
||||
Tweener from(Object object, long duration, Object... vars) {
|
||||
// TODO: for v of vars
|
||||
// toVars[v] = object[v]
|
||||
// object[v] = vars[v]
|
||||
return Tweener.to(object, duration, vars);
|
||||
}
|
||||
|
||||
// Listener to watch for completed animations and remove them.
|
||||
private static AnimatorListener mCleanupListener = new AnimatorListenerAdapter() {
|
||||
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
remove(animation);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationCancel(Animator animation) {
|
||||
remove(animation);
|
||||
}
|
||||
};
|
||||
|
||||
public static void reset() {
|
||||
if (DEBUG) {
|
||||
Log.v(TAG, "Reset()");
|
||||
if (sTweens.size() > 0) {
|
||||
Log.v(TAG, "Cleaning up " + sTweens.size() + " animations");
|
||||
}
|
||||
}
|
||||
sTweens.clear();
|
||||
}
|
||||
|
||||
private static void replace(ArrayList<PropertyValuesHolder> props, Object... args) {
|
||||
for (final Object killobject : args) {
|
||||
Tweener tween = sTweens.get(killobject);
|
||||
if (tween != null) {
|
||||
tween.animator.cancel();
|
||||
if (props != null) {
|
||||
tween.animator.setValues(
|
||||
props.toArray(new PropertyValuesHolder[props.size()]));
|
||||
}
|
||||
else {
|
||||
sTweens.remove(tween);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package net.sebastianopoggi.ui.GlowPadBackport.util;
|
||||
|
||||
import android.os.Build;
|
||||
|
||||
/**
|
||||
* Class
|
||||
* <p/>
|
||||
* Author: Sebastiano Poggi
|
||||
* Created on: 1/28/13 Time: 3:57 PM
|
||||
* File version: 1.0
|
||||
* <p/>
|
||||
* Changelog:
|
||||
* Version 1.0
|
||||
* * Initial revision
|
||||
*/
|
||||
public class Const {
|
||||
public static final boolean IS_ECLAIR = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR;
|
||||
public static final boolean IS_FROYO = Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO;
|
||||
public static final boolean IS_ICS = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
|
||||
public static final boolean IS_JB = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN;
|
||||
public static final boolean IS_JB_MR1 = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1;
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (C) 2010 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 net.sebastianopoggi.ui.GlowPadBackport.util;
|
||||
|
||||
import android.view.animation.Interpolator;
|
||||
|
||||
/**
|
||||
* A time interpolator defines the rate of change of an animation. This allows animations
|
||||
* to have non-linear motion, such as acceleration and deceleration.
|
||||
*/
|
||||
public interface TimeInterpolator extends Interpolator {
|
||||
|
||||
/**
|
||||
* Maps a value representing the elapsed fraction of an animation to a value that represents
|
||||
* the interpolated fraction. This interpolated value is then multiplied by the change in
|
||||
* value of an animation to derive the animated value at the current elapsed animation time.
|
||||
*
|
||||
* @param input A value between 0 and 1.0 indicating our current point
|
||||
* in the animation where 0 represents the start and 1.0 represents
|
||||
* the end
|
||||
* @return The interpolation value. This value can be more than 1.0 for
|
||||
* interpolators which overshoot their targets, or less than 0 for
|
||||
* interpolators that undershoot their targets.
|
||||
*/
|
||||
float getInterpolation(float input);
|
||||
}
|
Before Width: | Height: | Size: 9.2 KiB |
Before Width: | Height: | Size: 5.1 KiB |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 19 KiB |
100
GlowPadBackport/src/main/res/values/attrs.xml
Normal file
@ -0,0 +1,100 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<declare-styleable name="LinearLayout">
|
||||
<attr name="gravity" />
|
||||
</declare-styleable>
|
||||
|
||||
<!-- =============================== -->
|
||||
<!-- GlowPadView class attributes -->
|
||||
<!-- =============================== -->
|
||||
<eat-comment />
|
||||
<declare-styleable name="GlowPadView">
|
||||
<!-- Reference to an array resource that be shown as targets around a circle. -->
|
||||
<attr name="targetDrawables" format="reference"/>
|
||||
|
||||
<!-- Reference to an array resource that be used as description for the targets around the circle. -->
|
||||
<attr name="targetDescriptions" format="reference"/>
|
||||
|
||||
<!-- Reference to an array resource that be used to announce the directions with targets around the circle. -->
|
||||
<attr name="directionDescriptions" format="reference"/>
|
||||
|
||||
<!-- Sets a drawable as the center. -->
|
||||
<attr name="handleDrawable" format="reference"/>
|
||||
|
||||
<!-- Drawable to use for wave ripple animation. -->
|
||||
<attr name="outerRingDrawable" format="reference"/>
|
||||
|
||||
<!-- Drawble used for drawing points -->
|
||||
<attr name="pointDrawable" format="reference" />
|
||||
|
||||
<!-- Inner radius of glow area. -->
|
||||
<attr name="innerRadius" format="dimension"/>
|
||||
|
||||
<!-- Outer radius of glow area. Target icons will be drawn on this circle. -->
|
||||
<attr name="outerRadius" format="dimension"/>
|
||||
|
||||
<!-- Radius of glow under finger. -->
|
||||
<attr name="glowRadius" format="dimension" />
|
||||
|
||||
<!-- Tactile feedback duration for actions. Set to '0' for no vibration. -->
|
||||
<attr name="vibrationDuration" format="integer"/>
|
||||
|
||||
<!-- How close we need to be before snapping to a target. -->
|
||||
<attr name="snapMargin" format="dimension"/>
|
||||
|
||||
<!-- Number of waves/chevrons to show in animation. -->
|
||||
<attr name="feedbackCount" format="integer"/>
|
||||
|
||||
<!-- Used when the handle shouldn't wait to be hit before following the finger -->
|
||||
<attr name="alwaysTrackFinger" format="boolean"/>
|
||||
|
||||
<!-- Location along the circle of the first item, in degrees.-->
|
||||
<attr name="firstItemOffset" format="float" />
|
||||
|
||||
<!-- Causes targets to snap to the finger location on activation. -->
|
||||
<attr name="magneticTargets" format="boolean" />
|
||||
|
||||
<attr name="gravity"/>
|
||||
|
||||
<!-- Determine whether the glow pad is allowed to scale to fit the bounds indicated
|
||||
by its parent. If this is set to false, no scaling will occur. If this is set to true
|
||||
scaling will occur to fit for any axis in which gravity is set to center. -->
|
||||
<attr name="allowScaling" format="boolean" />
|
||||
</declare-styleable>
|
||||
|
||||
<!-- Specifies how to place the content of an object, both
|
||||
on the x and y axis, within the object itself. -->
|
||||
<attr name="gravity">
|
||||
<!-- Push object to the top of its container, not changing its size. -->
|
||||
<flag name="top" value="0x30" />
|
||||
<!-- Push object to the bottom of its container, not changing its size. -->
|
||||
<flag name="bottom" value="0x50" />
|
||||
<!-- Push object to the left of its container, not changing its size. -->
|
||||
<flag name="left" value="0x03" />
|
||||
<!-- Push object to the right of its container, not changing its size. -->
|
||||
<flag name="right" value="0x05" />
|
||||
<!-- Place object in the vertical center of its container, not changing its size. -->
|
||||
<flag name="center_vertical" value="0x10" />
|
||||
<!-- Grow the vertical size of the object if needed so it completely fills its container. -->
|
||||
<flag name="fill_vertical" value="0x70" />
|
||||
<!-- Place object in the horizontal center of its container, not changing its size. -->
|
||||
<flag name="center_horizontal" value="0x01" />
|
||||
<!-- Grow the horizontal size of the object if needed so it completely fills its container. -->
|
||||
<flag name="fill_horizontal" value="0x07" />
|
||||
<!-- Place the object in the center of its container in both the vertical and horizontal axis, not changing its size. -->
|
||||
<flag name="center" value="0x11" />
|
||||
<!-- Grow the horizontal and vertical size of the object if needed so it completely fills its container. -->
|
||||
<flag name="fill" value="0x77" />
|
||||
<!-- Additional option that can be set to have the top and/or bottom edges of
|
||||
the child clipped to its container's bounds.
|
||||
The clip will be based on the vertical gravity: a top gravity will clip the bottom
|
||||
edge, a bottom gravity will clip the top edge, and neither will clip both edges. -->
|
||||
<flag name="clip_vertical" value="0x80" />
|
||||
<!-- Additional option that can be set to have the left and/or right edges of
|
||||
the child clipped to its container's bounds.
|
||||
The clip will be based on the horizontal gravity: a left gravity will clip the right
|
||||
edge, a right gravity will clip the left edge, and neither will clip both edges. -->
|
||||
<flag name="clip_horizontal" value="0x08" />
|
||||
</attr>
|
||||
</resources>
|
@ -1,3 +0,0 @@
|
||||
<resources>
|
||||
<string name="app_name">GlowPadBackport</string>
|
||||
</resources>
|
@ -73,6 +73,8 @@
|
||||
<orderEntry type="library" exported="" name="appcompat-v7-19.0.1" level="project" />
|
||||
<orderEntry type="library" exported="" name="support-v4-19.0.1" level="project" />
|
||||
<orderEntry type="library" exported="" name="library-2.4.0" level="project" />
|
||||
<orderEntry type="module" module-name="SeekArc" exported="" />
|
||||
<orderEntry type="module" module-name="GlowPadBackport" exported="" />
|
||||
</component>
|
||||
</module>
|
||||
|
||||
|
@ -17,11 +17,16 @@ android {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
repositories {
|
||||
flatDir {
|
||||
dirs 'libs'
|
||||
}
|
||||
}
|
||||
dependencies {
|
||||
compile 'com.android.support:support-v4:19.0.1'
|
||||
compile 'com.android.support:appcompat-v7:19.0.1'
|
||||
compile 'com.nineoldandroids:library:2.4.0'
|
||||
compile fileTree(dir: 'libs', include: ['*.aar'])
|
||||
compile fileTree(dir: 'libs', include: ['*.jar'])
|
||||
compile project(':GlowPadBackport')
|
||||
compile project(':SeekArc')
|
||||
}
|
||||
|
@ -30,6 +30,7 @@
|
||||
<action android:name="android.intent.action.BOOT_COMPLETED"/>
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<service
|
||||
android:name=".AlarmNotify"
|
||||
android:label="@string/alarm_notification" >
|
||||
@ -47,6 +48,6 @@
|
||||
<!-- permission required to vibrate -->
|
||||
<uses-permission android:name="android.permission.VIBRATE"/>
|
||||
<!-- permission required to wake the device -->
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK"/>
|
||||
<!--uses-permission android:name="android.permission.WAKE_LOCK"/-->
|
||||
|
||||
</manifest>
|
||||
|
@ -8,13 +8,13 @@ import android.content.Intent;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Vibrator;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.Button;
|
||||
|
||||
import com.triggertrap.seekarc.SeekArc;
|
||||
|
||||
// TODO See GlowPad.
|
||||
|
||||
// TODO sound audible alarm -- see AlarmKlaxon.java
|
||||
@ -22,16 +22,17 @@ import android.widget.Button;
|
||||
// TODO Snooze? set another alarm for the next half-hour (or grace_period / 2)?
|
||||
|
||||
public class AlarmAlertActivity extends Activity {
|
||||
// TODO correct alert lifetime
|
||||
private static final int ALERT_LIFE = 1000*10; //1000*60*2; // 2 minutes
|
||||
private static final long[] vPattern = {500, 500};
|
||||
private static Boolean userCancelled;
|
||||
private static Vibrator vibrator;
|
||||
private static Intent notifyIntent;
|
||||
public static Boolean alertFinished, userCancelled;
|
||||
public static Activity alertActivity;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
// Self-reference so we can run finish() from outside.
|
||||
alertActivity = this;
|
||||
|
||||
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||
Window window = getWindow();
|
||||
// Set to use the full screen
|
||||
@ -47,32 +48,15 @@ public class AlarmAlertActivity extends Activity {
|
||||
setContentView(R.layout.alarm_alert);
|
||||
|
||||
notifyIntent = new Intent(getApplicationContext(), AlarmNotify.class);
|
||||
// Disable any current notifications
|
||||
// Disable any current notifications (if we're snoozing)
|
||||
stopService(notifyIntent);
|
||||
|
||||
// Turn off the alert activity, and switch to a notification
|
||||
new Handler().postDelayed(new Runnable() {
|
||||
public void run() {
|
||||
// Close the dialogue and switch to notification
|
||||
// if the Activity has not been closed by the user
|
||||
if (!userCancelled) {
|
||||
startService(notifyIntent);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
}, ALERT_LIFE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
userCancelled = false;
|
||||
|
||||
vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
|
||||
vibrator.vibrate(vPattern, 0);
|
||||
|
||||
// TODO change button to slide...
|
||||
// TODO change slide to circle slide? https://github.com/JesusM/HoloCircleSeekBar
|
||||
/*
|
||||
Button cancelButton = (Button) findViewById(R.id.cancel_dialog_button);
|
||||
cancelButton.setOnClickListener (new View.OnClickListener() {
|
||||
@Override
|
||||
@ -80,39 +64,38 @@ public class AlarmAlertActivity extends Activity {
|
||||
cancelGraceAlarm();
|
||||
}
|
||||
});
|
||||
*/
|
||||
SeekArc cancelArc = (SeekArc) findViewById(R.id.cancel_dialog_seekArc);
|
||||
cancelArc.setOnSeekArcChangeListener(new SeekArc.OnSeekArcChangeListener() {
|
||||
volatile Boolean seekFinished = false;
|
||||
@Override
|
||||
public void onProgressChanged(SeekArc seekArc, int progress, boolean fromUser) {
|
||||
if (progress > 98 && !seekFinished && fromUser) {
|
||||
AlarmReceiver.dismissAlarm(alertActivity);
|
||||
seekFinished = true;
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void onStartTrackingTouch(SeekArc seekArc) {
|
||||
}
|
||||
@Override
|
||||
public void onStopTrackingTouch(SeekArc seekArc) {
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the user pressing the back/return button
|
||||
* TODO Do we want this to cancel the alarm and grace period?
|
||||
* TODO Or do we trigger the notification and finish() right away?
|
||||
* TODO probably most intuitive to cancel the alarms...
|
||||
* Handle the user pressing the back/return and home buttons
|
||||
*/
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
cancelGraceAlarm();
|
||||
/* OR:
|
||||
// Ensure that the we don't trigger the notification a second time
|
||||
userCancelled = true;
|
||||
startService(notifyIntent);
|
||||
finish();
|
||||
*/
|
||||
AlarmReceiver.setAlarmStatus(AlarmReceiver.ALARM_IGNORED);
|
||||
AlarmReceiver.snoozeAlarm(this);
|
||||
}
|
||||
|
||||
public void onStop() {
|
||||
vibrator.cancel();
|
||||
super.onStop();
|
||||
}
|
||||
|
||||
private void cancelGraceAlarm() {
|
||||
AlarmManager graceManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
|
||||
Intent graceIntent = new Intent(getApplicationContext(), GraceReceiver.class);
|
||||
PendingIntent gracePendingIntent = PendingIntent.getBroadcast(getApplicationContext(), MainActivity.GRACE_REQUEST, graceIntent, 0);
|
||||
graceManager.cancel(gracePendingIntent);
|
||||
Log.d("AlarmAlertActivity", "Cancelled grace alarm.");
|
||||
// Ensure we don't load a notification now
|
||||
userCancelled = true;
|
||||
// Close the dialogue (stop vibration &c)
|
||||
finish();
|
||||
public void onUserLeaveHint() {
|
||||
AlarmReceiver.setAlarmStatus(AlarmReceiver.ALARM_IGNORED);
|
||||
AlarmReceiver.snoozeAlarm(this);
|
||||
}
|
||||
}
|
@ -0,0 +1,130 @@
|
||||
package za.org.treehouse.hypoalarm;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.AssetFileDescriptor;
|
||||
import android.media.AudioManager;
|
||||
import android.media.MediaPlayer;
|
||||
import android.media.RingtoneManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Vibrator;
|
||||
import android.telephony.TelephonyManager;
|
||||
import android.util.Log;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class AlarmKlaxon {
|
||||
private static final long[] vPattern = {500, 500};
|
||||
// Volume modification for alarms while a phone call is active, from com.android.deskclock.alarms
|
||||
private static final float IN_CALL_VOLUME = 0.125f;
|
||||
private static MediaPlayer mediaPlayer = null;
|
||||
private static TelephonyManager telephonyManager;
|
||||
private static Vibrator vibrator;
|
||||
|
||||
public static void start(final Context context) {
|
||||
|
||||
/**
|
||||
*
|
||||
* TODO add raw ring tone to use as fallback
|
||||
* TODO add in-call ring tone
|
||||
* TODO lower volume if in a call
|
||||
* TODO cancel noise if a call comes in (add TelephonyManager listener which cancels the alert but calls the notification)
|
||||
*
|
||||
* TODO start telephony listener
|
||||
*
|
||||
* TODO snooze 5 minutes on press back button or home button (new runnable)
|
||||
* TODO remove back/home button and most top icons
|
||||
* TODO fix glowpad/seekarc
|
||||
*/
|
||||
vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
|
||||
vibrator.cancel();
|
||||
vibrator.vibrate(vPattern, 0);
|
||||
|
||||
if (true)
|
||||
return; // TODO remove after testing -- is mediaplayer responsible for delays?
|
||||
|
||||
telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
|
||||
// TODO select alarm tone?
|
||||
// Use the default alarm tone...
|
||||
Uri alarmNoise = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
|
||||
stopAudio(context);
|
||||
mediaPlayer = new MediaPlayer();
|
||||
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
|
||||
@Override
|
||||
public boolean onError(MediaPlayer mp, int what, int extra) {
|
||||
Log.e("AlarmAlertActivity", "Error occurred while playing audio. Stopping alarm.");
|
||||
stopAudio(context);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
try {
|
||||
/*
|
||||
* TODO find out if we're in a call
|
||||
if (inTelephoneCall) {
|
||||
Log.v("Using the in-call alarm");
|
||||
sMediaPlayer.setVolume(IN_CALL_VOLUME, IN_CALL_VOLUME);
|
||||
setDataSourceFromResource(context, sMediaPlayer, R.raw.in_call_alarm);
|
||||
} else {
|
||||
*/
|
||||
mediaPlayer.setDataSource(context, alarmNoise);
|
||||
startAudio(context);
|
||||
//}
|
||||
} catch (Exception ex) {
|
||||
// The alarmNoise may be on the sd card which could be busy right
|
||||
// now. Use the fallback ringtone.
|
||||
try {
|
||||
// Reset the media player to clear the error state.
|
||||
mediaPlayer.reset();
|
||||
//setDataSourceFromResource(this, mediaPlayer, R.raw.fallbackring);
|
||||
startAudio(context);
|
||||
} catch (Exception ex2) {
|
||||
// At this point we just don't play anything.
|
||||
Log.e("AlarmAlertActivity", "Failed to play fallback ringtone", ex2);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void stop(final Context context) {
|
||||
vibrator.cancel();
|
||||
if (true)
|
||||
return; // TODO remove after testing
|
||||
stopAudio(context);
|
||||
}
|
||||
|
||||
private static void startAudio(final Context context) throws IOException {
|
||||
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
|
||||
// do not play alarms if stream volume is 0 (typically because ringer mode is silent).
|
||||
if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
|
||||
mediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
|
||||
mediaPlayer.setLooping(true);
|
||||
try {
|
||||
mediaPlayer.prepare();
|
||||
} catch (Exception e) {
|
||||
Log.e("AlarmAlertActivity", "Prepare failed. Exiting", e);
|
||||
return;
|
||||
}
|
||||
audioManager.requestAudioFocus(null,
|
||||
AudioManager.STREAM_ALARM, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
|
||||
mediaPlayer.start();
|
||||
}
|
||||
}
|
||||
|
||||
private static void stopAudio(final Context context) {
|
||||
if (mediaPlayer != null) {
|
||||
mediaPlayer.stop();
|
||||
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
|
||||
audioManager.abandonAudioFocus(null);
|
||||
mediaPlayer.release();
|
||||
mediaPlayer = null;
|
||||
}
|
||||
}
|
||||
// Load ringtone from a resource
|
||||
private static void setDataSourceFromResource(Context context, MediaPlayer player, int res) throws IOException {
|
||||
AssetFileDescriptor afd = context.getResources().openRawResourceFd(res);
|
||||
if (afd != null) {
|
||||
player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
|
||||
afd.close();
|
||||
}
|
||||
}
|
||||
}
|
@ -27,10 +27,10 @@ public class AlarmNotify extends Service {
|
||||
public void onDestroy() {
|
||||
// If the notification is cancelled, stop updating.
|
||||
notificationRunning = false;
|
||||
Log.d("AlarmNotify", "1: Setting notificationRunning to false");
|
||||
// Remove the notification in the notification bar
|
||||
NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
|
||||
nm.cancel(notifyID);
|
||||
Log.d("AlarmNotify", "Notification stopped.");
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -38,10 +38,10 @@ public class AlarmNotify extends Service {
|
||||
final int UPDATE_INTERVAL = 10*1000; // Timer is updated six times a minute
|
||||
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
|
||||
Log.d("AlarmNotify", "Notification started.");
|
||||
|
||||
//final String phoneNumber = sharedPref.getString(getString(R.string.PhoneNumberPref), null);
|
||||
final int gracePeriod = sharedPref.getInt(getString(R.string.GracePeriodPref), 60);
|
||||
// convert gracePeriod to milliseconds and calculate when it'll fire
|
||||
final long endTime = System.currentTimeMillis() + (gracePeriod * 60 * 1000);
|
||||
|
||||
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher_grey);
|
||||
final NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
@ -55,6 +55,8 @@ public class AlarmNotify extends Service {
|
||||
.setAutoCancel(false)
|
||||
.setPriority(Notification.PRIORITY_HIGH);
|
||||
|
||||
|
||||
// TODO if alarm alert is snoozing and we cancel, cancel the snooze.
|
||||
// Set up dismiss action
|
||||
Intent cancellerIntent = new Intent(getBaseContext(), CancelGraceReceiver.class);
|
||||
PendingIntent cancellerPendingIntent = PendingIntent.getBroadcast(getBaseContext(), MainActivity.CANCEL_GRACE_REQUEST, cancellerIntent, PendingIntent.FLAG_CANCEL_CURRENT);
|
||||
@ -69,12 +71,13 @@ public class AlarmNotify extends Service {
|
||||
/**
|
||||
* TODO load alert activity (without sound or vibration) on select?
|
||||
* TODO This would allow the user to test competence
|
||||
Intent alertActivityIntent = new Intent(this, AlarmAlertActivity.class);
|
||||
alertActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
|
||||
Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
|
||||
notification.setContentIntent(alertActivityIntent);
|
||||
* something like:
|
||||
Intent alarmAlertIntent = new Intent(this, AlarmAlertActivity.class);
|
||||
PendingIntent alarmPendingIntent = PendingIntent.getBroadcast(this, 0, alarmAlertIntent, 0);
|
||||
notification.setContentIntent(alarmPen`dingIntent);
|
||||
*/
|
||||
|
||||
|
||||
nm.cancel(notifyID);
|
||||
nm.notify(notifyID, notification.build());
|
||||
|
||||
@ -82,21 +85,22 @@ public class AlarmNotify extends Service {
|
||||
@Override
|
||||
public void run() {
|
||||
notificationRunning = true;
|
||||
Log.d("AlarmNotify", "2: Setting notificationRunning to true");
|
||||
int max = 1000;
|
||||
// Convert endTime from milliseconds to seconds, and translate to time remaining
|
||||
int secondsLeft = (int) ((endTime - System.currentTimeMillis())) / (1000);
|
||||
int gracePeriodSeconds = gracePeriod * 60;
|
||||
// Multiply each int by 1000 for greater progress resolution
|
||||
int progress = (((gracePeriodSeconds * 1000) - (secondsLeft * 1000)) * max) / (gracePeriodSeconds * 1000);
|
||||
/* TODO check that graceEndTime is always set.
|
||||
if (AlarmReceiver.graceEndTime == 0) {
|
||||
AlarmReceiver.graceEndTime = System.currentTimeMillis() + (gracePeriod * 60 * 1000);
|
||||
}*/
|
||||
// Count in milliseconds for greater progress resolution
|
||||
int milliSecondsLeft = (int) ((AlarmReceiver.graceEndTime - System.currentTimeMillis()));
|
||||
int gracePeriodMilliSeconds = gracePeriod * 60 * 1000;
|
||||
int progress = ((gracePeriodMilliSeconds - milliSecondsLeft) * max) / gracePeriodMilliSeconds;
|
||||
|
||||
while (progress < max) {
|
||||
// Stop the thread if cancelled elsewhere
|
||||
Log.d("AlarmNotify", "notificationRunning is " + notificationRunning);
|
||||
// Stop the thread if the notification is cancelled elsewhere
|
||||
if (!notificationRunning) {
|
||||
return;
|
||||
}
|
||||
int minutesLeft = secondsLeft / 60;
|
||||
int minutesLeft = (milliSecondsLeft / 1000) / 60;
|
||||
if (Build.VERSION.SDK_INT >= 11) {
|
||||
notification.setContentText(String.format(getString(R.string.notificationText), MainActivity.MinutesToGracePeriodStr(minutesLeft)));
|
||||
notification.setProgress(max, progress, false);
|
||||
@ -104,12 +108,12 @@ public class AlarmNotify extends Service {
|
||||
nm.notify(notifyID, notification.build());
|
||||
}
|
||||
// Prepare secondsLeft and progress for the next loop
|
||||
secondsLeft = secondsLeft - (UPDATE_INTERVAL / 1000);
|
||||
milliSecondsLeft = milliSecondsLeft - UPDATE_INTERVAL;
|
||||
// Multiply each int by 1000 for greater progress resolution
|
||||
progress = (((gracePeriodSeconds * 1000) - (secondsLeft * 1000)) * max) / (gracePeriodSeconds * 1000);
|
||||
Log.d("AlarmNotify", "secondsLeft is " + secondsLeft + " and progress is " + progress + " (gracePeriodSeconds is " + gracePeriodSeconds + ")");
|
||||
// Sleeps the thread, simulating an operation
|
||||
// that takes time
|
||||
progress = ((gracePeriodMilliSeconds - milliSecondsLeft) * max) / gracePeriodMilliSeconds;
|
||||
//Log.d("AlarmNotify", "milliSecondsLeft is " + milliSecondsLeft + " and progress is " + progress + " (gracePeriodMilliSeconds is " + gracePeriodMilliSeconds + ")");
|
||||
|
||||
// Sleep until we need to update again
|
||||
try {
|
||||
Thread.sleep(UPDATE_INTERVAL);
|
||||
} catch (InterruptedException e) {
|
||||
|
@ -1,34 +1,55 @@
|
||||
package za.org.treehouse.hypoalarm;
|
||||
|
||||
import android.app.AlarmManager;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Build;
|
||||
import android.os.Handler;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.util.Log;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.Toast;
|
||||
|
||||
import java.util.Calendar;
|
||||
|
||||
|
||||
/**
|
||||
* TODO change alarm state if a phone call comes in
|
||||
*
|
||||
* TODO display notification if alarm is about to go off (and allow user to cancel it before alarm goes off)
|
||||
*
|
||||
* TODO allow snooze state
|
||||
*/
|
||||
|
||||
public class AlarmReceiver extends BroadcastReceiver {
|
||||
private static final int SNOOZE_TIME = 1000*20; //1000*60*5; // Snooze for 5 minutes if need be
|
||||
private static final int ALERT_LIFE = 1000*10; //1000*60*2; // 2 minutes
|
||||
private static SharedPreferences sharedPref;
|
||||
private static AlarmManager alarmManager, graceManager;
|
||||
private static PendingIntent alarmPendingIntent, gracePendingIntent;
|
||||
private static Intent alertActivityIntent, notifyIntent;
|
||||
public static volatile String alarmStatus; // Register ALARM_DISMISSED and its brethren here
|
||||
public static final String ALARM_RUNNING = "ALARM_RUNNING";
|
||||
public static final String ALARM_DISMISSED = "ALARM_DISMISSED";
|
||||
public static final String ALARM_IGNORED = "ALARM_IGNORED";
|
||||
public static final String ALARM_SNOOZED = "ALARM_SNOOZED";
|
||||
public static final String ALARM_SNOOZE_RUNNING = "ALARM_SNOOZE_RUNNING";
|
||||
public static long graceEndTime;
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
public void onReceive(final Context context, Intent intent) {
|
||||
sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
Boolean alarmActive = sharedPref.getBoolean(context.getString(R.string.AlarmActivePref), true);
|
||||
int gracePeriod = sharedPref.getInt(context.getString(R.string.GracePeriodPref), 60);
|
||||
String alarmTimeStr = sharedPref.getString(context.getString(R.string.AlarmTimePref), null);
|
||||
|
||||
if (alarmActive) {
|
||||
// Set a grace period alarm to send SMS
|
||||
int gracePeriod = sharedPref.getInt(context.getString(R.string.GracePeriodPref), 60);
|
||||
// if nothing else happens, assume the alert was ignored.
|
||||
alarmStatus = ALARM_RUNNING;
|
||||
|
||||
// Set a grace period alarm to send SMS
|
||||
Calendar graceCal = Calendar.getInstance();
|
||||
graceCal.set(Calendar.SECOND, 0);
|
||||
graceCal.add(Calendar.MINUTE, gracePeriod);
|
||||
@ -43,16 +64,20 @@ public class AlarmReceiver extends BroadcastReceiver {
|
||||
}
|
||||
Log.d("AlarmReceiver", "Setting grace alarm for " + MainActivity.debugDate(graceCal));
|
||||
|
||||
// Allow user to acknowledge alarm and cancel grace alarm
|
||||
Intent alertActivityIntent = new Intent(context, AlarmAlertActivity.class);
|
||||
// Calculate when the grace period ends
|
||||
graceEndTime = System.currentTimeMillis() + (gracePeriod * 60 * 1000);
|
||||
|
||||
// Set up intents for later use
|
||||
notifyIntent = new Intent(context, AlarmNotify.class);
|
||||
alertActivityIntent = new Intent(context, AlarmAlertActivity.class);
|
||||
alertActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
|
||||
Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
|
||||
context.startActivity(alertActivityIntent);
|
||||
|
||||
// Allow user to acknowledge alarm and cancel grace alarm
|
||||
startAlert(context);
|
||||
|
||||
// Reset for tomorrow; as of API 19, setRepeating() is inexact, so we use setExact()
|
||||
String alarmTimeStr = sharedPref.getString(context.getString(R.string.AlarmTimePref), null);
|
||||
// Calendar automatically advances the day since alarmTimeStr is now in the past.
|
||||
// (Calendar will automatically advance the day since today's alarmTimeStr is now in the past.)
|
||||
Calendar cal = MainActivity.TimeStringToCalendar(alarmTimeStr);
|
||||
alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
|
||||
alarmPendingIntent = PendingIntent.getBroadcast(context, MainActivity.ALARM_REQUEST, intent, 0);
|
||||
@ -65,4 +90,88 @@ public class AlarmReceiver extends BroadcastReceiver {
|
||||
Log.d("AlarmReceiver", "Resetting alarm for " + MainActivity.debugDate(cal));
|
||||
}
|
||||
}
|
||||
|
||||
public static void startAlert(final Context context) {
|
||||
Log.d("AlarmReceiver", "Starting alarm; status is " + alarmStatus);
|
||||
// Turn off any notifications first
|
||||
context.stopService(notifyIntent);
|
||||
|
||||
context.startActivity(alertActivityIntent);
|
||||
AlarmKlaxon.start(context);
|
||||
|
||||
// Turn off the alert activity after a period, and switch to a notification
|
||||
new Handler().postDelayed(new Runnable() {
|
||||
public void run() {
|
||||
// Close the dialogue and switch to notification
|
||||
// if the Activity has not been closed by the user
|
||||
// (that is, snoozeAlert and dismissAlert have not been called)
|
||||
// TODO don't run if we've just snoozed from home/back button, but do run if
|
||||
// TODO we want to finish the snooze alert activity...
|
||||
if (alarmStatus.contentEquals(ALARM_DISMISSED) ||
|
||||
alarmStatus.contentEquals(ALARM_SNOOZED)) {
|
||||
return;
|
||||
}
|
||||
// Stop if we're running the snooze alert
|
||||
if (alarmStatus.contentEquals(ALARM_SNOOZE_RUNNING)) {
|
||||
stopAlert(context);
|
||||
} else {
|
||||
alarmStatus = ALARM_IGNORED; // This is true, although we are about to switch to ALARM_SNOOZED
|
||||
snoozeAlarm(context);
|
||||
}
|
||||
}
|
||||
}, ALERT_LIFE);
|
||||
}
|
||||
public static void stopAlert(final Context context) {
|
||||
Log.d("AlarmReceiver", "Stopping alarm; status is " + alarmStatus);
|
||||
AlarmKlaxon.stop(context);
|
||||
AlarmAlertActivity.alertActivity.finish();
|
||||
// Display a notification if the alarm hasn't been dismissed
|
||||
if (!alarmStatus.contentEquals(ALARM_DISMISSED)) {
|
||||
context.startService(notifyIntent);
|
||||
}
|
||||
}
|
||||
|
||||
public static void dismissAlarm(final Context context) {
|
||||
Log.d("AlarmReceiver", "Dismissing alarm");
|
||||
alarmStatus = ALARM_DISMISSED;
|
||||
// Close the alert and all notifications
|
||||
stopAlert(context);
|
||||
|
||||
// Cancel the graceAlarm
|
||||
AlarmManager graceManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
|
||||
Intent graceIntent = new Intent(context, GraceReceiver.class);
|
||||
PendingIntent gracePendingIntent = PendingIntent.getBroadcast(context, MainActivity.GRACE_REQUEST, graceIntent, 0);
|
||||
graceManager.cancel(gracePendingIntent);
|
||||
}
|
||||
|
||||
// TODO should the snooze reset the time at which the grace period alarm fires?
|
||||
public static void snoozeAlarm(final Context context) {
|
||||
Log.d("AlarmReceiver", "Snoozing alarm");
|
||||
stopAlert(context);
|
||||
// Close the alert, stop the klaxon, and start the notification,
|
||||
// but only if there's time left before the gracePeriod triggers,
|
||||
// and we haven't snoozed before
|
||||
if (((System.currentTimeMillis() + SNOOZE_TIME) < graceEndTime) &&
|
||||
(!alarmStatus.contentEquals(ALARM_SNOOZED)) &&
|
||||
(!alarmStatus.contentEquals(ALARM_DISMISSED))) {
|
||||
new Handler().postDelayed(new Runnable() {
|
||||
public void run() {
|
||||
Log.d("AlarmReceiver", "Resuming after snooze; status is " + alarmStatus);
|
||||
// Don't run if the alarm was dismissed before the timer ran out
|
||||
// (because a notification was acknowledged)
|
||||
if (!alarmStatus.contentEquals(ALARM_DISMISSED)) {
|
||||
alarmStatus = ALARM_SNOOZE_RUNNING;
|
||||
startAlert(context);
|
||||
}
|
||||
}
|
||||
}, SNOOZE_TIME);
|
||||
// Change alarm status from ignored to snoozed
|
||||
alarmStatus = ALARM_SNOOZED;
|
||||
}
|
||||
}
|
||||
|
||||
public static void setAlarmStatus (String status) {
|
||||
Log.d("AlarmReceiver", "Setting alarm status to " + status);
|
||||
alarmStatus = status;
|
||||
}
|
||||
}
|
||||
|
@ -18,6 +18,9 @@ public class CancelGraceReceiver extends BroadcastReceiver {
|
||||
graceManager.cancel(gracePendingIntent);
|
||||
Log.d("CancelGraceReceiver", "Cancelled grace alarm");
|
||||
|
||||
// Ensure that any snoozes that are pending never happen.
|
||||
AlarmReceiver.setAlarmStatus(AlarmReceiver.ALARM_DISMISSED);
|
||||
|
||||
// Display toast
|
||||
Toast.makeText(context, context.getString(R.string.alarmCancelToast), Toast.LENGTH_LONG).show();
|
||||
|
||||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 30 KiB |
BIN
HypoAlarm/src/main/res/drawable-xxhdpi/ic_launcher_grey.png
Normal file
After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 67 KiB |
@ -2,6 +2,8 @@
|
||||
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:seekarc="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".AlarmNotificationActivity">
|
||||
@ -9,6 +11,34 @@
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<com.triggertrap.seekarc.SeekArc
|
||||
android:id="@+id/cancel_dialog_seekArc"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:padding="100dp"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:layout_centerVertical="true"
|
||||
seekarc:thumb="@drawable/ic_launcher"
|
||||
seekarc:clockwise="false"
|
||||
seekarc:rotation="0"
|
||||
seekarc:startAngle="35"
|
||||
seekarc:sweepAngle="295"
|
||||
seekarc:arcWidth="10dp"
|
||||
seekarc:progressWidth="20dp"
|
||||
seekarc:roundEdges="true"
|
||||
seekarc:touchInside="true" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textAppearance="?android:attr/textAppearanceLarge"
|
||||
android:text="HypoAlarm!"
|
||||
android:id="@+id/cancel_dialog_title"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_marginTop="25dp" />
|
||||
<!--
|
||||
<ImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
@ -36,5 +66,28 @@
|
||||
android:layout_marginTop="25dp"
|
||||
android:layout_below="@+id/cancel_dialog_title"
|
||||
android:layout_centerHorizontal="true" />
|
||||
-->
|
||||
<!--
|
||||
<net.sebastianopoggi.ui.GlowPadBackport.GlowPadView
|
||||
android:id="@+id/incomingCallWidget"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:layout_marginTop="10dp"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:background="@android:color/black"
|
||||
android:visibility="visible"
|
||||
android:gravity="top"
|
||||
|
||||
app:targetDrawables="@array/incoming_call_widget_2way_targets"
|
||||
app:handleDrawable="@drawable/ic_in_call_touch_handle"
|
||||
app:innerRadius="@dimen/glowpadview_inner_radius"
|
||||
app:outerRadius="@dimen/glowpadview_target_placement_radius"
|
||||
app:outerRingDrawable="@drawable/ic_lockscreen_outerring"
|
||||
app:snapMargin="@dimen/glowpadview_snap_margin"
|
||||
app:vibrationDuration="20"
|
||||
app:feedbackCount="1"
|
||||
app:glowRadius="@dimen/glowpadview_glow_radius"
|
||||
app:pointDrawable="@drawable/ic_lockscreen_glowdot"/>
|
||||
-->
|
||||
</RelativeLayout>
|
||||
</FrameLayout>
|
@ -3,4 +3,30 @@
|
||||
<!-- Default screen margins, per the Android Design guidelines. -->
|
||||
<dimen name="activity_horizontal_margin">16dp</dimen>
|
||||
<dimen name="activity_vertical_margin">16dp</dimen>
|
||||
|
||||
|
||||
<!-- Default target placement radius for GlowPadView. Should be 1/2 of outerring diameter. -->
|
||||
<dimen name="glowpadview_target_placement_radius">135dip</dimen>
|
||||
|
||||
<!-- Default glow radius for GlowPadView -->
|
||||
<dimen name="glowpadview_glow_radius">75dip</dimen>
|
||||
|
||||
<!-- Default distance beyond which GlowPadView snaps to the matching target -->
|
||||
<dimen name="glowpadview_snap_margin">40dip</dimen>
|
||||
|
||||
<!-- Default distance from each snap target that GlowPadView considers a "hit" -->
|
||||
<dimen name="glowpadview_inner_radius">15dip</dimen>
|
||||
|
||||
<!-- Size of lockscreen outerring on unsecure unlock LockScreen -->
|
||||
<dimen name="keyguard_lockscreen_outerring_diameter">270dp</dimen>
|
||||
|
||||
<!-- Circle size for incoming call widget's each item. -->
|
||||
<dimen name="incoming_call_widget_circle_size">94dp</dimen>
|
||||
|
||||
<!-- Margin used for incoming call widget's icon for each item.
|
||||
This should be same as "(incoming_call_widget_circle_size - icon_size)/2".
|
||||
Right now answer/decline/reject icons have 38dp width/height.
|
||||
So, (94 - 38)/2 ==> 28dp -->
|
||||
<dimen name="incoming_call_widget_asset_margin">28dp</dimen>
|
||||
|
||||
</resources>
|
@ -57,4 +57,11 @@
|
||||
|
||||
<string name="alarmCancelled">All HypoAlarms cancelled</string>
|
||||
|
||||
<array name="incoming_call_widget_2way_targets">
|
||||
<item>@drawable/ic_lockscreen_answer</item>
|
||||
<item>@null</item>
|
||||
<item>@drawable/ic_lockscreen_decline</item>
|
||||
<item>@null</item>"
|
||||
</array>
|
||||
|
||||
</resources>
|
||||
|
@ -5,4 +5,13 @@
|
||||
<!-- Customize your theme here. -->
|
||||
</style>
|
||||
|
||||
|
||||
<style name="SeekArc">
|
||||
<item name="arcColor">@color/progress_gray_dark</item>
|
||||
</style>
|
||||
|
||||
<style name="SeekArcLight">
|
||||
<item name="arcColor">@color/progress_gray</item>
|
||||
</style>
|
||||
|
||||
</resources>
|
||||
|
76
SeekArc/SeekArc.iml
Normal file
@ -0,0 +1,76 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="HypoAlarm" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
|
||||
<component name="FacetManager">
|
||||
<facet type="android-gradle" name="Android-Gradle">
|
||||
<configuration>
|
||||
<option name="GRADLE_PROJECT_PATH" value=":SeekArc" />
|
||||
</configuration>
|
||||
</facet>
|
||||
<facet type="android" name="Android">
|
||||
<configuration>
|
||||
<option name="SELECTED_BUILD_VARIANT" value="debug" />
|
||||
<option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
|
||||
<option name="COMPILE_JAVA_TASK_NAME" value="compileDebugJava" />
|
||||
<option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugTest" />
|
||||
<option name="SOURCE_GEN_TASK_NAME" value="generateDebugSources" />
|
||||
<option name="ALLOW_USER_CONFIGURATION" value="false" />
|
||||
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
|
||||
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
|
||||
<option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />
|
||||
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
|
||||
<option name="LIBRARY_PROJECT" value="true" />
|
||||
</configuration>
|
||||
</facet>
|
||||
</component>
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="false">
|
||||
<output url="file://$MODULE_DIR$/build/classes/debug" />
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/source/r/debug" isTestSource="false" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/source/aidl/debug" isTestSource="false" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/source/buildConfig/debug" isTestSource="false" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/source/rs/debug" isTestSource="false" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/res/rs/debug" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/source/r/test/debug" isTestSource="true" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/source/aidl/test/debug" isTestSource="true" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/source/buildConfig/test/debug" isTestSource="true" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/source/rs/test/debug" isTestSource="true" generated="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/build/res/rs/test/debug" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/assets" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/apk" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/assets" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/bundles" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/classes" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/dependency-cache" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/incremental" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/libs" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/manifests" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/res" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/symbols" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/build/tmp" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Android API 19 Platform" jdkType="Android SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
|
19
SeekArc/build.gradle
Normal file
@ -0,0 +1,19 @@
|
||||
apply plugin: 'android-library'
|
||||
|
||||
android {
|
||||
compileSdkVersion 19
|
||||
buildToolsVersion "19.0.1"
|
||||
|
||||
defaultConfig {
|
||||
minSdkVersion 8
|
||||
targetSdkVersion 17
|
||||
versionCode 1
|
||||
versionName "1.0"
|
||||
}
|
||||
buildTypes {
|
||||
release {
|
||||
runProguard false
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
/**
|
||||
* Automatically generated file. DO NOT MODIFY
|
||||
*/
|
||||
package com.triggertrap.seekarc;
|
||||
|
||||
public final class BuildConfig {
|
||||
public static final boolean DEBUG = Boolean.parseBoolean("true");
|
||||
public static final String PACKAGE_NAME = "com.triggertrap.seekarc";
|
||||
public static final String BUILD_TYPE = "debug";
|
||||
public static final String FLAVOR = "";
|
||||
public static final int VERSION_CODE = 1;
|
||||
public static final String VERSION_NAME = "1.0";
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
/**
|
||||
* Automatically generated file. DO NOT MODIFY
|
||||
*/
|
||||
package com.triggertrap.seekarc;
|
||||
|
||||
public final class BuildConfig {
|
||||
public static final boolean DEBUG = false;
|
||||
public static final String PACKAGE_NAME = "com.triggertrap.seekarc";
|
||||
public static final String BUILD_TYPE = "release";
|
||||
public static final String FLAVOR = "";
|
||||
public static final int VERSION_CODE = 1;
|
||||
public static final String VERSION_NAME = "1.0";
|
||||
}
|
419
SeekArc/build/source/r/debug/com/triggertrap/seekarc/R.java
Normal file
@ -0,0 +1,419 @@
|
||||
/* AUTO-GENERATED FILE. DO NOT MODIFY.
|
||||
*
|
||||
* This class was automatically generated by the
|
||||
* aapt tool from the resource data it found. It
|
||||
* should not be modified by hand.
|
||||
*/
|
||||
|
||||
package com.triggertrap.seekarc;
|
||||
|
||||
public final class R {
|
||||
public static final class attr {
|
||||
/** <p>Must be a color value, in the form of "<code>#<i>rgb</i></code>", "<code>#<i>argb</i></code>",
|
||||
"<code>#<i>rrggbb</i></code>", or "<code>#<i>aarrggbb</i></code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int arcColor=0x7f010009;
|
||||
/** <p>Must be a dimension value, which is a floating point number appended with a unit such as "<code>14.5sp</code>".
|
||||
Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
|
||||
in (inches), mm (millimeters).
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int arcWidth=0x7f010004;
|
||||
/** <p>Must be a boolean value, either "<code>true</code>" or "<code>false</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int clockwise=0x7f01000d;
|
||||
/** <p>Must be an integer value, such as "<code>100</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int max=0x7f010002;
|
||||
/** <p>Must be an integer value, such as "<code>100</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int progress=0x7f010005;
|
||||
/** <p>Must be a color value, in the form of "<code>#<i>rgb</i></code>", "<code>#<i>argb</i></code>",
|
||||
"<code>#<i>rrggbb</i></code>", or "<code>#<i>aarrggbb</i></code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int progressColor=0x7f01000a;
|
||||
/** <p>Must be a dimension value, which is a floating point number appended with a unit such as "<code>14.5sp</code>".
|
||||
Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
|
||||
in (inches), mm (millimeters).
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int progressWidth=0x7f010003;
|
||||
/** <p>Must be an integer value, such as "<code>100</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int rotation=0x7f010006;
|
||||
/** <p>Must be a boolean value, either "<code>true</code>" or "<code>false</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int roundEdges=0x7f01000b;
|
||||
/** <p>Must be a reference to another resource, in the form "<code>@[+][<i>package</i>:]<i>type</i>:<i>name</i></code>"
|
||||
or to a theme attribute in the form "<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>".
|
||||
*/
|
||||
public static int seekArcStyle=0x7f01000e;
|
||||
/** <p>Must be an integer value, such as "<code>100</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int startAngle=0x7f010007;
|
||||
/** <p>Must be an integer value, such as "<code>100</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int sweepAngle=0x7f010008;
|
||||
/** <p>Must be a reference to another resource, in the form "<code>@[+][<i>package</i>:]<i>type</i>:<i>name</i></code>"
|
||||
or to a theme attribute in the form "<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>".
|
||||
*/
|
||||
public static int thumb=0x7f010000;
|
||||
/** <p>Must be a dimension value, which is a floating point number appended with a unit such as "<code>14.5sp</code>".
|
||||
Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
|
||||
in (inches), mm (millimeters).
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int thumbOffset=0x7f010001;
|
||||
/** <p>Must be a boolean value, either "<code>true</code>" or "<code>false</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int touchInside=0x7f01000c;
|
||||
}
|
||||
public static final class color {
|
||||
public static int progress_gray=0x7f030000;
|
||||
public static int progress_gray_dark=0x7f030001;
|
||||
}
|
||||
public static final class drawable {
|
||||
public static int ic_launcher=0x7f020000;
|
||||
public static int scrubber_control_disabled_holo=0x7f020001;
|
||||
public static int scrubber_control_focused_holo=0x7f020002;
|
||||
public static int scrubber_control_normal_holo=0x7f020003;
|
||||
public static int scrubber_control_pressed_holo=0x7f020004;
|
||||
public static int seek_arc_control_selector=0x7f020005;
|
||||
}
|
||||
public static final class string {
|
||||
public static int app_name=0x7f040000;
|
||||
}
|
||||
public static final class style {
|
||||
public static int SeekArc=0x7f050000;
|
||||
public static int SeekArcLight=0x7f050001;
|
||||
}
|
||||
public static final class styleable {
|
||||
/** Attributes that can be used with a SeekArc.
|
||||
<p>Includes the following attributes:</p>
|
||||
<table>
|
||||
<colgroup align="left" />
|
||||
<colgroup align="left" />
|
||||
<tr><th>Attribute</th><th>Description</th></tr>
|
||||
<tr><td><code>{@link #SeekArc_arcColor com.triggertrap.seekarc:arcColor}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_arcWidth com.triggertrap.seekarc:arcWidth}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_clockwise com.triggertrap.seekarc:clockwise}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_max com.triggertrap.seekarc:max}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_progress com.triggertrap.seekarc:progress}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_progressColor com.triggertrap.seekarc:progressColor}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_progressWidth com.triggertrap.seekarc:progressWidth}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_rotation com.triggertrap.seekarc:rotation}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_roundEdges com.triggertrap.seekarc:roundEdges}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_startAngle com.triggertrap.seekarc:startAngle}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_sweepAngle com.triggertrap.seekarc:sweepAngle}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_thumb com.triggertrap.seekarc:thumb}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_thumbOffset com.triggertrap.seekarc:thumbOffset}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_touchInside com.triggertrap.seekarc:touchInside}</code></td><td></td></tr>
|
||||
</table>
|
||||
@see #SeekArc_arcColor
|
||||
@see #SeekArc_arcWidth
|
||||
@see #SeekArc_clockwise
|
||||
@see #SeekArc_max
|
||||
@see #SeekArc_progress
|
||||
@see #SeekArc_progressColor
|
||||
@see #SeekArc_progressWidth
|
||||
@see #SeekArc_rotation
|
||||
@see #SeekArc_roundEdges
|
||||
@see #SeekArc_startAngle
|
||||
@see #SeekArc_sweepAngle
|
||||
@see #SeekArc_thumb
|
||||
@see #SeekArc_thumbOffset
|
||||
@see #SeekArc_touchInside
|
||||
*/
|
||||
public static final int[] SeekArc = {
|
||||
0x7f010000, 0x7f010001, 0x7f010002, 0x7f010003,
|
||||
0x7f010004, 0x7f010005, 0x7f010006, 0x7f010007,
|
||||
0x7f010008, 0x7f010009, 0x7f01000a, 0x7f01000b,
|
||||
0x7f01000c, 0x7f01000d
|
||||
};
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#arcColor}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be a color value, in the form of "<code>#<i>rgb</i></code>", "<code>#<i>argb</i></code>",
|
||||
"<code>#<i>rrggbb</i></code>", or "<code>#<i>aarrggbb</i></code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:arcColor
|
||||
*/
|
||||
public static final int SeekArc_arcColor = 9;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#arcWidth}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be a dimension value, which is a floating point number appended with a unit such as "<code>14.5sp</code>".
|
||||
Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
|
||||
in (inches), mm (millimeters).
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:arcWidth
|
||||
*/
|
||||
public static final int SeekArc_arcWidth = 4;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#clockwise}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be a boolean value, either "<code>true</code>" or "<code>false</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:clockwise
|
||||
*/
|
||||
public static final int SeekArc_clockwise = 13;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#max}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be an integer value, such as "<code>100</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:max
|
||||
*/
|
||||
public static final int SeekArc_max = 2;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#progress}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be an integer value, such as "<code>100</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:progress
|
||||
*/
|
||||
public static final int SeekArc_progress = 5;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#progressColor}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be a color value, in the form of "<code>#<i>rgb</i></code>", "<code>#<i>argb</i></code>",
|
||||
"<code>#<i>rrggbb</i></code>", or "<code>#<i>aarrggbb</i></code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:progressColor
|
||||
*/
|
||||
public static final int SeekArc_progressColor = 10;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#progressWidth}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be a dimension value, which is a floating point number appended with a unit such as "<code>14.5sp</code>".
|
||||
Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
|
||||
in (inches), mm (millimeters).
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:progressWidth
|
||||
*/
|
||||
public static final int SeekArc_progressWidth = 3;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#rotation}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be an integer value, such as "<code>100</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:rotation
|
||||
*/
|
||||
public static final int SeekArc_rotation = 6;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#roundEdges}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be a boolean value, either "<code>true</code>" or "<code>false</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:roundEdges
|
||||
*/
|
||||
public static final int SeekArc_roundEdges = 11;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#startAngle}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be an integer value, such as "<code>100</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:startAngle
|
||||
*/
|
||||
public static final int SeekArc_startAngle = 7;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#sweepAngle}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be an integer value, such as "<code>100</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:sweepAngle
|
||||
*/
|
||||
public static final int SeekArc_sweepAngle = 8;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#thumb}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be a reference to another resource, in the form "<code>@[+][<i>package</i>:]<i>type</i>:<i>name</i></code>"
|
||||
or to a theme attribute in the form "<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>".
|
||||
@attr name com.triggertrap.seekarc:thumb
|
||||
*/
|
||||
public static final int SeekArc_thumb = 0;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#thumbOffset}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be a dimension value, which is a floating point number appended with a unit such as "<code>14.5sp</code>".
|
||||
Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
|
||||
in (inches), mm (millimeters).
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:thumbOffset
|
||||
*/
|
||||
public static final int SeekArc_thumbOffset = 1;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#touchInside}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be a boolean value, either "<code>true</code>" or "<code>false</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:touchInside
|
||||
*/
|
||||
public static final int SeekArc_touchInside = 12;
|
||||
/** Attributes that can be used with a SeekArcTheme.
|
||||
<p>Includes the following attributes:</p>
|
||||
<table>
|
||||
<colgroup align="left" />
|
||||
<colgroup align="left" />
|
||||
<tr><th>Attribute</th><th>Description</th></tr>
|
||||
<tr><td><code>{@link #SeekArcTheme_seekArcStyle com.triggertrap.seekarc:seekArcStyle}</code></td><td></td></tr>
|
||||
</table>
|
||||
@see #SeekArcTheme_seekArcStyle
|
||||
*/
|
||||
public static final int[] SeekArcTheme = {
|
||||
0x7f01000e
|
||||
};
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#seekArcStyle}
|
||||
attribute's value can be found in the {@link #SeekArcTheme} array.
|
||||
|
||||
|
||||
<p>Must be a reference to another resource, in the form "<code>@[+][<i>package</i>:]<i>type</i>:<i>name</i></code>"
|
||||
or to a theme attribute in the form "<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>".
|
||||
@attr name com.triggertrap.seekarc:seekArcStyle
|
||||
*/
|
||||
public static final int SeekArcTheme_seekArcStyle = 0;
|
||||
};
|
||||
}
|
418
SeekArc/build/source/r/release/com/triggertrap/seekarc/R.java
Normal file
@ -0,0 +1,418 @@
|
||||
/* AUTO-GENERATED FILE. DO NOT MODIFY.
|
||||
*
|
||||
* This class was automatically generated by the
|
||||
* aapt tool from the resource data it found. It
|
||||
* should not be modified by hand.
|
||||
*/
|
||||
|
||||
package com.triggertrap.seekarc;
|
||||
|
||||
public final class R {
|
||||
public static final class attr {
|
||||
/** <p>Must be a color value, in the form of "<code>#<i>rgb</i></code>", "<code>#<i>argb</i></code>",
|
||||
"<code>#<i>rrggbb</i></code>", or "<code>#<i>aarrggbb</i></code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int arcColor=0x7f010009;
|
||||
/** <p>Must be a dimension value, which is a floating point number appended with a unit such as "<code>14.5sp</code>".
|
||||
Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
|
||||
in (inches), mm (millimeters).
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int arcWidth=0x7f010004;
|
||||
/** <p>Must be a boolean value, either "<code>true</code>" or "<code>false</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int clockwise=0x7f01000d;
|
||||
/** <p>Must be an integer value, such as "<code>100</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int max=0x7f010002;
|
||||
/** <p>Must be an integer value, such as "<code>100</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int progress=0x7f010005;
|
||||
/** <p>Must be a color value, in the form of "<code>#<i>rgb</i></code>", "<code>#<i>argb</i></code>",
|
||||
"<code>#<i>rrggbb</i></code>", or "<code>#<i>aarrggbb</i></code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int progressColor=0x7f01000a;
|
||||
/** <p>Must be a dimension value, which is a floating point number appended with a unit such as "<code>14.5sp</code>".
|
||||
Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
|
||||
in (inches), mm (millimeters).
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int progressWidth=0x7f010003;
|
||||
/** <p>Must be an integer value, such as "<code>100</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int rotation=0x7f010006;
|
||||
/** <p>Must be a boolean value, either "<code>true</code>" or "<code>false</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int roundEdges=0x7f01000b;
|
||||
/** <p>Must be a reference to another resource, in the form "<code>@[+][<i>package</i>:]<i>type</i>:<i>name</i></code>"
|
||||
or to a theme attribute in the form "<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>".
|
||||
*/
|
||||
public static int seekArcStyle=0x7f01000e;
|
||||
/** <p>Must be an integer value, such as "<code>100</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int startAngle=0x7f010007;
|
||||
/** <p>Must be an integer value, such as "<code>100</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int sweepAngle=0x7f010008;
|
||||
/** <p>Must be a reference to another resource, in the form "<code>@[+][<i>package</i>:]<i>type</i>:<i>name</i></code>"
|
||||
or to a theme attribute in the form "<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>".
|
||||
*/
|
||||
public static int thumb=0x7f010000;
|
||||
/** <p>Must be a dimension value, which is a floating point number appended with a unit such as "<code>14.5sp</code>".
|
||||
Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
|
||||
in (inches), mm (millimeters).
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int thumbOffset=0x7f010001;
|
||||
/** <p>Must be a boolean value, either "<code>true</code>" or "<code>false</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
*/
|
||||
public static int touchInside=0x7f01000c;
|
||||
}
|
||||
public static final class color {
|
||||
public static int progress_gray=0x7f030000;
|
||||
public static int progress_gray_dark=0x7f030001;
|
||||
}
|
||||
public static final class drawable {
|
||||
public static int scrubber_control_disabled_holo=0x7f020000;
|
||||
public static int scrubber_control_focused_holo=0x7f020001;
|
||||
public static int scrubber_control_normal_holo=0x7f020002;
|
||||
public static int scrubber_control_pressed_holo=0x7f020003;
|
||||
public static int seek_arc_control_selector=0x7f020004;
|
||||
}
|
||||
public static final class string {
|
||||
public static int app_name=0x7f040000;
|
||||
}
|
||||
public static final class style {
|
||||
public static int SeekArc=0x7f050000;
|
||||
public static int SeekArcLight=0x7f050001;
|
||||
}
|
||||
public static final class styleable {
|
||||
/** Attributes that can be used with a SeekArc.
|
||||
<p>Includes the following attributes:</p>
|
||||
<table>
|
||||
<colgroup align="left" />
|
||||
<colgroup align="left" />
|
||||
<tr><th>Attribute</th><th>Description</th></tr>
|
||||
<tr><td><code>{@link #SeekArc_arcColor com.triggertrap.seekarc:arcColor}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_arcWidth com.triggertrap.seekarc:arcWidth}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_clockwise com.triggertrap.seekarc:clockwise}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_max com.triggertrap.seekarc:max}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_progress com.triggertrap.seekarc:progress}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_progressColor com.triggertrap.seekarc:progressColor}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_progressWidth com.triggertrap.seekarc:progressWidth}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_rotation com.triggertrap.seekarc:rotation}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_roundEdges com.triggertrap.seekarc:roundEdges}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_startAngle com.triggertrap.seekarc:startAngle}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_sweepAngle com.triggertrap.seekarc:sweepAngle}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_thumb com.triggertrap.seekarc:thumb}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_thumbOffset com.triggertrap.seekarc:thumbOffset}</code></td><td></td></tr>
|
||||
<tr><td><code>{@link #SeekArc_touchInside com.triggertrap.seekarc:touchInside}</code></td><td></td></tr>
|
||||
</table>
|
||||
@see #SeekArc_arcColor
|
||||
@see #SeekArc_arcWidth
|
||||
@see #SeekArc_clockwise
|
||||
@see #SeekArc_max
|
||||
@see #SeekArc_progress
|
||||
@see #SeekArc_progressColor
|
||||
@see #SeekArc_progressWidth
|
||||
@see #SeekArc_rotation
|
||||
@see #SeekArc_roundEdges
|
||||
@see #SeekArc_startAngle
|
||||
@see #SeekArc_sweepAngle
|
||||
@see #SeekArc_thumb
|
||||
@see #SeekArc_thumbOffset
|
||||
@see #SeekArc_touchInside
|
||||
*/
|
||||
public static final int[] SeekArc = {
|
||||
0x7f010000, 0x7f010001, 0x7f010002, 0x7f010003,
|
||||
0x7f010004, 0x7f010005, 0x7f010006, 0x7f010007,
|
||||
0x7f010008, 0x7f010009, 0x7f01000a, 0x7f01000b,
|
||||
0x7f01000c, 0x7f01000d
|
||||
};
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#arcColor}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be a color value, in the form of "<code>#<i>rgb</i></code>", "<code>#<i>argb</i></code>",
|
||||
"<code>#<i>rrggbb</i></code>", or "<code>#<i>aarrggbb</i></code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:arcColor
|
||||
*/
|
||||
public static final int SeekArc_arcColor = 9;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#arcWidth}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be a dimension value, which is a floating point number appended with a unit such as "<code>14.5sp</code>".
|
||||
Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
|
||||
in (inches), mm (millimeters).
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:arcWidth
|
||||
*/
|
||||
public static final int SeekArc_arcWidth = 4;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#clockwise}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be a boolean value, either "<code>true</code>" or "<code>false</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:clockwise
|
||||
*/
|
||||
public static final int SeekArc_clockwise = 13;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#max}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be an integer value, such as "<code>100</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:max
|
||||
*/
|
||||
public static final int SeekArc_max = 2;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#progress}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be an integer value, such as "<code>100</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:progress
|
||||
*/
|
||||
public static final int SeekArc_progress = 5;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#progressColor}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be a color value, in the form of "<code>#<i>rgb</i></code>", "<code>#<i>argb</i></code>",
|
||||
"<code>#<i>rrggbb</i></code>", or "<code>#<i>aarrggbb</i></code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:progressColor
|
||||
*/
|
||||
public static final int SeekArc_progressColor = 10;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#progressWidth}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be a dimension value, which is a floating point number appended with a unit such as "<code>14.5sp</code>".
|
||||
Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
|
||||
in (inches), mm (millimeters).
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:progressWidth
|
||||
*/
|
||||
public static final int SeekArc_progressWidth = 3;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#rotation}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be an integer value, such as "<code>100</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:rotation
|
||||
*/
|
||||
public static final int SeekArc_rotation = 6;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#roundEdges}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be a boolean value, either "<code>true</code>" or "<code>false</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:roundEdges
|
||||
*/
|
||||
public static final int SeekArc_roundEdges = 11;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#startAngle}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be an integer value, such as "<code>100</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:startAngle
|
||||
*/
|
||||
public static final int SeekArc_startAngle = 7;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#sweepAngle}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be an integer value, such as "<code>100</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:sweepAngle
|
||||
*/
|
||||
public static final int SeekArc_sweepAngle = 8;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#thumb}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be a reference to another resource, in the form "<code>@[+][<i>package</i>:]<i>type</i>:<i>name</i></code>"
|
||||
or to a theme attribute in the form "<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>".
|
||||
@attr name com.triggertrap.seekarc:thumb
|
||||
*/
|
||||
public static final int SeekArc_thumb = 0;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#thumbOffset}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be a dimension value, which is a floating point number appended with a unit such as "<code>14.5sp</code>".
|
||||
Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
|
||||
in (inches), mm (millimeters).
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:thumbOffset
|
||||
*/
|
||||
public static final int SeekArc_thumbOffset = 1;
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#touchInside}
|
||||
attribute's value can be found in the {@link #SeekArc} array.
|
||||
|
||||
|
||||
<p>Must be a boolean value, either "<code>true</code>" or "<code>false</code>".
|
||||
<p>This may also be a reference to a resource (in the form
|
||||
"<code>@[<i>package</i>:]<i>type</i>:<i>name</i></code>") or
|
||||
theme attribute (in the form
|
||||
"<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>")
|
||||
containing a value of this type.
|
||||
@attr name com.triggertrap.seekarc:touchInside
|
||||
*/
|
||||
public static final int SeekArc_touchInside = 12;
|
||||
/** Attributes that can be used with a SeekArcTheme.
|
||||
<p>Includes the following attributes:</p>
|
||||
<table>
|
||||
<colgroup align="left" />
|
||||
<colgroup align="left" />
|
||||
<tr><th>Attribute</th><th>Description</th></tr>
|
||||
<tr><td><code>{@link #SeekArcTheme_seekArcStyle com.triggertrap.seekarc:seekArcStyle}</code></td><td></td></tr>
|
||||
</table>
|
||||
@see #SeekArcTheme_seekArcStyle
|
||||
*/
|
||||
public static final int[] SeekArcTheme = {
|
||||
0x7f01000e
|
||||
};
|
||||
/**
|
||||
<p>This symbol is the offset where the {@link com.triggertrap.seekarc.R.attr#seekArcStyle}
|
||||
attribute's value can be found in the {@link #SeekArcTheme} array.
|
||||
|
||||
|
||||
<p>Must be a reference to another resource, in the form "<code>@[+][<i>package</i>:]<i>type</i>:<i>name</i></code>"
|
||||
or to a theme attribute in the form "<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>".
|
||||
@attr name com.triggertrap.seekarc:seekArcStyle
|
||||
*/
|
||||
public static final int SeekArcTheme_seekArcStyle = 0;
|
||||
};
|
||||
}
|
BIN
SeekArc/libs/android-support-v4.jar
Normal file
21
SeekArc/licence.txt
Normal file
@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 Triggertrap Ltd
|
||||
Author Neil Davies
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
20
SeekArc/proguard-project.txt
Normal file
@ -0,0 +1,20 @@
|
||||
# To enable ProGuard in your project, edit project.properties
|
||||
# to define the proguard.config property as described in that file.
|
||||
#
|
||||
# Add project specific ProGuard rules here.
|
||||
# By default, the flags in this file are appended to flags specified
|
||||
# in ${sdk.dir}/tools/proguard/proguard-android.txt
|
||||
# You can edit the include path and order by changing the ProGuard
|
||||
# include property in project.properties.
|
||||
#
|
||||
# For more details, see
|
||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||
|
||||
# Add any project specific keep options here:
|
||||
|
||||
# If your project uses WebView with JS, uncomment the following
|
||||
# and specify the fully qualified class name to the JavaScript interface
|
||||
# class:
|
||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||
# public *;
|
||||
#}
|
15
SeekArc/project.properties
Normal file
@ -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-17
|
||||
android.library=true
|
39
SeekArc/src/main/AndroidManifest.xml
Normal file
@ -0,0 +1,39 @@
|
||||
<!--
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 Triggertrap Ltd
|
||||
Author Neil Davies
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
-->
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.triggertrap.seekarc"
|
||||
android:versionCode="1"
|
||||
android:versionName="1.0" >
|
||||
|
||||
<uses-sdk
|
||||
android:minSdkVersion="8"
|
||||
android:targetSdkVersion="17" />
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:label="@string/app_name"
|
||||
>
|
||||
</application>
|
||||
|
||||
</manifest>
|
528
SeekArc/src/main/java/com/triggertrap/seekarc/SeekArc.java
Normal file
@ -0,0 +1,528 @@
|
||||
/*******************************************************************************
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2013 Triggertrap Ltd
|
||||
* Author Neil Davies
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
* this software and associated documentation files (the "Software"), to deal in
|
||||
* the Software without restriction, including without limitation the rights to
|
||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
* subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
******************************************************************************/
|
||||
package com.triggertrap.seekarc;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.RectF;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
|
||||
/**
|
||||
*
|
||||
* SeekArc.java
|
||||
*
|
||||
* This is a class that functions much like a SeekBar but
|
||||
* follows a circle path instead of a straight line.
|
||||
*
|
||||
* @author Neil Davies
|
||||
*
|
||||
*/
|
||||
public class SeekArc extends View {
|
||||
|
||||
private static final String TAG = SeekArc.class.getSimpleName();
|
||||
private static int INVALID_PROGRESS_VALUE = -1;
|
||||
// The initial rotational offset -90 means we start at 12 o'clock
|
||||
private final int mAngleOffset = -90;
|
||||
|
||||
/**
|
||||
* The Drawable for the seek arc thumbnail
|
||||
*/
|
||||
private Drawable mThumb;
|
||||
|
||||
/**
|
||||
* The Maximum value that this SeekArc can be set to
|
||||
*/
|
||||
private int mMax = 100;
|
||||
|
||||
/**
|
||||
* The Current value that the SeekArc is set to
|
||||
*/
|
||||
private int mProgress = 0;
|
||||
|
||||
/**
|
||||
* The width of the progress line for this SeekArc
|
||||
*/
|
||||
private int mProgressWidth = 4;
|
||||
|
||||
/**
|
||||
* The Width of the background arc for the SeekArc
|
||||
*/
|
||||
private int mArcWidth = 2;
|
||||
|
||||
/**
|
||||
* The Angle to start drawing this Arc from
|
||||
*/
|
||||
private int mStartAngle = 0;
|
||||
|
||||
/**
|
||||
* The Angle through which to draw the arc (Max is 360)
|
||||
*/
|
||||
private int mSweepAngle = 360;
|
||||
|
||||
/**
|
||||
* The rotation of the SeekArc- 0 is twelve o'clock
|
||||
*/
|
||||
private int mRotation = 0;
|
||||
|
||||
/**
|
||||
* Give the SeekArc rounded edges
|
||||
*/
|
||||
private boolean mRoundedEdges = false;
|
||||
|
||||
/**
|
||||
* Enable touch inside the SeekArc
|
||||
*/
|
||||
private boolean mTouchInside = true;
|
||||
|
||||
/**
|
||||
* Will the progress increase clockwise or anti-clockwise
|
||||
*/
|
||||
private boolean mClockwise = true;
|
||||
|
||||
// Internal variables
|
||||
private int mArcRadius = 0;
|
||||
private float mProgressSweep = 0;
|
||||
private RectF mArcRect = new RectF();
|
||||
private Paint mArcPaint;
|
||||
private Paint mProgressPaint;
|
||||
private int mTranslateX;
|
||||
private int mTranslateY;
|
||||
private int mThumbXPos;
|
||||
private int mThumbYPos;
|
||||
private double mTouchAngle;
|
||||
private float mTouchIgnoreRadius;
|
||||
private OnSeekArcChangeListener mOnSeekArcChangeListener;
|
||||
|
||||
public interface OnSeekArcChangeListener {
|
||||
|
||||
/**
|
||||
* Notification that the progress level has changed. Clients can use the
|
||||
* fromUser parameter to distinguish user-initiated changes from those
|
||||
* that occurred programmatically.
|
||||
*
|
||||
* @param seekArc
|
||||
* The SeekArc whose progress has changed
|
||||
* @param progress
|
||||
* The current progress level. This will be in the range
|
||||
* 0..max where max was set by
|
||||
* {@link ProgressArc#setMax(int)}. (The default value for
|
||||
* max is 100.)
|
||||
* @param fromUser
|
||||
* True if the progress change was initiated by the user.
|
||||
*/
|
||||
void onProgressChanged(SeekArc seekArc, int progress, boolean fromUser);
|
||||
|
||||
/**
|
||||
* Notification that the user has started a touch gesture. Clients may
|
||||
* want to use this to disable advancing the seekbar.
|
||||
*
|
||||
* @param seekArc
|
||||
* The SeekArc in which the touch gesture began
|
||||
*/
|
||||
void onStartTrackingTouch(SeekArc seekArc);
|
||||
|
||||
/**
|
||||
* Notification that the user has finished a touch gesture. Clients may
|
||||
* want to use this to re-enable advancing the seekarc.
|
||||
*
|
||||
* @param seekArc
|
||||
* The SeekArc in which the touch gesture began
|
||||
*/
|
||||
void onStopTrackingTouch(SeekArc seekArc);
|
||||
}
|
||||
|
||||
public SeekArc(Context context) {
|
||||
super(context);
|
||||
init(context, null, 0);
|
||||
}
|
||||
|
||||
public SeekArc(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
init(context, attrs, R.attr.seekArcStyle);
|
||||
}
|
||||
|
||||
public SeekArc(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
init(context, attrs, defStyle);
|
||||
}
|
||||
|
||||
private void init(Context context, AttributeSet attrs, int defStyle) {
|
||||
|
||||
Log.d(TAG, "Initialising SeekArc");
|
||||
final Resources res = getResources();
|
||||
float density = context.getResources().getDisplayMetrics().density;
|
||||
|
||||
// Defaults, may need to link this into theme settings
|
||||
int arcColor = res.getColor(R.color.progress_gray);
|
||||
int progressColor = res.getColor(android.R.color.holo_blue_light);
|
||||
int thumbHalfheight = 0;
|
||||
int thumbHalfWidth = 0;
|
||||
mThumb = res.getDrawable(R.drawable.seek_arc_control_selector);
|
||||
// Convert progress width to pixels for current density
|
||||
mProgressWidth = (int) (mProgressWidth * density);
|
||||
|
||||
|
||||
if (attrs != null) {
|
||||
// Attribute initialization
|
||||
final TypedArray a = context.obtainStyledAttributes(attrs,
|
||||
R.styleable.SeekArc, defStyle, 0);
|
||||
|
||||
Drawable thumb = a.getDrawable(R.styleable.SeekArc_thumb);
|
||||
if (thumb != null) {
|
||||
mThumb = thumb;
|
||||
}
|
||||
|
||||
|
||||
|
||||
thumbHalfheight = (int) mThumb.getIntrinsicHeight() / 2;
|
||||
thumbHalfWidth = (int) mThumb.getIntrinsicWidth() / 2;
|
||||
mThumb.setBounds(-thumbHalfWidth, -thumbHalfheight, thumbHalfWidth,
|
||||
thumbHalfheight);
|
||||
|
||||
mMax = a.getInteger(R.styleable.SeekArc_max, mMax);
|
||||
mProgress = a.getInteger(R.styleable.SeekArc_progress, mProgress);
|
||||
mProgressWidth = (int) a.getDimension(
|
||||
R.styleable.SeekArc_progressWidth, mProgressWidth);
|
||||
mArcWidth = (int) a.getDimension(R.styleable.SeekArc_arcWidth,
|
||||
mArcWidth);
|
||||
mStartAngle = a.getInt(R.styleable.SeekArc_startAngle, mStartAngle);
|
||||
mSweepAngle = a.getInt(R.styleable.SeekArc_sweepAngle, mSweepAngle);
|
||||
mRotation = a.getInt(R.styleable.SeekArc_rotation, mRotation);
|
||||
mRoundedEdges = a.getBoolean(R.styleable.SeekArc_roundEdges,
|
||||
mRoundedEdges);
|
||||
mTouchInside = a.getBoolean(R.styleable.SeekArc_touchInside,
|
||||
mTouchInside);
|
||||
mClockwise = a.getBoolean(R.styleable.SeekArc_clockwise,
|
||||
mClockwise);
|
||||
|
||||
arcColor = a.getColor(R.styleable.SeekArc_arcColor, arcColor);
|
||||
progressColor = a.getColor(R.styleable.SeekArc_progressColor,
|
||||
progressColor);
|
||||
|
||||
a.recycle();
|
||||
}
|
||||
|
||||
mProgress = (mProgress > mMax) ? mMax : mProgress;
|
||||
mProgress = (mProgress < 0) ? 0 : mProgress;
|
||||
|
||||
mSweepAngle = (mSweepAngle > 360) ? 360 : mSweepAngle;
|
||||
mSweepAngle = (mSweepAngle < 0) ? 0 : mSweepAngle;
|
||||
|
||||
mStartAngle = (mStartAngle > 360) ? 0 : mStartAngle;
|
||||
mStartAngle = (mStartAngle < 0) ? 0 : mStartAngle;
|
||||
|
||||
mArcPaint = new Paint();
|
||||
mArcPaint.setColor(arcColor);
|
||||
mArcPaint.setAntiAlias(true);
|
||||
mArcPaint.setStyle(Paint.Style.STROKE);
|
||||
mArcPaint.setStrokeWidth(mArcWidth);
|
||||
//mArcPaint.setAlpha(45);
|
||||
|
||||
mProgressPaint = new Paint();
|
||||
mProgressPaint.setColor(progressColor);
|
||||
mProgressPaint.setAntiAlias(true);
|
||||
mProgressPaint.setStyle(Paint.Style.STROKE);
|
||||
mProgressPaint.setStrokeWidth(mProgressWidth);
|
||||
|
||||
if (mRoundedEdges) {
|
||||
mArcPaint.setStrokeCap(Paint.Cap.ROUND);
|
||||
mProgressPaint.setStrokeCap(Paint.Cap.ROUND);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDraw(Canvas canvas) {
|
||||
if(!mClockwise) {
|
||||
canvas.scale(-1, 1, mArcRect.centerX(), mArcRect.centerY() );
|
||||
}
|
||||
|
||||
// Draw the arcs
|
||||
final int arcStart = mStartAngle + mAngleOffset + mRotation;
|
||||
final int arcSweep = mSweepAngle;
|
||||
canvas.drawArc(mArcRect, arcStart, arcSweep, false, mArcPaint);
|
||||
canvas.drawArc(mArcRect, arcStart, mProgressSweep, false,
|
||||
mProgressPaint);
|
||||
|
||||
// Draw the thumb nail
|
||||
canvas.translate(mTranslateX -mThumbXPos, mTranslateY -mThumbYPos);
|
||||
mThumb.draw(canvas);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
|
||||
final int height = getDefaultSize(getSuggestedMinimumHeight(),
|
||||
heightMeasureSpec);
|
||||
final int width = getDefaultSize(getSuggestedMinimumWidth(),
|
||||
widthMeasureSpec);
|
||||
final int min = Math.min(width, height);
|
||||
float top = 0;
|
||||
float left = 0;
|
||||
int arcDiameter = 0;
|
||||
|
||||
mTranslateX = (int) (width * 0.5f);
|
||||
mTranslateY = (int) (height * 0.5f);
|
||||
|
||||
arcDiameter = min - getPaddingLeft();
|
||||
mArcRadius = arcDiameter / 2;
|
||||
top = height / 2 - (arcDiameter / 2);
|
||||
left = width / 2 - (arcDiameter / 2);
|
||||
mArcRect.set(left, top, left + arcDiameter, top + arcDiameter);
|
||||
|
||||
int arcStart = (int)mProgressSweep + mStartAngle + mRotation + 90;
|
||||
mThumbXPos = (int) (mArcRadius * Math.cos(Math.toRadians(arcStart)));
|
||||
mThumbYPos = (int) (mArcRadius * Math.sin(Math.toRadians(arcStart)));
|
||||
|
||||
setTouchInSide(mTouchInside);
|
||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent event) {
|
||||
switch (event.getAction()) {
|
||||
case MotionEvent.ACTION_DOWN:
|
||||
onStartTrackingTouch();
|
||||
updateOnTouch(event);
|
||||
break;
|
||||
case MotionEvent.ACTION_MOVE:
|
||||
updateOnTouch(event);
|
||||
break;
|
||||
case MotionEvent.ACTION_UP:
|
||||
onStopTrackingTouch();
|
||||
setPressed(false);
|
||||
break;
|
||||
case MotionEvent.ACTION_CANCEL:
|
||||
onStopTrackingTouch();
|
||||
setPressed(false);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void drawableStateChanged() {
|
||||
super.drawableStateChanged();
|
||||
if (mThumb != null && mThumb.isStateful()) {
|
||||
int[] state = getDrawableState();
|
||||
mThumb.setState(state);
|
||||
}
|
||||
invalidate();
|
||||
}
|
||||
|
||||
private void onStartTrackingTouch() {
|
||||
if (mOnSeekArcChangeListener != null) {
|
||||
mOnSeekArcChangeListener.onStartTrackingTouch(this);
|
||||
}
|
||||
}
|
||||
|
||||
private void onStopTrackingTouch() {
|
||||
if (mOnSeekArcChangeListener != null) {
|
||||
mOnSeekArcChangeListener.onStopTrackingTouch(this);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateOnTouch(MotionEvent event) {
|
||||
boolean ignoreTouch = ignoreTouch(event.getX(), event.getY());
|
||||
if (ignoreTouch) {
|
||||
return;
|
||||
}
|
||||
setPressed(true);
|
||||
mTouchAngle = getTouchDegrees(event.getX(), event.getY());
|
||||
int progress = getProgressForAngle(mTouchAngle);
|
||||
onProgressRefresh(progress, true);
|
||||
}
|
||||
|
||||
private boolean ignoreTouch(float xPos, float yPos) {
|
||||
boolean ignore = false;
|
||||
float x = xPos - mTranslateX;
|
||||
float y = yPos - mTranslateY;
|
||||
|
||||
float touchRadius = (float) Math.sqrt(((x * x) + (y * y)));
|
||||
if (touchRadius < mTouchIgnoreRadius) {
|
||||
ignore = true;
|
||||
}
|
||||
return ignore;
|
||||
}
|
||||
|
||||
private double getTouchDegrees(float xPos, float yPos) {
|
||||
float x = xPos - mTranslateX;
|
||||
float y = yPos - mTranslateY;
|
||||
//invert the x-coord if we are rotating anti-clockwise
|
||||
x= (mClockwise) ? x:-x;
|
||||
// convert to arc Angle
|
||||
double angle = Math.toDegrees(Math.atan2(y, x) + (Math.PI / 2)
|
||||
- Math.toRadians(mRotation));
|
||||
if (angle < 0) {
|
||||
angle = 360 + angle;
|
||||
}
|
||||
angle -= mStartAngle;
|
||||
return angle;
|
||||
}
|
||||
|
||||
private int getProgressForAngle(double angle) {
|
||||
int touchProgress = (int) Math.round(valuePerDegree() * angle);
|
||||
|
||||
touchProgress = (touchProgress < 0) ? INVALID_PROGRESS_VALUE
|
||||
: touchProgress;
|
||||
touchProgress = (touchProgress > mMax) ? INVALID_PROGRESS_VALUE
|
||||
: touchProgress;
|
||||
return touchProgress;
|
||||
}
|
||||
|
||||
private float valuePerDegree() {
|
||||
return (float) mMax / mSweepAngle;
|
||||
}
|
||||
|
||||
private void onProgressRefresh(int progress, boolean fromUser) {
|
||||
updateProgress(progress, fromUser);
|
||||
}
|
||||
|
||||
private void updateThumbPosition() {
|
||||
int thumbAngle = (int) (mStartAngle + mProgressSweep + mRotation + 90);
|
||||
mThumbXPos = (int) (mArcRadius * Math.cos(Math.toRadians(thumbAngle)));
|
||||
mThumbYPos = (int) (mArcRadius * Math.sin(Math.toRadians(thumbAngle)));
|
||||
}
|
||||
|
||||
private void updateProgress(int progress, boolean fromUser) {
|
||||
|
||||
if (progress == INVALID_PROGRESS_VALUE) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (mOnSeekArcChangeListener != null) {
|
||||
mOnSeekArcChangeListener
|
||||
.onProgressChanged(this, progress, fromUser);
|
||||
}
|
||||
|
||||
progress = (progress > mMax) ? mMax : progress;
|
||||
progress = (mProgress < 0) ? 0 : progress;
|
||||
|
||||
mProgress = progress;
|
||||
mProgressSweep = (float) progress / mMax * mSweepAngle;
|
||||
|
||||
updateThumbPosition();
|
||||
|
||||
invalidate();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a listener to receive notifications of changes to the SeekArc's
|
||||
* progress level. Also provides notifications of when the user starts and
|
||||
* stops a touch gesture within the SeekArc.
|
||||
*
|
||||
* @param l
|
||||
* The seek bar notification listener
|
||||
*
|
||||
* @see SeekArc.OnSeekBarChangeListener
|
||||
*/
|
||||
public void setOnSeekArcChangeListener(OnSeekArcChangeListener l) {
|
||||
mOnSeekArcChangeListener = l;
|
||||
}
|
||||
|
||||
public void setProgress(int progress) {
|
||||
updateProgress(progress, false);
|
||||
}
|
||||
|
||||
public int getProgressWidth() {
|
||||
return mProgressWidth;
|
||||
}
|
||||
|
||||
public void setProgressWidth(int mProgressWidth) {
|
||||
this.mProgressWidth = mProgressWidth;
|
||||
mProgressPaint.setStrokeWidth(mProgressWidth);
|
||||
}
|
||||
|
||||
public int getArcWidth() {
|
||||
return mArcWidth;
|
||||
}
|
||||
|
||||
public void setArcWidth(int mArcWidth) {
|
||||
this.mArcWidth = mArcWidth;
|
||||
mArcPaint.setStrokeWidth(mArcWidth);
|
||||
}
|
||||
public int getArcRotation() {
|
||||
return mRotation;
|
||||
}
|
||||
|
||||
public void setArcRotation(int mRotation) {
|
||||
this.mRotation = mRotation;
|
||||
updateThumbPosition();
|
||||
}
|
||||
|
||||
public int getStartAngle() {
|
||||
return mStartAngle;
|
||||
}
|
||||
|
||||
public void setStartAngle(int mStartAngle) {
|
||||
this.mStartAngle = mStartAngle;
|
||||
updateThumbPosition();
|
||||
}
|
||||
|
||||
public int getSweepAngle() {
|
||||
return mSweepAngle;
|
||||
}
|
||||
|
||||
public void setSweepAngle(int mSweepAngle) {
|
||||
this.mSweepAngle = mSweepAngle;
|
||||
updateThumbPosition();
|
||||
}
|
||||
|
||||
public void setRoundedEdges(boolean isEnabled) {
|
||||
mRoundedEdges = isEnabled;
|
||||
if (mRoundedEdges) {
|
||||
mArcPaint.setStrokeCap(Paint.Cap.ROUND);
|
||||
mProgressPaint.setStrokeCap(Paint.Cap.ROUND);
|
||||
} else {
|
||||
mArcPaint.setStrokeCap(Paint.Cap.SQUARE);
|
||||
mProgressPaint.setStrokeCap(Paint.Cap.SQUARE);
|
||||
}
|
||||
}
|
||||
|
||||
public void setTouchInSide(boolean isEnabled) {
|
||||
int thumbHalfheight = (int) mThumb.getIntrinsicHeight() / 2;
|
||||
int thumbHalfWidth = (int) mThumb.getIntrinsicWidth() / 2;
|
||||
mTouchInside = isEnabled;
|
||||
if (mTouchInside) {
|
||||
mTouchIgnoreRadius = (float) mArcRadius / 4;
|
||||
} else {
|
||||
// Don't use the exact radius makes interaction too tricky
|
||||
mTouchIgnoreRadius = mArcRadius
|
||||
- Math.min(thumbHalfWidth, thumbHalfheight);
|
||||
}
|
||||
}
|
||||
|
||||
public void setClockwise(boolean isClockwise) {
|
||||
mClockwise = isClockwise;
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 2.9 KiB |
31
SeekArc/src/main/res/drawable/seek_arc_control_selector.xml
Normal file
@ -0,0 +1,31 @@
|
||||
<!--
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 Triggertrap Ltd
|
||||
Author Neil Davies
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
-->
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<item android:drawable="@drawable/scrubber_control_disabled_holo" android:state_enabled="false"/>
|
||||
<item android:drawable="@drawable/scrubber_control_pressed_holo" android:state_pressed="true"/>
|
||||
<item android:drawable="@drawable/scrubber_control_focused_holo" android:state_selected="true"/>
|
||||
<item android:drawable="@drawable/scrubber_control_normal_holo"/>
|
||||
|
||||
</selector>
|
47
SeekArc/src/main/res/values/attrs.xml
Normal file
@ -0,0 +1,47 @@
|
||||
<!--
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 Triggertrap Ltd
|
||||
Author Neil Davies
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
-->
|
||||
<resources>
|
||||
|
||||
<declare-styleable name="SeekArc">
|
||||
<attr name="thumb" format="reference" />
|
||||
<attr name="thumbOffset" format="dimension" />
|
||||
<attr name="max" format="integer" />
|
||||
<attr name="progressWidth" format="dimension" />
|
||||
<attr name="arcWidth" format="dimension" />
|
||||
<attr name="progress" format="integer" />
|
||||
<attr name="rotation" format="integer" />
|
||||
<attr name="startAngle" format="integer" />
|
||||
<attr name="sweepAngle" format="integer" />
|
||||
<attr name="arcColor" format="color" />
|
||||
<attr name="progressColor" format="color" />
|
||||
<attr name="roundEdges" format="boolean" />
|
||||
<attr name="touchInside" format="boolean" />
|
||||
<attr name="clockwise" format="boolean" />
|
||||
</declare-styleable>
|
||||
|
||||
<declare-styleable name="SeekArcTheme">
|
||||
<attr name="seekArcStyle" format="reference"></attr>
|
||||
</declare-styleable>
|
||||
|
||||
</resources>
|
28
SeekArc/src/main/res/values/colors.xml
Normal file
@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 Triggertrap Ltd
|
||||
Author Neil Davies
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
-->
|
||||
<resources>
|
||||
<color name="progress_gray">#FFD8D8D8</color>
|
||||
<color name="progress_gray_dark">#FF383838</color>
|
||||
</resources>
|
28
SeekArc/src/main/res/values/strings.xml
Normal file
@ -0,0 +1,28 @@
|
||||
<!--
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 Triggertrap Ltd
|
||||
Author Neil Davies
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
-->
|
||||
<resources>
|
||||
|
||||
<string name="app_name">Seekarc_library</string>
|
||||
|
||||
</resources>
|
34
SeekArc/src/main/res/values/styles.xml
Normal file
@ -0,0 +1,34 @@
|
||||
<!--
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013 Triggertrap Ltd
|
||||
Author Neil Davies
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
-->
|
||||
<resources>
|
||||
|
||||
<style name="SeekArc">
|
||||
<item name="arcColor">@color/progress_gray_dark</item>
|
||||
</style>
|
||||
|
||||
<style name="SeekArcLight">
|
||||
<item name="arcColor">@color/progress_gray</item>
|
||||
</style>
|
||||
|
||||
</resources>
|
@ -1 +1 @@
|
||||
include ':HypoAlarm', ':GlowPadBackport'
|
||||
include ':HypoAlarm', ':GlowPadBackport', ':SeekArc'
|
||||
|