android:Optimize DoricDev header UI

This commit is contained in:
pengfeizhou 2021-02-24 11:05:41 +08:00 committed by osborn
parent cc6355aea7
commit 37222a25d8
10 changed files with 301 additions and 157 deletions

View File

@ -31,13 +31,11 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.appcompat:appcompat:1.1.0'
implementation "com.google.android.material:material:1.1.0" implementation "com.google.android.material:material:1.1.0"
implementation 'com.squareup.okhttp3:okhttp:3.12.1' implementation 'com.squareup.okhttp3:okhttp:3.12.1'
api 'org.greenrobot:eventbus:3.2.0'
testImplementation 'junit:junit:4.13' testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'com.google.zxing:core:3.4.0' implementation 'com.google.zxing:core:3.4.0'
implementation 'com.google.zxing:android-core:3.3.0' implementation 'com.google.zxing:android-core:3.3.0'
} }
apply from: rootProject.file('scripts/upload.gradle') apply from: rootProject.file('scripts/upload.gradle')

View File

@ -1,29 +1,41 @@
package pub.doric.devkit; package pub.doric.devkit;
import android.content.Intent; import android.content.Intent;
import android.os.Handler;
import android.os.Looper;
import android.widget.Toast; import android.widget.Toast;
import com.github.pengfeizhou.jscore.JSONBuilder; import com.github.pengfeizhou.jscore.JSONBuilder;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.json.JSONObject; import org.json.JSONObject;
import java.io.EOFException;
import java.net.ConnectException;
import java.util.HashSet;
import java.util.Set;
import pub.doric.Doric; import pub.doric.Doric;
import pub.doric.DoricContext; import pub.doric.DoricContext;
import pub.doric.DoricContextManager; import pub.doric.DoricContextManager;
import pub.doric.DoricNativeDriver; import pub.doric.DoricNativeDriver;
import pub.doric.devkit.event.ConnectExceptionEvent;
import pub.doric.devkit.event.EOFExceptionEvent;
import pub.doric.devkit.event.OpenEvent;
import pub.doric.devkit.event.StopDebugEvent;
import pub.doric.devkit.ui.DoricDevActivity; import pub.doric.devkit.ui.DoricDevActivity;
import pub.doric.devkit.util.SimulatorUtil; import pub.doric.devkit.util.SimulatorUtil;
import pub.doric.utils.DoricLog; import pub.doric.utils.DoricLog;
public class DoricDev { public class DoricDev {
public interface StatusCallback {
void onOpen(String url);
void onClose(String url);
void onFailure(Throwable throwable);
}
private final Set<StatusCallback> callbacks = new HashSet<>();
public final boolean isRunningInEmulator; public final boolean isRunningInEmulator;
private final Handler uiHandler = new Handler(Looper.getMainLooper());
private static class Inner { private static class Inner {
private static final DoricDev sInstance = new DoricDev(); private static final DoricDev sInstance = new DoricDev();
@ -32,7 +44,6 @@ public class DoricDev {
private DoricDev() { private DoricDev() {
this.isRunningInEmulator = SimulatorUtil.isSimulator(Doric.application()); this.isRunningInEmulator = SimulatorUtil.isSimulator(Doric.application());
DoricNativeDriver.getInstance().getRegistry().registerMonitor(new DoricDevMonitor()); DoricNativeDriver.getInstance().getRegistry().registerMonitor(new DoricDevMonitor());
EventBus.getDefault().register(this);
} }
public static DoricDev getInstance() { public static DoricDev getInstance() {
@ -46,7 +57,10 @@ public class DoricDev {
} }
public void closeDevMode() { public void closeDevMode() {
disconnectDevKit(); if (wsClient != null) {
wsClient.close();
wsClient = null;
}
} }
public boolean isInDevMode() { public boolean isInDevMode() {
@ -59,20 +73,38 @@ public class DoricDev {
private boolean devKitConnected = false; private boolean devKitConnected = false;
private DoricContextDebuggable debuggable; private DoricContextDebuggable debuggable;
private String url;
public void addStatusListener(StatusCallback listener) {
this.callbacks.add(listener);
}
public void removeStatusListener(StatusCallback listener) {
this.callbacks.remove(listener);
}
public void connectDevKit(String url) { public void connectDevKit(String url) {
if (wsClient != null) {
wsClient.close();
}
devKitConnected = false;
wsClient = new WSClient(url); wsClient = new WSClient(url);
this.url = url;
}
public String getIP() {
if (wsClient != null) {
return url.replace("ws://", "").replace(":7777", "");
} else {
return "0.0.0.0";
}
} }
public void sendDevCommand(String command, JSONObject jsonObject) { public void sendDevCommand(String command, JSONObject jsonObject) {
wsClient.sendToServer(command, jsonObject); wsClient.sendToServer(command, jsonObject);
} }
public void disconnectDevKit() {
wsClient.close();
wsClient = null;
}
public void startDebugging(String source) { public void startDebugging(String source) {
if (debuggable != null) { if (debuggable != null) {
debuggable.stopDebug(true); debuggable.stopDebug(true);
@ -105,27 +137,48 @@ public class DoricDev {
} }
@Subscribe(threadMode = ThreadMode.MAIN) public void onOpen() {
public void onOpenEvent(OpenEvent openEvent) {
devKitConnected = true; devKitConnected = true;
Toast.makeText(Doric.application(), "dev kit connected", Toast.LENGTH_LONG).show(); uiHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(Doric.application(), "dev kit connected", Toast.LENGTH_LONG).show();
for (StatusCallback callback : callbacks) {
callback.onOpen(url);
}
}
});
} }
@Subscribe(threadMode = ThreadMode.MAIN) public void onClose() {
public void onEOFEvent(EOFExceptionEvent eofExceptionEvent) {
devKitConnected = false; devKitConnected = false;
Toast.makeText(Doric.application(), "dev kit eof exception", Toast.LENGTH_LONG).show(); uiHandler.post(new Runnable() {
@Override
public void run() {
for (StatusCallback callback : callbacks) {
callback.onClose(url);
}
}
});
} }
@Subscribe(threadMode = ThreadMode.MAIN) public void onFailure(final Throwable t) {
public void onConnectExceptionEvent(ConnectExceptionEvent connectExceptionEvent) {
devKitConnected = false; devKitConnected = false;
Toast.makeText(Doric.application(), "dev kit connection exception", Toast.LENGTH_LONG).show(); uiHandler.post(new Runnable() {
} @Override
public void run() {
@Subscribe(threadMode = ThreadMode.MAIN) if (t instanceof EOFException) {
public void onQuitDebugEvent(StopDebugEvent quitDebugEvent) { Toast.makeText(Doric.application(), "Devkit lost connection", Toast.LENGTH_LONG).show();
stopDebugging(true); } else if (t instanceof ConnectException) {
Toast.makeText(Doric.application(), "Devkit connect to " + getIP() + " failed", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(Doric.application(), "Devkit connect fail:" + t.getLocalizedMessage(), Toast.LENGTH_LONG).show();
}
for (StatusCallback callback : callbacks) {
callback.onFailure(t);
}
}
});
} }
public DoricContext matchContext(String source) { public DoricContext matchContext(String source) {

View File

@ -17,12 +17,9 @@ package pub.doric.devkit;
import com.github.pengfeizhou.jscore.JSONBuilder; import com.github.pengfeizhou.jscore.JSONBuilder;
import org.greenrobot.eventbus.EventBus;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import java.io.EOFException;
import java.net.ConnectException;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -32,9 +29,6 @@ import okhttp3.Request;
import okhttp3.Response; import okhttp3.Response;
import okhttp3.WebSocket; import okhttp3.WebSocket;
import okhttp3.WebSocketListener; import okhttp3.WebSocketListener;
import pub.doric.devkit.event.ConnectExceptionEvent;
import pub.doric.devkit.event.EOFExceptionEvent;
import pub.doric.devkit.event.OpenEvent;
/** /**
* @Description: com.github.penfeizhou.doric.dev * @Description: com.github.penfeizhou.doric.dev
@ -76,8 +70,7 @@ public class WSClient extends WebSocketListener {
@Override @Override
public void onOpen(WebSocket webSocket, Response response) { public void onOpen(WebSocket webSocket, Response response) {
super.onOpen(webSocket, response); super.onOpen(webSocket, response);
DoricDev.getInstance().onOpen();
EventBus.getDefault().post(new OpenEvent());
} }
@Override @Override
@ -117,18 +110,13 @@ public class WSClient extends WebSocketListener {
@Override @Override
public void onClosed(WebSocket webSocket, int code, String reason) { public void onClosed(WebSocket webSocket, int code, String reason) {
super.onClosed(webSocket, code, reason); super.onClosed(webSocket, code, reason);
EventBus.getDefault().post(new ConnectExceptionEvent()); DoricDev.getInstance().onClose();
} }
@Override @Override
public void onFailure(WebSocket webSocket, Throwable t, Response response) { public void onFailure(WebSocket webSocket, Throwable t, Response response) {
super.onFailure(webSocket, t, response); super.onFailure(webSocket, t, response);
DoricDev.getInstance().onFailure(t);
if (t instanceof EOFException) {
EventBus.getDefault().post(new EOFExceptionEvent());
} else if (t instanceof ConnectException) {
EventBus.getDefault().post(new ConnectExceptionEvent());
}
} }
public void sendToDebugger(String command, JSONObject payload) { public void sendToDebugger(String command, JSONObject payload) {

View File

@ -1,4 +0,0 @@
package pub.doric.devkit.event;
public class ConnectExceptionEvent {
}

View File

@ -1,4 +0,0 @@
package pub.doric.devkit.event;
public class EOFExceptionEvent {
}

View File

@ -1,4 +0,0 @@
package pub.doric.devkit.event;
public class OpenEvent {
}

View File

@ -1,5 +0,0 @@
package pub.doric.devkit.event;
public class StopDebugEvent {
}

View File

@ -1,12 +1,19 @@
package pub.doric.devkit.ui; package pub.doric.devkit.ui;
import android.Manifest; import android.Manifest;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Bundle; import android.os.Bundle;
import android.util.Base64;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
@ -17,55 +24,38 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat; import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import com.github.pengfeizhou.jscore.JSONBuilder;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import pub.doric.DoricContext; import pub.doric.DoricContext;
import pub.doric.DoricContextManager; import pub.doric.DoricContextManager;
import pub.doric.devkit.DoricDev; import pub.doric.devkit.DoricDev;
import pub.doric.devkit.R; import pub.doric.devkit.R;
import pub.doric.devkit.event.ConnectExceptionEvent;
import pub.doric.devkit.event.EOFExceptionEvent;
import pub.doric.devkit.event.OpenEvent;
import pub.doric.devkit.qrcode.DisplayUtil; import pub.doric.devkit.qrcode.DisplayUtil;
import pub.doric.devkit.qrcode.activity.CaptureActivity; import pub.doric.devkit.qrcode.activity.CaptureActivity;
import pub.doric.devkit.qrcode.activity.CodeUtils; import pub.doric.devkit.qrcode.activity.CodeUtils;
public class DoricDevActivity extends AppCompatActivity { public class DoricDevActivity extends AppCompatActivity implements DoricDev.StatusCallback {
private int REQUEST_CODE = 100; private int REQUEST_CODE = 100;
private String debug_off = "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";
private String debug_on = "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";
@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
EventBus.getDefault().register(this);
DisplayUtil.initDisplayOpinion(getApplicationContext()); DisplayUtil.initDisplayOpinion(getApplicationContext());
setContentView(R.layout.layout_debug_context); setContentView(R.layout.layout_debug_context);
initDisconnect(); initViews();
if (DoricDev.getInstance().isInDevMode()) {
initViews();
} else {
if (DoricDev.getInstance().isRunningInEmulator) {
DoricDev.getInstance().connectDevKit("ws://" + "10.0.2.2" + ":7777");
} else {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.CAMERA)) {
} else {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA,}, 1);
}
} else {
Intent intent = new Intent(DoricDevActivity.this, CaptureActivity.class);
startActivityForResult(intent, REQUEST_CODE);
}
}
}
} }
@Override
protected void onStart() {
super.onStart();
DoricDev.getInstance().addStatusListener(this);
}
@Override
protected void onStop() {
super.onStop();
DoricDev.getInstance().removeStatusListener(this);
}
@Override @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
@ -90,53 +80,98 @@ public class DoricDevActivity extends AppCompatActivity {
} }
if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) { if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {
String result = bundle.getString(CodeUtils.RESULT_STRING); String result = bundle.getString(CodeUtils.RESULT_STRING);
Toast.makeText(this, "dev kit connecting to " + result, Toast.LENGTH_LONG).show();
DoricDev.getInstance().connectDevKit("ws://" + result + ":7777"); DoricDev.getInstance().connectDevKit("ws://" + result + ":7777");
} }
} }
} }
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this); private Bitmap getIcon(String str) {
} byte[] data = Base64.decode(str, Base64.DEFAULT);
return BitmapFactory.decodeByteArray(data, 0, data.length);
@Subscribe(threadMode = ThreadMode.MAIN)
public void onOpenEvent(OpenEvent openEvent) {
initViews();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEOFEvent(EOFExceptionEvent eofExceptionEvent) {
finish();
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onConnectExceptionEvent(ConnectExceptionEvent connectExceptionEvent) {
finish();
}
private void initDisconnect() {
LinearLayout container = findViewById(R.id.container);
Button button = new Button(this);
button.setText("断开连接");
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (DoricDev.getInstance().isInDevMode()) {
DoricDev.getInstance().closeDevMode();
}
finish();
}
});
container.addView(button);
} }
private void initViews() { private void initViews() {
TextView tvConnection = findViewById(R.id.tv_connect_info);
TextView tvInput = findViewById(R.id.tv_input);
TextView tvScan = findViewById(R.id.tv_scan);
TextView tvDisconnect = findViewById(R.id.tv_disconnect);
if (DoricDev.getInstance().isInDevMode()) {
tvConnection.setText(DoricDev.getInstance().getIP());
tvInput.setVisibility(View.GONE);
tvScan.setVisibility(View.GONE);
tvDisconnect.setVisibility(View.VISIBLE);
tvConnection.setBackgroundColor(Color.parseColor("#2ed573"));
} else {
tvConnection.setText("Disconnected");
tvDisconnect.setVisibility(View.GONE);
tvInput.setVisibility(View.VISIBLE);
tvScan.setVisibility(View.VISIBLE);
tvConnection.setBackgroundColor(Color.parseColor("#a4b0be"));
}
tvScan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (DoricDev.getInstance().isRunningInEmulator) {
DoricDev.getInstance().connectDevKit("ws://" + "10.0.2.2" + ":7777");
} else {
if (ContextCompat.checkSelfPermission(DoricDevActivity.this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(DoricDevActivity.this,
Manifest.permission.CAMERA)) {
} else {
ActivityCompat.requestPermissions(DoricDevActivity.this,
new String[]{Manifest.permission.CAMERA,}, 1);
}
} else {
Intent intent = new Intent(DoricDevActivity.this, CaptureActivity.class);
startActivityForResult(intent, REQUEST_CODE);
}
}
}
});
tvInput.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View clickView) {
if (DoricDev.getInstance().isRunningInEmulator) {
DoricDev.getInstance().connectDevKit("ws://" + "10.0.2.2" + ":7777");
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(DoricDevActivity.this, R.style.Theme_Doric_Modal_Prompt);
builder.setTitle("Please input devkit ip");
View v = LayoutInflater.from(DoricDevActivity.this).inflate(R.layout.doric_modal_prompt, null);
final EditText editText = v.findViewById(R.id.edit_input);
editText.setHint("192.168.1.1");
builder.setView(v);
builder
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String ip = editText.getText().toString();
DoricDev.getInstance().connectDevKit("ws://" + ip + ":7777");
}
})
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
builder.show();
}
}
});
tvDisconnect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DoricDev.getInstance().closeDevMode();
}
});
LinearLayout container = findViewById(R.id.container); LinearLayout container = findViewById(R.id.container);
LayoutInflater inflater = LayoutInflater.from(this); LayoutInflater inflater = LayoutInflater.from(this);
Bitmap icon_off = getIcon(debug_off);
Bitmap icon_on = getIcon(debug_on);
container.removeAllViews();
for (final DoricContext doricContext : DoricContextManager.aliveContexts()) { for (final DoricContext doricContext : DoricContextManager.aliveContexts()) {
View cell = inflater.inflate(R.layout.layout_debug_context_cell, container, false); View cell = inflater.inflate(R.layout.layout_debug_context_cell, container, false);
@ -145,19 +180,24 @@ public class DoricDevActivity extends AppCompatActivity {
TextView sourceTextView = cell.findViewById(R.id.source_text_view); TextView sourceTextView = cell.findViewById(R.id.source_text_view);
sourceTextView.setText(doricContext.getSource()); sourceTextView.setText(doricContext.getSource());
ImageView imageView = cell.findViewById(R.id.icon_debug);
cell.findViewById(R.id.debug_text_view).setOnClickListener(new View.OnClickListener() { imageView.setImageBitmap(icon_on);
@Override
public void onClick(View v) {
DoricDev.getInstance().sendDevCommand(
"DEBUG",
new JSONBuilder()
.put("source", doricContext.getSource())
.toJSONObject());
}
});
container.addView(cell); container.addView(cell);
} }
} }
@Override
public void onOpen(String url) {
initViews();
}
@Override
public void onClose(String url) {
initViews();
}
@Override
public void onFailure(Throwable throwable) {
initViews();
}
} }

View File

@ -4,10 +4,99 @@
android:layout_height="match_parent"> android:layout_height="match_parent">
<LinearLayout <LinearLayout
android:id="@+id/container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="#70a1ff"
android:orientation="horizontal"
android:paddingLeft="15dp"
android:paddingTop="5dp"
android:paddingRight="15dp"
android:paddingBottom="5dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="Devkit"
android:textColor="#ced6e0"
android:textSize="30dp" />
<TextView
android:id="@+id/tv_connect_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="20dp"
android:background="#a4b0be"
android:paddingLeft="10dp"
android:paddingTop="3dp"
android:paddingRight="10dp"
android:paddingBottom="3dp"
android:text="Disconnected"
android:textColor="#dfe4ea"
android:textSize="12dp" />
<View
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
<TextView
android:id="@+id/tv_input"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="20dp"
android:background="#1e90ff"
android:paddingLeft="15dp"
android:paddingTop="5dp"
android:paddingRight="15dp"
android:paddingBottom="5dp"
android:text="Input"
android:textColor="#dfe4ea"
android:textSize="15dp" />
<TextView
android:id="@+id/tv_scan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp"
android:background="#1e90ff"
android:paddingLeft="15dp"
android:paddingTop="5dp"
android:paddingRight="15dp"
android:paddingBottom="5dp"
android:text="Scan"
android:textColor="#dfe4ea"
android:textSize="15dp" />
<TextView
android:id="@+id/tv_disconnect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp"
android:background="#1e90ff"
android:paddingLeft="15dp"
android:paddingTop="5dp"
android:paddingRight="15dp"
android:paddingBottom="5dp"
android:text="Disconnect"
android:textColor="#dfe4ea"
android:textSize="15dp"
android:visibility="gone" />
</LinearLayout>
<LinearLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>

View File

@ -6,9 +6,8 @@
<TextView <TextView
android:id="@+id/context_id_text_view" android:id="@+id/context_id_text_view"
android:layout_width="0dp" android:layout_width="50dp"
android:layout_height="60dp" android:layout_height="60dp"
android:layout_weight="1"
android:gravity="center" android:gravity="center"
android:singleLine="true" android:singleLine="true"
android:text="{Context Id}" android:text="{Context Id}"
@ -18,21 +17,15 @@
android:id="@+id/source_text_view" android:id="@+id/source_text_view"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="60dp" android:layout_height="60dp"
android:layout_weight="3" android:layout_weight="1"
android:gravity="center" android:gravity="center"
android:singleLine="true" android:singleLine="true"
android:text="{Source}" android:text="{Source}"
android:textSize="20sp" /> android:textSize="20sp" />
<TextView <ImageView
android:id="@+id/debug_text_view" android:id="@+id/icon_debug"
android:layout_width="0dp" android:layout_width="60dp"
android:layout_height="60dp" android:layout_height="60dp"
android:layout_weight="1" android:background="#ff0000" />
android:background="#ff0000"
android:gravity="center"
android:singleLine="true"
android:text="Debug"
android:textColor="#ffffff"
android:textSize="20sp" />
</LinearLayout> </LinearLayout>