Untitled
unknown
plain_text
2 years ago
25 kB
2
Indexable
//androidmanifest <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.example.spen"> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.SPen" tools:targetApi="31"> <activity android:name=".SelectLanguageActivity_1" android:exported="false" /> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".service.SpenService" android:enabled="true" android:exported="false"/> </application> </manifest> //adapter package com.example.spen.adapter; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.example.spen.R; import com.example.spen.model.LanguageName; import java.util.List; import javax.xml.transform.Templates; public class SelectLanguageAdapter extends RecyclerView.Adapter<SelectLanguageAdapter.SelectLanguageViewHolder>{ private List<LanguageName> list; public SelectLanguageAdapter(List<LanguageName> list) { this.list = list; } @NonNull @Override public SelectLanguageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.language_name, parent, false); return new SelectLanguageViewHolder(view); } @Override public void onBindViewHolder(@NonNull SelectLanguageViewHolder holder, int position) { LanguageName languageName = list.get(position); if(languageName == null){ return; } holder.textView.setText(languageName.getName()); } @Override public int getItemCount() { if(list != null) return list.size(); return 0; } public class SelectLanguageViewHolder extends RecyclerView.ViewHolder{ private TextView textView; public SelectLanguageViewHolder(@NonNull View view) { super(view); textView = view.findViewById(R.id.lg_name); } } } //model package com.example.spen.model; public class LanguageName { private String name; public LanguageName(String name) { this.name = name; } public LanguageName() { } public String getName() { return name; } public void setName(String name) { this.name = name; } } //service package com.example.spen.service; import android.annotation.SuppressLint; import android.app.Service; import android.content.Intent; import android.graphics.PixelFormat; import android.os.IBinder; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.example.spen.MainActivity; import com.example.spen.R; import com.example.spen.SelectLanguageActivity_1; public class SpenService extends Service { private WindowManager mWindowManager; private View mFloatingView; private ImageView imgT; boolean isPlay = false; private TextView textViewEN, textViewVN; public SpenService() { } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); //getting the widget layout from xml using layout inflater mFloatingView = LayoutInflater.from(this).inflate(R.layout.layout_floating_widget, null); //setting the layout parameters final WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); params.gravity = Gravity.TOP | Gravity.CENTER; //Initially view will be added to top-left corner params.x = 0; params.y = 100; //getting windows services and adding the floating view to it mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); mWindowManager.addView(mFloatingView, params); //The root element of the collapsed view layout final View collapsedView = mFloatingView.findViewById(R.id.layoutCollapsed); //The root element of the expanded view layout final View expandedView = mFloatingView.findViewById(R.id.layoutExpanded); //Set the close button ImageView buttonClose = (ImageView) mFloatingView.findViewById(R.id.buttonClose); buttonClose.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //close the service and remove the from from the window stopSelf(); } }); //Set the change text/sequence button imgT = (ImageView) mFloatingView.findViewById(R.id.btnChangeTranslateOption); imgT.setBackgroundResource(R.drawable.title); imgT.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(isPlay){ view.setBackgroundResource(R.drawable.baseline); }else{ view.setBackgroundResource(R.drawable.title); } isPlay = !isPlay; } }); //Set the collapse button ImageView buttonCollapse = (ImageView) mFloatingView.findViewById(R.id.buttonCollapse); buttonCollapse.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { collapsedView.setVisibility(View.VISIBLE); expandedView.setVisibility(View.GONE); } }); // set sellect language textViewEN= (TextView) mFloatingView.findViewById(R.id.EN); textViewVN= (TextView) mFloatingView.findViewById(R.id.VN); textViewEN.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { openLanguageSelect_1(); } }); // textViewVN.setOnClickListener(new View.OnClickListener() { // @Override // public void onClick(View view) { // openLanguageSelect_2(); // } // }); //adding an touchlistener to make drag movement of the floating widget mFloatingView.findViewById(R.id.rootContainer).setOnTouchListener(new View.OnTouchListener() { private int initialX; private int initialY; private float initialTouchX; private float initialTouchY; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: initialX = params.x; initialY = params.y; initialTouchX = event.getRawX(); initialTouchY = event.getRawY(); return true; case MotionEvent.ACTION_UP: int Xdiff = (int) (event.getRawX() - initialTouchX); int Ydiff = (int) (event.getRawY() - initialTouchY); //The check for Xdiff <10 && YDiff< 10 because sometime elements moves a little while clicking. //So that is click event. if (Xdiff < 10 && Ydiff < 10) { if (isViewCollapsed()) { //When user clicks on the image view of the collapsed layout, //visibility of the collapsed layout will be changed to "View.GONE" //and expanded view will become visible. collapsedView.setVisibility(View.GONE); expandedView.setVisibility(View.VISIBLE); } } return true; case MotionEvent.ACTION_MOVE: //this code is helping the widget to move around the screen with fingers params.x = initialX + (int) (event.getRawX() - initialTouchX); params.y = initialY + (int) (event.getRawY() - initialTouchY); mWindowManager.updateViewLayout(mFloatingView, params); return true; } return false; } }); } private void openLanguageSelect_1(){ // startService(new Intent(SpenService.this, SelectLanguageService.class)); Intent intent = new Intent(SpenService.this, SelectLanguageActivity_1.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } // private void openLanguageSelect_2(){ // Intent intent = new Intent(SpenService.this, SelectLanguageActivity_1.class); // intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // startActivity(intent); // } private boolean isViewCollapsed() { return mFloatingView == null || mFloatingView.findViewById(R.id.layoutCollapsed).getVisibility() == View.VISIBLE; } @Override public void onDestroy() { super.onDestroy(); if (mFloatingView != null) mWindowManager.removeView(mFloatingView); } } //mainActivity package com.example.spen; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.provider.Settings; import android.view.View; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import com.example.spen.service.SpenService; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static final int SYSTEM_ALERT_WINDOW_PERMISSION = 2084; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) { askPermission(); } findViewById(R.id.buttonCreateWidget).setOnClickListener(this); } private void askPermission() { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); startActivityForResult(intent, SYSTEM_ALERT_WINDOW_PERMISSION); } @Override public void onClick(View v) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { startService(new Intent(MainActivity.this, SpenService.class)); finish(); } else if (Settings.canDrawOverlays(this)) { startService(new Intent(MainActivity.this, SpenService.class)); finish(); } else { askPermission(); Toast.makeText(this, "You need System Alert Window Permission to do this", Toast.LENGTH_SHORT).show(); } } } //sellectactivity package com.example.spen; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import android.os.Bundle; import android.view.View; import android.widget.TextView; import com.example.spen.adapter.SelectLanguageAdapter; import com.example.spen.model.LanguageName; import java.util.ArrayList; import java.util.List; public class SelectLanguageActivity_1 extends AppCompatActivity { private RecyclerView recyclerView; private TextView cancel; private SelectLanguageAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_select_language_1); recyclerView = findViewById(R.id.lg_select); adapter = new SelectLanguageAdapter(getList()); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setAdapter(adapter); //Cancel cancel = findViewById(R.id.cancel); cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // findViewById(R.id.selectlanguage1).setVisibility(View.GONE); } }); } private List<LanguageName> getList(){ List<LanguageName> list = new ArrayList<>(); list.add(new LanguageName("English")); list.add(new LanguageName("Japan")); list.add(new LanguageName("Korea")); list.add(new LanguageName("Chinese")); list.add(new LanguageName("Thailand")); list.add(new LanguageName("HongKong")); list.add(new LanguageName("English")); list.add(new LanguageName("Japan")); list.add(new LanguageName("Korea")); list.add(new LanguageName("Chinese")); list.add(new LanguageName("Thailand")); list.add(new LanguageName("HongKong")); list.add(new LanguageName("English")); list.add(new LanguageName("Japan")); list.add(new LanguageName("Korea")); list.add(new LanguageName("Chinese")); list.add(new LanguageName("Thailand")); list.add(new LanguageName("HongKong")); list.add(new LanguageName("English")); list.add(new LanguageName("Japan")); list.add(new LanguageName("Korea")); list.add(new LanguageName("Chinese")); list.add(new LanguageName("Thailand")); list.add(new LanguageName("HongKong1")); return list; } } //baseline.xml <vector android:autoMirrored="true" android:height="24dp" android:tint="#F6F6F6" android:viewportHeight="35" android:viewportWidth="35" android:width="26dp" xmlns:android="http://schemas.android.com/apk/res/android"> <path android:fillColor="@android:color/white" android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM14,17L7,17v-2h7v2zM17,13L7,13v-2h10v2zM17,9L7,9L7,7h10v2z"/> </vector> //close.xml <vector android:height="24dp" android:tint="#F6F6F6" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> <path android:fillColor="@android:color/white" android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/> </vector> //languagebg.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" android:padding="10dp"> <solid android:color="#C4353333" /> <corners android:bottomRightRadius="25dp" android:bottomLeftRadius="25dp" android:topLeftRadius="25dp" android:topRightRadius="25dp" /> </shape> //open.xm; <vector android:height="24dp" android:tint="#F6F6F6" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> <path android:fillColor="@android:color/white" android:pathData="M15.41,16.59L10.83,12l4.58,-4.59L14,6l-6,6 6,6 1.41,-1.41z"/> </vector> //selectlangbg.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" android:padding="10dp"> <solid android:color="#C4353333" /> </shape> //small.xm; <vector android:height="24dp" android:tint="#F6F6F6" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> <path android:fillColor="@android:color/white" android:pathData="M5.88,4.12L13.76,12l-7.88,7.88L8,22l10,-10L8,2z"/> </vector> //syncalt.xml <vector android:height="24dp" android:tint="#818181" android:viewportHeight="24" android:viewportWidth="24" android:width="20dp" xmlns:android="http://schemas.android.com/apk/res/android"> <path android:fillColor="#FFFFFF" android:pathData="M22,8l-4,-4v3H3v2h15v3L22,8z"/> <path android:fillColor="#FFFFFF" android:pathData="M2,16l4,4v-3h15v-2H6v-3L2,16z"/> </vector> //title.xml <vector android:height="24dp" android:tint="#F6F6F6" android:viewportHeight="35" android:viewportWidth="35" android:width="26dp" xmlns:android="http://schemas.android.com/apk/res/android"> <path android:fillColor="@android:color/white" android:pathData="M5,4v3h5.5v12h3V7H19V4z"/> </vector> //ui.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" android:padding="10dp"> <stroke android:width="0.7dp" android:color="#656565" /> <solid android:color="#272727" /> <corners android:bottomRightRadius="60dp" android:bottomLeftRadius="60dp" android:topLeftRadius="60dp" android:topRightRadius="60dp" /> </shape> //activitymain.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/buttonCreateWidget" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="Create Floating Widget" /> </RelativeLayout> //activytiselectlanguage.xml <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/selectlanguage1" android:background="@drawable/language_bg" tools:context=".SelectLanguageActivity_1"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="25dp" android:paddingBottom="45dp" android:layout_marginBottom="20dp" > <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingBottom="15dp" android:text="Dịch từ" android:textColor="@color/white" android:textSize="20dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/lg_select" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> <TextView android:id="@+id/cancel" android:layout_width="match_parent" android:layout_height="70dp" android:gravity="center" android:text="Hủy" android:textColor="@color/white" android:textSize="20dp" app:layout_constraintBottom_toBottomOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> //languagename.xm; <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" xmlns:app="http://schemas.android.com/apk/res-auto"> <TextView android:id="@+id/lg_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" android:textSize="16dp" android:paddingTop="10dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> //layoutfoating.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="wrap_content"> <!--Root container--> <LinearLayout android:id="@+id/rootContainer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:background="@drawable/ui" android:gravity="center" tools:ignore="UselessParent"> <!-- this is the expanded layout --> <LinearLayout android:id="@+id/layoutExpanded" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:visibility="visible"> <ImageView android:id="@+id/buttonCollapse" android:layout_width="22dp" android:layout_height="22dp" android:src="@drawable/small" tools:ignore="ContentDescription" /> <ImageView android:id="@+id/btnChangeTranslateOption" android:layout_width="32dp" android:layout_height="32dp" /> <TextView android:id="@+id/EN" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginHorizontal="16dp" android:text="English" android:textColor="#FFFEFE" android:textSize="16dp" /> <ImageView android:layout_width="25dp" android:layout_height="25dp" android:layout_marginHorizontal="8dp" android:src="@drawable/sync_alt" /> <TextView android:id="@+id/VN" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginHorizontal="16dp" android:text="Tiếng Việt" android:textColor="#FFFEFE" android:textSize="16dp" /> </LinearLayout> <!-- this is the collapsed layout --> <RelativeLayout android:id="@+id/layoutCollapsed" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:visibility="gone"> <ImageView android:id="@+id/buttonOpen" android:layout_width="32dp" android:layout_height="32dp" android:src="@drawable/open" /> </RelativeLayout> <ImageView android:id="@+id/buttonClose" android:layout_width="25dp" android:layout_height="25dp" android:src="@drawable/close" /> </LinearLayout> </FrameLayout> //buildgrade(modul) plugins { id 'com.android.application' } android { compileSdk 33 defaultConfig { applicationId "com.example.spen" minSdk 21 targetSdk 33 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' }
Editor is loading...