1 /*
2  * Copyright (C) 2021 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.systemui.clipboardoverlay;
18 
19 import static java.util.Objects.requireNonNull;
20 
21 import android.app.Activity;
22 import android.content.ClipData;
23 import android.content.ClipDescription;
24 import android.content.ClipboardManager;
25 import android.content.pm.PackageManager;
26 import android.os.Bundle;
27 import android.os.PersistableBundle;
28 import android.text.Editable;
29 import android.util.Log;
30 import android.view.inputmethod.InputMethodManager;
31 import android.widget.EditText;
32 import android.widget.TextView;
33 
34 import com.android.systemui.R;
35 
36 /**
37  * Lightweight activity for editing text clipboard contents
38  */
39 public class EditTextActivity extends Activity
40         implements ClipboardManager.OnPrimaryClipChangedListener {
41     private static final String TAG = "EditTextActivity";
42 
43     private EditText mEditText;
44     private ClipboardManager mClipboardManager;
45     private TextView mAttribution;
46     private boolean mSensitive;
47 
48     @Override
onCreate(Bundle savedInstanceState)49     protected void onCreate(Bundle savedInstanceState) {
50         super.onCreate(savedInstanceState);
51         setContentView(R.layout.clipboard_edit_text_activity);
52         findViewById(R.id.done_button).setOnClickListener((v) -> saveToClipboard());
53         mEditText = findViewById(R.id.edit_text);
54         mAttribution = findViewById(R.id.attribution);
55         mClipboardManager = requireNonNull(getSystemService(ClipboardManager.class));
56     }
57 
58     @Override
onStart()59     protected void onStart() {
60         super.onStart();
61         ClipData clip = mClipboardManager.getPrimaryClip();
62         if (clip == null) {
63             finish();
64             return;
65         }
66         PackageManager pm = getApplicationContext().getPackageManager();
67         try {
68             CharSequence label = pm.getApplicationLabel(
69                     pm.getApplicationInfo(mClipboardManager.getPrimaryClipSource(),
70                             PackageManager.ApplicationInfoFlags.of(0)));
71             mAttribution.setText(getResources().getString(R.string.clipboard_edit_source, label));
72         } catch (PackageManager.NameNotFoundException e) {
73             Log.w(TAG, "Package not found: " + mClipboardManager.getPrimaryClipSource(), e);
74         }
75         mEditText.setText(clip.getItemAt(0).getText().toString());
76         mEditText.requestFocus();
77         mEditText.setSelection(0);
78         mSensitive = clip.getDescription().getExtras() != null
79                 && clip.getDescription().getExtras()
80                 .getBoolean(ClipDescription.EXTRA_IS_SENSITIVE);
81         mClipboardManager.addPrimaryClipChangedListener(this);
82     }
83 
84     @Override
onPause()85     protected void onPause() {
86         mClipboardManager.removePrimaryClipChangedListener(this);
87         super.onPause();
88     }
89 
90     @Override // ClipboardManager.OnPrimaryClipChangedListener
onPrimaryClipChanged()91     public void onPrimaryClipChanged() {
92         hideIme();
93         finish();
94     }
95 
saveToClipboard()96     private void saveToClipboard() {
97         hideIme();
98         Editable editedText = mEditText.getText();
99         editedText.clearSpans();
100         ClipData clip = ClipData.newPlainText("text", editedText);
101         PersistableBundle extras = new PersistableBundle();
102         extras.putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, mSensitive);
103         clip.getDescription().setExtras(extras);
104         mClipboardManager.setPrimaryClip(clip);
105         finish();
106     }
107 
hideIme()108     private void hideIme() {
109         InputMethodManager imm = getSystemService(InputMethodManager.class);
110         imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
111     }
112 }
113