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.ui.conversation;
17 
18 import android.os.Bundle;
19 import androidx.appcompat.app.ActionBar;
20 
21 /**
22  * The base class for a method of user input, e.g. media picker.
23  */
24 public abstract class ConversationInput {
25     /**
26      * The host component where all input components are contained. This is typically the
27      * conversation fragment but may be mocked in test code.
28      */
29     public interface ConversationInputBase {
showHideInternal(final ConversationInput target, final boolean show, final boolean animate)30         boolean showHideInternal(final ConversationInput target, final boolean show,
31                 final boolean animate);
getInputStateKey(final ConversationInput input)32         String getInputStateKey(final ConversationInput input);
beginUpdate()33         void beginUpdate();
handleOnShow(final ConversationInput target)34         void handleOnShow(final ConversationInput target);
endUpdate()35         void endUpdate();
36     }
37 
38     protected boolean mShowing;
39     protected ConversationInputBase mConversationInputBase;
40 
show(boolean animate)41     public abstract boolean show(boolean animate);
hide(boolean animate)42     public abstract boolean hide(boolean animate);
43 
ConversationInput(ConversationInputBase baseHost, final boolean isShowing)44     public ConversationInput(ConversationInputBase baseHost, final boolean isShowing) {
45         mConversationInputBase = baseHost;
46         mShowing = isShowing;
47     }
48 
onBackPressed()49     public boolean onBackPressed() {
50         if (mShowing) {
51             mConversationInputBase.showHideInternal(this, false /* show */, true /* animate */);
52             return true;
53         }
54         return false;
55     }
56 
onNavigationUpPressed()57     public boolean onNavigationUpPressed() {
58         return false;
59     }
60 
61     /**
62      * Toggle the visibility of this view.
63      * @param animate
64      * @return true if the view is now shown, false if it now hidden
65      */
toggle(final boolean animate)66     public boolean toggle(final boolean animate) {
67         mConversationInputBase.showHideInternal(this, !mShowing /* show */, true /* animate */);
68         return mShowing;
69     }
70 
saveState(final Bundle savedState)71     public void saveState(final Bundle savedState) {
72         savedState.putBoolean(mConversationInputBase.getInputStateKey(this), mShowing);
73     }
74 
restoreState(final Bundle savedState)75     public void restoreState(final Bundle savedState) {
76         // Things are hidden by default, so only handle show.
77         if (savedState.getBoolean(mConversationInputBase.getInputStateKey(this))) {
78             mConversationInputBase.showHideInternal(this, true /* show */, false /* animate */);
79         }
80     }
81 
updateActionBar(final ActionBar actionBar)82     public boolean updateActionBar(final ActionBar actionBar) {
83         return false;
84     }
85 
86     /**
87      * Update our visibility flag in response to visibility change, both for actions
88      * initiated by this class (through the show/hide methods), and for external changes
89      * tracked by event listeners (e.g. ImeStateObserver, MediaPickerListener). As part of
90      * handling an input showing, we will hide all other inputs to ensure they are mutually
91      * exclusive.
92      */
onVisibilityChanged(final boolean visible)93     protected void onVisibilityChanged(final boolean visible) {
94         if (mShowing != visible) {
95             mConversationInputBase.beginUpdate();
96             mShowing = visible;
97             if (visible) {
98                 mConversationInputBase.handleOnShow(this);
99             }
100             mConversationInputBase.endUpdate();
101         }
102     }
103 }
104