Home | History | Annotate | Download | only in binding
      1 /*
      2  * Copyright (C) 2015 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 package com.android.messaging.datamodel.binding;
     17 
     18 import com.android.messaging.util.Assert;
     19 
     20 /**
     21  * A immutable wrapper around a Binding object. Callers can only access readonly methods like
     22  * getData(), isBound() and ensureBound() but not bind() and unbind(). This is used for MVC pattern
     23  * where both the View and the Controller needs access to a centrally bound Model object. The View
     24  * is the one that owns the bind/unbind logic of the Binding, whereas controller only serves as a
     25  * consumer.
     26  */
     27 public class ImmutableBindingRef<T extends BindableData> extends BindingBase<T> {
     28     /**
     29      * The referenced, read-only binding object.
     30      */
     31     private final BindingBase<T> mBinding;
     32 
     33     /**
     34      * Hidden ctor.
     35      */
     36     ImmutableBindingRef(final BindingBase<T> binding) {
     37         mBinding = resolveBinding(binding);
     38     }
     39 
     40     @Override
     41     public T getData() {
     42         return mBinding.getData();
     43     }
     44 
     45     @Override
     46     public boolean isBound() {
     47         return mBinding.isBound();
     48     }
     49 
     50     @Override
     51     public boolean isBound(final T data) {
     52         return mBinding.isBound(data);
     53     }
     54 
     55     @Override
     56     public void ensureBound() {
     57         mBinding.ensureBound();
     58     }
     59 
     60     @Override
     61     public void ensureBound(final T data) {
     62         mBinding.ensureBound(data);
     63     }
     64 
     65     @Override
     66     public String getBindingId() {
     67         return mBinding.getBindingId();
     68     }
     69 
     70     /**
     71      * Resolve the source binding to the real BindingImpl it's referencing. This avoids the
     72      * redundancy of multiple wrapper calls when creating a binding reference from an existing
     73      * binding reference.
     74      */
     75     private BindingBase<T> resolveBinding(final BindingBase<T> binding) {
     76         BindingBase<T> resolvedBinding = binding;
     77         while (resolvedBinding instanceof ImmutableBindingRef<?>) {
     78             resolvedBinding = ((ImmutableBindingRef<T>) resolvedBinding).mBinding;
     79         }
     80         Assert.isTrue(resolvedBinding instanceof Binding<?>);
     81         return resolvedBinding;
     82     }
     83 }
     84