Home | History | Annotate | Download | only in widget
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.printspooler.widget;
     18 
     19 import android.content.Context;
     20 import android.graphics.drawable.BitmapDrawable;
     21 import android.graphics.drawable.Drawable;
     22 import android.print.PrintAttributes.MediaSize;
     23 import android.print.PrintAttributes.Margins;
     24 import android.util.AttributeSet;
     25 import android.view.View;
     26 import com.android.printspooler.model.PageContentRepository;
     27 import com.android.printspooler.model.PageContentRepository.RenderSpec;
     28 import com.android.printspooler.model.PageContentRepository.PageContentProvider;
     29 
     30 /**
     31  * This class represents a page in the print preview list. The width of the page
     32  * is determined by stretching it to take maximal horizontal space while the height
     33  * is computed from the width using the page aspect ratio. Note that different media
     34  * sizes have different aspect ratios.
     35  */
     36 public class PageContentView extends View
     37         implements PageContentRepository.OnPageContentAvailableCallback {
     38 
     39     private PageContentProvider mProvider;
     40 
     41     private MediaSize mMediaSize;
     42 
     43     private Margins mMinMargins;
     44 
     45     private Drawable mEmptyState;
     46 
     47     private boolean mContentRequested;
     48 
     49     public PageContentView(Context context, AttributeSet attrs) {
     50         super(context, attrs);
     51     }
     52 
     53     @Override
     54     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
     55         mContentRequested = false;
     56         requestPageContentIfNeeded();
     57     }
     58 
     59     @Override
     60     public void onPageContentAvailable(BitmapDrawable content) {
     61         setBackground(content);
     62     }
     63 
     64     public PageContentProvider getPageContentProvider() {
     65         return mProvider;
     66     }
     67 
     68     public void init(PageContentProvider provider, Drawable emptyState,
     69             MediaSize mediaSize, Margins minMargins) {
     70         final boolean providerChanged = (mProvider == null)
     71                 ? provider != null : !mProvider.equals(provider);
     72         final boolean loadingDrawableChanged = (mEmptyState == null)
     73                 ? emptyState != null : !mEmptyState.equals(emptyState);
     74         final boolean mediaSizeChanged = (mMediaSize == null)
     75                 ? mediaSize != null : !mMediaSize.equals(mediaSize);
     76         final boolean marginsChanged = (mMinMargins == null)
     77                 ? minMargins != null : !mMinMargins.equals(minMargins);
     78 
     79         if (!providerChanged && !mediaSizeChanged
     80                 && !marginsChanged && !loadingDrawableChanged) {
     81             return;
     82         }
     83 
     84         mProvider = provider;
     85         mMediaSize = mediaSize;
     86         mMinMargins = minMargins;
     87 
     88         mEmptyState = emptyState;
     89         mContentRequested = false;
     90 
     91         // If there is no provider we want immediately to switch to
     92         // the empty state, so pages with no content appear blank.
     93         if (mProvider == null && getBackground() != mEmptyState) {
     94             setBackground(mEmptyState);
     95         }
     96 
     97         requestPageContentIfNeeded();
     98     }
     99 
    100     private void requestPageContentIfNeeded() {
    101         if (getWidth() > 0 && getHeight() > 0 && !mContentRequested
    102                 && mProvider != null) {
    103             mContentRequested = true;
    104             mProvider.getPageContent(new RenderSpec(getWidth(), getHeight(),
    105                     mMediaSize, mMinMargins), this);
    106         }
    107     }
    108 }
    109