154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey/*
254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * Copyright (C) 2013 The Android Open Source Project
354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey *
454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * you may not use this file except in compliance with the License.
654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * You may obtain a copy of the License at
754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey *
854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey *
1054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * Unless required by applicable law or agreed to in writing, software
1154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
1254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * See the License for the specific language governing permissions and
1454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * limitations under the License.
1554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey */
1654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
1754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeypackage com.android.documentsui;
1854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
1954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.app.Fragment;
2054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.app.FragmentManager;
2154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.app.FragmentTransaction;
2254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.content.Context;
2354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.os.Bundle;
249fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkeyimport android.text.Editable;
259fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkeyimport android.text.TextWatcher;
269fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkeyimport android.util.Log;
2754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.view.LayoutInflater;
2854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.view.View;
2954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.view.ViewGroup;
3054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.widget.Button;
3154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.widget.EditText;
3254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeyimport android.widget.ImageView;
3354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
34ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkeyimport com.android.documentsui.model.DocumentInfo;
359fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey
3654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey/**
3754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey * Display document title editor and save button.
3854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey */
3954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkeypublic class SaveFragment extends Fragment {
4054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public static final String TAG = "SaveFragment";
4154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
42ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey    private DocumentInfo mReplaceTarget;
4354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    private EditText mDisplayName;
4454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    private Button mSave;
459fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey    private boolean mIgnoreNextEdit;
4654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
4754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    private static final String EXTRA_MIME_TYPE = "mime_type";
4854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    private static final String EXTRA_DISPLAY_NAME = "display_name";
4954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
5054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public static void show(FragmentManager fm, String mimeType, String displayName) {
5154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        final Bundle args = new Bundle();
5254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        args.putString(EXTRA_MIME_TYPE, mimeType);
5354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        args.putString(EXTRA_DISPLAY_NAME, displayName);
5454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
5554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        final SaveFragment fragment = new SaveFragment();
5654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        fragment.setArguments(args);
5754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
5854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        final FragmentTransaction ft = fm.beginTransaction();
5966516697a29cf00d93893a1011d3befc7c1ee37fJeff Sharkey        ft.replace(R.id.container_save, fragment, TAG);
6054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        ft.commitAllowingStateLoss();
6154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
6254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
6354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public static SaveFragment get(FragmentManager fm) {
6454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        return (SaveFragment) fm.findFragmentByTag(TAG);
6554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
6654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
6754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    @Override
6854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public View onCreateView(
6954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
7054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        final Context context = inflater.getContext();
7154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
7254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        final View view = inflater.inflate(R.layout.fragment_save, container, false);
7354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
7454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        final ImageView icon = (ImageView) view.findViewById(android.R.id.icon);
75aeb16e2435f9975b9fa1fc4b747796647a21292eJeff Sharkey        icon.setImageDrawable(
760b14db3cf5eac43736462999337c9a3efdc1ac81Jeff Sharkey                IconUtils.loadMimeIcon(context, getArguments().getString(EXTRA_MIME_TYPE)));
7754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
7854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        mDisplayName = (EditText) view.findViewById(android.R.id.title);
799fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        mDisplayName.addTextChangedListener(mDisplayNameWatcher);
8054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        mDisplayName.setText(getArguments().getString(EXTRA_DISPLAY_NAME));
8154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
8254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        mSave = (Button) view.findViewById(android.R.id.button1);
8354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        mSave.setOnClickListener(mSaveListener);
8454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        mSave.setEnabled(false);
8554e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
8654e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        return view;
8754e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
8854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
899fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey    private TextWatcher mDisplayNameWatcher = new TextWatcher() {
909fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        @Override
919fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        public void onTextChanged(CharSequence s, int start, int before, int count) {
929fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            if (mIgnoreNextEdit) {
939fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                mIgnoreNextEdit = false;
949fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            } else {
959fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                Log.d(TAG, "onTextChanged!");
969fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                mReplaceTarget = null;
979fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            }
989fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        }
999fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey
1009fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        @Override
1019fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
1029fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            // ignored
1039fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        }
1049fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey
1059fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        @Override
1069fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        public void afterTextChanged(Editable s) {
1079fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            // ignored
1089fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        }
1099fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey    };
1109fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey
11154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    private View.OnClickListener mSaveListener = new View.OnClickListener() {
11254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        @Override
11354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        public void onClick(View v) {
1149fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            final DocumentsActivity activity = DocumentsActivity.get(SaveFragment.this);
1159fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            if (mReplaceTarget != null) {
1169fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                activity.onSaveRequested(mReplaceTarget);
1179fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            } else {
1189fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                final String mimeType = getArguments().getString(EXTRA_MIME_TYPE);
1199fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                final String displayName = mDisplayName.getText().toString();
1209fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey                activity.onSaveRequested(mimeType, displayName);
1219fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            }
12254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        }
12354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    };
12454e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
1259fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey    /**
1269fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey     * Set given document as target for in-place writing if user hits save
1279fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey     * without changing the filename. Can be set to {@code null} if user
1289fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey     * navigates outside the target directory.
1299fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey     */
130ae9b51bfa313c51a31af30875a71255d7b6d2e61Jeff Sharkey    public void setReplaceTarget(DocumentInfo replaceTarget) {
1319fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        mReplaceTarget = replaceTarget;
1329fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey
1339fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        if (mReplaceTarget != null) {
1349fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            getArguments().putString(EXTRA_DISPLAY_NAME, replaceTarget.displayName);
1359fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            mIgnoreNextEdit = true;
1369fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey            mDisplayName.setText(replaceTarget.displayName);
1379fb567b59112f99e64e0bff6f343188331bad28dJeff Sharkey        }
13854e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
13954e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey
14054e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    public void setSaveEnabled(boolean enabled) {
14154e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey        mSave.setEnabled(enabled);
14254e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey    }
14354e55b740fef1be654c3959aee41ef5ddfa61293Jeff Sharkey}
144