mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Add clipboard functionality to platform plugin (flutter/engine#3139)
This will eventually replace the clipboard mojom.
This commit is contained in:
parent
ac963ad808
commit
b3cf0e32fa
@ -5,6 +5,10 @@
|
||||
package io.flutter.plugin.platform;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.ClipboardManager;
|
||||
import android.content.ClipData;
|
||||
import android.content.ClipDescription;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.net.Uri;
|
||||
@ -27,6 +31,7 @@ public class PlatformPlugin extends JSONMessageListener implements ActivityLifec
|
||||
private final Activity mActivity;
|
||||
public static final int DEFAULT_SYSTEM_UI = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
|
||||
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
|
||||
private static final String kTextPlainFormat = "text/plain";
|
||||
|
||||
public PlatformPlugin(Activity activity) {
|
||||
mActivity = activity;
|
||||
@ -53,6 +58,10 @@ public class PlatformPlugin extends JSONMessageListener implements ActivityLifec
|
||||
setSystemChromeSystemUIOverlayStyle(args.getString(0));
|
||||
} else if (method.equals("SystemNavigator.pop")) {
|
||||
popSystemNavigator();
|
||||
} else if (method.equals("Clipboard.getData")) {
|
||||
return getClipboardData(args.getString(0));
|
||||
} else if (method.equals("Clipboard.setData")) {
|
||||
setClipboardData(args.getJSONObject(0));
|
||||
} else if (method.equals("PathProvider.getTemporaryDirectory")) {
|
||||
return getPathProviderTemporaryDirectory();
|
||||
} else if (method.equals("PathProvider.getApplicationDocumentsDirectory")) {
|
||||
@ -166,6 +175,28 @@ public class PlatformPlugin extends JSONMessageListener implements ActivityLifec
|
||||
mActivity.finish();
|
||||
}
|
||||
|
||||
private JSONObject getClipboardData(String format) throws JSONException {
|
||||
ClipboardManager clipboard = (ClipboardManager) mActivity.getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
ClipData clip = clipboard.getPrimaryClip();
|
||||
if (clip == null)
|
||||
return null;
|
||||
|
||||
if ((format == null || format.equals(kTextPlainFormat)) &&
|
||||
clip.getDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
|
||||
JSONObject result = new JSONObject();
|
||||
result.put("text", clip.getItemAt(0).getText().toString());
|
||||
return result;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private void setClipboardData(JSONObject data) throws JSONException {
|
||||
ClipboardManager clipboard = (ClipboardManager) mActivity.getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
ClipData clip = ClipData.newPlainText("text label?", data.getString("text"));
|
||||
clipboard.setPrimaryClip(clip);
|
||||
}
|
||||
|
||||
private JSONObject getPathProviderTemporaryDirectory() throws JSONException {
|
||||
JSONObject result = new JSONObject();
|
||||
result.put("path", mActivity.getCacheDir().getPath());
|
||||
|
||||
@ -9,7 +9,11 @@
|
||||
#include <UIKit/UIApplication.h>
|
||||
#include <UIKit/UIKit.h>
|
||||
|
||||
static NSDictionary* GetDirectoryOfType(NSSearchPathDirectory dir) {
|
||||
namespace {
|
||||
|
||||
constexpr char kTextPlainFormat[] = "text/plain";
|
||||
|
||||
NSDictionary* GetDirectoryOfType(NSSearchPathDirectory dir) {
|
||||
NSArray* paths =
|
||||
NSSearchPathForDirectoriesInDomains(dir, NSUserDomainMask, YES);
|
||||
if (paths.count == 0)
|
||||
@ -17,6 +21,8 @@ static NSDictionary* GetDirectoryOfType(NSSearchPathDirectory dir) {
|
||||
return @{ @"path": paths.firstObject };
|
||||
}
|
||||
|
||||
} // namespaces
|
||||
|
||||
namespace shell {
|
||||
|
||||
// TODO(abarth): Move these definitions from system_chrome_impl.cc to here.
|
||||
@ -58,6 +64,10 @@ using namespace shell;
|
||||
[self setSystemChromeSystemUIOverlayStyle:args.firstObject];
|
||||
} else if ([method isEqualToString:@"SystemNavigator.pop"]) {
|
||||
[self popSystemNavigator];
|
||||
} else if ([method isEqualToString:@"Clipboard.getData"]) {
|
||||
return [self getClipboardData:args.firstObject];
|
||||
} else if ([method isEqualToString:@"Clipboard.setData"]) {
|
||||
[self setClipboardData:args.firstObject];
|
||||
} else if ([method isEqualToString:@"PathProvider.getTemporaryDirectory"]) {
|
||||
return [self getPathProviderTemporaryDirectory];
|
||||
} else if ([method isEqualToString:@"PathProvider.getApplicationDocumentsDirectory"]) {
|
||||
@ -166,6 +176,18 @@ using namespace shell;
|
||||
// Apple's human user guidelines say not to terminate iOS applications.
|
||||
}
|
||||
|
||||
- (NSDictionary*)getClipboardData:(NSString*)format {
|
||||
UIPasteboard* pasteboard = [UIPasteboard generalPasteboard];
|
||||
if (!format || [format isEqualToString:@(kTextPlainFormat)])
|
||||
return @{ @"text": pasteboard.string };
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (void)setClipboardData:(NSDictionary *)data {
|
||||
UIPasteboard* pasteboard = [UIPasteboard generalPasteboard];
|
||||
pasteboard.string = data[@"text"];
|
||||
}
|
||||
|
||||
- (NSDictionary*)getPathProviderTemporaryDirectory {
|
||||
return GetDirectoryOfType(NSCachesDirectory);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user