summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2011-08-30 19:59:36 -0700
committerJeff Sharkey <jsharkey@android.com>2011-08-30 20:00:51 -0700
commit7a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7d (patch)
tree3d058685b2cb376691dd1e4cb82015c1d550e89c
parent9ca0ef5732d2d25f367b5fa01e8b6562f82d788d (diff)
downloadpackages_apps_Settings-7a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7d.zip
packages_apps_Settings-7a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7d.tar.gz
packages_apps_Settings-7a7ea2bf2f8d0760cc3f6768b6b4bb0f6f7f0d7d.tar.bz2
Sync asset drop and smoother animation.
Bug: 5233703 Change-Id: I3fa52da71b78dcfa7842047b427c5121d3ac7e68
-rwxr-xr-xres/drawable-hdpi/ic_list_sync_anim0.pngbin2875 -> 0 bytes
-rwxr-xr-xres/drawable-hdpi/ic_list_sync_anim1.pngbin3019 -> 0 bytes
-rwxr-xr-xres/drawable-hdpi/ic_list_sync_anim2.pngbin2868 -> 0 bytes
-rwxr-xr-xres/drawable-hdpi/ic_list_sync_anim3.pngbin3045 -> 0 bytes
-rw-r--r--res/drawable-hdpi/ic_sync_anim_holo.pngbin0 -> 1740 bytes
-rw-r--r--res/drawable-hdpi/ic_sync_error.pngbin0 -> 2617 bytes
-rw-r--r--res/drawable-hdpi/ic_sync_error_holo.pngbin0 -> 1680 bytes
-rw-r--r--res/drawable-hdpi/ic_sync_green_holo.pngbin0 -> 1983 bytes
-rw-r--r--res/drawable-hdpi/ic_sync_grey_holo.pngbin0 -> 1683 bytes
-rw-r--r--res/drawable-hdpi/ic_sync_red_holo.pngbin0 -> 1986 bytes
-rw-r--r--res/drawable-mdpi/ic_list_sync_anim0.pngbin1862 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_list_sync_anim1.pngbin1872 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_list_sync_anim2.pngbin1917 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_list_sync_anim3.pngbin1848 -> 0 bytes
-rw-r--r--res/drawable-mdpi/ic_sync_anim_holo.pngbin0 -> 1114 bytes
-rw-r--r--res/drawable-mdpi/ic_sync_error.pngbin0 -> 1638 bytes
-rw-r--r--res/drawable-mdpi/ic_sync_error_holo.pngbin0 -> 1089 bytes
-rw-r--r--res/drawable-mdpi/ic_sync_green_holo.pngbin0 -> 1260 bytes
-rw-r--r--res/drawable-mdpi/ic_sync_grey_holo.pngbin0 -> 1092 bytes
-rw-r--r--res/drawable-mdpi/ic_sync_red_holo.pngbin0 -> 1249 bytes
-rw-r--r--res/drawable-xhdpi/ic_list_sync_anim0.pngbin3527 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_list_sync_anim1.pngbin3482 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_list_sync_anim2.pngbin3552 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_list_sync_anim3.pngbin3453 -> 0 bytes
-rw-r--r--res/drawable-xhdpi/ic_sync_anim_holo.pngbin0 -> 2341 bytes
-rw-r--r--res/drawable-xhdpi/ic_sync_error.pngbin0 -> 3452 bytes
-rw-r--r--res/drawable-xhdpi/ic_sync_error_holo.pngbin0 -> 2298 bytes
-rw-r--r--res/drawable-xhdpi/ic_sync_green_holo.pngbin0 -> 2770 bytes
-rw-r--r--res/drawable-xhdpi/ic_sync_grey_holo.pngbin0 -> 2333 bytes
-rw-r--r--res/drawable-xhdpi/ic_sync_red_holo.pngbin0 -> 2718 bytes
-rw-r--r--res/drawable/ic_list_sync_anim.xml12
-rw-r--r--res/layout/account_sync_screen.xml5
-rw-r--r--res/layout/manage_accounts_screen.xml5
-rw-r--r--res/layout/preference_widget_sync_toggle.xml27
-rw-r--r--src/com/android/settings/AccountPreference.java8
-rw-r--r--src/com/android/settings/accounts/AccountSyncSettings.java2
-rw-r--r--src/com/android/settings/accounts/ManageAccountsSettings.java3
-rw-r--r--src/com/android/settings/accounts/SyncStateCheckBoxPreference.java47
-rw-r--r--src/com/android/settings/widget/AnimatedImageView.java100
39 files changed, 137 insertions, 72 deletions
diff --git a/res/drawable-hdpi/ic_list_sync_anim0.png b/res/drawable-hdpi/ic_list_sync_anim0.png
deleted file mode 100755
index dc78905..0000000
--- a/res/drawable-hdpi/ic_list_sync_anim0.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_list_sync_anim1.png b/res/drawable-hdpi/ic_list_sync_anim1.png
deleted file mode 100755
index 5fe6b4f..0000000
--- a/res/drawable-hdpi/ic_list_sync_anim1.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_list_sync_anim2.png b/res/drawable-hdpi/ic_list_sync_anim2.png
deleted file mode 100755
index d9d68ed..0000000
--- a/res/drawable-hdpi/ic_list_sync_anim2.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_list_sync_anim3.png b/res/drawable-hdpi/ic_list_sync_anim3.png
deleted file mode 100755
index 7275c29..0000000
--- a/res/drawable-hdpi/ic_list_sync_anim3.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_sync_anim_holo.png b/res/drawable-hdpi/ic_sync_anim_holo.png
new file mode 100644
index 0000000..bc8dc58
--- /dev/null
+++ b/res/drawable-hdpi/ic_sync_anim_holo.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_sync_error.png b/res/drawable-hdpi/ic_sync_error.png
new file mode 100644
index 0000000..914d44d
--- /dev/null
+++ b/res/drawable-hdpi/ic_sync_error.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_sync_error_holo.png b/res/drawable-hdpi/ic_sync_error_holo.png
new file mode 100644
index 0000000..3e34bd0
--- /dev/null
+++ b/res/drawable-hdpi/ic_sync_error_holo.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_sync_green_holo.png b/res/drawable-hdpi/ic_sync_green_holo.png
new file mode 100644
index 0000000..2588f3d
--- /dev/null
+++ b/res/drawable-hdpi/ic_sync_green_holo.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_sync_grey_holo.png b/res/drawable-hdpi/ic_sync_grey_holo.png
new file mode 100644
index 0000000..4c7060d
--- /dev/null
+++ b/res/drawable-hdpi/ic_sync_grey_holo.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_sync_red_holo.png b/res/drawable-hdpi/ic_sync_red_holo.png
new file mode 100644
index 0000000..b65520d
--- /dev/null
+++ b/res/drawable-hdpi/ic_sync_red_holo.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_list_sync_anim0.png b/res/drawable-mdpi/ic_list_sync_anim0.png
deleted file mode 100644
index 981a72e..0000000
--- a/res/drawable-mdpi/ic_list_sync_anim0.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_list_sync_anim1.png b/res/drawable-mdpi/ic_list_sync_anim1.png
deleted file mode 100644
index 4581ba2..0000000
--- a/res/drawable-mdpi/ic_list_sync_anim1.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_list_sync_anim2.png b/res/drawable-mdpi/ic_list_sync_anim2.png
deleted file mode 100644
index b745916..0000000
--- a/res/drawable-mdpi/ic_list_sync_anim2.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_list_sync_anim3.png b/res/drawable-mdpi/ic_list_sync_anim3.png
deleted file mode 100644
index 43e453d..0000000
--- a/res/drawable-mdpi/ic_list_sync_anim3.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_sync_anim_holo.png b/res/drawable-mdpi/ic_sync_anim_holo.png
new file mode 100644
index 0000000..66db062
--- /dev/null
+++ b/res/drawable-mdpi/ic_sync_anim_holo.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_sync_error.png b/res/drawable-mdpi/ic_sync_error.png
new file mode 100644
index 0000000..2b98bca
--- /dev/null
+++ b/res/drawable-mdpi/ic_sync_error.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_sync_error_holo.png b/res/drawable-mdpi/ic_sync_error_holo.png
new file mode 100644
index 0000000..dd3958e
--- /dev/null
+++ b/res/drawable-mdpi/ic_sync_error_holo.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_sync_green_holo.png b/res/drawable-mdpi/ic_sync_green_holo.png
new file mode 100644
index 0000000..1c981b6
--- /dev/null
+++ b/res/drawable-mdpi/ic_sync_green_holo.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_sync_grey_holo.png b/res/drawable-mdpi/ic_sync_grey_holo.png
new file mode 100644
index 0000000..bb4267f
--- /dev/null
+++ b/res/drawable-mdpi/ic_sync_grey_holo.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_sync_red_holo.png b/res/drawable-mdpi/ic_sync_red_holo.png
new file mode 100644
index 0000000..36fe6b8
--- /dev/null
+++ b/res/drawable-mdpi/ic_sync_red_holo.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_list_sync_anim0.png b/res/drawable-xhdpi/ic_list_sync_anim0.png
deleted file mode 100644
index 9909f6a..0000000
--- a/res/drawable-xhdpi/ic_list_sync_anim0.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_list_sync_anim1.png b/res/drawable-xhdpi/ic_list_sync_anim1.png
deleted file mode 100644
index f751f2a..0000000
--- a/res/drawable-xhdpi/ic_list_sync_anim1.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_list_sync_anim2.png b/res/drawable-xhdpi/ic_list_sync_anim2.png
deleted file mode 100644
index 374db6a..0000000
--- a/res/drawable-xhdpi/ic_list_sync_anim2.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_list_sync_anim3.png b/res/drawable-xhdpi/ic_list_sync_anim3.png
deleted file mode 100644
index ec3fde6..0000000
--- a/res/drawable-xhdpi/ic_list_sync_anim3.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_sync_anim_holo.png b/res/drawable-xhdpi/ic_sync_anim_holo.png
new file mode 100644
index 0000000..d315e95
--- /dev/null
+++ b/res/drawable-xhdpi/ic_sync_anim_holo.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_sync_error.png b/res/drawable-xhdpi/ic_sync_error.png
new file mode 100644
index 0000000..b9a5357
--- /dev/null
+++ b/res/drawable-xhdpi/ic_sync_error.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_sync_error_holo.png b/res/drawable-xhdpi/ic_sync_error_holo.png
new file mode 100644
index 0000000..85f19bf
--- /dev/null
+++ b/res/drawable-xhdpi/ic_sync_error_holo.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_sync_green_holo.png b/res/drawable-xhdpi/ic_sync_green_holo.png
new file mode 100644
index 0000000..95e2d7d
--- /dev/null
+++ b/res/drawable-xhdpi/ic_sync_green_holo.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_sync_grey_holo.png b/res/drawable-xhdpi/ic_sync_grey_holo.png
new file mode 100644
index 0000000..10cc48a
--- /dev/null
+++ b/res/drawable-xhdpi/ic_sync_grey_holo.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_sync_red_holo.png b/res/drawable-xhdpi/ic_sync_red_holo.png
new file mode 100644
index 0000000..c4b9136
--- /dev/null
+++ b/res/drawable-xhdpi/ic_sync_red_holo.png
Binary files differ
diff --git a/res/drawable/ic_list_sync_anim.xml b/res/drawable/ic_list_sync_anim.xml
index b6965c5..e70c300 100644
--- a/res/drawable/ic_list_sync_anim.xml
+++ b/res/drawable/ic_list_sync_anim.xml
@@ -17,12 +17,8 @@
** limitations under the License.
*/
-->
-<animation-list
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot="false">
- <item android:drawable="@drawable/ic_list_sync_anim0" android:duration="150" />
- <item android:drawable="@drawable/ic_list_sync_anim1" android:duration="150" />
- <item android:drawable="@drawable/ic_list_sync_anim2" android:duration="150" />
- <item android:drawable="@drawable/ic_list_sync_anim3" android:duration="150" />
-</animation-list>
+<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
+ android:drawable="@drawable/ic_sync_anim_holo"
+ android:pivotX="50%"
+ android:pivotY="50%" />
diff --git a/res/layout/account_sync_screen.xml b/res/layout/account_sync_screen.xml
index 5a4bc59..d54d750 100644
--- a/res/layout/account_sync_screen.xml
+++ b/res/layout/account_sync_screen.xml
@@ -37,7 +37,10 @@
<TextView android:id="@+id/sync_settings_error_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="@string/sync_is_failing" />
+ android:layout_margin="8dip"
+ android:text="@string/sync_is_failing"
+ android:drawablePadding="8dip"
+ android:drawableLeft="@drawable/ic_sync_error_holo" />
<!--
<LinearLayout android:id="@+id/remove_account_area"
diff --git a/res/layout/manage_accounts_screen.xml b/res/layout/manage_accounts_screen.xml
index ce86920..2717805 100644
--- a/res/layout/manage_accounts_screen.xml
+++ b/res/layout/manage_accounts_screen.xml
@@ -34,6 +34,9 @@
<TextView android:id="@+id/sync_settings_error_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="@string/sync_is_failing" />
+ android:layout_margin="8dip"
+ android:text="@string/sync_is_failing"
+ android:drawablePadding="8dip"
+ android:drawableLeft="@drawable/ic_sync_error_holo" />
</LinearLayout>
diff --git a/res/layout/preference_widget_sync_toggle.xml b/res/layout/preference_widget_sync_toggle.xml
index 6eaa86e..5057aab 100644
--- a/res/layout/preference_widget_sync_toggle.xml
+++ b/res/layout/preference_widget_sync_toggle.xml
@@ -23,34 +23,23 @@
android:gravity="center_vertical|right">
<ImageView
- android:id="@+android:id/sync_failed"
- android:src="@drawable/ic_list_syncerror"
+ android:id="@+id/sync_failed"
+ android:src="@drawable/ic_sync_error_holo"
android:layout_width="wrap_content"
- android:layout_marginLeft="6sp"
- android:layout_marginBottom="2sp"
+ android:layout_marginRight="8dip"
android:layout_height="wrap_content" />
- <ImageView
- android:id="@+android:id/sync_active"
+ <com.android.settings.widget.AnimatedImageView
+ android:id="@+id/sync_active"
android:src="@drawable/ic_list_sync_anim"
android:layout_width="wrap_content"
- android:layout_marginLeft="6sp"
- android:layout_marginBottom="2sp"
- android:layout_height="wrap_content" />
-
- <ImageView
- android:id="@+android:id/sync_pending"
- android:src="@drawable/ic_list_sync_anim0"
- android:layout_width="wrap_content"
- android:layout_marginLeft="6sp"
- android:layout_marginBottom="2sp"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"
+ android:layout_marginRight="8dip" />
<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+android:id/checkbox"
+ android:id="@android:id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginRight="4sp"
android:layout_gravity="center_vertical"
android:focusable="false"
android:clickable="false" />
diff --git a/src/com/android/settings/AccountPreference.java b/src/com/android/settings/AccountPreference.java
index f76d5cb..824420d 100644
--- a/src/com/android/settings/AccountPreference.java
+++ b/src/com/android/settings/AccountPreference.java
@@ -112,16 +112,16 @@ public class AccountPreference extends Preference {
int res;
switch (status) {
case SYNC_ENABLED:
- res = R.drawable.ic_sync_green;
+ res = R.drawable.ic_sync_green_holo;
break;
case SYNC_DISABLED:
- res = R.drawable.ic_sync_grey;
+ res = R.drawable.ic_sync_grey_holo;
break;
case SYNC_ERROR:
- res = R.drawable.ic_sync_red;
+ res = R.drawable.ic_sync_red_holo;
break;
default:
- res = R.drawable.ic_sync_red;
+ res = R.drawable.ic_sync_red_holo;
Log.e(TAG, "Unknown sync status: " + status);
}
return res;
diff --git a/src/com/android/settings/accounts/AccountSyncSettings.java b/src/com/android/settings/accounts/AccountSyncSettings.java
index e70cbad..82f9844 100644
--- a/src/com/android/settings/accounts/AccountSyncSettings.java
+++ b/src/com/android/settings/accounts/AccountSyncSettings.java
@@ -158,8 +158,6 @@ public class AccountSyncSettings extends AccountPreferenceBase {
mErrorInfoView = (TextView) rootView.findViewById(R.id.sync_settings_error_info);
mErrorInfoView.setVisibility(View.GONE);
- mErrorInfoView.setCompoundDrawablesWithIntrinsicBounds(
- getResources().getDrawable(R.drawable.ic_list_syncerror), null, null, null);
mUserId = (TextView) rootView.findViewById(R.id.user_id);
mProviderId = (TextView) rootView.findViewById(R.id.provider_id);
diff --git a/src/com/android/settings/accounts/ManageAccountsSettings.java b/src/com/android/settings/accounts/ManageAccountsSettings.java
index 05f74dd..4902d8a 100644
--- a/src/com/android/settings/accounts/ManageAccountsSettings.java
+++ b/src/com/android/settings/accounts/ManageAccountsSettings.java
@@ -110,9 +110,6 @@ public class ManageAccountsSettings extends AccountPreferenceBase
mErrorInfoView = (TextView)view.findViewById(R.id.sync_settings_error_info);
mErrorInfoView.setVisibility(View.GONE);
- mErrorInfoView.setCompoundDrawablesWithIntrinsicBounds(
- activity.getResources().getDrawable(R.drawable.ic_list_syncerror),
- null, null, null);
mAutoSyncCheckbox = (CheckBoxPreference) findPreference(AUTO_SYNC_CHECKBOX_KEY);
diff --git a/src/com/android/settings/accounts/SyncStateCheckBoxPreference.java b/src/com/android/settings/accounts/SyncStateCheckBoxPreference.java
index 4b9ca81..13081dd 100644
--- a/src/com/android/settings/accounts/SyncStateCheckBoxPreference.java
+++ b/src/com/android/settings/accounts/SyncStateCheckBoxPreference.java
@@ -16,17 +16,15 @@
package com.android.settings.accounts;
-import com.android.settings.R;
-
+import android.accounts.Account;
import android.content.Context;
-import android.graphics.drawable.AnimationDrawable;
-import android.os.Handler;
import android.preference.CheckBoxPreference;
import android.util.AttributeSet;
import android.view.View;
-import android.widget.ImageView;
import android.widget.TextView;
-import android.accounts.Account;
+
+import com.android.settings.R;
+import com.android.settings.widget.AnimatedImageView;
public class SyncStateCheckBoxPreference extends CheckBoxPreference {
@@ -59,35 +57,16 @@ public class SyncStateCheckBoxPreference extends CheckBoxPreference {
@Override
public void onBindView(View view) {
super.onBindView(view);
- ImageView syncActiveView = (ImageView) view.findViewById(R.id.sync_active);
- View syncPendingView = view.findViewById(R.id.sync_pending);
- View syncFailedView = view.findViewById(R.id.sync_failed);
-
- syncActiveView.setVisibility(mIsActive ? View.VISIBLE : View.GONE);
- final AnimationDrawable anim = (AnimationDrawable) syncActiveView.getDrawable();
- boolean showError;
- boolean showPending;
- if (mIsActive) {
- new Handler(getContext().getMainLooper()).post(new Runnable() {
- public void run() {
- anim.start();
- }
- });
- showPending = false;
- showError = false;
- } else {
- anim.stop();
- if (mIsPending) {
- showPending = true;
- showError = false;
- } else {
- showPending = false;
- showError = mFailed;
- }
- }
+ final AnimatedImageView syncActiveView = (AnimatedImageView) view.findViewById(
+ R.id.sync_active);
+ final View syncFailedView = view.findViewById(R.id.sync_failed);
+
+ final boolean activeVisible = mIsActive || mIsPending;
+ syncActiveView.setVisibility(activeVisible ? View.VISIBLE : View.GONE);
+ syncActiveView.setAnimating(mIsActive);
- syncFailedView.setVisibility(showError ? View.VISIBLE : View.GONE);
- syncPendingView.setVisibility((showPending && !mIsActive) ? View.VISIBLE : View.GONE);
+ final boolean failedVisible = mFailed && !activeVisible;
+ syncFailedView.setVisibility(failedVisible ? View.VISIBLE : View.GONE);
View checkBox = view.findViewById(android.R.id.checkbox);
if (mOneTimeSyncMode) {
diff --git a/src/com/android/settings/widget/AnimatedImageView.java b/src/com/android/settings/widget/AnimatedImageView.java
new file mode 100644
index 0000000..671d718
--- /dev/null
+++ b/src/com/android/settings/widget/AnimatedImageView.java
@@ -0,0 +1,100 @@
+/*
+ * 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 com.android.settings.widget;
+
+import android.content.Context;
+import android.graphics.drawable.AnimatedRotateDrawable;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.ImageView;
+
+public class AnimatedImageView extends ImageView {
+ private AnimatedRotateDrawable mDrawable;
+ private boolean mAnimating;
+
+ public AnimatedImageView(Context context) {
+ super(context);
+ }
+
+ public AnimatedImageView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ private void updateDrawable() {
+ if (isShown() && mDrawable != null) {
+ mDrawable.stop();
+ }
+ final Drawable drawable = getDrawable();
+ if (drawable instanceof AnimatedRotateDrawable) {
+ mDrawable = (AnimatedRotateDrawable) drawable;
+ // TODO: define in drawable xml once we have public attrs.
+ mDrawable.setFramesCount(56);
+ mDrawable.setFramesDuration(32);
+ if (isShown() && mAnimating) {
+ mDrawable.start();
+ }
+ } else {
+ mDrawable = null;
+ }
+ }
+
+ private void updateAnimating() {
+ if (mDrawable != null) {
+ if (isShown() && mAnimating) {
+ mDrawable.start();
+ } else {
+ mDrawable.stop();
+ }
+ }
+ }
+
+ @Override
+ public void setImageDrawable(Drawable drawable) {
+ super.setImageDrawable(drawable);
+ updateDrawable();
+ }
+
+ @Override
+ public void setImageResource(int resid) {
+ super.setImageResource(resid);
+ updateDrawable();
+ }
+
+ @Override
+ public void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ updateAnimating();
+ }
+
+ @Override
+ public void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ updateAnimating();
+ }
+
+ public void setAnimating(boolean animating) {
+ mAnimating = animating;
+ updateAnimating();
+ }
+
+ @Override
+ protected void onVisibilityChanged(View changedView, int vis) {
+ super.onVisibilityChanged(changedView, vis);
+ updateAnimating();
+ }
+}