diff options
7 files changed, 126 insertions, 14 deletions
diff --git a/res/layout/loading_container.xml b/res/layout/loading_container.xml new file mode 100644 index 00000000..5a165dee --- /dev/null +++ b/res/layout/loading_container.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2015 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. +--> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/loading_container" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:visibility="gone" + android:gravity="center"> + + <ProgressBar style="?android:attr/progressBarStyleLarge" + android:layout_width="wrap_content" + android:layout_height="wrap_content" /> + + <TextView android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textAppearance="?android:attr/textAppearanceSmall" + android:text="@string/loading" + android:paddingTop="4dip" + android:singleLine="true" /> + +</LinearLayout> diff --git a/res/layout/permissions_frame.xml b/res/layout/permissions_frame.xml index 0c70fe75..5e0d9ec1 100644 --- a/res/layout/permissions_frame.xml +++ b/res/layout/permissions_frame.xml @@ -16,18 +16,26 @@ <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/prefs_container" android:layout_width="match_parent" - android:layout_height="match_parent" - android:filterTouchesWhenObscured="true"> + android:layout_height="match_parent"> - <TextView - android:id="@+id/no_permissions" + <FrameLayout + android:id="@+id/prefs_container" android:layout_width="match_parent" android:layout_height="match_parent" - android:text="@string/no_permissions" - android:gravity="center" - android:textAppearance="@android:style/TextAppearance.Large" - /> + android:filterTouchesWhenObscured="true"> + + <TextView + android:id="@+id/no_permissions" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:text="@string/no_permissions" + android:gravity="center" + android:textAppearance="@android:style/TextAppearance.Large" + /> + + </FrameLayout> + + <include layout="@layout/loading_container" /> </FrameLayout> diff --git a/res/values/strings.xml b/res/values/strings.xml index f71dfe99..2e23df01 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -253,4 +253,7 @@ <!-- [CHAR LIMIT=NONE] Summary of a permission switch when it's enforced by policy --> <string name="permission_summary_enforced_by_policy">Enforced by policy</string> + <!-- Text displayed until loading is done --> + <string name="loading">Loading\u2026</string> + </resources> diff --git a/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java index 92ad7c8a..52a2c8e1 100644 --- a/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java @@ -82,6 +82,7 @@ public final class AppPermissionsFragment extends SettingsWithHeader @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setLoading(true, false); mHasConfirmedRevoke = false; setHasOptionsMenu(true); final ActionBar ab = getActivity().getActionBar(); @@ -247,6 +248,9 @@ public final class AppPermissionsFragment extends SettingsWithHeader mExtraScreen.getPreferenceCount())); screen.addPreference(extraPerms); } + if (screen.getPreferenceCount() != 0) { + setLoading(false, true); + } } @Override diff --git a/src/com/android/packageinstaller/permission/ui/ManagePermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/ManagePermissionsFragment.java index d0609fd0..a814550c 100644 --- a/src/com/android/packageinstaller/permission/ui/ManagePermissionsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/ManagePermissionsFragment.java @@ -68,6 +68,7 @@ public final class ManagePermissionsFragment extends PermissionsFrameFragment @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); + setLoading(true, false); setHasOptionsMenu(true); final ActionBar ab = getActivity().getActionBar(); if (ab != null) { @@ -257,6 +258,9 @@ public final class ManagePermissionsFragment extends PermissionsFrameFragment mExtraScreen.getPreferenceCount())); screen.addPreference(extraScreenPreference); } + if (screen.getPreferenceCount() != 0) { + setLoading(false, true); + } } public static class AdditionalPermissionsFragment extends PermissionsFrameFragment { diff --git a/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java b/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java index d0fff16c..92c53fb6 100644 --- a/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java @@ -77,6 +77,7 @@ public final class PermissionAppsFragment extends PermissionsFrameFragment imple @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setLoading(true, false); setHasOptionsMenu(true); final ActionBar ab = getActivity().getActionBar(); if (ab != null) { @@ -198,6 +199,9 @@ public final class PermissionAppsFragment extends PermissionsFrameFragment imple } pref.setChecked(app.areRuntimePermissionsGranted()); } + if (preferences.getPreferenceCount() != 0) { + setLoading(false, true); + } } @Override diff --git a/src/com/android/packageinstaller/permission/ui/PermissionsFrameFragment.java b/src/com/android/packageinstaller/permission/ui/PermissionsFrameFragment.java index 2abdbd2a..88eda41f 100644 --- a/src/com/android/packageinstaller/permission/ui/PermissionsFrameFragment.java +++ b/src/com/android/packageinstaller/permission/ui/PermissionsFrameFragment.java @@ -11,6 +11,9 @@ import android.support.v7.widget.RecyclerView.AdapterDataObserver; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.Animation.AnimationListener; +import android.view.animation.AnimationUtils; import android.widget.TextView; import com.android.packageinstaller.R; @@ -24,6 +27,10 @@ public abstract class PermissionsFrameFragment extends PreferenceFragment { // TV-specific instance variables @Nullable private VerticalGridView mGridView; + private View mLoadingView; + private ViewGroup mPrefsView; + private boolean mIsLoading; + /** * Returns the view group that holds the preferences objects. This will * only be set after {@link #onCreateView} has been called. @@ -37,13 +44,15 @@ public abstract class PermissionsFrameFragment extends PreferenceFragment { Bundle savedInstanceState) { ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.permissions_frame, container, false); - ViewGroup prefsContainer = (ViewGroup) rootView.findViewById(R.id.prefs_container); - if (prefsContainer == null) { - prefsContainer = rootView; + mPrefsView = (ViewGroup) rootView.findViewById(R.id.prefs_container); + if (mPrefsView == null) { + mPrefsView = rootView; } + mLoadingView = rootView.findViewById(R.id.loading_container); mPreferencesContainer = (ViewGroup) super.onCreateView( - inflater, prefsContainer, savedInstanceState); - prefsContainer.addView(mPreferencesContainer); + inflater, mPrefsView, savedInstanceState); + setLoading(mIsLoading, false, true /* force */); + mPrefsView.addView(mPreferencesContainer); return rootView; } @@ -56,6 +65,50 @@ public abstract class PermissionsFrameFragment extends PreferenceFragment { } } + protected void setLoading(boolean loading, boolean animate) { + setLoading(loading, animate, false); + } + + private void setLoading(boolean loading, boolean animate, boolean force) { + if (mIsLoading != loading || force) { + mIsLoading = loading; + if (mLoadingView == null) { + return; + } + setViewShown(mPrefsView, !loading, animate); + setViewShown(mLoadingView, loading, animate); + } + } + + private void setViewShown(final View view, boolean shown, boolean animate) { + if (animate) { + Animation animation = AnimationUtils.loadAnimation(getContext(), + shown ? android.R.anim.fade_in : android.R.anim.fade_out); + if (shown) { + view.setVisibility(View.VISIBLE); + } else { + animation.setAnimationListener(new AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + } + + @Override + public void onAnimationRepeat(Animation animation) { + } + + @Override + public void onAnimationEnd(Animation animation) { + view.setVisibility(View.INVISIBLE); + } + }); + } + view.startAnimation(animation); + } else { + view.clearAnimation(); + view.setVisibility(shown ? View.VISIBLE : View.INVISIBLE); + } + } + @Override public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { |